diff --git a/nova/cells/scheduler.py b/nova/cells/scheduler.py index 54c978e60fbd..a3201cb57e55 100644 --- a/nova/cells/scheduler.py +++ b/nova/cells/scheduler.py @@ -31,8 +31,8 @@ from nova.compute import vm_states from nova import conductor from nova.db import base from nova import exception +from nova.objects import base as obj_base from nova.objects import instance as instance_obj -from nova.objects import security_group from nova.openstack.common.gettextutils import _ from nova.openstack.common import log as logging from nova.scheduler import rpcapi as scheduler_rpcapi @@ -93,10 +93,12 @@ class CellsScheduler(base.Base): # down. sys_metadata = flavors.save_flavor_info(sys_metadata, instance_type) instance_values['system_metadata'] = sys_metadata + # Pop out things that will get set properly when re-creating the + # instance record. + instance_values.pop('id') instance_values.pop('name') - if 'security_groups' in instance_values: - instance_values = security_group.make_secgroup_list( - instance_values['security_groups']) + instance_values.pop('info_cache') + instance_values.pop('security_groups') num_instances = len(instance_uuids) for i, instance_uuid in enumerate(instance_uuids): @@ -112,6 +114,7 @@ class CellsScheduler(base.Base): block_device_mapping, num_instances, i) + instance = obj_base.obj_to_primitive(instance) self.msg_runner.instance_update_at_top(ctxt, instance) def _create_action_here(self, ctxt, instance_uuids): diff --git a/nova/compute/api.py b/nova/compute/api.py index 7656847361ef..3ee9760e5030 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -1386,8 +1386,9 @@ class API(base.Base): context, instance, "%s.start" % delete_type) elevated = context.elevated() - self.network_api.deallocate_for_instance(elevated, - instance) + if self.cell_type != 'api': + self.network_api.deallocate_for_instance(elevated, + instance) system_meta = self.db.instance_system_metadata_get(context, instance_uuid) diff --git a/nova/tests/cells/test_cells_scheduler.py b/nova/tests/cells/test_cells_scheduler.py index 63528c8ef2a6..32378afe3a3d 100644 --- a/nova/tests/cells/test_cells_scheduler.py +++ b/nova/tests/cells/test_cells_scheduler.py @@ -96,7 +96,10 @@ class CellsSchedulerTestCase(test.TestCase): inst_type = db.flavor_get(self.ctxt, 1) image = {'properties': {}} instance_uuids = self.instance_uuids - instance_props = {'name': 'instance-00000001', + instance_props = {'id': 'removed', + 'security_groups': 'removed', + 'info_cache': 'removed', + 'name': 'instance-00000001', 'hostname': 'meow', 'display_name': 'moo', 'image_ref': 'fake_image_ref', diff --git a/nova/tests/compute/test_compute_api.py b/nova/tests/compute/test_compute_api.py index 96837d043415..9231e134d638 100644 --- a/nova/tests/compute/test_compute_api.py +++ b/nova/tests/compute/test_compute_api.py @@ -413,8 +413,9 @@ class _ComputeAPIUnitTestMixIn(object): compute_utils.notify_about_instance_usage(self.context, inst, '%s.start' % delete_type) - self.compute_api.network_api.deallocate_for_instance( - self.context, inst) + if not self.is_cells: + self.compute_api.network_api.deallocate_for_instance( + self.context, inst) db.instance_system_metadata_get(self.context, inst.uuid ).AndReturn('sys-meta') state = ('soft' in delete_type and vm_states.SOFT_DELETED or