diff --git a/docs/data-sources/image_v2.md b/docs/data-sources/image_v2.md index b417f17b0..e85125325 100644 --- a/docs/data-sources/image_v2.md +++ b/docs/data-sources/image_v2.md @@ -125,7 +125,7 @@ data "stackit_image_v2" "filter_distro_version" { Optional: -- `distro` (String) Filter images by operating system distribution. For example: `ubuntu`, `ubuntu-arm64`, `debian`, `rhel`, etc. +- `distro` (String) Filter images by operating system distribution. For example: `ubuntu`, `debian`, `rhel`, etc. - `os` (String) Filter images by operating system type, such as `linux` or `windows`. - `secure_boot` (Boolean) Filter images with Secure Boot support. Set to `true` to match images that support Secure Boot. - `uefi` (Boolean) Filter images based on UEFI support. Set to `true` to match images that support UEFI. diff --git a/docs/data-sources/network.md b/docs/data-sources/network.md index 8b736b6e1..0b9bebd26 100644 --- a/docs/data-sources/network.md +++ b/docs/data-sources/network.md @@ -36,12 +36,12 @@ data "stackit_network" "example" { - `dhcp` (Boolean) Shows if DHCP is enabled for the network. - `id` (String) Terraform's internal resource ID. It is structured as "`project_id`,`network_id`". - `ipv4_gateway` (String) The IPv4 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway. -- `ipv4_nameservers` (List of String) The IPv4 nameservers of the network. +- `ipv4_nameservers` (Set of String) The IPv4 nameservers of the network. - `ipv4_prefix` (String, Deprecated) The IPv4 prefix of the network (CIDR). - `ipv4_prefix_length` (Number) The IPv4 prefix length of the network. - `ipv4_prefixes` (List of String) The IPv4 prefixes of the network. - `ipv6_gateway` (String) The IPv6 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway. -- `ipv6_nameservers` (List of String) The IPv6 nameservers of the network. +- `ipv6_nameservers` (Set of String) The IPv6 nameservers of the network. - `ipv6_prefix` (String, Deprecated) The IPv6 prefix of the network (CIDR). - `ipv6_prefix_length` (Number) The IPv6 prefix length of the network. - `ipv6_prefixes` (List of String) The IPv6 prefixes of the network. diff --git a/docs/resources/network.md b/docs/resources/network.md index f48a2f5e6..2c3e2a789 100644 --- a/docs/resources/network.md +++ b/docs/resources/network.md @@ -66,11 +66,11 @@ import { - `dhcp` (Boolean) If the network has DHCP enabled. Default value is `true`. - `ipv4_gateway` (String) The IPv4 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway. -- `ipv4_nameservers` (List of String) The IPv4 nameservers of the network. If not specified on creation, it will be set with the default nameservers from the network area. If not specified on update, it will remain unchanged. +- `ipv4_nameservers` (Set of String) The IPv4 nameservers of the network. If not specified on creation, it will be set with the default nameservers from the network area. If not specified on update, it will remain unchanged. - `ipv4_prefix` (String) The IPv4 prefix of the network (CIDR). - `ipv4_prefix_length` (Number) The IPv4 prefix length of the network. - `ipv6_gateway` (String) The IPv6 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway. -- `ipv6_nameservers` (List of String) The IPv6 nameservers of the network. +- `ipv6_nameservers` (Set of String) The IPv6 nameservers of the network. - `ipv6_prefix` (String) The IPv6 prefix of the network (CIDR). - `ipv6_prefix_length` (Number) The IPv6 prefix length of the network. - `labels` (Map of String) Labels are key-value string pairs which can be attached to a resource container diff --git a/stackit/internal/services/iaas/iaas_acc_test.go b/stackit/internal/services/iaas/iaas_acc_test.go index d6d68a2d4..8e1d0f55f 100644 --- a/stackit/internal/services/iaas/iaas_acc_test.go +++ b/stackit/internal/services/iaas/iaas_acc_test.go @@ -15,6 +15,8 @@ import ( "github.com/hashicorp/terraform-plugin-testing/plancheck" "github.com/stackitcloud/stackit-sdk-go/services/iaas/v2api/wait" + resourcemanager "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api" + resourcemanager_wait "github.com/stackitcloud/stackit-sdk-go/services/resourcemanager/v0api/wait" "github.com/hashicorp/terraform-plugin-testing/config" "github.com/hashicorp/terraform-plugin-testing/helper/acctest" @@ -118,11 +120,13 @@ const ( // SERVER - MIN var testConfigServerVarsMin = config.Variables{ - "project_id": config.StringVariable(testutil.ProjectId), - "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), - "network_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), - "machine_type": config.StringVariable("t1.1"), - "image_id": config.StringVariable("fb5b3fa8-5e20-478a-929a-2b7da1676b18"), + "server_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "network_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "machine_type": config.StringVariable("t1.1"), + "image_id": config.StringVariable("fb5b3fa8-5e20-478a-929a-2b7da1676b18"), + "name": config.StringVariable(fmt.Sprintf("tfe2e-project-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "owner_email": config.StringVariable(testutil.TestProjectServiceAccountEmail), + "parent_container_id": config.StringVariable(testutil.TestProjectParentContainerID), } var testConfigServerVarsMinUpdated = func() config.Variables { @@ -136,8 +140,9 @@ var testConfigServerVarsMinUpdated = func() config.Variables { // SERVER - MAX var testConfigServerVarsMax = config.Variables{ - "project_id": config.StringVariable(testutil.ProjectId), - "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "network_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "server_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "project_name": config.StringVariable(fmt.Sprintf("tfe2e-project-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), "name_not_updated": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), "machine_type": config.StringVariable("t1.1"), "image_id": config.StringVariable("fb5b3fa8-5e20-478a-929a-2b7da1676b18"), @@ -150,12 +155,14 @@ var testConfigServerVarsMax = config.Variables{ "public_key": config.StringVariable(keypairPublicKey), "desired_status": config.StringVariable("active"), "agent_policy": config.StringVariable("ALWAYS"), + "owner_email": config.StringVariable(testutil.TestProjectServiceAccountEmail), + "parent_container_id": config.StringVariable(testutil.TestProjectParentContainerID), } var testConfigServerVarsMaxUpdated = func() config.Variables { updatedConfig := config.Variables{} maps.Copy(updatedConfig, testConfigServerVarsMax) - updatedConfig["name"] = config.StringVariable(testutil.ProjectId) + updatedConfig["server_name"] = config.StringVariable(fmt.Sprintf("tf-acc-%s-updated", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))) updatedConfig["machine_type"] = config.StringVariable("t1.2") updatedConfig["label"] = config.StringVariable("updated") updatedConfig["desired_status"] = config.StringVariable("inactive") @@ -166,7 +173,7 @@ var testConfigServerVarsMaxUpdated = func() config.Variables { var testConfigServerVarsMaxUpdatedDesiredStatus = func() config.Variables { updatedConfig := config.Variables{} maps.Copy(updatedConfig, testConfigServerVarsMaxUpdated) - updatedConfig["name"] = config.StringVariable(testutil.ProjectId) + updatedConfig["server_name"] = config.StringVariable(fmt.Sprintf("tf-acc-%s-updated", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))) updatedConfig["machine_type"] = config.StringVariable("t1.2") updatedConfig["label"] = config.StringVariable("updated") updatedConfig["desired_status"] = config.StringVariable("deallocated") @@ -184,21 +191,25 @@ var testConfigAffinityGroupVarsMin = config.Variables{ // NETWORK INTERFACE - MIN var testConfigNetworkInterfaceVarsMin = config.Variables{ - "project_id": config.StringVariable(testutil.ProjectId), - "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), - "ipv4_prefix": config.StringVariable("10.2.10.0/24"), + "name": config.StringVariable(fmt.Sprintf("tfe2e-project-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "network_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "ipv4_prefix": config.StringVariable("10.2.10.0/24"), + "owner_email": config.StringVariable(testutil.TestProjectServiceAccountEmail), + "parent_container_id": config.StringVariable(testutil.TestProjectParentContainerID), } // NETWORK INTERFACE - MAX var testConfigNetworkInterfaceVarsMax = config.Variables{ - "project_id": config.StringVariable(testutil.ProjectId), - "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), - "allowed_address": config.StringVariable("10.2.10.0/24"), - "ipv4": config.StringVariable("10.2.10.20"), - "ipv4_prefix": config.StringVariable("10.2.10.0/24"), - "security": config.BoolVariable(true), - "label": config.StringVariable("label"), + "name": config.StringVariable(fmt.Sprintf("tfe2e-project-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "network_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "allowed_address": config.StringVariable("10.2.10.0/24"), + "ipv4": config.StringVariable("10.2.10.20"), + "ipv4_prefix": config.StringVariable("10.2.10.0/24"), + "security": config.BoolVariable(true), + "label": config.StringVariable("label"), + "owner_email": config.StringVariable(testutil.TestProjectServiceAccountEmail), + "parent_container_id": config.StringVariable(testutil.TestProjectParentContainerID), } var testConfigNetworkInterfaceVarsMaxUpdated = func() config.Variables { @@ -2188,7 +2199,7 @@ func TestAccVolumeMax(t *testing.T) { } func TestAccServerMin(t *testing.T) { - t.Logf("TestAccServerMin name: %s", testutil.ConvertConfigVariable(testConfigServerVarsMin["name"])) + t.Logf("TestAccServerMin name: %s", testutil.ConvertConfigVariable(testConfigServerVarsMin["server_name"])) resource.ParallelTest(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, CheckDestroy: testAccCheckDestroy, @@ -2199,8 +2210,8 @@ func TestAccServerMin(t *testing.T) { Config: fmt.Sprintf("%s\n%s", testutil.NewConfigBuilder().BuildProviderConfig(), resourceServerMinConfig), Check: resource.ComposeAggregateTestCheckFunc( // Server - resource.TestCheckResourceAttr("stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMin["project_id"])), - resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMin["name"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "project_id"), + resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMin["server_name"])), resource.TestCheckResourceAttr("stackit_server.server", "machine_type", testutil.ConvertConfigVariable(testConfigServerVarsMin["machine_type"])), resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.%"), resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_type", "image"), @@ -2244,8 +2255,8 @@ func TestAccServerMin(t *testing.T) { ), Check: resource.ComposeAggregateTestCheckFunc( // Server - resource.TestCheckResourceAttr("data.stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMin["project_id"])), - resource.TestCheckResourceAttr("data.stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMin["name"])), + resource.TestCheckResourceAttrSet("data.stackit_server.server", "project_id"), + resource.TestCheckResourceAttr("data.stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMin["server_name"])), resource.TestCheckResourceAttr("data.stackit_server.server", "machine_type", testutil.ConvertConfigVariable(testConfigServerVarsMin["machine_type"])), resource.TestCheckResourceAttrSet("data.stackit_server.server", "boot_volume.%"), // boot_volume.attributes are unknown in the datasource. only boot_volume.id and boot_volume.delete_on_termination are returned from the api @@ -2289,11 +2300,15 @@ func TestAccServerMin(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_server.server") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } serverId, ok := r.Primary.Attributes["server_id"] if !ok { return "", fmt.Errorf("couldn't find attribute server_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, serverId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, serverId), nil }, ImportState: true, ImportStateVerify: true, @@ -2305,8 +2320,8 @@ func TestAccServerMin(t *testing.T) { Config: fmt.Sprintf("%s\n%s", testutil.NewConfigBuilder().BuildProviderConfig(), resourceServerMinConfig), Check: resource.ComposeAggregateTestCheckFunc( // Server - resource.TestCheckResourceAttr("stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMinUpdated["project_id"])), - resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMinUpdated["name"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "project_id"), + resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMinUpdated["server_name"])), resource.TestCheckResourceAttr("stackit_server.server", "machine_type", testutil.ConvertConfigVariable(testConfigServerVarsMinUpdated["machine_type"])), resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.%"), resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_type", "image"), @@ -2340,7 +2355,7 @@ func TestAccServerMin(t *testing.T) { } func TestAccServerMax(t *testing.T) { - t.Logf("TestAccServerMax name: %s", testutil.ConvertConfigVariable(testConfigServerVarsMax["name"])) + t.Logf("TestAccServerMax server name: %s", testutil.ConvertConfigVariable(testConfigServerVarsMax["server_name"])) resource.Test(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, CheckDestroy: testAccCheckDestroy, @@ -2351,7 +2366,7 @@ func TestAccServerMax(t *testing.T) { Config: fmt.Sprintf("%s\n%s\n%s", testutil.NewConfigBuilder().BuildProviderConfig(), resourceServerMaxConfig, resourceServerMaxAttachmentConfig), Check: resource.ComposeAggregateTestCheckFunc( // Affinity group - resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_affinity_group.affinity_group", "project_id"), resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["name_not_updated"])), resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "policy", testutil.ConvertConfigVariable(testConfigServerVarsMax["policy"])), resource.TestCheckResourceAttrSet("stackit_affinity_group.affinity_group", "affinity_group_id"), @@ -2361,7 +2376,7 @@ func TestAccServerMax(t *testing.T) { resource.TestCheckResourceAttr("stackit_server.server", "agent.provisioned", "true"), // Volume base - resource.TestCheckResourceAttr("stackit_volume.base_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.base_volume", "project_id"), resource.TestCheckResourceAttr("stackit_volume.base_volume", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMax["availability_zone"])), resource.TestCheckResourceAttr("stackit_volume.base_volume", "size", testutil.ConvertConfigVariable(testConfigServerVarsMax["size"])), resource.TestCheckResourceAttr("stackit_volume.base_volume", "source.id", testutil.ConvertConfigVariable(testConfigServerVarsMax["image_id"])), @@ -2373,13 +2388,13 @@ func TestAccServerMax(t *testing.T) { ), // Volume data - resource.TestCheckResourceAttr("stackit_volume.data_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.data_volume", "project_id"), resource.TestCheckResourceAttr("stackit_volume.data_volume", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMax["availability_zone"])), resource.TestCheckResourceAttr("stackit_volume.data_volume", "size", testutil.ConvertConfigVariable(testConfigServerVarsMax["size"])), resource.TestCheckResourceAttrSet("stackit_volume.data_volume", "volume_id"), // Volume data attach - resource.TestCheckResourceAttr("stackit_server_volume_attach.data_volume_attachment", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_server_volume_attach.data_volume_attachment", "project_id"), resource.TestCheckResourceAttrSet("stackit_server_volume_attach.data_volume_attachment", "server_id"), resource.TestCheckResourceAttrPair( "stackit_server_volume_attach.data_volume_attachment", "server_id", @@ -2392,9 +2407,9 @@ func TestAccServerMax(t *testing.T) { ), // Network - resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_network.network", "project_id"), resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["name"])), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["network_name"])), // Network interface init resource.TestCheckResourceAttrPair( @@ -2419,7 +2434,7 @@ func TestAccServerMax(t *testing.T) { resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_second", "network_interface_id"), // Network interface attachment - resource.TestCheckResourceAttr("stackit_server_network_interface_attach.network_interface_second_attachment", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_server_network_interface_attach.network_interface_second_attachment", "project_id"), resource.TestCheckResourceAttrPair( "stackit_server_network_interface_attach.network_interface_second_attachment", "network_interface_id", "stackit_network_interface.network_interface_second", "network_interface_id", @@ -2448,9 +2463,9 @@ func TestAccServerMax(t *testing.T) { ), // Server - resource.TestCheckResourceAttr("stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "project_id"), resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), - resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["name"])), + resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["server_name"])), resource.TestCheckResourceAttr("stackit_server.server", "machine_type", testutil.ConvertConfigVariable(testConfigServerVarsMax["machine_type"])), resource.TestCheckResourceAttr("stackit_server.server", "desired_status", testutil.ConvertConfigVariable(testConfigServerVarsMax["desired_status"])), resource.TestCheckResourceAttrPair( @@ -2495,9 +2510,9 @@ func TestAccServerMax(t *testing.T) { ), Check: resource.ComposeAggregateTestCheckFunc( // Server - resource.TestCheckResourceAttr("data.stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_server.server", "project_id"), resource.TestCheckResourceAttrSet("data.stackit_server.server", "server_id"), - resource.TestCheckResourceAttr("data.stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["name"])), + resource.TestCheckResourceAttr("data.stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["server_name"])), resource.TestCheckResourceAttr("data.stackit_server.server", "machine_type", testutil.ConvertConfigVariable(testConfigServerVarsMax["machine_type"])), resource.TestCheckResourceAttrPair( "data.stackit_server.server", "affinity_group", @@ -2535,11 +2550,15 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_affinity_group.affinity_group") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } affinityGroupId, ok := r.Primary.Attributes["affinity_group_id"] if !ok { return "", fmt.Errorf("couldn't find attribute affinity_group_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, affinityGroupId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, affinityGroupId), nil }, ImportState: true, ImportStateVerify: true, @@ -2552,11 +2571,15 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_volume.base_volume") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } volumeId, ok := r.Primary.Attributes["volume_id"] if !ok { return "", fmt.Errorf("couldn't find attribute volume_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, volumeId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, volumeId), nil }, ImportState: true, ImportStateVerify: true, @@ -2569,11 +2592,15 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_volume.data_volume") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } volumeId, ok := r.Primary.Attributes["volume_id"] if !ok { return "", fmt.Errorf("couldn't find attribute volume_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, volumeId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, volumeId), nil }, ImportState: true, ImportStateVerify: true, @@ -2586,6 +2613,10 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_server_volume_attach.data_volume_attachment") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } serverId, ok := r.Primary.Attributes["server_id"] if !ok { return "", fmt.Errorf("couldn't find attribute server_id") @@ -2594,7 +2625,7 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find attribute volume_id") } - return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, serverId, volumeId), nil + return fmt.Sprintf("%s,%s,%s,%s", projectId, testutil.Region, serverId, volumeId), nil }, ImportState: true, ImportStateVerify: false, @@ -2607,11 +2638,15 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_network.network") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } networkId, ok := r.Primary.Attributes["network_id"] if !ok { return "", fmt.Errorf("couldn't find attribute network_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, networkId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, networkId), nil }, ImportState: true, ImportStateVerify: true, @@ -2625,6 +2660,10 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface_init") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } networkId, ok := r.Primary.Attributes["network_id"] if !ok { return "", fmt.Errorf("couldn't find attribute network_id") @@ -2633,7 +2672,7 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find attribute network_interface_id") } - return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, networkId, networkInterfaceId), nil + return fmt.Sprintf("%s,%s,%s,%s", projectId, testutil.Region, networkId, networkInterfaceId), nil }, ImportState: true, ImportStateVerify: true, @@ -2646,6 +2685,10 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface_second") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } networkId, ok := r.Primary.Attributes["network_id"] if !ok { return "", fmt.Errorf("couldn't find attribute network_id") @@ -2654,7 +2697,7 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find attribute network_interface_id") } - return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, networkId, networkInterfaceId), nil + return fmt.Sprintf("%s,%s,%s,%s", projectId, testutil.Region, networkId, networkInterfaceId), nil }, ImportState: true, ImportStateVerify: true, @@ -2667,6 +2710,10 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_server_network_interface_attach.network_interface_second_attachment") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } serverId, ok := r.Primary.Attributes["server_id"] if !ok { return "", fmt.Errorf("couldn't find attribute network_id") @@ -2675,7 +2722,7 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find attribute network_interface_id") } - return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, serverId, networkInterfaceId), nil + return fmt.Sprintf("%s,%s,%s,%s", projectId, testutil.Region, serverId, networkInterfaceId), nil }, ImportState: true, ImportStateVerify: false, @@ -2705,6 +2752,10 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_server_service_account_attach.attached_service_account") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } serverId, ok := r.Primary.Attributes["server_id"] if !ok { return "", fmt.Errorf("couldn't find attribute server_id") @@ -2713,7 +2764,7 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find attribute volume_id") } - return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, serverId, serviceAccountEmail), nil + return fmt.Sprintf("%s,%s,%s,%s", projectId, testutil.Region, serverId, serviceAccountEmail), nil }, ImportState: true, ImportStateVerify: false, @@ -2726,11 +2777,15 @@ func TestAccServerMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_server.server") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } serverId, ok := r.Primary.Attributes["server_id"] if !ok { return "", fmt.Errorf("couldn't find attribute server_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, serverId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, serverId), nil }, ImportState: true, ImportStateVerify: true, @@ -2742,7 +2797,7 @@ func TestAccServerMax(t *testing.T) { Config: fmt.Sprintf("%s\n%s", testutil.NewConfigBuilder().BuildProviderConfig(), resourceServerMaxConfig), Check: resource.ComposeAggregateTestCheckFunc( // Affinity group - resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_affinity_group.affinity_group", "project_id"), resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["name_not_updated"])), resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "policy", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["policy"])), resource.TestCheckResourceAttrSet("stackit_affinity_group.affinity_group", "affinity_group_id"), @@ -2752,7 +2807,7 @@ func TestAccServerMax(t *testing.T) { resource.TestCheckResourceAttr("stackit_server.server", "agent.provisioned", "false"), // Volume base - resource.TestCheckResourceAttr("stackit_volume.base_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.base_volume", "project_id"), resource.TestCheckResourceAttr("stackit_volume.base_volume", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["availability_zone"])), resource.TestCheckResourceAttr("stackit_volume.base_volume", "size", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["size"])), resource.TestCheckResourceAttr("stackit_volume.base_volume", "source.id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["image_id"])), @@ -2764,15 +2819,15 @@ func TestAccServerMax(t *testing.T) { ), // Volume data - resource.TestCheckResourceAttr("stackit_volume.data_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.data_volume", "project_id"), resource.TestCheckResourceAttr("stackit_volume.data_volume", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["availability_zone"])), resource.TestCheckResourceAttr("stackit_volume.data_volume", "size", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["size"])), resource.TestCheckResourceAttrSet("stackit_volume.data_volume", "volume_id"), // Network - resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_network.network", "project_id"), resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["name"])), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["network_name"])), // Network interface init resource.TestCheckResourceAttrPair( @@ -2815,9 +2870,9 @@ func TestAccServerMax(t *testing.T) { ), // Server - resource.TestCheckResourceAttr("stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "project_id"), resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), - resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["name"])), + resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["server_name"])), resource.TestCheckResourceAttr("stackit_server.server", "machine_type", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["machine_type"])), resource.TestCheckResourceAttr("stackit_server.server", "desired_status", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["desired_status"])), resource.TestCheckResourceAttrPair( @@ -2851,7 +2906,7 @@ func TestAccServerMax(t *testing.T) { Config: fmt.Sprintf("%s\n%s", testutil.NewConfigBuilder().BuildProviderConfig(), resourceServerMaxConfig), Check: resource.ComposeAggregateTestCheckFunc( // Affinity group - resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["project_id"])), + resource.TestCheckResourceAttrSet("stackit_affinity_group.affinity_group", "project_id"), resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["name_not_updated"])), resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "policy", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["policy"])), resource.TestCheckResourceAttrSet("stackit_affinity_group.affinity_group", "affinity_group_id"), @@ -2861,7 +2916,7 @@ func TestAccServerMax(t *testing.T) { resource.TestCheckResourceAttr("stackit_server.server", "agent.provisioned", "false"), // Volume base - resource.TestCheckResourceAttr("stackit_volume.base_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.base_volume", "project_id"), resource.TestCheckResourceAttr("stackit_volume.base_volume", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["availability_zone"])), resource.TestCheckResourceAttr("stackit_volume.base_volume", "size", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["size"])), resource.TestCheckResourceAttr("stackit_volume.base_volume", "source.id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["image_id"])), @@ -2873,15 +2928,15 @@ func TestAccServerMax(t *testing.T) { ), // Volume data - resource.TestCheckResourceAttr("stackit_volume.data_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.data_volume", "project_id"), resource.TestCheckResourceAttr("stackit_volume.data_volume", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["availability_zone"])), resource.TestCheckResourceAttr("stackit_volume.data_volume", "size", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["size"])), resource.TestCheckResourceAttrSet("stackit_volume.data_volume", "volume_id"), // Network - resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["project_id"])), + resource.TestCheckResourceAttrSet("stackit_network.network", "project_id"), resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["name"])), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["network_name"])), // Network interface init resource.TestCheckResourceAttrPair( @@ -2924,9 +2979,9 @@ func TestAccServerMax(t *testing.T) { ), // Server - resource.TestCheckResourceAttr("stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["project_id"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "project_id"), resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), - resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["name"])), + resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["server_name"])), resource.TestCheckResourceAttr("stackit_server.server", "machine_type", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["machine_type"])), resource.TestCheckResourceAttr("stackit_server.server", "desired_status", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["desired_status"])), resource.TestCheckResourceAttrPair( @@ -3522,7 +3577,7 @@ func TestAccIaaSSecurityGroupMax(t *testing.T) { } func TestAccNetworkInterfaceMin(t *testing.T) { - t.Logf("TestAccNetworkInterfaceMin name: %s", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["name"])) + t.Logf("TestAccNetworkInterfaceMin name: %s", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["network_name"])) resource.ParallelTest(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, CheckDestroy: testAccCheckDestroy, @@ -3534,7 +3589,7 @@ func TestAccNetworkInterfaceMin(t *testing.T) { Check: resource.ComposeAggregateTestCheckFunc( // Network interface instance resource.TestCheckNoResourceAttr("stackit_network_interface.network_interface", "name"), - resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["project_id"])), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "project_id"), resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "ipv4"), resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "allowed_addresses.#"), resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "security", "true"), @@ -3550,14 +3605,14 @@ func TestAccNetworkInterfaceMin(t *testing.T) { // Network instance resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["project_id"])), - resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["name"])), + resource.TestCheckResourceAttrSet("stackit_network.network", "project_id"), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["network_name"])), resource.TestCheckResourceAttrSet("stackit_network.network", "ipv4_prefixes.#"), resource.TestCheckNoResourceAttr("stackit_network.network", "ipv6_prefixes.#"), resource.TestCheckResourceAttrSet("stackit_network.network", "public_ip"), // Public ip - resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["project_id"])), + resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "project_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "public_ip_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "ip"), resource.TestCheckNoResourceAttr("stackit_public_ip.public_ip", "network_interface_id"), @@ -3603,14 +3658,14 @@ func TestAccNetworkInterfaceMin(t *testing.T) { // Network instance resource.TestCheckResourceAttrSet("data.stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("data.stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["project_id"])), - resource.TestCheckResourceAttr("data.stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["name"])), + resource.TestCheckResourceAttrSet("data.stackit_network.network", "project_id"), + resource.TestCheckResourceAttr("data.stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["network_name"])), resource.TestCheckResourceAttrSet("data.stackit_network.network", "ipv4_prefixes.#"), resource.TestCheckNoResourceAttr("data.stackit_network.network", "ipv6_prefixes.#"), resource.TestCheckResourceAttrSet("data.stackit_network.network", "public_ip"), // Public ip - resource.TestCheckResourceAttr("data.stackit_public_ip.public_ip", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_public_ip.public_ip", "project_id"), resource.TestCheckResourceAttrPair( "data.stackit_public_ip.public_ip", "public_ip_id", "stackit_public_ip.public_ip", "public_ip_id", @@ -3633,6 +3688,10 @@ func TestAccNetworkInterfaceMin(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } networkId, ok := r.Primary.Attributes["network_id"] if !ok { return "", fmt.Errorf("couldn't find attribute network_id") @@ -3641,7 +3700,7 @@ func TestAccNetworkInterfaceMin(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find attribute network_interface_id") } - return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, networkId, networkInterfaceId), nil + return fmt.Sprintf("%s,%s,%s,%s", projectId, testutil.Region, networkId, networkInterfaceId), nil }, ImportState: true, ImportStateVerify: true, @@ -3654,11 +3713,15 @@ func TestAccNetworkInterfaceMin(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_network.network") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } networkId, ok := r.Primary.Attributes["network_id"] if !ok { return "", fmt.Errorf("couldn't find attribute network_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, networkId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, networkId), nil }, ImportState: true, ImportStateVerify: true, @@ -3671,11 +3734,15 @@ func TestAccNetworkInterfaceMin(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_public_ip.public_ip") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } publicIpId, ok := r.Primary.Attributes["public_ip_id"] if !ok { return "", fmt.Errorf("couldn't find attribute public_ip_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, publicIpId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, publicIpId), nil }, ImportState: true, ImportStateVerify: true, @@ -3687,7 +3754,7 @@ func TestAccNetworkInterfaceMin(t *testing.T) { } func TestAccNetworkInterfaceMax(t *testing.T) { - t.Logf("TestAccNetworkInterfaceMax name: %s", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["name"])) + t.Logf("TestAccNetworkInterfaceMax name: %s", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["network_name"])) resource.ParallelTest(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, CheckDestroy: testAccCheckDestroy, @@ -3698,8 +3765,8 @@ func TestAccNetworkInterfaceMax(t *testing.T) { Config: fmt.Sprintf("%s\n%s", testutil.NewConfigBuilder().BuildProviderConfig(), resourceNetworkInterfaceMaxConfig), Check: resource.ComposeAggregateTestCheckFunc( // Network interface instance - resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), - resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["name"])), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "project_id"), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["network_name"])), resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "ipv4", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["ipv4"])), resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "allowed_addresses.#", "1"), resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "allowed_addresses.0", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["allowed_address"])), @@ -3721,14 +3788,14 @@ func TestAccNetworkInterfaceMax(t *testing.T) { // Network instance resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), - resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["name"])), + resource.TestCheckResourceAttrSet("stackit_network.network", "project_id"), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["network_name"])), resource.TestCheckResourceAttrSet("stackit_network.network", "ipv4_prefixes.#"), resource.TestCheckNoResourceAttr("stackit_network.network", "ipv6_prefixes.#"), resource.TestCheckResourceAttrSet("stackit_network.network", "public_ip"), // Public ip - resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "project_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "public_ip_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "ip"), resource.TestCheckResourceAttrPair( @@ -3739,7 +3806,7 @@ func TestAccNetworkInterfaceMax(t *testing.T) { resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["label"])), // Network interface simple - resource.TestCheckResourceAttr("stackit_network_interface.network_interface_simple", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_simple", "project_id"), resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_simple", "network_interface_id"), resource.TestCheckResourceAttrPair( "stackit_network_interface.network_interface_simple", "network_id", @@ -3747,14 +3814,14 @@ func TestAccNetworkInterfaceMax(t *testing.T) { ), // Public ip simple - resource.TestCheckResourceAttr("stackit_public_ip.public_ip_simple", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip_simple", "project_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip_simple", "public_ip_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip_simple", "ip"), resource.TestCheckNoResourceAttr("stackit_public_ip.public_ip_simple", "network_interface_id"), resource.TestCheckResourceAttr("stackit_public_ip.public_ip_simple", "labels.%", "0"), // Nic and public ip attach - resource.TestCheckResourceAttr("stackit_public_ip_associate.nic_public_ip_attach", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_public_ip_associate.nic_public_ip_attach", "project_id"), resource.TestCheckResourceAttrPair( "stackit_public_ip_associate.nic_public_ip_attach", "public_ip_id", "stackit_public_ip.public_ip_simple", "public_ip_id", @@ -3803,7 +3870,7 @@ func TestAccNetworkInterfaceMax(t *testing.T) { ), Check: resource.ComposeAggregateTestCheckFunc( // Network interface instance - resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface", "project_id"), resource.TestCheckResourceAttrPair( "data.stackit_network_interface.network_interface", "project_id", "stackit_network_interface.network_interface", "project_id", @@ -3812,7 +3879,7 @@ func TestAccNetworkInterfaceMax(t *testing.T) { "data.stackit_network_interface.network_interface", "network_interface_id", "stackit_network_interface.network_interface", "network_interface_id", ), - resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["name"])), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["network_name"])), resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "ipv4", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["ipv4"])), resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "allowed_addresses.#", "1"), resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "allowed_addresses.0", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["allowed_address"])), @@ -3830,14 +3897,14 @@ func TestAccNetworkInterfaceMax(t *testing.T) { // Network instance resource.TestCheckResourceAttrSet("data.stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("data.stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), - resource.TestCheckResourceAttr("data.stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["name"])), + resource.TestCheckResourceAttrSet("data.stackit_network.network", "project_id"), + resource.TestCheckResourceAttr("data.stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["network_name"])), resource.TestCheckResourceAttrSet("data.stackit_network.network", "ipv4_prefixes.#"), resource.TestCheckNoResourceAttr("data.stackit_network.network", "ipv6_prefixes.#"), resource.TestCheckResourceAttrSet("data.stackit_network.network", "public_ip"), // Public ip - resource.TestCheckResourceAttr("data.stackit_public_ip.public_ip", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_public_ip.public_ip", "project_id"), resource.TestCheckResourceAttrPair( "data.stackit_public_ip.public_ip", "public_ip_id", "stackit_public_ip.public_ip", "public_ip_id", @@ -3865,7 +3932,7 @@ func TestAccNetworkInterfaceMax(t *testing.T) { resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface_simple", "type"), // Public ip simple - resource.TestCheckResourceAttr("data.stackit_public_ip.public_ip_simple", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_public_ip.public_ip_simple", "project_id"), resource.TestCheckResourceAttrPair( "data.stackit_public_ip.public_ip_simple", "public_ip_id", "stackit_public_ip.public_ip_simple", "public_ip_id", @@ -3890,6 +3957,10 @@ func TestAccNetworkInterfaceMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } networkId, ok := r.Primary.Attributes["network_id"] if !ok { return "", fmt.Errorf("couldn't find attribute network_id") @@ -3898,7 +3969,7 @@ func TestAccNetworkInterfaceMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find attribute network_interface_id") } - return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, networkId, networkInterfaceId), nil + return fmt.Sprintf("%s,%s,%s,%s", projectId, testutil.Region, networkId, networkInterfaceId), nil }, ImportState: true, ImportStateVerify: true, @@ -3911,11 +3982,15 @@ func TestAccNetworkInterfaceMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_network.network") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } networkId, ok := r.Primary.Attributes["network_id"] if !ok { return "", fmt.Errorf("couldn't find attribute network_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, networkId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, networkId), nil }, ImportState: true, ImportStateVerify: true, @@ -3928,11 +4003,15 @@ func TestAccNetworkInterfaceMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_public_ip.public_ip") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } publicIpId, ok := r.Primary.Attributes["public_ip_id"] if !ok { return "", fmt.Errorf("couldn't find attribute public_ip_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, publicIpId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, publicIpId), nil }, ImportState: true, ImportStateVerify: true, @@ -3945,6 +4024,10 @@ func TestAccNetworkInterfaceMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface_simple") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } networkId, ok := r.Primary.Attributes["network_id"] if !ok { return "", fmt.Errorf("couldn't find attribute network_id") @@ -3953,7 +4036,7 @@ func TestAccNetworkInterfaceMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find attribute network_interface_id") } - return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, networkId, networkInterfaceId), nil + return fmt.Sprintf("%s,%s,%s,%s", projectId, testutil.Region, networkId, networkInterfaceId), nil }, ImportState: true, ImportStateVerify: true, @@ -3966,11 +4049,15 @@ func TestAccNetworkInterfaceMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_public_ip.public_ip_simple") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } publicIpId, ok := r.Primary.Attributes["public_ip_id"] if !ok { return "", fmt.Errorf("couldn't find attribute public_ip_id") } - return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, testutil.Region, publicIpId), nil + return fmt.Sprintf("%s,%s,%s", projectId, testutil.Region, publicIpId), nil }, ImportState: true, ImportStateVerify: true, @@ -3983,6 +4070,10 @@ func TestAccNetworkInterfaceMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find resource stackit_public_ip.public_ip") } + projectId, ok := r.Primary.Attributes["project_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute project_id") + } publicIpId, ok := r.Primary.Attributes["public_ip_id"] if !ok { return "", fmt.Errorf("couldn't find attribute public_ip_id") @@ -3991,11 +4082,11 @@ func TestAccNetworkInterfaceMax(t *testing.T) { if !ok { return "", fmt.Errorf("couldn't find attribute network_interface_id") } - return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, publicIpId, networkInterfaceId), nil + return fmt.Sprintf("%s,%s,%s,%s", projectId, testutil.Region, publicIpId, networkInterfaceId), nil }, ImportState: true, Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_public_ip_associate.nic_public_ip_attach", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_public_ip_associate.nic_public_ip_attach", "project_id"), resource.TestCheckResourceAttrPair( "stackit_public_ip_associate.nic_public_ip_attach", "public_ip_id", "stackit_public_ip.public_ip_simple", "public_ip_id", @@ -4012,8 +4103,8 @@ func TestAccNetworkInterfaceMax(t *testing.T) { Config: fmt.Sprintf("%s\n%s", testutil.NewConfigBuilder().BuildProviderConfig(), resourceNetworkInterfaceMaxConfig), Check: resource.ComposeAggregateTestCheckFunc( // Network interface instance - resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["project_id"])), - resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["name"])), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "project_id"), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["network_name"])), resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "ipv4", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["ipv4"])), resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "allowed_addresses.#", "0"), resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "security", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["security"])), @@ -4026,14 +4117,14 @@ func TestAccNetworkInterfaceMax(t *testing.T) { // Network instance resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["project_id"])), - resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["name"])), + resource.TestCheckResourceAttrSet("stackit_network.network", "project_id"), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["network_name"])), resource.TestCheckResourceAttrSet("stackit_network.network", "ipv4_prefixes.#"), resource.TestCheckNoResourceAttr("stackit_network.network", "ipv6_prefixes.#"), resource.TestCheckResourceAttrSet("stackit_network.network", "public_ip"), // Public ip - resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "project_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "public_ip_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "ip"), resource.TestCheckResourceAttrPair( @@ -4044,7 +4135,7 @@ func TestAccNetworkInterfaceMax(t *testing.T) { resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["label"])), // Network interface simple - resource.TestCheckResourceAttr("stackit_network_interface.network_interface_simple", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_simple", "project_id"), resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_simple", "network_interface_id"), resource.TestCheckResourceAttrPair( "stackit_network_interface.network_interface_simple", "network_id", @@ -4052,7 +4143,7 @@ func TestAccNetworkInterfaceMax(t *testing.T) { ), // Public ip simple - resource.TestCheckResourceAttr("stackit_public_ip.public_ip_simple", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip_simple", "project_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip_simple", "public_ip_id"), resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip_simple", "ip"), // The network gets re-created, which triggers a re-create of the 'network_interface_simple' NIC, which leads the 'stackit_public_ip_associate' resource to update the @@ -4062,7 +4153,7 @@ func TestAccNetworkInterfaceMax(t *testing.T) { resource.TestCheckResourceAttr("stackit_public_ip.public_ip_simple", "labels.%", "0"), // Nic and public ip attach - resource.TestCheckResourceAttr("stackit_public_ip_associate.nic_public_ip_attach", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_public_ip_associate.nic_public_ip_attach", "project_id"), resource.TestCheckResourceAttrPair( "stackit_public_ip_associate.nic_public_ip_attach", "public_ip_id", "stackit_public_ip.public_ip_simple", "public_ip_id", @@ -4529,36 +4620,36 @@ func TestAccImageDatasourceSearchVariants(t *testing.T) { resource.TestCheckResourceAttrSet("data.stackit_image_v2.name_windows_2022_standard", "checksum.algorithm"), resource.TestCheckResourceAttrSet("data.stackit_image_v2.name_windows_2022_standard", "checksum.digest"), - resource.TestCheckResourceAttr("data.stackit_image_v2.ubuntu_arm64_latest", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMax["project_id"])), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_latest", "image_id"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_latest", "name"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_latest", "min_disk_size"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_latest", "min_ram"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_latest", "protected"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_latest", "scope"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_latest", "checksum.algorithm"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_latest", "checksum.digest"), - - resource.TestCheckResourceAttr("data.stackit_image_v2.ubuntu_arm64_oldest", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMax["project_id"])), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_oldest", "image_id"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_oldest", "name"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_oldest", "min_disk_size"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_oldest", "min_ram"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_oldest", "protected"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_oldest", "scope"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_oldest", "checksum.algorithm"), - resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_arm64_oldest", "checksum.digest"), + resource.TestCheckResourceAttr("data.stackit_image_v2.ubuntu_latest", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_latest", "image_id"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_latest", "name"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_latest", "min_disk_size"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_latest", "min_ram"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_latest", "protected"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_latest", "scope"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_latest", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_latest", "checksum.digest"), + + resource.TestCheckResourceAttr("data.stackit_image_v2.ubuntu_oldest", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_oldest", "image_id"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_oldest", "name"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_oldest", "min_disk_size"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_oldest", "min_ram"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_oldest", "protected"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_oldest", "scope"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_oldest", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("data.stackit_image_v2.ubuntu_oldest", "checksum.digest"), // e2e test that ascending sort is working func(s *terraform.State) error { - latest := s.RootModule().Resources["data.stackit_image_v2.ubuntu_arm64_latest"] - oldest := s.RootModule().Resources["data.stackit_image_v2.ubuntu_arm64_oldest"] + latest := s.RootModule().Resources["data.stackit_image_v2.ubuntu_latest"] + oldest := s.RootModule().Resources["data.stackit_image_v2.ubuntu_oldest"] if latest == nil { - return fmt.Errorf("datasource 'data.stackit_image_v2.ubuntu_arm64_latest' not found") + return fmt.Errorf("datasource 'data.stackit_image_v2.ubuntu_latest' not found") } if oldest == nil { - return fmt.Errorf("datasource 'data.stackit_image_v2.ubuntu_arm64_oldest' not found") + return fmt.Errorf("datasource 'data.stackit_image_v2.ubuntu_oldest' not found") } nameLatest := latest.Primary.Attributes["name"] @@ -5453,6 +5544,7 @@ func testAccCheckDestroy(s *terraform.State) error { testAccCheckNetworkAreaDestroy, testAccCheckRoutingTableDestroy, testAccCheckRoutingTableRouteDestroy, + testAccCheckResourceManagerProjectsDestroy, } var errs []error @@ -5491,7 +5583,7 @@ func testAccCheckNetworkDestroy(s *terraform.State) error { if err != nil { var oapiErr *oapierror.GenericOpenAPIError if errors.As(err, &oapiErr) { - if oapiErr.StatusCode == http.StatusNotFound { + if oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusForbidden { continue } } @@ -5520,16 +5612,14 @@ func testAccCheckNetworkInterfaceDestroy(s *terraform.State) error { continue } ids := strings.Split(rs.Primary.ID, core.Separator) + projectId := ids[0] region := ids[1] networkId := ids[2] networkInterfaceId := ids[3] - err := client.DefaultAPI.DeleteNic(ctx, testutil.ProjectId, region, networkId, networkInterfaceId).Execute() + err := client.DefaultAPI.DeleteNic(ctx, projectId, region, networkId, networkInterfaceId).Execute() if err != nil { - var oapiErr *oapierror.GenericOpenAPIError - if errors.As(err, &oapiErr) { - if oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusBadRequest { - continue - } + if isIgnorableDestroyError(err) { + continue } errs = append(errs, fmt.Errorf("cannot trigger network interface deletion %q: %w", networkInterfaceId, err)) } @@ -5661,32 +5751,20 @@ func testAccCheckServerDestroy(s *terraform.State) error { // Servers + projectId := testutil.ProjectId // Default serversToDestroy := []string{} for _, rs := range s.RootModule().Resources { if rs.Type != "stackit_server" { continue } // server terraform ID: "[project_id],[region],[server_id]" + projectId = strings.Split(rs.Primary.ID, core.Separator)[0] serverId := strings.Split(rs.Primary.ID, core.Separator)[2] serversToDestroy = append(serversToDestroy, serverId) } - serversResp, err := client.DefaultAPI.ListServers(ctx, testutil.ProjectId, testutil.Region).Execute() - if err != nil { - return fmt.Errorf("getting serversResp: %w", err) - } - - servers := serversResp.Items - for i := range servers { - if servers[i].Id == nil { - continue - } - if utils.Contains(serversToDestroy, *servers[i].Id) { - err := client.DefaultAPI.DeleteServer(ctx, testutil.ProjectId, testutil.Region, *servers[i].Id).Execute() - if err != nil { - return fmt.Errorf("destroying server %s during CheckDestroy: %w", *servers[i].Id, err) - } - } + if err := cleanUpServers(ctx, client, projectId, serversToDestroy); err != nil { + return err } // Networks @@ -5697,28 +5775,68 @@ func testAccCheckServerDestroy(s *terraform.State) error { continue } // network terraform ID: "[project_id],[network_id]" + projectId = strings.Split(rs.Primary.ID, core.Separator)[0] networkId := strings.Split(rs.Primary.ID, core.Separator)[1] networksToDestroy = append(networksToDestroy, networkId) } - networksResp, err := client.DefaultAPI.ListNetworks(ctx, testutil.ProjectId, testutil.Region).Execute() + if err := cleanUpNetworks(ctx, client, projectId, networksToDestroy); err != nil { + return err + } + + return nil +} + +func cleanUpServers(ctx context.Context, client *iaas.APIClient, projectId string, toDestroy []string) error { + serversResp, err := client.DefaultAPI.ListServers(ctx, projectId, testutil.Region).Execute() if err != nil { - return fmt.Errorf("getting networksResp: %w", err) + if isIgnorableDestroyError(err) { + return nil // project or resource is already gone, nothing to do + } + return fmt.Errorf("getting serversResp: %w", err) } - networks := networksResp.Items - for i := range networks { - if utils.Contains(networksToDestroy, networks[i].Id) { - err := client.DefaultAPI.DeleteNetwork(ctx, testutil.ProjectId, testutil.Region, networks[i].Id).Execute() - if err != nil { - return fmt.Errorf("destroying network %s during CheckDestroy: %w", networks[i].Id, err) + for _, server := range serversResp.Items { + if server.Id != nil && utils.Contains(toDestroy, *server.Id) { + err := client.DefaultAPI.DeleteServer(ctx, projectId, testutil.Region, *server.Id).Execute() + if err != nil && !isIgnorableDestroyError(err) { + return fmt.Errorf("destroying server %s during CheckDestroy: %w", *server.Id, err) } } } + return nil +} + +func cleanUpNetworks(ctx context.Context, client *iaas.APIClient, projectId string, toDestroy []string) error { + networksResp, err := client.DefaultAPI.ListNetworks(ctx, projectId, testutil.Region).Execute() + if err != nil { + if isIgnorableDestroyError(err) { + return nil // project or resource is already gone, nothing to do + } + return fmt.Errorf("getting networksResp: %w", err) + } + for _, network := range networksResp.Items { + if utils.Contains(toDestroy, network.Id) { + err := client.DefaultAPI.DeleteNetwork(ctx, projectId, testutil.Region, network.Id).Execute() + if err != nil && !isIgnorableDestroyError(err) { + return fmt.Errorf("destroying network %s during CheckDestroy: %w", network.Id, err) + } + } + } return nil } +func isIgnorableDestroyError(err error) bool { + var oapiErr *oapierror.GenericOpenAPIError + if errors.As(err, &oapiErr) { + return oapiErr.StatusCode == http.StatusForbidden || + oapiErr.StatusCode == http.StatusNotFound || + oapiErr.StatusCode == http.StatusBadRequest + } + return false +} + func testAccCheckAffinityGroupDestroy(s *terraform.State) error { ctx := context.Background() client, err := iaas.NewAPIClient(testutil.NewConfigBuilder().BuildClientOptions(testutil.IaaSCustomEndpoint, false)...) @@ -5966,3 +6084,57 @@ func testAccCheckRoutingTableRouteDestroy(s *terraform.State) error { return errors.Join(errs...) } + +func testAccCheckResourceManagerProjectsDestroy(s *terraform.State) error { + ctx := context.Background() + client, err := resourcemanager.NewAPIClient(testutil.NewConfigBuilder().BuildClientOptions(testutil.ResourceManagerCustomEndpoint, false)...) + if err != nil { + return fmt.Errorf("creating client: %w", err) + } + + projectsToDestroy := []string{} + for _, rs := range s.RootModule().Resources { + if rs.Type != "stackit_resourcemanager_project" { + continue + } + // project terraform ID: "[container_id]" + containerId := rs.Primary.ID + projectsToDestroy = append(projectsToDestroy, containerId) + } + + var containerParentId string + switch { + case testutil.TestProjectParentContainerID != "": + containerParentId = testutil.TestProjectParentContainerID + case testutil.TestProjectParentUUID != "": + containerParentId = testutil.TestProjectParentUUID + default: + return fmt.Errorf("either TestProjectParentContainerID or TestProjectParentUUID must be set") + } + + projectsResp, err := client.DefaultAPI.ListProjects(ctx).ContainerParentId(containerParentId).Execute() + if err != nil { + return fmt.Errorf("getting projectsResp: %w", err) + } + + items := projectsResp.Items + for i := range items { + if items[i].LifecycleState == resourcemanager.LIFECYCLESTATE_DELETING { + continue + } + if !utils.Contains(projectsToDestroy, items[i].ContainerId) { + continue + } + + err := client.DefaultAPI.DeleteProject(ctx, items[i].ContainerId).Execute() + if err != nil { + return fmt.Errorf("destroying project %s during CheckDestroy: %w", items[i].ContainerId, err) + } + + _, err = resourcemanager_wait.DeleteProjectWaitHandler(ctx, client.DefaultAPI, items[i].ContainerId).WaitWithContext(ctx) + if err != nil { + return fmt.Errorf("destroying project %s during CheckDestroy: waiting for deletion %w", items[i].ContainerId, err) + } + } + return nil +} diff --git a/stackit/internal/services/iaas/imagev2/datasource.go b/stackit/internal/services/iaas/imagev2/datasource.go index 60b65ca8a..1ea0b0d06 100644 --- a/stackit/internal/services/iaas/imagev2/datasource.go +++ b/stackit/internal/services/iaas/imagev2/datasource.go @@ -239,7 +239,7 @@ func (d *imageDataV2Source) Schema(_ context.Context, _ datasource.SchemaRequest }, "distro": schema.StringAttribute{ Optional: true, - Description: "Filter images by operating system distribution. For example: `ubuntu`, `ubuntu-arm64`, `debian`, `rhel`, etc.", + Description: "Filter images by operating system distribution. For example: `ubuntu`, `debian`, `rhel`, etc.", }, "version": schema.StringAttribute{ Optional: true, diff --git a/stackit/internal/services/iaas/network/datasource.go b/stackit/internal/services/iaas/network/datasource.go index d5766dc5b..dd84d581d 100644 --- a/stackit/internal/services/iaas/network/datasource.go +++ b/stackit/internal/services/iaas/network/datasource.go @@ -33,12 +33,12 @@ type DataSourceModel struct { NetworkId types.String `tfsdk:"network_id"` Name types.String `tfsdk:"name"` IPv4Gateway types.String `tfsdk:"ipv4_gateway"` - IPv4Nameservers types.List `tfsdk:"ipv4_nameservers"` + IPv4Nameservers types.Set `tfsdk:"ipv4_nameservers"` IPv4Prefix types.String `tfsdk:"ipv4_prefix"` IPv4PrefixLength types.Int64 `tfsdk:"ipv4_prefix_length"` IPv4Prefixes types.List `tfsdk:"ipv4_prefixes"` IPv6Gateway types.String `tfsdk:"ipv6_gateway"` - IPv6Nameservers types.List `tfsdk:"ipv6_nameservers"` + IPv6Nameservers types.Set `tfsdk:"ipv6_nameservers"` IPv6Prefix types.String `tfsdk:"ipv6_prefix"` IPv6PrefixLength types.Int64 `tfsdk:"ipv6_prefix_length"` IPv6Prefixes types.List `tfsdk:"ipv6_prefixes"` @@ -118,7 +118,7 @@ func (d *networkDataSource) Schema(_ context.Context, _ datasource.SchemaRequest Description: "The IPv4 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway.", Computed: true, }, - "ipv4_nameservers": schema.ListAttribute{ + "ipv4_nameservers": schema.SetAttribute{ Description: "The IPv4 nameservers of the network.", Computed: true, ElementType: types.StringType, @@ -141,7 +141,7 @@ func (d *networkDataSource) Schema(_ context.Context, _ datasource.SchemaRequest Description: "The IPv6 gateway of a network. If not specified, the first IP of the network will be assigned as the gateway.", Computed: true, }, - "ipv6_nameservers": schema.ListAttribute{ + "ipv6_nameservers": schema.SetAttribute{ Description: "The IPv6 nameservers of the network.", Computed: true, ElementType: types.StringType, @@ -267,17 +267,17 @@ func mapDataSourceFields(ctx context.Context, networkResp *iaas.Network, model * // IPv4 if networkResp.Ipv4 == nil || networkResp.Ipv4.Nameservers == nil { - model.IPv4Nameservers = types.ListNull(types.StringType) + model.IPv4Nameservers = types.SetNull(types.StringType) } else { respNameservers := networkResp.Ipv4.Nameservers - modelIPv4Nameservers, err := utils.ListValueToStringSlice(model.IPv4Nameservers) + modelIPv4Nameservers, err := utils.SetValueToStringSlice(model.IPv4Nameservers) if err != nil { return fmt.Errorf("get current IPv4 network nameservers from model: %w", err) } reconciledIPv4Nameservers := utils.ReconcileStringSlices(modelIPv4Nameservers, respNameservers) - ipv4NameserversTF, diags := types.ListValueFrom(ctx, types.StringType, reconciledIPv4Nameservers) + ipv4NameserversTF, diags := types.SetValueFrom(ctx, types.StringType, reconciledIPv4Nameservers) if diags.HasError() { return fmt.Errorf("map IPv4 network nameservers: %w", core.DiagsToError(diags)) } @@ -323,17 +323,17 @@ func mapDataSourceFields(ctx context.Context, networkResp *iaas.Network, model * // IPv6 if networkResp.Ipv6 == nil || networkResp.Ipv6.Nameservers == nil { - model.IPv6Nameservers = types.ListNull(types.StringType) + model.IPv6Nameservers = types.SetNull(types.StringType) } else { respIPv6Nameservers := networkResp.Ipv6.Nameservers - modelIPv6Nameservers, errIpv6 := utils.ListValueToStringSlice(model.IPv6Nameservers) + modelIPv6Nameservers, errIpv6 := utils.SetValueToStringSlice(model.IPv6Nameservers) if errIpv6 != nil { return fmt.Errorf("get current IPv6 network nameservers from model: %w", errIpv6) } reconciledIPv6Nameservers := utils.ReconcileStringSlices(modelIPv6Nameservers, respIPv6Nameservers) - ipv6NameserversTF, ipv6Diags := types.ListValueFrom(ctx, types.StringType, reconciledIPv6Nameservers) + ipv6NameserversTF, ipv6Diags := types.SetValueFrom(ctx, types.StringType, reconciledIPv6Nameservers) if ipv6Diags.HasError() { return fmt.Errorf("map IPv6 network nameservers: %w", core.DiagsToError(ipv6Diags)) } diff --git a/stackit/internal/services/iaas/network/datasource_test.go b/stackit/internal/services/iaas/network/datasource_test.go index fd4d75caf..e1d4fadff 100644 --- a/stackit/internal/services/iaas/network/datasource_test.go +++ b/stackit/internal/services/iaas/network/datasource_test.go @@ -42,12 +42,12 @@ func TestMapDataSourceFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue(""), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4PrefixLength: types.Int64Null(), IPv4Gateway: types.StringNull(), IPv4Prefix: types.StringNull(), IPv4Prefixes: types.ListNull(types.StringType), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv6PrefixLength: types.Int64Null(), IPv6Gateway: types.StringNull(), IPv6Prefix: types.StringNull(), @@ -103,7 +103,7 @@ func TestMapDataSourceFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue("name"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -113,7 +113,7 @@ func TestMapDataSourceFields(t *testing.T) { types.StringValue("192.168.42.0/24"), types.StringValue("10.100.10.0/16"), }), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -140,7 +140,7 @@ func TestMapDataSourceFields(t *testing.T) { DataSourceModel{ ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -161,9 +161,9 @@ func TestMapDataSourceFields(t *testing.T) { NetworkId: types.StringValue("nid"), Name: types.StringValue(""), IPv6Prefixes: types.ListNull(types.StringType), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv4Prefixes: types.ListNull(types.StringType), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns2"), types.StringValue("ns3"), }), @@ -177,7 +177,7 @@ func TestMapDataSourceFields(t *testing.T) { DataSourceModel{ ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -198,9 +198,9 @@ func TestMapDataSourceFields(t *testing.T) { NetworkId: types.StringValue("nid"), Name: types.StringValue(""), IPv6Prefixes: types.ListNull(types.StringType), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4Prefixes: types.ListNull(types.StringType), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns2"), types.StringValue("ns3"), }), @@ -230,11 +230,11 @@ func TestMapDataSourceFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue(""), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv6PrefixLength: types.Int64Null(), IPv6Prefixes: types.ListNull(types.StringType), Labels: types.MapNull(types.StringType), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4PrefixLength: types.Int64Value(16), IPv4Prefix: types.StringValue("10.100.20.0/16"), IPv4Prefixes: types.ListValueMust(types.StringType, []attr.Value{ @@ -270,11 +270,11 @@ func TestMapDataSourceFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue(""), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4PrefixLength: types.Int64Null(), IPv4Prefixes: types.ListNull(types.StringType), Labels: types.MapNull(types.StringType), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv6PrefixLength: types.Int64Value(64), IPv6Prefix: types.StringValue("fd12:3456:789a:3::/64"), IPv6Prefixes: types.ListValueMust(types.StringType, []attr.Value{ @@ -300,11 +300,11 @@ func TestMapDataSourceFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue(""), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4PrefixLength: types.Int64Null(), IPv4Gateway: types.StringNull(), IPv4Prefixes: types.ListNull(types.StringType), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv6PrefixLength: types.Int64Null(), IPv6Gateway: types.StringNull(), IPv6Prefixes: types.ListNull(types.StringType), diff --git a/stackit/internal/services/iaas/network/resource.go b/stackit/internal/services/iaas/network/resource.go index c5faebbdf..6779d4a98 100644 --- a/stackit/internal/services/iaas/network/resource.go +++ b/stackit/internal/services/iaas/network/resource.go @@ -57,12 +57,12 @@ type Model struct { NetworkId types.String `tfsdk:"network_id"` Name types.String `tfsdk:"name"` IPv4Gateway types.String `tfsdk:"ipv4_gateway"` - IPv4Nameservers types.List `tfsdk:"ipv4_nameservers"` + IPv4Nameservers types.Set `tfsdk:"ipv4_nameservers"` IPv4Prefix types.String `tfsdk:"ipv4_prefix"` IPv4PrefixLength types.Int64 `tfsdk:"ipv4_prefix_length"` IPv4Prefixes types.List `tfsdk:"ipv4_prefixes"` IPv6Gateway types.String `tfsdk:"ipv6_gateway"` - IPv6Nameservers types.List `tfsdk:"ipv6_nameservers"` + IPv6Nameservers types.Set `tfsdk:"ipv6_nameservers"` IPv6Prefix types.String `tfsdk:"ipv6_prefix"` IPv6PrefixLength types.Int64 `tfsdk:"ipv6_prefix_length"` IPv6Prefixes types.List `tfsdk:"ipv6_prefixes"` @@ -275,7 +275,7 @@ func (r *networkResource) Schema(_ context.Context, _ resource.SchemaRequest, re validate.IP(false), }, }, - "ipv4_nameservers": schema.ListAttribute{ + "ipv4_nameservers": schema.SetAttribute{ Description: "The IPv4 nameservers of the network. If not specified on creation, it will be set with the default nameservers from the network area. If not specified on update, it will remain unchanged.", Optional: true, Computed: true, @@ -323,7 +323,7 @@ func (r *networkResource) Schema(_ context.Context, _ resource.SchemaRequest, re validate.IP(false), }, }, - "ipv6_nameservers": schema.ListAttribute{ + "ipv6_nameservers": schema.SetAttribute{ Description: "The IPv6 nameservers of the network.", Optional: true, Computed: true, @@ -674,17 +674,17 @@ func mapFields(ctx context.Context, networkResp *iaas.Network, model *Model, reg // IPv4 if networkResp.Ipv4 == nil || networkResp.Ipv4.Nameservers == nil { - model.IPv4Nameservers = types.ListNull(types.StringType) + model.IPv4Nameservers = types.SetNull(types.StringType) } else { respNameservers := networkResp.Ipv4.Nameservers - modelIPv4Nameservers, err := utils.ListValueToStringSlice(model.IPv4Nameservers) + modelIPv4Nameservers, err := utils.SetValueToStringSlice(model.IPv4Nameservers) if err != nil { return fmt.Errorf("get current IPv4 network nameservers from model: %w", err) } reconciledIPv4Nameservers := utils.ReconcileStringSlices(modelIPv4Nameservers, respNameservers) - ipv4NameserversTF, diags := types.ListValueFrom(ctx, types.StringType, reconciledIPv4Nameservers) + ipv4NameserversTF, diags := types.SetValueFrom(ctx, types.StringType, reconciledIPv4Nameservers) if diags.HasError() { return fmt.Errorf("map IPv4 network nameservers: %w", core.DiagsToError(diags)) } @@ -732,17 +732,17 @@ func mapFields(ctx context.Context, networkResp *iaas.Network, model *Model, reg // IPv6 if networkResp.Ipv6 == nil || networkResp.Ipv6.Nameservers == nil { - model.IPv6Nameservers = types.ListNull(types.StringType) + model.IPv6Nameservers = types.SetNull(types.StringType) } else { respIPv6Nameservers := networkResp.Ipv6.Nameservers - modelIPv6Nameservers, errIpv6 := utils.ListValueToStringSlice(model.IPv6Nameservers) + modelIPv6Nameservers, errIpv6 := utils.SetValueToStringSlice(model.IPv6Nameservers) if errIpv6 != nil { return fmt.Errorf("get current IPv6 network nameservers from model: %w", errIpv6) } reconciledIPv6Nameservers := utils.ReconcileStringSlices(modelIPv6Nameservers, respIPv6Nameservers) - ipv6NameserversTF, ipv6Diags := types.ListValueFrom(ctx, types.StringType, reconciledIPv6Nameservers) + ipv6NameserversTF, ipv6Diags := types.SetValueFrom(ctx, types.StringType, reconciledIPv6Nameservers) if ipv6Diags.HasError() { return fmt.Errorf("map IPv6 network nameservers: %w", core.DiagsToError(ipv6Diags)) } diff --git a/stackit/internal/services/iaas/network/resource_test.go b/stackit/internal/services/iaas/network/resource_test.go index b710c9aa3..f063bed9b 100644 --- a/stackit/internal/services/iaas/network/resource_test.go +++ b/stackit/internal/services/iaas/network/resource_test.go @@ -39,12 +39,12 @@ func TestMapFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue(""), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4PrefixLength: types.Int64Null(), IPv4Gateway: types.StringNull(), IPv4Prefix: types.StringNull(), IPv4Prefixes: types.ListNull(types.StringType), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv6PrefixLength: types.Int64Null(), IPv6Gateway: types.StringNull(), IPv6Prefix: types.StringNull(), @@ -94,7 +94,7 @@ func TestMapFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue("name"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -104,7 +104,7 @@ func TestMapFields(t *testing.T) { types.StringValue("10.100.10.0/16"), }), IPv4Prefix: types.StringValue("192.168.42.0/24"), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -131,7 +131,7 @@ func TestMapFields(t *testing.T) { Model{ ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -152,9 +152,9 @@ func TestMapFields(t *testing.T) { NetworkId: types.StringValue("nid"), Name: types.StringValue(""), IPv6Prefixes: types.ListNull(types.StringType), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv4Prefixes: types.ListNull(types.StringType), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns2"), types.StringValue("ns3"), }), @@ -169,7 +169,7 @@ func TestMapFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue(""), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -190,9 +190,9 @@ func TestMapFields(t *testing.T) { NetworkId: types.StringValue("nid"), Name: types.StringValue(""), IPv6Prefixes: types.ListNull(types.StringType), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4Prefixes: types.ListNull(types.StringType), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns2"), types.StringValue("ns3"), }), @@ -222,11 +222,11 @@ func TestMapFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue(""), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv6PrefixLength: types.Int64Null(), IPv6Prefixes: types.ListNull(types.StringType), Labels: types.MapNull(types.StringType), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4PrefixLength: types.Int64Value(24), IPv4Prefix: types.StringValue("192.168.54.0/24"), IPv4Prefixes: types.ListValueMust(types.StringType, []attr.Value{ @@ -262,11 +262,11 @@ func TestMapFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue(""), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4PrefixLength: types.Int64Null(), IPv4Prefixes: types.ListNull(types.StringType), Labels: types.MapNull(types.StringType), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv6PrefixLength: types.Int64Value(64), IPv6Prefixes: types.ListValueMust(types.StringType, []attr.Value{ types.StringValue("fd12:3456:789a:1::/64"), @@ -292,11 +292,11 @@ func TestMapFields(t *testing.T) { ProjectId: types.StringValue("pid"), NetworkId: types.StringValue("nid"), Name: types.StringValue(""), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4PrefixLength: types.Int64Null(), IPv4Gateway: types.StringNull(), IPv4Prefixes: types.ListNull(types.StringType), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), IPv6PrefixLength: types.Int64Null(), IPv6Gateway: types.StringNull(), IPv6Prefixes: types.ListNull(types.StringType), @@ -346,7 +346,7 @@ func TestToCreatePayload(t *testing.T) { "default_ok", &Model{ Name: types.StringValue("name"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -382,7 +382,7 @@ func TestToCreatePayload(t *testing.T) { "ipv4_nameservers_okay", &Model{ Name: types.StringValue("name"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -416,7 +416,7 @@ func TestToCreatePayload(t *testing.T) { "ipv4_nameservers_null", &Model{ Name: types.StringValue("name"), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), Labels: types.MapValueMust(types.StringType, map[string]attr.Value{ "key": types.StringValue("value"), }), @@ -444,7 +444,7 @@ func TestToCreatePayload(t *testing.T) { "ipv4_nameservers_empty_slice", &Model{ Name: types.StringValue("name"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{}), + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{}), Labels: types.MapValueMust(types.StringType, map[string]attr.Value{ "key": types.StringValue("value"), }), @@ -472,7 +472,7 @@ func TestToCreatePayload(t *testing.T) { "ipv6_default_ok", &Model{ Name: types.StringValue("name"), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -506,7 +506,7 @@ func TestToCreatePayload(t *testing.T) { "ipv6_nameserver_null", &Model{ Name: types.StringValue("name"), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), Labels: types.MapValueMust(types.StringType, map[string]attr.Value{ "key": types.StringValue("value"), }), @@ -534,7 +534,7 @@ func TestToCreatePayload(t *testing.T) { "ipv6_nameserver_empty_list", &Model{ Name: types.StringValue("name"), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{}), + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{}), Labels: types.MapValueMust(types.StringType, map[string]attr.Value{ "key": types.StringValue("value"), }), @@ -590,7 +590,7 @@ func TestToUpdatePayload(t *testing.T) { "default_ok", &Model{ Name: types.StringValue("name"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -626,7 +626,7 @@ func TestToUpdatePayload(t *testing.T) { "ipv4_nameservers_okay", &Model{ Name: types.StringValue("name"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -660,7 +660,7 @@ func TestToUpdatePayload(t *testing.T) { "ipv4_gateway_nil", &Model{ Name: types.StringValue("name"), - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -692,7 +692,7 @@ func TestToUpdatePayload(t *testing.T) { "ipv4_nameservers_null", &Model{ Name: types.StringValue("name"), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), Labels: types.MapValueMust(types.StringType, map[string]attr.Value{ "key": types.StringValue("value"), }), @@ -716,7 +716,7 @@ func TestToUpdatePayload(t *testing.T) { "ipv4_nameservers_null_and_gateway_set", &Model{ Name: types.StringValue("name"), - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4Gateway: types.StringValue("gateway"), Labels: types.MapValueMust(types.StringType, map[string]attr.Value{ "key": types.StringValue("value"), @@ -743,7 +743,7 @@ func TestToUpdatePayload(t *testing.T) { "ipv6_default_ok", &Model{ Name: types.StringValue("name"), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -777,7 +777,7 @@ func TestToUpdatePayload(t *testing.T) { "ipv6_gateway_nil", &Model{ Name: types.StringValue("name"), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -809,7 +809,7 @@ func TestToUpdatePayload(t *testing.T) { "ipv6_nameserver_null", &Model{ Name: types.StringValue("name"), - IPv6Nameservers: types.ListNull(types.StringType), + IPv6Nameservers: types.SetNull(types.StringType), Labels: types.MapValueMust(types.StringType, map[string]attr.Value{ "key": types.StringValue("value"), }), @@ -837,7 +837,7 @@ func TestToUpdatePayload(t *testing.T) { "ipv6_nameserver_empty_list", &Model{ Name: types.StringValue("name"), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{}), + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{}), Labels: types.MapValueMust(types.StringType, map[string]attr.Value{ "key": types.StringValue("value"), }), @@ -890,7 +890,7 @@ func TestModelIsIPv4ConfigSet(t *testing.T) { { name: "no ipv4 field is set", model: Model{ - IPv4Nameservers: types.List{}, + IPv4Nameservers: types.Set{}, IPv4Gateway: types.String{}, NoIPv4Gateway: types.Bool{}, }, @@ -899,7 +899,7 @@ func TestModelIsIPv4ConfigSet(t *testing.T) { { name: "ipv4 fields are set to null", model: Model{ - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4Gateway: types.StringNull(), NoIPv4Gateway: types.BoolNull(), }, @@ -908,7 +908,7 @@ func TestModelIsIPv4ConfigSet(t *testing.T) { { name: "no ipv4 gateway is true", model: Model{ - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4Gateway: types.StringNull(), NoIPv4Gateway: types.BoolValue(true), }, @@ -917,7 +917,7 @@ func TestModelIsIPv4ConfigSet(t *testing.T) { { name: "ipv4 nameserver is set", model: Model{ - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("ns1"), types.StringValue("ns2"), }), @@ -929,7 +929,7 @@ func TestModelIsIPv4ConfigSet(t *testing.T) { { name: "ipv4 gateway is set", model: Model{ - IPv4Nameservers: types.ListNull(types.StringType), + IPv4Nameservers: types.SetNull(types.StringType), IPv4Gateway: types.StringValue("gateway"), NoIPv4Gateway: types.BoolNull(), }, @@ -1038,7 +1038,7 @@ func TestValidateConfig(t *testing.T) { { name: "error case: IPv4 active via nameservers but missing prefix and prefix_length", model: Model{ - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("1.1.1.1"), }), }, @@ -1047,7 +1047,7 @@ func TestValidateConfig(t *testing.T) { { name: "error case: IPv6 active via nameservers but missing prefix and prefix_length", model: Model{ - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{ + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{ types.StringValue("2606:4700:4700::1111"), }), }, @@ -1056,8 +1056,8 @@ func TestValidateConfig(t *testing.T) { { name: "error case: dual-stack failure (both active via nameservers, both missing prefixes)", model: Model{ - IPv4Nameservers: types.ListValueMust(types.StringType, []attr.Value{types.StringValue("8.8.8.8")}), - IPv6Nameservers: types.ListValueMust(types.StringType, []attr.Value{types.StringValue("2001:4860:4860::8888")}), + IPv4Nameservers: types.SetValueMust(types.StringType, []attr.Value{types.StringValue("8.8.8.8")}), + IPv6Nameservers: types.SetValueMust(types.StringType, []attr.Value{types.StringValue("2001:4860:4860::8888")}), }, wantErr: true, }, diff --git a/stackit/internal/services/iaas/testdata/datasource-image-v2-variants.tf b/stackit/internal/services/iaas/testdata/datasource-image-v2-variants.tf index a36deb551..b3e38859e 100644 --- a/stackit/internal/services/iaas/testdata/datasource-image-v2-variants.tf +++ b/stackit/internal/services/iaas/testdata/datasource-image-v2-variants.tf @@ -46,17 +46,17 @@ data "stackit_image_v2" "name_windows_2022_standard" { name = "Windows Server 2022 Standard" } -data "stackit_image_v2" "ubuntu_arm64_latest" { +data "stackit_image_v2" "ubuntu_latest" { project_id = var.project_id filter = { - distro = "ubuntu-arm64" + distro = "ubuntu" } } -data "stackit_image_v2" "ubuntu_arm64_oldest" { +data "stackit_image_v2" "ubuntu_oldest" { project_id = var.project_id filter = { - distro = "ubuntu-arm64" + distro = "ubuntu" } sort_ascending = true } \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-network-interface-max.tf b/stackit/internal/services/iaas/testdata/resource-network-interface-max.tf index f7b16f7d4..2f5076dea 100644 --- a/stackit/internal/services/iaas/testdata/resource-network-interface-max.tf +++ b/stackit/internal/services/iaas/testdata/resource-network-interface-max.tf @@ -1,21 +1,29 @@ -variable "project_id" {} +variable "parent_container_id" {} variable "name" {} variable "allowed_address" {} variable "ipv4" {} variable "ipv4_prefix" {} variable "security" {} variable "label" {} +variable "owner_email" {} +variable "network_name" {} + +resource "stackit_resourcemanager_project" "example" { + parent_container_id = var.parent_container_id + name = var.name + owner_email = var.owner_email +} resource "stackit_network" "network" { - project_id = var.project_id - name = var.name + project_id = stackit_resourcemanager_project.example.project_id + name = var.network_name ipv4_prefix = var.ipv4_prefix } resource "stackit_network_interface" "network_interface" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id network_id = stackit_network.network.network_id - name = var.name + name = var.network_name allowed_addresses = var.security ? [var.allowed_address] : null ipv4 = var.ipv4 security = var.security @@ -26,7 +34,7 @@ resource "stackit_network_interface" "network_interface" { } resource "stackit_public_ip" "public_ip" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id network_interface_id = stackit_network_interface.network_interface.network_interface_id labels = { "acc-test" : var.label @@ -34,21 +42,21 @@ resource "stackit_public_ip" "public_ip" { } resource "stackit_network_interface" "network_interface_simple" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id network_id = stackit_network.network.network_id } resource "stackit_public_ip" "public_ip_simple" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id } resource "stackit_public_ip_associate" "nic_public_ip_attach" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id network_interface_id = stackit_network_interface.network_interface_simple.network_interface_id public_ip_id = stackit_public_ip.public_ip_simple.public_ip_id } resource "stackit_security_group" "security_group" { - project_id = var.project_id - name = var.name + project_id = stackit_resourcemanager_project.example.project_id + name = var.network_name } \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-network-interface-min.tf b/stackit/internal/services/iaas/testdata/resource-network-interface-min.tf index 085395a93..dfbbb0113 100644 --- a/stackit/internal/services/iaas/testdata/resource-network-interface-min.tf +++ b/stackit/internal/services/iaas/testdata/resource-network-interface-min.tf @@ -1,18 +1,26 @@ -variable "project_id" {} +variable "parent_container_id" {} variable "name" {} +variable "owner_email" {} +variable "network_name" {} variable "ipv4_prefix" {} +resource "stackit_resourcemanager_project" "example" { + parent_container_id = var.parent_container_id + name = var.name + owner_email = var.owner_email +} + resource "stackit_network" "network" { - project_id = var.project_id - name = var.name + project_id = stackit_resourcemanager_project.example.project_id + name = var.network_name ipv4_prefix = var.ipv4_prefix } resource "stackit_network_interface" "network_interface" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id network_id = stackit_network.network.network_id } resource "stackit_public_ip" "public_ip" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id } \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-server-max-server-attachments.tf b/stackit/internal/services/iaas/testdata/resource-server-max-server-attachments.tf index d9902e95c..d06b4782d 100644 --- a/stackit/internal/services/iaas/testdata/resource-server-max-server-attachments.tf +++ b/stackit/internal/services/iaas/testdata/resource-server-max-server-attachments.tf @@ -1,11 +1,11 @@ resource "stackit_server_volume_attach" "data_volume_attachment" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id server_id = stackit_server.server.server_id volume_id = stackit_volume.data_volume.volume_id } resource "stackit_server_network_interface_attach" "network_interface_second_attachment" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id network_interface_id = stackit_network_interface.network_interface_second.network_interface_id server_id = stackit_server.server.server_id } diff --git a/stackit/internal/services/iaas/testdata/resource-server-max.tf b/stackit/internal/services/iaas/testdata/resource-server-max.tf index d741342a1..1f75135fa 100644 --- a/stackit/internal/services/iaas/testdata/resource-server-max.tf +++ b/stackit/internal/services/iaas/testdata/resource-server-max.tf @@ -1,5 +1,5 @@ -variable "project_id" {} -variable "name" {} +variable "server_name" {} +variable "network_name" {} variable "name_not_updated" {} variable "machine_type" {} variable "image_id" {} @@ -14,14 +14,24 @@ variable "public_key" {} variable "service_account_mail" {} variable "agent_policy" {} +variable "parent_container_id" {} +variable "project_name" {} +variable "owner_email" {} + +resource "stackit_resourcemanager_project" "example" { + parent_container_id = var.parent_container_id + name = var.project_name + owner_email = var.owner_email +} + resource "stackit_affinity_group" "affinity_group" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id name = var.name_not_updated policy = var.policy } resource "stackit_volume" "base_volume" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id availability_zone = var.availability_zone size = var.size source = { @@ -31,24 +41,24 @@ resource "stackit_volume" "base_volume" { } resource "stackit_volume" "data_volume" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id availability_zone = var.availability_zone size = var.size } resource "stackit_network" "network" { - project_id = var.project_id - name = var.name + project_id = stackit_resourcemanager_project.example.project_id + name = var.network_name } resource "stackit_network_interface" "network_interface_init" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id network_id = stackit_network.network.network_id } resource "stackit_network_interface" "network_interface_second" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id network_id = stackit_network.network.network_id } @@ -58,14 +68,14 @@ resource "stackit_key_pair" "key_pair" { } resource "stackit_server_service_account_attach" "attached_service_account" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id server_id = stackit_server.server.server_id service_account_email = var.service_account_mail } resource "stackit_server" "server" { - project_id = var.project_id - name = var.name + project_id = stackit_resourcemanager_project.example.project_id + name = var.server_name machine_type = var.machine_type affinity_group = stackit_affinity_group.affinity_group.affinity_group_id availability_zone = var.availability_zone diff --git a/stackit/internal/services/iaas/testdata/resource-server-min.tf b/stackit/internal/services/iaas/testdata/resource-server-min.tf index 6f3ba8947..2474f7f62 100644 --- a/stackit/internal/services/iaas/testdata/resource-server-min.tf +++ b/stackit/internal/services/iaas/testdata/resource-server-min.tf @@ -1,22 +1,30 @@ -variable "project_id" {} -variable "name" {} +variable "server_name" {} variable "network_name" {} variable "machine_type" {} variable "image_id" {} +variable "parent_container_id" {} +variable "name" {} +variable "owner_email" {} + +resource "stackit_resourcemanager_project" "example" { + parent_container_id = var.parent_container_id + name = var.name + owner_email = var.owner_email +} resource "stackit_network" "network" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id name = var.network_name } resource "stackit_network_interface" "nic" { - project_id = var.project_id + project_id = stackit_resourcemanager_project.example.project_id network_id = stackit_network.network.network_id } resource "stackit_server" "server" { - project_id = var.project_id - name = var.name + project_id = stackit_resourcemanager_project.example.project_id + name = var.server_name machine_type = var.machine_type boot_volume = { source_type = "image" diff --git a/stackit/internal/utils/utils.go b/stackit/internal/utils/utils.go index b81600a64..57e7f0d1a 100644 --- a/stackit/internal/utils/utils.go +++ b/stackit/internal/utils/utils.go @@ -73,6 +73,19 @@ func ReconcileStringSlices(list1, list2 []string) []string { return list1Copy } +func SetValueToStringSlice(set basetypes.SetValue) ([]string, error) { + result := []string{} + for _, el := range set.Elements() { + elStr, ok := el.(types.String) + if !ok { + return nil, fmt.Errorf("expected element to be of type %T, got %T", types.String{}, el) + } + result = append(result, elStr.ValueString()) + } + + return result, nil +} + func ListValueToStringSlice(list basetypes.ListValue) ([]string, error) { result := []string{} for _, el := range list.Elements() { diff --git a/stackit/internal/utils/utils_test.go b/stackit/internal/utils/utils_test.go index d70a1eaea..2d9592300 100644 --- a/stackit/internal/utils/utils_test.go +++ b/stackit/internal/utils/utils_test.go @@ -133,6 +133,57 @@ func TestListValuetoStrSlice(t *testing.T) { } } +func TestSetValueToStrSlice(t *testing.T) { + tests := []struct { + description string + input basetypes.SetValue + expected []string + isValid bool + }{ + { + description: "empty set", + input: types.SetValueMust(types.StringType, []attr.Value{}), + expected: []string{}, + isValid: true, + }, + { + description: "values ok", + input: types.SetValueMust(types.StringType, []attr.Value{ + types.StringValue("a"), + types.StringValue("b"), + types.StringValue("c"), + }), + expected: []string{"a", "b", "c"}, + isValid: true, + }, + { + description: "different type", + input: types.SetValueMust(types.Int64Type, []attr.Value{ + types.Int64Value(12), + }), + isValid: false, + }, + } + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + output, err := SetValueToStringSlice(tt.input) + if err != nil { + if !tt.isValid { + return + } + t.Fatalf("Should not have failed: %v", err) + } + if !tt.isValid { + t.Fatalf("Should have failed") + } + diff := cmp.Diff(output, tt.expected) + if diff != "" { + t.Fatalf("Data does not match: %s", diff) + } + }) + } +} + func TestConvertPointerSliceToStringSlice(t *testing.T) { tests := []struct { description string