Evacuate For Nova

* Added client for Evacuate call
* Added request model for evacuate call
* Added response object for deserialization of the evacuate call
* Expanding Pass to Password
* Improve doc strings

Change-Id: I506bb0fa2d3ddd1338258143f4a931c5c59c2111
This commit is contained in:
ivo5307 2015-04-13 14:15:29 -05:00
parent 166b0371f1
commit ea1669cf28
3 changed files with 89 additions and 2 deletions

View File

@ -21,7 +21,7 @@ from cloudcafe.compute.common.models.metadata import MetadataItem
from cloudcafe.compute.extensions.security_groups_api.models.security_group \
import SecurityGroups, SecurityGroup
from cloudcafe.compute.servers_api.models.servers import Server, Servers, \
ServerMins
ServerMins, Password
from cloudcafe.compute.servers_api.models.servers import Addresses
from cloudcafe.compute.servers_api.models.servers import InstanceActions
from cloudcafe.compute.servers_api.models.requests import CreateServer, \
@ -30,7 +30,7 @@ from cloudcafe.compute.servers_api.models.requests import UpdateServer
from cloudcafe.compute.servers_api.models.requests import ChangePassword, \
ConfirmResize, RevertResize, Resize, Reboot, MigrateServer, Lock, \
Unlock, Start, Stop, Suspend, Resume, Pause, Unpause, CreateImage, \
Rebuild, ResetState, CreateBackup, LiveMigrateServer
Rebuild, ResetState, CreateBackup, LiveMigrateServer, Evacuate
class ServersClient(AutoMarshallingHTTPClient):
@ -828,3 +828,33 @@ class ServersClient(AutoMarshallingHTTPClient):
response_entity_type=SecurityGroup,
requestslib_kwargs=requestslib_kwargs)
return resp
def evacuate(self, server_id, host, on_shared_storage=None,
admin_pass=None, metadata=None, requestslib_kwargs=None):
"""
@summary: Evacuates server from failed host.
@param server_id: The id of an existing server.
@type server_id: String
@param host: The name or ID of host where to server is evacuated to.
@type host: String
@param on_shared_storage: Required if server is on shared storage.
@type on_shared_storage: Boolean
@param admin_pass: Not Specified with onSharedStorage;
New password for the evacuated instance.
@type admin_pass: String
@param metadata: Set the metadata on evacuate.
@type metadata: String
@return: Base Response object
@rtype: Requests.response
"""
request = Evacuate(host=host,
on_shared_storage=on_shared_storage,
admin_pass=admin_pass,
metadata=metadata)
url = '{base_url}/servers/{server_id}/action'.format(
base_url=self.url, server_id=server_id)
resp = self.request('POST', url,
request_entity=request,
response_entity_type=Password,
requestslib_kwargs=requestslib_kwargs)
return resp

View File

@ -785,3 +785,41 @@ class AddSecurityGroup(AutoMarshallingModel):
element.append(name_ele)
xml = ET.tostring(element)
return xml
class Evacuate(AutoMarshallingModel):
"""
@summary: Evacuate Request Object for Server
"""
def __init__(self, host, on_shared_storage=None, admin_pass=None,
metadata=None):
super(Evacuate, self).__init__()
self.host = host
self.on_shared_storage = on_shared_storage
self.admin_pass = admin_pass
self.metadata = metadata
def _obj_to_json(self):
body = {
'host': self.host,
'onSharedStorage': self.on_shared_storage,
'adminPass': self.admin_pass,
'metadata': self.metadata
}
body = self._remove_empty_values(body)
return json.dumps({'evacuate': body})
def _obj_to_xml(self):
xml = Constants.XML_HEADER
element = ET.Element('evacuate')
element.set('xmlns', Constants.XML_API_NAMESPACE)
element.set('host', self.host)
if self.admin_pass is not None:
element.set('adminPass', self.admin_pass)
if self.metadata is not None:
element.set('metadata', self.metadata)
if self.on_shared_storage is not None:
element.set('onSharedStorage', self.on_shared_storage)
xml += ET.tostring(element)
return xml

View File

@ -520,3 +520,22 @@ class InstanceActions(AutoMarshallingModel):
for action in actions_list:
ret.append(InstanceAction(**action))
return ret
class Password(AutoMarshallingModel):
def __init__(
self, admin_pass=None):
self.admin_pass = admin_pass
@classmethod
def _json_to_obj(cls, serialized_str):
json_dict = json.loads(serialized_str)
password = cls._dict_to_obj(json_dict)
return password
@classmethod
def _dict_to_obj(cls, pass_dict):
password = Password(
admin_pass=pass_dict.get('adminPass'))
return password