From 4a3104c6aeeb4368b298b81b4e5e6270801ea775 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Fri, 25 May 2012 16:24:03 -0400 Subject: Remove nova.context dependency from nova.rpc Part of blueprint common-rpc. This patch removes the usage of nova.context from nova.rpc. Everything needed to implement RpcContext now exists within nova.rpc. Change-Id: I9e6ec0d22e55d3d4f38e12e0fdd2df745da496f5 --- nova/rpc/amqp.py | 7 +++---- nova/rpc/common.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ nova/rpc/impl_fake.py | 7 +++---- 3 files changed, 50 insertions(+), 8 deletions(-) diff --git a/nova/rpc/amqp.py b/nova/rpc/amqp.py index 4850eb47e..479b232bc 100644 --- a/nova/rpc/amqp.py +++ b/nova/rpc/amqp.py @@ -33,7 +33,6 @@ from eventlet import greenpool from eventlet import pools from eventlet import semaphore -from nova import context from nova import log as logging from nova.openstack.common import excutils from nova.openstack.common import local @@ -168,12 +167,12 @@ def msg_reply(conf, msg_id, connection_pool, reply=None, failure=None, conn.direct_send(msg_id, msg) -class RpcContext(context.RequestContext): +class RpcContext(rpc_common.CommonRpcContext): """Context that supports replying to a rpc.call""" - def __init__(self, *args, **kwargs): + def __init__(self, **kwargs): self.msg_id = kwargs.pop('msg_id', None) self.conf = kwargs.pop('conf') - super(RpcContext, self).__init__(*args, **kwargs) + super(RpcContext, self).__init__(**kwargs) def reply(self, reply=None, failure=None, ending=False, connection_pool=None): diff --git a/nova/rpc/common.py b/nova/rpc/common.py index 120b41c14..85177f864 100644 --- a/nova/rpc/common.py +++ b/nova/rpc/common.py @@ -25,6 +25,7 @@ from nova import log as logging from nova.openstack.common import cfg from nova.openstack.common import importutils from nova.openstack.common import jsonutils +from nova.openstack.common import local LOG = logging.getLogger(__name__) @@ -267,3 +268,46 @@ def deserialize_remote_exception(conf, data): # first exception argument. failure.args = (message,) + failure.args[1:] return failure + + +class CommonRpcContext(object): + def __init__(self, **kwargs): + self.values = kwargs + + def __getattr__(self, key): + try: + return self.values[key] + except KeyError: + raise AttributeError(key) + + def to_dict(self): + return copy.deepcopy(self.values) + + @classmethod + def from_dict(cls, values): + return cls(**values) + + def update_store(self): + local.store.context = self + + def elevated(self, read_deleted=None, overwrite=False): + """Return a version of this context with admin flag set.""" + # TODO(russellb) This method is a bit of a nova-ism. It makes + # some assumptions about the data in the request context sent + # across rpc, while the rest of this class does not. We could get + # rid of this if we changed the nova code that uses this to + # convert the RpcContext back to its native RequestContext doing + # something like nova.context.RequestContext.from_dict(ctxt.to_dict()) + + context = copy.deepcopy(self) + context.values['is_admin'] = True + + context.values.setdefault('roles', []) + + if 'admin' not in context.values['roles']: + context.values['roles'].append('admin') + + if read_deleted is not None: + context.values['read_deleted'] = read_deleted + + return context diff --git a/nova/rpc/impl_fake.py b/nova/rpc/impl_fake.py index 70a8ca5f7..a6af6247b 100644 --- a/nova/rpc/impl_fake.py +++ b/nova/rpc/impl_fake.py @@ -23,15 +23,14 @@ import time import eventlet -from nova import context from nova.rpc import common as rpc_common CONSUMERS = {} -class RpcContext(context.RequestContext): - def __init__(self, *args, **kwargs): - super(RpcContext, self).__init__(*args, **kwargs) +class RpcContext(rpc_common.CommonRpcContext): + def __init__(self, **kwargs): + super(RpcContext, self).__init__(**kwargs) self._response = [] self._done = False -- cgit From a427d04901b57789b4127c8b8c79b6b7141d8e3a Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Sat, 26 May 2012 20:42:09 -0400 Subject: Remove nova.log usage from nova.rpc. Part of blueprint common-rpc. This patch removes the usage of nova.log from nova.rpc. This is necessary before nova.rpc can be moved to openstack-common. The rpc logging was not using any of the extra features provided in nova.log as far as I can tell, so the changes are very simple. This is the final dependency. After this change, the rpc code can be moved to openstack-common without any changes. Change-Id: I17ca4b691bb8d4f18e618632a2381dd12d31852a --- nova/rpc/amqp.py | 2 +- nova/rpc/common.py | 2 +- nova/rpc/impl_qpid.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/nova/rpc/amqp.py b/nova/rpc/amqp.py index 479b232bc..1a3fd719a 100644 --- a/nova/rpc/amqp.py +++ b/nova/rpc/amqp.py @@ -26,6 +26,7 @@ AMQP, but is deprecated and predates this code. """ import inspect +import logging import sys import uuid @@ -33,7 +34,6 @@ from eventlet import greenpool from eventlet import pools from eventlet import semaphore -from nova import log as logging from nova.openstack.common import excutils from nova.openstack.common import local import nova.rpc.common as rpc_common diff --git a/nova/rpc/common.py b/nova/rpc/common.py index 85177f864..c5f88f90b 100644 --- a/nova/rpc/common.py +++ b/nova/rpc/common.py @@ -18,10 +18,10 @@ # under the License. import copy +import logging import sys import traceback -from nova import log as logging from nova.openstack.common import cfg from nova.openstack.common import importutils from nova.openstack.common import jsonutils diff --git a/nova/rpc/impl_qpid.py b/nova/rpc/impl_qpid.py index dad47defc..77d39407e 100644 --- a/nova/rpc/impl_qpid.py +++ b/nova/rpc/impl_qpid.py @@ -18,6 +18,7 @@ import functools import itertools import json +import logging import time import uuid @@ -26,7 +27,6 @@ import greenlet import qpid.messaging import qpid.messaging.exceptions -from nova import log as logging from nova.openstack.common import cfg from nova.rpc import amqp as rpc_amqp from nova.rpc import common as rpc_common -- cgit