Skip to content

Commit 7461a0d

Browse files
authored
Merge pull request #420 from mdzraf/resizerExtraMetadataFeature
Add extra-modify-metadata flag to external-resizer sidecar
2 parents 57aecf4 + 75c51b6 commit 7461a0d

File tree

13 files changed

+122
-63
lines changed

13 files changed

+122
-63
lines changed

cmd/csi-resizer/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ var (
6060
resyncPeriod = flag.Duration("resync-period", time.Minute*10, "Resync period for cache")
6161
workers = flag.Int("workers", 10, "Concurrency to process multiple resize requests")
6262

63+
extraModifyMetadata = flag.Bool("extra-modify-metadata", false, "If set, add pv/pvc metadata to plugin modify requests as parameters.")
64+
6365
csiAddress = flag.String("csi-address", "/run/csi/socket", "Address of the CSI driver socket.")
6466
timeout = flag.Duration("timeout", 10*time.Second, "Timeout for waiting for CSI driver socket.")
6567

@@ -188,6 +190,7 @@ func main() {
188190
*timeout,
189191
kubeClient,
190192
informerFactory,
193+
*extraModifyMetadata,
191194
driverName)
192195
if err != nil {
193196
klog.ErrorS(err, "Failed to create CSI modifier")
@@ -217,7 +220,7 @@ func main() {
217220
var mc modifycontroller.ModifyController
218221
// Add modify controller only if the feature gate is enabled
219222
if utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) {
220-
mc = modifycontroller.NewModifyController(modifierName, csiModifier, kubeClient, *resyncPeriod, informerFactory,
223+
mc = modifycontroller.NewModifyController(modifierName, csiModifier, kubeClient, *resyncPeriod, *extraModifyMetadata, informerFactory,
221224
workqueue.NewItemExponentialFailureRateLimiter(*retryIntervalStart, *retryIntervalMax))
222225
}
223226

pkg/controller/controller_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ func TestController(t *testing.T) {
211211
disableVolumeInUseErrorHandler: true,
212212
},
213213
} {
214-
client := csi.NewMockClient("mock", test.NodeResize, true, false, true, true)
214+
client := csi.NewMockClient("mock", test.NodeResize, true, false, true, true, false)
215215
driverName, _ := client.GetDriverName(context.TODO())
216216

217217
var expectedCap resource.Quantity
@@ -380,7 +380,7 @@ func TestResizePVC(t *testing.T) {
380380
},
381381
} {
382382
t.Run(test.Name, func(t *testing.T) {
383-
client := csi.NewMockClient("mock", test.NodeResize, true, false, true, true)
383+
client := csi.NewMockClient("mock", test.NodeResize, true, false, true, true, false)
384384
if test.expansionError != nil {
385385
client.SetExpansionError(test.expansionError)
386386
}

pkg/controller/expand_and_recover_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ func TestExpandAndRecover(t *testing.T) {
153153
test := tests[i]
154154
t.Run(test.name, func(t *testing.T) {
155155
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RecoverVolumeExpansionFailure, true)
156-
client := csi.NewMockClient("foo", !test.disableNodeExpansion, !test.disableControllerExpansion, false, true, true)
156+
client := csi.NewMockClient("foo", !test.disableNodeExpansion, !test.disableControllerExpansion, false, true, true, false)
157157
driverName, _ := client.GetDriverName(context.TODO())
158158
if test.expansionError != nil {
159159
client.SetExpansionError(test.expansionError)

pkg/controller/resize_status_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func TestResizeFunctions(t *testing.T) {
7777
tc := test
7878
t.Run(tc.name, func(t *testing.T) {
7979
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.RecoverVolumeExpansionFailure, true)
80-
client := csi.NewMockClient("foo", true, true, false, true, true)
80+
client := csi.NewMockClient("foo", true, true, false, true, true, false)
8181
driverName, _ := client.GetDriverName(context.TODO())
8282

8383
pvc := test.pvc

pkg/csi/mock_client.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@ func NewMockClient(
1515
supportsControllerResize bool,
1616
supportsControllerModify bool,
1717
supportsPluginControllerService bool,
18-
supportsControllerSingleNodeMultiWriter bool) *MockClient {
18+
supportsControllerSingleNodeMultiWriter bool,
19+
supportsExtraModifyMetada bool,
20+
) *MockClient {
1921
return &MockClient{
2022
name: name,
2123
supportsNodeResize: supportsNodeResize,
2224
supportsControllerResize: supportsControllerResize,
2325
supportsControllerModify: supportsControllerModify,
2426
supportsPluginControllerService: supportsPluginControllerService,
2527
supportsControllerSingleNodeMultiWriter: supportsControllerSingleNodeMultiWriter,
28+
extraModifyMetadata: supportsExtraModifyMetada,
2629
}
2730
}
2831

@@ -40,6 +43,7 @@ type MockClient struct {
4043
checkMigratedLabel bool
4144
usedSecrets atomic.Pointer[map[string]string]
4245
usedCapability atomic.Pointer[csi.VolumeCapability]
46+
extraModifyMetadata bool
4347
}
4448

4549
func (c *MockClient) GetDriverName(context.Context) (string, error) {

pkg/modifier/csi_modifier.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ func NewModifierFromClient(
3333
timeout time.Duration,
3434
k8sClient kubernetes.Interface,
3535
informerFactory informers.SharedInformerFactory,
36+
extraModifyMetadata bool,
3637
driverName string) (Modifier, error) {
3738

3839
_, err := supportsControllerModify(csiClient, timeout)
@@ -41,18 +42,20 @@ func NewModifierFromClient(
4142
}
4243

4344
return &csiModifier{
44-
name: driverName,
45-
client: csiClient,
46-
timeout: timeout,
45+
name: driverName,
46+
client: csiClient,
47+
timeout: timeout,
48+
extraModifyMetadata: extraModifyMetadata,
4749

4850
k8sClient: k8sClient,
4951
}, nil
5052
}
5153

5254
type csiModifier struct {
53-
name string
54-
client csi.Client
55-
timeout time.Duration
55+
name string
56+
client csi.Client
57+
timeout time.Duration
58+
extraModifyMetadata bool
5659

5760
k8sClient kubernetes.Interface
5861
}

pkg/modifier/csi_modifier_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ func TestNewModifier(t *testing.T) {
2828
SupportsControllerModify: false,
2929
},
3030
} {
31-
client := csi.NewMockClient("mock", false, false, c.SupportsControllerModify, false, false)
31+
client := csi.NewMockClient("mock", false, false, c.SupportsControllerModify, false, false, false)
3232
driverName := "mock-driver"
3333
k8sClient, informerFactory := fakeK8s()
34-
_, err := NewModifierFromClient(client, 0, k8sClient, informerFactory, driverName)
34+
_, err := NewModifierFromClient(client, 0, k8sClient, informerFactory, false, driverName)
3535
if err != c.Error {
3636
t.Errorf("Case %d: Unexpected error: wanted %v, got %v", i, c.Error, err)
3737
}

pkg/modifycontroller/controller.go

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,18 @@ type ModifyController interface {
4747
}
4848

4949
type modifyController struct {
50-
name string
51-
modifier modifier.Modifier
52-
kubeClient kubernetes.Interface
53-
claimQueue workqueue.RateLimitingInterface
54-
eventRecorder record.EventRecorder
55-
pvLister corelisters.PersistentVolumeLister
56-
pvListerSynced cache.InformerSynced
57-
pvcLister corelisters.PersistentVolumeClaimLister
58-
pvcListerSynced cache.InformerSynced
59-
vacLister storagev1beta1listers.VolumeAttributesClassLister
60-
vacListerSynced cache.InformerSynced
50+
name string
51+
modifier modifier.Modifier
52+
kubeClient kubernetes.Interface
53+
claimQueue workqueue.RateLimitingInterface
54+
eventRecorder record.EventRecorder
55+
pvLister corelisters.PersistentVolumeLister
56+
pvListerSynced cache.InformerSynced
57+
pvcLister corelisters.PersistentVolumeClaimLister
58+
pvcListerSynced cache.InformerSynced
59+
vacLister storagev1beta1listers.VolumeAttributesClassLister
60+
vacListerSynced cache.InformerSynced
61+
extraModifyMetadata bool
6162
// the key of the map is {PVC_NAMESPACE}/{PVC_NAME}
6263
uncertainPVCs map[string]v1.PersistentVolumeClaim
6364
}
@@ -68,6 +69,7 @@ func NewModifyController(
6869
modifier modifier.Modifier,
6970
kubeClient kubernetes.Interface,
7071
resyncPeriod time.Duration,
72+
extraModifyMetadata bool,
7173
informerFactory informers.SharedInformerFactory,
7274
pvcRateLimiter workqueue.RateLimiter) ModifyController {
7375
pvInformer := informerFactory.Core().V1().PersistentVolumes()
@@ -83,17 +85,18 @@ func NewModifyController(
8385
pvcRateLimiter, fmt.Sprintf("%s-pvc", name))
8486

8587
ctrl := &modifyController{
86-
name: name,
87-
modifier: modifier,
88-
kubeClient: kubeClient,
89-
pvListerSynced: pvInformer.Informer().HasSynced,
90-
pvLister: pvInformer.Lister(),
91-
pvcListerSynced: pvcInformer.Informer().HasSynced,
92-
pvcLister: pvcInformer.Lister(),
93-
vacListerSynced: vacInformer.Informer().HasSynced,
94-
vacLister: vacInformer.Lister(),
95-
claimQueue: claimQueue,
96-
eventRecorder: eventRecorder,
88+
name: name,
89+
modifier: modifier,
90+
kubeClient: kubeClient,
91+
pvListerSynced: pvInformer.Informer().HasSynced,
92+
pvLister: pvInformer.Lister(),
93+
pvcListerSynced: pvcInformer.Informer().HasSynced,
94+
pvcLister: pvcInformer.Lister(),
95+
vacListerSynced: vacInformer.Informer().HasSynced,
96+
vacLister: vacInformer.Lister(),
97+
claimQueue: claimQueue,
98+
eventRecorder: eventRecorder,
99+
extraModifyMetadata: extraModifyMetadata,
97100
}
98101
// Add a resync period as the PVC's request modify can be modified again when we handling
99102
// a previous modify request of the same PVC.

pkg/modifycontroller/controller_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func TestController(t *testing.T) {
6161
for _, test := range tests {
6262
t.Run(test.name, func(t *testing.T) {
6363
// Setup
64-
client := csi.NewMockClient("foo", true, true, true, true, true)
64+
client := csi.NewMockClient("foo", true, true, true, true, true, false)
6565
driverName, _ := client.GetDriverName(context.TODO())
6666

6767
var initialObjects []runtime.Object
@@ -78,15 +78,15 @@ func TestController(t *testing.T) {
7878
pvcInformer := informerFactory.Core().V1().PersistentVolumeClaims()
7979
vacInformer := informerFactory.Storage().V1beta1().VolumeAttributesClasses()
8080

81-
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, driverName)
81+
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, false, driverName)
8282
if err != nil {
8383
t.Fatalf("Test %s: Unable to create modifier: %v", test.name, err)
8484
}
8585

8686
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, true)
8787
controller := NewModifyController(driverName,
8888
csiModifier, kubeClient,
89-
time.Second, informerFactory,
89+
time.Second, false, informerFactory,
9090
workqueue.DefaultControllerRateLimiter())
9191

9292
ctrlInstance, _ := controller.(*modifyController)
@@ -154,7 +154,7 @@ func TestModifyPVC(t *testing.T) {
154154

155155
for _, test := range tests {
156156
t.Run(test.name, func(t *testing.T) {
157-
client := csi.NewMockClient("mock", true, true, true, true, true)
157+
client := csi.NewMockClient("mock", true, true, true, true, true, false)
158158
if test.modifyFailure {
159159
client.SetModifyFailed()
160160
}
@@ -179,15 +179,15 @@ func TestModifyPVC(t *testing.T) {
179179
pvcInformer := informerFactory.Core().V1().PersistentVolumeClaims()
180180
vacInformer := informerFactory.Storage().V1beta1().VolumeAttributesClasses()
181181

182-
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, driverName)
182+
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, false, driverName)
183183
if err != nil {
184184
t.Fatalf("Test %s: Unable to create modifier: %v", test.name, err)
185185
}
186186

187187
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, true)
188188
controller := NewModifyController(driverName,
189189
csiModifier, kubeClient,
190-
time.Second, informerFactory,
190+
time.Second, false, informerFactory,
191191
workqueue.DefaultControllerRateLimiter())
192192

193193
ctrlInstance, _ := controller.(*modifyController)

pkg/modifycontroller/modify_status_test.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func TestMarkControllerModifyVolumeStatus(t *testing.T) {
102102
tc := test
103103
t.Run(tc.name, func(t *testing.T) {
104104
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, true)
105-
client := csi.NewMockClient("foo", true, true, true, true, true)
105+
client := csi.NewMockClient("foo", true, true, true, true, true, false)
106106
driverName, _ := client.GetDriverName(context.TODO())
107107

108108
pvc := test.pvc
@@ -112,13 +112,13 @@ func TestMarkControllerModifyVolumeStatus(t *testing.T) {
112112

113113
kubeClient, informerFactory := fakeK8s(initialObjects)
114114

115-
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, driverName)
115+
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, false, driverName)
116116
if err != nil {
117117
t.Fatalf("Test %s: Unable to create modifier: %v", test.name, err)
118118
}
119119
controller := NewModifyController(driverName,
120120
csiModifier, kubeClient,
121-
time.Second, informerFactory,
121+
time.Second, false, informerFactory,
122122
workqueue.DefaultControllerRateLimiter())
123123

124124
ctrlInstance, _ := controller.(*modifyController)
@@ -162,7 +162,7 @@ func TestUpdateConditionBasedOnError(t *testing.T) {
162162
tc := test
163163
t.Run(tc.name, func(t *testing.T) {
164164
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, true)
165-
client := csi.NewMockClient("foo", true, true, true, true, true)
165+
client := csi.NewMockClient("foo", true, true, true, true, true, false)
166166
driverName, _ := client.GetDriverName(context.TODO())
167167

168168
pvc := test.pvc
@@ -172,13 +172,13 @@ func TestUpdateConditionBasedOnError(t *testing.T) {
172172

173173
kubeClient, informerFactory := fakeK8s(initialObjects)
174174

175-
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, driverName)
175+
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, false, driverName)
176176
if err != nil {
177177
t.Fatalf("Test %s: Unable to create modifier: %v", test.name, err)
178178
}
179179
controller := NewModifyController(driverName,
180180
csiModifier, kubeClient,
181-
time.Second, informerFactory,
181+
time.Second, false, informerFactory,
182182
workqueue.DefaultControllerRateLimiter())
183183

184184
ctrlInstance, _ := controller.(*modifyController)
@@ -231,7 +231,7 @@ func TestMarkControllerModifyVolumeCompleted(t *testing.T) {
231231
tc := test
232232
t.Run(tc.name, func(t *testing.T) {
233233
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, true)
234-
client := csi.NewMockClient("foo", true, true, true, true, true)
234+
client := csi.NewMockClient("foo", true, true, true, true, true, false)
235235
driverName, _ := client.GetDriverName(context.TODO())
236236

237237
var initialObjects []runtime.Object
@@ -240,13 +240,13 @@ func TestMarkControllerModifyVolumeCompleted(t *testing.T) {
240240

241241
kubeClient, informerFactory := fakeK8s(initialObjects)
242242

243-
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, driverName)
243+
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, false, driverName)
244244
if err != nil {
245245
t.Fatalf("Test %s: Unable to create modifier: %v", test.name, err)
246246
}
247247
controller := NewModifyController(driverName,
248248
csiModifier, kubeClient,
249-
time.Second, informerFactory,
249+
time.Second, false, informerFactory,
250250
workqueue.DefaultControllerRateLimiter())
251251

252252
ctrlInstance, _ := controller.(*modifyController)
@@ -293,7 +293,7 @@ func TestRemovePVCFromModifyVolumeUncertainCache(t *testing.T) {
293293
tc := test
294294
t.Run(tc.name, func(t *testing.T) {
295295
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.VolumeAttributesClass, true)
296-
client := csi.NewMockClient("foo", true, true, true, true, true)
296+
client := csi.NewMockClient("foo", true, true, true, true, true, false)
297297
driverName, _ := client.GetDriverName(context.TODO())
298298

299299
var initialObjects []runtime.Object
@@ -306,13 +306,13 @@ func TestRemovePVCFromModifyVolumeUncertainCache(t *testing.T) {
306306
podInformer := informerFactory.Core().V1().Pods()
307307
vacInformer := informerFactory.Storage().V1beta1().VolumeAttributesClasses()
308308

309-
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, driverName)
309+
csiModifier, err := modifier.NewModifierFromClient(client, 15*time.Second, kubeClient, informerFactory, false, driverName)
310310
if err != nil {
311311
t.Fatalf("Test %s: Unable to create modifier: %v", test.name, err)
312312
}
313313
controller := NewModifyController(driverName,
314314
csiModifier, kubeClient,
315-
time.Second, informerFactory,
315+
time.Second, false, informerFactory,
316316
workqueue.DefaultControllerRateLimiter())
317317

318318
ctrlInstance, _ := controller.(*modifyController)

0 commit comments

Comments
 (0)