From a1f30ddea340247c95514fbd386e3dd9783f569a Mon Sep 17 00:00:00 2001 From: Philippe Gagnon Date: Wed, 27 Jun 2018 18:54:33 -0400 Subject: [PATCH 1/2] Propagate StorageClass MountOptions to PVs created by nfs-client-provisioner --- lib/controller/controller.go | 31 +++++++++++++++++-- lib/controller/volume.go | 4 +++ .../cmd/nfs-client-provisioner/provisioner.go | 1 + 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/controller/controller.go b/lib/controller/controller.go index f2ffdac83cc..6c1ca61f0ad 100644 --- a/lib/controller/controller.go +++ b/lib/controller/controller.go @@ -1029,11 +1029,17 @@ func (ctrl *ProvisionController) provisionClaimOperation(claim *v1.PersistentVol } } + mountOptions, err := ctrl.fetchMountOptions(claimClass) + if err != nil { + return err + } + options := VolumeOptions{ PersistentVolumeReclaimPolicy: reclaimPolicy, - PVName: pvName, - PVC: claim, - Parameters: parameters, + PVName: pvName, + PVC: claim, + MountOptions: mountOptions, + Parameters: parameters, } ctrl.eventRecorder.Event(claim, v1.EventTypeNormal, "Provisioning", fmt.Sprintf("External provisioner is provisioning volume for claim %q", claimToClaimKey(claim))) @@ -1361,3 +1367,22 @@ func (ctrl *ProvisionController) fetchReclaimPolicy(storageClassName string) (v1 return v1.PersistentVolumeReclaimDelete, fmt.Errorf("Cannot convert object to StorageClass: %+v", classObj) } + +func (ctrl *ProvisionController) fetchMountOptions(storageClassName string) ([]string, error) { + classObj, found, err := ctrl.classes.GetByKey(storageClassName) + if err != nil { + return nil, err + } + if !found { + return nil, fmt.Errorf("StorageClass %q not found", storageClassName) + } + + switch class := classObj.(type) { + case *storage.StorageClass: + return class.MountOptions, nil + case *storagebeta.StorageClass: + return class.MountOptions, nil + } + + return nil, fmt.Errorf("Cannot convert object to StorageClass: %+v", classObj) +} diff --git a/lib/controller/volume.go b/lib/controller/volume.go index a714ce1ba57..a8684349098 100644 --- a/lib/controller/volume.go +++ b/lib/controller/volume.go @@ -68,6 +68,10 @@ type VolumeOptions struct { // PV.Name of the appropriate PersistentVolume. Used to generate cloud // volume name. PVName string + + // PV mount options. Not validated - mount of the PVs will simply fail if one is invalid. + MountOptions []string + // PVC is reference to the claim that lead to provisioning of a new PV. // Provisioners *must* create a PV that would be matched by this PVC, // i.e. with required capacity, accessMode, labels matching PVC.Selector and diff --git a/nfs-client/cmd/nfs-client-provisioner/provisioner.go b/nfs-client/cmd/nfs-client-provisioner/provisioner.go index ccb0292b8ef..5f02930832d 100644 --- a/nfs-client/cmd/nfs-client-provisioner/provisioner.go +++ b/nfs-client/cmd/nfs-client-provisioner/provisioner.go @@ -76,6 +76,7 @@ func (p *nfsProvisioner) Provision(options controller.VolumeOptions) (*v1.Persis Spec: v1.PersistentVolumeSpec{ PersistentVolumeReclaimPolicy: options.PersistentVolumeReclaimPolicy, AccessModes: options.PVC.Spec.AccessModes, + MountOptions: options.MountOptions, Capacity: v1.ResourceList{ v1.ResourceName(v1.ResourceStorage): options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)], }, From 2315d58e8378e6edf7f7a3a37fadd8d57ccf1291 Mon Sep 17 00:00:00 2001 From: Philippe Gagnon Date: Wed, 27 Jun 2018 19:35:50 -0400 Subject: [PATCH 2/2] Run go fmt on controller.go Travis CI tests were failing due to alignment being incorrect in modified VolumeOptions block at line 1037. --- lib/controller/controller.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/controller/controller.go b/lib/controller/controller.go index 6c1ca61f0ad..1a1ea67652e 100644 --- a/lib/controller/controller.go +++ b/lib/controller/controller.go @@ -1036,10 +1036,10 @@ func (ctrl *ProvisionController) provisionClaimOperation(claim *v1.PersistentVol options := VolumeOptions{ PersistentVolumeReclaimPolicy: reclaimPolicy, - PVName: pvName, - PVC: claim, - MountOptions: mountOptions, - Parameters: parameters, + PVName: pvName, + PVC: claim, + MountOptions: mountOptions, + Parameters: parameters, } ctrl.eventRecorder.Event(claim, v1.EventTypeNormal, "Provisioning", fmt.Sprintf("External provisioner is provisioning volume for claim %q", claimToClaimKey(claim)))