From 40f053aee0d3504d34545101a546b3eaf64f50d1 Mon Sep 17 00:00:00 2001 From: Nizamudeen A Date: Tue, 17 Oct 2023 10:04:33 +0530 Subject: [PATCH] mgr/dashboard: get object bucket policies for a bucket Getting the bucket details will also fetch the bucket policy if its set. Fixes: https://tracker.ceph.com/issues/63221 Signed-off-by: Nizamudeen A --- src/pybind/mgr/dashboard/controllers/rgw.py | 5 + .../rgw-bucket-details.component.html | 211 ++++++++++-------- .../rgw-bucket-details.component.spec.ts | 3 +- .../rgw-bucket-details.component.ts | 1 + .../mgr/dashboard/services/rgw_client.py | 21 ++ 5 files changed, 150 insertions(+), 91 deletions(-) diff --git a/src/pybind/mgr/dashboard/controllers/rgw.py b/src/pybind/mgr/dashboard/controllers/rgw.py index 65c809ebec02d..f7b9ed8ecf37f 100644 --- a/src/pybind/mgr/dashboard/controllers/rgw.py +++ b/src/pybind/mgr/dashboard/controllers/rgw.py @@ -276,6 +276,10 @@ class RgwBucket(RgwRESTController): retention_period_days, retention_period_years) + def _get_policy(self, bucket: str): + rgw_client = RgwClient.admin_instance() + return rgw_client.get_bucket_policy(bucket) + @staticmethod def strip_tenant_from_bucket_name(bucket_name): # type (str) -> str @@ -328,6 +332,7 @@ class RgwBucket(RgwRESTController): result['encryption'] = encryption['Status'] result['versioning'] = versioning['Status'] result['mfa_delete'] = versioning['MfaDelete'] + result['policy'] = self._get_policy(bucket_name) # Append the locking configuration. locking = self._get_locking(result['owner'], daemon_name, bucket_name) diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.html b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.html index c947e4490625b..f2447feab2642 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.html +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.html @@ -1,94 +1,125 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Versioning{{ selection.versioning }}
Encryption{{ selection.encryption }}
MFA Delete{{ selection.mfa_delete }}
Index type{{ selection.index_type }}
Placement rule{{ selection.placement_rule }}
Last modification time{{ selection.mtime | cdDate }}
+ + +
diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.spec.ts index 59f62952a5075..be6aa09182ca6 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.spec.ts @@ -8,6 +8,7 @@ import { CdTableSelection } from '~/app/shared/models/cd-table-selection'; import { SharedModule } from '~/app/shared/shared.module'; import { configureTestBed } from '~/testing/unit-test-helper'; import { RgwBucketDetailsComponent } from './rgw-bucket-details.component'; +import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; describe('RgwBucketDetailsComponent', () => { let component: RgwBucketDetailsComponent; @@ -17,7 +18,7 @@ describe('RgwBucketDetailsComponent', () => { configureTestBed({ declarations: [RgwBucketDetailsComponent], - imports: [SharedModule, HttpClientTestingModule] + imports: [SharedModule, HttpClientTestingModule, NgbNavModule] }); beforeEach(() => { diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.ts index f9a351367daad..0ecbe0536dffe 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.ts @@ -18,6 +18,7 @@ export class RgwBucketDetailsComponent implements OnChanges { this.rgwBucketService.get(this.selection.bid).subscribe((bucket: object) => { bucket['lock_retention_period_days'] = this.rgwBucketService.getLockDays(bucket); this.selection = bucket; + this.selection.policy = JSON.parse(this.selection.policy) || {}; }); } } diff --git a/src/pybind/mgr/dashboard/services/rgw_client.py b/src/pybind/mgr/dashboard/services/rgw_client.py index 20c0397458b21..2d3226bab3e00 100644 --- a/src/pybind/mgr/dashboard/services/rgw_client.py +++ b/src/pybind/mgr/dashboard/services/rgw_client.py @@ -852,6 +852,27 @@ class RgwClient(RestClient): f' For more information about the format look at {link}') raise DashboardException(msg=msg, component='rgw') + @RestClient.api_get('/{bucket_name}?policy') + def get_bucket_policy(self, bucket_name: str, request=None): + """ + Gets the bucket policy for a bucket. + :param bucket_name: The name of the bucket. + :type bucket_name: str + :rtype: None + """ + # pylint: disable=unused-argument + + try: + request = request() + return request + except RequestException as e: + if e.content: + content = json_str_to_object(e.content) + if content.get( + 'Code') == 'NoSuchBucketPolicy': + return None + raise e + def perform_validations(self, retention_period_days, retention_period_years, mode): try: retention_period_days = int(retention_period_days) if retention_period_days else 0 -- 2.39.5