]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/rbd: add optional flags param to create_snap
authorMykola Golub <mgolub@suse.com>
Sun, 31 May 2020 13:23:44 +0000 (14:23 +0100)
committerMykola Golub <mgolub@suse.com>
Tue, 9 Jun 2020 07:33:52 +0000 (08:33 +0100)
and mirror_image_create_snapshot

Signed-off-by: Mykola Golub <mgolub@suse.com>
fixup: pybind/rbd

src/pybind/rbd/rbd.pyx
src/test/pybind/test_rbd.py

index 72cfda55650b8ac649f0c4f7cc5afc6dcee21390..427be5e272f09f2e1fb50f88f4c33aba20e4c54a 100644 (file)
@@ -98,6 +98,9 @@ cdef extern from "rbd/librbd.h" nogil:
         RBD_MAX_BLOCK_NAME_SIZE
         RBD_MAX_IMAGE_NAME_SIZE
 
+        _RBD_SNAP_CREATE_SKIP_QUIESCE "RBD_SNAP_CREATE_SKIP_QUIESCE"
+        _RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR "RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR"
+
         _RBD_SNAP_REMOVE_UNPROTECT "RBD_SNAP_REMOVE_UNPROTECT"
         _RBD_SNAP_REMOVE_FLATTEN "RBD_SNAP_REMOVE_FLATTEN"
         _RBD_SNAP_REMOVE_FORCE "RBD_SNAP_REMOVE_FORCE"
@@ -507,7 +510,8 @@ cdef extern from "rbd/librbd.h" nogil:
     int rbd_snap_list(rbd_image_t image, rbd_snap_info_t *snaps,
                       int *max_snaps)
     void rbd_snap_list_end(rbd_snap_info_t *snaps)
-    int rbd_snap_create(rbd_image_t image, const char *snapname)
+    int rbd_snap_create2(rbd_image_t image, const char *snapname, uint32_t flags,
+                        librbd_progress_fn_t cb, void *cbdata)
     int rbd_snap_remove(rbd_image_t image, const char *snapname)
     int rbd_snap_remove2(rbd_image_t image, const char *snapname, uint32_t flags,
                         librbd_progress_fn_t cb, void *cbdata)
@@ -599,7 +603,8 @@ cdef extern from "rbd/librbd.h" nogil:
     int rbd_mirror_image_promote(rbd_image_t image, bint force)
     int rbd_mirror_image_demote(rbd_image_t image)
     int rbd_mirror_image_resync(rbd_image_t image)
-    int rbd_mirror_image_create_snapshot(rbd_image_t image, uint64_t *snap_id)
+    int rbd_mirror_image_create_snapshot2(rbd_image_t image, uint32_t flags,
+                                          uint64_t *snap_id)
     int rbd_mirror_image_get_info(rbd_image_t image,
                                   rbd_mirror_image_info_t *mirror_image_info,
                                   size_t info_size)
@@ -800,6 +805,9 @@ RBD_POOL_STAT_OPTION_TRASH_PROVISIONED_BYTES = _RBD_POOL_STAT_OPTION_TRASH_PROVI
 RBD_POOL_STAT_OPTION_TRASH_MAX_PROVISIONED_BYTES = _RBD_POOL_STAT_OPTION_TRASH_MAX_PROVISIONED_BYTES
 RBD_POOL_STAT_OPTION_TRASH_SNAPSHOTS = _RBD_POOL_STAT_OPTION_TRASH_SNAPSHOTS
 
+RBD_SNAP_CREATE_SKIP_QUIESCE = _RBD_SNAP_CREATE_SKIP_QUIESCE
+RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR = _RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR
+
 RBD_SNAP_REMOVE_UNPROTECT = _RBD_SNAP_REMOVE_UNPROTECT
 RBD_SNAP_REMOVE_FLATTEN = _RBD_SNAP_REMOVE_FLATTEN
 RBD_SNAP_REMOVE_FORCE = _RBD_SNAP_REMOVE_FORCE
@@ -3928,18 +3936,21 @@ cdef class Image(object):
         return SnapIterator(self)
 
     @requires_not_closed
-    def create_snap(self, name):
+    def create_snap(self, name, flags=0):
         """
         Create a snapshot of the image.
 
         :param name: the name of the snapshot
         :type name: str
-        :raises: :class:`ImageExists`
+        :raises: :class:`ImageExists`, :class:`InvalidArgument`
         """
         name = cstr(name, 'name')
-        cdef char *_name = name
+        cdef:
+            char *_name = name
+            uint32_t _flags = flags
+            librbd_progress_fn_t prog_cb = &no_op_progress_callback
         with nogil:
-            ret = rbd_snap_create(self.image, _name)
+            ret = rbd_snap_create2(self.image, _name, _flags, prog_cb, NULL)
         if ret != 0:
             raise make_ex(ret, 'error creating snapshot %s from %s' % (name, self.name))
 
@@ -4804,7 +4815,7 @@ written." % (self.name, ret, length))
             raise make_ex(ret, 'error to resync image %s' % self.name)
 
     @requires_not_closed
-    def mirror_image_create_snapshot(self):
+    def mirror_image_create_snapshot(self, flags=0):
         """
         Create mirror snapshot.
 
@@ -4813,9 +4824,11 @@ written." % (self.name, ret, length))
         :returns: int - the snapshot Id
         """
         cdef:
+            uint32_t _flags = flags
             uint64_t snap_id
         with nogil:
-            ret = rbd_mirror_image_create_snapshot(self.image, &snap_id)
+            ret = rbd_mirror_image_create_snapshot2(self.image, _flags,
+                                                    &snap_id)
         if ret < 0:
             raise make_ex(ret, 'error creating mirror snapshot for image %s' %
                           self.name)
index e97bc2805c113f485a467597657c2d0bf11de63a..dc323d3022c0237f4fa14f566f19b4aeb64f88d6 100644 (file)
@@ -38,7 +38,9 @@ from rbd import (RBD, Group, Image, ImageNotFound, InvalidArgument, ImageExists,
                  RBD_MIRROR_PEER_ATTRIBUTE_NAME_KEY,
                  RBD_MIRROR_PEER_DIRECTION_RX, RBD_MIRROR_PEER_DIRECTION_RX_TX,
                  RBD_SNAP_REMOVE_UNPROTECT, RBD_SNAP_MIRROR_STATE_PRIMARY,
-                 RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED)
+                 RBD_SNAP_MIRROR_STATE_PRIMARY_DEMOTED,
+                 RBD_SNAP_CREATE_SKIP_QUIESCE,
+                 RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR)
 
 rados = None
 ioctx = None
@@ -785,6 +787,14 @@ class TestImage(object):
         assert_raises(ImageExists, self.image.create_snap, 'snap1')
         self.image.remove_snap('snap1')
 
+    def test_create_snap_flags(self):
+        self.image.create_snap('snap1', 0)
+        self.image.remove_snap('snap1')
+        self.image.create_snap('snap1', RBD_SNAP_CREATE_SKIP_QUIESCE)
+        self.image.remove_snap('snap1')
+        self.image.create_snap('snap1', RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR)
+        self.image.remove_snap('snap1')
+
     def test_list_snaps(self):
         eq([], list(self.image.list_snaps()))
         self.image.create_snap('snap1')
@@ -2126,7 +2136,8 @@ class TestMirroring(object):
         info['mode'] = RBD_MIRROR_IMAGE_MODE_SNAPSHOT;
         eq(info, entries[self.image.id()])
 
-        snap_id = self.image.mirror_image_create_snapshot()
+        snap_id = self.image.mirror_image_create_snapshot(
+            RBD_SNAP_CREATE_SKIP_QUIESCE)
 
         snaps = list(self.image.list_snaps())
         eq(2, len(snaps))