From 6e61caee194224f581fa6478cb68c9801ed0ae14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Diogo=20Ferr=C3=A3o?= Date: Wed, 27 Mar 2024 15:45:16 +0000 Subject: [PATCH] Bugfix SKE downgrade replace in place (#315) * add requireif to schema, extend acc testing * fix acceptance test * improve testing --- stackit/internal/services/ske/cluster/resource.go | 11 +++++++++++ stackit/internal/services/ske/ske_acc_test.go | 13 ++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) 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 }, })