]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/volumes: give useful error message
authorRamana Raja <rraja@redhat.com>
Tue, 20 Aug 2019 10:55:11 +0000 (16:25 +0530)
committerRamana Raja <rraja@redhat.com>
Fri, 20 Sep 2019 09:36:24 +0000 (15:06 +0530)
... when creating FS subvolume or subvolume group with invalid
data pool layout.

Fixes: https://tracker.ceph.com/issues/41337
Signed-off-by: Ramana Raja <rraja@redhat.com>
(cherry picked from commit cbe48308e9e6b7e1b673e11101fd7e1403f52019)

qa/tasks/cephfs/test_volumes.py
src/pybind/mgr/volumes/fs/subvolume.py

index eb94251cab9a35836eb09485d9858667bf9be21f..c7dd3997d81c006a100699df979b83ea78cb45df 100644 (file)
@@ -132,6 +132,20 @@ class TestVolumes(CephFSTestCase):
         # verify trash dir is clean
         self._wait_for_trash_empty()
 
+    def test_subvolume_create_with_invalid_data_pool_layout(self):
+        subvolume = self._generate_random_subvolume_name()
+        data_pool = "invalid_pool"
+        # create subvolume with invalid data pool layout
+        try:
+            self._fs_cmd("subvolume", "create", self.volname, subvolume, "--pool_layout", data_pool)
+        except CommandFailedError as ce:
+            if ce.exitstatus != errno.EINVAL:
+                raise
+        else:
+            raise
+        # clean up
+        self._fs_cmd("subvolume", "rm", self.volname, subvolume, "--force")
+
     def test_nonexistent_subvolume_rm(self):
         # remove non-existing subvolume
         subvolume = "non_existent_subvolume"
@@ -221,6 +235,20 @@ class TestVolumes(CephFSTestCase):
         self._fs_cmd("subvolumegroup", "rm", self.volname, group1)
         self._fs_cmd("subvolumegroup", "rm", self.volname, group2)
 
+    def test_subvolume_group_create_with_invalid_data_pool_layout(self):
+        group = self._generate_random_group_name()
+        data_pool = "invalid_pool"
+        # create group with invalid data pool layout
+        try:
+            self._fs_cmd("subvolumegroup", "create", self.volname, group, "--pool_layout", data_pool)
+        except CommandFailedError as ce:
+            if ce.exitstatus != errno.EINVAL:
+                raise
+        else:
+            raise
+        # clean up
+        self._fs_cmd("subvolumegroup", "rm", self.volname, group, "--force")
+
     def test_subvolume_create_with_desired_data_pool_layout_in_group(self):
         subvol1 = self._generate_random_subvolume_name()
         subvol2 = self._generate_random_subvolume_name()
index 6d0232c56e1febdfbe645514a9d539a1af710658..75fab056d4dd82211fe3a19f85e1dd6cad53761d 100644 (file)
@@ -79,7 +79,11 @@ class SubVolume(object):
             self.fs.setxattr(subvolpath, 'ceph.quota.max_bytes', str(size).encode('utf-8'), 0)
 
         if pool:
-            self.fs.setxattr(subvolpath, 'ceph.dir.layout.pool', pool.encode('utf-8'), 0)
+            try:
+                self.fs.setxattr(subvolpath, 'ceph.dir.layout.pool', pool.encode('utf-8'), 0)
+            except cephfs.InvalidValue:
+                raise VolumeException(-errno.EINVAL,
+                                      "Invalid pool layout '{0}'. It must be a valid data pool".format(pool))
 
         xattr_key = xattr_val = None
         if namespace_isolated:
@@ -179,7 +183,11 @@ class SubVolume(object):
         self.fs.mkdirs(path, mode)
         if not pool:
             pool = self._get_ancestor_xattr(path, "ceph.dir.layout.pool")
-        self.fs.setxattr(path, 'ceph.dir.layout.pool', pool.encode('utf-8'), 0)
+        try:
+            self.fs.setxattr(path, 'ceph.dir.layout.pool', pool.encode('utf-8'), 0)
+        except cephfs.InvalidValue:
+            raise VolumeException(-errno.EINVAL,
+                                  "Invalid pool layout '{0}'. It must be a valid data pool".format(pool))
 
     def remove_group(self, spec, force):
         path = spec.group_path