]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: introduce rbd_group_snap_namespace_type_t enum 59883/head
authorIlya Dryomov <idryomov@gmail.com>
Thu, 19 Sep 2024 12:07:47 +0000 (14:07 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Fri, 20 Sep 2024 07:01:17 +0000 (09:01 +0200)
Commit e5ccce14c4b0 ("rbd: add group snap info command") added
a commented out field in rbd_group_snap_info2_t struct but didn't
define the corresponding enum, expecting it to be brought in with the
patchset that introduces mirror group snapshots.  That work is still
in progress, but there is already interest in the new command and APIs
that use rbd_group_snap_info2_t struct and even a backport request.

Finalize the struct definition to avoid a breaking change for those
users in the future.  RBD_GROUP_SNAP_NAMESPACE_TYPE_USER can be treated
as dummy in terms of meaning until RBD_GROUP_SNAP_NAMESPACE_TYPE_MIRROR
is added.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
src/include/rbd/librbd.h
src/include/rbd/librbd.hpp
src/librbd/api/Group.cc
src/librbd/librbd.cc
src/pybind/rbd/c_rbd.pxd
src/pybind/rbd/mock_rbd.pxi
src/pybind/rbd/rbd.pyx
src/test/librbd/test_Groups.cc
src/test/pybind/test_rbd.py

index 7144e2038c1ca3501144ae4dae6c03015dbb56ff..b2ea242108780f03ad402d9245d2e8a84694731b 100644 (file)
@@ -249,6 +249,10 @@ typedef enum {
   RBD_GROUP_SNAP_STATE_COMPLETE
 } rbd_group_snap_state_t;
 
+typedef enum {
+  RBD_GROUP_SNAP_NAMESPACE_TYPE_USER = 0
+} rbd_group_snap_namespace_type_t;
+
 typedef struct {
   char *image_name;
   int64_t pool_id;
@@ -265,7 +269,7 @@ typedef struct {
   char *name;
   char *image_snap_name;
   rbd_group_snap_state_t state;
-  //rbd_group_snap_namespace_type_t namespace_type;
+  rbd_group_snap_namespace_type_t namespace_type;
   size_t image_snaps_count;
   rbd_group_image_snap_info_t *image_snaps;
 } rbd_group_snap_info2_t;
index 5d64943fe56e5cb114df81648c478836a0fecf3c..a8a3d5fa6193c7ec460917df99cde38cf6239089 100644 (file)
@@ -160,6 +160,7 @@ namespace librbd {
   } group_info_t;
 
   typedef rbd_group_snap_state_t group_snap_state_t;
+  typedef rbd_group_snap_namespace_type_t group_snap_namespace_type_t;
 
   typedef struct {
     std::string image_name;
@@ -177,7 +178,7 @@ namespace librbd {
     std::string name;
     std::string image_snap_name;
     group_snap_state_t state;
-    //group_snap_namespace_type_t namespace_type;
+    group_snap_namespace_type_t namespace_type;
     std::vector<group_image_snap_info_t> image_snaps;
   } group_snap_info2_t;
 
index 97c53abd70f54c61a5b1131a6f01b2e78af59233..c2140e818b6bee6e0ddcbcf132f9986a86e63ad6 100644 (file)
@@ -483,6 +483,7 @@ int GroupSnapshot_to_group_snap_info2(
   group_snap->id = cls_group_snap.id;
   group_snap->name = cls_group_snap.name;
   group_snap->state = static_cast<group_snap_state_t>(cls_group_snap.state);
+  group_snap->namespace_type = RBD_GROUP_SNAP_NAMESPACE_TYPE_USER;
   if (!image_snaps.empty()) {
     group_snap->image_snap_name = calc_ind_image_snap_name(
         group_ioctx.get_id(), group_id, cls_group_snap.id);
index cc63595257fe80bf4bcc98044ae2bbdfae0578b3..49a774fdf7cb6043194945487e7c0aab2fa092ea 100644 (file)
@@ -275,6 +275,7 @@ void group_snap_info2_cpp_to_c(const librbd::group_snap_info2_t &cpp_info,
   c_info->name = strdup(cpp_info.name.c_str());
   c_info->image_snap_name = strdup(cpp_info.image_snap_name.c_str());
   c_info->state = cpp_info.state;
+  c_info->namespace_type = cpp_info.namespace_type;
   c_info->image_snaps_count = cpp_info.image_snaps.size();
   c_info->image_snaps = static_cast<rbd_group_image_snap_info_t*>(calloc(
     cpp_info.image_snaps.size(), sizeof(rbd_group_image_snap_info_t)));
index 2c2dd42fd78e2d36f89794448b25317184f00e28..dec945969e23c6adca0b6969c9d7f33752c11f43 100644 (file)
@@ -224,6 +224,9 @@ cdef extern from "rbd/librbd.h" nogil:
         _RBD_GROUP_SNAP_STATE_INCOMPLETE "RBD_GROUP_SNAP_STATE_INCOMPLETE"
         _RBD_GROUP_SNAP_STATE_COMPLETE "RBD_GROUP_SNAP_STATE_COMPLETE"
 
+    ctypedef enum rbd_group_snap_namespace_type_t:
+        _RBD_GROUP_SNAP_NAMESPACE_TYPE_USER "RBD_GROUP_SNAP_NAMESPACE_TYPE_USER"
+
     ctypedef struct rbd_group_image_snap_info_t:
         char *image_name
         int64_t pool_id
@@ -234,6 +237,7 @@ cdef extern from "rbd/librbd.h" nogil:
         char *name
         char *image_snap_name
         rbd_group_snap_state_t state
+        rbd_group_snap_namespace_type_t namespace_type
         size_t image_snaps_count
         rbd_group_image_snap_info_t *image_snaps
 
index 53a161d9a3bfccfd071ded59b011fae7cfe1821b..aa5e1609d82ceb3a69ec482a62535e251cbd53e1 100644 (file)
@@ -228,6 +228,9 @@ cdef nogil:
         _RBD_GROUP_SNAP_STATE_INCOMPLETE "RBD_GROUP_SNAP_STATE_INCOMPLETE"
         _RBD_GROUP_SNAP_STATE_COMPLETE "RBD_GROUP_SNAP_STATE_COMPLETE"
 
+    ctypedef enum rbd_group_snap_namespace_type_t:
+        _RBD_GROUP_SNAP_NAMESPACE_TYPE_USER "RBD_GROUP_SNAP_NAMESPACE_TYPE_USER"
+
     ctypedef struct rbd_group_image_snap_info_t:
         char *image_name
         int64_t pool_id
@@ -238,6 +241,7 @@ cdef nogil:
         char *name
         char *image_snap_name
         rbd_group_snap_state_t state
+        rbd_group_snap_namespace_type_t namespace_type
         size_t image_snaps_count
         rbd_group_image_snap_info_t *image_snaps
 
index 66604db1ffba7899c4f705577233f2e7798152a5..786c9ef0fec0a4c213c4072cae1d7439939b6923 100644 (file)
@@ -134,6 +134,8 @@ RBD_GROUP_IMAGE_STATE_INCOMPLETE = _RBD_GROUP_IMAGE_STATE_INCOMPLETE
 RBD_GROUP_SNAP_STATE_INCOMPLETE = _RBD_GROUP_SNAP_STATE_INCOMPLETE
 RBD_GROUP_SNAP_STATE_COMPLETE = _RBD_GROUP_SNAP_STATE_COMPLETE
 
+RBD_GROUP_SNAP_NAMESPACE_TYPE_USER = _RBD_GROUP_SNAP_NAMESPACE_TYPE_USER
+
 RBD_IMAGE_MIGRATION_STATE_UNKNOWN = _RBD_IMAGE_MIGRATION_STATE_UNKNOWN
 RBD_IMAGE_MIGRATION_STATE_ERROR = _RBD_IMAGE_MIGRATION_STATE_ERROR
 RBD_IMAGE_MIGRATION_STATE_PREPARING = _RBD_IMAGE_MIGRATION_STATE_PREPARING
@@ -2843,6 +2845,8 @@ cdef class Group(object):
 
             * ``state`` (int) - state of the group snapshot
 
+            * ``namespace_type`` (int) - group snapshot namespace type
+
             * ``image_snap_name`` (str) - name of the image snapshots
 
             * ``image_snaps`` (list) - image snapshots that constitute the group snapshot.
@@ -2881,6 +2885,7 @@ cdef class Group(object):
             'id': decode_cstr(group_snap.id),
             'name': decode_cstr(group_snap.name),
             'state': group_snap.state,
+            'namespace_type': group_snap.namespace_type,
             'image_snap_name': decode_cstr(group_snap.image_snap_name),
             'image_snaps': image_snaps
         }
@@ -6055,6 +6060,8 @@ cdef class GroupSnapIterator(object):
 
     * ``state`` (int) - state of the group snapshot
 
+    * ``namespace_type`` (int) - group snapshot namespace type
+
     * ``image_snap_name`` (str) - name of the image snapshots
 
     * ``image_snaps`` (list) - image snapshots that constitute the group snapshot.
@@ -6105,6 +6112,7 @@ cdef class GroupSnapIterator(object):
                 'id': decode_cstr(group_snap.id),
                 'name': decode_cstr(group_snap.name),
                 'state': group_snap.state,
+                'namespace_type': group_snap.namespace_type,
                 'image_snap_name': decode_cstr(group_snap.image_snap_name),
                 'image_snaps': image_snaps,
             }
index eb18473b9887802bef9534874850075c79f4cba7..a95785ad7a39e658d92aeca286cebee8932a00c7 100644 (file)
@@ -522,6 +522,7 @@ TEST_F(TestGroup, snap_get_info)
                                        &gp_snap_info));
   ASSERT_STREQ(gp_snap_name, gp_snap_info.name);
   ASSERT_EQ(RBD_GROUP_SNAP_STATE_COMPLETE, gp_snap_info.state);
+  ASSERT_EQ(RBD_GROUP_SNAP_NAMESPACE_TYPE_USER, gp_snap_info.namespace_type);
   ASSERT_STREQ("", gp_snap_info.image_snap_name);
   ASSERT_EQ(0U, gp_snap_info.image_snaps_count);
 
@@ -536,6 +537,7 @@ TEST_F(TestGroup, snap_get_info)
                                        &gp_snap_info));
   ASSERT_STREQ(gp_snap_name, gp_snap_info.name);
   ASSERT_EQ(RBD_GROUP_SNAP_STATE_COMPLETE, gp_snap_info.state);
+  ASSERT_EQ(RBD_GROUP_SNAP_NAMESPACE_TYPE_USER, gp_snap_info.namespace_type);
   ASSERT_EQ(1U, gp_snap_info.image_snaps_count);
   ASSERT_EQ(m_image_name, gp_snap_info.image_snaps[0].image_name);
   ASSERT_EQ(rados_ioctx_get_id(ioctx), gp_snap_info.image_snaps[0].pool_id);
@@ -574,6 +576,7 @@ TEST_F(TestGroup, snap_get_infoPP)
                                          &gp_snap_info));
   ASSERT_EQ(gp_snap_name, gp_snap_info.name);
   ASSERT_EQ(RBD_GROUP_SNAP_STATE_COMPLETE, gp_snap_info.state);
+  ASSERT_EQ(RBD_GROUP_SNAP_NAMESPACE_TYPE_USER, gp_snap_info.namespace_type);
   ASSERT_EQ("", gp_snap_info.image_snap_name);
   ASSERT_EQ(0U, gp_snap_info.image_snaps.size());
 
@@ -587,6 +590,7 @@ TEST_F(TestGroup, snap_get_infoPP)
                                          &gp_snap_info));
   ASSERT_EQ(gp_snap_name, gp_snap_info.name);
   ASSERT_EQ(RBD_GROUP_SNAP_STATE_COMPLETE, gp_snap_info.state);
+  ASSERT_EQ(RBD_GROUP_SNAP_NAMESPACE_TYPE_USER, gp_snap_info.namespace_type);
   ASSERT_EQ(1U, gp_snap_info.image_snaps.size());
   ASSERT_EQ(m_image_name, gp_snap_info.image_snaps[0].image_name);
   ASSERT_EQ(m_ioctx.get_id(), gp_snap_info.image_snaps[0].pool_id);
@@ -652,6 +656,7 @@ TEST_F(TestGroup, snap_list2)
 
   for (int i = 0; i < 4; i++) {
     ASSERT_EQ(RBD_GROUP_SNAP_STATE_COMPLETE, gp_snaps[i].state);
+    ASSERT_EQ(RBD_GROUP_SNAP_NAMESPACE_TYPE_USER, gp_snaps[i].namespace_type);
     if (!strcmp(gp_snaps[i].name, gp_snap_names[0])) {
       ASSERT_EQ(0U, gp_snaps[i].image_snaps_count);
     } else if (!strcmp(gp_snaps[i].name, gp_snap_names[1])) {
@@ -739,6 +744,7 @@ TEST_F(TestGroup, snap_list2PP)
 
   for (const auto& gp_snap : gp_snaps) {
     ASSERT_EQ(RBD_GROUP_SNAP_STATE_COMPLETE, gp_snap.state);
+    ASSERT_EQ(RBD_GROUP_SNAP_NAMESPACE_TYPE_USER, gp_snap.namespace_type);
     if (gp_snap.name == gp_snap_names[0]) {
       ASSERT_EQ(0U, gp_snap.image_snaps.size());
     } else if (gp_snap.name == gp_snap_names[1]) {
index 5f35521d6f44f142504aa27ba540e02e5ff5222a..15673672fc56002fe181172148f31aa4a6c25503 100644 (file)
@@ -49,7 +49,8 @@ from rbd import (RBD, Group, Image, ImageNotFound, InvalidArgument, ImageExists,
                  RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR,
                  RBD_WRITE_ZEROES_FLAG_THICK_PROVISION,
                  RBD_ENCRYPTION_FORMAT_LUKS1, RBD_ENCRYPTION_FORMAT_LUKS2,
-                 RBD_ENCRYPTION_FORMAT_LUKS, RBD_GROUP_SNAP_STATE_COMPLETE)
+                 RBD_ENCRYPTION_FORMAT_LUKS, RBD_GROUP_SNAP_STATE_COMPLETE,
+                 RBD_GROUP_SNAP_NAMESPACE_TYPE_USER)
 
 rados = None
 ioctx = None
@@ -2836,7 +2837,8 @@ def test_list_groups_after_removed():
 
 class TestGroups(object):
     img_snap_keys = ['image_name', 'pool_id', 'snap_id']
-    gp_snap_keys = ['id', 'image_snap_name', 'image_snaps', 'name', 'state']
+    gp_snap_keys = ['id', 'image_snap_name', 'image_snaps', 'name',
+                    'namespace_type', 'state']
 
     def setup_method(self, method):
         global snap_name
@@ -2925,6 +2927,7 @@ class TestGroups(object):
         assert sorted(snap_info_dict.keys()) == self.gp_snap_keys
         assert snap_info_dict['name'] == snap_name
         assert snap_info_dict['state'] == RBD_GROUP_SNAP_STATE_COMPLETE
+        assert snap_info_dict['namespace_type'] == RBD_GROUP_SNAP_NAMESPACE_TYPE_USER
         for image_snap in snap_info_dict['image_snaps']:
             assert sorted(image_snap.keys()) == self.img_snap_keys
             assert image_snap['pool_id'] == pool_id
@@ -2946,6 +2949,7 @@ class TestGroups(object):
         assert sorted(snap_info_dict.keys()) == self.gp_snap_keys
         assert snap_info_dict['name'] == snap_name
         assert snap_info_dict['state'] == RBD_GROUP_SNAP_STATE_COMPLETE
+        assert snap_info_dict['namespace_type'] == RBD_GROUP_SNAP_NAMESPACE_TYPE_USER
         assert snap_info_dict['image_snap_name'] == ""
         assert snap_info_dict['image_snaps'] == []