From: Aashish Sharma Date: Thu, 18 Sep 2025 10:59:52 +0000 (+0530) Subject: mgr/dashboard: fix zone update API forcing STANDARD storage class X-Git-Tag: testing/wip-jcollin-testing-20250926.150239-reef~5^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=3e6ea48bde3dd7e63452f4f944dfcbf966b4b7f2;p=ceph-ci.git mgr/dashboard: fix zone update API forcing STANDARD storage class The zone update REST API (`edit_zone`) always attempted to configure a placement target for the `STANDARD` storage class, even when the request was intended for a different storage class name. This caused failures in deployments where `STANDARD` is not defined. Changes: Club add placement target and add storage class methods into one single add_placement_targets_storage_class_zone method which takes the storage class as a param as well alongside the rest of the placement params. Fixes: https://tracker.ceph.com/issues/73105 Signed-off-by: Aashish Sharma (cherry picked from commit 135f3adb4973be493925839e946e7a5fc75e7d5c) --- diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zone-form/rgw-multisite-zone-form.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zone-form/rgw-multisite-zone-form.component.ts index 32f8508eeff..a27a8521a6c 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zone-form/rgw-multisite-zone-form.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zone-form/rgw-multisite-zone-form.component.ts @@ -196,17 +196,12 @@ export class RgwMultisiteZoneFormComponent implements OnInit { key, value })); - let placementDataPool = storageClasses['STANDARD'] - ? storageClasses['STANDARD']['data_pool'] - : ''; let placementIndexPool = plc_pool.val.index_pool; let placementDataExtraPool = plc_pool.val.data_extra_pool; - this.poolList.push({ poolname: placementDataPool }); this.poolList.push({ poolname: placementIndexPool }); this.poolList.push({ poolname: placementDataExtraPool }); this.multisiteZoneForm.get('storageClass').setValue(this.storageClassList[0]['key']); this.getStorageClassData(this.storageClassList[0]['key']); - this.multisiteZoneForm.get('placementDataPool').setValue(placementDataPool); this.multisiteZoneForm.get('placementIndexPool').setValue(placementIndexPool); this.multisiteZoneForm.get('placementDataExtraPool').setValue(placementDataExtraPool); } @@ -217,10 +212,10 @@ export class RgwMultisiteZoneFormComponent implements OnInit { getStorageClassData(storageClass: string) { let storageClassSelected = this.storageClassList.find((sc) => sc['key'] === storageClass); - this.poolList.push({ poolname: storageClassSelected['value']['data_pool'] }); - this.multisiteZoneForm - .get('storageDataPool') - .setValue(storageClassSelected['value']['data_pool']); + let dataPoolName = storageClassSelected['value']['data_pool']; + this.poolList.push({ poolname: dataPoolName }); + this.multisiteZoneForm.get('storageDataPool').setValue(dataPoolName); + this.multisiteZoneForm.get('placementDataPool').setValue(dataPoolName); this.multisiteZoneForm .get('storageCompression') .setValue(storageClassSelected['value']['compression_type']); diff --git a/src/pybind/mgr/dashboard/services/rgw_client.py b/src/pybind/mgr/dashboard/services/rgw_client.py index 2cd92177d1c..f3ca08543af 100644 --- a/src/pybind/mgr/dashboard/services/rgw_client.py +++ b/src/pybind/mgr/dashboard/services/rgw_client.py @@ -1473,60 +1473,61 @@ class RgwMultisite: raise DashboardException(error, http_status_code=500, component='rgw') self.update_period() - def add_placement_targets_zone(self, zone_name: str, placement_target: str, data_pool: str, - index_pool: str, data_extra_pool: str): + def add_placement_targets_storage_class_zone(self, zone_name: str, placement_target: str, + data_pool: str, index_pool: str, + data_extra_pool: str, storage_class: str, + data_pool_class: str, compression: str): rgw_zone_add_placement_cmd = ['zone', 'placement', 'add', '--rgw-zone', zone_name, - '--placement-id', placement_target, '--data-pool', data_pool, + '--placement-id', placement_target, + '--data-pool', data_pool, '--index-pool', index_pool, - '--data-extra-pool', data_extra_pool] - try: - exit_code, _, err = mgr.send_rgwadmin_command(rgw_zone_add_placement_cmd) - if exit_code > 0: - raise DashboardException(e=err, msg='Unable to add placement target {} to zone {}'.format(placement_target, zone_name), # noqa E501 #pylint: disable=line-too-long - http_status_code=500, component='rgw') - except SubprocessError as error: - raise DashboardException(error, http_status_code=500, component='rgw') - self.update_period() + '--data-extra-pool', data_extra_pool, + '--storage-class', storage_class, + '--data-pool', data_pool_class] - def add_storage_class_zone(self, zone_name: str, placement_target: str, storage_class: str, - data_pool: str, compression: str): - rgw_zone_add_storage_class_cmd = ['zone', 'placement', 'add', '--rgw-zone', zone_name, - '--placement-id', placement_target, - '--storage-class', storage_class, - '--data-pool', data_pool] if compression: - rgw_zone_add_storage_class_cmd.extend(['--compression', compression]) + rgw_zone_add_placement_cmd.extend(['--compression', compression]) + try: - exit_code, _, err = mgr.send_rgwadmin_command(rgw_zone_add_storage_class_cmd) + exit_code, _, err = mgr.send_rgwadmin_command(rgw_zone_add_placement_cmd) if exit_code > 0: - raise DashboardException(e=err, msg='Unable to add storage class {} to zone {}'.format(storage_class, zone_name), # noqa E501 #pylint: disable=line-too-long - http_status_code=500, component='rgw') + raise DashboardException( + e=err, + msg='Unable to add placement target {} to \ + zone {}'.format(placement_target, zone_name), + http_status_code=500, + component='rgw' + ) except SubprocessError as error: raise DashboardException(error, http_status_code=500, component='rgw') self.update_period() - def edit_zone(self, zone_name: str, new_zone_name: str, zonegroup_name: str, default: str = '', - master: str = '', endpoints: str = '', access_key: str = '', secret_key: str = '', - placement_target: str = '', data_pool: str = '', index_pool: str = '', - data_extra_pool: str = '', storage_class: str = '', data_pool_class: str = '', - compression: str = ''): + def edit_zone(self, zone_name: str, new_zone_name: str, zonegroup_name: str, + default: str = '', master: str = '', endpoints: str = '', + access_key: str = '', secret_key: str = '', placement_target: str = '', + data_pool: str = '', index_pool: str = '', data_extra_pool: str = '', + storage_class: str = '', data_pool_class: str = '', compression: str = ''): if new_zone_name != zone_name: rgw_zone_rename_cmd = ['zone', 'rename', '--rgw-zone', zone_name, '--zone-new-name', new_zone_name] try: exit_code, _, err = mgr.send_rgwadmin_command(rgw_zone_rename_cmd, False) if exit_code > 0: - raise DashboardException(e=err, msg='Unable to rename zone to {}'.format(new_zone_name), # noqa E501 #pylint: disable=line-too-long - http_status_code=500, component='rgw') + raise DashboardException( + e=err, msg='Unable to rename zone to {}'.format(new_zone_name), + http_status_code=500, component='rgw') except SubprocessError as error: raise DashboardException(error, http_status_code=500, component='rgw') self.update_period() self.modify_zone(new_zone_name, zonegroup_name, default, master, endpoints, access_key, secret_key) - self.add_placement_targets_zone(new_zone_name, placement_target, - data_pool, index_pool, data_extra_pool) - self.add_storage_class_zone(new_zone_name, placement_target, storage_class, - data_pool_class, compression) + + if placement_target: + self.add_placement_targets_storage_class_zone( + new_zone_name, placement_target, + data_pool, index_pool, + data_extra_pool, storage_class, + data_pool_class, compression) def list_zones(self): rgw_zone_list = {}