Merge "Boot from volume Server side infrastructure"
This commit is contained in:
@@ -163,7 +163,8 @@ class ServersClient(AutoMarshallingHTTPClient):
|
||||
user_data=None, metadata=None, accessIPv4=None,
|
||||
accessIPv6=None, disk_config=None, networks=None,
|
||||
admin_pass=None, key_name=None, config_drive=None,
|
||||
scheduler_hints=None, requestslib_kwargs=None):
|
||||
scheduler_hints=None, requestslib_kwargs=None,
|
||||
block_device_mapping=None):
|
||||
"""
|
||||
@summary: Creates an instance of a server given the
|
||||
provided parameters
|
||||
@@ -178,6 +179,9 @@ class ServersClient(AutoMarshallingHTTPClient):
|
||||
@param personality: A list of dictionaries for files to be
|
||||
injected into the server.
|
||||
@type personality: List
|
||||
@param block_device_mapping: A list of dictionaries needed for boot
|
||||
from volume feature
|
||||
@type block_device_mapping: List
|
||||
@param user_data: Config Init User data
|
||||
@type user_data: String
|
||||
@param accessIPv4: IPv4 address for the server.
|
||||
@@ -195,8 +199,8 @@ class ServersClient(AutoMarshallingHTTPClient):
|
||||
|
||||
server_request_object = CreateServer(
|
||||
name=name, flavor_ref=flavor_ref, image_ref=image_ref,
|
||||
personality=personality, user_data=user_data,
|
||||
metadata=metadata, accessIPv4=accessIPv4,
|
||||
personality=personality, block_device_mapping=block_device_mapping,
|
||||
user_data=user_data, metadata=metadata, accessIPv4=accessIPv4,
|
||||
accessIPv6=accessIPv6, disk_config=disk_config, networks=networks,
|
||||
admin_pass=admin_pass, key_name=key_name,
|
||||
config_drive=config_drive, scheduler_hints=scheduler_hints)
|
||||
@@ -313,8 +317,8 @@ class ServersClient(AutoMarshallingHTTPClient):
|
||||
|
||||
def rebuild(self, server_id, image_ref, name=None,
|
||||
admin_pass=None, disk_config=None, metadata=None,
|
||||
personality=None, user_data=None,
|
||||
accessIPv4=None, accessIPv6=None,
|
||||
personality=None, user_data=None, accessIPv4=None,
|
||||
accessIPv6=None, block_device_mapping=None,
|
||||
key_name=None, config_drive=None, requestslib_kwargs=None):
|
||||
"""
|
||||
@summary: Rebuilds the server
|
||||
@@ -331,7 +335,9 @@ class ServersClient(AutoMarshallingHTTPClient):
|
||||
@param metadata:A metadata key and value pair.
|
||||
@type metadata: Dictionary
|
||||
@param personality:The file path and file contents
|
||||
@type personality: String
|
||||
@type personality: List
|
||||
@param block_device_mapping: Block device mapping for boot from volume
|
||||
@type block_device_mapping: List
|
||||
@param user_data: Config Init User data
|
||||
@type user_data: String
|
||||
@param accessIPv4:The IP version 4 address.
|
||||
@@ -345,16 +351,19 @@ class ServersClient(AutoMarshallingHTTPClient):
|
||||
|
||||
url = '{base_url}/servers/{server_id}/action'.format(
|
||||
base_url=self.url, server_id=server_id)
|
||||
rebuild_request_object = Rebuild(name=name, image_ref=image_ref,
|
||||
admin_pass=admin_pass,
|
||||
disk_config=disk_config,
|
||||
metadata=metadata,
|
||||
personality=personality,
|
||||
user_data=user_data,
|
||||
accessIPv4=accessIPv4,
|
||||
accessIPv6=accessIPv6,
|
||||
key_name=key_name,
|
||||
config_drive=config_drive)
|
||||
rebuild_request_object = Rebuild(
|
||||
name=name,
|
||||
image_ref=image_ref,
|
||||
admin_pass=admin_pass,
|
||||
disk_config=disk_config,
|
||||
metadata=metadata,
|
||||
personality=personality,
|
||||
block_device_mapping=block_device_mapping,
|
||||
user_data=user_data,
|
||||
accessIPv4=accessIPv4,
|
||||
accessIPv6=accessIPv6,
|
||||
key_name=key_name,
|
||||
config_drive=config_drive)
|
||||
|
||||
resp = self.request('POST', url,
|
||||
response_entity_type=Server,
|
||||
|
||||
@@ -26,9 +26,9 @@ class CreateServer(AutoMarshallingModel):
|
||||
|
||||
def __init__(self, name, image_ref, flavor_ref, admin_pass=None,
|
||||
disk_config=None, metadata=None, personality=None,
|
||||
user_data=None, accessIPv4=None, accessIPv6=None,
|
||||
networks=None, key_name=None, config_drive=None,
|
||||
scheduler_hints=None):
|
||||
block_device_mapping=None, user_data=None, accessIPv4=None,
|
||||
accessIPv6=None, networks=None, key_name=None,
|
||||
config_drive=None, scheduler_hints=None):
|
||||
|
||||
super(CreateServer, self).__init__()
|
||||
self.name = name
|
||||
@@ -38,6 +38,7 @@ class CreateServer(AutoMarshallingModel):
|
||||
self.admin_pass = admin_pass
|
||||
self.metadata = metadata
|
||||
self.personality = personality
|
||||
self.block_device_mapping = block_device_mapping
|
||||
self.user_data = user_data
|
||||
self.accessIPv4 = accessIPv4
|
||||
self.accessIPv6 = accessIPv6
|
||||
@@ -57,6 +58,7 @@ class CreateServer(AutoMarshallingModel):
|
||||
'accessIPv4': self.accessIPv4,
|
||||
'accessIPv6': self.accessIPv6,
|
||||
'personality': self.personality,
|
||||
'block_device_mapping': self.block_device_mapping,
|
||||
'user_data': self.user_data,
|
||||
'networks': self.networks,
|
||||
'key_name': self.key_name,
|
||||
@@ -100,6 +102,11 @@ class CreateServer(AutoMarshallingModel):
|
||||
personality_ele = ET.Element('personality')
|
||||
personality_ele.append(Personality._obj_to_xml(self.personality))
|
||||
element.append(personality_ele)
|
||||
if self.block_device_mapping is not None:
|
||||
block_device_ele = ET.Element('block_device_mapping')
|
||||
block_device_ele.append(BlockDeviceMapping._obj_to_xml(
|
||||
self.block_device_mapping))
|
||||
element.append(block_device_ele)
|
||||
if self.user_data is not None:
|
||||
element.set('user_data', self.user_data)
|
||||
if self.accessIPv4 is not None:
|
||||
@@ -203,6 +210,49 @@ class Personality(AutoMarshallingModel):
|
||||
return pers_element
|
||||
|
||||
|
||||
class BlockDeviceMapping(AutoMarshallingModel):
|
||||
"""
|
||||
@summary: Block Device Mapping Request Object for Server
|
||||
"""
|
||||
ROOT_TAG = 'block_device_mapping'
|
||||
|
||||
def __init__(self, volume_id, delete_on_termination, device_name,
|
||||
size=None, type=None):
|
||||
super(BlockDeviceMapping, self).__init__()
|
||||
self.volume_id = volume_id
|
||||
self.delete_on_termination = delete_on_termination
|
||||
self.device_name = device_name
|
||||
self.size = size
|
||||
self.type = type
|
||||
|
||||
@classmethod
|
||||
def _obj_to_json(self):
|
||||
body = {
|
||||
'volume_id': self.volume_id,
|
||||
'delete_on_termination': self.delete_on_termination,
|
||||
'device_name': self.device_name,
|
||||
'size': self.size,
|
||||
'type': self.type
|
||||
}
|
||||
|
||||
body = self._remove_empty_values(body)
|
||||
return json.dumps({'block_device_mapping': body})
|
||||
|
||||
@classmethod
|
||||
def _obj_to_xml(self, list_dicts):
|
||||
for pers_dict in list_dicts:
|
||||
pers_element = ET.Element('block_device_mapping')
|
||||
pers_element.set('volume_id', pers_dict.get('volume_id'))
|
||||
pers_element.set('delete_on_termination',
|
||||
pers_dict.get('delete_on_termination'))
|
||||
pers_element.set('device_name', pers_dict.get('device_name'))
|
||||
if pers_dict.get('size') is not None:
|
||||
pers_element.set('size', pers_dict.get('size'))
|
||||
if pers_dict.get('type') is not None:
|
||||
pers_element.set('type', pers_dict.get('type'))
|
||||
return pers_element
|
||||
|
||||
|
||||
class Rebuild(AutoMarshallingModel):
|
||||
"""
|
||||
@summary: Rebuild Request Object for Server
|
||||
@@ -210,8 +260,9 @@ class Rebuild(AutoMarshallingModel):
|
||||
|
||||
def __init__(self, name, image_ref, admin_pass=None,
|
||||
disk_config=None, metadata=None, personality=None,
|
||||
user_data=None, accessIPv4=None, accessIPv6=None,
|
||||
networks=None, key_name=None, config_drive=None):
|
||||
block_device_mapping=None, user_data=None, accessIPv4=None,
|
||||
accessIPv6=None, networks=None, key_name=None,
|
||||
config_drive=None):
|
||||
super(Rebuild, self).__init__()
|
||||
self.name = name
|
||||
self.image_ref = image_ref
|
||||
@@ -219,6 +270,7 @@ class Rebuild(AutoMarshallingModel):
|
||||
self.admin_pass = admin_pass
|
||||
self.metadata = metadata
|
||||
self.personality = personality
|
||||
self.block_device_mapping = block_device_mapping
|
||||
self.user_data = user_data
|
||||
self.accessIPv4 = accessIPv4
|
||||
self.accessIPv6 = accessIPv6
|
||||
@@ -236,6 +288,7 @@ class Rebuild(AutoMarshallingModel):
|
||||
'accessIPv4': self.accessIPv4,
|
||||
'accessIPv6': self.accessIPv6,
|
||||
'personality': self.personality,
|
||||
'block_device_mapping': self.block_device_mapping,
|
||||
'user_data': self.user_data,
|
||||
'networks': self.networks,
|
||||
'key_name': self.key_name,
|
||||
@@ -273,6 +326,11 @@ class Rebuild(AutoMarshallingModel):
|
||||
personality_ele = ET.Element('personality')
|
||||
personality_ele.append(Personality._obj_to_xml(self.personality))
|
||||
element.append(personality_ele)
|
||||
if self.block_device_mapping is not None:
|
||||
block_device_ele = ET.Element('block_device_mapping')
|
||||
block_device_ele.append(BlockDeviceMapping._obj_to_xml(
|
||||
self.block_device_mapping))
|
||||
element.append(block_device_ele)
|
||||
if self.user_data is not None:
|
||||
element.set('user_data', self.user_data)
|
||||
if self.accessIPv4 is not None:
|
||||
|
||||
Reference in New Issue
Block a user