Merge "Bump compute rpcapi version and reduce Cyborg calls."

This commit is contained in:
Zuul 2020-03-31 14:54:11 +00:00 committed by Gerrit Code Review
commit 66965e48e1
7 changed files with 191 additions and 87 deletions

View File

@ -559,7 +559,7 @@ class ComputeVirtAPI(virtapi.VirtAPI):
class ComputeManager(manager.Manager): class ComputeManager(manager.Manager):
"""Manages the running instances from creation to destruction.""" """Manages the running instances from creation to destruction."""
target = messaging.Target(version='5.10') target = messaging.Target(version='5.11')
def __init__(self, compute_driver=None, *args, **kwargs): def __init__(self, compute_driver=None, *args, **kwargs):
"""Load configuration options and connect to the hypervisor.""" """Load configuration options and connect to the hypervisor."""
@ -2075,7 +2075,7 @@ class ComputeManager(manager.Manager):
filter_properties, admin_password=None, filter_properties, admin_password=None,
injected_files=None, requested_networks=None, injected_files=None, requested_networks=None,
security_groups=None, block_device_mapping=None, security_groups=None, block_device_mapping=None,
node=None, limits=None, host_list=None): node=None, limits=None, host_list=None, accel_uuids=None):
@utils.synchronized(instance.uuid) @utils.synchronized(instance.uuid)
def _locked_do_build_and_run_instance(*args, **kwargs): def _locked_do_build_and_run_instance(*args, **kwargs):
@ -2127,7 +2127,8 @@ class ComputeManager(manager.Manager):
context, instance, image, request_spec, context, instance, image, request_spec,
filter_properties, admin_password, injected_files, filter_properties, admin_password, injected_files,
requested_networks, security_groups, requested_networks, security_groups,
block_device_mapping, node, limits, host_list) block_device_mapping, node, limits, host_list,
accel_uuids)
def _check_device_tagging(self, requested_networks, block_device_mapping): def _check_device_tagging(self, requested_networks, block_device_mapping):
tagging_requested = False tagging_requested = False
@ -2164,7 +2165,7 @@ class ComputeManager(manager.Manager):
def _do_build_and_run_instance(self, context, instance, image, def _do_build_and_run_instance(self, context, instance, image,
request_spec, filter_properties, admin_password, injected_files, request_spec, filter_properties, admin_password, injected_files,
requested_networks, security_groups, block_device_mapping, requested_networks, security_groups, block_device_mapping,
node=None, limits=None, host_list=None): node=None, limits=None, host_list=None, accel_uuids=None):
try: try:
LOG.debug('Starting instance...', instance=instance) LOG.debug('Starting instance...', instance=instance)
@ -2194,7 +2195,7 @@ class ComputeManager(manager.Manager):
self._build_and_run_instance(context, instance, image, self._build_and_run_instance(context, instance, image,
decoded_files, admin_password, requested_networks, decoded_files, admin_password, requested_networks,
security_groups, block_device_mapping, node, limits, security_groups, block_device_mapping, node, limits,
filter_properties, request_spec) filter_properties, request_spec, accel_uuids)
LOG.info('Took %0.2f seconds to build instance.', LOG.info('Took %0.2f seconds to build instance.',
timer.elapsed(), instance=instance) timer.elapsed(), instance=instance)
return build_results.ACTIVE return build_results.ACTIVE
@ -2304,7 +2305,7 @@ class ComputeManager(manager.Manager):
def _build_and_run_instance(self, context, instance, image, injected_files, def _build_and_run_instance(self, context, instance, image, injected_files,
admin_password, requested_networks, security_groups, admin_password, requested_networks, security_groups,
block_device_mapping, node, limits, filter_properties, block_device_mapping, node, limits, filter_properties,
request_spec=None): request_spec=None, accel_uuids=None):
image_name = image.get('name') image_name = image.get('name')
self._notify_about_instance_usage(context, instance, 'create.start', self._notify_about_instance_usage(context, instance, 'create.start',
@ -2353,7 +2354,8 @@ class ComputeManager(manager.Manager):
with self._build_resources(context, instance, with self._build_resources(context, instance,
requested_networks, security_groups, image_meta, requested_networks, security_groups, image_meta,
block_device_mapping, provider_mapping) as resources: block_device_mapping, provider_mapping,
accel_uuids) as resources:
instance.vm_state = vm_states.BUILDING instance.vm_state = vm_states.BUILDING
instance.task_state = task_states.SPAWNING instance.task_state = task_states.SPAWNING
# NOTE(JoshNang) This also saves the changes to the # NOTE(JoshNang) This also saves the changes to the
@ -2526,7 +2528,7 @@ class ComputeManager(manager.Manager):
@contextlib.contextmanager @contextlib.contextmanager
def _build_resources(self, context, instance, requested_networks, def _build_resources(self, context, instance, requested_networks,
security_groups, image_meta, block_device_mapping, security_groups, image_meta, block_device_mapping,
resource_provider_mapping): resource_provider_mapping, accel_uuids):
resources = {} resources = {}
network_info = None network_info = None
try: try:
@ -2596,7 +2598,7 @@ class ComputeManager(manager.Manager):
try: try:
if dp_name: if dp_name:
arqs = self._get_bound_arq_resources( arqs = self._get_bound_arq_resources(
context, dp_name, instance) context, dp_name, instance, accel_uuids)
except (Exception, eventlet.timeout.Timeout) as exc: except (Exception, eventlet.timeout.Timeout) as exc:
LOG.exception(exc.format_message()) LOG.exception(exc.format_message())
self._build_resources_cleanup(instance, network_info) self._build_resources_cleanup(instance, network_info)
@ -2639,7 +2641,7 @@ class ComputeManager(manager.Manager):
# Call Cyborg to delete accelerator requests # Call Cyborg to delete accelerator requests
compute_utils.delete_arqs_if_needed(context, instance) compute_utils.delete_arqs_if_needed(context, instance)
def _get_bound_arq_resources(self, context, dp_name, instance): def _get_bound_arq_resources(self, context, dp_name, instance, arq_uuids):
"""Get bound accelerator requests. """Get bound accelerator requests.
The ARQ binding was kicked off in the conductor as an async The ARQ binding was kicked off in the conductor as an async
@ -2653,13 +2655,18 @@ class ComputeManager(manager.Manager):
:param dp_name: Device profile name. Caller ensures this is valid. :param dp_name: Device profile name. Caller ensures this is valid.
:param instance: instance object :param instance: instance object
:param arq_uuids: List of accelerator request (ARQ) UUIDs.
:returns: List of ARQs for which bindings have completed, :returns: List of ARQs for which bindings have completed,
successfully or otherwise successfully or otherwise
""" """
cyclient = cyborg.get_client(context) cyclient = cyborg.get_client(context)
arqs = cyclient.get_arqs_for_instance(instance.uuid) if arq_uuids is None:
events = [('accelerator-request-bound', arq['uuid']) for arq in arqs] arqs = cyclient.get_arqs_for_instance(instance.uuid)
arq_uuids = [arq['uuid'] for arq in arqs]
events = [('accelerator-request-bound', arq_uuid)
for arq_uuid in arq_uuids]
timeout = CONF.arq_binding_timeout timeout = CONF.arq_binding_timeout
with self.virtapi.wait_for_instance_event( with self.virtapi.wait_for_instance_event(
instance, events, deadline=timeout): instance, events, deadline=timeout):
@ -2674,11 +2681,12 @@ class ComputeManager(manager.Manager):
# Since a timeout in wait_for_instance_event will raise, we get # Since a timeout in wait_for_instance_event will raise, we get
# here only if all binding events have been received. # here only if all binding events have been received.
if sorted(resolved_arqs) != sorted(arqs): resolved_uuids = [arq['uuid'] for arq in resolved_arqs]
if sorted(resolved_uuids) != sorted(arq_uuids):
# Query Cyborg to get all. # Query Cyborg to get all.
arqs = cyclient.get_arqs_for_instance(instance.uuid) arqs = cyclient.get_arqs_for_instance(instance.uuid)
else: else:
arqs = resolved_arqs # latter has the right arq.state arqs = resolved_arqs
return arqs return arqs
def _cleanup_allocated_networks(self, context, instance, def _cleanup_allocated_networks(self, context, instance,

View File

@ -376,6 +376,8 @@ class ComputeAPI(object):
* 5.8 - Add confirm_snapshot_based_resize_at_source() * 5.8 - Add confirm_snapshot_based_resize_at_source()
* 5.9 - Add revert_snapshot_based_resize_at_dest() * 5.9 - Add revert_snapshot_based_resize_at_dest()
* 5.10 - Add finish_revert_snapshot_based_resize_at_source() * 5.10 - Add finish_revert_snapshot_based_resize_at_source()
* 5.11 - Add accel_uuids (accelerator requests) parameter to
build_and_run_instance()
''' '''
VERSION_ALIASES = { VERSION_ALIASES = {
@ -1418,7 +1420,7 @@ class ComputeAPI(object):
filter_properties, admin_password=None, injected_files=None, filter_properties, admin_password=None, injected_files=None,
requested_networks=None, security_groups=None, requested_networks=None, security_groups=None,
block_device_mapping=None, node=None, limits=None, block_device_mapping=None, node=None, limits=None,
host_list=None): host_list=None, accel_uuids=None):
# NOTE(edleafe): compute nodes can only use the dict form of limits. # NOTE(edleafe): compute nodes can only use the dict form of limits.
if isinstance(limits, objects.SchedulerLimits): if isinstance(limits, objects.SchedulerLimits):
limits = limits.to_dict() limits = limits.to_dict()
@ -1434,9 +1436,13 @@ class ComputeAPI(object):
"node": node, "node": node,
"limits": limits, "limits": limits,
"host_list": host_list, "host_list": host_list,
"accel_uuids": accel_uuids,
} }
client = self.router.client(ctxt) client = self.router.client(ctxt)
version = '5.0' version = '5.11'
if not client.can_send_version(version):
kwargs.pop('accel_uuids')
version = '5.0'
cctxt = client.prepare(server=host, version=version) cctxt = client.prepare(server=host, version=version)
cctxt.cast(ctxt, 'build_and_run_instance', **kwargs) cctxt.cast(ctxt, 'build_and_run_instance', **kwargs)

View File

@ -840,7 +840,7 @@ class ComputeTaskManager(base.Base):
try: try:
resource_provider_mapping = ( resource_provider_mapping = (
local_reqspec.get_request_group_mapping()) local_reqspec.get_request_group_mapping())
self._create_and_bind_arqs( accel_uuids = self._create_and_bind_arqs(
context, instance.uuid, instance.flavor.extra_specs, context, instance.uuid, instance.flavor.extra_specs,
host.nodename, resource_provider_mapping) host.nodename, resource_provider_mapping)
except Exception as exc: except Exception as exc:
@ -858,7 +858,8 @@ class ComputeTaskManager(base.Base):
requested_networks=requested_networks, requested_networks=requested_networks,
security_groups=security_groups, security_groups=security_groups,
block_device_mapping=bdms, node=host.nodename, block_device_mapping=bdms, node=host.nodename,
limits=host.limits, host_list=host_list) limits=host.limits, host_list=host_list,
accel_uuids=accel_uuids)
def _schedule_instances(self, context, request_spec, def _schedule_instances(self, context, request_spec,
instance_uuids=None, return_alternates=False): instance_uuids=None, return_alternates=False):
@ -1618,12 +1619,13 @@ class ComputeTaskManager(base.Base):
# this one. # this one.
continue continue
accel_uuids = []
try: try:
resource_provider_mapping = ( resource_provider_mapping = (
request_spec.get_request_group_mapping()) request_spec.get_request_group_mapping())
# Using nodename instead of hostname. See: # Using nodename instead of hostname. See:
# http://lists.openstack.org/pipermail/openstack-discuss/2019-November/011044.html # noqa # http://lists.openstack.org/pipermail/openstack-discuss/2019-November/011044.html # noqa
self._create_and_bind_arqs( accel_uuids = self._create_and_bind_arqs(
context, instance.uuid, instance.flavor.extra_specs, context, instance.uuid, instance.flavor.extra_specs,
host.nodename, resource_provider_mapping) host.nodename, resource_provider_mapping)
except Exception as exc: except Exception as exc:
@ -1649,7 +1651,8 @@ class ComputeTaskManager(base.Base):
security_groups=legacy_secgroups, security_groups=legacy_secgroups,
block_device_mapping=instance_bdms, block_device_mapping=instance_bdms,
host=host.service_host, node=host.nodename, host=host.service_host, node=host.nodename,
limits=host.limits, host_list=host_list) limits=host.limits, host_list=host_list,
accel_uuids=accel_uuids)
def _create_and_bind_arqs(self, context, instance_uuid, extra_specs, def _create_and_bind_arqs(self, context, instance_uuid, extra_specs,
hostname, resource_provider_mapping): hostname, resource_provider_mapping):
@ -1660,7 +1663,7 @@ class ComputeTaskManager(base.Base):
""" """
dp_name = extra_specs.get('accel:device_profile') dp_name = extra_specs.get('accel:device_profile')
if not dp_name: if not dp_name:
return return []
LOG.debug('Calling Cyborg to get ARQs. dp_name=%s instance=%s', LOG.debug('Calling Cyborg to get ARQs. dp_name=%s instance=%s',
dp_name, instance_uuid) dp_name, instance_uuid)
@ -1677,6 +1680,7 @@ class ComputeTaskManager(base.Base):
for arq in arqs} for arq in arqs}
# Initiate Cyborg binding asynchronously # Initiate Cyborg binding asynchronously
cyclient.bind_arqs(bindings=bindings) cyclient.bind_arqs(bindings=bindings)
return [arq['uuid'] for arq in arqs]
@staticmethod @staticmethod
def _map_instance_to_cell(context, instance, cell): def _map_instance_to_cell(context, instance, cell):

View File

@ -31,7 +31,7 @@ LOG = logging.getLogger(__name__)
# NOTE(danms): This is the global service version counter # NOTE(danms): This is the global service version counter
SERVICE_VERSION = 49 SERVICE_VERSION = 50
# NOTE(danms): This is our SERVICE_VERSION history. The idea is that any # NOTE(danms): This is our SERVICE_VERSION history. The idea is that any
@ -180,6 +180,9 @@ SERVICE_VERSION_HISTORY = (
{'compute_rpc': '5.10'}, {'compute_rpc': '5.10'},
# Version 49: Compute now support server move operations with qos ports # Version 49: Compute now support server move operations with qos ports
{'compute_rpc': '5.10'}, {'compute_rpc': '5.10'},
# Version 50: Compute RPC v5.11:
# Add accel_uuids (accelerator requests) param to build_and_run_instance
{'compute_rpc': '5.11'},
) )

View File

@ -5958,6 +5958,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.requested_networks = [] self.requested_networks = []
self.security_groups = [] self.security_groups = []
self.block_device_mapping = [] self.block_device_mapping = []
self.accel_uuids = None
self.filter_properties = {'retry': {'num_attempts': 1, self.filter_properties = {'retry': {'num_attempts': 1,
'hosts': [[self.compute.host, 'hosts': [[self.compute.host,
'fake-node']]}} 'fake-node']]}}
@ -6035,12 +6036,13 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
'_build_networks_for_instance') '_build_networks_for_instance')
@mock.patch.object(virt_driver.ComputeDriver, @mock.patch.object(virt_driver.ComputeDriver,
'prepare_networks_before_block_device_mapping') 'prepare_networks_before_block_device_mapping')
def _test_accel_build_resources(self, mock_prep_net, mock_build_net, def _test_accel_build_resources(self, accel_uuids,
mock_prep_spawn, mock_prep_bd, mock_bdnames, mock_save): mock_prep_net, mock_build_net, mock_prep_spawn,
mock_prep_bd, mock_bdnames, mock_save):
args = (self.context, self.instance, self.requested_networks, args = (self.context, self.instance, self.requested_networks,
self.security_groups, self.image, self.block_device_mapping, self.security_groups, self.image, self.block_device_mapping,
self.resource_provider_mapping) self.resource_provider_mapping, accel_uuids)
resources = [] resources = []
with self.compute._build_resources(*args) as resources: with self.compute._build_resources(*args) as resources:
@ -6053,7 +6055,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
def test_accel_build_resources_no_device_profile(self, mock_get_arqs): def test_accel_build_resources_no_device_profile(self, mock_get_arqs):
# If dp_name is None, accel path is a no-op. # If dp_name is None, accel path is a no-op.
self.instance.flavor.extra_specs = {} self.instance.flavor.extra_specs = {}
self._test_accel_build_resources() self._test_accel_build_resources(None)
mock_get_arqs.assert_not_called() mock_get_arqs.assert_not_called()
@mock.patch.object(nova.compute.manager.ComputeManager, @mock.patch.object(nova.compute.manager.ComputeManager,
@ -6064,11 +6066,12 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance.flavor.extra_specs = {"accel:device_profile": dp_name} self.instance.flavor.extra_specs = {"accel:device_profile": dp_name}
arq_list = fixtures.CyborgFixture.bound_arq_list arq_list = fixtures.CyborgFixture.bound_arq_list
mock_get_arqs.return_value = arq_list mock_get_arqs.return_value = arq_list
arq_uuids = [arq['uuid'] for arq in arq_list]
resources = self._test_accel_build_resources() resources = self._test_accel_build_resources(arq_uuids)
mock_get_arqs.assert_called_once_with(self.context, mock_get_arqs.assert_called_once_with(self.context,
dp_name, self.instance) dp_name, self.instance, arq_uuids)
self.assertEqual(sorted(resources['accel_info']), sorted(arq_list)) self.assertEqual(sorted(resources['accel_info']), sorted(arq_list))
@mock.patch.object(virt_driver.ComputeDriver, @mock.patch.object(virt_driver.ComputeDriver,
@ -6083,7 +6086,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
exception.AcceleratorRequestOpFailed(op='get', msg='')) exception.AcceleratorRequestOpFailed(op='get', msg=''))
self.assertRaises(exception.NovaException, self.assertRaises(exception.NovaException,
self._test_accel_build_resources) self._test_accel_build_resources, None)
mock_clean_net.assert_called_once() mock_clean_net.assert_called_once()
@mock.patch.object(nova.compute.manager.ComputeVirtAPI, @mock.patch.object(nova.compute.manager.ComputeVirtAPI,
@ -6100,13 +6103,42 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance.flavor.extra_specs = {"accel:device_profile": dp_name} self.instance.flavor.extra_specs = {"accel:device_profile": dp_name}
arq_events = [('accelerator-request-bound', arq['uuid']) arq_events = [('accelerator-request-bound', arq['uuid'])
for arq in arq_list] for arq in arq_list]
arq_uuids = [arq['uuid'] for arq in arq_list]
# get_arqs_for_instance() is called twice, once to get all ARQs
# for the instance, once to get only the resolved ARQs
mock_get_arqs.return_value = arq_list mock_get_arqs.return_value = arq_list
ret_arqs = self.compute._get_bound_arq_resources( ret_arqs = self.compute._get_bound_arq_resources(
self.context, dp_name, self.instance) self.context, dp_name, self.instance, arq_uuids)
mock_wait_inst_ev.assert_called_once_with(
self.instance, arq_events, deadline=mock.ANY)
mock_exit_wait_early.assert_called_once_with(arq_events)
mock_get_arqs.assert_has_calls([
mock.call(self.instance.uuid, only_resolved=True)])
self.assertEqual(sorted(ret_arqs), sorted(arq_list))
@mock.patch.object(nova.compute.manager.ComputeVirtAPI,
'exit_wait_early')
@mock.patch.object(nova.compute.manager.ComputeVirtAPI,
'wait_for_instance_event')
@mock.patch('nova.accelerator.cyborg._CyborgClient.'
'get_arqs_for_instance')
def test_arq_bind_wait_exit_early_no_arq_uuids(self, mock_get_arqs,
mock_wait_inst_ev, mock_exit_wait_early):
# If no ARQ UUIDs are passed in, call Cyborg to get the ARQs.
# Then, if bound ARQs available on first query, quit early.
dp_name = fixtures.CyborgFixture.dp_name
arq_list = fixtures.CyborgFixture.bound_arq_list
self.instance.flavor.extra_specs = {"accel:device_profile": dp_name}
arq_events = [('accelerator-request-bound', arq['uuid'])
for arq in arq_list]
mock_get_arqs.side_effect = [arq_list, arq_list]
ret_arqs = self.compute._get_bound_arq_resources(
self.context, dp_name, self.instance, arq_uuids=None)
mock_wait_inst_ev.assert_called_once_with( mock_wait_inst_ev.assert_called_once_with(
self.instance, arq_events, deadline=mock.ANY) self.instance, arq_events, deadline=mock.ANY)
@ -6132,19 +6164,19 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance.flavor.extra_specs = {"accel:device_profile": dp_name} self.instance.flavor.extra_specs = {"accel:device_profile": dp_name}
arq_events = [('accelerator-request-bound', arq['uuid']) arq_events = [('accelerator-request-bound', arq['uuid'])
for arq in arq_list] for arq in arq_list]
# get_arqs_for_instance gets called 3 times, returning the full arq_uuids = [arq['uuid'] for arq in arq_list]
# ARQ list first, [] as resolved ARQs next, and the full list finally # get_arqs_for_instance gets called 2 times, returning the
mock_get_arqs.side_effect = [arq_list, [], arq_list] # resolved ARQs first, and the full list finally
mock_get_arqs.side_effect = [[], arq_list]
ret_arqs = self.compute._get_bound_arq_resources( ret_arqs = self.compute._get_bound_arq_resources(
self.context, dp_name, self.instance) self.context, dp_name, self.instance, arq_uuids)
mock_wait_inst_ev.assert_called_once_with( mock_wait_inst_ev.assert_called_once_with(
self.instance, arq_events, deadline=mock.ANY) self.instance, arq_events, deadline=mock.ANY)
mock_exit_wait_early.assert_not_called() mock_exit_wait_early.assert_not_called()
self.assertEqual(sorted(ret_arqs), sorted(arq_list)) self.assertEqual(sorted(ret_arqs), sorted(arq_list))
mock_get_arqs.assert_has_calls([ mock_get_arqs.assert_has_calls([
mock.call(self.instance.uuid),
mock.call(self.instance.uuid, only_resolved=True), mock.call(self.instance.uuid, only_resolved=True),
mock.call(self.instance.uuid)]) mock.call(self.instance.uuid)])
@ -6162,18 +6194,19 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance.flavor.extra_specs = {"accel:device_profile": dp_name} self.instance.flavor.extra_specs = {"accel:device_profile": dp_name}
arq_events = [('accelerator-request-bound', arq['uuid']) arq_events = [('accelerator-request-bound', arq['uuid'])
for arq in arq_list] for arq in arq_list]
arq_uuids = [arq['uuid'] for arq in arq_list]
mock_get_arqs.return_value = arq_list mock_get_arqs.return_value = arq_list
mock_wait_inst_ev.side_effect = eventlet_timeout.Timeout mock_wait_inst_ev.side_effect = eventlet_timeout.Timeout
self.assertRaises(eventlet_timeout.Timeout, self.assertRaises(eventlet_timeout.Timeout,
self.compute._get_bound_arq_resources, self.compute._get_bound_arq_resources,
self.context, dp_name, self.instance) self.context, dp_name, self.instance, arq_uuids)
mock_wait_inst_ev.assert_called_once_with( mock_wait_inst_ev.assert_called_once_with(
self.instance, arq_events, deadline=mock.ANY) self.instance, arq_events, deadline=mock.ANY)
mock_exit_wait_early.assert_not_called() mock_exit_wait_early.assert_not_called()
mock_get_arqs.assert_called_once_with(self.instance.uuid) mock_get_arqs.assert_not_called()
@mock.patch.object(nova.compute.manager.ComputeVirtAPI, @mock.patch.object(nova.compute.manager.ComputeVirtAPI,
'exit_wait_early') 'exit_wait_early')
@ -6190,21 +6223,20 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance.flavor.extra_specs = {"accel:device_profile": dp_name} self.instance.flavor.extra_specs = {"accel:device_profile": dp_name}
arq_events = [('accelerator-request-bound', arq['uuid']) arq_events = [('accelerator-request-bound', arq['uuid'])
for arq in arq_list] for arq in arq_list]
arq_uuids = [arq['uuid'] for arq in arq_list]
mock_get_arqs.side_effect = [ mock_get_arqs.side_effect = (
arq_list, exception.AcceleratorRequestOpFailed(op='', msg=''))
exception.AcceleratorRequestOpFailed(op='', msg='')]
self.assertRaises(exception.AcceleratorRequestOpFailed, self.assertRaises(exception.AcceleratorRequestOpFailed,
self.compute._get_bound_arq_resources, self.compute._get_bound_arq_resources,
self.context, dp_name, self.instance) self.context, dp_name, self.instance, arq_uuids)
mock_wait_inst_ev.assert_called_once_with( mock_wait_inst_ev.assert_called_once_with(
self.instance, arq_events, deadline=mock.ANY) self.instance, arq_events, deadline=mock.ANY)
mock_exit_wait_early.assert_not_called() mock_exit_wait_early.assert_not_called()
mock_get_arqs.assert_has_calls([ mock_get_arqs.assert_called_once_with(
mock.call(self.instance.uuid), self.instance.uuid, only_resolved=True)
mock.call(self.instance.uuid, only_resolved=True)])
@mock.patch.object(fake_driver.FakeDriver, 'spawn') @mock.patch.object(fake_driver.FakeDriver, 'spawn')
@mock.patch('nova.objects.Instance.save') @mock.patch('nova.objects.Instance.save')
@ -6266,7 +6298,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
mock_bdnames, mock_build_net, mock_save): mock_bdnames, mock_build_net, mock_save):
args = (self.context, self.instance, self.requested_networks, args = (self.context, self.instance, self.requested_networks,
self.security_groups, self.image, self.block_device_mapping, self.security_groups, self.image, self.block_device_mapping,
self.resource_provider_mapping) self.resource_provider_mapping, self.accel_uuids)
mock_get_arqs.side_effect = ( mock_get_arqs.side_effect = (
exception.AcceleratorRequestOpFailed(op='get', msg='')) exception.AcceleratorRequestOpFailed(op='get', msg=''))
@ -6331,7 +6363,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties, {}) self.filter_properties, {}, self.accel_uuids)
# This test when sending an icehouse compatible rpc call to juno compute # This test when sending an icehouse compatible rpc call to juno compute
# node, NetworkRequest object can load from three items tuple. # node, NetworkRequest object can load from three items tuple.
@ -6397,7 +6429,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties, {}) self.filter_properties, {}, self.accel_uuids)
mock_clean_net.assert_called_once_with(self.context, self.instance, mock_clean_net.assert_called_once_with(self.context, self.instance,
self.requested_networks) self.requested_networks)
mock_clean_vol.assert_called_once_with(self.context, mock_clean_vol.assert_called_once_with(self.context,
@ -6448,7 +6480,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties, {}) self.filter_properties, {}, self.accel_uuids)
mock_nil.assert_called_once_with(self.instance) mock_nil.assert_called_once_with(self.instance)
mock_build.assert_called_once_with(self.context, mock_build.assert_called_once_with(self.context,
[self.instance], self.image, self.filter_properties, [self.instance], self.image, self.filter_properties,
@ -6474,7 +6506,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.injected_files, self.admin_pass, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.block_device_mapping, self.node,
self.limits, self.filter_properties) self.limits, self.filter_properties,
self.accel_uuids)
mock_save.assert_has_calls([ mock_save.assert_has_calls([
mock.call(), mock.call(),
mock.call(), mock.call(),
@ -6532,7 +6565,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties, {}) self.filter_properties, {}, self.accel_uuids)
mock_build_ins.assert_called_once_with(self.context, mock_build_ins.assert_called_once_with(self.context,
[instance], self.image, self.filter_properties, [instance], self.image, self.filter_properties,
self.admin_pass, self.injected_files, self.requested_networks, self.admin_pass, self.injected_files, self.requested_networks,
@ -6576,7 +6609,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties, {}) self.filter_properties, {}, self.accel_uuids)
mock_cleanup_network.assert_called_once_with( mock_cleanup_network.assert_called_once_with(
self.context, instance, self.requested_networks) self.context, instance, self.requested_networks)
mock_build_ins.assert_called_once_with(self.context, mock_build_ins.assert_called_once_with(self.context,
@ -6630,7 +6663,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties, {}) self.filter_properties, {}, self.accel_uuids)
mock_cleanup_network.assert_called_once_with( mock_cleanup_network.assert_called_once_with(
self.context, instance, self.requested_networks) self.context, instance, self.requested_networks)
mock_build_ins.assert_called_once_with(self.context, mock_build_ins.assert_called_once_with(self.context,
@ -6675,7 +6708,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
mock_build_run.assert_called_once_with(self.context, self.instance, mock_build_run.assert_called_once_with(self.context, self.instance,
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, {}, {}) self.block_device_mapping, self.node, self.limits, {}, {},
self.accel_uuids)
mock_clean_net.assert_called_once_with(self.context, self.instance, mock_clean_net.assert_called_once_with(self.context, self.instance,
self.requested_networks) self.requested_networks)
mock_clean_vol.assert_called_once_with(self.context, mock_clean_vol.assert_called_once_with(self.context,
@ -6724,7 +6758,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties, {}) self.filter_properties, {}, self.accel_uuids)
mock_nil.assert_called_once_with(self.instance) mock_nil.assert_called_once_with(self.instance)
mock_build.assert_called_once_with(self.context, mock_build.assert_called_once_with(self.context,
[self.instance], self.image, self.filter_properties, [self.instance], self.image, self.filter_properties,
@ -6767,7 +6801,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties, {}) self.filter_properties, {}, self.accel_uuids)
mock_clean.assert_called_once_with(self.context, self.instance, mock_clean.assert_called_once_with(self.context, self.instance,
self.requested_networks) self.requested_networks)
mock_nil.assert_called_once_with(self.instance) mock_nil.assert_called_once_with(self.instance)
@ -6827,7 +6861,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties, {}) self.filter_properties, {}, self.accel_uuids)
mock_clean_net.assert_called_once_with(self.context, self.instance, mock_clean_net.assert_called_once_with(self.context, self.instance,
self.requested_networks) self.requested_networks)
@ -6963,7 +6997,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.injected_files, self.admin_pass, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.block_device_mapping, self.node,
self.limits, self.filter_properties) self.limits, self.filter_properties,
self.accel_uuids)
mock_save.assert_has_calls([ mock_save.assert_has_calls([
mock.call(), mock.call(),
@ -7088,7 +7123,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance, self.image, self.injected_files, self.instance, self.image, self.injected_files,
self.admin_pass, self.requested_networks, self.admin_pass, self.requested_networks,
self.security_groups, self.block_device_mapping, self.node, self.security_groups, self.block_device_mapping, self.node,
self.limits, self.filter_properties) self.limits, self.filter_properties, self.accel_uuids)
_validate_instance_group_policy.assert_called_once_with( _validate_instance_group_policy.assert_called_once_with(
self.context, self.instance, {}) self.context, self.instance, {})
@ -7187,7 +7222,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance, self.image, self.injected_files, self.instance, self.image, self.injected_files,
self.admin_pass, self.requested_networks, self.admin_pass, self.requested_networks,
self.security_groups, self.block_device_mapping, self.security_groups, self.block_device_mapping,
self.node, self.limits, self.filter_properties) self.node, self.limits, self.filter_properties,
self.accel_uuids)
mock_save.assert_called_once_with() mock_save.assert_called_once_with()
mock_notify.assert_has_calls([ mock_notify.assert_has_calls([
@ -7198,7 +7234,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
mock_build.assert_called_once_with(self.context, self.instance, mock_build.assert_called_once_with(self.context, self.instance,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
test.MatchType(objects.ImageMeta), self.block_device_mapping, test.MatchType(objects.ImageMeta), self.block_device_mapping,
self.resource_provider_mapping) self.resource_provider_mapping, self.accel_uuids)
@mock.patch.object(virt_driver.ComputeDriver, 'failed_spawn_cleanup') @mock.patch.object(virt_driver.ComputeDriver, 'failed_spawn_cleanup')
@mock.patch.object(virt_driver.ComputeDriver, 'prepare_for_spawn') @mock.patch.object(virt_driver.ComputeDriver, 'prepare_for_spawn')
@ -7220,7 +7256,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
with self.compute._build_resources(self.context, self.instance, with self.compute._build_resources(self.context, self.instance,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.image, self.block_device_mapping, self.image, self.block_device_mapping,
self.resource_provider_mapping): self.resource_provider_mapping, self.accel_uuids):
pass pass
except Exception as e: except Exception as e:
self.assertIsInstance(e, exception.BuildAbortException) self.assertIsInstance(e, exception.BuildAbortException)
@ -7339,7 +7375,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
with self.compute._build_resources(self.context, self.instance, with self.compute._build_resources(self.context, self.instance,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.image, self.block_device_mapping, self.image, self.block_device_mapping,
self.resource_provider_mapping): self.resource_provider_mapping, self.accel_uuids):
pass pass
except Exception as e: except Exception as e:
self.assertIsInstance(e, self.assertIsInstance(e,
@ -7367,7 +7403,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
try: try:
with self.compute._build_resources(self.context, self.instance, with self.compute._build_resources(self.context, self.instance,
self.requested_networks, self.security_groups, self.image, self.requested_networks, self.security_groups, self.image,
self.block_device_mapping, self.resource_provider_mapping): self.block_device_mapping, self.resource_provider_mapping,
self.accel_uuids):
pass pass
except Exception as e: except Exception as e:
self.assertIsInstance(e, exception.BuildAbortException) self.assertIsInstance(e, exception.BuildAbortException)
@ -7398,7 +7435,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
with self.compute._build_resources(self.context, self.instance, with self.compute._build_resources(self.context, self.instance,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.image, self.block_device_mapping, self.image, self.block_device_mapping,
self.resource_provider_mapping): self.resource_provider_mapping, self.accel_uuids):
pass pass
except Exception as e: except Exception as e:
self.assertIsInstance(e, exc) self.assertIsInstance(e, exc)
@ -7429,7 +7466,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
with self.compute._build_resources(self.context, self.instance, with self.compute._build_resources(self.context, self.instance,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.image, self.block_device_mapping, self.image, self.block_device_mapping,
self.resource_provider_mapping): self.resource_provider_mapping, self.accel_uuids):
fake_spawn() fake_spawn()
except Exception as e: except Exception as e:
self.assertEqual(test_exception, e) self.assertEqual(test_exception, e)
@ -7463,7 +7500,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
with self.compute._build_resources(self.context, self.instance, with self.compute._build_resources(self.context, self.instance,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.image, self.block_device_mapping, self.image, self.block_device_mapping,
self.resource_provider_mapping): self.resource_provider_mapping, self.accel_uuids):
raise test.TestingException() raise test.TestingException()
except Exception as e: except Exception as e:
self.assertEqual(expected_exc, e) self.assertEqual(expected_exc, e)
@ -7494,7 +7531,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
with self.compute._build_resources(self.context, self.instance, with self.compute._build_resources(self.context, self.instance,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.image, self.block_device_mapping, self.image, self.block_device_mapping,
self.resource_provider_mapping): self.resource_provider_mapping, self.accel_uuids):
raise test.TestingException() raise test.TestingException()
except exception.BuildAbortException: except exception.BuildAbortException:
pass pass
@ -7522,7 +7559,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
with self.compute._build_resources(self.context, self.instance, with self.compute._build_resources(self.context, self.instance,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.image, self.block_device_mapping, self.image, self.block_device_mapping,
self.resource_provider_mapping): self.resource_provider_mapping, self.accel_uuids):
raise test.TestingException() raise test.TestingException()
except exception.BuildAbortException: except exception.BuildAbortException:
pass pass
@ -7554,7 +7591,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
with self.compute._build_resources(self.context, self.instance, with self.compute._build_resources(self.context, self.instance,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.image, self.block_device_mapping, self.image, self.block_device_mapping,
self.resource_provider_mapping): self.resource_provider_mapping, self.accel_uuids):
fake_spawn() fake_spawn()
self.assertTrue(mock_log.warning.called) self.assertTrue(mock_log.warning.called)
@ -7766,7 +7803,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties) self.filter_properties, self.accel_uuids)
expected_call = mock.call(self.context, self.instance, expected_call = mock.call(self.context, self.instance,
'create.end', extra_usage_info={'message': u'Success'}, 'create.end', extra_usage_info={'message': u'Success'},
network_info=[]) network_info=[])
@ -7798,7 +7835,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.image, self.injected_files, self.admin_pass, self.image, self.injected_files, self.admin_pass,
self.requested_networks, self.security_groups, self.requested_networks, self.security_groups,
self.block_device_mapping, self.node, self.limits, self.block_device_mapping, self.node, self.limits,
self.filter_properties) self.filter_properties, self.accel_uuids)
updates = {'vm_state': u'active', 'access_ip_v6': updates = {'vm_state': u'active', 'access_ip_v6':
netaddr.IPAddress('2001:db8:0:1:dcad:beff:feef:1'), netaddr.IPAddress('2001:db8:0:1:dcad:beff:feef:1'),
@ -7838,7 +7875,7 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance, self.image, self.injected_files, self.instance, self.image, self.injected_files,
self.admin_pass, self.requested_networks, self.admin_pass, self.requested_networks,
self.security_groups, self.block_device_mapping, self.node, self.security_groups, self.block_device_mapping, self.node,
self.limits, self.filter_properties) self.limits, self.filter_properties, self.accel_uuids)
expected_call = mock.call(self.context, self.instance, expected_call = mock.call(self.context, self.instance,
'create.error', fault=exc) 'create.error', fault=exc)
create_error_call = mock_notify.call_args_list[ create_error_call = mock_notify.call_args_list[
@ -7862,7 +7899,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance, self.image, self.injected_files, self.instance, self.image, self.injected_files,
self.admin_pass, self.requested_networks, self.admin_pass, self.requested_networks,
self.security_groups, self.block_device_mapping, self.node, self.security_groups, self.block_device_mapping, self.node,
self.limits, self.filter_properties, request_spec) self.limits, self.filter_properties, request_spec,
self.accel_uuids)
mock_networks.assert_called_once_with( mock_networks.assert_called_once_with(
self.context, self.instance, self.requested_networks, self.context, self.instance, self.requested_networks,
@ -7908,7 +7946,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance, self.image, self.injected_files, self.instance, self.image, self.injected_files,
self.admin_pass, self.requested_networks, self.admin_pass, self.requested_networks,
self.security_groups, self.block_device_mapping, self.node, self.security_groups, self.block_device_mapping, self.node,
self.limits, self.filter_properties, request_spec) self.limits, self.filter_properties, request_spec,
self.accel_uuids)
mock_networks.assert_called_once_with( mock_networks.assert_called_once_with(
self.context, self.instance, self.requested_networks, self.context, self.instance, self.requested_networks,
@ -7946,7 +7985,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance, self.image, self.injected_files, self.instance, self.image, self.injected_files,
self.admin_pass, self.requested_networks, self.admin_pass, self.requested_networks,
self.security_groups, self.block_device_mapping, self.node, self.security_groups, self.block_device_mapping, self.node,
self.limits, self.filter_properties, request_spec) self.limits, self.filter_properties, request_spec,
self.accel_uuids)
def test_build_with_resource_request_sriov_rp_wrongly_formatted_name(self): def test_build_with_resource_request_sriov_rp_wrongly_formatted_name(self):
request_spec = objects.RequestSpec( request_spec = objects.RequestSpec(
@ -7970,7 +8010,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance, self.image, self.injected_files, self.instance, self.image, self.injected_files,
self.admin_pass, self.requested_networks, self.admin_pass, self.requested_networks,
self.security_groups, self.block_device_mapping, self.node, self.security_groups, self.block_device_mapping, self.node,
self.limits, self.filter_properties, request_spec) self.limits, self.filter_properties, request_spec,
self.accel_uuids)
def test_build_with_resource_request_more_than_one_providers(self): def test_build_with_resource_request_more_than_one_providers(self):
request_spec = objects.RequestSpec( request_spec = objects.RequestSpec(
@ -7989,7 +8030,8 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase):
self.instance, self.image, self.injected_files, self.instance, self.image, self.injected_files,
self.admin_pass, self.requested_networks, self.admin_pass, self.requested_networks,
self.security_groups, self.block_device_mapping, self.node, self.security_groups, self.block_device_mapping, self.node,
self.limits, self.filter_properties, request_spec) self.limits, self.filter_properties, request_spec,
self.accel_uuids)
class ComputeManagerErrorsOutMigrationTestCase(test.NoDBTestCase): class ComputeManagerErrorsOutMigrationTestCase(test.NoDBTestCase):

View File

@ -933,13 +933,48 @@ class ComputeRpcAPITestCase(test.NoDBTestCase):
version='5.0') version='5.0')
def test_build_and_run_instance(self): def test_build_and_run_instance(self):
# With rpcapi 5.11, when a list of accel_uuids is passed as a param,
# that list must be passed to the client. That is tested in
# _test_compute_api with rpc_mock.assert, where expected_kwargs
# must have the accel_uuids.
accel_uuids = ['938af7f9-f136-4e5a-bdbe-3b6feab54311']
self._test_compute_api('build_and_run_instance', 'cast', self._test_compute_api('build_and_run_instance', 'cast',
instance=self.fake_instance_obj, host='host', image='image', instance=self.fake_instance_obj, host='host', image='image',
request_spec={'request': 'spec'}, filter_properties=[], request_spec={'request': 'spec'}, filter_properties=[],
admin_password='passwd', injected_files=None, admin_password='passwd', injected_files=None,
requested_networks=['network1'], security_groups=None, requested_networks=['network1'], security_groups=None,
block_device_mapping=None, node='node', limits=[], block_device_mapping=None, node='node', limits=[],
host_list=None, version='5.0') host_list=None, accel_uuids=accel_uuids, version='5.11')
def test_build_and_run_instance_old_rpcapi(self):
# With rpcapi < 5.11, accel_uuids must be dropped in the client call.
ctxt = context.RequestContext('fake_user', 'fake_project')
compute_api = compute_rpcapi.ComputeAPI()
compute_api.router.client = mock.Mock()
mock_client = mock.MagicMock()
compute_api.router.client.return_value = mock_client
# Force can_send_version to False, so that 5.0 version is used.
mock_client.can_send_version.return_value = False
mock_cctx = mock.MagicMock()
mock_client.prepare.return_value = mock_cctx
compute_api.build_and_run_instance(
ctxt, instance=self.fake_instance_obj,
host='host', image='image',
request_spec=self.fake_request_spec_obj,
filter_properties={},
accel_uuids=['938af7f9-f136-4e5a-bdbe-3b6feab54311'])
mock_client.can_send_version.assert_called_once_with('5.11')
mock_client.prepare.assert_called_with(
server='host', version='5.0')
mock_cctx.cast.assert_called_with( # No accel_uuids
ctxt, 'build_and_run_instance',
instance=self.fake_instance_obj,
image='image', request_spec=self.fake_request_spec_obj,
filter_properties={}, admin_password=None,
injected_files=None, requested_networks=None,
security_groups=None, block_device_mapping=None,
node=None, limits=None, host_list=None)
def test_quiesce_instance(self): def test_quiesce_instance(self):
self._test_compute_api('quiesce_instance', 'call', self._test_compute_api('quiesce_instance', 'call',

View File

@ -487,6 +487,7 @@ class _BaseTaskTestCase(object):
self.useFixture(cast_as_call.CastAsCall(self)) self.useFixture(cast_as_call.CastAsCall(self))
mock_getaz.return_value = 'myaz' mock_getaz.return_value = 'myaz'
mock_create_bind_arqs.return_value = mock.sentinel
self.conductor.build_instances(self.context, self.conductor.build_instances(self.context,
instances=instances, instances=instances,
@ -522,7 +523,8 @@ class _BaseTaskTestCase(object):
requested_networks=None, requested_networks=None,
security_groups='security_groups', security_groups='security_groups',
block_device_mapping=mock.ANY, block_device_mapping=mock.ANY,
node='node1', limits=None, host_list=sched_return[0]), node='node1', limits=None, host_list=sched_return[0],
accel_uuids=mock.sentinel),
mock.call(self.context, instance=mock.ANY, host='host2', mock.call(self.context, instance=mock.ANY, host='host2',
image={'fake_data': 'should_pass_silently'}, image={'fake_data': 'should_pass_silently'},
request_spec=fake_spec, request_spec=fake_spec,
@ -532,7 +534,8 @@ class _BaseTaskTestCase(object):
requested_networks=None, requested_networks=None,
security_groups='security_groups', security_groups='security_groups',
block_device_mapping=mock.ANY, block_device_mapping=mock.ANY,
node='node2', limits=None, host_list=sched_return[1])]) node='node2', limits=None, host_list=sched_return[1],
accel_uuids=mock.sentinel)])
mock_create_bind_arqs.assert_has_calls([ mock_create_bind_arqs.assert_has_calls([
mock.call(self.context, instances[0].uuid, mock.call(self.context, instances[0].uuid,
instances[0].flavor.extra_specs, 'node1', mock.ANY), instances[0].flavor.extra_specs, 'node1', mock.ANY),
@ -1055,7 +1058,8 @@ class _BaseTaskTestCase(object):
block_device_mapping=test.MatchType( block_device_mapping=test.MatchType(
objects.BlockDeviceMappingList), objects.BlockDeviceMappingList),
node='node1', limits=None, node='node1', limits=None,
host_list=expected_build_run_host_list) host_list=expected_build_run_host_list,
accel_uuids=[])
mock_pop_inst_map.assert_not_called() mock_pop_inst_map.assert_not_called()
mock_destroy_build_req.assert_not_called() mock_destroy_build_req.assert_not_called()
@ -1125,7 +1129,8 @@ class _BaseTaskTestCase(object):
objects.BlockDeviceMappingList), objects.BlockDeviceMappingList),
node='node1', node='node1',
limits=None, limits=None,
host_list=expected_build_run_host_list) host_list=expected_build_run_host_list,
accel_uuids=[])
mock_rp_mapping.assert_called_once_with( mock_rp_mapping.assert_called_once_with(
test.MatchType(objects.RequestSpec), test.MatchType(objects.RequestSpec),
@ -1207,7 +1212,8 @@ class _BaseTaskTestCase(object):
objects.BlockDeviceMappingList), objects.BlockDeviceMappingList),
node='node2', node='node2',
limits=None, limits=None,
host_list=expected_build_run_host_list) host_list=expected_build_run_host_list,
accel_uuids=[])
# called only once when the claim succeeded # called only once when the claim succeeded
mock_rp_mapping.assert_called_once_with( mock_rp_mapping.assert_called_once_with(
@ -3386,7 +3392,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase):
security_groups='security_groups', security_groups='security_groups',
block_device_mapping=test.MatchType( block_device_mapping=test.MatchType(
objects.BlockDeviceMappingList), objects.BlockDeviceMappingList),
node='node2', limits=None, host_list=[]) node='node2', limits=None, host_list=[], accel_uuids=[])
@mock.patch.object(scheduler_utils, 'setup_instance_group') @mock.patch.object(scheduler_utils, 'setup_instance_group')
@mock.patch.object(scheduler_utils, 'build_request_spec') @mock.patch.object(scheduler_utils, 'build_request_spec')
@ -3446,7 +3452,7 @@ class ConductorTaskTestCase(_BaseTaskTestCase, test_compute.BaseTestCase):
requested_networks=None, requested_networks=None,
security_groups='security_groups', security_groups='security_groups',
block_device_mapping=mock.ANY, block_device_mapping=mock.ANY,
node='node2', limits=None, host_list=[]) node='node2', limits=None, host_list=[], accel_uuids=[])
@mock.patch('nova.compute.utils.notify_about_compute_task_error') @mock.patch('nova.compute.utils.notify_about_compute_task_error')
@mock.patch('nova.objects.Instance.save') @mock.patch('nova.objects.Instance.save')