Plumb NetworkRequest objects through conductor and compute RPC

This makes the conductor and compute RPC paths for building instances
support and use NetworkRequest objects, which gets this all the way
down to the compute managers.

Change-Id: Ia45e15896b80ae33533d77719dd23bbdf60a1945
This commit is contained in:
Dan Smith 2014-08-26 12:19:17 -07:00
parent 19131dabbf
commit d678e238b4
7 changed files with 45 additions and 18 deletions

View File

@ -998,9 +998,6 @@ class API(base.Base):
self._record_action_start(context, instance,
instance_actions.CREATE)
if requested_networks is not None:
# NOTE(danms): Temporary transition
requested_networks = requested_networks.as_tuples()
self.compute_task_api.build_instances(context,
instances=instances, image=boot_meta,
filter_properties=filter_properties,

View File

@ -570,7 +570,7 @@ class ComputeVirtAPI(virtapi.VirtAPI):
class ComputeManager(manager.Manager):
"""Manages the running instances from creation to destruction."""
target = messaging.Target(version='3.32')
target = messaging.Target(version='3.33')
# How long to wait in seconds before re-issuing a shutdown
# signal to a instance during power off. The overall
@ -1893,6 +1893,14 @@ class ComputeManager(manager.Manager):
security_groups=None, block_device_mapping=None,
node=None, limits=None):
# NOTE(danms): Remove this in v4.0 of the RPC API
if (requested_networks and
not isinstance(requested_networks,
objects.NetworkRequestList)):
requested_networks = objects.NetworkRequestList(
objects=[objects.NetworkRequest.from_tuple(t)
for t in requested_networks])
@utils.synchronized(instance.uuid)
def do_build_and_run_instance(context, instance, image, request_spec,
filter_properties, admin_password, injected_files,
@ -1926,6 +1934,9 @@ class ComputeManager(manager.Manager):
instance=instance)
try:
# NOTE(danms): Temporary and transitional
if requested_networks:
requested_networks = requested_networks.as_tuples()
self._build_and_run_instance(context, instance, image,
decoded_files, admin_password, requested_networks,
security_groups, block_device_mapping, node, limits,

View File

@ -267,6 +267,7 @@ class ComputeAPI(object):
* 3.31 - Add get_instance_diagnostics
* 3.32 - Add destroy_disks and migrate_data optional parameters to
rollback_live_migration_at_destination()
* 3.33 - Make build_and_run_instance() take a NetworkRequestList object
'''
@ -1039,7 +1040,13 @@ class ComputeAPI(object):
filter_properties, admin_password=None, injected_files=None,
requested_networks=None, security_groups=None,
block_device_mapping=None, node=None, limits=None):
cctxt = self.client.prepare(server=host, version='3.23')
version = '3.33'
if not self.client.can_send_version(version):
version = '3.23'
if requested_networks is not None:
requested_networks = requested_networks.as_tuples()
cctxt = self.client.prepare(server=host, version=version)
cctxt.cast(ctxt, 'build_and_run_instance', instance=instance,
image=image, request_spec=request_spec,
filter_properties=filter_properties,

View File

@ -448,7 +448,7 @@ class ComputeTaskManager(base.Base):
may involve coordinating activities on multiple compute nodes.
"""
target = messaging.Target(namespace='compute_task', version='1.8')
target = messaging.Target(namespace='compute_task', version='1.9')
def __init__(self):
super(ComputeTaskManager, self).__init__()
@ -592,6 +592,14 @@ class ComputeTaskManager(base.Base):
# 2.0 of the RPC API.
request_spec = scheduler_utils.build_request_spec(context, image,
instances)
# TODO(danms): Remove this in version 2.0 of the RPC API
if (requested_networks and
not isinstance(requested_networks,
objects.NetworkRequestList)):
requested_networks = objects.NetworkRequestList(
objects=[objects.NetworkRequest.from_tuple(t)
for t in requested_networks])
try:
# check retry policy. Rather ugly use of instances[0]...
# but if we've exceeded max retries... then we really only

View File

@ -365,6 +365,7 @@ class ComputeTaskAPI(object):
1.6 - Made migrate_server use instance objects
1.7 - Do not send block_device_mapping and legacy_bdm to build_instances
1.8 - Add rebuild_instance
1.9 - Converted requested_networks to NetworkRequestList object
"""
@ -405,12 +406,15 @@ class ComputeTaskAPI(object):
'requested_networks': requested_networks,
'security_groups': security_groups}
if self.client.can_send_version('1.7'):
version = '1.7'
else:
version = '1.9'
if not self.client.can_send_version('1.9'):
version = '1.8'
kw['requested_networks'] = kw['requested_networks'].as_tuples()
if not self.client.can_send_version('1.7'):
version = '1.5'
kw.update({'block_device_mapping': block_device_mapping,
'legacy_bdm': legacy_bdm})
cctxt = self.client.prepare(version=version)
cctxt.cast(context, 'build_instances', **kw)

View File

@ -862,4 +862,4 @@ class ComputeRpcAPITestCase(test.TestCase):
admin_password='passwd', injected_files=None,
requested_networks=['network1'], security_groups=None,
block_device_mapping=None, node='node', limits=[],
version='3.23')
version='3.33')

View File

@ -1259,7 +1259,7 @@ class _BaseTaskTestCase(object):
'limits': []},
admin_password='admin_password',
injected_files='injected_files',
requested_networks='requested_networks',
requested_networks=None,
security_groups='security_groups',
block_device_mapping=mox.IgnoreArg(),
node='node1', limits=[])
@ -1285,7 +1285,7 @@ class _BaseTaskTestCase(object):
'hosts': [['host2', 'node2']]}},
admin_password='admin_password',
injected_files='injected_files',
requested_networks='requested_networks',
requested_networks=None,
security_groups='security_groups',
block_device_mapping=mox.IgnoreArg(),
node='node2', limits=[])
@ -1300,7 +1300,7 @@ class _BaseTaskTestCase(object):
filter_properties={},
admin_password='admin_password',
injected_files='injected_files',
requested_networks='requested_networks',
requested_networks=None,
security_groups='security_groups',
block_device_mapping='block_device_mapping',
legacy_bdm=False)
@ -1337,7 +1337,7 @@ class _BaseTaskTestCase(object):
filter_properties={},
admin_password='admin_password',
injected_files='injected_files',
requested_networks='requested_networks',
requested_networks=None,
security_groups='security_groups',
block_device_mapping='block_device_mapping',
legacy_bdm=False)
@ -1929,7 +1929,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase):
'node2']]}},
admin_password='admin_password',
injected_files='injected_files',
requested_networks='requested_networks',
requested_networks=None,
security_groups='security_groups',
block_device_mapping=mox.IsA(objects.BlockDeviceMappingList),
node='node2', limits=[])
@ -1944,7 +1944,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase):
filter_properties={},
admin_password='admin_password',
injected_files='injected_files',
requested_networks='requested_networks',
requested_networks=None,
security_groups='security_groups',
block_device_mapping='block_device_mapping',
legacy_bdm=False)
@ -1980,7 +1980,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase):
filter_properties={},
admin_password='admin_password',
injected_files='injected_files',
requested_networks='requested_networks',
requested_networks=None,
security_groups='security_groups',
block_device_mapping='block_device_mapping',
legacy_bdm=False)
@ -1994,7 +1994,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase):
'node2']]}},
admin_password='admin_password',
injected_files='injected_files',
requested_networks='requested_networks',
requested_networks=None,
security_groups='security_groups',
block_device_mapping=mock.ANY,
node='node2', limits=[])