summaryrefslogtreecommitdiffstats
path: root/nova/compute
diff options
context:
space:
mode:
authorCerberus <matt.dietz@rackspace.com>2011-02-16 13:47:14 -0600
committerCerberus <matt.dietz@rackspace.com>2011-02-16 13:47:14 -0600
commit879845496a50477ebc2709291c159ae1e8d5aa2a (patch)
tree401691a7311b9397eaeec97bdc15ef6a2a0ee900 /nova/compute
parentc735796e0668b2bf7c45eeef6396a3fb33d22d6e (diff)
downloadnova-879845496a50477ebc2709291c159ae1e8d5aa2a.tar.gz
nova-879845496a50477ebc2709291c159ae1e8d5aa2a.tar.xz
nova-879845496a50477ebc2709291c159ae1e8d5aa2a.zip
Derp
Diffstat (limited to 'nova/compute')
-rw-r--r--nova/compute/api.py26
-rw-r--r--nova/compute/manager.py32
2 files changed, 46 insertions, 12 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 3fb852ab0..58dea5db6 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -402,22 +402,30 @@ class API(base.Base):
def revert_resize(self, context, instance_id):
"""Reverts a resize, deleting the 'new' instance in the process"""
context = context.elevated()
- instance_ref = self.db.instance_get(instance_id)
- self._cast_compute_message('revert_resize', context, instance_id)
+ migration_ref = self.db.migration_get_by_instance_and_status(context,
+ instance_id, 'finished')
+ if not migration_ref:
+ raise exception.Error(_("No finished migrations found for
+ instance"))
+
+ params = { 'migration_id': migration_ref['id'])
+ self._cast_compute_message('revert_resize', context, instance_id,
+ migration_ref['dest_compute'], params=params)
def confirm_resize(self, context, instance_id):
"""Confirms a migration/resize, deleting the 'old' instance in the
process."""
context = context.elevated()
- migration_ref = self.db.migration_get_by_instance(context,
- instance_id)
- if migration_ref['status'] != 'finished':
- raise exception.Error(_("Migration has incorrect status %s" %
- migration_ref['status']))
+ migration_ref = self.db.migration_get_by_instance_and_status(context,
+ instance_id, 'finished')
+ if not migration_ref:
+ raise exception.Error(_("No finished migrations found for
+ instance"))
instance_ref = self.db.instance_get(context, instance_id)
- self._cast_compute_message('terminate_instance', context, instance_id,
- migration_ref['source_compute'])
+ params = { 'migration_id': migration_ref['id'])
+ self._cast_compute_message('confirm_resize', context, instance_id,
+ migration_ref['source_compute'], params=param)
self.db.instance_update(context, instance_id,
{'host': migration_ref['dest_compute'], })
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index b405e3763..c05edd140 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -380,15 +380,41 @@ class ComputeManager(manager.Manager):
"""Update instance state when async task completes."""
self._update_state(context, instance_id)
+ @exception.wrap_exception
+ @echecks_instance_lock
+ def confirm_resize(self, context, instance_id, migration_id):
+ """ Destroys the source instance """
+ context = context.elevated()
+ instance_ref = self.db.instance_get(context, instance_id)
+ migration_ref = self.db.migration_get(context, migration_id)
+ self.driver.destroy(instance_ref)
+ self.db.migration_update(context, migration_id,
+ { 'status': 'confirmed' })
@exception.wrap_exception
@checks_instance_lock
- def revert_resize(self, context, instance_id):
+ def revert_resize(self, context, instance_id, migration_id):
"""Destroys the new instance on the destination machine,
reverts the model changes, and powers on the old
instance on the source machine"""
- pass
-
+ instance_ref = self.db.instance_get(context, instance_id)
+ migration_ref = self.db.migration_get(context, migration_id)
+
+ if migration_ref['source_compute'] == instance_ref['host']:
+ self.driver.power_on(instance_ref)
+ self.db.migration_update(context, migration_id,
+ { 'status': 'reverted' })
+ else:
+ self.driver.destroy(instance_ref)
+ topic = self.db.queue_get_for(context, FLAGS.compute_topic,
+ instance_ref['host'])
+ rpc.cast(context, topic,
+ { 'method': 'resize_instance',
+ 'args': {
+ 'migration_id': migration_ref['id'],
+ 'instance_id': instance_id,
+ },
+ })
@exception.wrap_exception
@checks_instance_lock