Skip to content

Commit 3bc5602

Browse files
committed
Do not assume storageclass is still in-tree after csi migration
Signed-off-by: ialidzhikov <[email protected]>
1 parent e2a7bd5 commit 3bc5602

File tree

4 files changed

+17
-69
lines changed

4 files changed

+17
-69
lines changed

cmd/kube-controller-manager/app/core.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,6 @@ func startVolumeExpandController(ctx ControllerContext) (http.Handler, bool, err
381381
ctx.ClientBuilder.ClientOrDie("expand-controller"),
382382
ctx.InformerFactory.Core().V1().PersistentVolumeClaims(),
383383
ctx.InformerFactory.Core().V1().PersistentVolumes(),
384-
ctx.InformerFactory.Storage().V1().StorageClasses(),
385384
ctx.Cloud,
386385
plugins,
387386
csiTranslator,

pkg/controller/volume/expand/BUILD

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ go_library(
77
srcs = ["expand_controller.go"],
88
importpath = "k8s.io/kubernetes/pkg/controller/volume/expand",
99
deps = [
10-
"//pkg/apis/core/v1/helper:go_default_library",
1110
"//pkg/controller/volume/events:go_default_library",
1211
"//pkg/proxy/util:go_default_library",
1312
"//pkg/volume:go_default_library",
@@ -24,12 +23,10 @@ go_library(
2423
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
2524
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
2625
"//staging/src/k8s.io/client-go/informers/core/v1:go_default_library",
27-
"//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library",
2826
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
2927
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
3028
"//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
3129
"//staging/src/k8s.io/client-go/listers/core/v1:go_default_library",
32-
"//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library",
3330
"//staging/src/k8s.io/client-go/tools/cache:go_default_library",
3431
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
3532
"//staging/src/k8s.io/client-go/util/workqueue:go_default_library",
@@ -67,7 +64,6 @@ go_test(
6764
"//pkg/volume/util/operationexecutor:go_default_library",
6865
"//pkg/volume/util/types:go_default_library",
6966
"//staging/src/k8s.io/api/core/v1:go_default_library",
70-
"//staging/src/k8s.io/api/storage/v1:go_default_library",
7167
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
7268
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
7369
"//staging/src/k8s.io/apimachinery/pkg/types:go_default_library",

pkg/controller/volume/expand/expand_controller.go

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,15 @@ import (
3434
"k8s.io/apimachinery/pkg/util/runtime"
3535
"k8s.io/apimachinery/pkg/util/wait"
3636
coreinformers "k8s.io/client-go/informers/core/v1"
37-
storageclassinformer "k8s.io/client-go/informers/storage/v1"
3837
clientset "k8s.io/client-go/kubernetes"
3938
"k8s.io/client-go/kubernetes/scheme"
4039
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
4140
corelisters "k8s.io/client-go/listers/core/v1"
42-
storagelisters "k8s.io/client-go/listers/storage/v1"
4341
"k8s.io/client-go/tools/cache"
4442
kcache "k8s.io/client-go/tools/cache"
4543
"k8s.io/client-go/tools/record"
4644
"k8s.io/client-go/util/workqueue"
4745
cloudprovider "k8s.io/cloud-provider"
48-
v1helper "k8s.io/kubernetes/pkg/apis/core/v1/helper"
4946
"k8s.io/kubernetes/pkg/controller/volume/events"
5047
proxyutil "k8s.io/kubernetes/pkg/proxy/util"
5148
"k8s.io/kubernetes/pkg/volume"
@@ -85,10 +82,6 @@ type expandController struct {
8582
pvLister corelisters.PersistentVolumeLister
8683
pvSynced kcache.InformerSynced
8784

88-
// storageClass lister for fetching provisioner name
89-
classLister storagelisters.StorageClassLister
90-
classListerSynced cache.InformerSynced
91-
9285
// cloud provider used by volume host
9386
cloud cloudprovider.Interface
9487

@@ -114,7 +107,6 @@ func NewExpandController(
114107
kubeClient clientset.Interface,
115108
pvcInformer coreinformers.PersistentVolumeClaimInformer,
116109
pvInformer coreinformers.PersistentVolumeInformer,
117-
scInformer storageclassinformer.StorageClassInformer,
118110
cloud cloudprovider.Interface,
119111
plugins []volume.VolumePlugin,
120112
translator CSINameTranslator,
@@ -128,8 +120,6 @@ func NewExpandController(
128120
pvcsSynced: pvcInformer.Informer().HasSynced,
129121
pvLister: pvInformer.Lister(),
130122
pvSynced: pvInformer.Informer().HasSynced,
131-
classLister: scInformer.Lister(),
132-
classListerSynced: scInformer.Informer().HasSynced,
133123
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "volume_expand"),
134124
translator: translator,
135125
csiMigratedPluginManager: csiMigratedPluginManager,
@@ -243,19 +233,6 @@ func (expc *expandController) syncHandler(key string) error {
243233
return err
244234
}
245235

246-
claimClass := v1helper.GetPersistentVolumeClaimClass(pvc)
247-
if claimClass == "" {
248-
klog.V(4).Infof("volume expansion is disabled for PVC without StorageClasses: %s", util.ClaimToClaimKey(pvc))
249-
return nil
250-
}
251-
252-
class, err := expc.classLister.Get(claimClass)
253-
if err != nil {
254-
klog.V(4).Infof("failed to expand PVC: %s with error: %v", util.ClaimToClaimKey(pvc), err)
255-
return nil
256-
}
257-
258-
volumeResizerName := class.Provisioner
259236
volumeSpec := volume.NewSpecFromPersistentVolume(pv, false)
260237
migratable, err := expc.csiMigratedPluginManager.IsMigratable(volumeSpec)
261238
if err != nil {
@@ -264,9 +241,15 @@ func (expc *expandController) syncHandler(key string) error {
264241
}
265242
// handle CSI migration scenarios before invoking FindExpandablePluginBySpec for in-tree
266243
if migratable {
267-
msg := fmt.Sprintf("CSI migration enabled for %s; waiting for external resizer to expand the pvc", volumeResizerName)
244+
inTreePluginName, err := expc.csiMigratedPluginManager.GetInTreePluginNameFromSpec(volumeSpec.PersistentVolume, volumeSpec.Volume)
245+
if err != nil {
246+
klog.V(4).Infof("Error getting in-tree plugin name from persistent volume %s: %v", volumeSpec.PersistentVolume.Name, err)
247+
return err
248+
}
249+
250+
msg := fmt.Sprintf("CSI migration enabled for %s; waiting for external resizer to expand the pvc", inTreePluginName)
268251
expc.recorder.Event(pvc, v1.EventTypeNormal, events.ExternalExpanding, msg)
269-
csiResizerName, err := expc.translator.GetCSINameFromInTreeName(class.Provisioner)
252+
csiResizerName, err := expc.translator.GetCSINameFromInTreeName(inTreePluginName)
270253
if err != nil {
271254
errorMsg := fmt.Sprintf("error getting CSI driver name for pvc %s, with error %v", util.ClaimToClaimKey(pvc), err)
272255
expc.recorder.Event(pvc, v1.EventTypeWarning, events.ExternalExpanding, errorMsg)
@@ -297,6 +280,7 @@ func (expc *expandController) syncHandler(key string) error {
297280
return nil
298281
}
299282

283+
volumeResizerName := volumePlugin.GetPluginName()
300284
return expc.expand(pvc, pv, volumeResizerName)
301285
}
302286

@@ -326,7 +310,7 @@ func (expc *expandController) Run(stopCh <-chan struct{}) {
326310
klog.Infof("Starting expand controller")
327311
defer klog.Infof("Shutting down expand controller")
328312

329-
if !cache.WaitForNamedCacheSync("expand", stopCh, expc.pvcsSynced, expc.pvSynced, expc.classListerSynced) {
313+
if !cache.WaitForNamedCacheSync("expand", stopCh, expc.pvcsSynced, expc.pvSynced) {
330314
return
331315
}
332316

pkg/controller/volume/expand/expand_controller_test.go

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ import (
2323
"regexp"
2424
"testing"
2525

26-
v1 "k8s.io/api/core/v1"
27-
storagev1 "k8s.io/api/storage/v1"
26+
"k8s.io/api/core/v1"
2827
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2928
"k8s.io/apimachinery/pkg/runtime"
3029
"k8s.io/apimachinery/pkg/types"
@@ -49,7 +48,6 @@ func TestSyncHandler(t *testing.T) {
4948
tests := []struct {
5049
name string
5150
csiMigrationEnabled bool
52-
storageClass *storagev1.StorageClass
5351
pvcKey string
5452
pv *v1.PersistentVolume
5553
pvc *v1.PersistentVolumeClaim
@@ -59,27 +57,14 @@ func TestSyncHandler(t *testing.T) {
5957
}{
6058
{
6159
name: "when pvc has no PV binding",
62-
pvc: getFakePersistentVolumeClaim("no-pv-pvc", "", "", ""),
60+
pvc: getFakePersistentVolumeClaim("no-pv-pvc", "", ""),
6361
pvcKey: "default/no-pv-pvc",
6462
hasError: true,
6563
},
66-
{
67-
name: "when pvc has no storageclass",
68-
pv: getFakePersistentVolume("vol-1", csitranslationplugins.AWSEBSInTreePluginName, "no-sc-pvc-vol-1"),
69-
pvc: getFakePersistentVolumeClaim("no-sc-pvc", "vol-1", "", "no-sc-pvc-vol-1"),
70-
pvcKey: "default/no-sc-pvc",
71-
},
72-
{
73-
name: "when pvc storageclass is missing",
74-
pv: getFakePersistentVolume("vol-2", csitranslationplugins.AWSEBSInTreePluginName, "missing-sc-pvc-vol-2"),
75-
pvc: getFakePersistentVolumeClaim("missing-sc-pvc", "vol-2", "resizable", "missing-sc-pvc-vol-2"),
76-
pvcKey: "default/missing-sc-pvc",
77-
},
7864
{
7965
name: "when pvc and pv has everything for in-tree plugin",
8066
pv: getFakePersistentVolume("vol-3", csitranslationplugins.AWSEBSInTreePluginName, "good-pvc-vol-3"),
81-
pvc: getFakePersistentVolumeClaim("good-pvc", "vol-3", "resizable2", "good-pvc-vol-3"),
82-
storageClass: getFakeStorageClass("resizable2", csitranslationplugins.AWSEBSInTreePluginName),
67+
pvc: getFakePersistentVolumeClaim("good-pvc", "vol-3", "good-pvc-vol-3"),
8368
pvcKey: "default/good-pvc",
8469
expansionCalled: true,
8570
expectedAnnotation: map[string]string{volumetypes.VolumeResizerKey: csitranslationplugins.AWSEBSInTreePluginName},
@@ -88,16 +73,14 @@ func TestSyncHandler(t *testing.T) {
8873
name: "when csi migration is enabled for a in-tree plugin",
8974
csiMigrationEnabled: true,
9075
pv: getFakePersistentVolume("vol-4", csitranslationplugins.AWSEBSInTreePluginName, "csi-pvc-vol-4"),
91-
pvc: getFakePersistentVolumeClaim("csi-pvc", "vol-4", "resizable3", "csi-pvc-vol-4"),
92-
storageClass: getFakeStorageClass("resizable3", csitranslationplugins.AWSEBSInTreePluginName),
76+
pvc: getFakePersistentVolumeClaim("csi-pvc", "vol-4", "csi-pvc-vol-4"),
9377
pvcKey: "default/csi-pvc",
9478
expectedAnnotation: map[string]string{volumetypes.VolumeResizerKey: csitranslationplugins.AWSEBSDriverName},
9579
},
9680
{
9781
name: "for csi plugin without migration path",
9882
pv: getFakePersistentVolume("vol-5", "com.csi.ceph", "ceph-csi-pvc-vol-5"),
99-
pvc: getFakePersistentVolumeClaim("ceph-csi-pvc", "vol-5", "resizable4", "ceph-csi-pvc-vol-5"),
100-
storageClass: getFakeStorageClass("resizable4", "com.csi.ceph"),
83+
pvc: getFakePersistentVolumeClaim("ceph-csi-pvc", "vol-5", "ceph-csi-pvc-vol-5"),
10184
pvcKey: "default/ceph-csi-pvc",
10285
expansionCalled: false,
10386
hasError: false,
@@ -110,7 +93,6 @@ func TestSyncHandler(t *testing.T) {
11093
informerFactory := informers.NewSharedInformerFactory(fakeKubeClient, controller.NoResyncPeriodFunc())
11194
pvcInformer := informerFactory.Core().V1().PersistentVolumeClaims()
11295
pvInformer := informerFactory.Core().V1().PersistentVolumes()
113-
storageClassInformer := informerFactory.Storage().V1().StorageClasses()
11496

11597
pvc := test.pvc
11698
if tc.pv != nil {
@@ -122,11 +104,8 @@ func TestSyncHandler(t *testing.T) {
122104
}
123105
allPlugins := []volume.VolumePlugin{}
124106
allPlugins = append(allPlugins, awsebs.ProbeVolumePlugins()...)
125-
if tc.storageClass != nil {
126-
informerFactory.Storage().V1().StorageClasses().Informer().GetIndexer().Add(tc.storageClass)
127-
}
128107
translator := csitrans.New()
129-
expc, err := NewExpandController(fakeKubeClient, pvcInformer, pvInformer, storageClassInformer, nil, allPlugins, translator, csimigration.NewPluginManager(translator), nil)
108+
expc, err := NewExpandController(fakeKubeClient, pvcInformer, pvInformer, nil, allPlugins, translator, csimigration.NewPluginManager(translator), nil)
130109
if err != nil {
131110
t.Fatalf("error creating expand controller : %v", err)
132111
}
@@ -226,7 +205,7 @@ func getFakePersistentVolume(volumeName, pluginName string, pvcUID types.UID) *v
226205
return pv
227206
}
228207

229-
func getFakePersistentVolumeClaim(pvcName, volumeName, scName string, uid types.UID) *v1.PersistentVolumeClaim {
208+
func getFakePersistentVolumeClaim(pvcName, volumeName string, uid types.UID) *v1.PersistentVolumeClaim {
230209
pvc := &v1.PersistentVolumeClaim{
231210
ObjectMeta: metav1.ObjectMeta{Name: pvcName, Namespace: "default", UID: uid},
232211
Spec: v1.PersistentVolumeClaimSpec{},
@@ -235,15 +214,5 @@ func getFakePersistentVolumeClaim(pvcName, volumeName, scName string, uid types.
235214
pvc.Spec.VolumeName = volumeName
236215
}
237216

238-
if scName != "" {
239-
pvc.Spec.StorageClassName = &scName
240-
}
241217
return pvc
242218
}
243-
244-
func getFakeStorageClass(scName, pluginName string) *storagev1.StorageClass {
245-
return &storagev1.StorageClass{
246-
ObjectMeta: metav1.ObjectMeta{Name: scName},
247-
Provisioner: pluginName,
248-
}
249-
}

0 commit comments

Comments
 (0)