diff options
| author | Brian Waldon <brian.waldon@rackspace.com> | 2011-11-09 12:24:00 -0500 |
|---|---|---|
| committer | Brian Waldon <brian.waldon@rackspace.com> | 2011-11-09 12:25:10 -0500 |
| commit | 29398355ede0d8fb08c58bbf2adf0441b48c6855 (patch) | |
| tree | dbc7543ec1d98093755e562d4120001f0d0f9ad2 | |
| parent | 00861098508fc675ba2d90a5c34fec152ddf5c3d (diff) | |
| download | nova-29398355ede0d8fb08c58bbf2adf0441b48c6855.tar.gz nova-29398355ede0d8fb08c58bbf2adf0441b48c6855.tar.xz nova-29398355ede0d8fb08c58bbf2adf0441b48c6855.zip | |
Converting resize to use instance objects
Related to blueprint internal-uuids
Change-Id: I94b4383b55ac72bccae1dd375d82f5e7c3f8cebf
| -rw-r--r-- | nova/api/openstack/servers.py | 11 | ||||
| -rw-r--r-- | nova/compute/api.py | 38 | ||||
| -rw-r--r-- | nova/tests/test_compute.py | 45 |
3 files changed, 65 insertions, 29 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 2a1424e46..44f943711 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -583,8 +583,10 @@ class Controller(object): return resp def _action_confirm_resize(self, input_dict, req, id): + context = req.environ['nova.context'] + instance = self._get_server(context, id) try: - self.compute_api.confirm_resize(req.environ['nova.context'], id) + self.compute_api.confirm_resize(context, instance) except exception.MigrationNotFound: msg = _("Instance has not been resized.") raise exc.HTTPBadRequest(explanation=msg) @@ -594,8 +596,10 @@ class Controller(object): return exc.HTTPNoContent() def _action_revert_resize(self, input_dict, req, id): + context = req.environ['nova.context'] + instance = self._get_server(context, id) try: - self.compute_api.revert_resize(req.environ['nova.context'], id) + self.compute_api.revert_resize(context, instance) except exception.MigrationNotFound: msg = _("Instance has not been resized.") raise exc.HTTPBadRequest(explanation=msg) @@ -651,9 +655,10 @@ class Controller(object): def _resize(self, req, instance_id, flavor_id): """Begin the resize process with given instance/flavor.""" context = req.environ["nova.context"] + instance = self._get_server(context, instance_id) try: - self.compute_api.resize(context, instance_id, flavor_id) + self.compute_api.resize(context, instance, flavor_id) except exception.FlavorNotFound: msg = _("Unable to locate requested flavor.") raise exc.HTTPBadRequest(explanation=msg) diff --git a/nova/compute/api.py b/nova/compute/api.py index 92e492390..2c10f77eb 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -1226,69 +1226,64 @@ class API(base.Base): params=rebuild_params) @scheduler_api.reroute_compute("revert_resize") - def revert_resize(self, context, instance_id): + def revert_resize(self, context, instance): """Reverts a resize, deleting the 'new' instance in the process.""" context = context.elevated() - instance_ref = self._get_instance(context, instance_id, - 'revert_resize') migration_ref = self.db.migration_get_by_instance_and_status(context, - instance_ref['uuid'], 'finished') + instance['uuid'], 'finished') if not migration_ref: raise exception.MigrationNotFoundByStatus(instance_id=instance_id, status='finished') self.update(context, - instance_id, + instance['id'], vm_state=vm_states.ACTIVE, task_state=None) params = {'migration_id': migration_ref['id']} self._cast_compute_message('revert_resize', context, - instance_ref['uuid'], + instance['uuid'], migration_ref['dest_compute'], params=params) self.db.migration_update(context, migration_ref['id'], - {'status': 'reverted'}) + {'status': 'reverted'}) @scheduler_api.reroute_compute("confirm_resize") - def confirm_resize(self, context, instance_id): + def confirm_resize(self, context, instance): """Confirms a migration/resize and deletes the 'old' instance.""" context = context.elevated() - instance_ref = self._get_instance(context, instance_id, - 'confirm_resize') migration_ref = self.db.migration_get_by_instance_and_status(context, - instance_ref['uuid'], 'finished') + instance['uuid'], 'finished') if not migration_ref: - raise exception.MigrationNotFoundByStatus(instance_id=instance_id, - status='finished') + raise exception.MigrationNotFoundByStatus( + instance_id=instance['id'], status='finished') self.update(context, - instance_id, + instance['id'], vm_state=vm_states.ACTIVE, task_state=None) params = {'migration_id': migration_ref['id']} self._cast_compute_message('confirm_resize', context, - instance_ref['uuid'], + instance['uuid'], migration_ref['source_compute'], params=params) self.db.migration_update(context, migration_ref['id'], {'status': 'confirmed'}) - self.db.instance_update(context, instance_id, + self.db.instance_update(context, instance['id'], {'host': migration_ref['dest_compute'], }) @scheduler_api.reroute_compute("resize") - def resize(self, context, instance_id, flavor_id=None): + def resize(self, context, instance, flavor_id=None): """Resize (ie, migrate) a running instance. If flavor_id is None, the process is considered a migration, keeping the original flavor_id. If flavor_id is not None, the instance should be migrated to a new host and resized to the new flavor_id. """ - instance_ref = self._get_instance(context, instance_id, 'resize') - current_instance_type = instance_ref['instance_type'] + current_instance_type = instance['instance_type'] # If flavor_id is not provided, only migrate the instance. if not flavor_id: @@ -1314,15 +1309,14 @@ class API(base.Base): raise exception.CannotResizeToSameSize() self.update(context, - instance_id, + instance['id'], vm_state=vm_states.RESIZING, task_state=task_states.RESIZE_PREP) - instance_ref = self._get_instance(context, instance_id, 'resize') self._cast_scheduler_message(context, {"method": "prep_resize", "args": {"topic": FLAGS.compute_topic, - "instance_id": instance_ref['uuid'], + "instance_id": instance['uuid'], "update_db": False, "instance_type_id": new_instance_type['id']}}) diff --git a/nova/tests/test_compute.py b/nova/tests/test_compute.py index 29269620c..29dc99dd7 100644 --- a/nova/tests/test_compute.py +++ b/nova/tests/test_compute.py @@ -763,14 +763,48 @@ class ComputeTestCase(test.TestCase): migration_ref['id']) self.compute.terminate_instance(context, instance_id) + def test_resize_confirm_through_api(self): + """Ensure invalid flavors raise""" + instance_id = self._create_instance() + context = self.context.elevated() + instance = db.instance_get(context, instance_id) + self.compute.run_instance(self.context, instance_id) + self.compute_api.resize(context, instance, '4') + + # create a fake migration record (manager does this) + migration_ref = db.migration_create(context, + {'instance_uuid': instance['uuid'], + 'status': 'finished'}) + + self.compute_api.confirm_resize(context, instance) + self.compute.terminate_instance(context, instance_id) + + def test_resize_revert_through_api(self): + """Ensure invalid flavors raise""" + instance_id = self._create_instance() + context = self.context.elevated() + instance = db.instance_get(context, instance_id) + self.compute.run_instance(self.context, instance_id) + + self.compute_api.resize(context, instance, '4') + + # create a fake migration record (manager does this) + migration_ref = db.migration_create(context, + {'instance_uuid': instance['uuid'], + 'status': 'finished'}) + + self.compute_api.revert_resize(context, instance) + self.compute.terminate_instance(context, instance_id) + def test_resize_invalid_flavor_fails(self): """Ensure invalid flavors raise""" instance_id = self._create_instance() context = self.context.elevated() + instance = db.instance_get(context, instance_id) self.compute.run_instance(self.context, instance_id) self.assertRaises(exception.NotFound, self.compute_api.resize, - context, instance_id, 200) + context, instance, 200) self.compute.terminate_instance(context, instance_id) @@ -784,8 +818,9 @@ class ComputeTestCase(test.TestCase): db.instance_update(self.context, instance_id, {'instance_type_id': inst_type['id']}) + instance = db.instance_get(context, instance_id) self.assertRaises(exception.CannotResizeToSmallerSize, - self.compute_api.resize, context, instance_id, 1) + self.compute_api.resize, context, instance, 1) self.compute.terminate_instance(context, instance_id) @@ -793,11 +828,12 @@ class ComputeTestCase(test.TestCase): """Ensure invalid flavors raise""" context = self.context.elevated() instance_id = self._create_instance() + instance = db.instance_get(context, instance_id) self.compute.run_instance(self.context, instance_id) self.assertRaises(exception.CannotResizeToSameSize, - self.compute_api.resize, context, instance_id, 1) + self.compute_api.resize, context, instance, 1) self.compute.terminate_instance(context, instance_id) @@ -895,9 +931,10 @@ class ComputeTestCase(test.TestCase): def test_migrate(self): context = self.context.elevated() instance_id = self._create_instance() + instance = db.instance_get(context, instance_id) self.compute.run_instance(self.context, instance_id) # Migrate simply calls resize() without a flavor_id. - self.compute_api.resize(context, instance_id, None) + self.compute_api.resize(context, instance, None) self.compute.terminate_instance(context, instance_id) def _setup_other_managers(self): |
