X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Fpybind%2Fmgr%2Fvolumes%2Ffs%2Fvolume.py;h=8edaca6def12901b414b7db66c6efeb2efbba153;hb=f6b5b4d738b87d88d2de35127b6b0e41eae2a272;hp=a6ff65d4295fd51cd070a033be2e776babce8c67;hpb=12732ca2e80d168d344a265acffc1fbd1fa1f1b5;p=ceph.git diff --git a/ceph/src/pybind/mgr/volumes/fs/volume.py b/ceph/src/pybind/mgr/volumes/fs/volume.py index a6ff65d42..8edaca6de 100644 --- a/ceph/src/pybind/mgr/volumes/fs/volume.py +++ b/ceph/src/pybind/mgr/volumes/fs/volume.py @@ -8,7 +8,7 @@ import cephfs from .fs_util import listdir from .operations.volume import ConnectionPool, open_volume, create_volume, \ - delete_volume, list_volumes + delete_volume, list_volumes, get_pool_names from .operations.group import open_group, create_group, remove_group from .operations.subvolume import open_subvol, create_subvol, remove_subvol, \ create_clone @@ -98,9 +98,24 @@ class VolumeClient(object): "that is what you want, re-issue the command followed by " \ "--yes-i-really-mean-it.".format(volname) + ret, out, err = self.mgr.check_mon_command({ + 'prefix': 'config get', + 'key': 'mon_allow_pool_delete', + 'who': 'mon', + 'format': 'json', + }) + mon_allow_pool_delete = json.loads(out) + if not mon_allow_pool_delete: + return -errno.EPERM, "", "pool deletion is disabled; you must first " \ + "set the mon_allow_pool_delete config option to true before volumes " \ + "can be deleted" + + metadata_pool, data_pools = get_pool_names(self.mgr, volname) + if not metadata_pool: + return -errno.ENOENT, "", "volume {0} doesn't exist".format(volname) self.purge_queue.cancel_jobs(volname) self.connection_pool.del_fs_handle(volname, wait=True) - return delete_volume(self.mgr, volname) + return delete_volume(self.mgr, volname, metadata_pool, data_pools) def list_fs_volumes(self): if self.stopping.is_set(): @@ -203,6 +218,24 @@ class VolumeClient(object): ret = self.volume_exception_to_retval(ve) return ret + def subvolume_pin(self, **kwargs): + ret = 0, "", "" + volname = kwargs['vol_name'] + subvolname = kwargs['sub_name'] + pin_type = kwargs['pin_type'] + pin_setting = kwargs['pin_setting'] + groupname = kwargs['group_name'] + + try: + with open_volume(self, volname) as fs_handle: + with open_group(fs_handle, self.volspec, groupname) as group: + with open_subvol(fs_handle, self.volspec, group, subvolname) as subvolume: + subvolume.pin(pin_type, pin_setting) + ret = 0, json.dumps({}), "" + except VolumeException as ve: + ret = self.volume_exception_to_retval(ve) + return ret + def subvolume_getpath(self, **kwargs): ret = None volname = kwargs['vol_name'] @@ -326,33 +359,31 @@ class VolumeClient(object): return ret def protect_subvolume_snapshot(self, **kwargs): - ret = 0, "", "" + ret = 0, "", "Deprecation warning: 'snapshot protect' call is deprecated and will be removed in a future release" volname = kwargs['vol_name'] subvolname = kwargs['sub_name'] - snapname = kwargs['snap_name'] groupname = kwargs['group_name'] try: with open_volume(self, volname) as fs_handle: with open_group(fs_handle, self.volspec, groupname) as group: with open_subvol(fs_handle, self.volspec, group, subvolname) as subvolume: - subvolume.protect_snapshot(snapname) + log.warning("snapshot protect call is deprecated and will be removed in a future release") except VolumeException as ve: ret = self.volume_exception_to_retval(ve) return ret def unprotect_subvolume_snapshot(self, **kwargs): - ret = 0, "", "" + ret = 0, "", "Deprecation warning: 'snapshot unprotect' call is deprecated and will be removed in a future release" volname = kwargs['vol_name'] subvolname = kwargs['sub_name'] - snapname = kwargs['snap_name'] groupname = kwargs['group_name'] try: with open_volume(self, volname) as fs_handle: with open_group(fs_handle, self.volspec, groupname) as group: with open_subvol(fs_handle, self.volspec, group, subvolname) as subvolume: - subvolume.unprotect_snapshot(snapname) + log.warning("snapshot unprotect call is deprecated and will be removed in a future release") except VolumeException as ve: ret = self.volume_exception_to_retval(ve) return ret @@ -379,8 +410,6 @@ class VolumeClient(object): if not snapname.encode('utf-8') in subvolume.list_snapshots(): raise VolumeException(-errno.ENOENT, "snapshot '{0}' does not exist".format(snapname)) - if not subvolume.is_snapshot_protected(snapname): - raise VolumeException(-errno.EINVAL, "snapshot '{0}' is not protected".format(snapname)) # TODO: when the target group is same as source, reuse group object. with open_group(fs_handle, self.volspec, target_groupname) as target_group: @@ -502,6 +531,22 @@ class VolumeClient(object): ret = self.volume_exception_to_retval(ve) return ret + def pin_subvolume_group(self, **kwargs): + ret = 0, "", "" + volname = kwargs['vol_name'] + groupname = kwargs['group_name'] + pin_type = kwargs['pin_type'] + pin_setting = kwargs['pin_setting'] + + try: + with open_volume(self, volname) as fs_handle: + with open_group(fs_handle, self.volspec, groupname) as group: + group.pin(pin_type, pin_setting) + ret = 0, json.dumps({}), "" + except VolumeException as ve: + ret = self.volume_exception_to_retval(ve) + return ret + ### group snapshot def create_subvolume_group_snapshot(self, **kwargs):