<?php /** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * @category Zend * @package Zend_Service * @subpackage Rackspace * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ require_once 'Zend/Service/Rackspace/Abstract.php'; require_once 'Zend/Service/Rackspace/Servers/Server.php'; require_once 'Zend/Service/Rackspace/Servers/ServerList.php'; require_once 'Zend/Service/Rackspace/Servers/Image.php'; require_once 'Zend/Service/Rackspace/Servers/ImageList.php'; require_once 'Zend/Service/Rackspace/Servers/SharedIpGroup.php'; require_once 'Zend/Service/Rackspace/Servers/SharedIpGroupList.php'; require_once 'Zend/Validate/Ip.php'; class Zend_Service_Rackspace_Servers extends Zend_Service_Rackspace_Abstract { const LIMIT_FILE_SIZE = 10240; const LIMIT_NUM_FILE = 5; const ERROR_SERVICE_UNAVAILABLE = 'The service is unavailable'; const ERROR_UNAUTHORIZED = 'Unauthorized'; const ERROR_OVERLIMIT = 'You reached the limit of requests, please wait some time before retry'; const ERROR_PARAM_NO_ID = 'You must specify the item\'s id'; const ERROR_PARAM_NO_NAME = 'You must specify the name'; const ERROR_PARAM_NO_SERVERID = 'You must specify the server Id'; const ERROR_PARAM_NO_IMAGEID = 'You must specify the server\'s image ID'; const ERROR_PARAM_NO_FLAVORID = 'You must specify the server\'s flavor ID'; const ERROR_PARAM_NO_ARRAY = 'You must specify an array of parameters'; const ERROR_PARAM_NO_WEEKLY = 'You must specify a weekly backup schedule'; const ERROR_PARAM_NO_DAILY = 'You must specify a daily backup schedule'; const ERROR_ITEM_NOT_FOUND = 'The item specified doesn\'t exist.'; const ERROR_NO_FILE_EXISTS = 'The file specified doesn\'t exist'; const ERROR_LIMIT_FILE_SIZE = 'You reached the size length of a file'; const ERROR_IN_PROGRESS = 'The item specified is still in progress'; const ERROR_BUILD_IN_PROGRESS = 'The build is still in progress'; const ERROR_RESIZE_NOT_ALLOWED = 'The resize is not allowed'; /** * Get the list of the servers * If $details is true returns detail info * * @param boolean $details * @return Zend_Service_Rackspace_Servers_ServerList|boolean */ public function listServers($details=false) { $url= '/servers'; if ($details) { $url.= '/detail'; } $result= $this->httpCall($this->getManagementUrl().$url,'GET'); $status= $result->getStatus(); switch ($status) { case '200' : case '203' : // break intentionally omitted $servers= json_decode($result->getBody(),true); return new Zend_Service_Rackspace_Servers_ServerList($this,$servers['servers']); case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Get the specified server * * @param string $id * @return Zend_Service_Rackspace_Servers_Server */ public function getServer($id) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); } $result= $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id),'GET'); $status= $result->getStatus(); switch ($status) { case '200' : case '203' : // break intentionally omitted $server = json_decode($result->getBody(),true); return new Zend_Service_Rackspace_Servers_Server($this,$server['server']); case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Create a new server * * The required parameters are specified in $data (name, imageId, falvorId) * The $files is an associative array with 'serverPath' => 'localPath' * * @param array $data * @param array $metadata * @param array $files * @return Zend_Service_Rackspace_Servers_Server|boolean */ public function createServer(array $data, $metadata=array(),$files=array()) { if (empty($data) || !is_array($data) || !is_array($metadata) || !is_array($files)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ARRAY); } if (!isset($data['name'])) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME); } if (!isset($data['flavorId'])) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_FLAVORID); } if (!isset($data['imageId'])) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_IMAGEID); } if (count($files)>self::LIMIT_NUM_FILE) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You can attach '.self::LIMIT_NUM_FILE.' files maximum'); } if (!empty($metadata)) { $data['metadata']= $metadata; } $data['flavorId']= (integer) $data['flavorId']; $data['imageId']= (integer) $data['imageId']; if (!empty($files)) { foreach ($files as $serverPath => $filePath) { if (!file_exists($filePath)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception( sprintf("The file %s doesn't exist",$filePath)); } $content= file_get_contents($filePath); if (strlen($content) > self::LIMIT_FILE_SIZE) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception( sprintf("The size of the file %s is greater than the max size of %d bytes", $filePath,self::LIMIT_FILE_SIZE)); } $data['personality'][] = array ( 'path' => $serverPath, 'contents' => base64_encode(file_get_contents($filePath)) ); } } $result = $this->httpCall($this->getManagementUrl().'/servers','POST', null,null,json_encode(array ('server' => $data))); $status = $result->getStatus(); switch ($status) { case '200' : case '202' : // break intentionally omitted $server = json_decode($result->getBody(),true); return new Zend_Service_Rackspace_Servers_Server($this,$server['server']); case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Change the name or the admin password for a server * * @param string $id * @param string $name * @param string $password * @return boolean */ protected function updateServer($id,$name=null,$password=null) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You must specify the ID of the server'); } if (empty($name) && empty($password)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception("You must specify the new name or password of server"); } $data= array(); if (!empty($name)) { $data['name']= $name; } if (!empty($password)) { $data['adminPass']= $password; } $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id),'PUT', null,null,json_encode(array('server' => $data))); $status = $result->getStatus(); switch ($status) { case '204' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Change the server's name * * @param string $id * @param string $name * @return boolean */ public function changeServerName($id,$name) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You must specify the ID of the server'); } if (empty($name)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception("You must specify the new name of the server"); } return $this->updateServer($id, $name); } /** * Change the admin password of the server * * @param string $id * @param string $password * @return boolean */ public function changeServerPassword($id,$password) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You must specify the ID of the server'); } if (empty($password)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception("You must specify the new password of the server"); } return $this->updateServer($id, null,$password); } /** * Delete a server * * @param string $id * @return boolean */ public function deleteServer($id) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You must specify the ID of the server'); } $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id),'DELETE'); $status = $result->getStatus(); switch ($status) { case '202' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Get the server's IPs (public and private) * * @param string $id * @return array|boolean */ public function getServerIp($id) { $result= $this->getServer($id); if ($result===false) { return false; } $result= $result->toArray(); return $result['addresses']; } /** * Get the Public IPs of a server * * @param string $id * @return array|boolean */ public function getServerPublicIp($id) { $addresses= $this->getServerIp($id); if ($addresses===false) { return false; } return $addresses['public']; } /** * Get the Private IPs of a server * * @param string $id * @return array|boolean */ public function getServerPrivateIp($id) { $addresses= $this->getServerIp($id); if ($addresses===false) { return false; } return $addresses['private']; } /** * Share an ip address for a server (id) * * @param string $id server * @param string $ip * @param string $groupId * @return boolean */ public function shareIpAddress($id,$ip,$groupId,$configure=true) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); } if (empty($ip)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the IP address to share'); } $validator = new Zend_Validate_Ip(); if (!$validator->isValid($ip)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception("The parameter $ip specified is not a valid IP address"); } if (empty($groupId)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the group id to use'); } $data= array ( 'sharedIpGroupId' => (integer) $groupId, 'configureServer' => $configure ); $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/ips/public/'.rawurlencode($ip),'PUT', null,null,json_encode(array('shareIp' => $data))); $status = $result->getStatus(); switch ($status) { case '202' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Unshare IP address for a server ($id) * * @param string $id * @param string $ip * @return boolean */ public function unshareIpAddress($id,$ip) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); } if (empty($ip)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the IP address to share'); } $validator = new Zend_Validate_Ip(); if (!$validator->isValid($ip)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception("The parameter $ip specified is not a valid IP address"); } $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/ips/public/'.rawurlencode($ip), 'DELETE'); $status = $result->getStatus(); switch ($status) { case '202' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Reboot a server * * $hard true is the equivalent of power cycling the server * $hard false is a graceful shutdown * * @param string $id * @param boolean $hard * @return boolean */ public function rebootServer($id,$hard=false) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); } if (!$hard) { $type= 'SOFT'; } else { $type= 'HARD'; } $data= array ( 'reboot' => array ( 'type' => $type ) ); $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', 'POST', null, null, json_encode($data)); $status = $result->getStatus(); switch ($status) { case '200' : case '202' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Rebuild a server * * The rebuild function removes all data on the server and replaces it with the specified image, * serverId and IP addresses will remain the same. * * @param string $id * @param string $imageId * @return boolean */ public function rebuildServer($id,$imageId) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); } if (empty($imageId)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the new imageId of the server'); } $data= array ( 'rebuild' => array ( 'imageId' => (integer) $imageId ) ); $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', 'POST', null, null, json_encode($data)); $status = $result->getStatus(); switch ($status) { case '202' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Resize a server * * The resize function converts an existing server to a different flavor, in essence, scaling the * server up or down. The original server is saved for a period of time to allow rollback if there * is a problem. All resizes should be tested and explicitly confirmed, at which time the original * server is removed. All resizes are automatically confirmed after 24 hours if they are not * explicitly confirmed or reverted. * * @param string $id * @param string $flavorId * @return boolean */ public function resizeServer($id,$flavorId) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); } if (empty($flavorId)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the new flavorId of the server'); } $data= array ( 'resize' => array ( 'flavorId' => (integer) $flavorId ) ); $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', 'POST', null, null, json_encode($data)); $status = $result->getStatus(); switch ($status) { case '202' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '403' : $this->errorMsg= self::ERROR_RESIZE_NOT_ALLOWED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Confirm resize of a server * * During a resize operation, the original server is saved for a period of time to allow roll * back if there is a problem. Once the newly resized server is tested and has been confirmed * to be functioning properly, use this operation to confirm the resize. After confirmation, * the original server is removed and cannot be rolled back to. All resizes are automatically * confirmed after 24 hours if they are not explicitly confirmed or reverted. * * @param string $id * @return boolean */ public function confirmResizeServer($id) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); } $data= array ( 'confirmResize' => null ); $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', 'POST', null, null, json_encode($data)); $status = $result->getStatus(); switch ($status) { case '204' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '403' : $this->errorMsg= self::ERROR_RESIZE_NOT_ALLOWED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Revert resize of a server * * During a resize operation, the original server is saved for a period of time to allow for roll * back if there is a problem. If you determine there is a problem with a newly resized server, * use this operation to revert the resize and roll back to the original server. All resizes are * automatically confirmed after 24 hours if they have not already been confirmed explicitly or * reverted. * * @param string $id * @return boolean */ public function revertResizeServer($id) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the ID of the server'); } $data= array ( 'revertResize' => null ); $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/action', 'POST', null, null, json_encode($data)); $status = $result->getStatus(); switch ($status) { case '202' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '403' : $this->errorMsg= self::ERROR_RESIZE_NOT_ALLOWED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Get the list of the flavors * * If $details is true returns detail info * * @param boolean $details * @return array|boolean */ public function listFlavors($details=false) { $url= '/flavors'; if ($details) { $url.= '/detail'; } $result= $this->httpCall($this->getManagementUrl().$url,'GET'); $status= $result->getStatus(); switch ($status) { case '200' : case '203' : // break intentionally omitted $flavors= json_decode($result->getBody(),true); return $flavors['flavors']; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Get the detail of a flavor * * @param string $flavorId * @return array|boolean */ public function getFlavor($flavorId) { if (empty($flavorId)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception('You didn\'t specified the new flavorId of the server'); } $result= $this->httpCall($this->getManagementUrl().'/flavors/'.rawurlencode($flavorId),'GET'); $status= $result->getStatus(); switch ($status) { case '200' : case '203' : // break intentionally omitted $flavor= json_decode($result->getBody(),true); return $flavor['flavor']; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Get the list of the images * * @param boolean $details * @return Zend_Service_Rackspace_Servers_ImageList|boolean */ public function listImages($details=false) { $url= '/images'; if ($details) { $url.= '/detail'; } $result= $this->httpCall($this->getManagementUrl().$url,'GET'); $status= $result->getStatus(); switch ($status) { case '200' : case '203' : // break intentionally omitted $images= json_decode($result->getBody(),true); return new Zend_Service_Rackspace_Servers_ImageList($this,$images['images']); case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Get detail about an image * * @param string $id * @return Zend_Service_Rackspace_Servers_Image|boolean */ public function getImage($id) { $result= $this->httpCall($this->getManagementUrl().'/images/'.rawurlencode($id),'GET'); $status= $result->getStatus(); switch ($status) { case '200' : case '203' : // break intentionally omitted $image= json_decode($result->getBody(),true); return new Zend_Service_Rackspace_Servers_Image($this,$image['image']); case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Create an image for a serverId * * @param string $serverId * @param string $name * @return Zend_Service_Rackspace_Servers_Image */ public function createImage($serverId,$name) { if (empty($serverId)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_SERVERID); } if (empty($name)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME); } $data = array( 'image' => array ( 'serverId' => (integer) $serverId, 'name' => $name ) ); $result = $this->httpCall($this->getManagementUrl().'/images', 'POST', null, null, json_encode($data)); $status = $result->getStatus(); switch ($status) { case '202' : // break intentionally omitted $image= json_decode($result->getBody(),true); return new Zend_Service_Rackspace_Servers_Image($this,$image['image']); case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '403' : $this->errorMsg= self::ERROR_RESIZE_NOT_ALLOWED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Delete an image * * @param string $id * @return boolean */ public function deleteImage($id) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); } $result = $this->httpCall($this->getManagementUrl().'/images/'.rawurlencode($id),'DELETE'); $status = $result->getStatus(); switch ($status) { case '204' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Get the backup schedule of a server * * @param string $id server's Id * @return array|boolean */ public function getBackupSchedule($id) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); } $result= $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/backup_schedule', 'GET'); $status= $result->getStatus(); switch ($status) { case '200' : case '203' : // break intentionally omitted $backup = json_decode($result->getBody(),true); return $backup['backupSchedule']; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Change the backup schedule of a server * * @param string $id server's Id * @param string $weekly * @param string $daily * @return boolean */ public function changeBackupSchedule($id,$weekly,$daily) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); } if (empty($weekly)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_WEEKLY); } if (empty($daily)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_DAILY); } $data = array ( 'backupSchedule' => array ( 'enabled' => true, 'weekly' => $weekly, 'daily' => $daily ) ); $result= $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/backup_schedule', 'POST',null,null,json_encode($data)); $status= $result->getStatus(); switch ($status) { case '204' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Disable the backup schedule for a server * * @param string $id server's Id * @return boolean */ public function disableBackupSchedule($id) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); } $result = $this->httpCall($this->getManagementUrl().'/servers/'.rawurlencode($id).'/backup_schedule', 'DELETE'); $status = $result->getStatus(); switch ($status) { case '204' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '409' : $this->errorMsg= self::ERROR_BUILD_IN_PROGRESS; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Get the list of shared IP groups * * @param boolean $details * @return Zend_Service_Rackspace_Servers_SharedIpGroupList|boolean */ public function listSharedIpGroups($details=false) { $url= '/shared_ip_groups'; if ($details) { $url.= '/detail'; } $result= $this->httpCall($this->getManagementUrl().$url,'GET'); $status= $result->getStatus(); switch ($status) { case '200' : case '203' : // break intentionally omitted $groups= json_decode($result->getBody(),true); return new Zend_Service_Rackspace_Servers_SharedIpGroupList($this,$groups['sharedIpGroups']); case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Get the shared IP group * * @param integer $id * @return Zend_Service_Rackspace_Servers_SharedIpGroup|boolean */ public function getSharedIpGroup($id) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); } $result= $this->httpCall($this->getManagementUrl().'/shared_ip_groups/'.rawurlencode($id),'GET'); $status= $result->getStatus(); switch ($status) { case '200' : case '203' : // break intentionally omitted $group= json_decode($result->getBody(),true); return new Zend_Service_Rackspace_Servers_SharedIpGroup($this,$group['sharedIpGroup']); case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Create a shared Ip group * * @param string $name * @param string $serverId * @return array|boolean */ public function createSharedIpGroup($name,$serverId) { if (empty($name)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_NAME); } if (empty($serverId)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); } $data = array ( 'sharedIpGroup' => array ( 'name' => $name, 'server' => (integer) $serverId ) ); $result= $this->httpCall($this->getManagementUrl().'/shared_ip_groups', 'POST',null,null,json_encode($data)); $status= $result->getStatus(); switch ($status) { case '201' : // break intentionally omitted $group = json_decode($result->getBody(),true); return new Zend_Service_Rackspace_Servers_SharedIpGroup($this,$group['sharedIpGroup']); case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } /** * Delete a Shared Ip Group * * @param integer $id * @return boolean */ public function deleteSharedIpGroup($id) { if (empty($id)) { require_once 'Zend/Service/Rackspace/Exception.php'; throw new Zend_Service_Rackspace_Exception(self::ERROR_PARAM_NO_ID); } $result= $this->httpCall($this->getManagementUrl().'/shared_ip_groups/'.rawurlencode($id),'DELETE'); $status= $result->getStatus(); switch ($status) { case '204' : // break intentionally omitted return true; case '503' : $this->errorMsg= self::ERROR_SERVICE_UNAVAILABLE; break; case '401' : $this->errorMsg= self::ERROR_UNAUTHORIZED; break; case '404' : $this->errorMsg= self::ERROR_ITEM_NOT_FOUND; break; case '413' : $this->errorMsg= self::ERROR_OVERLIMIT; break; default: $this->errorMsg= $result->getBody(); break; } $this->errorCode= $status; return false; } }