AclTypeConst,
ACLVal,
AclLabel,
- AclType
+ AclType,
+ ZoneRequest,
+ AllZonesResponse,
+ POOL
} from '../models/rgw-storage-class.model';
import { NotificationType } from '~/app/shared/enum/notification-type.enum';
import { NotificationService } from '~/app/shared/services/notification.service';
import { FormatterService } from '~/app/shared/services/formatter.service';
import validator from 'validator';
import { DimlessBinaryPipe } from '~/app/shared/pipes/dimless-binary.pipe';
+import { PoolService } from '~/app/shared/api/pool.service';
+import { Pool } from '../../pool/pool';
+import { catchError, map, switchMap } from 'rxjs/operators';
+import { RGW } from '../utils/constants';
+import { forkJoin, of } from 'rxjs';
+import { RgwZoneService } from '~/app/shared/api/rgw-zone.service';
+import { BucketTieringUtils } from '../utils/rgw-bucket-tiering';
@Component({
selector: 'cd-rgw-storage-class-form',
zonegroupNames: ZoneGroup[];
placementTargets: string[] = [];
selectedZoneGroup: string;
+ selectedZone: string;
defaultZonegroup: ZoneGroup;
zoneGroupDetails: ZoneGroupDetails;
storageClassInfo: StorageClass;
const value = control.value;
return !value || validator.isURL(value) ? null : { invalidUrl: true };
};
+ rgwPools: Pool[];
+ zones: any[];
+ POOL = POOL;
+
constructor(
public actionLabels: ActionLabelsI18n,
private formBuilder: CdFormBuilder,
private route: ActivatedRoute,
public formatter: FormatterService,
private cdRef: ChangeDetectorRef,
- private dimlessBinary: DimlessBinaryPipe
+ private poolService: PoolService,
+ private dimlessBinary: DimlessBinaryPipe,
+ private rgwZoneService: RgwZoneService
) {
super();
this.resource = $localize`Tiering Storage Class`;
this.createForm();
this.storageClassTypeText();
this.updateTierTypeHelpText();
- this.loadingReady();
this.loadZoneGroup();
if (this.editing) {
this.route.params.subscribe((params: StorageClass) => {
});
this.rgwStorageService
.getPlacement_target(this.storageClassInfo.placement_target)
- .subscribe((placementTargetInfo: PlacementTarget) => {
- this.tierTargetInfo = this.getTierTargetByStorageClass(
- placementTargetInfo,
- this.storageClassInfo.storage_class
- );
- let response = this.tierTargetInfo?.val?.s3;
- const aclMappings = this.tierTargetInfo?.val?.s3?.acl_mappings || [];
- this.storageClassForm.get('zonegroup').disable();
- this.storageClassForm.get('placement_target').disable();
- this.storageClassForm.get('storage_class').disable();
- if (
- this.tierTargetInfo?.val?.tier_type === TIER_TYPE.CLOUD_TIER ||
- this.tierTargetInfo?.val?.tier_type === TIER_TYPE.GLACIER
- ) {
- this.storageClassForm.get('storageClassType').disable();
- }
- this.aclList = this.tierTargetInfo?.val?.s3?.acl_mappings || [];
- this.storageClassForm.patchValue({
- zonegroup: this.storageClassInfo?.zonegroup_name,
- region: response?.region,
- placement_target: this.storageClassInfo?.placement_target,
- storageClassType: this.tierTargetInfo?.val?.tier_type ?? TIER_TYPE.LOCAL,
- target_endpoint: response?.endpoint,
- storage_class: this.storageClassInfo?.storage_class,
- access_key: response?.access_key,
- secret_key: response?.secret,
- target_path: response?.target_path,
- retain_head_object: this.tierTargetInfo?.val?.retain_head_object || false,
- multipart_sync_threshold:
- this.dimlessBinary.transform(response?.multipart_sync_threshold) || '',
- multipart_min_part_size:
- this.dimlessBinary.transform(response?.multipart_min_part_size) || '',
- allow_read_through: this.tierTargetInfo?.val?.allow_read_through || false,
- restore_storage_class: this.tierTargetInfo?.val?.restore_storage_class,
- read_through_restore_days: this.tierTargetInfo?.val?.read_through_restore_days,
- acl_mappings: this.tierTargetInfo?.val?.s3?.acl_mappings || []
- });
- if (
- this.storageClassForm.get('storageClassType')?.value === TIER_TYPE.CLOUD_TIER ||
- this.storageClassForm.get('storageClassType')?.value === TIER_TYPE.GLACIER
- ) {
- this.acls?.clear();
- if (aclMappings.length > 0) {
- aclMappings.forEach((acl) => {
- this.acls?.push(
- this.formBuilder.group({
- source_id: [acl.val?.source_id || ''],
- dest_id: [acl.val?.dest_id || ''],
- type: [acl.val?.type || AclTypeConst.ID, Validators.required]
- })
- );
- });
- } else {
- this.addAcls();
+ .pipe(
+ switchMap((placementTargetInfo: PlacementTarget) => {
+ // Set the tierTargetInfo based on the placementTargetInfo and storageClassInfo
+ this.tierTargetInfo = this.getTierTargetByStorageClass(
+ placementTargetInfo,
+ this.storageClassInfo.storage_class
+ );
+ const tierType = this.tierTargetInfo?.val?.tier_type ?? TIER_TYPE.LOCAL;
+
+ // If tierType is LOCAL, make the second API calls
+ if (tierType === TIER_TYPE.LOCAL) {
+ return forkJoin([
+ this.poolService.getList(),
+ this.rgwZoneService.getAllZonesInfo()
+ ]).pipe(map(([pools, zones]) => ({ placementTargetInfo, pools, zones })));
}
- }
- if (this.tierTargetInfo?.val?.tier_type == TIER_TYPE.GLACIER) {
- let glacierResponse = this.tierTargetInfo?.val['s3-glacier'];
+
+ // If tierType is not LOCAL, just return placementTargetInfo with null pools and zones
+ return of({ placementTargetInfo, pools: null, zones: null });
+ }),
+ map(({ placementTargetInfo, pools, zones }) => {
+ return { placementTargetInfo, pools, zones };
+ }),
+ catchError(() => {
+ return of({
+ placementTargetInfo: null,
+ pools: null,
+ zones: null
+ });
+ })
+ )
+ .subscribe(
+ (data: {
+ placementTargetInfo: PlacementTarget;
+ pools: Pool[] | null;
+ zones: AllZonesResponse | null;
+ }) => {
+ let response = this.tierTargetInfo?.val?.s3;
+ this.aclList = response?.acl_mappings || [];
this.storageClassForm.patchValue({
- glacier_restore_tier_type: glacierResponse.glacier_restore_tier_type,
- glacier_restore_days: glacierResponse.glacier_restore_days
+ zonegroup: this.storageClassInfo?.zonegroup_name,
+ region: response?.region,
+ placement_target: this.storageClassInfo?.placement_target,
+ storageClassType: this.tierTargetInfo?.val?.tier_type ?? TIER_TYPE.LOCAL,
+ target_endpoint: response?.endpoint,
+ storage_class: this.storageClassInfo?.storage_class,
+ access_key: response?.access_key,
+ secret_key: response?.secret,
+ target_path: response?.target_path,
+ retain_head_object: this.tierTargetInfo?.val?.retain_head_object || false,
+ multipart_sync_threshold:
+ this.dimlessBinary.transform(response?.multipart_sync_threshold) || '',
+ multipart_min_part_size:
+ this.dimlessBinary.transform(response?.multipart_min_part_size) || '',
+ allow_read_through: this.tierTargetInfo?.val?.allow_read_through || false,
+ restore_storage_class: this.tierTargetInfo?.val?.restore_storage_class,
+ read_through_restore_days: this.tierTargetInfo?.val?.read_through_restore_days,
+ acl_mappings: response?.acl_mappings || []
+ });
+ if (
+ this.storageClassForm.get('storageClassType')?.value === TIER_TYPE.CLOUD_TIER ||
+ this.storageClassForm.get('storageClassType')?.value === TIER_TYPE.GLACIER
+ ) {
+ this.acls?.clear();
+ if (this.aclList.length > 0) {
+ this.aclList.forEach((acl) => {
+ this.acls?.push(
+ this.formBuilder.group({
+ source_id: [acl.val?.source_id || ''],
+ dest_id: [acl.val?.dest_id || ''],
+ type: [acl.val?.type || AclTypeConst.ID, Validators.required]
+ })
+ );
+ });
+ } else {
+ this.addAcls();
+ }
+ }
+ if (this.tierTargetInfo?.val?.tier_type == TIER_TYPE.GLACIER) {
+ let glacierResponse = this.tierTargetInfo?.val['s3-glacier'];
+ this.storageClassForm.patchValue({
+ glacier_restore_tier_type: glacierResponse.glacier_restore_tier_type,
+ glacier_restore_days: glacierResponse.glacier_restore_days
+ });
+ }
+ const zoneInfo = BucketTieringUtils.getZoneInfoHelper(data.zones?.zones, {
+ placement_target: this.storageClassInfo?.placement_target,
+ storage_class: this.storageClassInfo?.storage_class
});
+ if (data.pools) {
+ this.rgwPools = data.pools.filter((pool: Pool) =>
+ pool.application_metadata?.includes(RGW)
+ );
+ this.storageClassForm.get('pool').setValue(zoneInfo.data_pool);
+ this.storageClassForm.get('zone').setValue(zoneInfo.zone_name);
+ }
+ this.loadingReady();
}
- });
+ );
+ this.storageClassForm.get('zonegroup').disable();
+ this.storageClassForm.get('placement_target').disable();
+ this.storageClassForm.get('storage_class').disable();
+ this.storageClassForm.get('zone').disable();
+ this.storageClassForm.get('storageClassType').disable();
+ } else {
+ this.addAcls();
+ this.poolService.getList().subscribe((resp: Pool[]) => {
+ // Filter only pools with "rgw" in application_metadata
+ this.rgwPools = resp.filter((pool: Pool) => pool.application_metadata?.includes(RGW));
+ this.loadingReady();
+ });
}
this.storageClassForm.get('storageClassType').valueChanges.subscribe((value) => {
this.updateValidatorsBasedOnStorageClass(value);
this.onAllowReadThroughChange(value);
});
}
- createForm() {
- const self = this;
- const lockDaysValidator = CdValidators.custom('lockDays', () => {
- if (!self.storageClassForm || !self.storageClassForm.getRawValue()) {
- return false;
- }
-
- const lockDays = Number(self.storageClassForm.getValue('read_through_restore_days'));
- return !Number.isInteger(lockDays) || lockDays === 0;
- });
- this.storageClassForm = this.formBuilder.group({
- storage_class: new FormControl('', {
- validators: [Validators.required]
- }),
- zonegroup: new FormControl(this.selectedZoneGroup, {
- validators: [Validators.required]
- }),
- region: new FormControl('', [
- CdValidators.composeIf({ storageClassType: TIER_TYPE.CLOUD_TIER }, [Validators.required])
- ]),
- placement_target: new FormControl('', {
- validators: [Validators.required]
- }),
- access_key: new FormControl(null, [
- CdValidators.composeIf({ storageClassType: TIER_TYPE.CLOUD_TIER }, [Validators.required])
- ]),
- secret_key: new FormControl(null, [
- CdValidators.composeIf({ storageClassType: TIER_TYPE.CLOUD_TIER }, [Validators.required])
- ]),
- target_path: new FormControl('', [
- CdValidators.composeIf({ storageClassType: TIER_TYPE.CLOUD_TIER }, [Validators.required])
- ]),
- retain_head_object: new FormControl(true),
- glacier_restore_tier_type: new FormControl(STORAGE_CLASS_CONSTANTS.DEFAULT_STORAGE_CLASS, [
- CdValidators.composeIf({ storageClassType: TIER_TYPE.GLACIER }, [Validators.required])
- ]),
- target_endpoint: new FormControl('', [Validators.required, this.urlValidator]),
- glacier_restore_days: new FormControl(STORAGE_CLASS_CONSTANTS.DEFAULT_GLACIER_RESTORE_DAYS, [
- CdValidators.composeIf({ storageClassType: TIER_TYPE.GLACIER || TIER_TYPE.CLOUD_TIER }, [
- CdValidators.number(false),
- lockDaysValidator
- ])
+ public createAcls(): CdFormGroup {
+ const group = this.formBuilder.group({
+ type: new FormControl(AclTypeConst.ID, Validators.required),
+ source_id: new FormControl('', [
+ CdValidators.composeIf(
+ {
+ type: AclTypeConst.EMAIL
+ },
+ [Validators.email]
+ ),
+ CdValidators.composeIf(
+ {
+ type: AclTypeConst.URI
+ },
+ [this.urlValidator]
+ )
]),
- restore_storage_class: new FormControl(STORAGE_CLASS_CONSTANTS.DEFAULT_STORAGE_CLASS),
- read_through_restore_days: new FormControl(
- {
- value: STORAGE_CLASS_CONSTANTS.DEFAULT_READTHROUGH_RESTORE_DAYS,
- disabled: true
- },
+ dest_id: new FormControl('', [
CdValidators.composeIf(
- (form: AbstractControl) => {
- const type = form.get('storageClassType')?.value;
- return type === TIER_TYPE.GLACIER || type === TIER_TYPE.CLOUD_TIER;
+ {
+ type: AclTypeConst.EMAIL
},
- [CdValidators.number(false), lockDaysValidator]
+ [Validators.email]
+ ),
+ CdValidators.composeIf(
+ {
+ type: AclTypeConst.URI
+ },
+ [this.urlValidator]
)
- ),
- multipart_sync_threshold: new FormControl(
- STORAGE_CLASS_CONSTANTS.DEFAULT_MULTIPART_SYNC_THRESHOLD
- ),
- multipart_min_part_size: new FormControl(
- STORAGE_CLASS_CONSTANTS.DEFAULT_MULTIPART_MIN_PART_SIZE
- ),
- allow_read_through: new FormControl(false),
- storageClassType: new FormControl(TIER_TYPE.LOCAL, Validators.required),
- acls: new FormArray([])
- });
- this.storageClassForm.get('storageClassType')?.valueChanges.subscribe((type: string) => {
- if (type === TIER_TYPE.CLOUD_TIER) {
- const aclsArray = this.storageClassForm.get('acls') as FormArray;
- aclsArray.push(this.createAcls());
- }
- });
- }
-
- public createAcls(): CdFormGroup {
- const group = this.formBuilder.group({
- type: new FormControl(AclTypeConst.ID, Validators.required),
- source_id: new FormControl(''),
- dest_id: new FormControl('')
+ ])
});
-
- const sourceId = group.get('source_id');
- const destId = group.get('dest_id');
-
- const validators = this.getValidatorsType(AclTypeConst.ID);
-
- sourceId.setValidators(validators);
- destId.setValidators(validators);
-
- sourceId.updateValueAndValidity();
- destId.updateValueAndValidity();
-
- group.get('type')?.valueChanges.subscribe((newType: AclType) => {
- const sourceId = group.get('source_id');
- const destId = group.get('dest_id');
-
- const validators = this.getValidatorsType(newType);
-
- sourceId.setValidators(validators);
- destId.setValidators(validators);
-
- sourceId.updateValueAndValidity();
- destId.updateValueAndValidity();
- });
-
return group;
}
- private getValidatorsType(type: AclType) {
- switch (type) {
- case AclTypeConst.EMAIL:
- return [Validators.email];
- case AclTypeConst.URI:
- return [this.urlValidator];
- case AclTypeConst.ID:
- default:
- return [Validators.required];
- }
- }
-
get acls(): FormArray {
return this.storageClassForm.get('acls') as FormArray;
}
});
if (this.editing) {
- const defaultValues = {
+ const defaultValues: {
+ allow_read_through: boolean;
+ read_through_restore_days: number;
+ restore_storage_class: string;
+ multipart_min_part_size: number;
+ multipart_sync_threshold: number;
+ } = {
allow_read_through: false,
read_through_restore_days: STORAGE_CLASS_CONSTANTS.DEFAULT_READTHROUGH_RESTORE_DAYS,
restore_storage_class: STORAGE_CLASS_CONSTANTS.DEFAULT_STORAGE_CLASS,
multipart_min_part_size: STORAGE_CLASS_CONSTANTS.DEFAULT_MULTIPART_MIN_PART_SIZE,
multipart_sync_threshold: STORAGE_CLASS_CONSTANTS.DEFAULT_MULTIPART_SYNC_THRESHOLD
};
- Object.keys(defaultValues).forEach((key) => {
- this.storageClassForm.get(key).setValue(defaultValues[key]);
+ (Object.keys(defaultValues) as Array<keyof typeof defaultValues>).forEach((key) => {
+ this.storageClassForm.get(key)?.setValue(defaultValues[key]);
});
}
}
});
}
+ createForm() {
+ const self = this;
+
+ const lockDaysValidator = CdValidators.custom('lockDays', () => {
+ if (!self.storageClassForm || !self.storageClassForm.getRawValue()) {
+ return false;
+ }
+
+ const lockDays = Number(self.storageClassForm.getValue('read_through_restore_days'));
+ return !Number.isInteger(lockDays) || lockDays === 0;
+ });
+ this.storageClassForm = this.formBuilder.group({
+ storage_class: new FormControl('', {
+ validators: [Validators.required]
+ }),
+ zonegroup: new FormControl(this.selectedZoneGroup, {
+ validators: [Validators.required]
+ }),
+ region: new FormControl('', [
+ CdValidators.composeIf({ storageClassType: TIER_TYPE.CLOUD_TIER }, [Validators.required])
+ ]),
+ placement_target: new FormControl('', {
+ validators: [Validators.required]
+ }),
+ target_endpoint: new FormControl('', [Validators.required, this.urlValidator]),
+ access_key: new FormControl(null, [
+ CdValidators.composeIf({ storageClassType: TIER_TYPE.CLOUD_TIER }, [Validators.required])
+ ]),
+ secret_key: new FormControl(null, [
+ CdValidators.composeIf({ storageClassType: TIER_TYPE.CLOUD_TIER }, [Validators.required])
+ ]),
+ target_path: new FormControl('', [
+ CdValidators.composeIf({ storageClassType: TIER_TYPE.CLOUD_TIER }, [Validators.required])
+ ]),
+ retain_head_object: new FormControl(true),
+ glacier_restore_tier_type: new FormControl(STORAGE_CLASS_CONSTANTS.DEFAULT_STORAGE_CLASS, [
+ CdValidators.composeIf({ storageClassType: TIER_TYPE.GLACIER }, [Validators.required])
+ ]),
+ glacier_restore_days: new FormControl(STORAGE_CLASS_CONSTANTS.DEFAULT_GLACIER_RESTORE_DAYS, [
+ CdValidators.composeIf({ storageClassType: TIER_TYPE.GLACIER || TIER_TYPE.CLOUD_TIER }, [
+ CdValidators.number(false),
+ lockDaysValidator
+ ])
+ ]),
+ restore_storage_class: new FormControl(STORAGE_CLASS_CONSTANTS.DEFAULT_STORAGE_CLASS),
+ read_through_restore_days: new FormControl(
+ {
+ value: STORAGE_CLASS_CONSTANTS.DEFAULT_READTHROUGH_RESTORE_DAYS,
+ disabled: true
+ },
+ CdValidators.composeIf(
+ (form: AbstractControl) => {
+ const type = form.get('storageClassType')?.value;
+ return type === TIER_TYPE.GLACIER || type === TIER_TYPE.CLOUD_TIER;
+ },
+ [CdValidators.number(false), lockDaysValidator]
+ )
+ ),
+ multipart_sync_threshold: new FormControl(
+ STORAGE_CLASS_CONSTANTS.DEFAULT_MULTIPART_SYNC_THRESHOLD
+ ),
+ multipart_min_part_size: new FormControl(
+ STORAGE_CLASS_CONSTANTS.DEFAULT_MULTIPART_MIN_PART_SIZE
+ ),
+ allow_read_through: new FormControl(false),
+ storageClassType: new FormControl(TIER_TYPE.LOCAL, Validators.required),
+ pool: new FormControl('', [
+ CdValidators.composeIf({ storageClassType: TIER_TYPE.LOCAL }, [Validators.required])
+ ]),
+ zone: new FormControl(null, [
+ CdValidators.composeIf({ storageClassType: TIER_TYPE.LOCAL }, [Validators.required])
+ ]),
+ acls: new FormArray([])
+ });
+ this.storageClassForm.get('storageClassType')?.valueChanges.subscribe((type: string) => {
+ if (type === TIER_TYPE.CLOUD_TIER) {
+ const aclsArray = this.storageClassForm.get('acls') as FormArray;
+ aclsArray.clear();
+ aclsArray.push(this.createAcls());
+ }
+ });
+ }
+
loadZoneGroup(): Promise<void> {
return new Promise((resolve, reject) => {
this.rgwZoneGroupService.getAllZonegroupsInfo().subscribe(
(data: ZoneGroupDetails) => {
this.zoneGroupDetails = data;
this.zonegroupNames = [];
- this.placementTargets = [];
+ this.zones = [];
if (data.zonegroups && data.zonegroups.length > 0) {
- this.zonegroupNames = data.zonegroups.map((zoneGroup: ZoneGroup) => {
- return {
- id: zoneGroup.id,
- name: zoneGroup.name
- };
- });
+ this.zonegroupNames = data.zonegroups.map((zoneGroup: ZoneGroup) => ({
+ id: zoneGroup.id,
+ name: zoneGroup.name,
+ zones: zoneGroup.zones
+ }));
}
this.defaultZonegroup = this.zonegroupNames.find(
- (zonegroups: ZoneGroup) => zonegroups.id === data.default_zonegroup
+ (zonegroup) => zonegroup.id === data?.default_zonegroup
);
- this.storageClassForm.get('zonegroup').setValue(this.defaultZonegroup.name);
+ this.storageClassForm.get('zonegroup').setValue(this.defaultZonegroup?.name);
this.onZonegroupChange();
+
resolve();
},
- (error) => reject(error)
+ (error) => {
+ reject(error);
+ }
);
});
}
- onZonegroupChange() {
+ onZonegroupChange(): void {
const zoneGroupControl = this.storageClassForm.get('zonegroup').value;
- const selectedZoneGroup = this.zoneGroupDetails.zonegroups.find(
- (zonegroup) => zonegroup.name === zoneGroupControl
+ const selectedZoneGroup = this.zoneGroupDetails?.zonegroups?.find(
+ (zonegroup) => zonegroup?.name === zoneGroupControl
);
- const defaultPlacementTarget = selectedZoneGroup.placement_targets.find(
+ const defaultPlacementTarget = selectedZoneGroup?.placement_targets?.find(
(target: Target) => target.name === DEFAULT_PLACEMENT
);
- if (selectedZoneGroup) {
- const placementTargetNames = selectedZoneGroup.placement_targets.map(
+
+ if (selectedZoneGroup?.placement_targets) {
+ this.placementTargets = selectedZoneGroup.placement_targets.map(
(target: Target) => target.name
);
- this.placementTargets = placementTargetNames;
}
if (defaultPlacementTarget && !this.editing) {
this.storageClassForm.get('placement_target').setValue(defaultPlacementTarget.name);
} else {
this.storageClassForm
.get('placement_target')
- .setValue(this.storageClassInfo.placement_target);
+ .setValue(this.storageClassInfo?.placement_target || null);
}
+ this.zones = selectedZoneGroup?.zones;
}
submitAction() {
const component = this;
const requestModel = this.buildRequest();
+ const rawFormValue = _.cloneDeep(this.storageClassForm.getRawValue());
+ const zoneRequest: ZoneRequest = {
+ zone_name: this.storageClassForm.get('zone').value,
+ placement_target: this.storageClassForm.get('placement_target').value,
+ storage_class: this.storageClassForm.get('storage_class').value,
+ data_pool: this.storageClassForm.get('pool')?.value || ''
+ };
+
const storageclassName = this.storageClassForm.get('storage_class').value;
if (this.editing) {
- this.rgwStorageService.editStorageClass(requestModel).subscribe(
+ const editStorageClass$ = this.rgwStorageService.editStorageClass(requestModel);
+
+ const editZone$ =
+ rawFormValue.storageClassType === TIER_TYPE.LOCAL
+ ? editStorageClass$.pipe(
+ switchMap(() => this.rgwStorageService.editStorageClassZone(zoneRequest))
+ )
+ : editStorageClass$;
+
+ editZone$.subscribe(
() => {
this.notificationService.show(
NotificationType.success,
- $localize`Updated Storage Class '${storageclassName}'`
+ $localize`Edited Storage Class '${storageclassName}'`
);
this.goToListView();
},
}
);
} else {
- this.rgwStorageService.createStorageClass(requestModel).subscribe(
+ const createStorageClass$ = this.rgwStorageService.createStorageClass(requestModel);
+
+ const createZone$ =
+ rawFormValue.storageClassType === TIER_TYPE.LOCAL
+ ? createStorageClass$.pipe(
+ switchMap(() => this.rgwStorageService.createStorageClassZone(zoneRequest))
+ )
+ : createStorageClass$;
+
+ createZone$.subscribe(
() => {
this.notificationService.show(
NotificationType.success,
);
}
}
-
goToListView() {
this.router.navigate([`rgw/tiering`]);
}