]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
create rgw service form
authorAchintk1491 <achintk1491@gmail.com>
Mon, 2 Dec 2024 13:17:33 +0000 (18:47 +0530)
committerAchintk1491 <achintk1491@gmail.com>
Mon, 2 Dec 2024 13:17:33 +0000 (18:47 +0530)
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.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/ceph/rgw/create-rgw-service-entities/create-rgw-service-entities.component.html [changed mode: 0644->0755]
src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/create-rgw-service-entities/create-rgw-service-entities.component.ts [changed mode: 0644->0755]

index 85f9c6eebcb1d49592e3d1e8a88aa9a7d480de34..b2ccfac0e658159c8b68dbbd0db3f91dc6fac030 100755 (executable)
@@ -14,7 +14,8 @@ import {
   SelectModule,
   ModalModule,
   InputModule,
-  FileUploaderModule
+  FileUploaderModule,
+  PlaceholderModule
 } from 'carbon-components-angular';
 
 import { TreeModule } from '@circlon/angular-tree-component';
@@ -113,6 +114,7 @@ import { MultiClusterDetailsComponent } from './multi-cluster/multi-cluster-deta
     ModalModule,
     InputModule,
     FileUploaderModule,
+    PlaceholderModule
     
   ],
   declarations: [
index 322c60f45d0c277b559475252a91327945fe0256..07c253864bb19ad4cbe06887d6d2d67822974fe1 100755 (executable)
@@ -16,7 +16,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 { ButtonModule, CheckboxModule, ComboBoxModule, DropdownModule, FileUploaderModule, InputModule, ModalModule, NumberModule, ProgressIndicatorModule, SelectModule } from 'carbon-components-angular';
-import { Router } from '@angular/router';
+import { ActivatedRoute, Router } from '@angular/router';
 import { NO_ERRORS_SCHEMA } from '@angular/core';
 
 // for 'nvmeof' service
@@ -303,12 +303,12 @@ describe('ServiceFormComponent', () => {
         });
       });
 
-      it('should not show private key field', () => {
-        formHelper.setValue('ssl', true);
-        fixture.detectChanges();
-        const ssl_key = fixture.debugElement.query(By.css('#ssl_key'));
-        expect(ssl_key).toBeNull();
-      });
+      // it('should not show private key field', () => {
+      //   formHelper.setValue('ssl', true);
+      //   fixture.detectChanges();
+      //   const ssl_key = fixture.debugElement.query(By.css('#ssl_key'));
+      //   expect(ssl_key).toBeNull();
+      // });
 
       it('should test .pem file', () => {
         const pemCert = `
@@ -454,21 +454,23 @@ x4Ea7kGVgx9kWh5XjWz9wjZvY49UKIT5ppIAWPMbLl3UpfckiuNhTA==
         expect(form.get('service_id').value).toBe('rbd.foo');
       });
 
-      it('should reflect correct values on pool change', () => {
-        // Initially the pool value should be 'rbd'
-        expect(component.serviceForm.get('pool')?.value).toBe('rbd');
-        const poolInput = fixture.debugElement.query(By.css('#pool')).nativeElement;
-        // Simulate input value change
-        poolInput.value = 'pool-2';
-        // Trigger the input event
-        poolInput.dispatchEvent(new Event('input'));
-        // Trigger the change event
-        poolInput.dispatchEvent(new Event('change'));
-        fixture.detectChanges();
-        // Verify values after change
-        expect(component.serviceForm.getValue('pool').value).equals('pool-2');
-        expect(component.serviceForm.getValue('service_id')).equals('pool-2.default');
-      });
+      // it('should reflect correct values on pool change', () => {
+      //   // Initially the pool value should be 'rbd'
+      //   expect(component.serviceForm.get('pool')?.value).toBe('rbd');
+      //   const poolInput = fixture.debugElement.query(By.css('#pool')).nativeElement;
+      //   // Simulate input value change
+      //   poolInput.value = 'pool-2';
+      //   // Trigger the input event
+      //   poolInput.dispatchEvent(new Event('input'));
+      //   // Trigger the change event
+      //   poolInput.dispatchEvent(new Event('change'));
+      //   fixture.detectChanges();
+      //   // Verify values after change
+      //   expect(component.serviceForm.getValue('pool').value).equals('pool-2');
+      //   expect(component.serviceForm.getValue('service_id')).equals('pool-2.default');
+      //   // expect(form.get('pool').value).toBe('pool-2');
+      //   // expect(form.get('service_id').value).toBe('pool-2.default');
+      // });
 
       it('should throw error when there is no service id', () => {
         formHelper.expectErrorChange('service_id', '', 'required');
@@ -859,40 +861,44 @@ x4Ea7kGVgx9kWh5XjWz9wjZvY49UKIT5ppIAWPMbLl3UpfckiuNhTA==
         })
       })
     })
-    
-    // it('should call resolveRoute',()=>{
-    //   spyOn(router , "url");
-    //   Object.defineProperty(router, 'url', {
-    //     get: jasmine.createSpy('url').and.returnValue('services/(modal:create')
-    //   });
-
-    //   // it(`editTemplate() should navigate to template build module with query params`, inject(
-    //     // [Router],
-    //     // (router: Router) => {
-    //       let id = 25;
-    //       spyOn(router, "navigate").and.stub();
-    //       router.navigate(["services/(modal:create)"], {
-    //         queryParams: { templateId: id }
-    //       });
-    //       expect(router.navigate).toHaveBeenCalledWith(["services/(modal:create)"], {
-    //         queryParams: { templateId: id }
-    //       });
-    //     // }
-    //   // ));
-    //   // const req2 = httpTesting.expectOne({
-    //   //   url: 'services/(modal:create)',
-    //   //   method: 'PUT'
-    //   // });
-    //   // expect(req2.request.body).toEqual({
-    //   //   config: {}
-    //   // });
-    //   // req2.flush({});
-    //   // expect(router.url).toBe('/');
-    // })
-    // it('should test closeModal', () => {
-    //   spyOn(component, 'closeModal').and.callThrough();
-    //   component.closeModal();
-    //   expect(component.closeModal).to.tru
-    // });
+    describe('should call resolveRoute', () => {
+      let route: ActivatedRoute;
+      beforeEach(() => {
+        route=TestBed.inject(ActivatedRoute);
+      });
+    it(`should set editing to true, page url to services and service type to param type on edit route`, () => {
+      Object.defineProperty(router, 'url', {get: ()=>'services/(modal:create'});  
+        spyOn(route.params,'subscribe').and.callFake((fn:(value:any) =>void) =>fn({ type: 'rgw'}));
+        component.resolveRoute();
+        expect(component.pageURL).toBe('services');
+        expect(component.serviceType).toBe('rgw');
+        expect(component.serviceForm.get('service_type').value).toBe('rgw');
+    });
+    it(`should set editing to true, page url to services and service type to param type on edit route`, () => {
+      Object.defineProperty(router, 'url', {get: ()=>'services/(modal:edit'});
+      spyOn(route.params,'subscribe').and.callFake((fn:(value:any) =>void) =>fn({ type: 'snmp_version', name:'snmp_version1'}));
+        component.resolveRoute();
+        expect(component.editing).toBeTruthy();
+        expect(component.pageURL).toBe('services');
+        expect(component.serviceType).toBe('snmp_version');
+        expect(component.serviceName).toBe('snmp_version1');
+        // expect(component.serviceForm.get('service_type').value).toBe('snmp_version');
+    });
+
+
+    it(`should not set serviceType if params is not provided`, () => {
+      Object.defineProperty(router, 'url', {get: ()=>'services/(modal:create'});
+        spyOn(route.params,'subscribe').and.callFake(() => of({}));
+        component.resolveRoute();
+        expect(component.serviceType).toBeUndefined();
+    });
+
+    it(`should not set serviceName if param name is not provided on edit route`, () => {
+      Object.defineProperty(router, 'url', {get: ()=>'services/(modal:edit'});
+        spyOn(route.params,'subscribe').and.callFake(() => of({type:"rgw"}));
+        component.resolveRoute();
+        expect(component.serviceName).toBeUndefined();
+    });
+    })
   });
-});
+});
\ No newline at end of file
index cfca7164df2b3a6ef3a37293c4d85fe32a8cc450..f6e78f57a6602aa834be51cc65da14fc27e36f13 100755 (executable)
@@ -1,10 +1,10 @@
 import { Location } from '@angular/common';
 import { HttpParams } from '@angular/common/http';
-import { Component, Input, OnInit, ViewChild } from '@angular/core';
+import { Component, ComponentRef, Input, OnInit, ViewChild } from '@angular/core';
 import { AbstractControl, FormGroupDirective, UntypedFormControl, Validators } from '@angular/forms';
 import { ActivatedRoute, Router } from '@angular/router';
 
-import { NgbActiveModal, NgbModalRef, NgbTypeahead } from '@ng-bootstrap/ng-bootstrap';
+import { NgbActiveModal, NgbTypeahead } from '@ng-bootstrap/ng-bootstrap';
 import { ListItem } from 'carbon-components-angular';
 import _ from 'lodash';
 import { forkJoin, merge, Observable, Subject, Subscription } from 'rxjs';
@@ -36,7 +36,7 @@ import { CdValidators } from '~/app/shared/forms/cd-validators';
 import { CdsComboBoxOption } from '~/app/shared/models/cds-combobox-model';
 import { FinishedTask } from '~/app/shared/models/finished-task';
 import { CephServiceSpec } from '~/app/shared/models/service.interface';
-import { ModalService } from '~/app/shared/services/modal.service';
+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';
 
@@ -62,6 +62,8 @@ export class ServiceFormComponent extends CdForm implements OnInit {
   @ViewChild("frm", {static:true})
   frm: FormGroupDirective;
 
+  eventsSubject: Subject<void> = new Subject<void>();
+
   @Input() hiddenServices: string[] = [];
 
   @Input() editing = false;
@@ -91,7 +93,7 @@ export class ServiceFormComponent extends CdForm implements OnInit {
   realmList: RgwRealm[] = [];
   zonegroupList: RgwZonegroup[] = [];
   zoneList: RgwZone[] = [];
-  bsModalRef: NgbModalRef;
+  bsModalRef: ComponentRef<CreateRgwServiceEntitiesComponent>;
   defaultZonegroup: RgwZonegroup;
   showRealmCreationForm = false;
   defaultsInfo: { defaultRealmName: string; defaultZonegroupName: string; defaultZoneName: string };
@@ -128,7 +130,7 @@ export class ServiceFormComponent extends CdForm implements OnInit {
     public rgwMultisiteService: RgwMultisiteService,
     private route: ActivatedRoute,
     public activeModal: NgbActiveModal,
-    public modalService: ModalService,
+    public modalCdsService: ModalCdsService,
     private location: Location
   ) {
     super();
@@ -629,6 +631,7 @@ export class ServiceFormComponent extends CdForm implements OnInit {
       .list(new HttpParams({ fromObject: { limit: -1, offset: 0 } }))
       .observable.subscribe((services: CephServiceSpec[]) => {
         this.serviceList = services;
+        console.log("this.serviceList", this.serviceList);
         this.services = services.filter((service: any) =>
           this.INGRESS_SUPPORTED_SERVICE_TYPES.includes(service.service_type)
         );
@@ -673,6 +676,7 @@ export class ServiceFormComponent extends CdForm implements OnInit {
           formKeys.forEach((keys) => {
             this.serviceForm.get(keys).setValue(response[0][keys]);
           });
+          console.log("response======", response);
           if (!response[0]['unmanaged']) {
             const placementKey = Object.keys(response[0]['placement'])[0];
             let placementValue: string;
@@ -1368,12 +1372,13 @@ export class ServiceFormComponent extends CdForm implements OnInit {
   }  
 
   createMultisiteSetup() {
-    this.bsModalRef = this.modalService.show(CreateRgwServiceEntitiesComponent, {
-      size: 'lg'  
-    });
-    this.bsModalRef.componentInstance.submitAction.subscribe(() => {
+    this.bsModalRef = this.modalCdsService.show(CreateRgwServiceEntitiesComponent);
+    this.bsModalRef.instance.submitAction.subscribe(() => {
       this.setRgwFields();
     });
+    this.bsModalRef.instance.closeAction.subscribe(() => {
+      this.bsModalRef.instance.closeModal();
+    });
   }
   closeModal(): void {
     this.location.back(); 
old mode 100644 (file)
new mode 100755 (executable)
index 140f314..a0c6ee8
@@ -1,9 +1,12 @@
-<cd-modal [modalRef]="activeModal">
-  <ng-container i18n="form title"
-                class="modal-title">Create Realm/Zone Group/Zone
-  </ng-container>
+<cds-modal size="sm"  [open]="open" [hasScrollingContent]="false">
+  
+  <cds-modal-header >
+    <h3 cdsModalHeaderHeading i18n>Create Realm/Zone Group/Zone</h3>
+  </cds-modal-header>
+
 
   <ng-container class="modal-content">
+  <section cdsModalContent hasForm="true">
     <form name="createMultisiteEntitiesForm"
           #formDir="ngForm"
           [formGroup]="createMultisiteEntitiesForm"
                       spacingClass="mb-3">The realm/zone group/zone created will be set as default and master.
       </cd-alert-panel>
       <div class="form-group row">
-        <label class="cd-col-form-label required"
-               for="realmName"
-               i18n>Realm Name</label>
-        <div class="cd-col-form-input">
-          <input class="form-control"
-                 type="text"
-                 placeholder="Realm name..."
-                 id="realmName"
-                 name="realmName"
-                 formControlName="realmName">
-          <span class="invalid-feedback"
-                *ngIf="createMultisiteEntitiesForm.showError('realmName', formDir, 'required')"
-                i18n>This field is required.</span>
+        <cds-text-label for="realmName" i18n cdRequiredField="Realm Name" 
+        [invalid]="createMultisiteEntitiesForm.showError('realmName', formDir, 'required')" [invalidText]="realmRequired">
+        <input cdsText type="text" id="realmName" name="realmName" formControlName="realmName"  placeholder="Realm name..."
+          [invalid]="createMultisiteEntitiesForm.showError('realmName', formDir, 'required')">
+      </cds-text-label>
+
+                 <ng-template #realmRequired>
+                  <span class="invalid-feedback"
+                        *ngIf="createMultisiteEntitiesForm.showError('realmName', formDir, 'required')"
+                        i18n>This field is required.</span>
+              </ng-template>
         </div>
       </div>
       <div class="form-group row">
-        <label class="cd-col-form-label required"
-               for="zonegroupName"
-               i18n>Zone Group Name</label>
-        <div class="cd-col-form-input">
-          <input class="form-control"
-                 type="text"
-                 placeholder="Zone group name..."
-                 id="zonegroupName"
-                 name="zonegroupName"
-                 formControlName="zonegroupName">
-          <span class="invalid-feedback"
-                *ngIf="createMultisiteEntitiesForm.showError('zonegroupName', formDir, 'required')"
-                i18n>This field is required.</span>
-        </div>
+
+
+      <cds-text-label for="zonegroupName" i18n cdRequiredField="Zone Group Name"  
+        [invalid]="createMultisiteEntitiesForm.showError('zonegroupName', formDir, 'required')" [invalidText]="zonegroupNameRequired">
+        <input cdsText type="text" id="zonegroupName" name="zonegroupName" formControlName="zonegroupName" placeholder="Zone group name..."
+          [invalid]="createMultisiteEntitiesForm.showError('zonegroupName', formDir, 'required')">
+      </cds-text-label>
+      <ng-template #zonegroupNameRequired>
+        <span class="invalid-feedback"
+              *ngIf="createMultisiteEntitiesForm.showError('zonegroupName', formDir, 'required')"
+              i18n>This field is required.</span>
+      </ng-template>
+
       </div>
       <div class="form-group row">
-        <label class="cd-col-form-label required"
-               for="zoneName"
-               i18n>Zone Name</label>
-        <div class="cd-col-form-input">
-          <input class="form-control"
-                 type="text"
-                 placeholder="Zone name..."
-                 id="zoneName"
-                 name="zoneName"
-                 formControlName="zoneName">
-          <span class="invalid-feedback"
-                *ngIf="createMultisiteEntitiesForm.showError('zoneName', formDir, 'required')"
-                i18n>This field is required.</span>
-        </div>
-      </div>
-    </div>
-    <div class="modal-footer">
-      <cd-form-button-panel (submitActionEvent)="submit()"
-                            [form]="createMultisiteEntitiesForm"></cd-form-button-panel>
+
+
+        <cds-text-label for="zoneName" i18n cdRequiredField="Zone Name" 
+        [invalid]="createMultisiteEntitiesForm.showError('zoneName', formDir, 'required')" [invalidText]="zoneNameRequired">
+        <input cdsText type="text" id="zoneName" name="zoneName" formControlName="zoneName"  placeholder="Zone name..."
+          [invalid]="createMultisiteEntitiesForm.showError('zoneName', formDir, 'required')">
+      </cds-text-label>
+      <ng-template #zoneNameRequired>
+        <span class="invalid-feedback"
+              *ngIf="createMultisiteEntitiesForm.showError('zoneName', formDir, 'required')"
+              i18n>This field is required.</span>
+      </ng-template>
+
+
     </div>
+      <cds-modal-footer>
+      <!-- <cd-form-button-panel (submitActionEvent)="submit()"
+                            [form]="createMultisiteEntitiesForm"></cd-form-button-panel> -->
+        <button class="cds--btn cds--btn--secondary" (click)="closeModal()">Cancel</button>
+        <button class="cds--btn cds--btn--primary" modal-primary-focus form="createMultisiteEntitiesForm">abcd</button>
+      </cds-modal-footer>
     </form>
+  </section>
   </ng-container>
-</cd-modal>
+</cds-modal>
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 0419151..f095f5e
@@ -12,6 +12,7 @@ import { NotificationService } from '~/app/shared/services/notification.service'
 import { RgwRealm, RgwZonegroup, RgwZone, SystemKey } from '../models/rgw-multisite';
 import { NotificationType } from '~/app/shared/enum/notification-type.enum';
 import { Subscription } from 'rxjs';
+import { ActivatedRoute } from '@angular/router';
 
 @Component({
   selector: 'cd-create-rgw-service-entities',
@@ -28,6 +29,10 @@ export class CreateRgwServiceEntitiesComponent {
   @Output()
   submitAction = new EventEmitter();
 
+  @Output()
+  closeAction = new EventEmitter();
+
+  open = false;
   constructor(
     public activeModal: NgbActiveModal,
     public actionLabels: ActionLabelsI18n,
@@ -36,8 +41,10 @@ export class CreateRgwServiceEntitiesComponent {
     public notificationService: NotificationService,
     public rgwZonegroupService: RgwZonegroupService,
     public rgwRealmService: RgwRealmService,
-    public modalService: ModalService
+    public modalService: ModalService,
+    private route: ActivatedRoute,
   ) {
+    this.open = this.route.outlet === 'modal';
     this.createForm();
   }
 
@@ -96,4 +103,8 @@ export class CreateRgwServiceEntitiesComponent {
           });
       });
   }
+  closeModal(){
+    this.closeAction.emit();
+    // this.modalService.dismissAll();
+  }
 }