From 1c43e5ea99ceeede27f78a827a2276f26c79fc96 Mon Sep 17 00:00:00 2001 From: Pedro Gonzalez Gomez Date: Thu, 4 Jan 2024 23:16:10 +0100 Subject: [PATCH] mgr/dashboard: set bucket policies conflict: /home/pegonzal/ceph/ceph/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/icons.enum.ts - Adds support to set bucket policies through the Dashboard. - Rename rgw bucket policy from 'policy' to 'bucket policy' and tab 'Permissions' to 'Policies' - Fix: hide Tags when none are present on bucket list details and sets bucket form dirty after deleting a tag - Added service to manage the formatting of a textArea that works with json Signed-off-by: Pedro Gonzalez Gomez Fixes: https://tracker.ceph.com/issues/63942 (cherry picked from commit 2817d8e25d84bba47951bd68cb3e8651cdb51b56) --- src/pybind/mgr/dashboard/controllers/rgw.py | 16 +++++-- .../rgw-bucket-details.component.html | 8 ++-- .../rgw-bucket-details.component.ts | 2 +- .../rgw-bucket-form.component.html | 44 ++++++++++++++++++ .../rgw-bucket-form.component.ts | 46 +++++++++++++++++-- .../app/shared/api/rgw-bucket.service.spec.ts | 6 ++- .../src/app/shared/api/rgw-bucket.service.ts | 10 ++-- .../src/app/shared/forms/cd-validators.ts | 12 +++++ .../formly-textarea-type.component.ts | 16 +++---- .../text-area-json-formatter.service.spec.ts | 16 +++++++ .../text-area-json-formatter.service.ts | 21 +++++++++ src/pybind/mgr/dashboard/openapi.yaml | 4 ++ .../mgr/dashboard/services/rgw_client.py | 22 +++++++++ 13 files changed, 196 insertions(+), 27 deletions(-) create mode 100644 src/pybind/mgr/dashboard/frontend/src/app/shared/services/text-area-json-formatter.service.spec.ts create mode 100644 src/pybind/mgr/dashboard/frontend/src/app/shared/services/text-area-json-formatter.service.ts diff --git a/src/pybind/mgr/dashboard/controllers/rgw.py b/src/pybind/mgr/dashboard/controllers/rgw.py index f3653c5bd27b8..f8c37cede699c 100644 --- a/src/pybind/mgr/dashboard/controllers/rgw.py +++ b/src/pybind/mgr/dashboard/controllers/rgw.py @@ -290,6 +290,10 @@ class RgwBucket(RgwRESTController): rgw_client = RgwClient.admin_instance() return rgw_client.get_bucket_policy(bucket) + def _set_policy(self, bucket_name: str, policy: str, daemon_name, owner): + rgw_client = RgwClient.instance(owner, daemon_name) + return rgw_client.set_bucket_policy(bucket_name, policy) + def _set_tags(self, bucket_name, tags, daemon_name, owner): rgw_client = RgwClient.instance(owner, daemon_name) return rgw_client.set_tags(bucket_name, tags) @@ -346,7 +350,7 @@ class RgwBucket(RgwRESTController): result['encryption'] = encryption['Status'] result['versioning'] = versioning['Status'] result['mfa_delete'] = versioning['MfaDelete'] - result['policy'] = self._get_policy(bucket_name) + result['bucket_policy'] = self._get_policy(bucket_name) # Append the locking configuration. locking = self._get_locking(result['owner'], daemon_name, bucket_name) @@ -359,7 +363,8 @@ class RgwBucket(RgwRESTController): lock_enabled='false', lock_mode=None, lock_retention_period_days=None, lock_retention_period_years=None, encryption_state='false', - encryption_type=None, key_id=None, tags=None, daemon_name=None): + encryption_type=None, key_id=None, tags=None, + bucket_policy=None, daemon_name=None): lock_enabled = str_to_bool(lock_enabled) encryption_state = str_to_bool(encryption_state) try: @@ -378,6 +383,9 @@ class RgwBucket(RgwRESTController): if tags: self._set_tags(bucket, tags, daemon_name, uid) + if bucket_policy: + self._set_policy(bucket, bucket_policy, daemon_name, uid) + return result except RequestException as e: # pragma: no cover - handling is too obvious raise DashboardException(e, http_status_code=500, component='rgw') @@ -387,7 +395,7 @@ class RgwBucket(RgwRESTController): encryption_state='false', encryption_type=None, key_id=None, mfa_delete=None, mfa_token_serial=None, mfa_token_pin=None, lock_mode=None, lock_retention_period_days=None, - lock_retention_period_years=None, tags=None, daemon_name=None): + lock_retention_period_years=None, tags=None, bucket_policy=None, daemon_name=None): encryption_state = str_to_bool(encryption_state) # When linking a non-tenant-user owned bucket to a tenanted user, we # need to prefix bucket name with '/'. e.g. photos -> /photos @@ -429,6 +437,8 @@ class RgwBucket(RgwRESTController): self._delete_encryption(bucket_name, daemon_name, uid) if tags: self._set_tags(bucket_name, tags, daemon_name, uid) + if bucket_policy: + self._set_policy(bucket, bucket_policy, daemon_name, uid) return self._append_bid(result) def delete(self, bucket, purge_objects='true', daemon_name=None): 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 e96a89b234f9a..1732a7fb3b4bd 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 @@ -102,7 +102,7 @@ - + Tags @@ -120,15 +120,15 @@ Permissions + i18n>Policies
- + class="bold w-25">Bucket policy +
Policy
{{ selection.policy | json}}
{{ selection.bucket_policy | json}}
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 0ecbe0536dffe..d731a323818ee 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,7 +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) || {}; + this.selection.bucket_policy = JSON.parse(this.selection.bucket_policy) || {}; }); } } diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html index a9704c0bdc89f..eef66a6da60b4 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.html @@ -410,6 +410,50 @@ + + Policies + +
+
+
+ +
+ + Invalid json text +
+ + +
+
+
+
+