summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell Bryant <rbryant@redhat.com>2012-07-20 14:08:10 -0400
committerRussell Bryant <rbryant@redhat.com>2012-07-25 19:53:20 -0400
commit94018d1f753d62ba75f3262f2c2fcdb1ee7f731b (patch)
treea2fe7a9136168ecd1192bd5d5e116655ceaebe7d
parentf5289971b7da19111ca6a68bb46c1108ea46664b (diff)
downloadnova-94018d1f753d62ba75f3262f2c2fcdb1ee7f731b.tar.gz
nova-94018d1f753d62ba75f3262f2c2fcdb1ee7f731b.tar.xz
nova-94018d1f753d62ba75f3262f2c2fcdb1ee7f731b.zip
Send a full instance via rpc for (un)pause_instance.
Change the pause_instance and unpause_instance methods of the compute rpc API to take a full instance over rpc instead of just the instance UUID. This cuts down on database access needed by nova-compute. Part of blueprint no-db-messaging. Change-Id: Ia7e31428c7d2edb9a0c4d0958f1c7774742ea1cd
-rw-r--r--nova/compute/manager.py28
-rw-r--r--nova/compute/rpcapi.py14
-rw-r--r--nova/tests/compute/test_compute.py9
-rw-r--r--nova/tests/compute/test_rpcapi.py8
4 files changed, 36 insertions, 23 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index cced8509b..9ebfe496b 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -297,7 +297,7 @@ def _get_additional_capabilities():
class ComputeManager(manager.SchedulerDependentManager):
"""Manages the running instances from creation to destruction."""
- RPC_API_VERSION = '1.4'
+ RPC_API_VERSION = '1.5'
def __init__(self, compute_driver=None, *args, **kwargs):
"""Load configuration options and connect to the hypervisor."""
@@ -1713,17 +1713,18 @@ class ComputeManager(manager.SchedulerDependentManager):
@exception.wrap_exception(notifier=notifier, publisher_id=publisher_id())
@checks_instance_lock
@wrap_instance_fault
- def pause_instance(self, context, instance_uuid):
+ def pause_instance(self, context, instance=None, instance_uuid=None):
"""Pause an instance on this host."""
context = context.elevated()
- instance_ref = self.db.instance_get_by_uuid(context, instance_uuid)
+ if not instance:
+ instance = self.db.instance_get_by_uuid(context, instance_uuid)
- LOG.audit(_('Pausing'), context=context, instance=instance_ref)
- self.driver.pause(instance_ref)
+ LOG.audit(_('Pausing'), context=context, instance=instance)
+ self.driver.pause(instance)
- current_power_state = self._get_power_state(context, instance_ref)
+ current_power_state = self._get_power_state(context, instance)
self._instance_update(context,
- instance_ref['uuid'],
+ instance['uuid'],
power_state=current_power_state,
vm_state=vm_states.PAUSED,
task_state=None)
@@ -1731,17 +1732,18 @@ class ComputeManager(manager.SchedulerDependentManager):
@exception.wrap_exception(notifier=notifier, publisher_id=publisher_id())
@checks_instance_lock
@wrap_instance_fault
- def unpause_instance(self, context, instance_uuid):
+ def unpause_instance(self, context, instance=None, instance_uuid=None):
"""Unpause a paused instance on this host."""
context = context.elevated()
- instance_ref = self.db.instance_get_by_uuid(context, instance_uuid)
+ if not instance:
+ instance = self.db.instance_get_by_uuid(context, instance_uuid)
- LOG.audit(_('Unpausing'), context=context, instance=instance_ref)
- self.driver.unpause(instance_ref)
+ LOG.audit(_('Unpausing'), context=context, instance=instance)
+ self.driver.unpause(instance)
- current_power_state = self._get_power_state(context, instance_ref)
+ current_power_state = self._get_power_state(context, instance)
self._instance_update(context,
- instance_ref['uuid'],
+ instance['uuid'],
power_state=current_power_state,
vm_state=vm_states.ACTIVE,
task_state=None)
diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py
index e480ee20d..d5de04452 100644
--- a/nova/compute/rpcapi.py
+++ b/nova/compute/rpcapi.py
@@ -60,6 +60,8 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
1.2 - Adds check_can_live_migrate_[destination|source]
1.3 - Adds change_instance_metadata()
1.4 - Remove instance_uuid, add instance argument to reboot_instance()
+ 1.5 - Remove instance_uuid, add instance argument to pause_instance(),
+ unpause_instance()
'''
BASE_RPC_API_VERSION = '1.0'
@@ -211,9 +213,11 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
_compute_topic(self.topic, ctxt, host, None))
def pause_instance(self, ctxt, instance):
+ instance_p = jsonutils.to_primitive(instance)
self.cast(ctxt, self.make_msg('pause_instance',
- instance_uuid=instance['uuid']),
- topic=_compute_topic(self.topic, ctxt, None, instance))
+ instance=instance_p),
+ topic=_compute_topic(self.topic, ctxt, None, instance),
+ version='1.5')
def power_off_instance(self, ctxt, instance):
self.cast(ctxt, self.make_msg('power_off_instance',
@@ -361,9 +365,11 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
topic=_compute_topic(self.topic, ctxt, None, instance))
def unpause_instance(self, ctxt, instance):
+ instance_p = jsonutils.to_primitive(instance)
self.cast(ctxt, self.make_msg('unpause_instance',
- instance_uuid=instance['uuid']),
- topic=_compute_topic(self.topic, ctxt, None, instance))
+ instance=instance_p),
+ topic=_compute_topic(self.topic, ctxt, None, instance),
+ version='1.5')
def unrescue_instance(self, ctxt, instance):
self.cast(ctxt, self.make_msg('unrescue_instance',
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index c9110176d..0c4d07e8e 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -492,8 +492,10 @@ class ComputeTestCase(BaseTestCase):
instance = self._create_fake_instance()
instance_uuid = instance['uuid']
self.compute.run_instance(self.context, instance_uuid)
- self.compute.pause_instance(self.context, instance_uuid)
- self.compute.unpause_instance(self.context, instance_uuid)
+ self.compute.pause_instance(self.context,
+ instance=jsonutils.to_primitive(instance))
+ self.compute.unpause_instance(self.context,
+ instance=jsonutils.to_primitive(instance))
self.compute.terminate_instance(self.context, instance_uuid)
def test_suspend(self):
@@ -2544,7 +2546,8 @@ class ComputeAPITestCase(BaseTestCase):
self.assertEqual(instance['task_state'], None)
- self.compute.pause_instance(self.context, instance_uuid)
+ self.compute.pause_instance(self.context,
+ instance=jsonutils.to_primitive(instance))
# set the state that the instance gets when pause finishes
instance = db.instance_update(self.context, instance['uuid'],
{'vm_state': vm_states.PAUSED})
diff --git a/nova/tests/compute/test_rpcapi.py b/nova/tests/compute/test_rpcapi.py
index 488119116..72942d352 100644
--- a/nova/tests/compute/test_rpcapi.py
+++ b/nova/tests/compute/test_rpcapi.py
@@ -48,7 +48,9 @@ class ComputeRpcAPITestCase(test.TestCase):
def _test_compute_api(self, method, rpc_method, **kwargs):
ctxt = context.RequestContext('fake_user', 'fake_project')
- methods_with_instance = ['reboot_instance']
+ methods_with_instance = [
+ 'pause_instance', 'reboot_instance', 'unpause_instance'
+ ]
if 'rpcapi_class' in kwargs:
rpcapi_class = kwargs['rpcapi_class']
@@ -202,7 +204,7 @@ class ComputeRpcAPITestCase(test.TestCase):
def test_pause_instance(self):
self._test_compute_api('pause_instance', 'cast',
- instance=self.fake_instance)
+ instance=self.fake_instance, version='1.5')
def test_power_off_instance(self):
self._test_compute_api('power_off_instance', 'cast',
@@ -316,7 +318,7 @@ class ComputeRpcAPITestCase(test.TestCase):
def test_unpause_instance(self):
self._test_compute_api('unpause_instance', 'cast',
- instance=self.fake_instance)
+ instance=self.fake_instance, version='1.5')
def test_unrescue_instance(self):
self._test_compute_api('unrescue_instance', 'cast',