]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/dashboard: Adding QAT Compression dropdown on RGW Service form
authorDevika Babrekar <devika.babrekar@ibm.com>
Thu, 4 Dec 2025 09:58:39 +0000 (15:28 +0530)
committerDevika Babrekar <devika.babrekar@ibm.com>
Fri, 12 Dec 2025 09:56:13 +0000 (15:26 +0530)
Fixes:https://tracker.ceph.com/issues/74046
Signed-off-by: Devika Babrekar <devika.babrekar@ibm.com>
PendingReleaseNotes
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/cluster.module.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/service-form/service-form.component.ts
src/pybind/mgr/dashboard/frontend/src/app/shared/models/service.interface.ts

index f056f8e8c61cace50740f70bef0da777cf35ca4f..7648457d3d3c5a47461f3bad97667aa85292904d 100644 (file)
@@ -8,6 +8,8 @@
 * DASHBOARD: Removed the older landing page which was deprecated in Quincy.
   Admins can no longer enable the older, deprecated landing page layout by
   adjusting FEATURE_TOGGLE_DASHBOARD.
+* DASHBOARD: RGW Service form updated to take input regarding QAT compression.
+  - QAT compression is an optional field which can be set to 'Hardware' or 'Software' by selecting options from provided dropdwon. If 'None' is selected, compression is removed altogether.
 * CephFS: The `peer_add` command is deprecated in favor of the `peer_bootstrap` command.
 
 >=20.0.0
index 75d1fa15155e7527b7feeda80d5bcdf775d8f6bb..d5c73717eba24a3df0c3f25d878af4b901d14507 100644 (file)
@@ -17,7 +17,8 @@ import {
   ToggletipModule,
   IconModule,
   IconService,
-  TagModule
+  TagModule,
+  SelectModule
 } from 'carbon-components-angular';
 import Analytics from '@carbon/icons/es/analytics/16';
 import CloseFilled from '@carbon/icons/es/close--filled/16';
@@ -119,7 +120,8 @@ import { TextLabelListComponent } from '~/app/shared/components/text-label-list/
     ToggletipModule,
     IconModule,
     TagModule,
-    TextLabelListComponent
+    TextLabelListComponent,
+    SelectModule
   ],
   declarations: [
     MonitorComponent,
index 4625f2850259a840651e671f8e526ee408714c9b..cdcb637551f718bb9dd7bd7a33b5f7676f10989d 100644 (file)
             </div>
           </div>
         </ng-container>
+
+      <!-- RGW QAT Compression -->
+        @if(serviceForm.controls.service_type.value === 'rgw') {
+        <div class="form-item"
+             formGroupName="qat">
+          <cds-select formControlName="compression"
+                      name="compression"
+                      label="QAT compression mode"
+                      id="compression"
+                      helperText="QAT compression is optional. Choose Hardware or Software to enable compression, or select None to disable it."
+                      i18n-helperText>
+            <option *ngFor="let option of qatCompressionOptions"
+                    [value]="option.value"
+                    i18n>{{ option.label }}</option>
+          </cds-select>
+        </div>
+        }
+
         <!-- Grafana -->
         <ng-container *ngIf="serviceForm.controls.service_type.value === 'grafana'">
           <div class="form-group row">
index b7aaea30aca2c757799820c962b73a5fd35b8bb0..33fdca70b6d1461006da6394ade33f60df3e1d4a 100644 (file)
@@ -17,6 +17,7 @@ import { configureTestBed, FormHelper, Mocks } from '~/testing/unit-test-helper'
 import { ServiceFormComponent } from './service-form.component';
 import { PoolService } from '~/app/shared/api/pool.service';
 import { USER } from '~/app/shared/constants/app.constants';
+import { SelectModule } from 'carbon-components-angular';
 
 // for 'nvmeof' service
 const mockPools = [
@@ -46,6 +47,7 @@ describe('ServiceFormComponent', () => {
       ReactiveFormsModule,
       RouterTestingModule,
       SharedModule,
+      SelectModule,
       ToastrModule.forRoot()
     ]
   });
@@ -293,6 +295,21 @@ describe('ServiceFormComponent', () => {
         expect(ssl_key).toBeNull();
       });
 
+      it('should submit rgw with QAT Compression (None)', () => {
+        formHelper.setValue('service_type', 'rgw');
+        formHelper.setValue(component.serviceForm.get('qat').get('compression'), 'none');
+      });
+
+      it('should submit rgw with QAT Compression (Hardware)', () => {
+        formHelper.setValue('service_type', 'rgw');
+        formHelper.setValue(component.serviceForm.get('qat')?.get('compression'), 'hw');
+      });
+
+      it('should submit rgw with QAT Compression (Software)', () => {
+        formHelper.setValue('service_type', 'rgw');
+        formHelper.setValue(component.serviceForm.get('qat')?.get('compression'), 'sw');
+      });
+
       it('should test .pem file', () => {
         const pemCert = `
 -----BEGIN CERTIFICATE-----
index ceca70914dc3bf035a21d020b875ac238fac5fa5..181101538d2bbbf7650dab021e3abd37053f3689 100644 (file)
@@ -35,7 +35,7 @@ import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
 import { CdValidators } from '~/app/shared/forms/cd-validators';
 import { FinishedTask } from '~/app/shared/models/finished-task';
 import { Host } from '~/app/shared/models/host.interface';
-import { CephServiceSpec } from '~/app/shared/models/service.interface';
+import { CephServiceSpec, QatOptions, QatSepcs } from '~/app/shared/models/service.interface';
 import { ModalCdsService } from '~/app/shared/services/modal-cds.service';
 import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
 import { TimerService } from '~/app/shared/services/timer.service';
@@ -106,6 +106,11 @@ export class ServiceFormComponent extends CdForm implements OnInit {
     selected: false
   }));
   showMgmtGatewayMessage: boolean = false;
+  qatCompressionOptions = [
+    { value: QatOptions.hw, label: 'Hardware' },
+    { value: QatOptions.sw, label: 'Software' },
+    { value: QatOptions.none, label: 'None' }
+  ];
 
   constructor(
     public actionLabels: ActionLabelsI18n,
@@ -283,6 +288,9 @@ export class ServiceFormComponent extends CdForm implements OnInit {
       realm_name: [null],
       zonegroup_name: [null],
       zone_name: [null],
+      qat: new CdFormGroup({
+        compression: new UntypedFormControl(QatOptions.none)
+      }),
       // iSCSI
       trusted_ip_list: [null],
       api_port: [null, [CdValidators.number(false)]],
@@ -709,7 +717,8 @@ export class ServiceFormComponent extends CdForm implements OnInit {
               this.setRgwFields(
                 response[0].spec?.rgw_realm,
                 response[0].spec?.rgw_zonegroup,
-                response[0].spec?.rgw_zone
+                response[0].spec?.rgw_zone,
+                response[0].spec?.qat
               );
               this.serviceForm.get('ssl').setValue(response[0].spec?.ssl);
               if (response[0].spec?.ssl) {
@@ -944,7 +953,7 @@ export class ServiceFormComponent extends CdForm implements OnInit {
     }
   }
 
-  setRgwFields(realm_name?: string, zonegroup_name?: string, zone_name?: string) {
+  setRgwFields(realm_name?: string, zonegroup_name?: string, zone_name?: string, qat?: QatSepcs) {
     const observables = [
       this.rgwRealmService.getAllRealmsInfo(),
       this.rgwZonegroupService.getAllZonegroupsInfo(),
@@ -1012,6 +1021,9 @@ export class ServiceFormComponent extends CdForm implements OnInit {
           this.serviceForm.get('zonegroup_name').setValue(zonegroup_name);
           this.serviceForm.get('zone_name').setValue(zone_name);
         }
+        if (qat) {
+          this.serviceForm.get(`qat.compression`)?.setValue(qat['compression']);
+        }
         if (this.realmList.length === 0) {
           this.showRealmCreationForm = true;
         } else {
@@ -1162,6 +1174,11 @@ export class ServiceFormComponent extends CdForm implements OnInit {
       serviceSpec['rgw_zonegroup'] =
         values['zonegroup_name'] !== 'default' ? values['zonegroup_name'] : null;
       serviceSpec['rgw_zone'] = values['zone_name'] !== 'default' ? values['zone_name'] : null;
+      if (values['qat']['compression'] && values['qat']['compression'] != QatOptions.none) {
+        serviceSpec['qat'] = values['qat'];
+      } else if (values['qat']['compression'] == QatOptions.none) {
+        delete serviceSpec['qat'];
+      }
     }
 
     const serviceId: string = values['service_id'];
index 966774a05a2ceb483462a7cc5d7428b573a18811..c79a9cb4e74a1c2b74712900a10d7e33069c1e98 100644 (file)
@@ -62,6 +62,7 @@ export interface CephServiceAdditionalSpec {
   client_secret: string;
   oidc_issuer_url: string;
   enable_auth: boolean;
+  qat: QatSepcs;
 }
 
 export interface CephServicePlacement {
@@ -70,3 +71,13 @@ export interface CephServicePlacement {
   hosts?: string[];
   label?: string | string[];
 }
+
+export interface QatSepcs {
+  [key: string]: string;
+}
+
+export enum QatOptions {
+  hw = 'hw',
+  sw = 'sw',
+  none = 'none'
+}