Merge "Perform image show early in the resize process"
This commit is contained in:
commit
f38281d60c
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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'])
|
||||
|
|
Loading…
Reference in New Issue