1282 lines
46 KiB
PHP
Raw Normal View History

2012-09-06 12:34:39 +00:00
<?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 license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Service
* @subpackage Rackspace
2014-06-18 08:19:07 +00:00
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
2012-09-06 12:34:39 +00:00
* @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);
2014-06-18 08:19:07 +00:00
return $backup['backupSchedule'];
2012-09-06 12:34:39 +00:00
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;
}
2014-06-18 08:19:07 +00:00
}