diff -r 877f952ae2bd -r 6b6c2214f778 web/lib/Zend/Service/Rackspace/Servers.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/Zend/Service/Rackspace/Servers.php Thu Mar 21 19:52:38 2013 +0100 @@ -0,0 +1,1281 @@ +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; + } +} \ No newline at end of file