diff --git a/pkg/volume/csi/csi_block.go b/pkg/volume/csi/csi_block.go index 6be3ec24947..389b80a443d 100644 --- a/pkg/volume/csi/csi_block.go +++ b/pkg/volume/csi/csi_block.go @@ -276,6 +276,7 @@ func (m *csiBlockMapper) MapDevice(devicePath, globalMapPath, volumeMapPath, vol csiSource.VolumeAttributes, nodePublishSecrets, fsTypeBlockName, + []string{}, ) if err != nil { diff --git a/pkg/volume/csi/csi_client.go b/pkg/volume/csi/csi_client.go index a712105b413..1d41400d115 100644 --- a/pkg/volume/csi/csi_client.go +++ b/pkg/volume/csi/csi_client.go @@ -49,6 +49,7 @@ type csiClient interface { volumeAttribs map[string]string, nodePublishSecrets map[string]string, fsType string, + mountOptions []string, ) error NodeUnpublishVolume( ctx context.Context, @@ -138,6 +139,7 @@ func (c *csiDriverClient) NodePublishVolume( volumeAttribs map[string]string, nodePublishSecrets map[string]string, fsType string, + mountOptions []string, ) error { glog.V(4).Info(log("calling NodePublishVolume rpc [volid=%s,target_path=%s]", volID, targetPath)) if volID == "" { @@ -177,7 +179,8 @@ func (c *csiDriverClient) NodePublishVolume( } else { req.VolumeCapability.AccessType = &csipb.VolumeCapability_Mount{ Mount: &csipb.VolumeCapability_MountVolume{ - FsType: fsType, + FsType: fsType, + MountFlags: mountOptions, }, } } diff --git a/pkg/volume/csi/csi_client_test.go b/pkg/volume/csi/csi_client_test.go index f589aeaa9a4..83ae82de993 100644 --- a/pkg/volume/csi/csi_client_test.go +++ b/pkg/volume/csi/csi_client_test.go @@ -60,6 +60,7 @@ func (c *fakeCsiDriverClient) NodePublishVolume( volumeAttribs map[string]string, nodePublishSecrets map[string]string, fsType string, + mountOptions []string, ) error { c.t.Log("calling fake.NodePublishVolume...") req := &csipb.NodePublishVolumeRequest{ @@ -75,7 +76,8 @@ func (c *fakeCsiDriverClient) NodePublishVolume( }, AccessType: &csipb.VolumeCapability_Mount{ Mount: &csipb.VolumeCapability_MountVolume{ - FsType: fsType, + FsType: fsType, + MountFlags: mountOptions, }, }, }, @@ -268,6 +270,7 @@ func TestClientNodePublishVolume(t *testing.T) { map[string]string{"attr0": "val0"}, map[string]string{}, tc.fsType, + []string{}, ) checkErr(t, tc.mustFail, err) diff --git a/pkg/volume/csi/csi_mounter.go b/pkg/volume/csi/csi_mounter.go index 28c0d9a93f0..dfc9cd4a86d 100644 --- a/pkg/volume/csi/csi_mounter.go +++ b/pkg/volume/csi/csi_mounter.go @@ -195,6 +195,7 @@ func (c *csiMountMgr) SetUpAt(dir string, fsGroup *int64) error { attribs, nodePublishSecrets, fsType, + c.spec.PersistentVolume.Spec.MountOptions, ) if err != nil { diff --git a/pkg/volume/csi/csi_mounter_test.go b/pkg/volume/csi/csi_mounter_test.go index b3b087281ac..4aa1a44d797 100644 --- a/pkg/volume/csi/csi_mounter_test.go +++ b/pkg/volume/csi/csi_mounter_test.go @@ -164,6 +164,7 @@ func MounterSetUpTests(t *testing.T, podInfoEnabled bool) { pv := makeTestPV("test-pv", 10, test.driver, testVol) pv.Spec.CSI.VolumeAttributes = test.attributes + pv.Spec.MountOptions = []string{"foo=bar", "baz=qux"} pvName := pv.GetName() mounter, err := plug.NewMounter( @@ -240,6 +241,9 @@ func MounterSetUpTests(t *testing.T, podInfoEnabled bool) { if vol.Path != csiMounter.GetPath() { t.Errorf("csi server expected path %s, got %s", csiMounter.GetPath(), vol.Path) } + if !reflect.DeepEqual(vol.MountFlags, pv.Spec.MountOptions) { + t.Errorf("csi server expected mount options %v, got %v", pv.Spec.MountOptions, vol.MountFlags) + } if podInfoEnabled { if !reflect.DeepEqual(vol.Attributes, test.expectedAttributes) { t.Errorf("csi server expected attributes %+v, got %+v", test.expectedAttributes, vol.Attributes) diff --git a/pkg/volume/csi/csi_plugin.go b/pkg/volume/csi/csi_plugin.go index a9083e53594..7b2d79271c2 100644 --- a/pkg/volume/csi/csi_plugin.go +++ b/pkg/volume/csi/csi_plugin.go @@ -333,7 +333,10 @@ func (p *csiPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.S func (p *csiPlugin) SupportsMountOption() bool { // TODO (vladimirvivien) use CSI VolumeCapability.MountVolume.mount_flags // to probe for the result for this method - return false + // (bswartz) Until the CSI spec supports probing, our only option is to + // make plugins register their support for mount options or lack thereof + // directly with kubernetes. + return true } func (p *csiPlugin) SupportsBulkVolumeVerification() bool { diff --git a/pkg/volume/csi/fake/fake_client.go b/pkg/volume/csi/fake/fake_client.go index 40b08f264bb..775ff7ddfbf 100644 --- a/pkg/volume/csi/fake/fake_client.go +++ b/pkg/volume/csi/fake/fake_client.go @@ -59,6 +59,7 @@ func (f *IdentityClient) Probe(ctx context.Context, in *csipb.ProbeRequest, opts type CSIVolume struct { Attributes map[string]string Path string + MountFlags []string } // NodeClient returns CSI node client @@ -126,6 +127,7 @@ func (f *NodeClient) NodePublishVolume(ctx context.Context, req *csipb.NodePubli f.nodePublishedVolumes[req.GetVolumeId()] = CSIVolume{ Path: req.GetTargetPath(), Attributes: req.GetVolumeAttributes(), + MountFlags: req.GetVolumeCapability().GetMount().MountFlags, } return &csipb.NodePublishVolumeResponse{}, nil }