From e826a77919785e651d3c5bad3deb65af8243b319 Mon Sep 17 00:00:00 2001 From: Humble Chirammal Date: Thu, 11 Jan 2018 13:51:03 +0530 Subject: [PATCH 1/2] Add custom volumename option to GlusterFS dynamic PVs. At present glusterfs dynamic PVs are created with random names. However an admin would like to have some handle on the volume names created dynamically for various purposes. One example would be having a filter for sorting out PVs created for a particular storage class. This patch enables the functionality by having a custom volume name as a prefix to dynamic PVs. This is an optional parameter in SC and if set, the dynamic volumes are created in below format where `_` is the field seperator/delimiter: customvolumeprefix_PVCname_randomUUID Signed-off-by: Humble Chirammal --- pkg/volume/glusterfs/glusterfs.go | 45 ++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/pkg/volume/glusterfs/glusterfs.go b/pkg/volume/glusterfs/glusterfs.go index 9afadd1f050..8f2618c765d 100644 --- a/pkg/volume/glusterfs/glusterfs.go +++ b/pkg/volume/glusterfs/glusterfs.go @@ -36,6 +36,7 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/uuid" clientset "k8s.io/client-go/kubernetes" v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/util/mount" @@ -406,17 +407,18 @@ func (plugin *glusterfsPlugin) newProvisionerInternal(options volume.VolumeOptio } type provisionerConfig struct { - url string - user string - userKey string - secretNamespace string - secretName string - secretValue string - clusterID string - gidMin int - gidMax int - volumeType gapi.VolumeDurabilityInfo - volumeOptions []string + url string + user string + userKey string + secretNamespace string + secretName string + secretValue string + clusterID string + gidMin int + gidMax int + volumeType gapi.VolumeDurabilityInfo + volumeOptions []string + volumeNamePrefix string } type glusterfsVolumeProvisioner struct { @@ -743,6 +745,7 @@ func (p *glusterfsVolumeProvisioner) Provision() (*v1.PersistentVolume, error) { func (p *glusterfsVolumeProvisioner) CreateVolume(gid int) (r *v1.GlusterfsVolumeSource, size int, volID string, err error) { var clusterIDs []string + customVolumeName := "" capacity := p.options.PVC.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] // Glusterfs creates volumes in units of GiB, but heketi documentation incorrectly reports GBs sz := int(volume.RoundUpToGiB(capacity)) @@ -760,8 +763,13 @@ func (p *glusterfsVolumeProvisioner) CreateVolume(gid int) (r *v1.GlusterfsVolum clusterIDs = dstrings.Split(p.clusterID, ",") glog.V(4).Infof("provided clusterIDs: %v", clusterIDs) } + + if p.provisionerConfig.volumeNamePrefix != "" { + customVolumeName = fmt.Sprintf("%s_%s_%s", p.provisionerConfig.volumeNamePrefix, p.options.PVC.Name, uuid.NewUUID()) + } + gid64 := int64(gid) - volumeReq := &gapi.VolumeCreateRequest{Size: sz, Clusters: clusterIDs, Gid: gid64, Durability: p.volumeType, GlusterVolumeOptions: p.volumeOptions} + volumeReq := &gapi.VolumeCreateRequest{Size: sz, Name: customVolumeName, Clusters: clusterIDs, Gid: gid64, Durability: p.volumeType, GlusterVolumeOptions: p.volumeOptions} volume, err := cli.VolumeCreate(volumeReq) if err != nil { glog.Errorf("error creating volume %v ", err) @@ -927,6 +935,7 @@ func parseClassParameters(params map[string]string, kubeClient clientset.Interfa authEnabled := true parseVolumeType := "" parseVolumeOptions := "" + parseVolumeNamePrefix := "" for k, v := range params { switch dstrings.ToLower(k) { @@ -977,7 +986,10 @@ func parseClassParameters(params map[string]string, kubeClient clientset.Interfa if len(v) != 0 { parseVolumeOptions = v } - + case "volumenameprefix": + if len(v) != 0 { + parseVolumeNamePrefix = v + } default: return nil, fmt.Errorf("invalid option %q for volume plugin %s", k, glusterfsPluginName) } @@ -1057,6 +1069,13 @@ func parseClassParameters(params map[string]string, kubeClient clientset.Interfa cfg.volumeOptions = volOptions } + + if len(parseVolumeNamePrefix) != 0 { + if dstrings.Contains(parseVolumeNamePrefix, "_") { + return nil, fmt.Errorf("Storageclass parameter 'volumenameprefix' should not contain '_' in its value") + } + cfg.volumeNamePrefix = parseVolumeNamePrefix + } return &cfg, nil } From 66c7fdb8920cca5b095a29f078950747fb29798a Mon Sep 17 00:00:00 2001 From: Humble Chirammal Date: Thu, 11 Jan 2018 14:14:29 +0530 Subject: [PATCH 2/2] Update bazel. Signed-off-by: Humble Chirammal --- pkg/volume/glusterfs/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/volume/glusterfs/BUILD b/pkg/volume/glusterfs/BUILD index a57114c412e..19638dd3d16 100644 --- a/pkg/volume/glusterfs/BUILD +++ b/pkg/volume/glusterfs/BUILD @@ -32,6 +32,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", ], )