summaryrefslogtreecommitdiffstats
path: root/nova/baserpc.py
diff options
context:
space:
mode:
authorRussell Bryant <rbryant@redhat.com>2013-04-23 13:34:24 -0400
committerRussell Bryant <rbryant@redhat.com>2013-04-23 14:02:39 -0400
commit1a546c67ee94eef2260cd64e7fcb3fb0ed44b4f6 (patch)
tree0a4bfb8fc49e19f9efd43c66924d2d858d27b9a8 /nova/baserpc.py
parent98efba2dff8f67220595447728f69330089a3ebd (diff)
downloadnova-1a546c67ee94eef2260cd64e7fcb3fb0ed44b4f6.tar.gz
nova-1a546c67ee94eef2260cd64e7fcb3fb0ed44b4f6.tar.xz
nova-1a546c67ee94eef2260cd64e7fcb3fb0ed44b4f6.zip
Add an rpc API common to all services.
This patch adds an rpc API that is exposed by all services. The methods in this API exist in their own namespace and are versioned independently of the main API for the service. The first method for this API is a simple ping() method. This method exists in the conductor rpc API already, and could be more generally useful. Other methods will be added in later patches. The base rpc API will be exposed from all services automatically unless they override the create_rpc_dispatcher method in the base manager class. All services need to pass a service_name into the base manager constructor. Some services already did this, but now it's needed for all of them. Implements blueprint base-rpc-api. Change-Id: I02ab1970578bc53ba26461b533d06d1055c2d88e
Diffstat (limited to 'nova/baserpc.py')
-rw-r--r--nova/baserpc.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/nova/baserpc.py b/nova/baserpc.py
new file mode 100644
index 000000000..803a1b614
--- /dev/null
+++ b/nova/baserpc.py
@@ -0,0 +1,68 @@
+#
+# Copyright 2013 Red Hat, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+"""
+Base RPC client and server common to all services.
+"""
+
+from nova.openstack.common import jsonutils
+import nova.openstack.common.rpc.proxy as rpc_proxy
+
+
+_NAMESPACE = 'baseapi'
+
+
+class BaseAPI(rpc_proxy.RpcProxy):
+ """Client side of the base rpc API.
+
+ API version history:
+
+ 1.0 - Initial version.
+ """
+
+ #
+ # NOTE(russellb): This is the default minimum version that the server
+ # (manager) side must implement unless otherwise specified using a version
+ # argument to self.call()/cast()/etc. here. It should be left as X.0 where
+ # X is the current major API version (1.0, 2.0, ...). For more information
+ # about rpc API versioning, see the docs in
+ # openstack/common/rpc/dispatcher.py.
+ #
+ BASE_RPC_API_VERSION = '1.0'
+
+ def __init__(self, topic):
+ super(BaseAPI, self).__init__(topic=topic,
+ default_version=self.BASE_RPC_API_VERSION)
+ self.namespace = _NAMESPACE
+
+ def ping(self, context, arg, timeout=None):
+ arg_p = jsonutils.to_primitive(arg)
+ msg = self.make_namespaced_msg('ping', self.namespace, arg=arg_p)
+ return self.call(context, msg, timeout=timeout)
+
+
+class BaseRPCAPI(object):
+ """Server side of the base RPC API."""
+
+ RPC_API_NAMESPACE = _NAMESPACE
+ RPC_API_VERSION = '1.0'
+
+ def __init__(self, service_name):
+ self.service_name = service_name
+
+ def ping(self, context, arg):
+ resp = {'service': self.service_name, 'arg': arg}
+ return jsonutils.to_primitive(resp)