summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSandy Walsh <sandy.walsh@rackspace.com>2010-12-13 18:25:17 -0800
committerSandy Walsh <sandy.walsh@rackspace.com>2010-12-13 18:25:17 -0800
commit1395d31badc43bdce036e8da3927af22a22ca91e (patch)
tree32f590a1051c1b1c42e1d7f93433a015d187f061
parent54e4174a0b6a3c1dd4105617b06bb7a69f45202c (diff)
Fixed power state update with Twisted callback
-rw-r--r--nova/compute/manager.py21
-rw-r--r--nova/virt/xenapi/vmops.py12
-rw-r--r--nova/virt/xenapi_conn.py8
3 files changed, 29 insertions, 12 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 61ed3136b..ae33fe5b9 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -194,6 +194,13 @@ class ComputeManager(manager.Manager):
yield self.driver.unrescue(instance_ref)
self._update_state(context, instance_id)
+ @staticmethod
+ def _update_state_callback(self, context, instance_id, result):
+ """Update instance state when Deferred task completes.
+ This staticmethod must be wrappered in a
+ lambda to pass in self, context & instance_id."""
+ self._update_state(context, instance_id)
+
@defer.inlineCallbacks
@exception.wrap_exception
def pause_instance(self, context, instance_id):
@@ -207,8 +214,11 @@ class ComputeManager(manager.Manager):
instance_id,
power_state.NOSTATE,
'pausing')
- yield self.driver.pause(instance_ref)
- self._update_state(context, instance_id)
+ yield self.driver.pause(instance_ref,
+ lambda result : self._update_state_callback(self,
+ context,
+ instance_id,
+ result))
@defer.inlineCallbacks
@exception.wrap_exception
@@ -223,8 +233,11 @@ class ComputeManager(manager.Manager):
instance_id,
power_state.NOSTATE,
'unpausing')
- yield self.driver.unpause(instance_ref)
- self._update_state(context, instance_id)
+ yield self.driver.unpause(instance_ref,
+ lambda result : self._update_state_callback(self,
+ context,
+ instance_id,
+ result))
@exception.wrap_exception
def get_console_output(self, context, instance_id):
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index 353e83873..03ee3dd58 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -121,24 +121,28 @@ class VMOps(object):
logging.warn(exc)
@defer.inlineCallbacks
- def pause(self, instance):
+ def pause(self, instance, callback):
""" Pause VM instance """
instance_name = instance.name
vm = yield VMHelper.lookup(self._session, instance_name)
if vm is None:
raise Exception('instance not present %s' % instance_name)
task = yield self._session.call_xenapi('Async.VM.pause', vm)
- yield self._session.wait_for_task(task)
+ deferred = self._session.wait_for_task(task)
+ deferred.addCallback(callback)
+ yield deferred
@defer.inlineCallbacks
- def unpause(self, instance):
+ def unpause(self, instance, callback):
""" Unpause VM instance """
instance_name = instance.name
vm = yield VMHelper.lookup(self._session, instance_name)
if vm is None:
raise Exception('instance not present %s' % instance_name)
task = yield self._session.call_xenapi('Async.VM.unpause', vm)
- yield self._session.wait_for_task(task)
+ deferred = self._session.wait_for_task(task)
+ deferred.addCallback(callback)
+ yield deferred
def get_info(self, instance_id):
""" Return data about VM instance """
diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py
index df405e75f..bcfb48323 100644
--- a/nova/virt/xenapi_conn.py
+++ b/nova/virt/xenapi_conn.py
@@ -122,13 +122,13 @@ class XenAPIConnection(object):
""" Destroy VM instance """
self._vmops.destroy(instance)
- def pause(self, instance):
+ def pause(self, instance, callback):
""" Pause VM instance """
- self._vmops.pause(instance)
+ self._vmops.pause(instance, callback)
- def unpause(self, instance):
+ def unpause(self, instance, callback):
""" Unpause paused VM instance """
- self._vmops.unpause(instance)
+ self._vmops.unpause(instance, callback)
def get_info(self, instance_id):
""" Return data about VM instance """