From 8316f32ec5bc0b5972895cf21459b3125a19f60c Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Wed, 8 Nov 2017 18:05:36 +0800 Subject: [PATCH] pybind/rados: add rados_service_*() Signed-off-by: Kefu Chai --- src/pybind/rados/rados.pyx | 37 +++++++++++++++++++++++++++++++++++ src/test/pybind/test_rados.py | 7 +++++++ 2 files changed, 44 insertions(+) diff --git a/src/pybind/rados/rados.pyx b/src/pybind/rados/rados.pyx index e00274278f7..8870c789eb6 100644 --- a/src/pybind/rados/rados.pyx +++ b/src/pybind/rados/rados.pyx @@ -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""" diff --git a/src/test/pybind/test_rados.py b/src/test/pybind/test_rados.py index b692d4be950..eeb6f58a344 100644 --- a/src/test/pybind/test_rados.py +++ b/src/test/pybind/test_rados.py @@ -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): -- 2.39.5