From a484f066008487ed89c27ec4bee8a64b011c20f6 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Thu, 26 Jul 2012 13:44:12 -0400 Subject: Send a full instance via rpc for get_vnc_console. Change the get_vnc_console 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: I4443e65fd6a9aafdad21fda63ef04a03428288a9 --- nova/compute/manager.py | 12 +++++++----- nova/compute/rpcapi.py | 7 +++++-- nova/tests/compute/test_compute.py | 30 ++++++++++++------------------ nova/tests/compute/test_rpcapi.py | 5 +++-- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 7168fdf3a..7ae875430 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -298,7 +298,7 @@ def _get_additional_capabilities(): class ComputeManager(manager.SchedulerDependentManager): """Manages the running instances from creation to destruction.""" - RPC_API_VERSION = '1.16' + RPC_API_VERSION = '1.17' def __init__(self, compute_driver=None, *args, **kwargs): """Load configuration options and connect to the hypervisor.""" @@ -1926,12 +1926,14 @@ class ComputeManager(manager.SchedulerDependentManager): @exception.wrap_exception(notifier=notifier, publisher_id=publisher_id()) @wrap_instance_fault - def get_vnc_console(self, context, instance_uuid, console_type): + def get_vnc_console(self, context, console_type, instance_uuid=None, + instance=None): """Return connection information for a vnc console.""" 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.debug(_("Getting vnc console"), instance=instance_ref) + LOG.debug(_("Getting vnc console"), instance=instance) token = str(utils.gen_uuid()) if console_type == 'novnc': @@ -1945,7 +1947,7 @@ class ComputeManager(manager.SchedulerDependentManager): # Retrieve connect info from driver, and then decorate with our # access info token - connect_info = self.driver.get_vnc_console(instance_ref) + connect_info = self.driver.get_vnc_console(instance) connect_info['token'] = token connect_info['access_url'] = access_url diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py index 86bad50e2..6382716ad 100644 --- a/nova/compute/rpcapi.py +++ b/nova/compute/rpcapi.py @@ -78,6 +78,7 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy): 1.15 - Remove instance_uuid, add instance argument to finish_revert_resize() 1.16 - Remove instance_uuid, add instance argument to get_diagnostics() + 1.17 - Remove instance_uuid, add instance argument to get_vnc_console() ''' BASE_RPC_API_VERSION = '1.0' @@ -189,9 +190,11 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy): version='1.16') def get_vnc_console(self, ctxt, instance, console_type): + instance_p = jsonutils.to_primitive(instance) return self.call(ctxt, self.make_msg('get_vnc_console', - instance_uuid=instance['uuid'], console_type=console_type), - topic=_compute_topic(self.topic, ctxt, None, instance)) + instance=instance, console_type=console_type), + topic=_compute_topic(self.topic, ctxt, None, instance), + version='1.17') def host_maintenance_mode(self, ctxt, host_param, mode, host): '''Set host maintenance mode diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index 591b2ebd4..e6bc8547f 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -802,48 +802,42 @@ class ComputeTestCase(BaseTestCase): def test_novnc_vnc_console(self): """Make sure we can a vnc console for an instance.""" - instance = self._create_fake_instance() + instance = jsonutils.to_primitive(self._create_fake_instance()) self.compute.run_instance(self.context, instance['uuid']) - console = self.compute.get_vnc_console(self.context, - instance['uuid'], - 'novnc') + console = self.compute.get_vnc_console(self.context, 'novnc', + instance=instance) self.assert_(console) self.compute.terminate_instance(self.context, instance['uuid']) def test_xvpvnc_vnc_console(self): """Make sure we can a vnc console for an instance.""" - instance = self._create_fake_instance() + instance = jsonutils.to_primitive(self._create_fake_instance()) self.compute.run_instance(self.context, instance['uuid']) - console = self.compute.get_vnc_console(self.context, - instance['uuid'], - 'xvpvnc') + console = self.compute.get_vnc_console(self.context, 'xvpvnc', + instance=instance) self.assert_(console) self.compute.terminate_instance(self.context, instance['uuid']) def test_invalid_vnc_console_type(self): """Raise useful error if console type is an unrecognised string""" - instance = self._create_fake_instance() + instance = jsonutils.to_primitive(self._create_fake_instance()) self.compute.run_instance(self.context, instance['uuid']) self.assertRaises(exception.ConsoleTypeInvalid, self.compute.get_vnc_console, - self.context, - instance['uuid'], - 'invalid') + self.context, 'invalid', instance=instance) self.compute.terminate_instance(self.context, instance['uuid']) def test_missing_vnc_console_type(self): """Raise useful error is console type is None""" - instance = self._create_fake_instance() + instance = jsonutils.to_primitive(self._create_fake_instance()) self.compute.run_instance(self.context, instance['uuid']) self.assertRaises(exception.ConsoleTypeInvalid, self.compute.get_vnc_console, - self.context, - instance['uuid'], - None) + self.context, None, instance=instance) self.compute.terminate_instance(self.context, instance['uuid']) def test_diagnostics(self): @@ -3679,9 +3673,9 @@ class ComputeAPITestCase(BaseTestCase): self.mox.StubOutWithMock(rpc, 'call') rpc_msg1 = {'method': 'get_vnc_console', - 'args': {'instance_uuid': fake_instance['uuid'], + 'args': {'instance': fake_instance, 'console_type': fake_console_type}, - 'version': compute_rpcapi.ComputeAPI.BASE_RPC_API_VERSION} + 'version': '1.17'} rpc_msg2 = {'method': 'authorize_console', 'args': fake_connect_info, 'version': '1.0'} diff --git a/nova/tests/compute/test_rpcapi.py b/nova/tests/compute/test_rpcapi.py index e1b33210c..2bbb7e665 100644 --- a/nova/tests/compute/test_rpcapi.py +++ b/nova/tests/compute/test_rpcapi.py @@ -53,7 +53,7 @@ class ComputeRpcAPITestCase(test.TestCase): 'check_can_live_migrate_destination', 'check_can_live_migrate_source', 'confirm_resize', 'detach_volume', 'finish_resize', 'finish_revert_resize', - 'get_console_output', 'get_diagnostics', + 'get_console_output', 'get_diagnostics', 'get_vnc_console', 'pause_instance', 'reboot_instance', 'suspend_instance', 'unpause_instance' ] @@ -185,7 +185,8 @@ class ComputeRpcAPITestCase(test.TestCase): def test_get_vnc_console(self): self._test_compute_api('get_vnc_console', 'call', - instance=self.fake_instance, console_type='type') + instance=self.fake_instance, console_type='type', + version='1.17') def test_host_maintenance_mode(self): self._test_compute_api('host_maintenance_mode', 'call', -- cgit