diff --git a/nova/compute/api.py b/nova/compute/api.py index d900fb77f5cf..75b8bcf9179c 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -1310,6 +1310,9 @@ class API(base.Base): if not new_instance_type: raise exception.FlavorNotFound(flavor_id=flavor_id) + # NOTE(markwash): look up the image early to avoid auth problems later + image = self.image_service.show(context, instance['image_ref']) + current_memory_mb = current_instance_type['memory_mb'] new_memory_mb = new_instance_type['memory_mb'] @@ -1335,8 +1338,9 @@ class API(base.Base): args = { "topic": FLAGS.compute_topic, "instance_uuid": instance['uuid'], - "update_db": False, "instance_type_id": new_instance_type['id'], + "image": image, + "update_db": False, "request_spec": utils.to_primitive(request_spec), "filter_properties": filter_properties, } diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 2221946afb0d..d06786ca0a41 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -1229,7 +1229,8 @@ class ComputeManager(manager.SchedulerDependentManager): @exception.wrap_exception(notifier=notifier, publisher_id=publisher_id()) @checks_instance_lock @wrap_instance_fault - def prep_resize(self, context, instance_uuid, instance_type_id, **kwargs): + def prep_resize(self, context, instance_uuid, instance_type_id, image, + **kwargs): """Initiates the process of moving a running instance to another host. Possibly changes the RAM and disk size in the process. @@ -1269,7 +1270,8 @@ class ComputeManager(manager.SchedulerDependentManager): rpc.cast(context, topic, {'method': 'resize_instance', 'args': {'instance_uuid': instance_ref['uuid'], - 'migration_id': migration_ref['id']}}) + 'migration_id': migration_ref['id'], + 'image': image}}) usage_info = utils.usage_from_instance(instance_ref, new_instance_type=new_instance_type['name'], @@ -1280,7 +1282,7 @@ class ComputeManager(manager.SchedulerDependentManager): @exception.wrap_exception(notifier=notifier, publisher_id=publisher_id()) @checks_instance_lock @wrap_instance_fault - def resize_instance(self, context, instance_uuid, migration_id): + def resize_instance(self, context, instance_uuid, migration_id, image): """Starts the migration of a running instance to another host.""" migration_ref = self.db.migration_get(context, migration_id) instance_ref = self.db.instance_get_by_uuid(context, @@ -1314,11 +1316,13 @@ class ComputeManager(manager.SchedulerDependentManager): migration_ref['dest_compute']) params = {'migration_id': migration_id, 'disk_info': disk_info, - 'instance_uuid': instance_ref['uuid']} + 'instance_uuid': instance_ref['uuid'], + 'image': image} rpc.cast(context, topic, {'method': 'finish_resize', 'args': params}) - def _finish_resize(self, context, instance_ref, migration_ref, disk_info): + def _finish_resize(self, context, instance_ref, migration_ref, disk_info, + image): resize_instance = False old_instance_type_id = migration_ref['old_instance_type_id'] new_instance_type_id = migration_ref['new_instance_type_id'] @@ -1337,13 +1341,10 @@ class ComputeManager(manager.SchedulerDependentManager): network_info = self._get_instance_nw_info(context, instance_ref) - # Have to look up image here since we depend on disk_format later - image_meta = _get_image_meta(context, instance_ref['image_ref']) - self.driver.finish_migration(context, migration_ref, instance_ref, disk_info, self._legacy_nw_info(network_info), - image_meta, resize_instance) + image, resize_instance) self._instance_update(context, instance_ref.uuid, @@ -1357,7 +1358,8 @@ class ComputeManager(manager.SchedulerDependentManager): @exception.wrap_exception(notifier=notifier, publisher_id=publisher_id()) @checks_instance_lock @wrap_instance_fault - def finish_resize(self, context, instance_uuid, migration_id, disk_info): + def finish_resize(self, context, instance_uuid, migration_id, disk_info, + image): """Completes the migration process. Sets up the newly transferred disk and turns on the instance at its @@ -1371,7 +1373,7 @@ class ComputeManager(manager.SchedulerDependentManager): try: self._finish_resize(context, instance_ref, migration_ref, - disk_info) + disk_info, image) except Exception, error: with utils.save_and_reraise_exception(): msg = _('%s. Setting instance vm_state to ERROR') diff --git a/nova/tests/test_compute.py b/nova/tests/test_compute.py index 09e3d8aca262..a034e54d0247 100644 --- a/nova/tests/test_compute.py +++ b/nova/tests/test_compute.py @@ -1033,12 +1033,12 @@ class ComputeTestCase(BaseTestCase): context = self.context.elevated() instance = self._create_fake_instance() - self.compute.prep_resize(context, instance['uuid'], 1, + self.compute.prep_resize(context, instance['uuid'], 1, {}, filter_properties={}) migration_ref = db.migration_get_by_instance_and_status(context, instance['uuid'], 'pre-migrating') self.compute.finish_resize(context, instance['uuid'], - int(migration_ref['id']), {}) + int(migration_ref['id']), {}, {}) self.compute.terminate_instance(self.context, instance['uuid']) def test_finish_resize_handles_error(self): @@ -1070,14 +1070,14 @@ class ComputeTestCase(BaseTestCase): func=fake_nw_info) context = self.context.elevated() instance = self._create_fake_instance() - self.compute.prep_resize(context, instance['uuid'], 1, + self.compute.prep_resize(context, instance['uuid'], 1, {}, filter_properties={}) migration_ref = db.migration_get_by_instance_and_status(context, instance['uuid'], 'pre-migrating') self.assertRaises(Exception, self.compute.finish_resize, context, instance['uuid'], - int(migration_ref['id']), {}) + int(migration_ref['id']), {}, {}) instance = db.instance_get_by_uuid(context, instance['uuid']) self.assertEqual(instance['vm_state'], vm_states.ERROR) @@ -1100,7 +1100,7 @@ class ComputeTestCase(BaseTestCase): test_notifier.NOTIFICATIONS = [] db.instance_update(self.context, instance_uuid, {'host': 'foo'}) - self.compute.prep_resize(context, instance_uuid, 1, + self.compute.prep_resize(context, instance_uuid, 1, {}, filter_properties={}) db.migration_get_by_instance_and_status(context, instance_uuid, @@ -1143,7 +1143,7 @@ class ComputeTestCase(BaseTestCase): db.instance_update(self.context, instance_uuid, {'host': 'foo'}) self.assertRaises(exception.MigrationError, self.compute.prep_resize, - context, instance_uuid, 1) + context, instance_uuid, 1, {}) self.compute.terminate_instance(context, instance_uuid) def test_resize_instance_driver_error(self): @@ -1161,14 +1161,14 @@ class ComputeTestCase(BaseTestCase): self.compute.run_instance(self.context, instance_uuid) db.instance_update(self.context, instance_uuid, {'host': 'foo'}) - self.compute.prep_resize(context, instance_uuid, 1, + self.compute.prep_resize(context, instance_uuid, 1, {}, filter_properties={}) migration_ref = db.migration_get_by_instance_and_status(context, instance_uuid, 'pre-migrating') #verify self.assertRaises(Exception, self.compute.resize_instance, context, - instance_uuid, migration_ref['id']) + instance_uuid, migration_ref['id'], {}) instance = db.instance_get_by_uuid(context, instance_uuid) self.assertEqual(instance['vm_state'], vm_states.ERROR) @@ -1183,12 +1183,12 @@ class ComputeTestCase(BaseTestCase): self.compute.run_instance(self.context, instance_uuid) db.instance_update(self.context, instance_uuid, {'host': 'foo'}) - self.compute.prep_resize(context, instance_uuid, 1, + self.compute.prep_resize(context, instance_uuid, 1, {}, filter_properties={}) migration_ref = db.migration_get_by_instance_and_status(context, instance_uuid, 'pre-migrating') self.compute.resize_instance(context, instance_uuid, - migration_ref['id']) + migration_ref['id'], {}) self.compute.terminate_instance(context, instance_uuid) def test_finish_revert_resize(self): @@ -1235,16 +1235,16 @@ class ComputeTestCase(BaseTestCase): new_instance_type_ref = db.instance_type_get_by_flavor_id(context, 3) self.compute.prep_resize(context, inst_ref['uuid'], - new_instance_type_ref['id'], + new_instance_type_ref['id'], {}, filter_properties={}) migration_ref = db.migration_get_by_instance_and_status(context, inst_ref['uuid'], 'pre-migrating') self.compute.resize_instance(context, inst_ref['uuid'], - migration_ref['id']) + migration_ref['id'], {}) self.compute.finish_resize(context, inst_ref['uuid'], - int(migration_ref['id']), {}) + int(migration_ref['id']), {}, {}) # Prove that the instance size is now the new size inst_ref = db.instance_get_by_uuid(context, instance_uuid) @@ -1281,7 +1281,7 @@ class ComputeTestCase(BaseTestCase): self.compute.run_instance(self.context, instance['uuid']) instance = db.instance_get_by_uuid(self.context, instance['uuid']) self.assertRaises(exception.MigrationError, self.compute.prep_resize, - self.context, instance['uuid'], 1) + self.context, instance['uuid'], 1, {}) self.compute.terminate_instance(self.context, instance['uuid']) def test_resize_instance_handles_migration_error(self): @@ -1297,12 +1297,12 @@ class ComputeTestCase(BaseTestCase): self.compute.run_instance(self.context, inst_ref['uuid']) db.instance_update(self.context, inst_ref['uuid'], {'host': 'foo'}) - self.compute.prep_resize(context, inst_ref['uuid'], 1, + self.compute.prep_resize(context, inst_ref['uuid'], 1, {}, filter_properties={}) migration_ref = db.migration_get_by_instance_and_status(context, inst_ref['uuid'], 'pre-migrating') self.assertRaises(Exception, self.compute.resize_instance, - context, inst_ref['uuid'], migration_ref['id']) + context, inst_ref['uuid'], migration_ref['id'], {}) inst_ref = db.instance_get_by_uuid(context, inst_ref['uuid']) self.assertEqual(inst_ref['vm_state'], vm_states.ERROR) self.compute.terminate_instance(context, inst_ref['uuid'])