summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell Bryant <rbryant@redhat.com>2012-07-31 15:26:31 -0400
committerRussell Bryant <rbryant@redhat.com>2012-07-31 15:33:55 -0400
commit6a6fe2f6bf736583d9e2cde0733c6568877b7979 (patch)
treea12392d5f878477ded4557aa5265764eda11e7d7
parent37dee20d2f963ca08e56a95be8c654e1920e4a2a (diff)
downloadnova-6a6fe2f6bf736583d9e2cde0733c6568877b7979.tar.gz
nova-6a6fe2f6bf736583d9e2cde0733c6568877b7979.tar.xz
nova-6a6fe2f6bf736583d9e2cde0733c6568877b7979.zip
Send a full instance in unrescue_instance.
Change the unrescue_instance method 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: I9a693b347ce583aa350f4c10531b53e0f9813577
-rw-r--r--nova/compute/manager.py21
-rw-r--r--nova/compute/rpcapi.py8
-rw-r--r--nova/tests/compute/test_compute.py12
-rw-r--r--nova/tests/compute/test_rpcapi.py4
4 files changed, 30 insertions, 15 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index e76c603e5..31428675c 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -272,7 +272,7 @@ def _get_image_meta(context, image_ref):
class ComputeManager(manager.SchedulerDependentManager):
"""Manages the running instances from creation to destruction."""
- RPC_API_VERSION = '1.34'
+ RPC_API_VERSION = '1.35'
def __init__(self, compute_driver=None, *args, **kwargs):
"""Load configuration options and connect to the hypervisor."""
@@ -1347,22 +1347,23 @@ class ComputeManager(manager.SchedulerDependentManager):
@exception.wrap_exception(notifier=notifier, publisher_id=publisher_id())
@checks_instance_lock
@wrap_instance_fault
- def unrescue_instance(self, context, instance_uuid):
+ def unrescue_instance(self, context, instance=None, instance_uuid=None):
"""Rescue an instance on this host."""
- LOG.audit(_('Unrescuing'), context=context,
- instance_uuid=instance_uuid)
context = context.elevated()
+ if not instance:
+ instance = self.db.instance_get_by_uuid(context, instance_uuid)
- instance_ref = self.db.instance_get_by_uuid(context, instance_uuid)
- network_info = self._get_instance_nw_info(context, instance_ref)
+ LOG.audit(_('Unrescuing'), context=context, instance=instance)
- with self.error_out_instance_on_exception(context, instance_uuid):
- self.driver.unrescue(instance_ref,
+ network_info = self._get_instance_nw_info(context, instance)
+
+ with self.error_out_instance_on_exception(context, instance['uuid']):
+ self.driver.unrescue(instance,
self._legacy_nw_info(network_info))
- current_power_state = self._get_power_state(context, instance_ref)
+ current_power_state = self._get_power_state(context, instance)
self._instance_update(context,
- instance_uuid,
+ instance['uuid'],
vm_state=vm_states.ACTIVE,
task_state=None,
power_state=current_power_state)
diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py
index 153348374..435cae50b 100644
--- a/nova/compute/rpcapi.py
+++ b/nova/compute/rpcapi.py
@@ -108,6 +108,8 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
set_admin_password()
1.34 - Remove instance_uuid, add instance argument to
snapshot_instance()
+ 1.35 - Remove instance_uuid, add instance argument to
+ unrescue_instance()
'''
BASE_RPC_API_VERSION = '1.0'
@@ -460,9 +462,11 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
version='1.5')
def unrescue_instance(self, ctxt, instance):
+ instance_p = jsonutils.to_primitive(instance)
self.cast(ctxt, self.make_msg('unrescue_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.35')
def change_instance_metadata(self, ctxt, instance, diff):
self.cast(ctxt, self.make_msg('change_instance_metadata',
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index 46f06e7b3..d8bf703ea 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -444,10 +444,20 @@ class ComputeTestCase(BaseTestCase):
instance = jsonutils.to_primitive(self._create_fake_instance())
instance_uuid = instance['uuid']
self.compute.run_instance(self.context, instance_uuid)
+
+ # Make sure these methods work with both instance and instance_uuid
+
self.compute.rescue_instance(self.context, instance=instance)
self.assertTrue(called['rescued'])
- self.compute.unrescue_instance(self.context, instance_uuid)
+ self.compute.unrescue_instance(self.context, instance=instance)
+ self.assertTrue(called['unrescued'])
+
+ self.compute.rescue_instance(self.context, instance_uuid=instance_uuid)
+ self.assertTrue(called['rescued'])
+ self.compute.unrescue_instance(self.context,
+ instance_uuid=instance_uuid)
self.assertTrue(called['unrescued'])
+
self.compute.terminate_instance(self.context, instance_uuid)
def test_power_on(self):
diff --git a/nova/tests/compute/test_rpcapi.py b/nova/tests/compute/test_rpcapi.py
index cafd7fd55..3c9806b57 100644
--- a/nova/tests/compute/test_rpcapi.py
+++ b/nova/tests/compute/test_rpcapi.py
@@ -62,7 +62,7 @@ class ComputeRpcAPITestCase(test.TestCase):
'resize_instance', 'resume_instance', 'revert_resize',
'rollback_live_migration_at_destination', 'set_admin_password',
'snapshot_instance', 'start_instance', 'stop_instance',
- 'suspend_instance', 'unpause_instance'
+ 'suspend_instance', 'unpause_instance', 'unrescue_instance'
]
if 'rpcapi_class' in kwargs:
@@ -336,7 +336,7 @@ class ComputeRpcAPITestCase(test.TestCase):
def test_unrescue_instance(self):
self._test_compute_api('unrescue_instance', 'cast',
- instance=self.fake_instance)
+ instance=self.fake_instance, version='1.35')
def test_change_instance_metadata(self):
self._test_compute_api('change_instance_metadata', 'cast',