diff --git a/pkg/volume/aws_ebs/aws_ebs.go b/pkg/volume/aws_ebs/aws_ebs.go index 480ecd234be..84498e4b9b9 100644 --- a/pkg/volume/aws_ebs/aws_ebs.go +++ b/pkg/volume/aws_ebs/aws_ebs.go @@ -244,7 +244,7 @@ func (plugin *awsElasticBlockStorePlugin) ConstructVolumeSpec(volName, mountPath // Abstract interface to PD operations. type ebsManager interface { - CreateVolume(provisioner *awsElasticBlockStoreProvisioner) (volumeID aws.KubernetesVolumeID, volumeSizeGB int, labels map[string]string, err error) + CreateVolume(provisioner *awsElasticBlockStoreProvisioner) (volumeID aws.KubernetesVolumeID, volumeSizeGB int, labels map[string]string, fstype string, err error) // Deletes a volume DeleteVolume(deleter *awsElasticBlockStoreDeleter) error } @@ -434,12 +434,16 @@ func (c *awsElasticBlockStoreProvisioner) Provision() (*v1.PersistentVolume, err return nil, fmt.Errorf("invalid AccessModes %v: only AccessModes %v are supported", c.options.PVC.Spec.AccessModes, c.plugin.GetAccessModes()) } - volumeID, sizeGB, labels, err := c.manager.CreateVolume(c) + volumeID, sizeGB, labels, fstype, err := c.manager.CreateVolume(c) if err != nil { glog.Errorf("Provision failed: %v", err) return nil, err } + if fstype == "" { + fstype = "ext4" + } + pv := &v1.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ Name: c.options.PVName, @@ -457,7 +461,7 @@ func (c *awsElasticBlockStoreProvisioner) Provision() (*v1.PersistentVolume, err PersistentVolumeSource: v1.PersistentVolumeSource{ AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{ VolumeID: string(volumeID), - FSType: "ext4", + FSType: fstype, Partition: 0, ReadOnly: false, }, diff --git a/pkg/volume/aws_ebs/aws_ebs_test.go b/pkg/volume/aws_ebs/aws_ebs_test.go index bdec21a7b63..3766b21254a 100644 --- a/pkg/volume/aws_ebs/aws_ebs_test.go +++ b/pkg/volume/aws_ebs/aws_ebs_test.go @@ -93,10 +93,10 @@ type fakePDManager struct { // TODO(jonesdl) To fully test this, we could create a loopback device // and mount that instead. -func (fake *fakePDManager) CreateVolume(c *awsElasticBlockStoreProvisioner) (volumeID aws.KubernetesVolumeID, volumeSizeGB int, labels map[string]string, err error) { +func (fake *fakePDManager) CreateVolume(c *awsElasticBlockStoreProvisioner) (volumeID aws.KubernetesVolumeID, volumeSizeGB int, labels map[string]string, fstype string, err error) { labels = make(map[string]string) labels["fakepdmanager"] = "yes" - return "test-aws-volume-name", 100, labels, nil + return "test-aws-volume-name", 100, labels, "", nil } func (fake *fakePDManager) DeleteVolume(cd *awsElasticBlockStoreDeleter) error { diff --git a/pkg/volume/aws_ebs/aws_util.go b/pkg/volume/aws_ebs/aws_util.go index ef667c9b872..711a9eaed39 100644 --- a/pkg/volume/aws_ebs/aws_util.go +++ b/pkg/volume/aws_ebs/aws_util.go @@ -65,10 +65,10 @@ func (util *AWSDiskUtil) DeleteVolume(d *awsElasticBlockStoreDeleter) error { // CreateVolume creates an AWS EBS volume. // Returns: volumeID, volumeSizeGB, labels, error -func (util *AWSDiskUtil) CreateVolume(c *awsElasticBlockStoreProvisioner) (aws.KubernetesVolumeID, int, map[string]string, error) { +func (util *AWSDiskUtil) CreateVolume(c *awsElasticBlockStoreProvisioner) (aws.KubernetesVolumeID, int, map[string]string, string, error) { cloud, err := getCloudProvider(c.awsElasticBlockStore.plugin.host.GetCloudProvider()) if err != nil { - return "", 0, nil, err + return "", 0, nil, "", err } // AWS volumes don't have Name field, store the name in Name tag @@ -89,6 +89,7 @@ func (util *AWSDiskUtil) CreateVolume(c *awsElasticBlockStoreProvisioner) (aws.K Tags: tags, PVCName: c.options.PVC.Name, } + fstype := "" // Apply Parameters (case-insensitive). We leave validation of // the values to the cloud provider. volumeOptions.ZonePresent = false @@ -106,33 +107,35 @@ func (util *AWSDiskUtil) CreateVolume(c *awsElasticBlockStoreProvisioner) (aws.K case "iopspergb": volumeOptions.IOPSPerGB, err = strconv.Atoi(v) if err != nil { - return "", 0, nil, fmt.Errorf("invalid iopsPerGB value %q, must be integer between 1 and 30: %v", v, err) + return "", 0, nil, "", fmt.Errorf("invalid iopsPerGB value %q, must be integer between 1 and 30: %v", v, err) } case "encrypted": volumeOptions.Encrypted, err = strconv.ParseBool(v) if err != nil { - return "", 0, nil, fmt.Errorf("invalid encrypted boolean value %q, must be true or false: %v", v, err) + return "", 0, nil, "", fmt.Errorf("invalid encrypted boolean value %q, must be true or false: %v", v, err) } case "kmskeyid": volumeOptions.KmsKeyId = v + case volume.VolumeParameterFSType: + fstype = v default: - return "", 0, nil, fmt.Errorf("invalid option %q for volume plugin %s", k, c.plugin.GetPluginName()) + return "", 0, nil, "", fmt.Errorf("invalid option %q for volume plugin %s", k, c.plugin.GetPluginName()) } } if volumeOptions.ZonePresent && volumeOptions.ZonesPresent { - return "", 0, nil, fmt.Errorf("both zone and zones StorageClass parameters must not be used at the same time") + return "", 0, nil, "", fmt.Errorf("both zone and zones StorageClass parameters must not be used at the same time") } // TODO: implement PVC.Selector parsing if c.options.PVC.Spec.Selector != nil { - return "", 0, nil, fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on AWS") + return "", 0, nil, "", fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on AWS") } name, err := cloud.CreateDisk(volumeOptions) if err != nil { glog.V(2).Infof("Error creating EBS Disk volume: %v", err) - return "", 0, nil, err + return "", 0, nil, "", err } glog.V(2).Infof("Successfully created EBS Disk volume %s", name) @@ -142,7 +145,7 @@ func (util *AWSDiskUtil) CreateVolume(c *awsElasticBlockStoreProvisioner) (aws.K glog.Errorf("error building labels for new EBS volume %q: %v", name, err) } - return name, int(requestGB), labels, nil + return name, int(requestGB), labels, fstype, nil } // Returns the first path that exists, or empty string if none exist. diff --git a/pkg/volume/azure_dd/azure_provision.go b/pkg/volume/azure_dd/azure_provision.go index e47da2402e8..df27da4c584 100644 --- a/pkg/volume/azure_dd/azure_provision.go +++ b/pkg/volume/azure_dd/azure_provision.go @@ -113,7 +113,7 @@ func (p *azureDiskProvisioner) Provision() (*v1.PersistentVolume, error) { strKind = v case "cachingmode": cachingMode = v1.AzureDataDiskCachingMode(v) - case "fstype": + case volume.VolumeParameterFSType: fsType = strings.ToLower(v) default: return nil, fmt.Errorf("AzureDisk - invalid option %s in storage class", k) diff --git a/pkg/volume/cinder/cinder.go b/pkg/volume/cinder/cinder.go index 6e0e25e87dd..034a5f8e8cd 100644 --- a/pkg/volume/cinder/cinder.go +++ b/pkg/volume/cinder/cinder.go @@ -32,7 +32,7 @@ import ( "k8s.io/kubernetes/pkg/cloudprovider/providers/rackspace" "k8s.io/kubernetes/pkg/util/keymutex" "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/util/strings" + kstrings "k8s.io/kubernetes/pkg/util/strings" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumehelper" @@ -241,7 +241,7 @@ type cdManager interface { // Detaches the disk from the kubelet's host machine. DetachDisk(unmounter *cinderVolumeUnmounter) error // Creates a volume - CreateVolume(provisioner *cinderVolumeProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error) + CreateVolume(provisioner *cinderVolumeProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, fstype string, err error) // Deletes a volume DeleteVolume(deleter *cinderVolumeDeleter) error } @@ -380,7 +380,7 @@ func makeGlobalPDName(host volume.VolumeHost, devName string) string { func (cd *cinderVolume) GetPath() string { name := cinderVolumePluginName - return cd.plugin.host.GetPodVolumeDir(cd.podUID, strings.EscapeQualifiedNameForDisk(name), cd.volName) + return cd.plugin.host.GetPodVolumeDir(cd.podUID, kstrings.EscapeQualifiedNameForDisk(name), cd.volName) } type cinderVolumeUnmounter struct { @@ -467,7 +467,7 @@ var _ volume.Deleter = &cinderVolumeDeleter{} func (r *cinderVolumeDeleter) GetPath() string { name := cinderVolumePluginName - return r.plugin.host.GetPodVolumeDir(r.podUID, strings.EscapeQualifiedNameForDisk(name), r.volName) + return r.plugin.host.GetPodVolumeDir(r.podUID, kstrings.EscapeQualifiedNameForDisk(name), r.volName) } func (r *cinderVolumeDeleter) Delete() error { @@ -486,7 +486,7 @@ func (c *cinderVolumeProvisioner) Provision() (*v1.PersistentVolume, error) { return nil, fmt.Errorf("invalid AccessModes %v: only AccessModes %v are supported", c.options.PVC.Spec.AccessModes, c.plugin.GetAccessModes()) } - volumeID, sizeGB, labels, err := c.manager.CreateVolume(c) + volumeID, sizeGB, labels, fstype, err := c.manager.CreateVolume(c) if err != nil { return nil, err } @@ -508,7 +508,7 @@ func (c *cinderVolumeProvisioner) Provision() (*v1.PersistentVolume, error) { PersistentVolumeSource: v1.PersistentVolumeSource{ Cinder: &v1.CinderVolumeSource{ VolumeID: volumeID, - FSType: "ext4", + FSType: fstype, ReadOnly: false, }, }, diff --git a/pkg/volume/cinder/cinder_test.go b/pkg/volume/cinder/cinder_test.go index 7b2966504ea..d4cf53cdc71 100644 --- a/pkg/volume/cinder/cinder_test.go +++ b/pkg/volume/cinder/cinder_test.go @@ -116,8 +116,8 @@ func (fake *fakePDManager) DetachDisk(c *cinderVolumeUnmounter) error { return nil } -func (fake *fakePDManager) CreateVolume(c *cinderVolumeProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error) { - return "test-volume-name", 1, nil, nil +func (fake *fakePDManager) CreateVolume(c *cinderVolumeProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, fstype string, err error) { + return "test-volume-name", 1, nil, "", nil } func (fake *fakePDManager) DeleteVolume(cd *cinderVolumeDeleter) error { diff --git a/pkg/volume/cinder/cinder_util.go b/pkg/volume/cinder/cinder_util.go index 53fb5904cb0..9a4b824fabc 100644 --- a/pkg/volume/cinder/cinder_util.go +++ b/pkg/volume/cinder/cinder_util.go @@ -158,10 +158,10 @@ func getZonesFromNodes(kubeClient clientset.Interface) (sets.String, error) { return zones, nil } -func (util *CinderDiskUtil) CreateVolume(c *cinderVolumeProvisioner) (volumeID string, volumeSizeGB int, volumeLabels map[string]string, err error) { +func (util *CinderDiskUtil) CreateVolume(c *cinderVolumeProvisioner) (volumeID string, volumeSizeGB int, volumeLabels map[string]string, fstype string, err error) { cloud, err := c.plugin.getCloudProvider() if err != nil { - return "", 0, nil, err + return "", 0, nil, "", err } capacity := c.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] @@ -179,13 +179,15 @@ func (util *CinderDiskUtil) CreateVolume(c *cinderVolumeProvisioner) (volumeID s vtype = v case "availability": availability = v + case volume.VolumeParameterFSType: + fstype = v default: - return "", 0, nil, fmt.Errorf("invalid option %q for volume plugin %s", k, c.plugin.GetPluginName()) + return "", 0, nil, "", fmt.Errorf("invalid option %q for volume plugin %s", k, c.plugin.GetPluginName()) } } // TODO: implement PVC.Selector parsing if c.options.PVC.Spec.Selector != nil { - return "", 0, nil, fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on Cinder") + return "", 0, nil, "", fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on Cinder") } if availability == "" { @@ -193,7 +195,7 @@ func (util *CinderDiskUtil) CreateVolume(c *cinderVolumeProvisioner) (volumeID s zones, err := getZonesFromNodes(c.plugin.host.GetKubeClient()) if err != nil { glog.V(2).Infof("error getting zone information: %v", err) - return "", 0, nil, err + return "", 0, nil, "", err } // if we did not get any zones, lets leave it blank and gophercloud will // use zone "nova" as default @@ -205,7 +207,7 @@ func (util *CinderDiskUtil) CreateVolume(c *cinderVolumeProvisioner) (volumeID s volumeID, volumeAZ, errr := cloud.CreateVolume(name, volSizeGB, vtype, availability, c.options.CloudTags) if errr != nil { glog.V(2).Infof("Error creating cinder volume: %v", errr) - return "", 0, nil, errr + return "", 0, nil, "", errr } glog.V(2).Infof("Successfully created cinder volume %s", volumeID) @@ -213,7 +215,7 @@ func (util *CinderDiskUtil) CreateVolume(c *cinderVolumeProvisioner) (volumeID s volumeLabels = make(map[string]string) volumeLabels[kubeletapis.LabelZoneFailureDomain] = volumeAZ - return volumeID, volSizeGB, volumeLabels, nil + return volumeID, volSizeGB, volumeLabels, fstype, nil } func probeAttachedVolume() error { diff --git a/pkg/volume/gce_pd/gce_pd.go b/pkg/volume/gce_pd/gce_pd.go index af076858a47..b59835b3877 100644 --- a/pkg/volume/gce_pd/gce_pd.go +++ b/pkg/volume/gce_pd/gce_pd.go @@ -28,7 +28,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/util/mount" - "k8s.io/kubernetes/pkg/util/strings" + kstrings "k8s.io/kubernetes/pkg/util/strings" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumehelper" @@ -53,7 +53,7 @@ const ( ) func getPath(uid types.UID, volName string, host volume.VolumeHost) string { - return host.GetPodVolumeDir(uid, strings.EscapeQualifiedNameForDisk(gcePersistentDiskPluginName), volName) + return host.GetPodVolumeDir(uid, kstrings.EscapeQualifiedNameForDisk(gcePersistentDiskPluginName), volName) } func (plugin *gcePersistentDiskPlugin) Init(host volume.VolumeHost) error { @@ -211,7 +211,7 @@ func (plugin *gcePersistentDiskPlugin) ConstructVolumeSpec(volumeName, mountPath // Abstract interface to PD operations. type pdManager interface { // Creates a volume - CreateVolume(provisioner *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error) + CreateVolume(provisioner *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, fstype string, err error) // Deletes a volume DeleteVolume(deleter *gcePersistentDiskDeleter) error } @@ -379,11 +379,15 @@ func (c *gcePersistentDiskProvisioner) Provision() (*v1.PersistentVolume, error) return nil, fmt.Errorf("invalid AccessModes %v: only AccessModes %v are supported", c.options.PVC.Spec.AccessModes, c.plugin.GetAccessModes()) } - volumeID, sizeGB, labels, err := c.manager.CreateVolume(c) + volumeID, sizeGB, labels, fstype, err := c.manager.CreateVolume(c) if err != nil { return nil, err } + if fstype == "" { + fstype = "ext4" + } + pv := &v1.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{ Name: c.options.PVName, @@ -403,6 +407,7 @@ func (c *gcePersistentDiskProvisioner) Provision() (*v1.PersistentVolume, error) PDName: volumeID, Partition: 0, ReadOnly: false, + FSType: fstype, }, }, }, diff --git a/pkg/volume/gce_pd/gce_pd_test.go b/pkg/volume/gce_pd/gce_pd_test.go index 4b7d2724a56..5f9b3619fe3 100644 --- a/pkg/volume/gce_pd/gce_pd_test.go +++ b/pkg/volume/gce_pd/gce_pd_test.go @@ -86,10 +86,10 @@ func contains(modes []v1.PersistentVolumeAccessMode, mode v1.PersistentVolumeAcc type fakePDManager struct { } -func (fake *fakePDManager) CreateVolume(c *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, err error) { +func (fake *fakePDManager) CreateVolume(c *gcePersistentDiskProvisioner) (volumeID string, volumeSizeGB int, labels map[string]string, fstype string, err error) { labels = make(map[string]string) labels["fakepdmanager"] = "yes" - return "test-gce-volume-name", 100, labels, nil + return "test-gce-volume-name", 100, labels, "", nil } func (fake *fakePDManager) DeleteVolume(cd *gcePersistentDiskDeleter) error { diff --git a/pkg/volume/gce_pd/gce_util.go b/pkg/volume/gce_pd/gce_util.go index 03efa75b316..d78126c66cc 100644 --- a/pkg/volume/gce_pd/gce_util.go +++ b/pkg/volume/gce_pd/gce_util.go @@ -71,10 +71,10 @@ func (util *GCEDiskUtil) DeleteVolume(d *gcePersistentDiskDeleter) error { // CreateVolume creates a GCE PD. // Returns: volumeID, volumeSizeGB, labels, error -func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (string, int, map[string]string, error) { +func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (string, int, map[string]string, string, error) { cloud, err := getCloudProvider(c.gcePersistentDisk.plugin.host.GetCloudProvider()) if err != nil { - return "", 0, nil, err + return "", 0, nil, "", err } name := volume.GenerateVolumeName(c.options.ClusterName, c.options.PVName, 63) // GCE PD name can have up to 63 characters @@ -90,6 +90,7 @@ func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (strin configuredZones := "" zonePresent := false zonesPresent := false + fstype := "" for k, v := range c.options.Parameters { switch strings.ToLower(k) { case "type": @@ -100,18 +101,20 @@ func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (strin case "zones": zonesPresent = true configuredZones = v + case volume.VolumeParameterFSType: + fstype = v default: - return "", 0, nil, fmt.Errorf("invalid option %q for volume plugin %s", k, c.plugin.GetPluginName()) + return "", 0, nil, "", fmt.Errorf("invalid option %q for volume plugin %s", k, c.plugin.GetPluginName()) } } if zonePresent && zonesPresent { - return "", 0, nil, fmt.Errorf("both zone and zones StorageClass parameters must not be used at the same time") + return "", 0, nil, "", fmt.Errorf("both zone and zones StorageClass parameters must not be used at the same time") } // TODO: implement PVC.Selector parsing if c.options.PVC.Spec.Selector != nil { - return "", 0, nil, fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on GCE") + return "", 0, nil, "", fmt.Errorf("claim.Spec.Selector is not supported for dynamic provisioning on GCE") } var zones sets.String @@ -119,17 +122,17 @@ func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (strin zones, err = cloud.GetAllZones() if err != nil { glog.V(2).Infof("error getting zone information from GCE: %v", err) - return "", 0, nil, err + return "", 0, nil, "", err } } if !zonePresent && zonesPresent { if zones, err = volume.ZonesToSet(configuredZones); err != nil { - return "", 0, nil, err + return "", 0, nil, "", err } } if zonePresent && !zonesPresent { if err := volume.ValidateZone(configuredZone); err != nil { - return "", 0, nil, err + return "", 0, nil, "", err } zones = make(sets.String) zones.Insert(configuredZone) @@ -139,7 +142,7 @@ func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (strin err = cloud.CreateDisk(name, diskType, zone, int64(requestGB), *c.options.CloudTags) if err != nil { glog.V(2).Infof("Error creating GCE PD volume: %v", err) - return "", 0, nil, err + return "", 0, nil, "", err } glog.V(2).Infof("Successfully created GCE PD volume %s", name) @@ -149,7 +152,7 @@ func (gceutil *GCEDiskUtil) CreateVolume(c *gcePersistentDiskProvisioner) (strin glog.Errorf("error getting labels for volume %q: %v", name, err) } - return name, int(requestGB), labels, nil + return name, int(requestGB), labels, fstype, nil } // Returns the first path that exists, or empty string if none exist. diff --git a/pkg/volume/photon_pd/photon_util.go b/pkg/volume/photon_pd/photon_util.go index 646c2b65f84..7449abfe9d2 100644 --- a/pkg/volume/photon_pd/photon_util.go +++ b/pkg/volume/photon_pd/photon_util.go @@ -102,7 +102,7 @@ func (util *PhotonDiskUtil) CreateVolume(p *photonPersistentDiskProvisioner) (pd switch strings.ToLower(parameter) { case "flavor": volumeOptions.Flavor = value - case "fstype": + case volume.VolumeParameterFSType: fstype = value glog.V(4).Infof("Photon Controller Util: Setting fstype to %s", fstype) default: diff --git a/pkg/volume/plugins.go b/pkg/volume/plugins.go index 98e6910aa0b..cbc27391096 100644 --- a/pkg/volume/plugins.go +++ b/pkg/volume/plugins.go @@ -34,6 +34,14 @@ import ( "k8s.io/kubernetes/pkg/util/mount" ) +const ( + // Common parameter which can be specified in StorageClass to specify the desired FSType + // Provisioners SHOULD implement support for this if they are block device based + // Must be a filesystem type supported by the host operating system. + // Ex. "ext4", "xfs", "ntfs". Default value depends on the provisioner + VolumeParameterFSType = "fstype" +) + // VolumeOptions contains option information about a volume. type VolumeOptions struct { // The attributes below are required by volume.Provisioner diff --git a/pkg/volume/rbd/rbd.go b/pkg/volume/rbd/rbd.go index 6590f659dad..fd0dd7f0df6 100644 --- a/pkg/volume/rbd/rbd.go +++ b/pkg/volume/rbd/rbd.go @@ -275,6 +275,7 @@ func (r *rbdVolumeProvisioner) Provision() (*v1.PersistentVolume, error) { secretName := "" secret := "" imageFormat := rbdImageFormat1 + fstype := "" for k, v := range r.options.Parameters { switch dstrings.ToLower(k) { @@ -306,6 +307,8 @@ func (r *rbdVolumeProvisioner) Provision() (*v1.PersistentVolume, error) { r.imageFeatures = append(r.imageFeatures, f) } } + case volume.VolumeParameterFSType: + fstype = v default: return nil, fmt.Errorf("invalid option %q for volume plugin %s", k, r.plugin.GetPluginName()) } @@ -353,6 +356,7 @@ func (r *rbdVolumeProvisioner) Provision() (*v1.PersistentVolume, error) { rbd.SecretRef = new(v1.LocalObjectReference) rbd.SecretRef.Name = secretName rbd.RadosUser = r.Id + rbd.FSType = fstype pv.Spec.PersistentVolumeSource.RBD = rbd pv.Spec.PersistentVolumeReclaimPolicy = r.options.PersistentVolumeReclaimPolicy pv.Spec.AccessModes = r.options.PVC.Spec.AccessModes diff --git a/pkg/volume/vsphere_volume/vsphere_volume_util.go b/pkg/volume/vsphere_volume/vsphere_volume_util.go index 17277c8c3c9..4a43402a61c 100644 --- a/pkg/volume/vsphere_volume/vsphere_volume_util.go +++ b/pkg/volume/vsphere_volume/vsphere_volume_util.go @@ -38,7 +38,6 @@ const ( diskSCSIPrefix = "wwn-0x" diskformat = "diskformat" datastore = "datastore" - Fstype = "fstype" StoragePolicyName = "storagepolicyname" HostFailuresToTolerateCapability = "hostfailurestotolerate" @@ -109,7 +108,7 @@ func (util *VsphereDiskUtil) CreateVolume(v *vsphereVolumeProvisioner) (volSpec volumeOptions.DiskFormat = value case datastore: volumeOptions.Datastore = value - case Fstype: + case volume.VolumeParameterFSType: fstype = value glog.V(4).Infof("Setting fstype as %q", fstype) case StoragePolicyName: