This commit is contained in:
Cerberus
2011-02-16 13:47:14 -06:00
parent c735796e06
commit 879845496a
3 changed files with 49 additions and 14 deletions

View File

@@ -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'], })

View File

@@ -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

View File

@@ -1952,10 +1952,11 @@ def migration_get(context, id, session=None):
@require_admin_context
def migration_get_by_instance(context, instance_id):
def migration_get_by_instance_and_status(context, instance_id, status):
session = get_session()
result = session.query(models.Migration).\
filter_by(instance_id=instance_id).first()
filter_by(instance_id=instance_id).
filter_by(status=status).first()
if not result:
raise exception.NotFound(_("No migration found with instance id %s")
% migration_id)