Skip to content

Commit 76af1c0

Browse files
author
Aashish Sharma
committed
mgr/dashboard: Zone details showing incorrect data for data pool values and compression info for Storage Classes
Fixes: https://tracker.ceph.com/issues/67103 Signed-off-by: Aashish Sharma <[email protected]>
1 parent 3250b54 commit 76af1c0

File tree

3 files changed

+122
-39
lines changed

3 files changed

+122
-39
lines changed

src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-zone-form/rgw-multisite-zone-form.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,9 +241,9 @@
241241
formControlName="storageClass"
242242
(change)="getStorageClassData($event.target.value)"
243243
name="storageClass">
244-
<option *ngFor="let str of storageClassList"
245-
[value]="str.value">
246-
{{ str.value }}
244+
<option *ngFor="let storageClass of storageClassList"
245+
[value]="storageClass.key">
246+
{{ storageClass.key }}
247247
</option>
248248
</select>
249249
</div>
Lines changed: 103 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,124 @@
1-
import { HttpClientTestingModule } from '@angular/common/http/testing';
21
import { ComponentFixture, TestBed } from '@angular/core/testing';
32
import { ReactiveFormsModule } from '@angular/forms';
3+
import { RgwMultisiteZoneFormComponent } from './rgw-multisite-zone-form.component'; // Adjust path as necessary
4+
import { of } from 'rxjs';
5+
import { RgwZoneService } from '~/app/shared/api/rgw-zone.service';
6+
import { HttpClientTestingModule } from '@angular/common/http/testing';
47
import { RouterTestingModule } from '@angular/router/testing';
58
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
69
import { ToastrModule } from 'ngx-toastr';
710
import { SharedModule } from '~/app/shared/shared.module';
8-
9-
import { RgwMultisiteZoneFormComponent } from './rgw-multisite-zone-form.component';
10-
import { configureTestBed } from '~/testing/unit-test-helper';
11+
import { RgwZone } from '../models/rgw-multisite';
1112

1213
describe('RgwMultisiteZoneFormComponent', () => {
1314
let component: RgwMultisiteZoneFormComponent;
1415
let fixture: ComponentFixture<RgwMultisiteZoneFormComponent>;
15-
16-
configureTestBed({
17-
imports: [
18-
SharedModule,
19-
ReactiveFormsModule,
20-
RouterTestingModule,
21-
HttpClientTestingModule,
22-
ToastrModule.forRoot()
23-
],
24-
providers: [NgbActiveModal],
25-
declarations: [RgwMultisiteZoneFormComponent]
26-
});
16+
let rgwZoneService: RgwZoneService;
17+
let rgwZoneServiceSpy: jasmine.Spy;
2718

2819
beforeEach(() => {
20+
TestBed.configureTestingModule({
21+
imports: [
22+
SharedModule,
23+
ReactiveFormsModule,
24+
RouterTestingModule,
25+
HttpClientTestingModule,
26+
ToastrModule.forRoot()
27+
],
28+
providers: [NgbActiveModal],
29+
declarations: [RgwMultisiteZoneFormComponent]
30+
}).compileComponents();
31+
2932
fixture = TestBed.createComponent(RgwMultisiteZoneFormComponent);
3033
component = fixture.componentInstance;
34+
rgwZoneService = TestBed.inject(RgwZoneService);
35+
36+
rgwZoneServiceSpy = spyOn(rgwZoneService, 'get');
37+
38+
rgwZoneServiceSpy.and.returnValue(
39+
of({
40+
placement_pools: [
41+
{
42+
key: 'default-placement',
43+
val: {
44+
storage_classes: {
45+
STANDARD: {
46+
data_pool: 'standard-data-pool',
47+
compression_type: 'gzip'
48+
}
49+
},
50+
index_pool: 'index-pool',
51+
data_extra_pool: 'extra-data-pool'
52+
}
53+
}
54+
]
55+
})
56+
);
57+
58+
component.info = {
59+
parent: {
60+
data: {
61+
name: 'zonegroup2',
62+
placement_targets: [
63+
{ name: 'default-placement', tags: [], storage_classes: ['STANDARD'] }
64+
],
65+
default_placement: 'default-placement'
66+
}
67+
},
68+
data: {
69+
name: 'zone2',
70+
parent: 'zonegroup2',
71+
is_default: true,
72+
is_master: true,
73+
endpoints: ['http://192.168.100.100:80'],
74+
access_key: 'zxcftyuuhgg',
75+
secret_key: 'Qwsdcfgghuiioklpoozsd'
76+
}
77+
};
78+
79+
component.zone = new RgwZone();
80+
component.zone.name = component.info.data.name;
81+
component.action = 'edit';
82+
3183
fixture.detectChanges();
84+
85+
component.getZonePlacementData('default-placement');
3286
});
3387

3488
it('should create', () => {
3589
expect(component).toBeTruthy();
3690
});
91+
92+
it('should set correct values in the form on edit', () => {
93+
expect(component.multisiteZoneForm.get('zoneName')?.value).toBe('zone2');
94+
expect(component.multisiteZoneForm.get('selectedZonegroup')?.value).toBe('zonegroup2');
95+
expect(component.multisiteZoneForm.get('default_zone')?.value).toBe(true);
96+
expect(component.multisiteZoneForm.get('master_zone')?.value).toBe(true);
97+
expect(component.multisiteZoneForm.get('zone_endpoints')?.value).toBe(
98+
'http://192.168.100.100:80'
99+
);
100+
expect(component.multisiteZoneForm.get('access_key')?.value).toBe('zxcftyuuhgg');
101+
expect(component.multisiteZoneForm.get('secret_key')?.value).toBe('Qwsdcfgghuiioklpoozsd');
102+
expect(component.multisiteZoneForm.get('placementTarget')?.value).toBe('default-placement');
103+
expect(component.multisiteZoneForm.get('storageClass')?.value).toBe('STANDARD');
104+
expect(component.multisiteZoneForm.get('storageDataPool')?.value).toBe('standard-data-pool');
105+
expect(component.multisiteZoneForm.get('storageCompression')?.value).toBe('gzip');
106+
});
107+
108+
it('should create a new zone', () => {
109+
component.action = 'create';
110+
const createSpy = spyOn(rgwZoneService, 'create').and.returnValue(of({}));
111+
component.submit();
112+
expect(createSpy).toHaveBeenCalledWith(
113+
{
114+
endpoints: 'http://192.168.100.100:80',
115+
name: 'zone2',
116+
system_key: { access_key: 'zxcftyuuhgg', secret_key: 'Qwsdcfgghuiioklpoozsd' }
117+
},
118+
{ name: 'zonegroup2' },
119+
true,
120+
true,
121+
'http://192.168.100.100:80'
122+
);
123+
});
37124
});

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

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -207,23 +207,20 @@ export class RgwMultisiteZoneFormComponent implements OnInit {
207207
getZonePlacementData(placementTarget: string) {
208208
this.zone = new RgwZone();
209209
this.zone.name = this.info.data.name;
210-
if (this.placementTargets) {
211-
this.placementTargets.forEach((placement: any) => {
212-
if (placement.name === placementTarget) {
213-
let storageClasses = placement.storage_classes;
214-
this.storageClassList = Object.entries(storageClasses).map(([key, value]) => ({
215-
key,
216-
value
217-
}));
218-
}
219-
});
220-
}
221210
this.rgwZoneService.get(this.zone).subscribe((zoneInfo: RgwZone) => {
222211
this.zoneInfo = zoneInfo;
223212
if (this.zoneInfo && this.zoneInfo['placement_pools']) {
213+
const placementPoolKeys = this.zoneInfo['placement_pools'].map((plc_pool) => plc_pool.key);
214+
this.placementTargets = this.placementTargets.filter((placement: { name: string }) =>
215+
placementPoolKeys.includes(placement.name)
216+
);
224217
this.zoneInfo['placement_pools'].forEach((plc_pool) => {
225218
if (plc_pool.key === placementTarget) {
226219
let storageClasses = plc_pool.val.storage_classes;
220+
this.storageClassList = Object.entries(storageClasses).map(([key, value]) => ({
221+
key,
222+
value
223+
}));
227224
let placementDataPool = storageClasses['STANDARD']
228225
? storageClasses['STANDARD']['data_pool']
229226
: '';
@@ -232,9 +229,8 @@ export class RgwMultisiteZoneFormComponent implements OnInit {
232229
this.poolList.push({ poolname: placementDataPool });
233230
this.poolList.push({ poolname: placementIndexPool });
234231
this.poolList.push({ poolname: placementDataExtraPool });
235-
this.multisiteZoneForm.get('storageClass').setValue(this.storageClassList[0]['value']);
236-
this.multisiteZoneForm.get('storageDataPool').setValue(placementDataPool);
237-
this.multisiteZoneForm.get('storageCompression').setValue(this.compressionTypes[0]);
232+
this.multisiteZoneForm.get('storageClass').setValue(this.storageClassList[0]['key']);
233+
this.getStorageClassData(this.storageClassList[0]['key']);
238234
this.multisiteZoneForm.get('placementDataPool').setValue(placementDataPool);
239235
this.multisiteZoneForm.get('placementIndexPool').setValue(placementIndexPool);
240236
this.multisiteZoneForm.get('placementDataExtraPool').setValue(placementDataExtraPool);
@@ -245,14 +241,14 @@ export class RgwMultisiteZoneFormComponent implements OnInit {
245241
}
246242

247243
getStorageClassData(storageClass: string) {
248-
let storageClassSelected = this.storageClassList.find((x) => x['value'] == storageClass)[
249-
'value'
250-
];
251-
this.poolList.push({ poolname: storageClassSelected.data_pool });
252-
this.multisiteZoneForm.get('storageDataPool').setValue(storageClassSelected.data_pool);
244+
let storageClassSelected = this.storageClassList.find((sc) => sc['key'] === storageClass);
245+
this.poolList.push({ poolname: storageClassSelected['value']['data_pool'] });
246+
this.multisiteZoneForm
247+
.get('storageDataPool')
248+
.setValue(storageClassSelected['value']['data_pool']);
253249
this.multisiteZoneForm
254250
.get('storageCompression')
255-
.setValue(storageClassSelected.compression_type);
251+
.setValue(storageClassSelected['value']['compression_type']);
256252
}
257253

258254
submit() {

0 commit comments

Comments
 (0)