]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/dashboard: allow deletion of non-default zone and zonegroup
authorAashish Sharma <Aashish.Sharma1@ibm.com>
Tue, 4 Nov 2025 08:49:03 +0000 (14:19 +0530)
committerAashish Sharma <Aashish.Sharma1@ibm.com>
Tue, 11 Nov 2025 10:24:21 +0000 (15:54 +0530)
Fixes: https://tracker.ceph.com/issues/73708
Signed-off-by: Aashish Sharma <aasharma@redhat.com>
src/pybind/mgr/dashboard/controllers/rgw.py
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-multisite-zone-deletion-form/rgw-multisite-zone-deletion-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/models/rgw-multisite-zonegroup-deletion-form/rgw-multisite-zonegroup-deletion-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-zone.service.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-zonegroup.service.ts
src/pybind/mgr/dashboard/openapi.yaml
src/pybind/mgr/dashboard/services/rgw_client.py

index c9eb6badd30e405877a02c7e9e126b865c282e6b..1b9d9fa36de779d6a6e01af11e0d1d033087329c 100755 (executable)
@@ -1459,12 +1459,14 @@ class RgwZonegroup(RESTController):
         result = multisite_instance.get_all_zonegroups_info()
         return result
 
-    def delete(self, zonegroup_name, delete_pools, pools: Optional[List[str]] = None):
+    def delete(self, zonegroup_name, delete_pools, pools: Optional[List[str]] = None,
+               realm_name: Optional[str] = None):
         if pools is None:
             pools = []
         try:
             multisite_instance = RgwMultisite()
-            result = multisite_instance.delete_zonegroup(zonegroup_name, delete_pools, pools)
+            result = multisite_instance.delete_zonegroup(zonegroup_name, delete_pools,
+                                                         pools, realm_name)
             return result
         except NoRgwDaemonsException as e:
             raise DashboardException(e, http_status_code=404, component='rgw')
@@ -1516,14 +1518,16 @@ class RgwZone(RESTController):
         return result
 
     def delete(self, zone_name, delete_pools, pools: Optional[List[str]] = None,
-               zonegroup_name=None):
+               zonegroup_name=None, realm_name: Optional[str] = None):
         if pools is None:
             pools = []
         if zonegroup_name is None:
             zonegroup_name = ''
         try:
             multisite_instance = RgwMultisite()
-            result = multisite_instance.delete_zone(zone_name, delete_pools, pools, zonegroup_name)
+            result = multisite_instance.delete_zone(zone_name, delete_pools,
+                                                    pools, zonegroup_name,
+                                                    realm_name)
             return result
         except NoRgwDaemonsException as e:
             raise DashboardException(e, http_status_code=404, component='rgw')
index 44e832d393388e3233b4aca9f83151e9d654b8d5..c23eaf3dfcfc88f686aa4575d0cfc1e6adcbde33 100644 (file)
@@ -48,7 +48,13 @@ export class RgwMultisiteZoneDeletionFormComponent implements OnInit, AfterViewI
 
   submit() {
     this.rgwZoneService
-      .delete(this.zone.name, this.zoneForm.value.deletePools, this.includedPools, this.zone.parent)
+      .delete(
+        this.zone.name,
+        this.zoneForm.value.deletePools,
+        this.includedPools,
+        this.zone.parent,
+        this.zone.second_parent
+      )
       .subscribe(
         () => {
           this.notificationService.show(
index f96ec0ccffa7fd3c9bc3e0f7bc524f156d9d476b..247c6398e388f460efd94e29f9d65b98aab99f28 100644 (file)
@@ -52,7 +52,12 @@ export class RgwMultisiteZonegroupDeletionFormComponent implements OnInit, After
 
   submit() {
     this.rgwZonegroupService
-      .delete(this.zonegroup.name, this.zonegroupForm.value.deletePools, this.includedPools)
+      .delete(
+        this.zonegroup.name,
+        this.zonegroupForm.value.deletePools,
+        this.includedPools,
+        this.zonegroup.parent
+      )
       .subscribe(() => {
         this.notificationService.show(
           NotificationType.success,
index bfa651fa1e2bff8b6a4c98ad891d92e38454d870..c958b2e3928857a605116c2b51768aa0aa18ef2b 100644 (file)
@@ -49,14 +49,16 @@ export class RgwZoneService {
     zoneName: string,
     deletePools: boolean,
     pools: Set<string>,
-    zonegroupName: string
+    zonegroupName: string,
+    realmName: string
   ): Observable<any> {
     let params = new HttpParams();
     params = params.appendAll({
       zone_name: zoneName,
       delete_pools: deletePools,
       pools: Array.from(pools.values()),
-      zonegroup_name: zonegroupName
+      zonegroup_name: zonegroupName,
+      realm_name: realmName
     });
     return this.http.delete(`${this.url}/${zoneName}`, { params: params });
   }
index 7f795c1d1d890a57ab4f55b9a8f1e53f19ac7fba..c1120a906f2ea01fc6622b34333e4232ebcc7fca 100644 (file)
@@ -59,12 +59,18 @@ export class RgwZonegroupService {
     return this.http.get(`${this.url}/get_all_zonegroups_info`);
   }
 
-  delete(zonegroupName: string, deletePools: boolean, pools: Set<string>): Observable<any> {
+  delete(
+    zonegroupName: string,
+    deletePools: boolean,
+    pools: Set<string>,
+    realmName: string
+  ): Observable<any> {
     let params = new HttpParams();
     params = params.appendAll({
       zonegroup_name: zonegroupName,
       delete_pools: deletePools,
-      pools: Array.from(pools.values())
+      pools: Array.from(pools.values()),
+      realm_name: realmName
     });
     return this.http.delete(`${this.url}/${zonegroupName}`, { params: params });
   }
index 62414d628e7903f060f65e9117f708292752e4ab..b7cad47edb7b3a90598a04dc747d842a0dd14d3f 100755 (executable)
@@ -15338,6 +15338,11 @@ paths:
         name: zonegroup_name
         schema:
           type: string
+      - allowEmptyValue: true
+        in: query
+        name: realm_name
+        schema:
+          type: string
       responses:
         '202':
           content:
@@ -15718,6 +15723,11 @@ paths:
         name: pools
         schema:
           type: string
+      - allowEmptyValue: true
+        in: query
+        name: realm_name
+        schema:
+          type: string
       responses:
         '202':
           content:
index 3b62eb7b0d48474fd3f7987b075bdd539f81dc2b..1ea1f0e63de83e6e5e12396a5f3f562a22aa951c 100755 (executable)
@@ -2035,7 +2035,9 @@ class RgwMultisite:
             all_zonegroups_info['default_zonegroup'] = ''  # type: ignore
         return all_zonegroups_info
 
-    def delete_zonegroup(self, zonegroup_name: str, delete_pools: str, pools: List[str]):
+    def delete_zonegroup(self, zonegroup_name: str,
+                         delete_pools: str, pools: List[str],
+                         realm_name: Optional[str] = None):
         if delete_pools == 'true':
             zonegroup_info = self.get_zonegroup(zonegroup_name)
         rgw_delete_zonegroup_cmd = ['zonegroup', 'delete', '--rgw-zonegroup', zonegroup_name]
@@ -2046,7 +2048,7 @@ class RgwMultisite:
                                          http_status_code=500, component='rgw')
         except SubprocessError as error:
             raise DashboardException(error, http_status_code=500, component='rgw')
-        self.update_period()
+        self.update_period(realm_name=realm_name)
         if delete_pools == 'true':
             for zone in zonegroup_info['zones']:
                 self.delete_zone(zone['name'], 'true', pools)
@@ -2346,8 +2348,14 @@ class RgwMultisite:
                 else:
                     self.add_placement_targets(new_zonegroup_name, placement_targets)
 
-    def update_period(self):
+    def update_period(self, realm_name=None, realm_id=None):
         rgw_update_period_cmd = ['period', 'update', '--commit']
+        if realm_name:
+            rgw_update_period_cmd.append('--rgw-realm')
+            rgw_update_period_cmd.append(realm_name)
+        if realm_id:
+            rgw_update_period_cmd.append('--realm-id')
+            rgw_update_period_cmd.append(realm_id)
         try:
             exit_code, _, err = mgr.send_rgwadmin_command(rgw_update_period_cmd)
             if exit_code > 0:
@@ -2556,7 +2564,7 @@ class RgwMultisite:
         return all_zones_info
 
     def delete_zone(self, zone_name: str, delete_pools: str, pools: List[str],
-                    zonegroup_name: str = '',):
+                    zonegroup_name: str = '', realm_name: Optional[str] = None):
         rgw_remove_zone_from_zonegroup_cmd = ['zonegroup', 'remove', '--rgw-zonegroup',
                                               zonegroup_name, '--rgw-zone', zone_name]
         rgw_delete_zone_cmd = ['zone', 'delete', '--rgw-zone', zone_name]
@@ -2568,7 +2576,7 @@ class RgwMultisite:
                                              http_status_code=500, component='rgw')
             except SubprocessError as error:
                 raise DashboardException(error, http_status_code=500, component='rgw')
-            self.update_period()
+            self.update_period(realm_name=realm_name)
         try:
             exit_code, _, _ = mgr.send_rgwadmin_command(rgw_delete_zone_cmd)
             if exit_code > 0:
@@ -2576,7 +2584,7 @@ class RgwMultisite:
                                          http_status_code=500, component='rgw')
         except SubprocessError as error:
             raise DashboardException(error, http_status_code=500, component='rgw')
-        self.update_period()
+        self.update_period(realm_name=realm_name)
         if delete_pools == 'true':
             self.delete_pools(pools)