Merge "Rename ensure_network_metadata to amend requested_networks"

This commit is contained in:
Zuul 2021-02-12 16:02:27 +00:00 committed by Gerrit Code Review
commit 1650a0c2f8
10 changed files with 79 additions and 24 deletions

View File

@ -1546,6 +1546,10 @@ class API(base.Base):
build_requests.append(build_request)
instance = build_request.get_new_instance(context)
instances.append(instance)
# NOTE(sbauza): Add the requested networks so the related scheduler
# pre-filter can verify them
if requested_networks is not None:
rs.requested_networks = requested_networks
request_specs.append(rs)
self.compute_task_api.schedule_and_build_instances(

View File

@ -983,7 +983,7 @@ class ComputeTaskManager(base.Base):
context, instance, request_spec)
request_spec.ensure_project_and_user_id(instance)
request_spec.ensure_network_metadata(instance)
request_spec.ensure_network_information(instance)
compute_utils.heal_reqspec_is_bfv(
context, request_spec, instance)
host_lists = self._schedule_instances(context,
@ -1186,7 +1186,7 @@ class ComputeTaskManager(base.Base):
self._restrict_request_spec_to_cell(
context, instance, request_spec)
request_spec.ensure_project_and_user_id(instance)
request_spec.ensure_network_metadata(instance)
request_spec.ensure_network_information(instance)
compute_utils.heal_reqspec_is_bfv(
context, request_spec, instance)

View File

@ -502,7 +502,7 @@ class LiveMigrationTask(base.TaskBase):
cell=cell_mapping)
request_spec.ensure_project_and_user_id(self.instance)
request_spec.ensure_network_metadata(self.instance)
request_spec.ensure_network_information(self.instance)
compute_utils.heal_reqspec_is_bfv(
self.context, request_spec, self.instance)

View File

@ -270,7 +270,7 @@ class MigrationTask(base.TaskBase):
migration = self._preallocate_migration()
self.request_spec.ensure_project_and_user_id(self.instance)
self.request_spec.ensure_network_metadata(self.instance)
self.request_spec.ensure_network_information(self.instance)
compute_utils.heal_reqspec_is_bfv(
self.context, self.request_spec, self.instance)
# On an initial call to migrate, 'self.host_list' will be None, so we

View File

@ -110,7 +110,8 @@ class RequestSpec(base.NovaObject):
default=None),
# NOTE(efried): This field won't be persisted.
'request_level_params': fields.ObjectField('RequestLevelParams'),
# NOTE(sbauza); This field won't be persisted.
# NOTE(sbauza); This field won't be persisted. For move operations, we
# reevaluate it using the network-related instance info_cache.
'requested_networks': fields.ObjectField('NetworkRequestList')
}
@ -544,12 +545,16 @@ class RequestSpec(base.NovaObject):
if 'user_id' not in self or self.user_id is None:
self.user_id = instance.user_id
def ensure_network_metadata(self, instance):
def ensure_network_information(self, instance):
if not (instance.info_cache and instance.info_cache.network_info):
# NOTE(sbauza): On create, the network_info field is null but we
# directly set the RequestSpec nested network_requests field, so we
# are fine returning here.
return
physnets = set([])
tunneled = True
network_requests = []
# physical_network and tunneled might not be in the cache for old
# instances that haven't had their info_cache healed yet
@ -561,8 +566,21 @@ class RequestSpec(base.NovaObject):
tunneled |= vif.get('network', {}).get('meta', {}).get(
'tunneled', False)
# We also want to recreate the original NetworkRequests
# TODO(sbauza): We miss tag and pci_request_id information that is
# not stored in the VIF model to fully provide all fields
# FIXME(sbauza): We can't also guess whether the user provided us
# a specific IP address to use for create, and which one.
nr_args = {
'network_id': vif['network']['id'],
'port_id': vif['id'],
}
network_request = objects.NetworkRequest(**nr_args)
network_requests.append(network_request)
self.network_metadata = objects.NetworkMetadata(
physnets=physnets, tunneled=tunneled)
self.requested_networks = objects.NetworkRequestList(
objects=network_requests)
@staticmethod
def _from_db_object(context, spec, db_spec):

View File

@ -8668,6 +8668,32 @@ class ComputeAPITestCase(BaseTestCase):
len(db.instance_get_all(self.context)))
mock_secgroups.assert_called_once_with(mock.ANY, 'invalid_sec_group')
def test_create_instance_associates_requested_networks(self):
# Make sure create adds the requested networks to the RequestSpec
requested_networks = objects.NetworkRequestList(
objects=[objects.NetworkRequest(port_id=uuids.port_instance)])
with test.nested(
mock.patch.object(self.compute_api.compute_task_api,
'schedule_and_build_instances'),
mock.patch.object(self.compute_api.network_api,
'create_resource_requests',
return_value=(None, [])),
) as (mock_sbi, _mock_create_resreqs):
self.compute_api.create(
self.context,
instance_type=self.default_flavor,
image_href=uuids.image_href_id,
requested_networks=requested_networks)
build_call = mock_sbi.call_args_list[0]
reqspec = build_call[1]['request_spec'][0]
self.assertEqual(1, len(reqspec.requested_networks))
self.assertEqual(uuids.port_instance,
reqspec.requested_networks[0].port_id)
def test_create_with_malformed_user_data(self):
# Test an instance type with malformed user data.

View File

@ -71,8 +71,8 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
self.heal_reqspec_is_bfv_mock = _p.start()
self.addCleanup(_p.stop)
_p = mock.patch('nova.objects.RequestSpec.ensure_network_metadata')
self.ensure_network_metadata_mock = _p.start()
_p = mock.patch('nova.objects.RequestSpec.ensure_network_information')
self.ensure_network_information_mock = _p.start()
self.addCleanup(_p.stop)
_p = mock.patch(
@ -154,7 +154,7 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
# When the task is executed with a destination it means the host is
# being forced and we don't call the scheduler, so we don't need to
# modify the request spec
self.ensure_network_metadata_mock.assert_not_called()
self.ensure_network_information_mock.assert_not_called()
@mock.patch('nova.availability_zones.get_host_availability_zone',
return_value='nova')
@ -415,7 +415,7 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
mock_setup.assert_called_once_with(self.context, self.fake_spec)
mock_reset.assert_called_once_with()
self.ensure_network_metadata_mock.assert_called_once_with(
self.ensure_network_information_mock.assert_called_once_with(
self.instance)
self.heal_reqspec_is_bfv_mock.assert_called_once_with(
self.context, self.fake_spec, self.instance)
@ -699,7 +699,7 @@ class LiveMigrationTaskTestCase(test.NoDBTestCase):
mock_setup.assert_called_once_with(self.context, self.fake_spec)
mock_reset.assert_called_once_with()
self.ensure_network_metadata_mock.assert_called_once_with(
self.ensure_network_information_mock.assert_called_once_with(
self.instance)
self.heal_reqspec_is_bfv_mock.assert_called_once_with(
self.context, self.fake_spec, self.instance)

View File

@ -61,8 +61,8 @@ class MigrationTaskTestCase(test.NoDBTestCase):
self.heal_reqspec_is_bfv_mock = _p.start()
self.addCleanup(_p.stop)
_p = mock.patch('nova.objects.RequestSpec.ensure_network_metadata')
self.ensure_network_metadata_mock = _p.start()
_p = mock.patch('nova.objects.RequestSpec.ensure_network_information')
self.ensure_network_information_mock = _p.start()
self.addCleanup(_p.stop)
self.mock_network_api = mock.Mock()
@ -130,7 +130,7 @@ class MigrationTaskTestCase(test.NoDBTestCase):
task.execute()
_is_source_cell_mock.assert_called_once_with(selection)
self.ensure_network_metadata_mock.assert_called_once_with(
self.ensure_network_information_mock.assert_called_once_with(
self.instance)
self.heal_reqspec_is_bfv_mock.assert_called_once_with(
self.context, self.request_spec, self.instance)

View File

@ -362,8 +362,8 @@ class _BaseTaskTestCase(object):
self.heal_reqspec_is_bfv_mock = _p.start()
self.addCleanup(_p.stop)
_p = mock.patch('nova.objects.RequestSpec.ensure_network_metadata')
self.ensure_network_metadata_mock = _p.start()
_p = mock.patch('nova.objects.RequestSpec.ensure_network_information')
self.ensure_network_information_mock = _p.start()
self.addCleanup(_p.stop)
def _prepare_rebuild_args(self, update_args=None):
@ -1385,7 +1385,7 @@ class _BaseTaskTestCase(object):
# ComputeTaskManager.
if isinstance(self.conductor,
conductor_manager.ComputeTaskManager):
self.ensure_network_metadata_mock.assert_called_once_with(
self.ensure_network_information_mock.assert_called_once_with(
test.MatchType(objects.Instance))
self.heal_reqspec_is_bfv_mock.assert_called_once_with(
self.context, fake_spec, instance)
@ -1397,7 +1397,7 @@ class _BaseTaskTestCase(object):
else:
# RPC API tests won't have the same request spec or instance
# since they go over the wire.
self.ensure_network_metadata_mock.assert_called_once_with(
self.ensure_network_information_mock.assert_called_once_with(
test.MatchType(objects.Instance))
self.heal_reqspec_is_bfv_mock.assert_called_once_with(
self.context, test.MatchType(objects.RequestSpec),
@ -1770,7 +1770,7 @@ class _BaseTaskTestCase(object):
self.conductor_manager.rebuild_instance(context=self.context,
instance=inst_obj,
**rebuild_args)
self.ensure_network_metadata_mock.assert_called_once_with(
self.ensure_network_information_mock.assert_called_once_with(
inst_obj)
self.heal_reqspec_is_bfv_mock.assert_called_once_with(
self.context, fake_spec, inst_obj)
@ -1820,7 +1820,7 @@ class _BaseTaskTestCase(object):
self.conductor_manager.rebuild_instance(context=self.context,
instance=inst_obj,
**rebuild_args)
self.ensure_network_metadata_mock.assert_called_once_with(
self.ensure_network_information_mock.assert_called_once_with(
inst_obj)
self.heal_reqspec_is_bfv_mock.assert_called_once_with(
self.context, fake_spec, inst_obj)

View File

@ -532,7 +532,7 @@ class _TestRequestSpecObject(object):
spec = objects.RequestSpec()
self.assertEqual({}, spec.to_legacy_filter_properties_dict())
def test_ensure_network_metadata(self):
def test_ensure_network_information(self):
network_a = fake_network_cache_model.new_network({
'physical_network': 'foo', 'tunneled': False})
vif_a = fake_network_cache_model.new_vif({'network': network_a})
@ -553,14 +553,19 @@ class _TestRequestSpecObject(object):
spec = objects.RequestSpec()
self.assertNotIn('network_metadata', spec)
self.assertNotIn('requested_networks', spec)
spec.ensure_network_metadata(instance)
spec.ensure_network_information(instance)
self.assertIn('network_metadata', spec)
self.assertIsInstance(spec.network_metadata, objects.NetworkMetadata)
self.assertEqual(spec.network_metadata.physnets, set(['foo', 'bar']))
self.assertTrue(spec.network_metadata.tunneled)
self.assertEqual(4, len(spec.requested_networks))
for idx, reqnet in enumerate(spec.requested_networks):
self.assertEqual(nw_info[idx]['network']['id'], reqnet.network_id)
self.assertEqual(nw_info[idx]['id'], reqnet.port_id)
def test_ensure_network_metadata_missing(self):
def test_ensure_network_information_missing(self):
nw_info = network_model.NetworkInfo([])
info_cache = objects.InstanceInfoCache(network_info=nw_info,
instance_uuid=uuids.instance)
@ -569,9 +574,11 @@ class _TestRequestSpecObject(object):
spec = objects.RequestSpec()
self.assertNotIn('network_metadata', spec)
self.assertNotIn('requested_networks', spec)
spec.ensure_network_metadata(instance)
spec.ensure_network_information(instance)
self.assertNotIn('network_metadata', spec)
self.assertNotIn('requested_networks', spec)
@mock.patch.object(request_spec.RequestSpec,
'_get_by_instance_uuid_from_db')