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:
parent
166b0371f1
commit
ea1669cf28
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue