]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/rados: add rados_service_*() 18812/head
authorKefu Chai <kchai@redhat.com>
Wed, 8 Nov 2017 10:05:36 +0000 (18:05 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 30 Nov 2017 08:08:28 +0000 (16:08 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/pybind/rados/rados.pyx
src/test/pybind/test_rados.py

index e00274278f795d48b23bf422b3503a59ab32f18c..8870c789eb68dd4ef38c4ad296edf312c53926c9 100644 (file)
@@ -194,6 +194,9 @@ cdef extern from "rados/librados.h" nogil:
 
     int rados_wait_for_latest_osdmap(rados_t cluster)
 
+    int rados_service_register(rados_t cluster, const char *service, const char *daemon, const char *metadata_dict)
+    int rados_service_update_status(rados_t cluster, const char *status_dict)
+
     int rados_ioctx_create(rados_t cluster, const char *pool_name, rados_ioctx_t *ioctx)
     int rados_ioctx_create2(rados_t cluster, int64_t pool_id, rados_ioctx_t *ioctx)
     void rados_ioctx_destroy(rados_ioctx_t io)
@@ -1493,6 +1496,40 @@ Rados object in state %s." % self.state)
         self.monitor_callback = None
         self.monitor_callback2 = cb
 
+    @requires(('service', str_type), ('daemon', str_type), ('metadata', dict))
+    def service_daemon_register(self, service, daemon, metadata):
+        """
+        :param str service: service name (e.g. "rgw")
+        :param str daemon: daemon name (e.g. "gwfoo")
+        :param dict metadata: static metadata about the register daemon
+               (e.g., the version of Ceph, the kernel version.)
+        """
+        service = cstr(service, 'service')
+        daemon = cstr(daemon, 'daemon')
+        metadata_dict = '\0'.join(chain.from_iterable(metadata.items()))
+        metadata_dict += '\0'
+        cdef:
+            char *_service = service
+            char *_daemon = daemon
+            char *_metadata = metadata_dict
+
+        with nogil:
+            ret = rados_service_register(self.cluster, _service, _daemon, _metadata)
+        if ret != 0:
+            raise make_ex(ret, "error calling service_register()")
+
+    @requires(('metadata', dict))
+    def service_daemon_update(self, status):
+        status_dict = '\0'.join(chain.from_iterable(status.items()))
+        status_dict += '\0'
+        cdef:
+            char *_status = status_dict
+
+        with nogil:
+            ret = rados_service_update_status(self.cluster, _status)
+        if ret != 0:
+            raise make_ex(ret, "error calling service_daemon_update()")
+
 
 cdef class OmapIterator(object):
     """Omap iterator"""
index b692d4be95062c08b522dd42cbf73360517a53b7..eeb6f58a344ff980d19c430479d5811a1114169a 100644 (file)
@@ -9,6 +9,7 @@ import time
 import threading
 import json
 import errno
+import os
 import sys
 
 # Are we running Python 2.x
@@ -891,6 +892,12 @@ class TestIoctx(object):
         self.ioctx.application_metadata_remove("app1", "key1")
         eq([("key2", "val2")], self.ioctx.application_metadata_list("app1"))
 
+    def test_service_daemon(self):
+        name = "pid-" + str(os.getpid())
+        metadata = {'version': '3.14', 'memory': '42'}
+        self.rados.service_daemon_register("laundry", name, metadata)
+        status = {'result': 'unknown', 'test': 'running'}
+        self.rados.service_daemon_update(status)
 
 class TestIoctx2(object):