From 207a3290815132e32311cb920dbc4026dc99997a Mon Sep 17 00:00:00 2001 From: Shizhao Liu Date: Mon, 6 Jan 2025 14:37:03 -0800 Subject: [PATCH] Add feature flag for K8s 1.32 --- pkg/api/v1alpha1/cluster_types.go | 1 + pkg/features/features.go | 9 +++++++++ pkg/features/features_test.go | 8 ++++++++ pkg/validations/cluster.go | 11 +++++++++++ pkg/validations/cluster_test.go | 16 ++++++++++++++++ .../createvalidations/preflightvalidations.go | 9 +++++++++ .../upgradevalidations/preflightvalidations.go | 9 +++++++++ test/framework/cluster.go | 4 +++- 8 files changed, 66 insertions(+), 1 deletion(-) diff --git a/pkg/api/v1alpha1/cluster_types.go b/pkg/api/v1alpha1/cluster_types.go index 2b1467275645..8c5aa4657284 100644 --- a/pkg/api/v1alpha1/cluster_types.go +++ b/pkg/api/v1alpha1/cluster_types.go @@ -837,6 +837,7 @@ const ( Kube129 KubernetesVersion = "1.29" Kube130 KubernetesVersion = "1.30" Kube131 KubernetesVersion = "1.31" + Kube132 KubernetesVersion = "1.32" ) // KubeVersionToSemver converts kube version to semver for comparisons. diff --git a/pkg/features/features.go b/pkg/features/features.go index 7cb88ec06d58..decf7bf8571d 100644 --- a/pkg/features/features.go +++ b/pkg/features/features.go @@ -8,6 +8,7 @@ const ( UseControllerForCli = "USE_CONTROLLER_FOR_CLI" VSphereInPlaceEnvVar = "VSPHERE_IN_PLACE_UPGRADE" APIServerExtraArgsEnabledEnvVar = "API_SERVER_EXTRA_ARGS_ENABLED" + K8s132SupportEnvVar = "K8S_1_32_SUPPORT" ) func FeedGates(featureGates []string) { @@ -64,3 +65,11 @@ func APIServerExtraArgsEnabled() Feature { IsActive: globalFeatures.isActiveForEnvVar(APIServerExtraArgsEnabledEnvVar), } } + +// K8s132Support is the feature flag for Kubernetes 1.32 support. +func K8s132Support() Feature { + return Feature{ + Name: "Kubernetes version 1.32 support", + IsActive: globalFeatures.isActiveForEnvVar(K8s132SupportEnvVar), + } +} diff --git a/pkg/features/features_test.go b/pkg/features/features_test.go index 739d5f4c146c..efc56f828808 100644 --- a/pkg/features/features_test.go +++ b/pkg/features/features_test.go @@ -85,3 +85,11 @@ func TestAPIServerExtraArgsEnabledFeatureFlag(t *testing.T) { g.Expect(os.Setenv(APIServerExtraArgsEnabledEnvVar, "true")).To(Succeed()) g.Expect(IsActive(APIServerExtraArgsEnabled())).To(BeTrue()) } + +func TestWithK8s132FeatureFlag(t *testing.T) { + g := NewWithT(t) + setupContext(t) + + g.Expect(os.Setenv(K8s132SupportEnvVar, "true")).To(Succeed()) + g.Expect(IsActive(K8s132Support())).To(BeTrue()) +} diff --git a/pkg/validations/cluster.go b/pkg/validations/cluster.go index bed960fa2624..20508a9a9fe5 100644 --- a/pkg/validations/cluster.go +++ b/pkg/validations/cluster.go @@ -10,6 +10,7 @@ import ( "github.com/aws/eks-anywhere/pkg/cluster" "github.com/aws/eks-anywhere/pkg/config" "github.com/aws/eks-anywhere/pkg/constants" + "github.com/aws/eks-anywhere/pkg/features" "github.com/aws/eks-anywhere/pkg/logger" "github.com/aws/eks-anywhere/pkg/providers" "github.com/aws/eks-anywhere/pkg/providers/common" @@ -286,3 +287,13 @@ func ValidateBottlerocketKubeletConfig(spec *cluster.Spec) error { return nil } + +// ValidateK8s132Support checks if the 1.32 feature flag is set when using k8s 1.32. +func ValidateK8s132Support(clusterSpec *cluster.Spec) error { + if !features.IsActive(features.K8s132Support()) { + if clusterSpec.Cluster.Spec.KubernetesVersion == v1alpha1.Kube132 { + return fmt.Errorf("kubernetes version %s is not enabled. Please set the env variable %v", v1alpha1.Kube132, features.K8s132SupportEnvVar) + } + } + return nil +} diff --git a/pkg/validations/cluster_test.go b/pkg/validations/cluster_test.go index ba184169b74e..6a939a5b59ee 100644 --- a/pkg/validations/cluster_test.go +++ b/pkg/validations/cluster_test.go @@ -16,6 +16,7 @@ import ( "github.com/aws/eks-anywhere/internal/test" anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1" "github.com/aws/eks-anywhere/pkg/cluster" + "github.com/aws/eks-anywhere/pkg/features" "github.com/aws/eks-anywhere/pkg/providers" providermocks "github.com/aws/eks-anywhere/pkg/providers/mocks" "github.com/aws/eks-anywhere/pkg/types" @@ -837,3 +838,18 @@ func TestValidateBottlerocketKC(t *testing.T) { }) } } + +func TestValidateK8s132Support(t *testing.T) { + tt := newTest(t) + tt.clusterSpec.Cluster.Spec.KubernetesVersion = anywherev1.Kube132 + tt.Expect(validations.ValidateK8s132Support(tt.clusterSpec)).To( + MatchError(ContainSubstring("kubernetes version 1.32 is not enabled. Please set the env variable K8S_1_32_SUPPORT"))) +} + +func TestValidateK8s132SupportActive(t *testing.T) { + tt := newTest(t) + tt.clusterSpec.Cluster.Spec.KubernetesVersion = anywherev1.Kube132 + features.ClearCache() + os.Setenv(features.K8s132SupportEnvVar, "true") + tt.Expect(validations.ValidateK8s132Support(tt.clusterSpec)).To(Succeed()) +} diff --git a/pkg/validations/createvalidations/preflightvalidations.go b/pkg/validations/createvalidations/preflightvalidations.go index 53002e389b0b..26d1b82eabcb 100644 --- a/pkg/validations/createvalidations/preflightvalidations.go +++ b/pkg/validations/createvalidations/preflightvalidations.go @@ -8,6 +8,7 @@ import ( anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1" "github.com/aws/eks-anywhere/pkg/config" "github.com/aws/eks-anywhere/pkg/constants" + "github.com/aws/eks-anywhere/pkg/features" "github.com/aws/eks-anywhere/pkg/types" "github.com/aws/eks-anywhere/pkg/validations" ) @@ -50,6 +51,14 @@ func (v *CreateValidations) PreflightValidations(ctx context.Context) []validati Err: validations.ValidateEksaVersion(ctx, v.Opts.CliVersion, v.Opts.Spec), } }, + func() *validations.ValidationResult { + return &validations.ValidationResult{ + Name: "validate kubernetes version 1.32 support", + Remediation: fmt.Sprintf("ensure %v env variable is set", features.K8s132SupportEnvVar), + Err: validations.ValidateK8s132Support(v.Opts.Spec), + Silent: true, + } + }, } if len(v.Opts.Spec.VSphereMachineConfigs) != 0 { diff --git a/pkg/validations/upgradevalidations/preflightvalidations.go b/pkg/validations/upgradevalidations/preflightvalidations.go index 46dad6c2e6f6..09c7cac68227 100644 --- a/pkg/validations/upgradevalidations/preflightvalidations.go +++ b/pkg/validations/upgradevalidations/preflightvalidations.go @@ -9,6 +9,7 @@ import ( anywherev1 "github.com/aws/eks-anywhere/pkg/api/v1alpha1" "github.com/aws/eks-anywhere/pkg/config" "github.com/aws/eks-anywhere/pkg/constants" + "github.com/aws/eks-anywhere/pkg/features" "github.com/aws/eks-anywhere/pkg/providers" "github.com/aws/eks-anywhere/pkg/types" "github.com/aws/eks-anywhere/pkg/validation" @@ -122,6 +123,14 @@ func (u *UpgradeValidations) PreflightValidations(ctx context.Context) []validat Err: validations.ValidatePauseAnnotation(ctx, k, targetCluster, targetCluster.Name), } }, + func() *validations.ValidationResult { + return &validations.ValidationResult{ + Name: "validate kubernetes version 1.32 support", + Remediation: fmt.Sprintf("ensure %v env variable is set", features.K8s132SupportEnvVar), + Err: validations.ValidateK8s132Support(u.Opts.Spec), + Silent: true, + } + }, } if len(u.Opts.Spec.VSphereMachineConfigs) != 0 { diff --git a/test/framework/cluster.go b/test/framework/cluster.go index 16d7774abdd2..88a13b74b530 100644 --- a/test/framework/cluster.go +++ b/test/framework/cluster.go @@ -36,6 +36,7 @@ import ( "github.com/aws/eks-anywhere/pkg/cluster" "github.com/aws/eks-anywhere/pkg/constants" "github.com/aws/eks-anywhere/pkg/executables" + "github.com/aws/eks-anywhere/pkg/features" "github.com/aws/eks-anywhere/pkg/filewriter" "github.com/aws/eks-anywhere/pkg/git" "github.com/aws/eks-anywhere/pkg/providers/cloudstack/decoder" @@ -2203,11 +2204,12 @@ func dumpFile(description, path string, t T) { func (e *ClusterE2ETest) setFeatureFlagForUnreleasedKubernetesVersion(version v1alpha1.KubernetesVersion) { // Update this variable to equal the feature flagged k8s version when applicable. // For example, if k8s 1.31 is under a feature flag, we would set this to v1alpha1.Kube131 - var unreleasedK8sVersion v1alpha1.KubernetesVersion + unreleasedK8sVersion := v1alpha1.Kube132 if version == unreleasedK8sVersion { // Set feature flag for the unreleased k8s version when applicable e.T.Logf("Setting k8s version support feature flag...") + os.Setenv(features.K8s132SupportEnvVar, "true") } }