From 7a0d219d12d7754ad41d2b4c6559749207005600 Mon Sep 17 00:00:00 2001 From: Humble Chirammal Date: Tue, 15 Nov 2016 06:57:00 +0530 Subject: [PATCH] Use Gid when provisioning Gluster Volumes. BUG # https://github.com/openshift/origin/issues/11556 Signed-off-by: Humble Chirammal --- pkg/volume/glusterfs/BUILD | 1 + pkg/volume/glusterfs/glusterfs.go | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/pkg/volume/glusterfs/BUILD b/pkg/volume/glusterfs/BUILD index 0250fb8dc36..274340e9e85 100644 --- a/pkg/volume/glusterfs/BUILD +++ b/pkg/volume/glusterfs/BUILD @@ -29,6 +29,7 @@ go_library( "//pkg/util/strings:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", + "//pkg/volume/util/volumehelper:go_default_library", "//vendor:github.com/golang/glog", "//vendor:github.com/heketi/heketi/client/api/go-client", "//vendor:github.com/heketi/heketi/pkg/glusterfs/api", diff --git a/pkg/volume/glusterfs/glusterfs.go b/pkg/volume/glusterfs/glusterfs.go index bb2f49eb3d1..cd7ea371f8e 100644 --- a/pkg/volume/glusterfs/glusterfs.go +++ b/pkg/volume/glusterfs/glusterfs.go @@ -18,9 +18,12 @@ package glusterfs import ( "fmt" + "math/rand" "os" "path" + "strconv" dstrings "strings" + "time" "github.com/golang/glog" gcli "github.com/heketi/heketi/client/api/go-client" @@ -35,6 +38,7 @@ import ( "k8s.io/kubernetes/pkg/util/strings" "k8s.io/kubernetes/pkg/volume" volutil "k8s.io/kubernetes/pkg/volume/util" + "k8s.io/kubernetes/pkg/volume/util/volumehelper" "runtime" ) @@ -60,6 +64,8 @@ const ( volPrefix = "vol_" dynamicEpSvcPrefix = "glusterfs-dynamic-" replicaCount = 3 + gidMax = 600000 + gidMin = 2000 durabilityType = "replicate" secretKeyName = "key" // key name used in secret annGlusterURL = "glusterfs.kubernetes.io/url" @@ -481,6 +487,8 @@ func (d *glusterfsVolumeDeleter) Delete() error { func (r *glusterfsVolumeProvisioner) Provision() (*api.PersistentVolume, error) { var err error + var reqGid int64 + gidRandomizer := rand.New(rand.NewSource(time.Now().UnixNano())) if r.options.PVC.Spec.Selector != nil { glog.V(4).Infof("glusterfs: not able to parse your claim Selector") return nil, fmt.Errorf("glusterfs: not able to parse your claim Selector") @@ -492,9 +500,9 @@ func (r *glusterfsVolumeProvisioner) Provision() (*api.PersistentVolume, error) return nil, err } r.provisioningConfig = *cfg - glog.V(4).Infof("glusterfs: creating volume with configuration %+v", r.provisioningConfig) - glusterfs, sizeGB, err := r.CreateVolume() + reqGid = gidMin + gidRandomizer.Int63n(gidMax) + glusterfs, sizeGB, err := r.CreateVolume(reqGid) if err != nil { glog.Errorf("glusterfs: create volume err: %v.", err) return nil, fmt.Errorf("glusterfs: create volume err: %v.", err) @@ -506,13 +514,15 @@ func (r *glusterfsVolumeProvisioner) Provision() (*api.PersistentVolume, error) if len(pv.Spec.AccessModes) == 0 { pv.Spec.AccessModes = r.plugin.GetAccessModes() } + sGid := strconv.FormatInt(reqGid, 10) + pv.Annotations = map[string]string{volumehelper.VolumeGidAnnotationKey: sGid} pv.Spec.Capacity = api.ResourceList{ api.ResourceName(api.ResourceStorage): resource.MustParse(fmt.Sprintf("%dGi", sizeGB)), } return pv, nil } -func (p *glusterfsVolumeProvisioner) CreateVolume() (r *api.GlusterfsVolumeSource, size int, err error) { +func (p *glusterfsVolumeProvisioner) CreateVolume(reqGid int64) (r *api.GlusterfsVolumeSource, size int, err error) { capacity := p.options.PVC.Spec.Resources.Requests[api.ResourceName(api.ResourceStorage)] volSizeBytes := capacity.Value() sz := int(volume.RoundUpSize(volSizeBytes, 1024*1024*1024)) @@ -526,7 +536,7 @@ func (p *glusterfsVolumeProvisioner) CreateVolume() (r *api.GlusterfsVolumeSourc glog.Errorf("glusterfs: failed to create glusterfs rest client") return nil, 0, fmt.Errorf("failed to create glusterfs REST client, REST server authentication failed") } - volumeReq := &gapi.VolumeCreateRequest{Size: sz, Durability: gapi.VolumeDurabilityInfo{Type: durabilityType, Replicate: gapi.ReplicaDurability{Replica: replicaCount}}} + volumeReq := &gapi.VolumeCreateRequest{Size: sz, Gid: reqGid, Durability: gapi.VolumeDurabilityInfo{Type: durabilityType, Replicate: gapi.ReplicaDurability{Replica: replicaCount}}} volume, err := cli.VolumeCreate(volumeReq) if err != nil { glog.Errorf("glusterfs: error creating volume %v ", err)