diff --git a/stackit/internal/services/ske/cluster/resource.go b/stackit/internal/services/ske/cluster/resource.go index ddd24839..f2194ca6 100644 --- a/stackit/internal/services/ske/cluster/resource.go +++ b/stackit/internal/services/ske/cluster/resource.go @@ -269,6 +269,17 @@ func (r *clusterResource) Schema(_ context.Context, _ resource.SchemaRequest, re "kubernetes_version": schema.StringAttribute{ Description: "Kubernetes version. Must only contain major and minor version (e.g. 1.22)", Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplaceIf(stringplanmodifier.RequiresReplaceIfFunc(func(ctx context.Context, sr planmodifier.StringRequest, rrifr *stringplanmodifier.RequiresReplaceIfFuncResponse) { + if sr.StateValue.IsNull() || sr.PlanValue.IsNull() { + return + } + planVersion := fmt.Sprintf("v%s", sr.PlanValue.ValueString()) + stateVersion := fmt.Sprintf("v%s", sr.StateValue.ValueString()) + + rrifr.RequiresReplace = semver.Compare(planVersion, stateVersion) < 0 + }), "Kubernetes version", "If the Kubernetes version is a downgrade, the cluster will be replaced"), + }, Validators: []validator.String{ validate.MinorVersionNumber(), }, diff --git a/stackit/internal/services/ske/ske_acc_test.go b/stackit/internal/services/ske/ske_acc_test.go index 39241f9f..f96a659b 100644 --- a/stackit/internal/services/ske/ske_acc_test.go +++ b/stackit/internal/services/ske/ske_acc_test.go @@ -443,7 +443,7 @@ func TestAccSKE(t *testing.T) { // The fields are not provided in the SKE API when disabled, although set actively. ImportStateVerifyIgnore: []string{"kube_config", "extensions.argus.%", "extensions.argus.argus_instance_id", "extensions.argus.enabled", "extensions.acl.enabled", "extensions.acl.allowed_cidrs", "extensions.acl.allowed_cidrs.#", "extensions.acl.%"}, }, - // ) Import minimal cluster + // 5) Import minimal cluster { ResourceName: "stackit_ske_cluster.cluster_min", ImportStateIdFunc: func(s *terraform.State) (string, error) { @@ -509,6 +509,17 @@ func TestAccSKE(t *testing.T) { resource.TestCheckNoResourceAttr("stackit_ske_cluster.cluster", "kube_config"), // when using the kubeconfig resource, the kubeconfig field becomes null ), }, + // 7) Downgrade kubernetes version + { + Config: getConfig(clusterResource["kubernetes_version"], utils.Ptr(clusterResource["maintenance_end_new"])), + Check: resource.ComposeAggregateTestCheckFunc( + // cluster data + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "project_id", clusterResource["project_id"]), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "name", clusterResource["name"]), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "kubernetes_version", clusterResource["kubernetes_version"]), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "kubernetes_version_used", clusterResource["kubernetes_version_used"]), + ), + }, // Deletion is done by the framework implicitly }, })