diff --git a/stackit/internal/services/ske/cluster/resource.go b/stackit/internal/services/ske/cluster/resource.go index 8109ba74..7d79f123 100644 --- a/stackit/internal/services/ske/cluster/resource.go +++ b/stackit/internal/services/ske/cluster/resource.go @@ -1407,13 +1407,13 @@ func mapFields(ctx context.Context, cl *ske.Cluster, m *Model, region string) er return nil } -func mapNodePools(ctx context.Context, cl *ske.Cluster, m *Model) error { +func mapNodePools(ctx context.Context, cl *ske.Cluster, model *Model) error { modelNodePoolOSVersion := map[string]basetypes.StringValue{} modelNodePoolOSVersionMin := map[string]basetypes.StringValue{} modelNodePools := []nodePool{} - if !m.NodePools.IsNull() && !m.NodePools.IsUnknown() { - diags := m.NodePools.ElementsAs(ctx, &modelNodePools, false) + if !model.NodePools.IsNull() && !model.NodePools.IsUnknown() { + diags := model.NodePools.ElementsAs(ctx, &modelNodePools, false) if diags.HasError() { return core.DiagsToError(diags) } @@ -1428,7 +1428,7 @@ func mapNodePools(ctx context.Context, cl *ske.Cluster, m *Model) error { } if cl.Nodepools == nil { - m.NodePools = types.ListNull(types.ObjectType{AttrTypes: nodePoolTypes}) + model.NodePools = types.ListNull(types.ObjectType{AttrTypes: nodePoolTypes}) return nil } @@ -1504,7 +1504,7 @@ func mapNodePools(ctx context.Context, cl *ske.Cluster, m *Model) error { if diags.HasError() { return core.DiagsToError(diags) } - m.NodePools = nodePoolsTF + model.NodePools = nodePoolsTF return nil } diff --git a/stackit/internal/services/ske/ske_acc_test.go b/stackit/internal/services/ske/ske_acc_test.go index 44634b56..8cb47e38 100644 --- a/stackit/internal/services/ske/ske_acc_test.go +++ b/stackit/internal/services/ske/ske_acc_test.go @@ -2,14 +2,17 @@ package ske_test import ( "context" + _ "embed" "fmt" + "maps" "strings" "testing" + "github.com/hashicorp/terraform-plugin-testing/config" "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" - "github.com/stackitcloud/stackit-sdk-go/core/config" + core_config "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/core/utils" "github.com/stackitcloud/stackit-sdk-go/services/ske" "github.com/stackitcloud/stackit-sdk-go/services/ske/wait" @@ -17,195 +20,91 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/testutil" ) -var clusterResource = map[string]string{ - "project_id": testutil.ProjectId, - "name": fmt.Sprintf("cl-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum)), - "name_min": fmt.Sprintf("cl-min-%s", acctest.RandStringFromCharSet(3, acctest.CharSetAlphaNum)), - "kubernetes_version_min": "1.30", - "kubernetes_version_used": "1.30.11", - "kubernetes_version_min_new": "1.31", - "kubernetes_version_used_new": "1.31.7", - "nodepool_name": "np-acc-test", - "nodepool_name_min": "np-acc-min-test", - "nodepool_machine_type": "b1.2", - "nodepool_os_version_min": "4081.2.1", - "nodepool_os_version_used": "4081.2.1", - "nodepool_os_version_min_new": "4152.2.1", - "nodepool_os_version_used_new": "4152.2.1", - "nodepool_os_name": "flatcar", - "nodepool_minimum": "2", - "nodepool_maximum": "3", - "nodepool_max_surge": "1", - "nodepool_max_unavailable": "1", - "nodepool_volume_size": "20", - "nodepool_volume_type": "storage_premium_perf0", - "nodepool_zone": "eu01-3", - "nodepool_cri": "containerd", - "nodepool_label_key": "key", - "nodepool_label_value": "value", - "nodepool_taints_effect": "PreferNoSchedule", - "nodepool_taints_key": "tkey", - "nodepool_taints_value": "tvalue", - "nodepool_allow_system_components": "true", - "extensions_acl_enabled": "true", - "extensions_acl_cidrs": "192.168.0.0/24", - "extensions_argus_enabled": "false", - "extensions_argus_instance_id": "aaaaaaaa-1111-2222-3333-444444444444", // A not-existing Argus ID let the creation time-out. - "extensions_dns_enabled": "true", - "extensions_dns_zones": dnsResource["dns_name"], - "hibernations_start": "0 16 * * *", - "hibernations_end": "0 18 * * *", - "hibernations_timezone": "Europe/Berlin", - "maintenance_enable_kubernetes_version_updates": "true", - "maintenance_enable_machine_image_version_updates": "true", - "maintenance_start": "01:23:45Z", - "maintenance_end": "05:00:00+02:00", - "maintenance_end_new": "03:03:03+00:00", - "kubeconfig_expiration": "3600", +var ( + minTestName = "acc-min" + acctest.RandStringFromCharSet(3, acctest.CharSetAlpha) + maxTestName = "acc-max" + acctest.RandStringFromCharSet(3, acctest.CharSetAlpha) +) + +var ( + //go:embed testdata/resource-min.tf + resourceMin string + + //go:embed testdata/resource-max.tf + resourceMax string +) + +var testConfigVarsMin = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(minTestName), + "nodepool_availability_zone1": config.StringVariable("eu01-m"), + "nodepool_machine_type": config.StringVariable("g1.2"), + "nodepool_minimum": config.StringVariable("1"), + "nodepool_maximum": config.StringVariable("2"), + "nodepool_name": config.StringVariable("np-acc-test"), + "kubernetes_version_min": config.StringVariable("1.31.8"), + "maintenance_enable_machine_image_version_updates": config.StringVariable("true"), + "maintenance_enable_kubernetes_version_updates": config.StringVariable("true"), + "maintenance_start": config.StringVariable("02:00:00+01:00"), + "maintenance_end": config.StringVariable("04:00:00+01:00"), + "region": config.StringVariable("eu01"), } -var dnsResource = map[string]string{ - "project_id": testutil.ProjectId, - "dns_name": "acc-test.runs.onstackit.cloud", +var testConfigVarsMax = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "organization_id": config.StringVariable(testutil.OrganizationId), + "name": config.StringVariable(maxTestName), + "nodepool_availability_zone1": config.StringVariable("eu01-m"), + "nodepool_machine_type": config.StringVariable("g1.2"), + "nodepool_minimum": config.StringVariable("1"), + "nodepool_maximum": config.StringVariable("2"), + "nodepool_name": config.StringVariable("np-acc-test"), + "nodepool_allow_system_components": config.StringVariable("true"), + "nodepool_cri": config.StringVariable("containerd"), + "nodepool_label_value": config.StringVariable("value"), + "nodepool_max_surge": config.StringVariable("1"), + "nodepool_max_unavailable": config.StringVariable("1"), + "nodepool_os_name": config.StringVariable("flatcar"), + "nodepool_os_version_min": config.StringVariable("4152.2.1"), + "nodepool_taints_effect": config.StringVariable("PreferNoSchedule"), + "nodepool_taints_key": config.StringVariable("tkey"), + "nodepool_taints_value": config.StringVariable("tvalue"), + "nodepool_volume_size": config.StringVariable("20"), + "nodepool_volume_type": config.StringVariable("storage_premium_perf0"), + "ext_acl_enabled": config.StringVariable("true"), + "ext_acl_allowed_cidr1": config.StringVariable("10.0.100.0/24"), + "ext_argus_enabled": config.StringVariable("false"), + "ext_dns_enabled": config.StringVariable("true"), + "nodepool_hibernations1_start": config.StringVariable("0 18 * * *"), + "nodepool_hibernations1_end": config.StringVariable("59 23 * * *"), + "nodepool_hibernations1_timezone": config.StringVariable("Europe/Berlin"), + "kubernetes_version_min": config.StringVariable("1.31.8"), + "maintenance_enable_machine_image_version_updates": config.StringVariable("true"), + "maintenance_enable_kubernetes_version_updates": config.StringVariable("true"), + "maintenance_start": config.StringVariable("02:00:00+01:00"), + "maintenance_end": config.StringVariable("04:00:00+01:00"), + "region": config.StringVariable("eu01"), + "expiration": config.StringVariable("3600"), + "refresh": config.StringVariable("true"), + "dns_zone_name": config.StringVariable("acc-" + acctest.RandStringFromCharSet(6, acctest.CharSetAlpha)), + "dns_name": config.StringVariable("acc-" + acctest.RandStringFromCharSet(6, acctest.CharSetAlpha) + ".runs.onstackit.cloud"), } -func getDnsConfig() string { - return fmt.Sprintf(` - resource "stackit_dns_zone" "dns" { - project_id = "%s" - name = "acc-test-zone" - dns_name = "%s" - description = "DNS zone used by acceptance tests." - contact_email = "hostmaster@stackit.cloud" - type = "primary" - default_ttl = 3600 - } - `, - dnsResource["project_id"], - dnsResource["dns_name"], - ) +func configVarsMinUpdated() config.Variables { + updatedConfig := maps.Clone(testConfigVarsMax) + updatedConfig["kubernetes_version_min"] = config.StringVariable("1.31") + + return updatedConfig } -func getConfig(kubernetesVersion, nodePoolMachineOSVersion string, maintenanceEnd, region *string) string { - maintenanceEndTF := clusterResource["maintenance_end"] - if maintenanceEnd != nil { - maintenanceEndTF = *maintenanceEnd - } - var regionConfig string - if region != nil { - regionConfig = fmt.Sprintf(`region = %q`, *region) - } - return fmt.Sprintf(` - %s +func configVarsMaxUpdated() config.Variables { + updatedConfig := maps.Clone(testConfigVarsMax) + updatedConfig["kubernetes_version_min"] = config.StringVariable("1.31") + updatedConfig["nodepool_os_version_min"] = config.StringVariable("4152.2.1") + updatedConfig["maintenance_end"] = config.StringVariable("03:03:03+00:00") - %s - - resource "stackit_ske_cluster" "cluster" { - project_id = "%s" - name = "%s" - kubernetes_version_min = "%s" - node_pools = [{ - name = "%s" - machine_type = "%s" - minimum = "%s" - maximum = "%s" - max_surge = "%s" - max_unavailable = "%s" - os_name = "%s" - os_version_min = "%s" - volume_size = "%s" - volume_type = "%s" - cri = "%s" - availability_zones = ["%s"] - labels = { - %s = "%s" - } - taints = [{ - effect = "%s" - key = "%s" - value = "%s" - }] - allow_system_components = %s - }] - extensions = { - acl = { - enabled = %s - allowed_cidrs = ["%s"] - } - argus = { - enabled = %s - argus_instance_id = "%s" - } - dns = { - enabled = %s - zones = ["%s"] - } - } - hibernations = [{ - start = "%s" - end = "%s" - timezone = "%s" - }] - maintenance = { - enable_kubernetes_version_updates = %s - enable_machine_image_version_updates = %s - start = "%s" - end = "%s" - } - %s - } - - resource "stackit_ske_kubeconfig" "kubeconfig" { - project_id = stackit_ske_cluster.cluster.project_id - cluster_name = stackit_ske_cluster.cluster.name - expiration = "%s" - } - - `, - testutil.SKEProviderConfig(), - getDnsConfig(), - clusterResource["project_id"], - clusterResource["name"], - kubernetesVersion, - clusterResource["nodepool_name"], - clusterResource["nodepool_machine_type"], - clusterResource["nodepool_minimum"], - clusterResource["nodepool_maximum"], - clusterResource["nodepool_max_surge"], - clusterResource["nodepool_max_unavailable"], - clusterResource["nodepool_os_name"], - nodePoolMachineOSVersion, - clusterResource["nodepool_volume_size"], - clusterResource["nodepool_volume_type"], - clusterResource["nodepool_cri"], - clusterResource["nodepool_zone"], - clusterResource["nodepool_label_key"], - clusterResource["nodepool_label_value"], - clusterResource["nodepool_taints_effect"], - clusterResource["nodepool_taints_key"], - clusterResource["nodepool_taints_value"], - clusterResource["nodepool_allow_system_components"], - clusterResource["extensions_acl_enabled"], - clusterResource["extensions_acl_cidrs"], - clusterResource["extensions_argus_enabled"], - clusterResource["extensions_argus_instance_id"], - clusterResource["extensions_dns_enabled"], - clusterResource["extensions_dns_zones"], - clusterResource["hibernations_start"], - clusterResource["hibernations_end"], - clusterResource["hibernations_timezone"], - clusterResource["maintenance_enable_kubernetes_version_updates"], - clusterResource["maintenance_enable_machine_image_version_updates"], - clusterResource["maintenance_start"], - maintenanceEndTF, - regionConfig, - - // Kubeconfig - clusterResource["kubeconfig_expiration"], - ) + return updatedConfig } - -func TestAccSKE(t *testing.T) { +func TestAccSKEMin(t *testing.T) { resource.Test(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, CheckDestroy: testAccCheckSKEDestroy, @@ -213,53 +112,29 @@ func TestAccSKE(t *testing.T) { // 1) Creation { - - Config: getConfig(clusterResource["kubernetes_version_min"], clusterResource["nodepool_os_version_min"], nil, &testutil.Region), + Config: testutil.SKEProviderConfig() + "\n" + resourceMin, + ConfigVariables: testConfigVarsMin, Check: resource.ComposeAggregateTestCheckFunc( // cluster data - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "name", clusterResource["name"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "kubernetes_version_min", clusterResource["kubernetes_version_min"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "kubernetes_version_used", clusterResource["kubernetes_version_used"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.name", clusterResource["nodepool_name"]), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "project_id", testutil.ConvertConfigVariable(testConfigVarsMin["project_id"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "name", testutil.ConvertConfigVariable(testConfigVarsMin["name"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.#", "1"), resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.availability_zones.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.availability_zones.0", clusterResource["nodepool_zone"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_name", clusterResource["nodepool_os_name"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_version_min", clusterResource["nodepool_os_version_min"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_version_used", clusterResource["nodepool_os_version_used"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.machine_type", clusterResource["nodepool_machine_type"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.minimum", clusterResource["nodepool_minimum"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.maximum", clusterResource["nodepool_maximum"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.max_surge", clusterResource["nodepool_max_surge"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.max_unavailable", clusterResource["nodepool_max_unavailable"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.volume_type", clusterResource["nodepool_volume_type"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.volume_size", clusterResource["nodepool_volume_size"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", fmt.Sprintf("node_pools.0.labels.%s", clusterResource["nodepool_label_key"]), clusterResource["nodepool_label_value"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.effect", clusterResource["nodepool_taints_effect"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.key", clusterResource["nodepool_taints_key"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.value", clusterResource["nodepool_taints_value"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.allow_system_components", clusterResource["nodepool_allow_system_components"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.cri", clusterResource["nodepool_cri"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.enabled", clusterResource["extensions_acl_enabled"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.0", clusterResource["extensions_acl_cidrs"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.argus.enabled", clusterResource["extensions_argus_enabled"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.argus.argus_instance_id", clusterResource["extensions_argus_instance_id"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.enabled", clusterResource["extensions_dns_enabled"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.zones.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.zones.0", clusterResource["extensions_dns_zones"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.start", clusterResource["hibernations_start"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.end", clusterResource["hibernations_end"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.timezone", clusterResource["hibernations_timezone"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_kubernetes_version_updates", clusterResource["maintenance_enable_kubernetes_version_updates"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_machine_image_version_updates", clusterResource["maintenance_enable_machine_image_version_updates"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.start", clusterResource["maintenance_start"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.end", clusterResource["maintenance_end"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "region", testutil.Region), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.availability_zones.0", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_availability_zone1"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.machine_type", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_machine_type"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.maximum", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_maximum"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.minimum", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_minimum"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.name", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_name"])), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "node_pools.0.os_version_used"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_kubernetes_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_kubernetes_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_machine_image_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_machine_image_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.start", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_start"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.end", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_end"])), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "region"), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "kubernetes_version_used"), // Kubeconfig - resource.TestCheckResourceAttrPair( "stackit_ske_kubeconfig.kubeconfig", "project_id", "stackit_ske_cluster.cluster", "project_id", @@ -268,72 +143,41 @@ func TestAccSKE(t *testing.T) { "stackit_ske_kubeconfig.kubeconfig", "cluster_name", "stackit_ske_cluster.cluster", "name", ), - resource.TestCheckResourceAttr("stackit_ske_kubeconfig.kubeconfig", "expiration", clusterResource["kubeconfig_expiration"]), - resource.TestCheckResourceAttrSet("stackit_ske_kubeconfig.kubeconfig", "expires_at"), ), }, // 2) Data source { - Config: fmt.Sprintf(` - %s - - data "stackit_ske_cluster" "cluster" { - project_id = "%s" - name = "%s" - depends_on = [stackit_ske_cluster.cluster] - } - - `, - getConfig(clusterResource["kubernetes_version_min"], clusterResource["nodepool_os_version_min"], nil, &testutil.Region), - clusterResource["project_id"], - clusterResource["name"], - ), + Config: resourceMin, + ConfigVariables: testConfigVarsMin, Check: resource.ComposeAggregateTestCheckFunc( // cluster data resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "id", fmt.Sprintf("%s,%s,%s", - clusterResource["project_id"], + testutil.ConvertConfigVariable(testConfigVarsMin["project_id"]), testutil.Region, - clusterResource["name"], + testutil.ConvertConfigVariable(testConfigVarsMin["name"]), )), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "project_id", clusterResource["project_id"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "name", clusterResource["name"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "kubernetes_version_used", clusterResource["kubernetes_version_used"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.name", clusterResource["nodepool_name"]), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.#", "1"), resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.availability_zones.#", "1"), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.availability_zones.0", clusterResource["nodepool_zone"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.os_name", clusterResource["nodepool_os_name"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.machine_type", clusterResource["nodepool_machine_type"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.minimum", clusterResource["nodepool_minimum"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.maximum", clusterResource["nodepool_maximum"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.max_surge", clusterResource["nodepool_max_surge"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.max_unavailable", clusterResource["nodepool_max_unavailable"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.volume_type", clusterResource["nodepool_volume_type"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.volume_size", clusterResource["nodepool_volume_size"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", fmt.Sprintf("node_pools.0.labels.%s", clusterResource["nodepool_label_key"]), clusterResource["nodepool_label_value"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.taints.#", "1"), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.taints.0.effect", clusterResource["nodepool_taints_effect"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.taints.0.key", clusterResource["nodepool_taints_key"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.taints.0.value", clusterResource["nodepool_taints_value"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.allow_system_components", clusterResource["nodepool_allow_system_components"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.cri", clusterResource["nodepool_cri"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "extensions.acl.enabled", clusterResource["extensions_acl_enabled"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.#", "1"), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.0", clusterResource["extensions_acl_cidrs"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "hibernations.#", "1"), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "hibernations.0.start", clusterResource["hibernations_start"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "hibernations.0.end", clusterResource["hibernations_end"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "hibernations.0.timezone", clusterResource["hibernations_timezone"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "hibernations.0.end", clusterResource["hibernations_end"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "maintenance.enable_kubernetes_version_updates", clusterResource["maintenance_enable_kubernetes_version_updates"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "maintenance.enable_machine_image_version_updates", clusterResource["maintenance_enable_machine_image_version_updates"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "maintenance.start", clusterResource["maintenance_start"]), - resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "maintenance.end", clusterResource["maintenance_end"]), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.availability_zones.0", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_availability_zone1"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.machine_type", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_machine_type"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.maximum", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_maximum"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.minimum", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_minimum"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.name", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_name"])), + + resource.TestCheckResourceAttrSet("data.stackit_ske_cluster.cluster", "kubernetes_version_used"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_kubernetes_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_kubernetes_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_machine_image_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_machine_image_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.start", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_start"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.end", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_end"])), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "region"), + resource.TestCheckResourceAttrSet("data.stackit_ske_cluster.cluster", "kubernetes_version_used"), ), }, // 3) Import cluster { - ResourceName: "stackit_ske_cluster.cluster", + ResourceName: "stackit_ske_cluster.cluster", + ConfigVariables: testConfigVarsMin, ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_ske_cluster.cluster"] if !ok { @@ -354,64 +198,244 @@ func TestAccSKE(t *testing.T) { // The fields are not provided in the SKE API when disabled, although set actively. ImportStateVerifyIgnore: []string{"kubernetes_version_min", "node_pools.0.os_version_min", "extensions.argus.%", "extensions.argus.argus_instance_id", "extensions.argus.enabled"}, }, - // 4) Update kubernetes version, OS version and maintenance end + // 4) Update kubernetes version, OS version and maintenance end, downgrade of kubernetes version { - Config: getConfig(clusterResource["kubernetes_version_min_new"], clusterResource["nodepool_os_version_min_new"], utils.Ptr(clusterResource["maintenance_end_new"]), &testutil.Region), + Config: resourceMin, + ConfigVariables: configVarsMinUpdated(), 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_min", clusterResource["kubernetes_version_min_new"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "kubernetes_version_used", clusterResource["kubernetes_version_used_new"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.name", clusterResource["nodepool_name"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.availability_zones.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.availability_zones.0", clusterResource["nodepool_zone"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_name", clusterResource["nodepool_os_name"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_version_min", clusterResource["nodepool_os_version_min_new"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_version_used", clusterResource["nodepool_os_version_used_new"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.machine_type", clusterResource["nodepool_machine_type"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.minimum", clusterResource["nodepool_minimum"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.maximum", clusterResource["nodepool_maximum"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.max_surge", clusterResource["nodepool_max_surge"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.max_unavailable", clusterResource["nodepool_max_unavailable"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.volume_type", clusterResource["nodepool_volume_type"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.volume_size", clusterResource["nodepool_volume_size"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", fmt.Sprintf("node_pools.0.labels.%s", clusterResource["nodepool_label_key"]), clusterResource["nodepool_label_value"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.effect", clusterResource["nodepool_taints_effect"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.key", clusterResource["nodepool_taints_key"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.value", clusterResource["nodepool_taints_value"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.cri", clusterResource["nodepool_cri"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.enabled", clusterResource["extensions_acl_enabled"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.0", clusterResource["extensions_acl_cidrs"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.argus.enabled", clusterResource["extensions_argus_enabled"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.argus.argus_instance_id", clusterResource["extensions_argus_instance_id"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.enabled", clusterResource["extensions_dns_enabled"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.zones.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.zones.0", clusterResource["extensions_dns_zones"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.#", "1"), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.start", clusterResource["hibernations_start"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.end", clusterResource["hibernations_end"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.timezone", clusterResource["hibernations_timezone"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_kubernetes_version_updates", clusterResource["maintenance_enable_kubernetes_version_updates"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_machine_image_version_updates", clusterResource["maintenance_enable_machine_image_version_updates"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.start", clusterResource["maintenance_start"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.end", clusterResource["maintenance_end_new"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "region", testutil.Region), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.#", "1"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.availability_zones.#", "1"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.availability_zones.0", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_availability_zone1"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.machine_type", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_machine_type"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.maximum", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_maximum"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.minimum", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_minimum"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.name", testutil.ConvertConfigVariable(testConfigVarsMin["nodepool_name"])), + + resource.TestCheckResourceAttrSet("data.stackit_ske_cluster.cluster", "kubernetes_version_used"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_kubernetes_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_kubernetes_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_machine_image_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_machine_image_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.start", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_start"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.end", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_end"])), + resource.TestCheckResourceAttrSet("data.stackit_ske_cluster.cluster", "kubernetes_version_used"), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "region"), ), }, - // 5) Downgrade kubernetes and nodepool machine OS version + // Deletion is done by the framework implicitly + }, + }) +} + +func TestAccSKEMax(t *testing.T) { + resource.Test(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckSKEDestroy, + Steps: []resource.TestStep{ + + // 1) Creation { - Config: getConfig(clusterResource["kubernetes_version_min"], clusterResource["nodepool_os_version_min"], utils.Ptr(clusterResource["maintenance_end_new"]), &testutil.Region), + Config: testutil.SKEProviderConfig() + "\n" + resourceMax, + ConfigVariables: testConfigVarsMax, 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_min", clusterResource["kubernetes_version_min"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "kubernetes_version_used", clusterResource["kubernetes_version_used_new"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_version_min", clusterResource["nodepool_os_version_min"]), - resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_version_used", clusterResource["nodepool_os_version_used_new"]), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "project_id", testutil.ConvertConfigVariable(testConfigVarsMax["project_id"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "name", testutil.ConvertConfigVariable(testConfigVarsMax["name"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.availability_zones.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.availability_zones.0", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_availability_zone1"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.machine_type", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_machine_type"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.maximum", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_maximum"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.minimum", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_minimum"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.name", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_name"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.allow_system_components", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_allow_system_components"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.cri", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_cri"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.labels.label_key", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_label_value"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.max_surge", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_max_surge"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.max_unavailable", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_max_unavailable"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_name", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_os_name"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_version_min", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_os_version_min"])), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "node_pools.0.os_version_used"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.effect", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_taints_effect"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.key", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_taints_key"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.value", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_taints_value"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.volume_size", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_volume_size"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.volume_type", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_volume_type"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.enabled", testutil.ConvertConfigVariable(testConfigVarsMax["ext_acl_enabled"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.0", testutil.ConvertConfigVariable(testConfigVarsMax["ext_acl_allowed_cidr1"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.argus.enabled", testutil.ConvertConfigVariable(testConfigVarsMax["ext_argus_enabled"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.enabled", testutil.ConvertConfigVariable(testConfigVarsMax["ext_dns_enabled"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.zones.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.zones.0", testutil.ConvertConfigVariable(testConfigVarsMax["dns_name"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.start", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_hibernations1_start"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.end", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_hibernations1_end"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.timezone", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_hibernations1_timezone"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "kubernetes_version_min", testutil.ConvertConfigVariable(testConfigVarsMax["kubernetes_version_min"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_kubernetes_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_kubernetes_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_machine_image_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_machine_image_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.start", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_start"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.end", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_end"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "region", testutil.ConvertConfigVariable(testConfigVarsMax["region"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "egress_address_ranges.#", "1"), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "egress_address_ranges.0"), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "kubernetes_version_used"), + + // Kubeconfig + resource.TestCheckResourceAttrPair( + "stackit_ske_kubeconfig.kubeconfig", "project_id", + "stackit_ske_cluster.cluster", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_ske_kubeconfig.kubeconfig", "cluster_name", + "stackit_ske_cluster.cluster", "name", + ), + resource.TestCheckResourceAttr("stackit_ske_kubeconfig.kubeconfig", "expiration", testutil.ConvertConfigVariable(testConfigVarsMax["expiration"])), + resource.TestCheckResourceAttrSet("stackit_ske_kubeconfig.kubeconfig", "expires_at"), + ), + }, + // 2) Data source + { + Config: resourceMax, + ConfigVariables: testConfigVarsMax, + Check: resource.ComposeAggregateTestCheckFunc( + + // cluster data + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "id", fmt.Sprintf("%s,%s,%s", + testutil.ConvertConfigVariable(testConfigVarsMax["project_id"]), + testutil.Region, + testutil.ConvertConfigVariable(testConfigVarsMax["name"]), + )), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.#", "1"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.availability_zones.#", "1"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.availability_zones.0", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_availability_zone1"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.machine_type", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_machine_type"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.maximum", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_maximum"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.minimum", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_minimum"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.name", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_name"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.allow_system_components", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_allow_system_components"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.cri", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_cri"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.labels.label_key", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_label_value"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.max_surge", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_max_surge"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.max_unavailable", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_max_unavailable"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.os_name", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_os_name"])), + resource.TestCheckResourceAttrSet("data.stackit_ske_cluster.cluster", "node_pools.0.os_version_used"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.taints.#", "1"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.taints.0.effect", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_taints_effect"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.taints.0.key", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_taints_key"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.taints.0.value", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_taints_value"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.volume_size", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_volume_size"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "node_pools.0.volume_type", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_volume_type"])), + + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "extensions.acl.enabled", testutil.ConvertConfigVariable(testConfigVarsMax["ext_acl_enabled"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.#", "1"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.0", testutil.ConvertConfigVariable(testConfigVarsMax["ext_acl_allowed_cidr1"])), + // no check for argus, as it was disabled in the setup + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "extensions.dns.enabled", testutil.ConvertConfigVariable(testConfigVarsMax["ext_dns_enabled"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "extensions.dns.zones.#", "1"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "extensions.dns.zones.0", testutil.ConvertConfigVariable(testConfigVarsMax["dns_name"])), + + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "hibernations.#", "1"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "hibernations.0.start", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_hibernations1_start"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "hibernations.0.end", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_hibernations1_end"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "hibernations.0.timezone", testutil.ConvertConfigVariable(testConfigVarsMax["nodepool_hibernations1_timezone"])), + + resource.TestCheckResourceAttrSet("data.stackit_ske_cluster.cluster", "kubernetes_version_used"), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "maintenance.enable_kubernetes_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_kubernetes_version_updates"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "maintenance.enable_machine_image_version_updates", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_enable_machine_image_version_updates"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "maintenance.start", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_start"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "maintenance.end", testutil.ConvertConfigVariable(testConfigVarsMax["maintenance_end"])), + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "region", testutil.ConvertConfigVariable(testConfigVarsMax["region"])), + + resource.TestCheckResourceAttr("data.stackit_ske_cluster.cluster", "egress_address_ranges.#", "1"), + resource.TestCheckResourceAttrSet("data.stackit_ske_cluster.cluster", "egress_address_ranges.0"), + resource.TestCheckResourceAttrSet("data.stackit_ske_cluster.cluster", "kubernetes_version_used"), + ), + }, + // 3) Import cluster + { + ResourceName: "stackit_ske_cluster.cluster", + ConfigVariables: testConfigVarsMax, + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_ske_cluster.cluster"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_ske_cluster.cluster") + } + _, ok = r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } + name, ok := r.Primary.Attributes["name"] + if !ok { + return "", fmt.Errorf("couldn't find attribute name") + } + return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, name), nil + }, + ImportState: true, + ImportStateVerify: true, + // The fields are not provided in the SKE API when disabled, although set actively. + ImportStateVerifyIgnore: []string{"kubernetes_version_min", "node_pools.0.os_version_min", "extensions.argus.%", "extensions.argus.argus_instance_id", "extensions.argus.enabled"}, + }, + // 4) Update kubernetes version, OS version and maintenance end, downgrade of kubernetes version + { + Config: resourceMax, + ConfigVariables: configVarsMaxUpdated(), + Check: resource.ComposeAggregateTestCheckFunc( + // cluster data + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "project_id", testutil.ConvertConfigVariable(configVarsMaxUpdated()["project_id"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "name", testutil.ConvertConfigVariable(configVarsMaxUpdated()["name"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.availability_zones.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.availability_zones.0", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_availability_zone1"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.machine_type", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_machine_type"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.maximum", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_maximum"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.minimum", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_minimum"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.name", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_name"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.allow_system_components", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_allow_system_components"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.cri", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_cri"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.labels.label_key", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_label_value"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.max_surge", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_max_surge"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.max_unavailable", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_max_unavailable"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_name", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_os_name"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.os_version_min", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_os_version_min"])), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "node_pools.0.os_version_used"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.effect", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_taints_effect"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.key", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_taints_key"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.taints.0.value", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_taints_value"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.volume_size", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_volume_size"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "node_pools.0.volume_type", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_volume_type"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.enabled", testutil.ConvertConfigVariable(configVarsMaxUpdated()["ext_acl_enabled"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.acl.allowed_cidrs.0", testutil.ConvertConfigVariable(configVarsMaxUpdated()["ext_acl_allowed_cidr1"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.argus.enabled", testutil.ConvertConfigVariable(configVarsMaxUpdated()["ext_argus_enabled"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.enabled", testutil.ConvertConfigVariable(configVarsMaxUpdated()["ext_dns_enabled"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.zones.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "extensions.dns.zones.0", testutil.ConvertConfigVariable(configVarsMaxUpdated()["dns_name"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.#", "1"), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.start", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_hibernations1_start"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.end", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_hibernations1_end"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "hibernations.0.timezone", testutil.ConvertConfigVariable(configVarsMaxUpdated()["nodepool_hibernations1_timezone"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "kubernetes_version_min", testutil.ConvertConfigVariable(configVarsMaxUpdated()["kubernetes_version_min"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_kubernetes_version_updates", testutil.ConvertConfigVariable(configVarsMaxUpdated()["maintenance_enable_kubernetes_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.enable_machine_image_version_updates", testutil.ConvertConfigVariable(configVarsMaxUpdated()["maintenance_enable_machine_image_version_updates"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.start", testutil.ConvertConfigVariable(configVarsMaxUpdated()["maintenance_start"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "maintenance.end", testutil.ConvertConfigVariable(configVarsMaxUpdated()["maintenance_end"])), + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "region", testutil.ConvertConfigVariable(configVarsMaxUpdated()["region"])), + + resource.TestCheckResourceAttr("stackit_ske_cluster.cluster", "egress_address_ranges.#", "1"), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "egress_address_ranges.0"), + resource.TestCheckResourceAttrSet("stackit_ske_cluster.cluster", "kubernetes_version_used"), ), }, // Deletion is done by the framework implicitly @@ -425,11 +449,11 @@ func testAccCheckSKEDestroy(s *terraform.State) error { var err error if testutil.SKECustomEndpoint == "" { client, err = ske.NewAPIClient( - config.WithRegion("eu01"), + core_config.WithRegion("eu01"), ) } else { client, err = ske.NewAPIClient( - config.WithEndpoint(testutil.SKECustomEndpoint), + core_config.WithEndpoint(testutil.SKECustomEndpoint), ) } if err != nil { diff --git a/stackit/internal/services/ske/testdata/resource-max.tf b/stackit/internal/services/ske/testdata/resource-max.tf new file mode 100644 index 00000000..c30bb30c --- /dev/null +++ b/stackit/internal/services/ske/testdata/resource-max.tf @@ -0,0 +1,114 @@ +variable "project_id" {} +variable "name" {} +variable "nodepool_availability_zone1" {} +variable "nodepool_machine_type" {} +variable "nodepool_maximum" {} +variable "nodepool_minimum" {} +variable "nodepool_name" {} +variable "nodepool_allow_system_components" {} +variable "nodepool_cri" {} +variable "nodepool_label_value" {} +variable "nodepool_max_surge" {} +variable "nodepool_max_unavailable" {} +variable "nodepool_os_name" {} +variable "nodepool_os_version_min" {} +variable "nodepool_taints_effect" {} +variable "nodepool_taints_key" {} +variable "nodepool_taints_value" {} +variable "nodepool_volume_size" {} +variable "nodepool_volume_type" {} +variable "ext_acl_enabled" {} +variable "ext_acl_allowed_cidr1" {} +variable "ext_argus_enabled" {} +variable "ext_dns_enabled" {} +variable "nodepool_hibernations1_start" {} +variable "nodepool_hibernations1_end" {} +variable "nodepool_hibernations1_timezone" {} +variable "kubernetes_version_min" {} +variable "maintenance_enable_kubernetes_version_updates" {} +variable "maintenance_enable_machine_image_version_updates" {} +variable "maintenance_start" {} +variable "maintenance_end" {} +variable "region" {} +variable "expiration" {} +variable "refresh" {} +variable "dns_zone_name" {} +variable "dns_name" {} + +resource "stackit_ske_cluster" "cluster" { + project_id = var.project_id + name = var.name + + node_pools = [{ + availability_zones = [var.nodepool_availability_zone1] + machine_type = var.nodepool_machine_type + maximum = var.nodepool_maximum + minimum = var.nodepool_minimum + name = var.nodepool_name + + allow_system_components = var.nodepool_allow_system_components + cri = var.nodepool_cri + labels = { + "label_key" = var.nodepool_label_value + } + max_surge = var.nodepool_max_surge + max_unavailable = var.nodepool_max_unavailable + os_name = var.nodepool_os_name + os_version_min = var.nodepool_os_version_min + taints = [{ + effect = var.nodepool_taints_effect + key = var.nodepool_taints_key + value = var.nodepool_taints_value + }] + volume_size = var.nodepool_volume_size + volume_type = var.nodepool_volume_type + } + ] + + extensions = { + acl = { + enabled = var.ext_acl_enabled + allowed_cidrs = [var.ext_acl_allowed_cidr1] + } + argus = { + enabled = var.ext_argus_enabled + } + dns = { + enabled = var.ext_dns_enabled + zones = [stackit_dns_zone.dns-zone.dns_name] + } + } + hibernations = [{ + start = var.nodepool_hibernations1_start + end = var.nodepool_hibernations1_end + timezone = var.nodepool_hibernations1_timezone + }] + kubernetes_version_min = var.kubernetes_version_min + maintenance = { + enable_kubernetes_version_updates = var.maintenance_enable_kubernetes_version_updates + enable_machine_image_version_updates = var.maintenance_enable_machine_image_version_updates + start = var.maintenance_start + end = var.maintenance_end + } + region = var.region +} + +resource "stackit_ske_kubeconfig" "kubeconfig" { + project_id = stackit_ske_cluster.cluster.project_id + cluster_name = stackit_ske_cluster.cluster.name + expiration = var.expiration + refresh = var.refresh +} + +data "stackit_ske_cluster" "cluster" { + project_id = var.project_id + name = stackit_ske_cluster.cluster.name +} + + +resource "stackit_dns_zone" "dns-zone" { + project_id = var.project_id + name = var.dns_zone_name + dns_name = var.dns_name +} + diff --git a/stackit/internal/services/ske/testdata/resource-min.tf b/stackit/internal/services/ske/testdata/resource-min.tf new file mode 100644 index 00000000..776e7fc5 --- /dev/null +++ b/stackit/internal/services/ske/testdata/resource-min.tf @@ -0,0 +1,51 @@ +variable "project_id" {} +variable "name" {} +variable "nodepool_availability_zone1" {} +variable "nodepool_machine_type" {} +variable "nodepool_maximum" {} +variable "nodepool_minimum" {} +variable "nodepool_name" {} +variable "kubernetes_version_min" {} +variable "maintenance_enable_kubernetes_version_updates" {} +variable "maintenance_enable_machine_image_version_updates" {} +variable "maintenance_start" {} +variable "maintenance_end" {} +variable "region" {} + + +resource "stackit_ske_cluster" "cluster" { + project_id = var.project_id + name = var.name + + node_pools = [{ + availability_zones = [var.nodepool_availability_zone1] + machine_type = var.nodepool_machine_type + maximum = var.nodepool_maximum + minimum = var.nodepool_minimum + name = var.nodepool_name + } + ] + kubernetes_version_min = var.kubernetes_version_min + # even though the maintenance attribute is not mandatory, + # it is required for a consistent plan + # see https://jira.schwarz/browse/STACKITTPR-242 + maintenance = { + enable_kubernetes_version_updates = var.maintenance_enable_kubernetes_version_updates + enable_machine_image_version_updates = var.maintenance_enable_machine_image_version_updates + start = var.maintenance_start + end = var.maintenance_end + } + region = var.region +} + +resource "stackit_ske_kubeconfig" "kubeconfig" { + project_id = stackit_ske_cluster.cluster.project_id + cluster_name = stackit_ske_cluster.cluster.name +} + +data "stackit_ske_cluster" "cluster" { + project_id = var.project_id + name = stackit_ske_cluster.cluster.name +} + +