summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-02-29 19:31:43 +0000
committerGerrit Code Review <review@openstack.org>2012-02-29 19:31:43 +0000
commitf38281d60c033b61f30aff2ad05ed4b87d1f6ade (patch)
tree521c5567d7db87462cb8baf5cf3cb427852a125a
parent5f44c8f86691649fb4e0f1e21e71544234d674a8 (diff)
parent65a7a677c0b1956268939637e384f82ef16cd412 (diff)
Merge "Perform image show early in the resize process"
-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'])