From: Nizamudeen A Date: Fri, 7 Jun 2024 13:22:19 +0000 (+0530) Subject: mgr/dashboard: edit replication policy X-Git-Tag: v19.1.1~133^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=9451ae875ff484d74fa5eb35c73126adbb558ecf;p=ceph.git mgr/dashboard: edit replication policy Fixes: https://tracker.ceph.com/issues/66240 Signed-off-by: Nizamudeen A (cherry picked from commit ae5ae5be6146a8254554fa9dcdd2322ea90d0d7b) --- diff --git a/src/pybind/mgr/dashboard/controllers/rgw.py b/src/pybind/mgr/dashboard/controllers/rgw.py index d0831239fbb40..5d2e00bd93e01 100644 --- a/src/pybind/mgr/dashboard/controllers/rgw.py +++ b/src/pybind/mgr/dashboard/controllers/rgw.py @@ -401,16 +401,21 @@ class RgwBucket(RgwRESTController): def _set_replication(self, bucket_name: str, replication: bool, owner, daemon_name): multisite = RgwMultisite() + # return immediately if the multisite is not configured + if not multisite.get_multisite_status(): + return None + rgw_client = RgwClient.instance(owner, daemon_name) zonegroup_name = RgwClient.admin_instance(daemon_name=daemon_name).get_default_zonegroup() policy_exists = multisite.policy_group_exists(_SYNC_GROUP_ID, zonegroup_name) if replication and not policy_exists: multisite.create_dashboard_admin_sync_group(zonegroup_name=zonegroup_name) + return rgw_client.set_bucket_replication(bucket_name, replication) - def _get_replication(self, bucket_name: str): - rgw_client = RgwClient.admin_instance() + def _get_replication(self, bucket_name: str, owner, daemon_name): + rgw_client = RgwClient.instance(owner, daemon_name) return rgw_client.get_bucket_replication(bucket_name) @staticmethod @@ -467,7 +472,7 @@ class RgwBucket(RgwRESTController): result['mfa_delete'] = versioning['MfaDelete'] result['bucket_policy'] = self._get_policy(bucket_name) result['acl'] = self._get_acl(bucket_name, daemon_name, result['owner']) - result['replication'] = self._get_replication(bucket_name) + result['replication'] = self._get_replication(bucket_name, result['owner'], daemon_name) # Append the locking configuration. locking = self._get_locking(result['owner'], daemon_name, bucket_name) @@ -520,8 +525,10 @@ class RgwBucket(RgwRESTController): 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, bucket_policy=None, - canned_acl=None, daemon_name=None): + canned_acl=None, replication=None, daemon_name=None): encryption_state = str_to_bool(encryption_state) + if replication is not None: + replication = str_to_bool(replication) # 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: @@ -566,6 +573,8 @@ class RgwBucket(RgwRESTController): self._set_policy(bucket_name, bucket_policy, daemon_name, uid) if canned_acl: self._set_acl(bucket_name, canned_acl, uid, daemon_name) + if replication is not None: + self._set_replication(bucket_name, replication, uid, daemon_name) 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.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-details/rgw-bucket-details.component.ts index 1a709f8644f00..c88b6f2cd0b5d 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 @@ -24,8 +24,9 @@ export class RgwBucketDetailsComponent implements OnChanges { bucket['lock_retention_period_days'] = this.rgwBucketService.getLockDays(bucket); this.selection = bucket; this.aclPermissions = this.parseXmlAcl(this.selection.acl, this.selection.owner); - if (this.selection.replication?.['Rule']?.['Status']) + if (this.selection.replication?.['Rule']?.['Status']) { this.replicationStatus = this.selection.replication?.['Rule']?.['Status']; + } }); } } 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 87dbee26dc2e6..563237036f650 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 @@ -411,15 +411,6 @@
- Multi-site needs to be configured on the current realm or you need to be on - the default zonegroup to enable replication. - - diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts index 7b92dfb964cbd..8b7ac374c0aa7 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-form/rgw-bucket-form.component.ts @@ -326,7 +326,8 @@ export class RgwBucketFormComponent extends CdForm implements OnInit, AfterViewC values['lock_retention_period_days'], xmlStrTags, bucketPolicy, - cannedAcl + cannedAcl, + values['replication'] ) .subscribe( () => { diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.spec.ts index f930af6cba3cf..533d04628ee31 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.spec.ts @@ -89,11 +89,12 @@ describe('RgwBucketService', () => { '10', null, null, - 'private' + 'private', + 'true' ) .subscribe(); const req = httpTesting.expectOne( - `api/rgw/bucket/foo?${RgwHelper.DAEMON_QUERY_PARAM}&bucket_id=bar&uid=baz&versioning_state=Enabled&encryption_state=true&encryption_type=aws%253Akms&key_id=qwerty1&mfa_delete=Enabled&mfa_token_serial=1&mfa_token_pin=223344&lock_mode=GOVERNANCE&lock_retention_period_days=10&tags=null&bucket_policy=null&canned_acl=private` + `api/rgw/bucket/foo?${RgwHelper.DAEMON_QUERY_PARAM}&bucket_id=bar&uid=baz&versioning_state=Enabled&encryption_state=true&encryption_type=aws%253Akms&key_id=qwerty1&mfa_delete=Enabled&mfa_token_serial=1&mfa_token_pin=223344&lock_mode=GOVERNANCE&lock_retention_period_days=10&tags=null&bucket_policy=null&canned_acl=private&replication=true` ); expect(req.request.method).toBe('PUT'); }); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.ts index 8c9a9bacf4d44..2bf85e70512e5 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-bucket.service.ts @@ -108,7 +108,8 @@ export class RgwBucketService extends ApiClient { lockRetentionPeriodDays: string, tags: string, bucketPolicy: string, - cannedAcl: string + cannedAcl: string, + replication: string ) { return this.rgwDaemonService.request((params: HttpParams) => { params = params.appendAll({ @@ -125,7 +126,8 @@ export class RgwBucketService extends ApiClient { lock_retention_period_days: lockRetentionPeriodDays, tags: tags, bucket_policy: bucketPolicy, - canned_acl: cannedAcl + canned_acl: cannedAcl, + replication: replication }); return this.http.put(`${this.url}/${bucket}`, null, { params: params }); }); diff --git a/src/pybind/mgr/dashboard/openapi.yaml b/src/pybind/mgr/dashboard/openapi.yaml index 12e1ed5ec232b..7593bbe5fc255 100644 --- a/src/pybind/mgr/dashboard/openapi.yaml +++ b/src/pybind/mgr/dashboard/openapi.yaml @@ -10533,6 +10533,8 @@ paths: type: string mfa_token_serial: type: string + replication: + type: string tags: type: string uid: