]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/rbd: added snap_get_group_namespace API method
authorJason Dillaman <dillaman@redhat.com>
Thu, 11 Jan 2018 02:40:29 +0000 (21:40 -0500)
committerJason Dillaman <dillaman@redhat.com>
Thu, 11 Jan 2018 15:38:23 +0000 (10:38 -0500)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/pybind/rbd/rbd.pyx
src/test/pybind/test_rbd.py

index 48626e6092c0cb62e93a88452ee2cbb7ed7996dd..6ff4ec14bd9707af38d71420edd738bbd8583dce 100644 (file)
@@ -96,6 +96,11 @@ cdef extern from "rbd/librbd.h" nogil:
         uint64_t size
         char *name
 
+    ctypedef struct rbd_snap_group_namespace_t:
+        int64_t group_pool
+        char *group_name
+        char *group_snap_name
+
     ctypedef struct rbd_child_info_t:
         char *pool_name
         char *image_name
@@ -306,6 +311,14 @@ cdef extern from "rbd/librbd.h" nogil:
     int rbd_snap_set_limit(rbd_image_t image, uint64_t limit)
     int rbd_snap_get_timestamp(rbd_image_t image, uint64_t snap_id, timespec *timestamp)
     int rbd_snap_set(rbd_image_t image, const char *snapname)
+    int rbd_snap_get_namespace_type(rbd_image_t image,
+                                    uint64_t snap_id,
+                                    rbd_snap_namespace_type_t *namespace_type)
+    int rbd_snap_get_group_namespace(rbd_image_t image, uint64_t snap_id,
+                                     rbd_snap_group_namespace_t *group_spec)
+    void rbd_snap_group_namespace_cleanup(rbd_snap_group_namespace_t *group_spec)
+
+
     int rbd_flatten(rbd_image_t image)
     int rbd_rebuild_object_map(rbd_image_t image, librbd_progress_fn_t cb,
                                void *cbdata)
@@ -414,10 +427,6 @@ cdef extern from "rbd/librbd.h" nogil:
     void rbd_group_snap_list_cleanup(rbd_group_snap_spec_t *snaps,
                                           size_t len)
 
-    int rbd_snap_get_namespace_type(rbd_image_t image,
-                                    uint64_t snap_id,
-                                    rbd_snap_namespace_type_t *namespace_type)
-
     int rbd_watchers_list(rbd_image_t image, rbd_image_watcher_t *watchers,
                           size_t *max_watchers)
     void rbd_watchers_list_cleanup(rbd_image_watcher_t *watchers,
@@ -466,6 +475,10 @@ RBD_IMAGE_OPTION_STRIPE_UNIT = _RBD_IMAGE_OPTION_STRIPE_UNIT
 RBD_IMAGE_OPTION_STRIPE_COUNT = _RBD_IMAGE_OPTION_STRIPE_COUNT
 RBD_IMAGE_OPTION_DATA_POOL = _RBD_IMAGE_OPTION_DATA_POOL
 
+SNAP_NAMESPACE_TYPE_USER = _SNAP_NAMESPACE_TYPE_USER
+SNAP_NAMESPACE_TYPE_GROUP = _SNAP_NAMESPACE_TYPE_GROUP
+SNAP_NAMESPACE_TYPE_UNKNOWN = _SNAP_NAMESPACE_TYPE_UNKNOWN
+
 class Error(Exception):
     pass
 
@@ -3145,6 +3158,28 @@ written." % (self.name, ret, length))
 
         return namespace_type
 
+    def snap_get_group_namespace(self, snap_id):
+        """
+        get the group namespace details.
+        :param snap_id: the snapshot id of the group snapshot
+        """
+        cdef:
+            rbd_snap_group_namespace_t group_namespace
+            uint64_t _snap_id = snap_id
+        with nogil:
+            ret = rbd_snap_get_group_namespace(self.image, _snap_id,
+                                               &group_namespace)
+        if ret != 0:
+            raise make_ex(ret, 'error getting snapshot group namespace for image: %s, snap_id: %d' % (self.name, snap_id))
+
+        info = {
+                'pool' : group_namespace.group_pool,
+                'name' : decode_cstr(group_namespace.group_name),
+                'snap_name' : decode_cstr(group_namespace.group_snap_name)
+            }
+        rbd_snap_group_namespace_cleanup(&group_namespace)
+        return info
+
 cdef class LockOwnerIterator(object):
     """
     Iterator over managed lock owners for an image
index 3e1580db3aae494a65a6237025b9fa1fb9f48747..ea0b37d61b5de162bd988f743ed78c198005aa3e 100644 (file)
@@ -1747,12 +1747,19 @@ class TestGroups(object):
     def test_group_snap(self):
         global snap_name
         eq([], list(self.group.list_snaps()))
-        """
         self.group.create_snap(snap_name)
         eq([snap_name], [snap['name'] for snap in self.group.list_snaps()])
+
+        for snap in self.image.list_snaps():
+            eq(rbd.SNAP_NAMESPACE_TYPE_GROUP,
+               self.image.snap_get_namespace_type(snap['id']))
+
+            info = self.image.snap_get_group_namespace(snap['id'])
+            eq(group_name, info['group_name'])
+            eq(snap_name, info['group_snap_name'])
+
         self.group.remove_snap(snap_name)
         eq([], list(self.group.list_snaps()))
-        """
 
     def test_group_snap_list_15(self):
         global snap_name