From 609ae5433b17be2b3dd920008f7d1e8f049d7c70 Mon Sep 17 00:00:00 2001 From: songweibin Date: Sat, 21 Sep 2019 08:37:09 +0800 Subject: [PATCH] pybind/rados: add application_metadata_get Signed-off-by: songweibin --- src/pybind/rados/rados.pyx | 38 +++++++++++++++++++++++++++++++++++ src/test/pybind/test_rados.py | 3 +++ 2 files changed, 41 insertions(+) diff --git a/src/pybind/rados/rados.pyx b/src/pybind/rados/rados.pyx index 01b25d207d268..9123a11691e4d 100644 --- a/src/pybind/rados/rados.pyx +++ b/src/pybind/rados/rados.pyx @@ -3937,6 +3937,44 @@ returned %d, but should return zero on success." % (self.name, ret)) finally: free(apps) + def application_metadata_get(self, app_name, key): + """ + Gets application metadata on an OSD pool for the given key + + :param app_name: application name + :type app_name: str + :param key: metadata key + :type key: str + :returns: str - metadata value + + :raises: :class:`Error` + """ + + app_name = cstr(app_name, 'app_name') + key = cstr(key, 'key') + cdef: + char *_app_name = app_name + char *_key = key + size_t size = 129 + char *value = NULL + int ret + try: + while True: + value = realloc_chk(value, size) + with nogil: + ret = rados_application_metadata_get(self.io, _app_name, + _key, value, &size) + if ret != -errno.ERANGE: + break + if ret == -errno.ENOENT: + raise KeyError('no metadata %s for application %s' % (key, _app_name)) + elif ret != 0: + raise make_ex(ret, 'error getting metadata %s for application %s' % + (key, _app_name)) + return decode_cstr(value) + finally: + free(value) + def application_metadata_set(self, app_name, key, value): """ Sets application metadata on an OSD pool diff --git a/src/test/pybind/test_rados.py b/src/test/pybind/test_rados.py index 9f8358b32871c..8d65942f4a8da 100644 --- a/src/test/pybind/test_rados.py +++ b/src/test/pybind/test_rados.py @@ -881,8 +881,11 @@ class TestIoctx(object): assert_raises(Error, self.ioctx.application_metadata_set, "dne", "key", "key") self.ioctx.application_metadata_set("app1", "key1", "val1") + eq("val1", self.ioctx.application_metadata_get("app1", "key1")) self.ioctx.application_metadata_set("app1", "key2", "val2") + eq("val2", self.ioctx.application_metadata_get("app1", "key2")) self.ioctx.application_metadata_set("app2", "key1", "val1") + eq("val1", self.ioctx.application_metadata_get("app2", "key1")) eq([("key1", "val1"), ("key2", "val2")], self.ioctx.application_metadata_list("app1")) -- 2.39.5