]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
disable create zonegroup if no master zone exist for existing master zonegroup
authoravanthakkar <avanjohn@gmail.com>
Sun, 19 Mar 2023 14:25:15 +0000 (19:55 +0530)
committerAashish Sharma <aasharma@li-e74156cc-2f67-11b2-a85c-e98659a63c5c.ibm.com>
Thu, 10 Aug 2023 11:41:49 +0000 (17:11 +0530)
Fixes: https://tracker.ceph.com/issues/59171
Signed-off-by: avanthakkar <avanjohn@gmail.com>
(cherry picked from commit d42ea1d5afb55d5f7c823ac8f2cb2e149165c57a)

src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-details/rgw-multisite-details.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-details/rgw-multisite-details.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zone-form/rgw-multisite-zone-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zone-form/rgw-multisite-zone-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zonegroup-form/rgw-multisite-zonegroup-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zonegroup-form/rgw-multisite-zonegroup-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/api/rgw-zonegroup.service.ts
src/pybind/mgr/dashboard/requirements-test.txt
src/pybind/mgr/dashboard/services/rgw_client.py

index 09e45a87e1b9a741ff9e34957e3ee0a48091220d..50e17b41b1ada5d599d7e99a152a36f44ed286ff 100644 (file)
@@ -42,7 +42,7 @@
                      *ngIf="node.isFocused && node.data.type === 'realm'"
                      role="group">
                   <button type="button"
-                          [title]="title"
+                          title="Edit realm"
                           class="btn btn-light dropdown-toggle-split ms-1"
                           (click)="openModal(node, true)"
                           ngbDropdownToggle>
index 25d994cc2cad1f810ef46178adb9aa685541c6f5..a07e45d11ac77ec165d7176db1888ac545d5fdde 100644 (file)
@@ -7,6 +7,7 @@ import {
   TREE_ACTIONS
 } from '@circlon/angular-tree-component';
 import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
+import _ from 'lodash';
 import { forkJoin, Subscription } from 'rxjs';
 import { RgwRealmService } from '~/app/shared/api/rgw-realm.service';
 import { RgwZoneService } from '~/app/shared/api/rgw-zone.service';
@@ -35,7 +36,8 @@ export class RgwMultisiteDetailsComponent implements OnDestroy, OnInit {
   @ViewChild('tree') tree: TreeComponent;
 
   messages = {
-    noDefaultRealm: $localize`Please create a default realm first to enable this feature`
+    noDefaultRealm: $localize`Please create a default realm first to enable this feature`,
+    noMasterZone: $localize`Please create a master zone for each zonegroups to enable this feature`
   };
 
   icons = Icons;
@@ -285,7 +287,17 @@ export class RgwMultisiteDetailsComponent implements OnDestroy, OnInit {
     if (this.defaultRealmId === '') {
       return this.messages.noDefaultRealm;
     } else {
-      return false;
+      let isMasterZone = true;
+      this.zonegroups.forEach((zgp: any) => {
+        if (_.isEmpty(zgp.master_zone)) {
+          isMasterZone = false;
+        }
+      });
+      if (!isMasterZone) {
+        return this.messages.noMasterZone;
+      } else {
+        return false;
+      }
     }
   }
 }
index 6e091310971ea021512a4dc6a3a103b5eb57f18b..715cb46b13fb8f8b65bb2960e41685f78a157765 100644 (file)
@@ -16,7 +16,8 @@
           <select class="form-select"
                   id="selectedZonegroup"
                   formControlName="selectedZonegroup"
-                  name="selectedZonegroup">
+                  name="selectedZonegroup"
+                  (change)="onZoneGroupChange($event.target.value)">
             <option *ngFor="let zonegroupName of zonegroupList"
                     [value]="zonegroupName.name"
                     [selected]="zonegroupName.name === multisiteZoneForm.getValue('selectedZonegroup')">
index fa89a1699f5da4c26b103f8fb1381aa3cfffa262..567c5f096dd9775fefc438d3ed3d578b6d728f95 100644 (file)
@@ -4,6 +4,7 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import _ from 'lodash';
 import { RgwUserService } from '~/app/shared/api/rgw-user.service';
 import { RgwZoneService } from '~/app/shared/api/rgw-zone.service';
+import { RgwZonegroupService } from '~/app/shared/api/rgw-zonegroup.service';
 import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
 import { NotificationType } from '~/app/shared/enum/notification-type.enum';
 import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
@@ -38,6 +39,7 @@ export class RgwMultisiteZoneFormComponent implements OnInit {
     public activeModal: NgbActiveModal,
     public actionLabels: ActionLabelsI18n,
     public rgwZoneService: RgwZoneService,
+    public rgwZoneGroupService: RgwZonegroupService,
     public notificationService: NotificationService,
     public rgwUserService: RgwUserService
   ) {
@@ -88,6 +90,17 @@ export class RgwMultisiteZoneFormComponent implements OnInit {
     });
   }
 
+  onZoneGroupChange(zonegroupName: string) {
+    let zg = new RgwZonegroup();
+    zg.name = zonegroupName;
+    this.rgwZoneGroupService.get(zg).subscribe((zonegroup: RgwZonegroup) => {
+      if (_.isEmpty(zonegroup.master_zone)) {
+        this.multisiteZoneForm.get('master_zone').setValue(true);
+        this.multisiteZoneForm.get('master_zone').disable();
+      }
+    });
+  }
+
   ngOnInit(): void {
     this.zonegroupList =
       this.multisiteInfo[1] !== undefined && this.multisiteInfo[1].hasOwnProperty('zonegroups')
@@ -104,6 +117,7 @@ export class RgwMultisiteZoneFormComponent implements OnInit {
       this.multisiteZoneForm
         .get('selectedZonegroup')
         .setValue(this.defaultsInfo['defaultZonegroupName']);
+      this.onZoneGroupChange(this.defaultsInfo['defaultZonegroupName']);
     }
     this.rgwUserService.list().subscribe((users: any) => {
       this.users = users.filter((user: any) => user.keys.length !== 0);
index 6dfc9ebbbead6668f6293c98a50e414cd9301c1f..adcadde8775ee264e056c45d51dbd4146c7ec322 100644 (file)
           <label class="form-check-label"
                  for="master_zonegroup"
                  i18n>Master</label>
+          <span *ngIf="!isMaster">
+          <cd-helper i18n>RGW multi-site configuration must have a master zonegroup. Setting
+            the first zonegroup created as master, to avoid any errors on udating the period.
+            Can be modified later by editing a zonegroup.
+          </cd-helper>
+          </span>
         </div>
         </div>
       </div>
index 792674da3e4840cf1683b8b56c19dd6438ffdcc3..3a701a1bc0ebf20b7afbac2f01429e76bb89b773 100644 (file)
@@ -30,6 +30,7 @@ export class RgwMultisiteZonegroupFormComponent implements OnInit {
   realmList: RgwRealm[] = [];
   zonegroupList: RgwZonegroup[] = [];
   zonegroupNames: string[];
+  isMaster = false;
 
   constructor(
     public activeModal: NgbActiveModal,
@@ -91,6 +92,15 @@ export class RgwMultisiteZonegroupFormComponent implements OnInit {
       this.multisiteInfo[1] !== undefined && this.multisiteInfo[1].hasOwnProperty('zonegroups')
         ? this.multisiteInfo[1]['zonegroups']
         : [];
+    this.zonegroupList.forEach((zgp: any) => {
+      if (zgp.is_master === true && !_.isEmpty(zgp.realm_id)) {
+        this.isMaster = true;
+      }
+    });
+    if (!this.isMaster) {
+      this.multisiteZonegroupForm.get('master_zonegroup').setValue(true);
+      this.multisiteZonegroupForm.get('master_zonegroup').disable();
+    }
     this.zonegroupNames = this.zonegroupList.map((zonegroup) => {
       return zonegroup['name'];
     });
index 08242d1613b1e41d94076b131519294ac4e2f97b..b16d0f7e928edd8594f3c504fb03b57af28e16d3 100644 (file)
@@ -54,6 +54,8 @@ export class RgwZonegroupService {
     nodes['parent'] = realm ? realm.name : '';
     nodes['is_default'] = zonegroup.id === defaultZonegroupId ? true : false;
     nodes['type'] = 'zonegroup';
+    nodes['endpoints'] = zonegroup.endpoints;
+    nodes['master_zone'] = zonegroup.master_zone;
     return nodes;
   }
 }
index d2566bab59f61a27474d227f62fa6f534fdd5697..fe9dccbc44b5d650067dda09d9d1708b8a1e1a5e 100644 (file)
@@ -1,4 +1,4 @@
 pytest-cov
 pytest-instafail
 pyfakefs==4.5.0
-jsonschema
+jsonschema==4.16.0
\ No newline at end of file
index 26bcf09fc4aeeaeb8903a186a76ca047b683600e..1fd66ef2be3d0006e469568117132a3772f63045 100644 (file)
@@ -657,7 +657,7 @@ class RgwClient(RestClient):
             exit_code, _, err = mgr.send_rgwadmin_command(rgw_update_period_cmd)
             if exit_code > 0:
                 raise DashboardException(e=err, msg='Unable to update period',
-                                         http_status_code=500, component='rgw')
+                                         http_status_code=400, component='rgw')
         except SubprocessError as error:
             raise DashboardException(error, http_status_code=500, component='rgw')
 
@@ -684,18 +684,18 @@ class RgwClient(RestClient):
             cmd_edit_realm_options = ['--rgw-realm', realm_name, '--realm-new-name', new_realm_name]
             rgw_realm_edit_cmd += cmd_edit_realm_options
             try:
-                exit_code, _, err = mgr.send_rgwadmin_command(rgw_realm_edit_cmd)
+                exit_code, _, err = mgr.send_rgwadmin_command(rgw_realm_edit_cmd, False)
                 if exit_code > 0:
                     raise DashboardException(e=err, msg='Unable to edit realm',
                                              http_status_code=500, component='rgw')
-            except ValueError:
-                pass
-
+            except SubprocessError as error:
+                raise DashboardException(error, http_status_code=500, component='rgw')
             if str_to_bool(default):
                 rgw_realm_edit_cmd = ['realm', 'default']
                 cmd_edit_realm_options = ['--rgw-realm', new_realm_name]
+                rgw_realm_edit_cmd += cmd_edit_realm_options
                 try:
-                    exit_code, _, _ = mgr.send_rgwadmin_command(rgw_realm_edit_cmd)
+                    exit_code, _, _ = mgr.send_rgwadmin_command(rgw_realm_edit_cmd, False)
                     if exit_code > 0:
                         raise DashboardException(msg='Unable to set {} as default realm'.format(new_realm_name),  # noqa E501  #pylint: disable=line-too-long
                                                  http_status_code=500, component='rgw')
@@ -722,9 +722,9 @@ class RgwClient(RestClient):
             cmd_create_zonegroup_options.append(endpoint)
         rgw_zonegroup_create_cmd += cmd_create_zonegroup_options
         try:
-            exit_code, out, _ = mgr.send_rgwadmin_command(rgw_zonegroup_create_cmd)
+            exit_code, out, err = mgr.send_rgwadmin_command(rgw_zonegroup_create_cmd)
             if exit_code > 0:
-                raise DashboardException('Unable to get realm info',
+                raise DashboardException(e=err, msg='Unable to get realm info',
                                          http_status_code=500, component='rgw')
         except SubprocessError as error:
             raise DashboardException(error, http_status_code=500, component='rgw')
@@ -800,12 +800,13 @@ class RgwClient(RestClient):
             cmd_create_zone_options.append(secret_key)
         rgw_zone_create_cmd += cmd_create_zone_options
         try:
-            exit_code, out, _ = mgr.send_rgwadmin_command(rgw_zone_create_cmd)
+            exit_code, out, err = mgr.send_rgwadmin_command(rgw_zone_create_cmd)
             if exit_code > 0:
-                raise DashboardException(msg='Unable to create zone',
+                raise DashboardException(e=err, msg='Unable to create zone',
                                          http_status_code=500, component='rgw')
         except SubprocessError as error:
             raise DashboardException(error, http_status_code=500, component='rgw')
+
         self.update_period()
         return out