From 7866c5fc8f62e45964ac595b9f0f0a36206d729e Mon Sep 17 00:00:00 2001 From: Kiefer Chang Date: Tue, 3 Sep 2019 17:15:05 +0800 Subject: [PATCH] mgr/dashboard: fix error when linking a bucket to a tenanted user - 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 --- qa/tasks/mgr/dashboard/test_rgw.py | 47 ++++++++++++++------- src/pybind/mgr/dashboard/controllers/rgw.py | 4 ++ 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/qa/tasks/mgr/dashboard/test_rgw.py b/qa/tasks/mgr/dashboard/test_rgw.py index 5ca09e09a2f34..ad6b4b8cad7f5 100644 --- a/qa/tasks/mgr/dashboard/test_rgw.py +++ b/qa/tasks/mgr/dashboard/test_rgw.py @@ -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) diff --git a/src/pybind/mgr/dashboard/controllers/rgw.py b/src/pybind/mgr/dashboard/controllers/rgw.py index c5a0c1004985d..e355503780f23 100644 --- a/src/pybind/mgr/dashboard/controllers/rgw.py +++ b/src/pybind/mgr/dashboard/controllers/rgw.py @@ -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, -- 2.39.5