Merge "Perform image show early in the resize process"

This commit is contained in:
Jenkins 2012-02-29 19:31:43 +00:00 committed by Gerrit Code Review
commit f38281d60c
3 changed files with 34 additions and 28 deletions

View File

@ -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,
}

View File

@ -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')

View File

@ -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'])