Merge pull request #137 from danwent/master

novaclient changes to use os-create-server API extensions for v1.1

(pushing through to prepare for gerrit move)
This commit is contained in:
Sandy Walsh 2011-11-15 18:40:38 -08:00
commit 897592d8e3
3 changed files with 42 additions and 7 deletions

View File

@ -26,7 +26,7 @@ class BootingManagerWithFind(base.ManagerWithFind):
meta=None, files=None, zone_blob=None, userdata=None,
reservation_id=None, return_raw=False, min_count=None,
max_count=None, security_groups=None, key_name=None,
availability_zone=None, block_device_mapping=None):
availability_zone=None, block_device_mapping=None, nics=None):
"""
Create (boot) a new server.
@ -53,6 +53,9 @@ class BootingManagerWithFind(base.ManagerWithFind):
:param availability_zone: The :class:`Zone`.
:param block_device_mapping: A dict of block device mappings for this
server.
:param nics: (optional extension) an ordered list of nics to be
added to this server, with information about
connected networks, fixed ips, etc.
"""
body = {"server": {
"name": name,
@ -129,5 +132,17 @@ class BootingManagerWithFind(base.ManagerWithFind):
bdm_dict['delete_on_termination'] = mapping_parts[3]
bdm.append(bdm_dict)
if nics:
all_net_data = []
for nic_info in nics:
net_data = {}
# if value is empty string, do not send value in body
if nic_info['net-id']:
net_data['uuid'] = nic_info['net-id']
if nic_info['v4-fixed-ip']:
net_data['fixed_ip'] = nic_info['v4-fixed-ip']
all_net_data.append(net_data)
body['server']['networks'] = all_net_data
return self._create(resource_url, body, response_key,
return_raw=return_raw)

View File

@ -328,7 +328,7 @@ class ServerManager(local_base.BootingManagerWithFind):
zone_blob=None, reservation_id=None, min_count=None,
max_count=None, security_groups=None, userdata=None,
key_name=None, availability_zone=None,
block_device_mapping=None):
block_device_mapping=None, nics=None):
# TODO: (anthony) indicate in doc string if param is an extension
# and/or optional
"""
@ -357,6 +357,9 @@ class ServerManager(local_base.BootingManagerWithFind):
:param availability_zone: The :class:`Zone`.
:param block_device_mapping: (optional extension) A dict of block device
mappings for this server.
:param nics: (optional extension) an ordered list of nics to be
added to this server, with information about
connected networks, fixed ips, etc.
"""
if not min_count:
min_count = 1
@ -379,7 +382,7 @@ class ServerManager(local_base.BootingManagerWithFind):
zone_blob=zone_blob, reservation_id=reservation_id,
min_count=min_count, max_count=max_count,
security_groups=security_groups, key_name=key_name,
availability_zone=availability_zone)
availability_zone=availability_zone, nics=nics)
def update(self, server, name=None):
"""

View File

@ -111,10 +111,17 @@ def _boot(cs, args, reservation_id=None, min_count=None, max_count=None):
device_name, mapping = bdm.split('=', 1)
block_device_mapping[device_name] = mapping
nics = []
for nic_str in args.nics:
nic_info = {"net-id": "", "v4-fixed-ip": ""}
for kv_str in nic_str.split(","):
k,v = kv_str.split("=")
nic_info[k] = v
nics.append(nic_info)
return (args.name, image, flavor, metadata, files, key_name,
reservation_id, min_count, max_count, user_data, \
availability_zone, security_groups, block_device_mapping)
availability_zone, security_groups, block_device_mapping, nics)
@utils.arg('--flavor',
@ -168,11 +175,20 @@ def _boot(cs, args, reservation_id=None, min_count=None, max_count=None):
default=[],
help="Block device mapping in the format "
"<dev_name=<id>:<type>:<size(GB)>:<delete_on_terminate>.")
@utils.arg('--nic',
metavar="<net-id=net-uuid,v4-fixed-ip=ip-addr>",
action='append',
dest='nics',
default=[],
help="Create a NIC on the server.\n"
"Specify option multiple times to create multiple NICs.\n"
"net-id: attach NIC to network with this UUID (optional)\n"
"v4-fixed-ip: IPv4 fixed address for NIC (optional).")
def do_boot(cs, args):
"""Boot a new server."""
name, image, flavor, metadata, files, key_name, reservation_id, \
min_count, max_count, user_data, availability_zone, \
security_groups, block_device_mapping = _boot(cs, args)
security_groups, block_device_mapping, nics = _boot(cs, args)
server = cs.servers.create(args.name, image, flavor,
meta=metadata,
@ -183,7 +199,8 @@ def do_boot(cs, args):
availability_zone=availability_zone,
security_groups=security_groups,
key_name=key_name,
block_device_mapping=block_device_mapping)
block_device_mapping=block_device_mapping,
nics=nics)
# Keep any information (like adminPass) returned by create
info = server._info