]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/dashboard: fix zone update API forcing STANDARD storage class
authorAashish Sharma <Aashish.Sharma1@ibm.com>
Thu, 18 Sep 2025 10:59:52 +0000 (16:29 +0530)
committerAashish Sharma <Aashish.Sharma1@ibm.com>
Mon, 22 Sep 2025 12:18:20 +0000 (17:48 +0530)
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 <aasharma@redhat.com>
(cherry picked from commit 135f3adb4973be493925839e946e7a5fc75e7d5c)

src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zone-form/rgw-multisite-zone-form.component.ts
src/pybind/mgr/dashboard/services/rgw_client.py

index 32f8508eeff8e1ef761443919f2926e235447cff..a27a8521a6c98c87a0fb90216f5aec4ebdcd84a7 100644 (file)
@@ -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']);
index 2cd92177d1c91fd8145cec65914c17475e8f4e58..f3ca08543af0af3dc7d11e528d4a08492e7c5cbb 100644 (file)
@@ -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 = {}