From ba72411aa26f5faff505a6d874c5cb3252c17e73 Mon Sep 17 00:00:00 2001 From: Mike Dame Date: Tue, 26 Jan 2021 11:19:32 -0500 Subject: [PATCH] Move GetPersistentVolumeClaimClass to component-helpers The goal of this move is related to issue 89930, to break the dependence of scheduling plugins on internal helpers. This function can easily move to component-helpers where it will be used by other components as well. --- pkg/apis/core/v1/helper/helpers.go | 25 ----------- pkg/controller/volume/persistentvolume/BUILD | 1 + .../volume/persistentvolume/pv_controller.go | 16 +++---- .../volume/persistentvolume/util/BUILD | 2 +- .../volume/persistentvolume/util/util.go | 8 ++-- pkg/controller/volume/scheduling/BUILD | 1 + .../scheduling/scheduler_assume_cache.go | 4 +- .../volume/scheduling/scheduler_binder.go | 5 ++- pkg/quota/v1/evaluator/core/BUILD | 1 + .../core/persistent_volume_claims.go | 4 +- .../framework/plugins/nodevolumelimits/BUILD | 1 + .../framework/plugins/nodevolumelimits/csi.go | 4 +- .../framework/plugins/volumezone/BUILD | 2 +- .../plugins/volumezone/volume_zone.go | 4 +- pkg/volume/glusterfs/BUILD | 2 +- pkg/volume/glusterfs/glusterfs.go | 6 +-- pkg/volume/util/BUILD | 2 +- pkg/volume/util/util.go | 4 +- staging/src/k8s.io/component-helpers/BUILD | 1 + .../k8s.io/component-helpers/storage/OWNERS | 8 ++++ .../component-helpers/storage/volume/BUILD | 24 ++++++++++ .../storage/volume/helpers.go | 44 +++++++++++++++++++ vendor/modules.txt | 1 + 23 files changed, 114 insertions(+), 56 deletions(-) create mode 100644 staging/src/k8s.io/component-helpers/storage/OWNERS create mode 100644 staging/src/k8s.io/component-helpers/storage/volume/BUILD create mode 100644 staging/src/k8s.io/component-helpers/storage/volume/helpers.go diff --git a/pkg/apis/core/v1/helper/helpers.go b/pkg/apis/core/v1/helper/helpers.go index d60ca300b09..7f08ccbd560 100644 --- a/pkg/apis/core/v1/helper/helpers.go +++ b/pkg/apis/core/v1/helper/helpers.go @@ -388,31 +388,6 @@ func GetMatchingTolerations(taints []v1.Taint, tolerations []v1.Toleration) (boo return true, result } -// GetPersistentVolumeClass returns StorageClassName. -func GetPersistentVolumeClass(volume *v1.PersistentVolume) string { - // Use beta annotation first - if class, found := volume.Annotations[v1.BetaStorageClassAnnotation]; found { - return class - } - - return volume.Spec.StorageClassName -} - -// GetPersistentVolumeClaimClass returns StorageClassName. If no storage class was -// requested, it returns "". -func GetPersistentVolumeClaimClass(claim *v1.PersistentVolumeClaim) string { - // Use beta annotation first - if class, found := claim.Annotations[v1.BetaStorageClassAnnotation]; found { - return class - } - - if claim.Spec.StorageClassName != nil { - return *claim.Spec.StorageClassName - } - - return "" -} - // ScopedResourceSelectorRequirementsAsSelector converts the ScopedResourceSelectorRequirement api type into a struct that implements // labels.Selector. func ScopedResourceSelectorRequirementsAsSelector(ssr v1.ScopedResourceSelectorRequirement) (labels.Selector, error) { diff --git a/pkg/controller/volume/persistentvolume/BUILD b/pkg/controller/volume/persistentvolume/BUILD index c84e77f8eed..43a21e4936b 100644 --- a/pkg/controller/volume/persistentvolume/BUILD +++ b/pkg/controller/volume/persistentvolume/BUILD @@ -56,6 +56,7 @@ go_library( "//staging/src/k8s.io/client-go/util/workqueue:go_default_library", "//staging/src/k8s.io/cloud-provider:go_default_library", "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", + "//staging/src/k8s.io/component-helpers/storage/volume:go_default_library", "//staging/src/k8s.io/csi-translation-lib:go_default_library", "//staging/src/k8s.io/mount-utils:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", diff --git a/pkg/controller/volume/persistentvolume/pv_controller.go b/pkg/controller/volume/persistentvolume/pv_controller.go index ad5ac88bff1..61e417c2403 100644 --- a/pkg/controller/volume/persistentvolume/pv_controller.go +++ b/pkg/controller/volume/persistentvolume/pv_controller.go @@ -39,7 +39,7 @@ import ( "k8s.io/client-go/util/workqueue" cloudprovider "k8s.io/cloud-provider" volerr "k8s.io/cloud-provider/volume/errors" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + storagehelpers "k8s.io/component-helpers/storage/volume" "k8s.io/kubernetes/pkg/controller/volume/common" "k8s.io/kubernetes/pkg/controller/volume/events" "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/metrics" @@ -285,8 +285,8 @@ func checkVolumeSatisfyClaim(volume *v1.PersistentVolume, claim *v1.PersistentVo return fmt.Errorf("requested PV is too small") } - requestedClass := v1helper.GetPersistentVolumeClaimClass(claim) - if v1helper.GetPersistentVolumeClass(volume) != requestedClass { + requestedClass := storagehelpers.GetPersistentVolumeClaimClass(claim) + if storagehelpers.GetPersistentVolumeClass(volume) != requestedClass { return fmt.Errorf("storageClassName does not match") } @@ -353,7 +353,7 @@ func (ctrl *PersistentVolumeController) syncUnboundClaim(claim *v1.PersistentVol if err = ctrl.emitEventForUnboundDelayBindingClaim(claim); err != nil { return err } - case v1helper.GetPersistentVolumeClaimClass(claim) != "": + case storagehelpers.GetPersistentVolumeClaimClass(claim) != "": if err = ctrl.provisionClaim(claim); err != nil { return err } @@ -1467,7 +1467,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation( claim *v1.PersistentVolumeClaim, plugin vol.ProvisionableVolumePlugin, storageClass *storage.StorageClass) (string, error) { - claimClass := v1helper.GetPersistentVolumeClaimClass(claim) + claimClass := storagehelpers.GetPersistentVolumeClaimClass(claim) klog.V(4).Infof("provisionClaimOperation [%s] started, class: %q", claimToClaimKey(claim), claimClass) // called from provisionClaim(), in this case, plugin MUST NOT be nil @@ -1661,7 +1661,7 @@ func (ctrl *PersistentVolumeController) provisionClaimOperation( func (ctrl *PersistentVolumeController) provisionClaimOperationExternal( claim *v1.PersistentVolumeClaim, storageClass *storage.StorageClass) (string, error) { - claimClass := v1helper.GetPersistentVolumeClaimClass(claim) + claimClass := storagehelpers.GetPersistentVolumeClaimClass(claim) klog.V(4).Infof("provisionClaimOperationExternal [%s] started, class: %q", claimToClaimKey(claim), claimClass) // Set provisionerName to external provisioner name by setClaimProvisioner var err error @@ -1759,7 +1759,7 @@ func (ctrl *PersistentVolumeController) newRecyclerEventRecorder(volume *v1.Pers func (ctrl *PersistentVolumeController) findProvisionablePlugin(claim *v1.PersistentVolumeClaim) (vol.ProvisionableVolumePlugin, *storage.StorageClass, error) { // provisionClaim() which leads here is never called with claimClass=="", we // can save some checks. - claimClass := v1helper.GetPersistentVolumeClaimClass(claim) + claimClass := storagehelpers.GetPersistentVolumeClaimClass(claim) class, err := ctrl.classLister.Get(claimClass) if err != nil { return nil, nil, err @@ -1827,7 +1827,7 @@ func (ctrl *PersistentVolumeController) getProvisionerNameFromVolume(volume *v1. // the AnnDynamicallyProvisioned annotation value, use the storageClass's Provisioner // field to avoid explosion of the metric in the cases like local storage provisioner // tagging a volume with arbitrary provisioner names - storageClass := v1helper.GetPersistentVolumeClass(volume) + storageClass := storagehelpers.GetPersistentVolumeClass(volume) class, err := ctrl.classLister.Get(storageClass) if err != nil { return "N/A" diff --git a/pkg/controller/volume/persistentvolume/util/BUILD b/pkg/controller/volume/persistentvolume/util/BUILD index 041d1003766..ae44b07b0fc 100644 --- a/pkg/controller/volume/persistentvolume/util/BUILD +++ b/pkg/controller/volume/persistentvolume/util/BUILD @@ -6,7 +6,6 @@ go_library( importpath = "k8s.io/kubernetes/pkg/controller/volume/persistentvolume/util", visibility = ["//visibility:public"], deps = [ - "//pkg/apis/core/v1/helper:go_default_library", "//pkg/features:go_default_library", "//pkg/volume/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", @@ -19,6 +18,7 @@ go_library( "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", "//staging/src/k8s.io/client-go/tools/reference:go_default_library", + "//staging/src/k8s.io/component-helpers/storage/volume:go_default_library", ], ) diff --git a/pkg/controller/volume/persistentvolume/util/util.go b/pkg/controller/volume/persistentvolume/util/util.go index a8fd16d26d3..844cd6cdae1 100644 --- a/pkg/controller/volume/persistentvolume/util/util.go +++ b/pkg/controller/volume/persistentvolume/util/util.go @@ -29,7 +29,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" storagelisters "k8s.io/client-go/listers/storage/v1" "k8s.io/client-go/tools/reference" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + storagehelpers "k8s.io/component-helpers/storage/volume" "k8s.io/kubernetes/pkg/features" volumeutil "k8s.io/kubernetes/pkg/volume/util" ) @@ -89,7 +89,7 @@ func IsDelayBindingProvisioning(claim *v1.PersistentVolumeClaim) bool { // IsDelayBindingMode checks if claim is in delay binding mode. func IsDelayBindingMode(claim *v1.PersistentVolumeClaim, classLister storagelisters.StorageClassLister) (bool, error) { - className := v1helper.GetPersistentVolumeClaimClass(claim) + className := storagehelpers.GetPersistentVolumeClaimClass(claim) if className == "" { return false, nil } @@ -188,7 +188,7 @@ func FindMatchingVolume( var smallestVolume *v1.PersistentVolume var smallestVolumeQty resource.Quantity requestedQty := claim.Spec.Resources.Requests[v1.ResourceName(v1.ResourceStorage)] - requestedClass := v1helper.GetPersistentVolumeClaimClass(claim) + requestedClass := storagehelpers.GetPersistentVolumeClaimClass(claim) var selector labels.Selector if claim.Spec.Selector != nil { @@ -275,7 +275,7 @@ func FindMatchingVolume( } else if selector != nil && !selector.Matches(labels.Set(volume.Labels)) { continue } - if v1helper.GetPersistentVolumeClass(volume) != requestedClass { + if storagehelpers.GetPersistentVolumeClass(volume) != requestedClass { continue } if !nodeAffinityValid { diff --git a/pkg/controller/volume/scheduling/BUILD b/pkg/controller/volume/scheduling/BUILD index 6525c355ecd..ad4ce3d7687 100644 --- a/pkg/controller/volume/scheduling/BUILD +++ b/pkg/controller/volume/scheduling/BUILD @@ -34,6 +34,7 @@ go_library( "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/storage/v1alpha1:go_default_library", "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + "//staging/src/k8s.io/component-helpers/storage/volume:go_default_library", "//staging/src/k8s.io/csi-translation-lib:go_default_library", "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", diff --git a/pkg/controller/volume/scheduling/scheduler_assume_cache.go b/pkg/controller/volume/scheduling/scheduler_assume_cache.go index 8c4cd0c8eeb..2eddbd4d83b 100644 --- a/pkg/controller/volume/scheduling/scheduler_assume_cache.go +++ b/pkg/controller/volume/scheduling/scheduler_assume_cache.go @@ -18,6 +18,7 @@ package scheduling import ( "fmt" + storagehelpers "k8s.io/component-helpers/storage/volume" "strconv" "sync" @@ -26,7 +27,6 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/client-go/tools/cache" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" ) // AssumeCache is a cache on top of the informer that allows for updating @@ -358,7 +358,7 @@ type pvAssumeCache struct { func pvStorageClassIndexFunc(obj interface{}) ([]string, error) { if pv, ok := obj.(*v1.PersistentVolume); ok { - return []string{v1helper.GetPersistentVolumeClass(pv)}, nil + return []string{storagehelpers.GetPersistentVolumeClass(pv)}, nil } return []string{""}, fmt.Errorf("object is not a v1.PersistentVolume: %v", obj) } diff --git a/pkg/controller/volume/scheduling/scheduler_binder.go b/pkg/controller/volume/scheduling/scheduler_binder.go index 050bcc6b41d..0cd05ddce0d 100644 --- a/pkg/controller/volume/scheduling/scheduler_binder.go +++ b/pkg/controller/volume/scheduling/scheduler_binder.go @@ -40,6 +40,7 @@ import ( corelisters "k8s.io/client-go/listers/core/v1" storagelisters "k8s.io/client-go/listers/storage/v1" storagelistersv1alpha1 "k8s.io/client-go/listers/storage/v1alpha1" + storagehelpers "k8s.io/component-helpers/storage/volume" csitrans "k8s.io/csi-translation-lib" csiplugins "k8s.io/csi-translation-lib/plugins" "k8s.io/klog/v2" @@ -815,7 +816,7 @@ func (b *volumeBinder) findMatchingVolumes(pod *v1.Pod, claimsToBind []*v1.Persi for _, pvc := range claimsToBind { // Get storage class name from each PVC - storageClassName := v1helper.GetPersistentVolumeClaimClass(pvc) + storageClassName := storagehelpers.GetPersistentVolumeClaimClass(pvc) allPVs := b.pvCache.ListPVs(storageClassName) pvcName := getPVCName(pvc) @@ -855,7 +856,7 @@ func (b *volumeBinder) checkVolumeProvisions(pod *v1.Pod, claimsToProvision []*v // fails or we encounter an error. for _, claim := range claimsToProvision { pvcName := getPVCName(claim) - className := v1helper.GetPersistentVolumeClaimClass(claim) + className := storagehelpers.GetPersistentVolumeClaimClass(claim) if className == "" { return false, false, nil, fmt.Errorf("no class for claim %q", pvcName) } diff --git a/pkg/quota/v1/evaluator/core/BUILD b/pkg/quota/v1/evaluator/core/BUILD index e5f02d9a77d..fb767f4c3a0 100644 --- a/pkg/quota/v1/evaluator/core/BUILD +++ b/pkg/quota/v1/evaluator/core/BUILD @@ -33,6 +33,7 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/quota/v1:go_default_library", "//staging/src/k8s.io/apiserver/pkg/quota/v1/generic:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/component-helpers/storage/volume:go_default_library", ], ) diff --git a/pkg/quota/v1/evaluator/core/persistent_volume_claims.go b/pkg/quota/v1/evaluator/core/persistent_volume_claims.go index 41996d7afa1..a8caa892439 100644 --- a/pkg/quota/v1/evaluator/core/persistent_volume_claims.go +++ b/pkg/quota/v1/evaluator/core/persistent_volume_claims.go @@ -28,9 +28,9 @@ import ( quota "k8s.io/apiserver/pkg/quota/v1" "k8s.io/apiserver/pkg/quota/v1/generic" utilfeature "k8s.io/apiserver/pkg/util/feature" + storagehelpers "k8s.io/component-helpers/storage/volume" api "k8s.io/kubernetes/pkg/apis/core" k8s_api_v1 "k8s.io/kubernetes/pkg/apis/core/v1" - "k8s.io/kubernetes/pkg/apis/core/v1/helper" k8sfeatures "k8s.io/kubernetes/pkg/features" ) @@ -153,7 +153,7 @@ func (p *pvcEvaluator) Usage(item runtime.Object) (corev1.ResourceList, error) { // charge for claim result[corev1.ResourcePersistentVolumeClaims] = *(resource.NewQuantity(1, resource.DecimalSI)) result[pvcObjectCountName] = *(resource.NewQuantity(1, resource.DecimalSI)) - storageClassRef := helper.GetPersistentVolumeClaimClass(pvc) + storageClassRef := storagehelpers.GetPersistentVolumeClaimClass(pvc) if len(storageClassRef) > 0 { storageClassClaim := corev1.ResourceName(storageClassRef + storageClassSuffix + string(corev1.ResourcePersistentVolumeClaims)) result[storageClassClaim] = *(resource.NewQuantity(1, resource.DecimalSI)) diff --git a/pkg/scheduler/framework/plugins/nodevolumelimits/BUILD b/pkg/scheduler/framework/plugins/nodevolumelimits/BUILD index 9ff36e74e66..cc871f2869b 100644 --- a/pkg/scheduler/framework/plugins/nodevolumelimits/BUILD +++ b/pkg/scheduler/framework/plugins/nodevolumelimits/BUILD @@ -23,6 +23,7 @@ go_library( "//staging/src/k8s.io/client-go/informers:go_default_library", "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", + "//staging/src/k8s.io/component-helpers/storage/volume:go_default_library", "//staging/src/k8s.io/csi-translation-lib:go_default_library", "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", diff --git a/pkg/scheduler/framework/plugins/nodevolumelimits/csi.go b/pkg/scheduler/framework/plugins/nodevolumelimits/csi.go index 7c38478d677..e911a0a4a92 100644 --- a/pkg/scheduler/framework/plugins/nodevolumelimits/csi.go +++ b/pkg/scheduler/framework/plugins/nodevolumelimits/csi.go @@ -26,8 +26,8 @@ import ( "k8s.io/apimachinery/pkg/util/rand" corelisters "k8s.io/client-go/listers/core/v1" storagelisters "k8s.io/client-go/listers/storage/v1" + storagehelpers "k8s.io/component-helpers/storage/volume" csitrans "k8s.io/csi-translation-lib" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/scheduler/framework" volumeutil "k8s.io/kubernetes/pkg/volume/util" @@ -227,7 +227,7 @@ func (pl *CSILimits) getCSIDriverInfo(csiNode *storagev1.CSINode, pvc *v1.Persis func (pl *CSILimits) getCSIDriverInfoFromSC(csiNode *storagev1.CSINode, pvc *v1.PersistentVolumeClaim) (string, string) { namespace := pvc.Namespace pvcName := pvc.Name - scName := v1helper.GetPersistentVolumeClaimClass(pvc) + scName := storagehelpers.GetPersistentVolumeClaimClass(pvc) // If StorageClass is not set or not found, then PVC must be using immediate binding mode // and hence it must be bound before scheduling. So it is safe to not count it. diff --git a/pkg/scheduler/framework/plugins/volumezone/BUILD b/pkg/scheduler/framework/plugins/volumezone/BUILD index 6d04f475f16..2fdb48436b1 100644 --- a/pkg/scheduler/framework/plugins/volumezone/BUILD +++ b/pkg/scheduler/framework/plugins/volumezone/BUILD @@ -6,7 +6,6 @@ go_library( importpath = "k8s.io/kubernetes/pkg/scheduler/framework/plugins/volumezone", visibility = ["//visibility:public"], deps = [ - "//pkg/apis/core/v1/helper:go_default_library", "//pkg/scheduler/framework:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/storage/v1:go_default_library", @@ -15,6 +14,7 @@ go_library( "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", + "//staging/src/k8s.io/component-helpers/storage/volume:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", ], ) diff --git a/pkg/scheduler/framework/plugins/volumezone/volume_zone.go b/pkg/scheduler/framework/plugins/volumezone/volume_zone.go index 6f601db8fb7..2ed2102d09d 100644 --- a/pkg/scheduler/framework/plugins/volumezone/volume_zone.go +++ b/pkg/scheduler/framework/plugins/volumezone/volume_zone.go @@ -27,8 +27,8 @@ import ( corelisters "k8s.io/client-go/listers/core/v1" storagelisters "k8s.io/client-go/listers/storage/v1" volumehelpers "k8s.io/cloud-provider/volume/helpers" + storagehelpers "k8s.io/component-helpers/storage/volume" "k8s.io/klog/v2" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/scheduler/framework" ) @@ -121,7 +121,7 @@ func (pl *VolumeZone) Filter(ctx context.Context, _ *framework.CycleState, pod * pvName := pvc.Spec.VolumeName if pvName == "" { - scName := v1helper.GetPersistentVolumeClaimClass(pvc) + scName := storagehelpers.GetPersistentVolumeClaimClass(pvc) if len(scName) == 0 { return framework.NewStatus(framework.Error, fmt.Sprint("PersistentVolumeClaim had no pv name and storageClass name")) } diff --git a/pkg/volume/glusterfs/BUILD b/pkg/volume/glusterfs/BUILD index 4b083da4116..6c7ea14d216 100644 --- a/pkg/volume/glusterfs/BUILD +++ b/pkg/volume/glusterfs/BUILD @@ -16,7 +16,6 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/volume/glusterfs", deps = [ - "//pkg/apis/core/v1/helper:go_default_library", "//pkg/proxy/util:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", @@ -30,6 +29,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", + "//staging/src/k8s.io/component-helpers/storage/volume:go_default_library", "//staging/src/k8s.io/mount-utils:go_default_library", "//vendor/github.com/heketi/heketi/client/api/go-client:go_default_library", "//vendor/github.com/heketi/heketi/pkg/glusterfs/api:go_default_library", diff --git a/pkg/volume/glusterfs/glusterfs.go b/pkg/volume/glusterfs/glusterfs.go index d2b7755f115..23391774954 100644 --- a/pkg/volume/glusterfs/glusterfs.go +++ b/pkg/volume/glusterfs/glusterfs.go @@ -47,7 +47,7 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" clientset "k8s.io/client-go/kubernetes" volumehelpers "k8s.io/cloud-provider/volume/helpers" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" + storagehelpers "k8s.io/component-helpers/storage/volume" proxyutil "k8s.io/kubernetes/pkg/proxy/util" "k8s.io/kubernetes/pkg/volume" volutil "k8s.io/kubernetes/pkg/volume/util" @@ -551,7 +551,7 @@ func (plugin *glusterfsPlugin) collectGids(className string, gidTable *MinMaxAll return fmt.Errorf("failed to get existing persistent volumes") } for _, pv := range pvList.Items { - if v1helper.GetPersistentVolumeClass(&pv) != className { + if storagehelpers.GetPersistentVolumeClass(&pv) != className { continue } pvName := pv.ObjectMeta.Name @@ -732,7 +732,7 @@ func (p *glusterfsVolumeProvisioner) Provision(selectedNode *v1.Node, allowedTop return nil, fmt.Errorf("%s does not support block volume provisioning", p.plugin.GetPluginName()) } klog.V(4).Infof("provision volume with options %v", p.options) - scName := v1helper.GetPersistentVolumeClaimClass(p.options.PVC) + scName := storagehelpers.GetPersistentVolumeClaimClass(p.options.PVC) cfg, err := parseClassParameters(p.options.Parameters, p.plugin.host.GetKubeClient()) if err != nil { return nil, err diff --git a/pkg/volume/util/BUILD b/pkg/volume/util/BUILD index 9f0e8621cc0..e09219f673a 100644 --- a/pkg/volume/util/BUILD +++ b/pkg/volume/util/BUILD @@ -21,7 +21,6 @@ go_library( deps = [ "//pkg/api/legacyscheme:go_default_library", "//pkg/api/v1/pod:go_default_library", - "//pkg/apis/core/v1/helper:go_default_library", "//pkg/features:go_default_library", "//pkg/securitycontext:go_default_library", "//pkg/util/resizefs:go_default_library", @@ -43,6 +42,7 @@ go_library( "//staging/src/k8s.io/component-base/metrics:go_default_library", "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//staging/src/k8s.io/component-helpers/scheduling/corev1:go_default_library", + "//staging/src/k8s.io/component-helpers/storage/volume:go_default_library", "//staging/src/k8s.io/mount-utils:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", diff --git a/pkg/volume/util/util.go b/pkg/volume/util/util.go index 367e05a0d1a..ddccbc294a3 100644 --- a/pkg/volume/util/util.go +++ b/pkg/volume/util/util.go @@ -20,6 +20,7 @@ import ( "context" "fmt" "io/ioutil" + storagehelpers "k8s.io/component-helpers/storage/volume" "os" "path/filepath" "reflect" @@ -42,7 +43,6 @@ import ( clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/api/legacyscheme" podutil "k8s.io/kubernetes/pkg/api/v1/pod" - v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper" "k8s.io/kubernetes/pkg/securitycontext" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util/types" @@ -150,7 +150,7 @@ func GetClassForVolume(kubeClient clientset.Interface, pv *v1.PersistentVolume) if kubeClient == nil { return nil, fmt.Errorf("cannot get kube client") } - className := v1helper.GetPersistentVolumeClass(pv) + className := storagehelpers.GetPersistentVolumeClass(pv) if className == "" { return nil, fmt.Errorf("volume has no storage class") } diff --git a/staging/src/k8s.io/component-helpers/BUILD b/staging/src/k8s.io/component-helpers/BUILD index e5eaefc89d1..b1c3512d7db 100644 --- a/staging/src/k8s.io/component-helpers/BUILD +++ b/staging/src/k8s.io/component-helpers/BUILD @@ -13,6 +13,7 @@ filegroup( "//staging/src/k8s.io/component-helpers/auth/rbac/reconciliation:all-srcs", "//staging/src/k8s.io/component-helpers/auth/rbac/validation:all-srcs", "//staging/src/k8s.io/component-helpers/scheduling/corev1:all-srcs", + "//staging/src/k8s.io/component-helpers/storage/volume:all-srcs", ], tags = ["automanaged"], visibility = ["//visibility:public"], diff --git a/staging/src/k8s.io/component-helpers/storage/OWNERS b/staging/src/k8s.io/component-helpers/storage/OWNERS new file mode 100644 index 00000000000..6b5f6ba5041 --- /dev/null +++ b/staging/src/k8s.io/component-helpers/storage/OWNERS @@ -0,0 +1,8 @@ +# See the OWNERS docs at https://go.k8s.io/owners + +approvers: +- sig-storage-approvers +reviewers: +- sig-storage-reviewers +labels: +- sig/storage diff --git a/staging/src/k8s.io/component-helpers/storage/volume/BUILD b/staging/src/k8s.io/component-helpers/storage/volume/BUILD new file mode 100644 index 00000000000..104f85ca9c8 --- /dev/null +++ b/staging/src/k8s.io/component-helpers/storage/volume/BUILD @@ -0,0 +1,24 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["helpers.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/component-helpers/storage/volume", + importpath = "k8s.io/component-helpers/storage/volume", + visibility = ["//visibility:public"], + deps = ["//staging/src/k8s.io/api/core/v1:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/component-helpers/storage/volume/helpers.go b/staging/src/k8s.io/component-helpers/storage/volume/helpers.go new file mode 100644 index 00000000000..a76e9334480 --- /dev/null +++ b/staging/src/k8s.io/component-helpers/storage/volume/helpers.go @@ -0,0 +1,44 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package volume + +import v1 "k8s.io/api/core/v1" + +// GetPersistentVolumeClaimClass returns StorageClassName. If no storage class was +// requested, it returns "". +func GetPersistentVolumeClaimClass(claim *v1.PersistentVolumeClaim) string { + // Use beta annotation first + if class, found := claim.Annotations[v1.BetaStorageClassAnnotation]; found { + return class + } + + if claim.Spec.StorageClassName != nil { + return *claim.Spec.StorageClassName + } + + return "" +} + +// GetPersistentVolumeClass returns StorageClassName. +func GetPersistentVolumeClass(volume *v1.PersistentVolume) string { + // Use beta annotation first + if class, found := volume.Annotations[v1.BetaStorageClassAnnotation]; found { + return class + } + + return volume.Spec.StorageClassName +} diff --git a/vendor/modules.txt b/vendor/modules.txt index bc3874200f7..06d1e6cec70 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -2249,6 +2249,7 @@ k8s.io/component-helpers/auth/rbac/reconciliation k8s.io/component-helpers/auth/rbac/validation k8s.io/component-helpers/scheduling/corev1 k8s.io/component-helpers/scheduling/corev1/nodeaffinity +k8s.io/component-helpers/storage/volume # k8s.io/controller-manager v0.0.0 => ./staging/src/k8s.io/controller-manager ## explicit # k8s.io/controller-manager => ./staging/src/k8s.io/controller-manager