]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Zone details showing incorrect data for data pool values and compressi... 59596/head
authorAashish Sharma <aasharma@li-e74156cc-2f67-11b2-a85c-e98659a63c5c.ibm.com>
Wed, 24 Jul 2024 05:37:27 +0000 (11:07 +0530)
committerAashish Sharma <aasharma@li-e74156cc-2f67-11b2-a85c-e98659a63c5c.ibm.com>
Wed, 4 Sep 2024 11:18:12 +0000 (16:48 +0530)
Fixes: https://tracker.ceph.com/issues/67103
Signed-off-by: Aashish Sharma <aasharma@redhat.com>
(cherry picked from commit 76af1c0b1be562d38f3d6323351b7b7d0462af48)

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.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zone-form/rgw-multisite-zone-form.component.ts

index 98741bed3990e193ee6fa42959a520a0f9d448f2..46461d71074a46c8dfccf38de8a9941ac319f557 100644 (file)
                         formControlName="storageClass"
                         (change)="getStorageClassData($event.target.value)"
                         name="storageClass">
-                  <option *ngFor="let str of storageClassList"
-                          [value]="str.value">
-                  {{ str.value }}
+                  <option *ngFor="let storageClass of storageClassList"
+                          [value]="storageClass.key">
+                  {{ storageClass.key }}
                   </option>
                 </select>
               </div>
index e9da2f4ab17a37386be95d9538e88f93e58b4f1f..1e134eb0bf4b3ac01c659d026932e64eb32a7b02 100644 (file)
-import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 import { ReactiveFormsModule } from '@angular/forms';
+import { RgwMultisiteZoneFormComponent } from './rgw-multisite-zone-form.component'; // Adjust path as necessary
+import { of } from 'rxjs';
+import { RgwZoneService } from '~/app/shared/api/rgw-zone.service';
+import { HttpClientTestingModule } from '@angular/common/http/testing';
 import { RouterTestingModule } from '@angular/router/testing';
 import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
 import { ToastrModule } from 'ngx-toastr';
 import { SharedModule } from '~/app/shared/shared.module';
-
-import { RgwMultisiteZoneFormComponent } from './rgw-multisite-zone-form.component';
-import { configureTestBed } from '~/testing/unit-test-helper';
+import { RgwZone } from '../models/rgw-multisite';
 
 describe('RgwMultisiteZoneFormComponent', () => {
   let component: RgwMultisiteZoneFormComponent;
   let fixture: ComponentFixture<RgwMultisiteZoneFormComponent>;
-
-  configureTestBed({
-    imports: [
-      SharedModule,
-      ReactiveFormsModule,
-      RouterTestingModule,
-      HttpClientTestingModule,
-      ToastrModule.forRoot()
-    ],
-    providers: [NgbActiveModal],
-    declarations: [RgwMultisiteZoneFormComponent]
-  });
+  let rgwZoneService: RgwZoneService;
+  let rgwZoneServiceSpy: jasmine.Spy;
 
   beforeEach(() => {
+    TestBed.configureTestingModule({
+      imports: [
+        SharedModule,
+        ReactiveFormsModule,
+        RouterTestingModule,
+        HttpClientTestingModule,
+        ToastrModule.forRoot()
+      ],
+      providers: [NgbActiveModal],
+      declarations: [RgwMultisiteZoneFormComponent]
+    }).compileComponents();
+
     fixture = TestBed.createComponent(RgwMultisiteZoneFormComponent);
     component = fixture.componentInstance;
+    rgwZoneService = TestBed.inject(RgwZoneService);
+
+    rgwZoneServiceSpy = spyOn(rgwZoneService, 'get');
+
+    rgwZoneServiceSpy.and.returnValue(
+      of({
+        placement_pools: [
+          {
+            key: 'default-placement',
+            val: {
+              storage_classes: {
+                STANDARD: {
+                  data_pool: 'standard-data-pool',
+                  compression_type: 'gzip'
+                }
+              },
+              index_pool: 'index-pool',
+              data_extra_pool: 'extra-data-pool'
+            }
+          }
+        ]
+      })
+    );
+
+    component.info = {
+      parent: {
+        data: {
+          name: 'zonegroup2',
+          placement_targets: [
+            { name: 'default-placement', tags: [], storage_classes: ['STANDARD'] }
+          ],
+          default_placement: 'default-placement'
+        }
+      },
+      data: {
+        name: 'zone2',
+        parent: 'zonegroup2',
+        is_default: true,
+        is_master: true,
+        endpoints: ['http://192.168.100.100:80'],
+        access_key: 'zxcftyuuhgg',
+        secret_key: 'Qwsdcfgghuiioklpoozsd'
+      }
+    };
+
+    component.zone = new RgwZone();
+    component.zone.name = component.info.data.name;
+    component.action = 'edit';
+
     fixture.detectChanges();
+
+    component.getZonePlacementData('default-placement');
   });
 
   it('should create', () => {
     expect(component).toBeTruthy();
   });
+
+  it('should set correct values in the form on edit', () => {
+    expect(component.multisiteZoneForm.get('zoneName')?.value).toBe('zone2');
+    expect(component.multisiteZoneForm.get('selectedZonegroup')?.value).toBe('zonegroup2');
+    expect(component.multisiteZoneForm.get('default_zone')?.value).toBe(true);
+    expect(component.multisiteZoneForm.get('master_zone')?.value).toBe(true);
+    expect(component.multisiteZoneForm.get('zone_endpoints')?.value).toBe(
+      'http://192.168.100.100:80'
+    );
+    expect(component.multisiteZoneForm.get('access_key')?.value).toBe('zxcftyuuhgg');
+    expect(component.multisiteZoneForm.get('secret_key')?.value).toBe('Qwsdcfgghuiioklpoozsd');
+    expect(component.multisiteZoneForm.get('placementTarget')?.value).toBe('default-placement');
+    expect(component.multisiteZoneForm.get('storageClass')?.value).toBe('STANDARD');
+    expect(component.multisiteZoneForm.get('storageDataPool')?.value).toBe('standard-data-pool');
+    expect(component.multisiteZoneForm.get('storageCompression')?.value).toBe('gzip');
+  });
+
+  it('should create a new zone', () => {
+    component.action = 'create';
+    const createSpy = spyOn(rgwZoneService, 'create').and.returnValue(of({}));
+    component.submit();
+    expect(createSpy).toHaveBeenCalledWith(
+      {
+        endpoints: 'http://192.168.100.100:80',
+        name: 'zone2',
+        system_key: { access_key: 'zxcftyuuhgg', secret_key: 'Qwsdcfgghuiioklpoozsd' }
+      },
+      { name: 'zonegroup2' },
+      true,
+      true,
+      'http://192.168.100.100:80'
+    );
+  });
 });
index 21106c53eb3ba199e1c179d2064e50e88fe89c06..bd7dde62c368149af71ec314088a3d174a9b82a9 100644 (file)
@@ -207,23 +207,20 @@ export class RgwMultisiteZoneFormComponent implements OnInit {
   getZonePlacementData(placementTarget: string) {
     this.zone = new RgwZone();
     this.zone.name = this.info.data.name;
-    if (this.placementTargets) {
-      this.placementTargets.forEach((placement: any) => {
-        if (placement.name === placementTarget) {
-          let storageClasses = placement.storage_classes;
-          this.storageClassList = Object.entries(storageClasses).map(([key, value]) => ({
-            key,
-            value
-          }));
-        }
-      });
-    }
     this.rgwZoneService.get(this.zone).subscribe((zoneInfo: RgwZone) => {
       this.zoneInfo = zoneInfo;
       if (this.zoneInfo && this.zoneInfo['placement_pools']) {
+        const placementPoolKeys = this.zoneInfo['placement_pools'].map((plc_pool) => plc_pool.key);
+        this.placementTargets = this.placementTargets.filter((placement: { name: string }) =>
+          placementPoolKeys.includes(placement.name)
+        );
         this.zoneInfo['placement_pools'].forEach((plc_pool) => {
           if (plc_pool.key === placementTarget) {
             let storageClasses = plc_pool.val.storage_classes;
+            this.storageClassList = Object.entries(storageClasses).map(([key, value]) => ({
+              key,
+              value
+            }));
             let placementDataPool = storageClasses['STANDARD']
               ? storageClasses['STANDARD']['data_pool']
               : '';
@@ -232,9 +229,8 @@ export class RgwMultisiteZoneFormComponent implements OnInit {
             this.poolList.push({ poolname: placementDataPool });
             this.poolList.push({ poolname: placementIndexPool });
             this.poolList.push({ poolname: placementDataExtraPool });
-            this.multisiteZoneForm.get('storageClass').setValue(this.storageClassList[0]['value']);
-            this.multisiteZoneForm.get('storageDataPool').setValue(placementDataPool);
-            this.multisiteZoneForm.get('storageCompression').setValue(this.compressionTypes[0]);
+            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);
@@ -245,14 +241,14 @@ export class RgwMultisiteZoneFormComponent implements OnInit {
   }
 
   getStorageClassData(storageClass: string) {
-    let storageClassSelected = this.storageClassList.find((x) => x['value'] == storageClass)[
-      'value'
-    ];
-    this.poolList.push({ poolname: storageClassSelected.data_pool });
-    this.multisiteZoneForm.get('storageDataPool').setValue(storageClassSelected.data_pool);
+    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']);
     this.multisiteZoneForm
       .get('storageCompression')
-      .setValue(storageClassSelected.compression_type);
+      .setValue(storageClassSelected['value']['compression_type']);
   }
 
   submit() {