Skip to content

Commit fe9e0f4

Browse files
authored
Merge pull request #545 from nixpanic/split-resize-modify
Allow modify without resize support
2 parents cba05cb + f51902a commit fe9e0f4

File tree

6 files changed

+53
-21
lines changed

6 files changed

+53
-21
lines changed

cmd/csi-resizer/main.go

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package main
1818

1919
import (
2020
"context"
21+
"errors"
2122
"flag"
2223
"fmt"
2324
"net/http"
@@ -207,7 +208,9 @@ func main() {
207208
*timeout,
208209
kubeClient,
209210
driverName)
210-
if err != nil {
211+
if err != nil && errors.Is(err, resizer.ResizeNotSupportErr) {
212+
klog.InfoS("Resize not supported", "message", err)
213+
} else if err != nil {
211214
klog.ErrorS(err, "Failed to create CSI resizer")
212215
klog.FlushAndExit(klog.ExitFlushTimeout, 1)
213216
}
@@ -219,11 +222,17 @@ func main() {
219222
informerFactory,
220223
*extraModifyMetadata,
221224
driverName)
222-
if err != nil {
225+
if err != nil && errors.Is(err, modifier.ModifyNotSupportErr) {
226+
klog.InfoS("Modify not supported", "message", err)
227+
} else if err != nil {
223228
klog.ErrorS(err, "Failed to create CSI modifier")
224229
klog.FlushAndExit(klog.ExitFlushTimeout, 1)
225230
}
226231

232+
if csiResizer == nil && csiModifier == nil {
233+
klog.Fatalf("CSI driver does not support resize nor modify")
234+
}
235+
227236
// Start HTTP server for metrics + leader election healthz
228237
if addr != "" {
229238
metricsManager.RegisterToServer(mux, *metricsPath)
@@ -238,17 +247,30 @@ func main() {
238247
}()
239248
}
240249

241-
resizerName := csiResizer.Name()
242-
rc := controller.NewResizeController(resizerName, csiResizer, kubeClient, *resyncPeriod, informerFactory,
243-
workqueue.NewTypedItemExponentialFailureRateLimiter[string](*retryIntervalStart, *retryIntervalMax),
244-
*handleVolumeInUseError, *retryIntervalMax)
250+
leaseHolder := ""
251+
var rc controller.ResizeController
252+
if csiResizer != nil {
253+
resizerName := csiResizer.Name()
254+
rc = controller.NewResizeController(resizerName, csiResizer, kubeClient, *resyncPeriod, informerFactory,
255+
workqueue.NewTypedItemExponentialFailureRateLimiter[string](*retryIntervalStart, *retryIntervalMax),
256+
*handleVolumeInUseError, *retryIntervalMax)
257+
258+
leaseHolder = resizerName
259+
}
245260

246-
modifierName := csiModifier.Name()
247261
var mc modifycontroller.ModifyController
248-
// Add modify controller only if the feature gate is enabled
249-
if utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) {
250-
mc = modifycontroller.NewModifyController(modifierName, csiModifier, kubeClient, *resyncPeriod, *retryIntervalMax, *extraModifyMetadata, informerFactory,
251-
workqueue.NewTypedItemExponentialFailureRateLimiter[string](*retryIntervalStart, *retryIntervalMax))
262+
if csiModifier != nil {
263+
modifierName := csiModifier.Name()
264+
// Add modify controller only if the feature gate is enabled
265+
if utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) {
266+
mc = modifycontroller.NewModifyController(modifierName, csiModifier, kubeClient, *resyncPeriod,
267+
*retryIntervalMax, *extraModifyMetadata, informerFactory,
268+
workqueue.NewTypedItemExponentialFailureRateLimiter[string](*retryIntervalStart, *retryIntervalMax))
269+
}
270+
271+
if leaseHolder == "" {
272+
leaseHolder = modifierName
273+
}
252274
}
253275

254276
// handle SIGTERM and SIGINT by cancelling the context.
@@ -278,16 +300,20 @@ func main() {
278300
informerFactory.Start(ctx.Done())
279301
if utilfeature.DefaultFeatureGate.Enabled(features.ReleaseLeaderElectionOnExit) {
280302
var wg sync.WaitGroup
281-
go rc.Run(*workers, controllerCtx, &wg)
282-
if utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) {
303+
if rc != nil {
304+
go rc.Run(*workers, controllerCtx, &wg)
305+
}
306+
if mc != nil && utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) {
283307
go mc.Run(*workers, controllerCtx, &wg)
284308
}
285309
<-controllerCtx.Done()
286310
wg.Wait()
287311
terminate()
288312
} else {
289-
go rc.Run(*workers, ctx, nil)
290-
if utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) {
313+
if rc != nil {
314+
go rc.Run(*workers, ctx, nil)
315+
}
316+
if mc != nil && utilfeature.DefaultFeatureGate.Enabled(features.VolumeAttributesClass) {
291317
go mc.Run(*workers, ctx, nil)
292318
}
293319
<-ctx.Done()
@@ -297,7 +323,7 @@ func main() {
297323
if !*enableLeaderElection {
298324
run(ctx)
299325
} else {
300-
lockName := "external-resizer-" + util.SanitizeName(resizerName)
326+
lockName := "external-resizer-" + util.SanitizeName(leaseHolder)
301327
leKubeClient, err := kubernetes.NewForConfig(config)
302328
if err != nil {
303329
klog.ErrorS(err, "Failed to create leKubeClient")

pkg/modifier/csi_modifier.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import (
2828
"k8s.io/client-go/kubernetes"
2929
)
3030

31+
var ModifyNotSupportErr = errors.New("CSI driver does not support controller modify")
32+
3133
func NewModifierFromClient(
3234
csiClient csi.Client,
3335
timeout time.Duration,
@@ -36,10 +38,13 @@ func NewModifierFromClient(
3638
extraModifyMetadata bool,
3739
driverName string) (Modifier, error) {
3840

39-
_, err := supportsControllerModify(csiClient, timeout)
41+
supported, err := supportsControllerModify(csiClient, timeout)
4042
if err != nil {
4143
return nil, fmt.Errorf("failed to check if plugin supports controller modify: %v", err)
4244
}
45+
if !supported {
46+
return nil, ModifyNotSupportErr
47+
}
4348

4449
return &csiModifier{
4550
name: driverName,

pkg/modifier/csi_modifier_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ func TestNewModifier(t *testing.T) {
2626
// Controller modify not supported.
2727
{
2828
SupportsControllerModify: false,
29+
Error: ModifyNotSupportErr,
2930
},
3031
} {
3132
client := csi.NewMockClient("mock", false, false, c.SupportsControllerModify, false, false)

pkg/modifycontroller/controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func TestController(t *testing.T) {
6464
for _, test := range tests {
6565
t.Run(test.name, func(t *testing.T) {
6666
// Setup
67-
client := csi.NewMockClient(testDriverName, true, true, true, true, true)
67+
client := csi.NewMockClient(testDriverName, false, false, true, true, true)
6868

6969
initialObjects := []runtime.Object{test.pvc, test.pv, testVacObject, targetVacObject}
7070
ctrlInstance := setupFakeK8sEnvironment(t, client, initialObjects)

pkg/resizer/csi_resizer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import (
3838

3939
var (
4040
controllerServiceNotSupportErr = errors.New("CSI driver does not support controller service")
41-
resizeNotSupportErr = errors.New("CSI driver neither supports controller resize nor node resize")
41+
ResizeNotSupportErr = errors.New("CSI driver neither supports controller resize nor node resize")
4242
)
4343

4444
func NewResizerFromClient(
@@ -70,7 +70,7 @@ func NewResizerFromClient(
7070
klog.InfoS("The CSI driver supports node resize only, using trivial resizer to handle resize requests")
7171
return newTrivialResizer(driverName), nil
7272
}
73-
return nil, resizeNotSupportErr
73+
return nil, ResizeNotSupportErr
7474
}
7575

7676
_, err = supportsControllerSingleNodeMultiWriter(csiClient, timeout)

pkg/resizer/csi_resizer_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func TestNewResizer(t *testing.T) {
6969
SupportsPluginControllerService: true,
7070
SupportsControllerSingleNodeMultiWriter: true,
7171

72-
Error: resizeNotSupportErr,
72+
Error: ResizeNotSupportErr,
7373
},
7474
} {
7575
client := csi.NewMockClient("mock", c.SupportsNodeResize, c.SupportsControllerResize, false, c.SupportsPluginControllerService, c.SupportsControllerSingleNodeMultiWriter)

0 commit comments

Comments
 (0)