]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: fix error when linking a bucket to a tenanted user 30123/head
authorKiefer Chang <kiefer.chang@suse.com>
Tue, 3 Sep 2019 09:15:05 +0000 (17:15 +0800)
committerKiefer Chang <kiefer.chang@suse.com>
Thu, 19 Sep 2019 06:20:51 +0000 (14:20 +0800)
- Prefix bucket name with '/' when linking bucket to a tenanted user
- Add qa tests

Fixes: https://tracker.ceph.com/issues/41611
Signed-off-by: Kiefer Chang <kiefer.chang@suse.com>
qa/tasks/mgr/dashboard/test_rgw.py
src/pybind/mgr/dashboard/controllers/rgw.py

index 5ca09e09a2f3424c16ae2f1b9ba1a6c7cdfa85a9..ad6b4b8cad7f5ef6ea20118e92d52f260a0b8c07 100644 (file)
@@ -220,22 +220,27 @@ class RgwBucketTest(RgwTestCase):
         self.assertEqual(len(data), 1)
         self.assertIn('testx/teuth-test-bucket', data)
 
+        def _verify_tenant_bucket(bucket, tenant, uid):
+            full_bucket_name = '{}/{}'.format(tenant, bucket)
+            _data = self._get('/api/rgw/bucket/{}'.format(
+                urllib.quote_plus(full_bucket_name)))
+            self.assertStatus(200)
+            self.assertSchema(_data, JObj(sub_elems={
+                'owner': JLeaf(str),
+                'bucket': JLeaf(str),
+                'tenant': JLeaf(str),
+                'bid': JLeaf(str)
+            }, allow_unknown=True))
+            self.assertEqual(_data['owner'], '{}${}'.format(tenant, uid))
+            self.assertEqual(_data['bucket'], bucket)
+            self.assertEqual(_data['tenant'], tenant)
+            self.assertEqual(_data['bid'], full_bucket_name)
+            return _data
+
         # Get the bucket.
-        data = self._get('/api/rgw/bucket/{}'.format(
-            urllib.quote_plus('testx/teuth-test-bucket')))
-        self.assertStatus(200)
-        self.assertSchema(data, JObj(sub_elems={
-            'owner': JLeaf(str),
-            'bucket': JLeaf(str),
-            'tenant': JLeaf(str),
-            'bid': JLeaf(str)
-        }, allow_unknown=True))
-        self.assertEqual(data['owner'], 'testx$teuth-test-user')
-        self.assertEqual(data['bucket'], 'teuth-test-bucket')
-        self.assertEqual(data['tenant'], 'testx')
-        self.assertEqual(data['bid'], 'testx/teuth-test-bucket')
+        data = _verify_tenant_bucket('teuth-test-bucket', 'testx', 'teuth-test-user')
 
-        # Update the bucket.
+        # Change owner to a non-tenanted user
         self._put(
             '/api/rgw/bucket/{}'.format(
                 urllib.quote_plus('testx/teuth-test-bucket')),
@@ -250,10 +255,22 @@ class RgwBucketTest(RgwTestCase):
         self.assertIn('owner', data)
         self.assertEqual(data['owner'], 'admin')
         self.assertEqual(data['tenant'], '')
+        self.assertEqual(data['bucket'], 'teuth-test-bucket')
+        self.assertEqual(data['bid'], 'teuth-test-bucket')
+
+        # Change owner back to tenanted user
+        self._put(
+            '/api/rgw/bucket/teuth-test-bucket',
+            params={
+                'bucket_id': data['id'],
+                'uid': 'testx$teuth-test-user'
+            })
+        self.assertStatus(200)
+        data = _verify_tenant_bucket('teuth-test-bucket', 'testx', 'teuth-test-user')
 
         # Delete the bucket.
         self._delete('/api/rgw/bucket/{}'.format(
-            urllib.quote_plus('teuth-test-bucket')))
+            urllib.quote_plus('testx/teuth-test-bucket')))
         self.assertStatus(204)
         data = self._get('/api/rgw/bucket')
         self.assertStatus(200)
index c5a0c1004985d183dc7942e38f051bc1854e71a0..e355503780f231b4c674e7a48d50efba475ee309 100644 (file)
@@ -152,6 +152,10 @@ class RgwBucket(RgwRESTController):
             raise DashboardException(e, http_status_code=500, component='rgw')
 
     def set(self, bucket, bucket_id, uid):
+        # When linking a non-tenant-user owned bucket to a tenanted user, we
+        # need to prefix bucket name with '/'. e.g. photos -> /photos
+        if '$' in uid and '/' not in bucket:
+            bucket = '/{}'.format(bucket)
         result = self.proxy('PUT', 'bucket', {
             'bucket': bucket,
             'bucket-id': bucket_id,