From: Mykola Golub Date: Sun, 31 May 2020 13:23:44 +0000 (+0100) Subject: pybind/rbd: add optional flags param to create_snap X-Git-Tag: v16.1.0~2015^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f2cfc2a539ae26e02bc2d2887d4dba92256dbb67;p=ceph.git pybind/rbd: add optional flags param to create_snap and mirror_image_create_snapshot Signed-off-by: Mykola Golub fixup: pybind/rbd --- diff --git a/src/pybind/rbd/rbd.pyx b/src/pybind/rbd/rbd.pyx index 72cfda55650b..427be5e272f0 100644 --- a/src/pybind/rbd/rbd.pyx +++ b/src/pybind/rbd/rbd.pyx @@ -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) diff --git a/src/test/pybind/test_rbd.py b/src/test/pybind/test_rbd.py index e97bc2805c11..dc323d3022c0 100644 --- a/src/test/pybind/test_rbd.py +++ b/src/test/pybind/test_rbd.py @@ -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))