summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Waldon <brian.waldon@rackspace.com>2011-11-09 12:24:00 -0500
committerBrian Waldon <brian.waldon@rackspace.com>2011-11-09 12:25:10 -0500
commit29398355ede0d8fb08c58bbf2adf0441b48c6855 (patch)
treedbc7543ec1d98093755e562d4120001f0d0f9ad2
parent00861098508fc675ba2d90a5c34fec152ddf5c3d (diff)
downloadnova-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.py11
-rw-r--r--nova/compute/api.py38
-rw-r--r--nova/tests/test_compute.py45
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):