summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Washenberger <mark.washenberger@rackspace.com>2012-02-24 08:52:51 -0500
committerMark Washenberger <mark.washenberger@rackspace.com>2012-02-29 12:50:25 -0500
commit65a7a677c0b1956268939637e384f82ef16cd412 (patch)
treec7329a503d01449352c2093bd7d09efe2ed3c565
parent0ab9f2cbaee13207d41e1475bc19e70db7046113 (diff)
downloadnova-65a7a677c0b1956268939637e384f82ef16cd412.tar.gz
nova-65a7a677c0b1956268939637e384f82ef16cd412.tar.xz
nova-65a7a677c0b1956268939637e384f82ef16cd412.zip
Perform image show early in the resize process
This change addresses bug 943421 by performing glance interactions much earlier in the resize process. This prevents token expiration from breaking resizes. - added a comment to the compute api change to give some context and help prevent regression on this bug Change-Id: I21619f9f6189d5bdec64de47988985cbc3b8016d
-rw-r--r--nova/compute/api.py6
-rw-r--r--nova/compute/manager.py24
-rw-r--r--nova/tests/test_compute.py32
3 files changed, 34 insertions, 28 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index d900fb77f..75b8bcf91 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 2221946af..d06786ca0 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 09e3d8aca..a034e54d0 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'])