]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: add support for NFSv3 exports 56055/head
authorAvan Thakkar <athakkar@redhat.com>
Fri, 8 Mar 2024 07:15:44 +0000 (12:45 +0530)
committerAvan Thakkar <athakkar@redhat.com>
Thu, 21 Mar 2024 18:28:07 +0000 (23:58 +0530)
Fixes: https://tracker.ceph.com/issues/64812
Signed-off-by: Avan Thakkar <athakkar@redhat.com>
src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-form/nfs-form.component.html
src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-form/nfs-form.component.spec.ts
src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-form/nfs-form.component.ts

index 82c97e3229584d873956cd711223e9d63d39c8c7..b9593a5c26800a2a4d6d2e62266f164b9ef51050 100644 (file)
                  for="protocols"
                  i18n>NFS Protocol</label>
           <div class="cd-col-form-input">
+            <div class="custom-control custom-checkbox">
+              <input type="checkbox"
+                     class="custom-control-input"
+                     formControlName="protocolNfsv3"
+                     name="protocolNfsv3"
+                     id="protocolNfsv3">
+              <label for="protocolNfsv3"
+                     class="custom-control-label"
+                     i18n>NFSv3</label>
+            </div>
             <div class="custom-control custom-checkbox">
               <input type="checkbox"
                      class="custom-control-input"
                      formControlName="protocolNfsv4"
                      name="protocolNfsv4"
-                     id="protocolNfsv4"
-                     disabled>
-              <label i18n
+                     id="protocolNfsv4">
+              <label for="protocolNfsv4"
                      class="custom-control-label"
-                     for="protocolNfsv4">NFSv4</label>
+                     i18n>NFSv4</label>
             </div>
             <span class="invalid-feedback"
-                  *ngIf="nfsForm.showError('protocolNfsv4', formDir, 'required')"
+                  *ngIf="nfsForm.showError('protocolNfsv3', formDir, 'required') ||
+                  nfsForm.showError('protocolNfsv4', formDir, 'required')"
                   i18n>This field is required.</span>
+            <hr>
           </div>
         </div>
 
         <!-- Pseudo -->
         <div class="form-group row"
-             *ngIf="nfsForm.getValue('protocolNfsv4')">
+             *ngIf="nfsForm.getValue('protocolNfsv4') || nfsForm.getValue('protocolNfsv3')">
           <label class="cd-col-form-label"
                  for="pseudo">
             <span class="required"
index 62efec423d36aac61f13cf28988ce0e64ccbbcdc..65267a1579164ac565b023b9db0483c2daf8de6a 100644 (file)
@@ -99,6 +99,7 @@ describe('NfsFormComponent', () => {
       fsal: { fs_name: 'a', name: 'CEPH' },
       path: '/',
       protocolNfsv4: true,
+      protocolNfsv3: true,
       pseudo: '',
       sec_label_xattr: 'security.selinux',
       security_label: false,
@@ -121,8 +122,9 @@ describe('NfsFormComponent', () => {
     expect(component.nfsForm.get('cluster_id').disabled).toBeTruthy();
   });
 
-  it('should mark NFSv4 protocol as enabled always', () => {
+  it('should mark NFSv4 & NFSv3 protocols as enabled always', () => {
     expect(component.nfsForm.get('protocolNfsv4')).toBeTruthy();
+    expect(component.nfsForm.get('protocolNfsv3')).toBeTruthy();
   });
 
   it('should match backend squash values with ui values', () => {
@@ -142,6 +144,7 @@ describe('NfsFormComponent', () => {
         fsal: { name: 'CEPH', fs_name: 1 },
         path: '/foo',
         protocolNfsv4: true,
+        protocolNfsv3: true,
         pseudo: '/baz',
         squash: 'no_root_squash',
         transportTCP: true,
@@ -157,6 +160,31 @@ describe('NfsFormComponent', () => {
       component.nfsForm.patchValue({ export_id: 1 });
       component.submitAction();
 
+      const req = httpTesting.expectOne('api/nfs-ganesha/export/cluster1/1');
+      expect(req.request.method).toBe('PUT');
+      expect(req.request.body).toEqual({
+        access_type: 'RW',
+        clients: [],
+        cluster_id: 'cluster1',
+        export_id: 1,
+        fsal: { fs_name: 1, name: 'CEPH', sec_label_xattr: null },
+        path: '/foo',
+        protocols: [3, 4],
+        pseudo: '/baz',
+        security_label: false,
+        squash: 'no_root_squash',
+        transports: ['TCP', 'UDP']
+      });
+    });
+
+    it('should call update with selected nfs protocol', () => {
+      activatedRoute.setParams({ cluster_id: 'cluster1', export_id: '1' });
+      component.isEdit = true;
+      component.cluster_id = 'cluster1';
+      component.export_id = '1';
+      component.nfsForm.patchValue({ export_id: 1, protocolNfsv3: false });
+      component.submitAction();
+
       const req = httpTesting.expectOne('api/nfs-ganesha/export/cluster1/1');
       expect(req.request.method).toBe('PUT');
       expect(req.request.body).toEqual({
@@ -190,7 +218,7 @@ describe('NfsFormComponent', () => {
           sec_label_xattr: null
         },
         path: '/foo',
-        protocols: [4],
+        protocols: [3, 4],
         pseudo: '/baz',
         security_label: false,
         squash: 'no_root_squash',
index 540b7bfe64bee69b4d8df3168507564c6770715d..0543a9eb7abbdb3d4ce81b1f06e99ad7cb1c66ec 100644 (file)
@@ -156,10 +156,23 @@ export class NfsFormComponent extends CdForm implements OnInit {
         })
       }),
       path: new UntypedFormControl('/'),
-      protocolNfsv4: new UntypedFormControl(true),
+      protocolNfsv3: new UntypedFormControl(true, {
+        validators: [
+          CdValidators.requiredIf({ protocolNfsv4: false }, (value: boolean) => {
+            return !value;
+          })
+        ]
+      }),
+      protocolNfsv4: new UntypedFormControl(true, {
+        validators: [
+          CdValidators.requiredIf({ protocolNfsv3: false }, (value: boolean) => {
+            return !value;
+          })
+        ]
+      }),
       pseudo: new UntypedFormControl('', {
         validators: [
-          CdValidators.requiredIf({ protocolNfsv4: true }),
+          CdValidators.requiredIf({ protocolNfsv4: true, protocolNfsv3: true }),
           Validators.pattern('^/[^><|&()]*$')
         ]
       }),
@@ -194,6 +207,7 @@ export class NfsFormComponent extends CdForm implements OnInit {
     }
 
     res.protocolNfsv4 = res.protocols.indexOf(4) !== -1;
+    res.protocolNfsv3 = res.protocols.indexOf(3) !== -1;
     delete res.protocols;
 
     res.transportTCP = res.transports.indexOf('TCP') !== -1;
@@ -471,11 +485,16 @@ export class NfsFormComponent extends CdForm implements OnInit {
     }
 
     requestModel.protocols = [];
+    if (requestModel.protocolNfsv3) {
+      requestModel.protocols.push(3);
+    }
     if (requestModel.protocolNfsv4) {
       requestModel.protocols.push(4);
-    } else {
+    }
+    if (!requestModel.protocolNfsv3 && !requestModel.protocolNfsv4) {
       requestModel.pseudo = null;
     }
+    delete requestModel.protocolNfsv3;
     delete requestModel.protocolNfsv4;
 
     requestModel.transports = [];