diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index efc73fe71c4..28aa8d8a2bb 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -896,7 +896,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS CSIMigrationRBD: {Default: false, PreRelease: featuregate.Alpha}, // Off by default (requires RBD CSI driver) - CSIMigrationvSphere: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.28 + CSIMigrationvSphere: {Default: true, PreRelease: featuregate.GA}, // LockToDefault when CSI driver with GA support for Windows, raw block and xfs features are available CSINodeExpandSecret: {Default: false, PreRelease: featuregate.Alpha}, diff --git a/pkg/volume/csimigration/plugin_manager_test.go b/pkg/volume/csimigration/plugin_manager_test.go index c1517075f47..5a4449eb763 100644 --- a/pkg/volume/csimigration/plugin_manager_test.go +++ b/pkg/volume/csimigration/plugin_manager_test.go @@ -112,6 +112,62 @@ func TestIsMigratable(t *testing.T) { } } +func TestCheckMigrationFeatureFlags(t *testing.T) { + testCases := []struct { + name string + pluginFeature featuregate.Feature + pluginFeatureEnabled bool + pluginUnregsiterFeature featuregate.Feature + pluginUnregsiterEnabled bool + expectMigrationComplete bool + expectErr bool + }{ + { + name: "plugin specific migration feature enabled with plugin unregister disabled", + pluginFeature: features.CSIMigrationvSphere, + pluginFeatureEnabled: true, + pluginUnregsiterFeature: features.InTreePluginvSphereUnregister, + pluginUnregsiterEnabled: false, + expectMigrationComplete: false, + expectErr: false, + }, + { + name: "plugin specific migration feature and plugin unregister disabled", + pluginFeature: features.CSIMigrationvSphere, + pluginFeatureEnabled: false, + pluginUnregsiterFeature: features.InTreePluginvSphereUnregister, + pluginUnregsiterEnabled: false, + expectMigrationComplete: false, + expectErr: false, + }, + { + name: "all features enabled", + pluginFeature: features.CSIMigrationvSphere, + pluginFeatureEnabled: true, + pluginUnregsiterFeature: features.InTreePluginvSphereUnregister, + pluginUnregsiterEnabled: true, + expectMigrationComplete: true, + expectErr: false, + }, + } + for _, test := range testCases { + t.Run(fmt.Sprintf("Testing %v", test.name), func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, test.pluginFeature, test.pluginFeatureEnabled)() + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, test.pluginUnregsiterFeature, test.pluginUnregsiterEnabled)() + migrationComplete, err := CheckMigrationFeatureFlags(utilfeature.DefaultFeatureGate, test.pluginFeature, test.pluginUnregsiterFeature) + if err != nil && test.expectErr == false { + t.Errorf("Unexpected error: %v", err) + } + if err == nil && test.expectErr == true { + t.Errorf("Unexpected validation pass") + } + if migrationComplete != test.expectMigrationComplete { + t.Errorf("Unexpected migrationComplete result. Exp: %v, got %v", test.expectMigrationComplete, migrationComplete) + } + }) + } +} + func TestMigrationFeatureFlagStatus(t *testing.T) { testCases := []struct { name string