summaryrefslogtreecommitdiffstats
path: root/nova/consoleauth
diff options
context:
space:
mode:
authorChris Behrens <cbehrens@codestud.com>2013-03-13 19:52:43 +0000
committerChris Behrens <cbehrens@codestud.com>2013-03-19 21:54:00 +0000
commitc02d3aec3b005640c28b321b22ec0f0f992981ec (patch)
treed207a4331af1196e6102bb14cd5d86acb851b98d /nova/consoleauth
parent98f9f735d7e6ac32a8736971f4aab0d81c56131e (diff)
downloadnova-c02d3aec3b005640c28b321b22ec0f0f992981ec.tar.gz
nova-c02d3aec3b005640c28b321b22ec0f0f992981ec.tar.xz
nova-c02d3aec3b005640c28b321b22ec0f0f992981ec.zip
Fix console support with cells
The (relatively recent) security fixes for consoleauth do not work with cells because consoleauth and the compute manager for the instance talk to different rabbit servers. consoleauth is in the API cell and the compute manager is in a child cell. This patch adds code to proxy the following via cells: 1) compute -> consoleauth's delete_tokens_for_instance() 2) consoleauth -> compute's validate_console_port() Also: On instance deletion when the compute manager tells consoleauth to delete tokens for the instance, it's not necessary to do an rpc.call and block. The only purpose it could serve would be log a traceback on failure on the compute manager side, but that seems unnecessary. There's no return value. This patch changes it to an rpc.cast instead. Fixes bug 1154755 Change-Id: Ic763f2a5c0dcff7b7ccfac5927680e7881605f61
Diffstat (limited to 'nova/consoleauth')
-rw-r--r--nova/consoleauth/manager.py15
-rw-r--r--nova/consoleauth/rpcapi.py2
2 files changed, 14 insertions, 3 deletions
diff --git a/nova/consoleauth/manager.py b/nova/consoleauth/manager.py
index fe5bfd861..80a6d447f 100644
--- a/nova/consoleauth/manager.py
+++ b/nova/consoleauth/manager.py
@@ -22,6 +22,7 @@ import time
from oslo.config import cfg
+from nova.cells import rpcapi as cells_rpcapi
from nova.compute import rpcapi as compute_rpcapi
from nova.conductor import api as conductor_api
from nova import manager
@@ -43,6 +44,7 @@ consoleauth_opts = [
CONF = cfg.CONF
CONF.register_opts(consoleauth_opts)
+CONF.import_opt('enable', 'nova.cells.opts', group='cells')
class ConsoleAuthManager(manager.Manager):
@@ -53,8 +55,9 @@ class ConsoleAuthManager(manager.Manager):
def __init__(self, scheduler_driver=None, *args, **kwargs):
super(ConsoleAuthManager, self).__init__(*args, **kwargs)
self.mc = memorycache.get_client()
- self.compute_rpcapi = compute_rpcapi.ComputeAPI()
self.conductor_api = conductor_api.API()
+ self.compute_rpcapi = compute_rpcapi.ComputeAPI()
+ self.cells_rpcapi = cells_rpcapi.CellsAPI()
def _get_tokens_for_instance(self, instance_uuid):
tokens_str = self.mc.get(instance_uuid.encode('UTF-8'))
@@ -88,8 +91,16 @@ class ConsoleAuthManager(manager.Manager):
instance_uuid = token['instance_uuid']
if instance_uuid is None:
return False
+
+ # NOTE(comstud): consoleauth was meant to run in API cells. So,
+ # if cells is enabled, we must call down to the child cell for
+ # the instance.
+ if CONF.cells.enable:
+ return self.cells_rpcapi.validate_console_port(context,
+ instance_uuid, token['port'], token['console_type'])
+
instance = self.conductor_api.instance_get_by_uuid(context,
- instance_uuid)
+ instance_uuid)
return self.compute_rpcapi.validate_console_port(context,
instance,
token['port'],
diff --git a/nova/consoleauth/rpcapi.py b/nova/consoleauth/rpcapi.py
index 474f3ad19..9ab477340 100644
--- a/nova/consoleauth/rpcapi.py
+++ b/nova/consoleauth/rpcapi.py
@@ -67,7 +67,7 @@ class ConsoleAuthAPI(nova.openstack.common.rpc.proxy.RpcProxy):
return self.call(ctxt, self.make_msg('check_token', token=token))
def delete_tokens_for_instance(self, ctxt, instance_uuid):
- return self.call(ctxt,
+ return self.cast(ctxt,
self.make_msg('delete_tokens_for_instance',
instance_uuid=instance_uuid),
version="1.2")