X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Fpybind%2Fmgr%2Fvolumes%2Ffs%2Foperations%2Fversions%2Fsubvolume_v1.py;h=73363d3dc5643b23c433f9b014975024a90cf5f3;hb=f6b5b4d738b87d88d2de35127b6b0e41eae2a272;hp=e4255d25b330c8a11912f8b2bcf0b4afa683827e;hpb=12732ca2e80d168d344a265acffc1fbd1fa1f1b5;p=ceph.git diff --git a/ceph/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v1.py b/ceph/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v1.py index e4255d25b..73363d3dc 100644 --- a/ceph/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v1.py +++ b/ceph/src/pybind/mgr/volumes/fs/operations/versions/subvolume_v1.py @@ -8,7 +8,7 @@ from datetime import datetime import cephfs from .metadata_manager import MetadataManager -from .subvolume_base import SubvolumeBase +from .subvolume_base import SubvolumeBase, SubvolumeFeatures from ..op_sm import OpSm from ..template import SubvolumeTemplate from ..snapshot_util import mksnap, rmsnap @@ -34,6 +34,10 @@ class SubvolumeV1(SubvolumeBase, SubvolumeTemplate): except MetadataMgrException as me: raise VolumeException(-errno.EINVAL, "error fetching subvolume metadata") + @property + def features(self): + return [SubvolumeFeatures.FEATURE_SNAPSHOT_CLONE.value, SubvolumeFeatures.FEATURE_SNAPSHOT_AUTOPROTECT.value] + def create(self, size, isolate_nspace, pool, mode, uid, gid): subvolume_type = SubvolumeBase.SUBVOLUME_TYPE_NORMAL try: @@ -197,18 +201,6 @@ class SubvolumeV1(SubvolumeBase, SubvolumeTemplate): snappath = self.snapshot_path(snapname) mksnap(self.fs, snappath) - def is_snapshot_protected(self, snapname): - try: - self.metadata_mgr.get_option('protected snaps', snapname) - except MetadataMgrException as me: - if me.errno == -errno.ENOENT: - return False - else: - log.warning("error checking protected snap {0} ({1})".format(snapname, me)) - raise VolumeException(-errno.EINVAL, "snapshot protection check failed") - else: - return True - def has_pending_clones(self, snapname): try: return self.metadata_mgr.section_has_item('clone snaps', snapname) @@ -218,8 +210,8 @@ class SubvolumeV1(SubvolumeBase, SubvolumeTemplate): raise def remove_snapshot(self, snapname): - if self.is_snapshot_protected(snapname): - raise VolumeException(-errno.EINVAL, "snapshot '{0}' is protected".format(snapname)) + if self.has_pending_clones(snapname): + raise VolumeException(-errno.EAGAIN, "snapshot '{0}' has pending clones".format(snapname)) snappath = self.snapshot_path(snapname) rmsnap(self.fs, snappath) @@ -234,7 +226,6 @@ class SubvolumeV1(SubvolumeBase, SubvolumeTemplate): return {'size': int(snap_info['size']), 'created_at': str(datetime.fromtimestamp(float(snap_info['created_at']))), 'data_pool': snap_info['data_pool'].decode('utf-8'), - 'protected': "yes" if self.is_snapshot_protected(snapname) else "no", 'has_pending_clones': "yes" if self.has_pending_clones(snapname) else "no"} except cephfs.Error as e: if e.errno == errno.ENOENT: @@ -252,39 +243,6 @@ class SubvolumeV1(SubvolumeBase, SubvolumeTemplate): return [] raise - def _protect_snapshot(self, snapname): - try: - self.metadata_mgr.add_section("protected snaps") - self.metadata_mgr.update_section("protected snaps", snapname, "1") - self.metadata_mgr.flush() - except MetadataMgrException as me: - log.warning("error updating protected snap list ({0})".format(me)) - raise VolumeException(-errno.EINVAL, "error protecting snapshot") - - def _unprotect_snapshot(self, snapname): - try: - self.metadata_mgr.remove_option("protected snaps", snapname) - self.metadata_mgr.flush() - except MetadataMgrException as me: - log.warning("error updating protected snap list ({0})".format(me)) - raise VolumeException(-errno.EINVAL, "error unprotecting snapshot") - - def protect_snapshot(self, snapname): - if not snapname.encode('utf-8') in self.list_snapshots(): - raise VolumeException(-errno.ENOENT, "snapshot '{0}' does not exist".format(snapname)) - if self.is_snapshot_protected(snapname): - raise VolumeException(-errno.EEXIST, "snapshot '{0}' is already protected".format(snapname)) - self._protect_snapshot(snapname) - - def unprotect_snapshot(self, snapname): - if not snapname.encode('utf-8') in self.list_snapshots(): - raise VolumeException(-errno.ENOENT, "snapshot '{0}' does not exist".format(snapname)) - if not self.is_snapshot_protected(snapname): - raise VolumeException(-errno.EEXIST, "snapshot '{0}' is not protected".format(snapname)) - if self.has_pending_clones(snapname): - raise VolumeException(-errno.EEXIST, "snapshot '{0}' has pending clones".format(snapname)) - self._unprotect_snapshot(snapname) - def _add_snap_clone(self, track_id, snapname): self.metadata_mgr.add_section("clone snaps") self.metadata_mgr.update_section("clone snaps", track_id, snapname) @@ -297,8 +255,6 @@ class SubvolumeV1(SubvolumeBase, SubvolumeTemplate): def attach_snapshot(self, snapname, tgt_subvolume): if not snapname.encode('utf-8') in self.list_snapshots(): raise VolumeException(-errno.ENOENT, "snapshot '{0}' does not exist".format(snapname)) - if not self.is_snapshot_protected(snapname): - raise VolumeException(-errno.EINVAL, "snapshot '{0}' is not protected".format(snapname)) try: create_clone_index(self.fs, self.vol_spec) with open_clone_index(self.fs, self.vol_spec) as index: