From c7c64a5806eaa2512de465ed773a5d25b1fc4210 Mon Sep 17 00:00:00 2001 From: Marcel Jacek <72880145+marceljk@users.noreply.github.com> Date: Fri, 9 May 2025 08:49:04 +0200 Subject: [PATCH] feat(iaas): min/max acc tests (#811) * feat(iaas): security group min/max acc test * feat(iaas): image min/max acc test * feat(iaas): KeyPair min/max acc test * feat(iaas): Network area min/max acc test - fix: wrong atLeast-validator for `minimum_prefix_length` * feat(iaas): Network min/max acc test * feat(iaas): Volume min/max acc test - fix: volume update doesn't work if no name was defined - fix: volume.server_id can not be set - fix: error message volume.size returns value but was null * feat(iaas): Network interfaces min/max acc test * feat(iaas): Affinity groups acc test * feat(iaas): Server min/max acc test - stackit_server_volume_attach - stackit_server_network_interface_attach - stackit_server_service_account_attach * fix(iaas): acc test - image: fix read of Config.VirtioScsi - keypair: add missing RequiresReplace() for name - server: add missing UserData read in datasource and resource * feat(iaas): public ip acc test - fix: when a nic is assigned to a public ip, the field network_interface_id leads to recreation --- docs/resources/volume.md | 2 +- .../internal/services/iaas/iaas_acc_test.go | 3963 +++++++++++++---- .../services/iaas/image/datasource.go | 2 +- .../internal/services/iaas/image/resource.go | 2 +- .../services/iaas/keypair/resource.go | 1 + .../services/iaas/networkarea/resource.go | 2 +- .../services/iaas/publicip/resource.go | 1 + .../services/iaas/server/datasource.go | 4 + .../internal/services/iaas/server/resource.go | 4 + .../testdata/resource-affinity-group-min.tf | 9 + .../iaas/testdata/resource-image-max.tf | 48 + .../iaas/testdata/resource-image-min.tf | 11 + .../iaas/testdata/resource-key-pair-max.tf | 11 + .../iaas/testdata/resource-key-pair-min.tf | 7 + .../testdata/resource-network-area-max.tf | 41 + .../testdata/resource-network-area-min.tf | 26 + .../resource-network-interface-max.tf | 54 + .../resource-network-interface-min.tf | 16 + .../iaas/testdata/resource-network-max.tf | 22 + .../iaas/testdata/resource-network-min.tf | 7 + .../testdata/resource-security-group-max.tf | 72 + .../testdata/resource-security-group-min.tf | 15 + .../resource-server-max-server-attachments.tf | 11 + .../iaas/testdata/resource-server-max.tf | 82 + .../iaas/testdata/resource-server-min.tf | 17 + .../iaas/testdata/resource-volume-max.tf | 35 + .../iaas/testdata/resource-volume-min.tf | 18 + .../internal/services/iaas/volume/resource.go | 6 +- 28 files changed, 3494 insertions(+), 995 deletions(-) create mode 100644 stackit/internal/services/iaas/testdata/resource-affinity-group-min.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-image-max.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-image-min.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-key-pair-max.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-key-pair-min.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-network-area-max.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-network-area-min.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-network-interface-max.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-network-interface-min.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-network-max.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-network-min.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-security-group-max.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-security-group-min.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-server-max-server-attachments.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-server-max.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-server-min.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-volume-max.tf create mode 100644 stackit/internal/services/iaas/testdata/resource-volume-min.tf diff --git a/docs/resources/volume.md b/docs/resources/volume.md index 46456198..d3de9cc8 100644 --- a/docs/resources/volume.md +++ b/docs/resources/volume.md @@ -38,13 +38,13 @@ resource "stackit_volume" "example" { - `labels` (Map of String) Labels are key-value string pairs which can be attached to a resource container - `name` (String) The name of the volume. - `performance_class` (String) The performance class of the volume. Possible values are documented in [Service plans BlockStorage](https://docs.stackit.cloud/stackit/en/service-plans-blockstorage-75137974.html#ServiceplansBlockStorage-CurrentlyavailableServicePlans%28performanceclasses%29) -- `server_id` (String) The server ID of the server to which the volume is attached to. - `size` (Number) The size of the volume in GB. It can only be updated to a larger value than the current size. Either `size` or `source` must be provided - `source` (Attributes) The source of the volume. It can be either a volume, an image, a snapshot or a backup. Either `size` or `source` must be provided (see [below for nested schema](#nestedatt--source)) ### Read-Only - `id` (String) Terraform's internal resource ID. It is structured as "`project_id`,`volume_id`". +- `server_id` (String) The server ID of the server to which the volume is attached to. - `volume_id` (String) The volume ID. diff --git a/stackit/internal/services/iaas/iaas_acc_test.go b/stackit/internal/services/iaas/iaas_acc_test.go index c6f5b8a9..574c6e82 100644 --- a/stackit/internal/services/iaas/iaas_acc_test.go +++ b/stackit/internal/services/iaas/iaas_acc_test.go @@ -2,18 +2,21 @@ package iaas_test import ( "context" + _ "embed" "errors" "fmt" "net/http" "os" "path/filepath" "strings" + "sync" "testing" + "github.com/hashicorp/terraform-plugin-testing/config" "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" "github.com/hashicorp/terraform-plugin-testing/terraform" - "github.com/stackitcloud/stackit-sdk-go/core/config" + stackitSdkConfig "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" "github.com/stackitcloud/stackit-sdk-go/core/utils" "github.com/stackitcloud/stackit-sdk-go/services/iaas" @@ -22,10 +25,64 @@ import ( "github.com/stackitcloud/terraform-provider-stackit/stackit/internal/testutil" ) +var ( + //go:embed testdata/resource-security-group-min.tf + resourceSecurityGroupMinConfig string + + //go:embed testdata/resource-security-group-max.tf + resourceSecurityGroupMaxConfig string + + //go:embed testdata/resource-image-min.tf + resourceImageMinConfig string + + //go:embed testdata/resource-image-max.tf + resourceImageMaxConfig string + + //go:embed testdata/resource-key-pair-min.tf + resourceKeyPairMinConfig string + + //go:embed testdata/resource-key-pair-max.tf + resourceKeyPairMaxConfig string + + //go:embed testdata/resource-network-area-min.tf + resourceNetworkAreaMinConfig string + + //go:embed testdata/resource-network-area-max.tf + resourceNetworkAreaMaxConfig string + + //go:embed testdata/resource-network-min.tf + resourceNetworkMinConfig string + + //go:embed testdata/resource-network-max.tf + resourceNetworkMaxConfig string + + //go:embed testdata/resource-network-interface-min.tf + resourceNetworkInterfaceMinConfig string + + //go:embed testdata/resource-network-interface-max.tf + resourceNetworkInterfaceMaxConfig string + + //go:embed testdata/resource-volume-min.tf + resourceVolumeMinConfig string + + //go:embed testdata/resource-volume-max.tf + resourceVolumeMaxConfig string + + //go:embed testdata/resource-affinity-group-min.tf + resourceAffinityGroupMinConfig string + + //go:embed testdata/resource-server-min.tf + resourceServerMinConfig string + + //go:embed testdata/resource-server-max.tf + resourceServerMaxConfig string + + //go:embed testdata/resource-server-max-server-attachments.tf + resourceServerMaxAttachmentConfig string +) + const ( - serverMachineType = "t1.1" - updatedServerMachineType = "t1.2" - nicAttachTfName = "second_network_interface" + keypairPublicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIDsPd27M449akqCtdFg2+AmRVJz6eWio0oMP9dVg7XZ" ) // Network resource data @@ -41,476 +98,498 @@ var networkResource = map[string]string{ "name_updated": fmt.Sprintf("acc-test-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum)), } -var networkAreaResource = map[string]string{ - "organization_id": testutil.OrganizationId, - "name": fmt.Sprintf("acc-test-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum)), - "networkrange0": "10.0.0.0/16", - "transfer_network": "10.1.2.0/24", +var testConfigServerVarsMin = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "machine_type": config.StringVariable("t1.1"), + "image_id": config.StringVariable("a2c127b2-b1b5-4aee-986f-41cd11b41279"), } -var networkAreaRouteResource = map[string]string{ - "organization_id": networkAreaResource["organization_id"], - "network_area_id": networkAreaResource["network_area_id"], - "prefix": "1.1.1.0/24", - "next_hop": "1.1.1.1", - "label1": "value1", - "label1-updated": "value1-updated", +var testConfigServerVarsMinUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigServerVarsMin { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(testutil.ProjectId) + updatedConfig["machine_type"] = config.StringVariable("t1.2") + return updatedConfig +}() + +var testConfigServerVarsMax = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%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("a2c127b2-b1b5-4aee-986f-41cd11b41279"), + "availability_zone": config.StringVariable("eu01-1"), + "label": config.StringVariable("label"), + "user_data": config.StringVariable("#!/bin/bash"), + "policy": config.StringVariable("soft-affinity"), + "size": config.IntegerVariable(16), + "service_account_mail": config.StringVariable(testutil.TestProjectServiceAccountEmail), + "public_key": config.StringVariable(keypairPublicKey), + "desired_status": config.StringVariable("active"), } -var networkInterfaceResource = map[string]string{ - "project_id": testutil.ProjectId, - "network_id": networkResource["network_id"], - "name": "name", - "tfName": "network_interface", +var testConfigServerVarsMaxUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigServerVarsMax { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(testutil.ProjectId) + updatedConfig["machine_type"] = config.StringVariable("t1.2") + updatedConfig["label"] = config.StringVariable("updated") + updatedConfig["desired_status"] = config.StringVariable("inactive") + return updatedConfig +}() + +var testConfigServerVarsMaxUpdatedDesiredStatus = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigServerVarsMaxUpdated { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(testutil.ProjectId) + updatedConfig["machine_type"] = config.StringVariable("t1.2") + updatedConfig["label"] = config.StringVariable("updated") + updatedConfig["desired_status"] = config.StringVariable("deallocated") + return updatedConfig +}() + +var testConfigAffinityGroupVarsMin = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "policy": config.StringVariable("hard-affinity"), } -// Volume resource data -var volumeResource = map[string]string{ - "project_id": testutil.ProjectId, - "availability_zone": "eu01-1", - "name": fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha)), - "description": "description", - "size": "1", - "label1": "value", - "performance_class": "storage_premium_perf1", +var testConfigNetworkInterfaceVarsMin = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), } -// Server resource data -var serverResource = map[string]string{ - "project_id": testutil.ProjectId, - "availability_zone": "eu01-1", - "size": "64", - "source_type": "image", - "source_id": testutil.IaaSImageId, - "name": fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha)), - "machine_type": serverMachineType, - "label1": "value", - "user_data": "#!/bin/bash", - "delete_on_termination": "true", +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"), } -// Security Group resource data -var securityGroupResource = map[string]string{ - "project_id": testutil.ProjectId, - "name": "name", - "description": "description", - "label1": "value", +var testConfigNetworkInterfaceVarsMaxUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigNetworkInterfaceVarsMax { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["name"]))) + updatedConfig["ipv4"] = config.StringVariable("10.2.10.21") + updatedConfig["security"] = config.BoolVariable(false) + updatedConfig["label"] = config.StringVariable("updated") + return updatedConfig +}() + +var testConfigVolumeVarsMin = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "availability_zone": config.StringVariable("eu01-1"), + "size": config.IntegerVariable(16), } -// Security Group rule resource data -var securityGroupRuleResource = map[string]string{ - "project_id": testutil.ProjectId, - "direction": "ingress", - "description": "description", +var testConfigVolumeVarsMinUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigVolumeVarsMin { + updatedConfig[k] = v + } + updatedConfig["size"] = config.IntegerVariable(20) + return updatedConfig +}() + +var testConfigVolumeVarsMax = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "availability_zone": config.StringVariable("eu01-1"), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "size": config.IntegerVariable(16), + "description": config.StringVariable("description"), + "performance_class": config.StringVariable("storage_premium_perf0"), + "label": config.StringVariable("label"), } -// Public IP resource data -var publicIpResource = map[string]string{ - "project_id": testutil.ProjectId, - "label1": "value", - "network_interface_id": "stackit_network_interface.network_interface.network_interface_id", +var testConfigVolumeVarsMaxUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigVolumeVarsMax { + updatedConfig[k] = v + } + updatedConfig["size"] = config.IntegerVariable(20) + updatedConfig["name"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["name"]))) + updatedConfig["description"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["description"]))) + updatedConfig["label"] = config.StringVariable("updated") + return updatedConfig +}() + +var testConfigNetworkVarsMin = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), } -// Key pair resource data -var keyPairResource = map[string]string{ - "name": "key-pair-name", - "public_key": `ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIDsPd27M449akqCtdFg2+AmRVJz6eWio0oMP9dVg7XZ`, - "label1": "value1", - "label1-updated": "value1-updated", +var testConfigNetworkVarsMax = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))), + "ipv4_gateway": config.StringVariable("10.2.2.1"), + "ipv4_nameservers": config.StringVariable("10.2.2.2"), + "ipv4_prefix": config.StringVariable("10.2.2.0/24"), + "ipv4_prefix_length": config.IntegerVariable(24), + "routed": config.BoolVariable(false), + "label": config.StringVariable("label"), } -// Image resource data -var imageResource = map[string]string{ - "project_id": testutil.ProjectId, - "name": fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha)), - "disk_format": "qcow2", - "local_file_path": testutil.TestImageLocalFilePath, - "min_disk_size": "1", - "min_ram": "1", - "label1": "value1", - "boot_menu": "true", +var testConfigNetworkVarsMaxUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigNetworkVarsMax { + updatedConfig[k] = v + } + updatedConfig["ipv4_gateway"] = config.StringVariable("") + updatedConfig["ipv4_nameservers"] = config.StringVariable("10.2.2.3") + updatedConfig["ipv4_prefix"] = config.StringVariable("10.2.2.0/25") + updatedConfig["ipv4_prefix_length"] = config.IntegerVariable(25) + updatedConfig["label"] = config.StringVariable("updated") + return updatedConfig +}() + +var testConfigNetworkAreaVarsMin = config.Variables{ + "organization_id": config.StringVariable(testutil.OrganizationId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha))), + "transfer_network": config.StringVariable("10.1.2.0/24"), + "network_ranges_prefix": config.StringVariable("10.0.0.0/16"), + "route_prefix": config.StringVariable("1.1.1.0/24"), + "route_next_hop": config.StringVariable("1.1.1.1"), } -// if no local file is provided the test should create a default file and work with this instead of failing -var localFileForIaasImage os.File +var testConfigNetworkAreaVarsMinUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigNetworkAreaVarsMin { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(updatedConfig["name"]))) + updatedConfig["network_ranges_prefix"] = config.StringVariable("10.0.0.0/18") + return updatedConfig +}() -func networkResourceConfig(name, nameservers string) string { - return fmt.Sprintf(` - resource "stackit_network" "network" { - project_id = "%s" - name = "%s" - ipv4_prefix_length = "%s" - ipv4_nameservers = %s - ipv4_gateway = "%s" - ipv4_prefix = "%s" - routed = "%s" - } - `, - networkResource["project_id"], - name, - networkResource["ipv4_prefix_length"], - nameservers, - networkResource["ipv4_gateway"], - networkResource["ipv4_prefix"], - networkResource["routed"], - ) +var testConfigNetworkAreaVarsMax = config.Variables{ + "organization_id": config.StringVariable(testutil.OrganizationId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha))), + "transfer_network": config.StringVariable("10.1.2.0/24"), + "network_ranges_prefix": config.StringVariable("10.0.0.0/16"), + "default_nameservers": config.StringVariable("1.1.1.1"), + "default_prefix_length": config.IntegerVariable(24), + "max_prefix_length": config.IntegerVariable(24), + "min_prefix_length": config.IntegerVariable(16), + "route_prefix": config.StringVariable("1.1.1.0/24"), + "route_next_hop": config.StringVariable("1.1.1.1"), + "label": config.StringVariable("label"), } -// routed: true, gateway not present -func networkResourceConfigRouted(name, nameservers string) string { - return fmt.Sprintf(` - resource "stackit_network" "network" { - project_id = "%s" - name = "%s" - ipv4_prefix_length = "%s" - ipv4_nameservers = %s - ipv4_prefix = "%s" - routed = "true" - } - `, - networkResource["project_id"], - name, - networkResource["ipv4_prefix_length"], - nameservers, - networkResource["ipv4_prefix"], - ) +var testConfigNetworkAreaVarsMaxUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigNetworkAreaVarsMax { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(updatedConfig["name"]))) + updatedConfig["network_ranges_prefix"] = config.StringVariable("10.0.0.0/18") + updatedConfig["default_nameservers"] = config.StringVariable("1.1.1.2") + updatedConfig["default_prefix_length"] = config.IntegerVariable(25) + updatedConfig["max_prefix_length"] = config.IntegerVariable(25) + updatedConfig["min_prefix_length"] = config.IntegerVariable(20) + updatedConfig["label"] = config.StringVariable("updated") + return updatedConfig +}() + +var testConfigSecurityGroupsVarsMin = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha))), + "direction": config.StringVariable("ingress"), } -func networkAreaResourceConfig(areaname, networkranges string) string { - return fmt.Sprintf(` - resource "stackit_network_area" "network_area" { - organization_id = "%s" - name = "%s" - network_ranges = [{ - prefix = "%s" - }] - transfer_network = "%s" - } - `, - networkAreaResource["organization_id"], - areaname, - networkranges, - networkAreaResource["transfer_network"], - ) +func testConfigSecurityGroupsVarsMinUpdated() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigSecurityGroupsVarsMin { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(updatedConfig["name"]))) + return updatedConfig } -func networkAreaRouteResourceConfig(labelValue string) string { - return fmt.Sprintf(` - resource "stackit_network_area_route" "network_area_route" { - organization_id = stackit_network_area.network_area.organization_id - network_area_id = stackit_network_area.network_area.network_area_id - prefix = "%s" - next_hop = "%s" - labels = { - "label1" = "%s" - } - } - `, - networkAreaRouteResource["prefix"], - networkAreaRouteResource["next_hop"], - labelValue, - ) +var testConfigSecurityGroupsVarsMax = config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha))), + "description": config.StringVariable("description"), + "description_rule": config.StringVariable("description"), + "label": config.StringVariable("label"), + "stateful": config.BoolVariable(false), + "direction": config.StringVariable("ingress"), + "ether_type": config.StringVariable("IPv4"), + "ip_range": config.StringVariable("192.168.2.0/24"), + "port": config.StringVariable("443"), + "protocol": config.StringVariable("tcp"), + "icmp_code": config.IntegerVariable(0), + "icmp_type": config.IntegerVariable(8), + "name_remote": config.StringVariable(fmt.Sprintf("tf-acc-remote-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha))), } -func networkInterfaceResourceConfig(resourceName, name string) string { - return fmt.Sprintf(` - resource "stackit_network_interface" "%s" { - project_id = stackit_network.network.project_id - network_id = stackit_network.network.network_id - name = "%s" - } - `, - resourceName, - name, - ) +func testConfigSecurityGroupsVarsMaxUpdated() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigSecurityGroupsVarsMax { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(updatedConfig["name"]))) + updatedConfig["name_remote"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(updatedConfig["name_remote"]))) + updatedConfig["description"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(updatedConfig["description"]))) + updatedConfig["label"] = config.StringVariable("updated") + + return updatedConfig } -func volumeResourceConfig(name, size string) string { - return fmt.Sprintf(` - resource "stackit_volume" "volume" { - project_id = "%s" - availability_zone = "%s" - name = "%s" - description = "%s" - size = %s - labels = { - "label1" = "%s" - } - performance_class = "%s" - } - `, - volumeResource["project_id"], - volumeResource["availability_zone"], - name, - volumeResource["description"], - size, - volumeResource["label1"], - volumeResource["performance_class"], - ) -} - -func serverResourceConfig(name, machineType string) string { - return fmt.Sprintf(` - resource "stackit_server" "server" { - project_id = "%s" - availability_zone = "%s" - name = "%s" - machine_type = "%s" - boot_volume = { - size = %s - source_type = "%s" - source_id = "%s" - delete_on_termination = "%s" - } - network_interfaces = [stackit_network_interface.network_interface.network_interface_id] - labels = { - "label1" = "%s" - } - user_data = "%s" - } - `, - serverResource["project_id"], - serverResource["availability_zone"], - name, - machineType, - serverResource["size"], - serverResource["source_type"], - serverResource["source_id"], - serverResource["delete_on_termination"], - serverResource["label1"], - serverResource["user_data"], - ) -} - -func securityGroupResourceConfig(name string) string { - return fmt.Sprintf(` - resource "stackit_security_group" "security_group" { - project_id = "%s" - name = "%s" - description = "%s" - labels = { - "label1" = "%s" - } - } - `, - securityGroupResource["project_id"], - name, - securityGroupResource["description"], - securityGroupResource["label1"], - ) -} - -func securityGroupRuleResourceConfig(direction string) string { - return fmt.Sprintf(` - resource "stackit_security_group_rule" "security_group_rule" { - project_id = "%s" - security_group_id = stackit_security_group.security_group.security_group_id - direction = "%s" - description = "%s" - } - `, - securityGroupRuleResource["project_id"], - direction, - securityGroupRuleResource["description"], - ) -} - -func volumeAttachmentResourceConfig() string { - return fmt.Sprintf(` - resource "stackit_server_volume_attach" "attach_volume" { - project_id = "%s" - server_id = stackit_server.server.server_id - volume_id = stackit_volume.volume.volume_id - } - `, - testutil.ProjectId, - ) -} - -func serviceAccountAttachmentResourceConfig() string { - return fmt.Sprintf(` - resource "stackit_server_service_account_attach" "attach_sa" { - project_id = "%s" - server_id = stackit_server.server.server_id - service_account_email = "%s" - } - `, - testutil.ProjectId, - testutil.TestProjectServiceAccountEmail, - ) -} - -func imageResourceConfig(name string) string { - if imageResource["local_file_path"] == "default" { +var testConfigImageVarsMin = func() config.Variables { + localFilePath := testutil.TestImageLocalFilePath + if localFilePath == "default" { localFileForIaasImage = testutil.CreateDefaultLocalFile() filePath, err := filepath.Abs(localFileForIaasImage.Name()) if err != nil { fmt.Println("Absolute path for localFileForIaasImage could not be retrieved.") } - imageResource["local_file_path"] = filePath + localFilePath = filePath } - return fmt.Sprintf(` - resource "stackit_image" "image" { - project_id = "%s" - name = "%s" - disk_format = "%s" - local_file_path = "%s" - min_disk_size = %s - min_ram = %s - labels = { - "label1" = "%s" - } - config = { - boot_menu = %s - } - } - `, - imageResource["project_id"], - name, - imageResource["disk_format"], - imageResource["local_file_path"], - imageResource["min_disk_size"], - imageResource["min_ram"], - imageResource["label1"], - imageResource["boot_menu"], - ) + return config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha))), + "disk_format": config.StringVariable("qcow2"), + "local_file_path": config.StringVariable(localFilePath), + } +}() + +var testConfigImageVarsMinUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigImageVarsMin { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(updatedConfig["name"]))) + return updatedConfig +}() + +var testConfigImageVarsMax = func() config.Variables { + localFilePath := testutil.TestImageLocalFilePath + if localFilePath == "default" { + localFileForIaasImage = testutil.CreateDefaultLocalFile() + filePath, err := filepath.Abs(localFileForIaasImage.Name()) + if err != nil { + fmt.Println("Absolute path for localFileForIaasImage could not be retrieved.") + } + localFilePath = filePath + } + return config.Variables{ + "project_id": config.StringVariable(testutil.ProjectId), + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha))), + "disk_format": config.StringVariable("qcow2"), + "local_file_path": config.StringVariable(localFilePath), + "min_disk_size": config.IntegerVariable(20), + "min_ram": config.IntegerVariable(2048), + "label": config.StringVariable("label"), + "boot_menu": config.BoolVariable(false), + "cdrom_bus": config.StringVariable("scsi"), + "disk_bus": config.StringVariable("scsi"), + "nic_model": config.StringVariable("e1000"), + "operating_system": config.StringVariable("linux"), + "operating_system_distro": config.StringVariable("ubuntu"), + "operating_system_version": config.StringVariable("16.04"), + "rescue_bus": config.StringVariable("sata"), + "rescue_device": config.StringVariable("cdrom"), + "secure_boot": config.BoolVariable(true), + "uefi": config.BoolVariable(true), + "video_model": config.StringVariable("vga"), + "virtio_scsi": config.BoolVariable(true), + } +}() + +var testConfigImageVarsMaxUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigImageVarsMax { + updatedConfig[k] = v + } + updatedConfig["name"] = config.StringVariable(fmt.Sprintf("%s-updated", testutil.ConvertConfigVariable(updatedConfig["name"]))) + updatedConfig["min_disk_size"] = config.IntegerVariable(25) + updatedConfig["min_ram"] = config.IntegerVariable(4096) + updatedConfig["label"] = config.StringVariable("updated") + updatedConfig["boot_menu"] = config.BoolVariable(false) + updatedConfig["cdrom_bus"] = config.StringVariable("usb") + updatedConfig["disk_bus"] = config.StringVariable("usb") + updatedConfig["nic_model"] = config.StringVariable("virtio") + updatedConfig["operating_system"] = config.StringVariable("windows") + updatedConfig["operating_system_distro"] = config.StringVariable("debian") + updatedConfig["operating_system_version"] = config.StringVariable("18.04") + updatedConfig["rescue_bus"] = config.StringVariable("usb") + updatedConfig["rescue_device"] = config.StringVariable("disk") + updatedConfig["secure_boot"] = config.BoolVariable(false) + updatedConfig["uefi"] = config.BoolVariable(false) + updatedConfig["video_model"] = config.StringVariable("virtio") + updatedConfig["virtio_scsi"] = config.BoolVariable(false) + return updatedConfig +}() + +var testConfigKeyPairMin = config.Variables{ + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha))), + "public_key": config.StringVariable(keypairPublicKey), } -func networkInterfaceAttachmentResourceConfig(nicTfName string) string { - return fmt.Sprintf(` - resource "stackit_server_network_interface_attach" "attach_nic" { - project_id = "%s" - server_id = stackit_server.server.server_id - network_interface_id = stackit_network_interface.%s.network_interface_id - } - `, - testutil.ProjectId, - nicTfName, - ) +var testConfigKeyPairMax = config.Variables{ + "name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlpha))), + "public_key": config.StringVariable(keypairPublicKey), + "label": config.StringVariable("label"), } -func testAccNetworkAreaConfig(areaname, networkranges, routeLabelValue string) string { - return fmt.Sprintf("%s\n\n%s\n\n%s", - testutil.IaaSProviderConfig(), - networkAreaResourceConfig(areaname, networkranges), - networkAreaRouteResourceConfig(routeLabelValue), - ) -} +var testConfigKeyPairMaxUpdated = func() config.Variables { + updatedConfig := config.Variables{} + for k, v := range testConfigKeyPairMax { + updatedConfig[k] = v + } + updatedConfig["label"] = config.StringVariable("updated") + return updatedConfig +}() -func testAccVolumeConfig(name, size string) string { - return fmt.Sprintf("%s\n\n%s", - testutil.IaaSProviderConfig(), - volumeResourceConfig(name, size), - ) -} +// if no local file is provided the test should create a default file and work with this instead of failing +var localFileForIaasImage os.File -func testAccServerConfig(name, nameservers, serverName, machineType, nicTfName, interfacename string) string { - return fmt.Sprintf("%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s\n\n%s", - testutil.IaaSProviderConfig(), - networkResourceConfig(name, nameservers), - serverResourceConfig(serverName, machineType), - volumeResourceConfig(volumeResource["name"], volumeResource["size"]), - networkInterfaceResourceConfig(nicTfName, interfacename), - networkInterfaceResourceConfig(nicAttachTfName, fmt.Sprintf("%s-%s", interfacename, nicAttachTfName)), - networkInterfaceAttachmentResourceConfig(nicAttachTfName), - volumeAttachmentResourceConfig(), - serviceAccountAttachmentResourceConfig(), - ) -} - -func resourceConfigSecurityGroup(name, direction string) string { - return fmt.Sprintf("%s\n\n%s\n\n%s", - testutil.IaaSProviderConfig(), - securityGroupResourceConfig(name), - securityGroupRuleResourceConfig(direction), - ) -} - -func testAccPublicIpConfig(nameNetwork, nameservers, nicTfName, nameNetworkInterface, publicIpResourceConfig string) string { - return fmt.Sprintf("%s\n\n%s\n\n%s\n\n%s", - testutil.IaaSProviderConfig(), - networkResourceConfigRouted(nameNetwork, nameservers), - networkInterfaceResourceConfig(nicTfName, nameNetworkInterface), - publicIpResourceConfig, - ) -} - -func testAccKeyPairConfig(keyPairResourceConfig string) string { - return fmt.Sprintf("%s\n\n%s", - testutil.IaaSProviderConfig(), - keyPairResourceConfig, - ) -} - -func testAccImageConfig(name string) string { - return fmt.Sprintf("%s\n\n%s", - testutil.IaaSProviderConfig(), - imageResourceConfig(name), - ) -} - -func TestAccNetwork(t *testing.T) { - resource.Test(t, resource.TestCase{ +func TestAccNetworkMin(t *testing.T) { + t.Logf("TestAccNetworkMin name: %s", testutil.ConvertConfigVariable(testConfigNetworkVarsMin["name"])) + resource.ParallelTest(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, - CheckDestroy: testAccCheckNetworkDestroy, + CheckDestroy: testAccCheckDestroy, Steps: []resource.TestStep{ - // Creation { - Config: networkResourceConfig( - networkResource["name"], - fmt.Sprintf("[%q, %q]", - networkResource["nameserver0"], - networkResource["nameserver1"]), - ), + ConfigVariables: testConfigNetworkVarsMin, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceNetworkMinConfig), Check: resource.ComposeAggregateTestCheckFunc( resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "name", networkResource["name"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_nameservers.#", "2"), - // nameservers may be returned in a randomized order, so we have to check them with a helper function - resource.TestCheckTypeSetElemAttr("stackit_network.network", "nameservers.*", networkResource["nameserver0"]), - resource.TestCheckTypeSetElemAttr("stackit_network.network", "nameservers.*", networkResource["nameserver1"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_gateway", networkResource["ipv4_gateway"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefix", networkResource["ipv4_prefix"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefix_length", networkResource["ipv4_prefix_length"]), + resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkVarsMin["project_id"])), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkVarsMin["name"])), + resource.TestCheckResourceAttrSet("stackit_network.network", "ipv4_prefixes.#"), + resource.TestCheckResourceAttrSet("stackit_network.network", "ipv6_prefixes.#"), + resource.TestCheckResourceAttrSet("stackit_network.network", "public_ip"), ), }, // Data source { + ConfigVariables: testConfigNetworkVarsMin, Config: fmt.Sprintf(` %s + %s data "stackit_network" "network" { - project_id = "%s" + project_id = stackit_network.network.project_id network_id = stackit_network.network.network_id } - `, networkResourceConfig( - networkResource["name"], - fmt.Sprintf("[%q, %q]", - networkResource["nameserver0"], - networkResource["nameserver1"]), - ), - testutil.ProjectId, + `, + testutil.IaaSProviderConfig(), resourceNetworkMinConfig, ), Check: resource.ComposeAggregateTestCheckFunc( resource.TestCheckResourceAttrSet("data.stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("data.stackit_network.network", "name", networkResource["name"]), - resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_gateway", networkResource["ipv4_gateway"]), - resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_nameservers.#", "2"), - // nameservers may be returned in a randomized order, so we have to check them with a helper function - resource.TestCheckTypeSetElemAttr("stackit_network.network", "nameservers.*", networkResource["nameserver0"]), - resource.TestCheckTypeSetElemAttr("stackit_network.network", "nameservers.*", networkResource["nameserver1"]), - resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_prefix", networkResource["ipv4_prefix"]), - resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_prefix_length", networkResource["ipv4_prefix_length"]), - resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_prefixes.#", "1"), - resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_prefixes.0", networkResource["ipv4_prefix"]), - resource.TestCheckResourceAttr("data.stackit_network.network", "routed", networkResource["routed"]), + resource.TestCheckResourceAttr("data.stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkVarsMin["project_id"])), + resource.TestCheckResourceAttr("data.stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkVarsMin["name"])), + resource.TestCheckResourceAttrSet("data.stackit_network.network", "ipv4_prefixes.#"), + resource.TestCheckResourceAttrSet("data.stackit_network.network", "ipv6_prefixes.#"), + resource.TestCheckResourceAttrSet("data.stackit_network.network", "public_ip"), ), }, // Import { - ResourceName: "stackit_network.network", + ConfigVariables: testConfigNetworkVarsMin, + ResourceName: "stackit_network.network", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_network.network"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_network.network") + } + networkId, ok := r.Primary.Attributes["network_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, networkId), nil + }, + ImportState: true, + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), + resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkVarsMin["project_id"])), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkVarsMin["name"])), + resource.TestCheckResourceAttrSet("stackit_network.network", "ipv4_prefixes.#"), + resource.TestCheckResourceAttrSet("stackit_network.network", "ipv6_prefixes.#"), + resource.TestCheckResourceAttrSet("stackit_network.network", "public_ip"), + ), + }, + // In this minimal setup, no update can be performed + // Deletion is done by the framework implicitly + }, + }) +} + +func TestAccNetworkMax(t *testing.T) { + t.Logf("TestAccNetworkMax name: %s", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["name"])) + resource.ParallelTest(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckDestroy, + Steps: []resource.TestStep{ + + // Creation + { + ConfigVariables: testConfigNetworkVarsMax, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceNetworkMaxConfig), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), + resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["project_id"])), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["name"])), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_gateway", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["ipv4_gateway"])), + resource.TestCheckNoResourceAttr("stackit_network.network", "no_ipv4_gateway"), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_nameservers.#", "1"), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_nameservers.0", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["ipv4_nameservers"])), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefix", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["ipv4_prefix"])), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["ipv4_prefix_length"])), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefixes.#", "1"), + resource.TestCheckResourceAttrSet("stackit_network.network", "ipv6_prefixes.#"), + resource.TestCheckResourceAttr("stackit_network.network", "routed", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["routed"])), + resource.TestCheckResourceAttr("stackit_network.network", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["label"])), + resource.TestCheckNoResourceAttr("stackit_network.network", "public_ip")), + }, + // Data source + { + ConfigVariables: testConfigNetworkVarsMax, + Config: fmt.Sprintf(` + %s + %s + + data "stackit_network" "network" { + project_id = stackit_network.network.project_id + network_id = stackit_network.network.network_id + } + `, + testutil.IaaSProviderConfig(), resourceNetworkMaxConfig, + ), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttrSet("data.stackit_network.network", "network_id"), + resource.TestCheckResourceAttr("data.stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["project_id"])), + resource.TestCheckResourceAttr("data.stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["name"])), + resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_gateway", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["ipv4_gateway"])), + resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_nameservers.#", "1"), + resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_nameservers.0", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["ipv4_nameservers"])), + resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_prefix", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["ipv4_prefix"])), + resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["ipv4_prefix_length"])), + resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_prefixes.#", "1"), + resource.TestCheckResourceAttrSet("data.stackit_network.network", "ipv6_prefixes.#"), + resource.TestCheckResourceAttr("data.stackit_network.network", "routed", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["routed"])), + resource.TestCheckResourceAttr("data.stackit_network.network", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkVarsMax["label"])), + ), + }, + // Import + { + ConfigVariables: testConfigNetworkVarsMax, + ResourceName: "stackit_network.network", ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_network.network"] if !ok { @@ -538,48 +617,49 @@ func TestAccNetwork(t *testing.T) { resource.TestCheckResourceAttr("data.stackit_network.network", "routed", networkResource["routed"]), ), }, - // Update { - Config: networkResourceConfig( - networkResource["name_updated"], - fmt.Sprintf("[%q, %q]", - networkResource["nameserver0"], - networkResource["nameserver1"]), - ), + ConfigVariables: testConfigNetworkVarsMaxUpdated, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceNetworkMaxConfig), Check: resource.ComposeAggregateTestCheckFunc( resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "name", networkResource["name_updated"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_nameservers.#", "2"), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_gateway", networkResource["ipv4_gateway"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefix", networkResource["ipv4_prefix"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefix_length", networkResource["ipv4_prefix_length"])), + resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigNetworkVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigNetworkVarsMaxUpdated["name"])), + resource.TestCheckNoResourceAttr("stackit_network.network", "ipv4_gateway"), + resource.TestCheckResourceAttr("stackit_network.network", "no_ipv4_gateway", "true"), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_nameservers.#", "1"), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_nameservers.0", testutil.ConvertConfigVariable(testConfigNetworkVarsMaxUpdated["ipv4_nameservers"])), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefix", testutil.ConvertConfigVariable(testConfigNetworkVarsMaxUpdated["ipv4_prefix"])), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkVarsMaxUpdated["ipv4_prefix_length"])), + resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefixes.#", "1"), + resource.TestCheckResourceAttrSet("stackit_network.network", "ipv6_prefixes.#"), + resource.TestCheckResourceAttr("stackit_network.network", "routed", testutil.ConvertConfigVariable(testConfigNetworkVarsMaxUpdated["routed"])), + resource.TestCheckResourceAttr("stackit_network.network", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkVarsMaxUpdated["label"])), + resource.TestCheckNoResourceAttr("stackit_network.network", "public_ip"), + ), }, // Deletion is done by the framework implicitly }, }) } -func TestAccNetworkArea(t *testing.T) { +func TestAccNetworkAreaMin(t *testing.T) { + t.Logf("TestAccNetworkAreaMin name: %s", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["name"])) resource.Test(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, - CheckDestroy: testAccCheckNetworkAreaDestroy, + CheckDestroy: testAccCheckDestroy, Steps: []resource.TestStep{ - // Creation { - Config: testAccNetworkAreaConfig( - networkAreaResource["name"], - networkAreaResource["networkrange0"], - networkAreaRouteResource["label1"], - ), + ConfigVariables: testConfigNetworkAreaVarsMin, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceNetworkAreaMinConfig), Check: resource.ComposeAggregateTestCheckFunc( // Network Area - resource.TestCheckResourceAttr("stackit_network_area.network_area", "organization_id", networkAreaResource["organization_id"]), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "organization_id", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["organization_id"])), resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_area_id"), - resource.TestCheckResourceAttr("stackit_network_area.network_area", "name", networkAreaResource["name"]), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "name", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["name"])), resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.#", "1"), - resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.0.prefix", networkAreaResource["networkrange0"]), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.0.prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["network_ranges_prefix"])), resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_ranges.0.network_range_id"), // Network Area Route @@ -592,15 +672,16 @@ func TestAccNetworkArea(t *testing.T) { "stackit_network_area.network_area", "network_area_id", ), resource.TestCheckResourceAttrSet("stackit_network_area_route.network_area_route", "network_area_route_id"), - resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "prefix", networkAreaRouteResource["prefix"]), - resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "next_hop", networkAreaRouteResource["next_hop"]), - resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "labels.label1", networkAreaRouteResource["label1"]), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["route_prefix"])), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "next_hop", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["route_next_hop"])), ), }, // Data source { + ConfigVariables: testConfigNetworkAreaVarsMin, Config: fmt.Sprintf(` %s + %s data "stackit_network_area" "network_area" { organization_id = stackit_network_area.network_area.organization_id @@ -613,42 +694,43 @@ func TestAccNetworkArea(t *testing.T) { network_area_route_id = stackit_network_area_route.network_area_route.network_area_route_id } `, - testAccNetworkAreaConfig( - networkAreaResource["name"], - networkAreaResource["networkrange0"], - networkAreaRouteResource["label1"], - ), + testutil.IaaSProviderConfig(), resourceNetworkAreaMinConfig, ), Check: resource.ComposeAggregateTestCheckFunc( - - // Network area - resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "organization_id", networkAreaResource["organization_id"]), + // Network Area + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "organization_id", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["organization_id"])), + resource.TestCheckResourceAttrSet("data.stackit_network_area.network_area", "network_area_id"), resource.TestCheckResourceAttrPair( + "data.stackit_network_area.network_area", "network_area_id", "stackit_network_area.network_area", "network_area_id", + ), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "name", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["name"])), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "network_ranges.#", "1"), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "network_ranges.0.prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["network_ranges_prefix"])), + resource.TestCheckResourceAttrSet("data.stackit_network_area.network_area", "network_ranges.0.network_range_id"), + + // Network Area Route + resource.TestCheckResourceAttrPair( + "data.stackit_network_area_route.network_area_route", "organization_id", + "data.stackit_network_area.network_area", "organization_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_network_area_route.network_area_route", "network_area_id", "data.stackit_network_area.network_area", "network_area_id", ), - resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "name", networkAreaResource["name"]), - resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "network_ranges.#", "1"), - resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "network_ranges.0.prefix", networkAreaResource["networkrange0"]), - - // Network area route resource.TestCheckResourceAttrPair( - "stackit_network_area_route.network_area_route", "organization_id", - "stackit_network_area.network_area", "organization_id", + "data.stackit_network_area_route.network_area_route", "network_area_route_id", + "stackit_network_area_route.network_area_route", "network_area_route_id", ), - resource.TestCheckResourceAttrPair( - "stackit_network_area_route.network_area_route", "network_area_id", - "stackit_network_area.network_area", "network_area_id", - ), - resource.TestCheckResourceAttrSet("stackit_network_area_route.network_area_route", "network_area_route_id"), - resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "prefix", networkAreaRouteResource["prefix"]), - resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "next_hop", networkAreaRouteResource["next_hop"]), - resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "labels.label1", networkAreaRouteResource["label1"]), + resource.TestCheckResourceAttrSet("data.stackit_network_area_route.network_area_route", "network_area_route_id"), + resource.TestCheckResourceAttr("data.stackit_network_area_route.network_area_route", "prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["route_prefix"])), + resource.TestCheckResourceAttr("data.stackit_network_area_route.network_area_route", "next_hop", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMin["route_next_hop"])), ), }, // Import { - ResourceName: "stackit_network_area.network_area", + ConfigVariables: testConfigNetworkAreaVarsMinUpdated, + ResourceName: "stackit_network_area.network_area", ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_network_area.network_area"] if !ok { @@ -664,7 +746,8 @@ func TestAccNetworkArea(t *testing.T) { ImportStateVerify: true, }, { - ResourceName: "stackit_network_area_route.network_area_route", + ConfigVariables: testConfigNetworkAreaVarsMinUpdated, + ResourceName: "stackit_network_area_route.network_area_route", ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_network_area_route.network_area_route"] if !ok { @@ -685,20 +768,18 @@ func TestAccNetworkArea(t *testing.T) { }, // Update { - Config: testAccNetworkAreaConfig( - fmt.Sprintf("%s-updated", networkAreaResource["name"]), - networkAreaResource["networkrange0"], - networkAreaRouteResource["label1-updated"], - ), + ConfigVariables: testConfigNetworkAreaVarsMinUpdated, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceNetworkAreaMinConfig), Check: resource.ComposeAggregateTestCheckFunc( - // Network area - resource.TestCheckResourceAttr("stackit_network_area.network_area", "organization_id", networkAreaResource["organization_id"]), + // Network Area + resource.TestCheckResourceAttr("stackit_network_area.network_area", "organization_id", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMinUpdated["organization_id"])), resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_area_id"), - resource.TestCheckResourceAttr("stackit_network_area.network_area", "name", fmt.Sprintf("%s-updated", networkAreaResource["name"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "name", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMinUpdated["name"])), resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.#", "1"), - resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.0.prefix", networkAreaResource["networkrange0"]), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.0.prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMinUpdated["network_ranges_prefix"])), + resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_ranges.0.network_range_id"), - // Network area route + // Network Area Route resource.TestCheckResourceAttrPair( "stackit_network_area_route.network_area_route", "organization_id", "stackit_network_area.network_area", "organization_id", @@ -708,9 +789,8 @@ func TestAccNetworkArea(t *testing.T) { "stackit_network_area.network_area", "network_area_id", ), resource.TestCheckResourceAttrSet("stackit_network_area_route.network_area_route", "network_area_route_id"), - resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "prefix", networkAreaRouteResource["prefix"]), - resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "next_hop", networkAreaRouteResource["next_hop"]), - resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "labels.label1", networkAreaRouteResource["label1-updated"]), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMinUpdated["route_prefix"])), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "next_hop", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMinUpdated["route_next_hop"])), ), }, // Deletion is done by the framework implicitly @@ -718,59 +798,285 @@ func TestAccNetworkArea(t *testing.T) { }) } -func TestAccVolume(t *testing.T) { +func TestAccNetworkAreaMax(t *testing.T) { + t.Logf("TestAccNetworkAreaMax name: %s", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["name"])) resource.Test(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, - CheckDestroy: testAccCheckIaaSVolumeDestroy, + CheckDestroy: testAccCheckDestroy, Steps: []resource.TestStep{ - // Creation { - Config: testAccVolumeConfig(volumeResource["name"], volumeResource["size"]), + ConfigVariables: testConfigNetworkAreaVarsMax, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceNetworkAreaMaxConfig), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_volume.volume", "project_id", volumeResource["project_id"]), - resource.TestCheckResourceAttrSet("stackit_volume.volume", "volume_id"), - resource.TestCheckResourceAttr("stackit_volume.volume", "name", volumeResource["name"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "availability_zone", volumeResource["availability_zone"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "labels.label1", volumeResource["label1"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "description", volumeResource["description"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "performance_class", volumeResource["performance_class"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "size", volumeResource["size"]), + // Network Area + resource.TestCheckResourceAttr("stackit_network_area.network_area", "organization_id", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["organization_id"])), + resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_area_id"), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "name", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["name"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.#", "1"), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.0.prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["network_ranges_prefix"])), + resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_ranges.0.network_range_id"), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["label"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "default_nameservers.#", "1"), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "default_nameservers.0", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["default_nameservers"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "default_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["default_prefix_length"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "max_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["max_prefix_length"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "min_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["min_prefix_length"])), + + // Network Area Route + resource.TestCheckResourceAttrPair( + "stackit_network_area_route.network_area_route", "organization_id", + "stackit_network_area.network_area", "organization_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_network_area_route.network_area_route", "network_area_id", + "stackit_network_area.network_area", "network_area_id", + ), + resource.TestCheckResourceAttrSet("stackit_network_area_route.network_area_route", "network_area_route_id"), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["route_prefix"])), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "next_hop", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["route_next_hop"])), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["label"])), ), }, // Data source { + ConfigVariables: testConfigNetworkAreaVarsMax, Config: fmt.Sprintf(` %s - - data "stackit_volume" "volume" { - project_id = stackit_volume.volume.project_id - volume_id = stackit_volume.volume.volume_id + %s + + data "stackit_network_area" "network_area" { + organization_id = stackit_network_area.network_area.organization_id + network_area_id = stackit_network_area.network_area.network_area_id + } + + data "stackit_network_area_route" "network_area_route" { + organization_id = stackit_network_area.network_area.organization_id + network_area_id = stackit_network_area.network_area.network_area_id + network_area_route_id = stackit_network_area_route.network_area_route.network_area_route_id } `, - testAccVolumeConfig(volumeResource["name"], volumeResource["size"]), + testutil.IaaSProviderConfig(), resourceNetworkAreaMaxConfig, ), Check: resource.ComposeAggregateTestCheckFunc( - // Instance - resource.TestCheckResourceAttr("data.stackit_volume.volume", "project_id", networkResource["project_id"]), + // Network Area + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "organization_id", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["organization_id"])), + resource.TestCheckResourceAttrSet("data.stackit_network_area.network_area", "network_area_id"), resource.TestCheckResourceAttrPair( - "stackit_volume.volume", "volume_id", - "data.stackit_volume.volume", "volume_id", + "data.stackit_network_area.network_area", "network_area_id", + "stackit_network_area.network_area", "network_area_id", ), - resource.TestCheckResourceAttr("data.stackit_volume.volume", "name", volumeResource["name"]), - resource.TestCheckResourceAttr("data.stackit_volume.volume", "availability_zone", volumeResource["availability_zone"]), - resource.TestCheckResourceAttr("data.stackit_volume.volume", "availability_zone", volumeResource["availability_zone"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "labels.label1", volumeResource["label1"]), - resource.TestCheckResourceAttr("data.stackit_volume.volume", "description", volumeResource["description"]), - resource.TestCheckResourceAttr("data.stackit_volume.volume", "performance_class", volumeResource["performance_class"]), - resource.TestCheckResourceAttr("data.stackit_volume.volume", "size", volumeResource["size"]), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "name", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["name"])), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "network_ranges.#", "1"), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "network_ranges.0.prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["network_ranges_prefix"])), + resource.TestCheckResourceAttrSet("data.stackit_network_area.network_area", "network_ranges.0.network_range_id"), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["label"])), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "default_nameservers.#", "1"), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "default_nameservers.0", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["default_nameservers"])), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "default_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["default_prefix_length"])), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "max_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["max_prefix_length"])), + resource.TestCheckResourceAttr("data.stackit_network_area.network_area", "min_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["min_prefix_length"])), + + // Network Area Route + resource.TestCheckResourceAttrPair( + "data.stackit_network_area_route.network_area_route", "organization_id", + "data.stackit_network_area.network_area", "organization_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_network_area_route.network_area_route", "network_area_id", + "data.stackit_network_area.network_area", "network_area_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_network_area_route.network_area_route", "network_area_route_id", + "stackit_network_area_route.network_area_route", "network_area_route_id", + ), + resource.TestCheckResourceAttrSet("data.stackit_network_area_route.network_area_route", "network_area_route_id"), + resource.TestCheckResourceAttr("data.stackit_network_area_route.network_area_route", "prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["route_prefix"])), + resource.TestCheckResourceAttr("data.stackit_network_area_route.network_area_route", "next_hop", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMax["route_next_hop"])), ), }, // Import { - ResourceName: "stackit_volume.volume", + ConfigVariables: testConfigNetworkAreaVarsMaxUpdated, + ResourceName: "stackit_network_area.network_area", ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources["stackit_volume.volume"] + r, ok := s.RootModule().Resources["stackit_network_area.network_area"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_network_area.network_area") + } + networkAreaId, ok := r.Primary.Attributes["network_area_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_area_id") + } + return fmt.Sprintf("%s,%s", testutil.OrganizationId, networkAreaId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigNetworkAreaVarsMaxUpdated, + ResourceName: "stackit_network_area_route.network_area_route", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_network_area_route.network_area_route"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_network_area_route.network_area_route") + } + networkAreaId, ok := r.Primary.Attributes["network_area_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_area_id") + } + networkAreaRouteId, ok := r.Primary.Attributes["network_area_route_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_area_route_id") + } + return fmt.Sprintf("%s,%s,%s", testutil.OrganizationId, networkAreaId, networkAreaRouteId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + // Update + { + ConfigVariables: testConfigNetworkAreaVarsMaxUpdated, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceNetworkAreaMaxConfig), + Check: resource.ComposeAggregateTestCheckFunc( + // Network Area + resource.TestCheckResourceAttr("stackit_network_area.network_area", "organization_id", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["organization_id"])), + resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_area_id"), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "name", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["name"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.#", "1"), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "network_ranges.0.prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["network_ranges_prefix"])), + resource.TestCheckResourceAttrSet("stackit_network_area.network_area", "network_ranges.0.network_range_id"), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["label"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "default_nameservers.#", "1"), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "default_nameservers.0", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["default_nameservers"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "default_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["default_prefix_length"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "max_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["max_prefix_length"])), + resource.TestCheckResourceAttr("stackit_network_area.network_area", "min_prefix_length", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["min_prefix_length"])), + + // Network Area Route + resource.TestCheckResourceAttrPair( + "stackit_network_area_route.network_area_route", "organization_id", + "stackit_network_area.network_area", "organization_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_network_area_route.network_area_route", "network_area_id", + "stackit_network_area.network_area", "network_area_id", + ), + resource.TestCheckResourceAttrSet("stackit_network_area_route.network_area_route", "network_area_route_id"), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "prefix", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["route_prefix"])), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "next_hop", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["route_next_hop"])), + resource.TestCheckResourceAttr("stackit_network_area_route.network_area_route", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkAreaVarsMaxUpdated["label"])), + ), + }, + // Deletion is done by the framework implicitly + }, + }) +} + +func TestAccVolumeMin(t *testing.T) { + t.Logf("TestAccVolumeMin name: null") + resource.ParallelTest(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckDestroy, + Steps: []resource.TestStep{ + // Creation + { + ConfigVariables: testConfigVolumeVarsMin, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceVolumeMinConfig), + Check: resource.ComposeAggregateTestCheckFunc( + // Volume size + resource.TestCheckResourceAttr("stackit_volume.volume_size", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_size", "volume_id"), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["availability_zone"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["size"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_size", "performance_class"), + resource.TestCheckNoResourceAttr("stackit_volume.volume_size", "server_id"), + + // Volume source + resource.TestCheckResourceAttr("stackit_volume.volume_source", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_source", "volume_id"), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["availability_zone"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["size"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_source", "performance_class"), + resource.TestCheckResourceAttrPair( + "stackit_volume.volume_source", "source.id", + "stackit_volume.volume_size", "volume_id", + ), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "source.type", "volume"), + resource.TestCheckNoResourceAttr("stackit_volume.volume_source", "server_id"), + ), + }, + // Data source + { + ConfigVariables: testConfigVolumeVarsMin, + Config: fmt.Sprintf(` + %s + %s + + data "stackit_volume" "volume_size" { + project_id = stackit_volume.volume_size.project_id + volume_id = stackit_volume.volume_size.volume_id + } + + data "stackit_volume" "volume_source" { + project_id = stackit_volume.volume_source.project_id + volume_id = stackit_volume.volume_source.volume_id + } + `, + testutil.IaaSProviderConfig(), resourceVolumeMinConfig, + ), + Check: resource.ComposeAggregateTestCheckFunc( + // Volume size + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["project_id"])), + resource.TestCheckResourceAttrPair( + "stackit_volume.volume_size", "volume_id", + "data.stackit_volume.volume_size", "volume_id", + ), + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["availability_zone"])), + resource.TestCheckResourceAttrSet("data.stackit_volume.volume_size", "performance_class"), + resource.TestCheckNoResourceAttr("data.stackit_volume.volume_size", "server_id"), + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["size"])), + + // Volume source + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["project_id"])), + resource.TestCheckResourceAttrPair( + "stackit_volume.volume_source", "volume_id", + "data.stackit_volume.volume_source", "volume_id", + ), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["availability_zone"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["size"])), + resource.TestCheckResourceAttrSet("data.stackit_volume.volume_source", "performance_class"), + resource.TestCheckNoResourceAttr("data.stackit_volume.volume_source", "server_id"), + resource.TestCheckResourceAttrPair( + "data.stackit_volume.volume_source", "source.id", + "data.stackit_volume.volume_size", "volume_id", + ), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "source.type", "volume"), + ), + }, + // Import + { + ConfigVariables: testConfigVolumeVarsMin, + ResourceName: "stackit_volume.volume_size", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_volume.volume_size"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_volume.volume_size") + } + volumeId, ok := r.Primary.Attributes["volume_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute volume_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, volumeId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigVolumeVarsMin, + ResourceName: "stackit_volume.volume_source", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_volume.volume_source"] if !ok { return "", fmt.Errorf("couldn't find resource stackit_volume.volume") } @@ -785,19 +1091,30 @@ func TestAccVolume(t *testing.T) { }, // Update { - Config: testAccVolumeConfig( - fmt.Sprintf("%s-updated", volumeResource["name"]), - "10", - ), + ConfigVariables: testConfigVolumeVarsMinUpdated, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceVolumeMinConfig), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_volume.volume", "project_id", volumeResource["project_id"]), - resource.TestCheckResourceAttrSet("stackit_volume.volume", "volume_id"), - resource.TestCheckResourceAttr("stackit_volume.volume", "name", fmt.Sprintf("%s-updated", volumeResource["name"])), - resource.TestCheckResourceAttr("stackit_volume.volume", "availability_zone", volumeResource["availability_zone"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "labels.label1", volumeResource["label1"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "description", volumeResource["description"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "performance_class", volumeResource["performance_class"]), - resource.TestCheckResourceAttr("stackit_volume.volume", "size", "10"), + // Volume size + resource.TestCheckResourceAttr("stackit_volume.volume_size", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMinUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_size", "volume_id"), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMinUpdated["availability_zone"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMinUpdated["size"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_size", "performance_class"), + resource.TestCheckNoResourceAttr("stackit_volume.volume_size", "server_id"), + + // Volume source + resource.TestCheckResourceAttr("stackit_volume.volume_source", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMinUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_source", "volume_id"), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMinUpdated["availability_zone"])), + // Volume from source doesn't change size. So here the initial size will be used + resource.TestCheckResourceAttr("stackit_volume.volume_source", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMin["size"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_source", "performance_class"), + resource.TestCheckResourceAttrPair( + "stackit_volume.volume_source", "source.id", + "stackit_volume.volume_size", "volume_id", + ), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "source.type", "volume"), + resource.TestCheckNoResourceAttr("stackit_volume.volume_source", "server_id"), ), }, // Deletion is done by the framework implicitly @@ -805,197 +1122,575 @@ func TestAccVolume(t *testing.T) { }) } -func TestAccServer(t *testing.T) { - networkInterfaceSecSchemaName := fmt.Sprintf("stackit_network_interface.%s", nicAttachTfName) - resource.Test(t, resource.TestCase{ +func TestAccVolumeMax(t *testing.T) { + t.Logf("TestAccVolumeMax name: %s", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["name"])) + resource.ParallelTest(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, - CheckDestroy: testAccCheckServerDestroy, + CheckDestroy: testAccCheckDestroy, Steps: []resource.TestStep{ - // Creation { - Config: testAccServerConfig( - networkResource["name"], - fmt.Sprintf( - "[%q]", - networkResource["nameserver0"], - ), - serverResource["name"], - serverResource["machine_type"], - networkInterfaceResource["tfName"], - networkInterfaceResource["name"], - ), + ConfigVariables: testConfigVolumeVarsMax, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceVolumeMaxConfig), Check: resource.ComposeAggregateTestCheckFunc( + // Volume size + resource.TestCheckResourceAttr("stackit_volume.volume_size", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_size", "volume_id"), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["availability_zone"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["size"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "description", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["description"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "performance_class", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["performance_class"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "name", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["name"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "labels.%", "1"), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "labels.acc-test", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["label"])), + resource.TestCheckNoResourceAttr("stackit_volume.volume_size", "server_id"), - // Network - resource.TestCheckResourceAttr("stackit_network.network", "project_id", networkResource["project_id"]), - resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "name", networkResource["name"]), - resource.TestCheckResourceAttr("stackit_network.network", "nameservers.#", "1"), - resource.TestCheckResourceAttr("stackit_network.network", "nameservers.0", networkResource["nameserver0"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_gateway", networkResource["ipv4_gateway"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_prefix", networkResource["ipv4_prefix"]), - resource.TestCheckResourceAttr("stackit_network.network", "routed", networkResource["routed"]), - - // Server - resource.TestCheckResourceAttr("stackit_server.server", "project_id", serverResource["project_id"]), - resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), - resource.TestCheckResourceAttr("stackit_server.server", "name", serverResource["name"]), - resource.TestCheckResourceAttr("stackit_server.server", "availability_zone", serverResource["availability_zone"]), - resource.TestCheckResourceAttr("stackit_server.server", "machine_type", serverResource["machine_type"]), - resource.TestCheckResourceAttr("stackit_server.server", "labels.label1", serverResource["label1"]), - resource.TestCheckResourceAttr("stackit_server.server", "user_data", serverResource["user_data"]), - resource.TestCheckResourceAttrSet("stackit_server.server", "network_interfaces.0"), - // The network interface which was attached by "stackit_server_network_interface_attach" should not appear here - resource.TestCheckResourceAttr("stackit_server.server", "network_interfaces.#", "1"), - resource.TestCheckNoResourceAttr("stackit_server.server", "network_interfaces.1"), - resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.id"), - resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.size", serverResource["size"]), - resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_type", serverResource["source_type"]), - resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_id", serverResource["source_id"]), - resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.delete_on_termination", serverResource["delete_on_termination"]), - - // Network Interface + // Volume source + resource.TestCheckResourceAttr("stackit_volume.volume_source", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_source", "volume_id"), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["availability_zone"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["size"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "description", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["description"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "performance_class", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["performance_class"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "name", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["name"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "labels.%", "1"), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "labels.acc-test", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["label"])), resource.TestCheckResourceAttrPair( - "stackit_network_interface.network_interface", "project_id", - "stackit_network.network", "project_id", - ), - resource.TestCheckResourceAttrPair( - "stackit_network_interface.network_interface", "network_id", - "stackit_network.network", "network_id", - ), - resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "network_interface_id"), - resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "name", networkInterfaceResource["name"]), - - // Network Interface second - resource.TestCheckResourceAttrPair( - networkInterfaceSecSchemaName, "project_id", - "stackit_network.network", "project_id", - ), - resource.TestCheckResourceAttrPair( - networkInterfaceSecSchemaName, "network_id", - "stackit_network.network", "network_id", - ), - resource.TestCheckResourceAttrSet(networkInterfaceSecSchemaName, "network_interface_id"), - resource.TestCheckResourceAttr( - networkInterfaceSecSchemaName, "name", - fmt.Sprintf("%s-%s", networkInterfaceResource["name"], nicAttachTfName), - ), - - // Network Interface Attachment - resource.TestCheckResourceAttrPair( - "stackit_server_network_interface_attach.attach_nic", "project_id", - "stackit_network.network", "project_id", - ), - resource.TestCheckResourceAttrPair( - "stackit_server_network_interface_attach.attach_nic", "server_id", - "stackit_server.server", "server_id", - ), - resource.TestCheckResourceAttrPair( - "stackit_server_network_interface_attach.attach_nic", "network_interface_id", - networkInterfaceSecSchemaName, "network_interface_id", - ), - - // Volume attachment - resource.TestCheckResourceAttrPair( - "stackit_server_volume_attach.attach_volume", "project_id", - "stackit_server.server", "project_id", - ), - resource.TestCheckResourceAttrPair( - "stackit_server_volume_attach.attach_volume", "server_id", - "stackit_server.server", "server_id", - ), - resource.TestCheckResourceAttrPair( - "stackit_server_volume_attach.attach_volume", "volume_id", - "stackit_volume.volume", "volume_id", - ), - - // Service account attachment - resource.TestCheckResourceAttrPair( - "stackit_server_service_account_attach.attach_sa", "project_id", - "stackit_server.server", "project_id", - ), - resource.TestCheckResourceAttrPair( - "stackit_server_service_account_attach.attach_sa", "server_id", - "stackit_server.server", "server_id", + "stackit_volume.volume_source", "source.id", + "stackit_volume.volume_size", "volume_id", ), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "source.type", "volume"), + resource.TestCheckNoResourceAttr("stackit_volume.volume_source", "server_id"), ), }, // Data source { + ConfigVariables: testConfigVolumeVarsMax, + Config: fmt.Sprintf(` + %s + %s + + data "stackit_volume" "volume_size" { + project_id = stackit_volume.volume_size.project_id + volume_id = stackit_volume.volume_size.volume_id + } + + data "stackit_volume" "volume_source" { + project_id = stackit_volume.volume_source.project_id + volume_id = stackit_volume.volume_source.volume_id + } + `, + testutil.IaaSProviderConfig(), resourceVolumeMaxConfig, + ), + Check: resource.ComposeAggregateTestCheckFunc( + // Volume size + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["project_id"])), + resource.TestCheckResourceAttrPair( + "stackit_volume.volume_size", "volume_id", + "data.stackit_volume.volume_size", "volume_id", + ), + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["availability_zone"])), + resource.TestCheckNoResourceAttr("data.stackit_volume.volume_size", "server_id"), + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["size"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "description", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["description"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "performance_class", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["performance_class"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "name", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["name"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "labels.%", "1"), + resource.TestCheckResourceAttr("data.stackit_volume.volume_size", "labels.acc-test", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["label"])), + + // Volume source + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_volume.volume_source", "volume_id"), + resource.TestCheckResourceAttrPair( + "data.stackit_volume.volume_source", "volume_id", + "stackit_volume.volume_source", "volume_id", + ), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["availability_zone"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["size"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "description", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["description"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "performance_class", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["performance_class"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "name", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["name"])), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "labels.%", "1"), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "labels.acc-test", testutil.ConvertConfigVariable(testConfigVolumeVarsMax["label"])), + resource.TestCheckResourceAttrPair( + "data.stackit_volume.volume_source", "source.id", + "data.stackit_volume.volume_size", "volume_id", + ), + resource.TestCheckResourceAttr("data.stackit_volume.volume_source", "source.type", "volume"), + resource.TestCheckNoResourceAttr("data.stackit_volume.volume_source", "server_id"), + ), + }, + // Import + { + ConfigVariables: testConfigVolumeVarsMax, + ResourceName: "stackit_volume.volume_size", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_volume.volume_size"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_volume.volume_size") + } + volumeId, ok := r.Primary.Attributes["volume_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute volume_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, volumeId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigVolumeVarsMax, + ResourceName: "stackit_volume.volume_source", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_volume.volume_source"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_volume.volume_source") + } + volumeId, ok := r.Primary.Attributes["volume_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute volume_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, volumeId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + // Update + { + ConfigVariables: testConfigVolumeVarsMaxUpdated, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceVolumeMaxConfig), + Check: resource.ComposeAggregateTestCheckFunc( + // Volume size + resource.TestCheckResourceAttr("stackit_volume.volume_size", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_size", "volume_id"), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["availability_zone"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["size"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "description", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["description"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "performance_class", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["performance_class"])), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "name", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["name"])), + resource.TestCheckNoResourceAttr("stackit_volume.volume_size", "server_id"), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "labels.%", "1"), + resource.TestCheckResourceAttr("stackit_volume.volume_size", "labels.acc-test", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["label"])), + + // Volume source + resource.TestCheckResourceAttr("stackit_volume.volume_source", "project_id", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_volume.volume_source", "volume_id"), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "availability_zone", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["availability_zone"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "size", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["size"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "description", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["description"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "performance_class", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["performance_class"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "name", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["name"])), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "labels.%", "1"), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "labels.acc-test", testutil.ConvertConfigVariable(testConfigVolumeVarsMaxUpdated["label"])), + resource.TestCheckResourceAttrPair( + "stackit_volume.volume_source", "source.id", + "stackit_volume.volume_size", "volume_id", + ), + resource.TestCheckResourceAttr("stackit_volume.volume_source", "source.type", "volume"), + resource.TestCheckNoResourceAttr("stackit_volume.volume_source", "server_id"), + ), + }, + // Deletion is done by the framework implicitly + }, + }) +} + +func TestAccServerMin(t *testing.T) { + t.Logf("TestAccServerMin name: %s", testutil.ConvertConfigVariable(testConfigServerVarsMin["name"])) + resource.ParallelTest(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckDestroy, + Steps: []resource.TestStep{ + // Creation + { + ConfigVariables: testConfigServerVarsMin, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), 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.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"), + resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_id", testutil.ConvertConfigVariable(testConfigServerVarsMin["image_id"])), + resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.delete_on_termination", "true"), + resource.TestCheckNoResourceAttr("stackit_server.server", "boot_volume.performance_class"), + resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.size"), + resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.id"), + resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_type", "image"), + resource.TestCheckNoResourceAttr("stackit_server.server", "image_id"), + resource.TestCheckResourceAttr("stackit_server.server", "labels.%", "0"), + resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), + resource.TestCheckResourceAttrSet("stackit_server.server", "availability_zone"), + resource.TestCheckNoResourceAttr("stackit_server.server", "desired_status"), + resource.TestCheckNoResourceAttr("stackit_server.server", "user_data"), + resource.TestCheckNoResourceAttr("stackit_server.server", "keypair_name"), + resource.TestCheckNoResourceAttr("stackit_server.server", "network_interfaces"), + resource.TestCheckResourceAttrSet("stackit_server.server", "created_at"), + resource.TestCheckResourceAttrSet("stackit_server.server", "launched_at"), + resource.TestCheckResourceAttrSet("stackit_server.server", "updated_at"), + ), + }, + // Data source + { + ConfigVariables: testConfigServerVarsMin, Config: fmt.Sprintf(` %s - - data "stackit_network" "network" { - project_id = stackit_network.network.project_id - network_id = stackit_network.network.network_id - } + %s data "stackit_server" "server" { project_id = stackit_server.server.project_id server_id = stackit_server.server.server_id } - - data "stackit_network_interface" "network_interface" { - project_id = stackit_network.network.project_id - network_id = stackit_network.network.network_id - network_interface_id = stackit_network_interface.network_interface.network_interface_id - } `, - testAccServerConfig( - networkResource["name"], - fmt.Sprintf( - "[%q]", - networkResource["nameserver0"], - ), - serverResource["name"], - serverResource["machine_type"], - networkInterfaceResource["tfName"], - networkInterfaceResource["name"], - ), + testutil.IaaSProviderConfig(), resourceServerMinConfig, ), Check: resource.ComposeAggregateTestCheckFunc( - // Instance - resource.TestCheckResourceAttr("data.stackit_network.network", "project_id", networkResource["project_id"]), - resource.TestCheckResourceAttrPair( - "stackit_network.network", "network_id", - "data.stackit_network.network", "network_id", - ), - resource.TestCheckResourceAttr("data.stackit_network.network", "name", networkResource["name"]), - resource.TestCheckResourceAttr("data.stackit_network.network", "nameservers.0", networkResource["nameserver0"]), - resource.TestCheckResourceAttr("data.stackit_network.network", "ipv4_gateway", networkResource["ipv4_gateway"]), - resource.TestCheckResourceAttr("data.stackit_network.network", "routed", networkResource["routed"]), - // Server - resource.TestCheckResourceAttr("data.stackit_server.server", "project_id", serverResource["project_id"]), + 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.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 + resource.TestCheckNoResourceAttr("data.stackit_server.server", "boot_volume.source_type"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "boot_volume.source_id"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "boot_volume.size"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "boot_volume.performance_class"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "boot_volume.source_type"), + resource.TestCheckResourceAttr("data.stackit_server.server", "boot_volume.delete_on_termination", "true"), + resource.TestCheckResourceAttrPair( + "data.stackit_server.server", "boot_volume.id", + "stackit_server.server", "boot_volume.id", + ), resource.TestCheckResourceAttrPair( - "stackit_server.server", "server_id", "data.stackit_server.server", "server_id", + "stackit_server.server", "server_id", ), - resource.TestCheckResourceAttr("data.stackit_server.server", "name", serverResource["name"]), - resource.TestCheckResourceAttr("data.stackit_server.server", "availability_zone", serverResource["availability_zone"]), - resource.TestCheckResourceAttr("data.stackit_server.server", "machine_type", serverResource["machine_type"]), - resource.TestCheckResourceAttr("data.stackit_server.server", "labels.label1", serverResource["label1"]), - - // Network Interface - resource.TestCheckResourceAttrPair( - "stackit_network_interface.network_interface", "project_id", - "stackit_network.network", "project_id", - ), - resource.TestCheckResourceAttrPair( - "stackit_network_interface.network_interface", "network_id", - "stackit_network.network", "network_id", - ), - resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "network_interface_id"), - resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "name", networkInterfaceResource["name"]), - // Boot volume - resource.TestCheckResourceAttrSet("data.stackit_server.server", "boot_volume.id"), - resource.TestCheckResourceAttr("data.stackit_server.server", "boot_volume.delete_on_termination", serverResource["delete_on_termination"]), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "image_id"), + resource.TestCheckResourceAttr("data.stackit_server.server", "labels.%", "0"), + resource.TestCheckResourceAttrSet("data.stackit_server.server", "server_id"), + resource.TestCheckResourceAttrSet("data.stackit_server.server", "availability_zone"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "desired_status"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "user_data"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "keypair_name"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "network_interfaces"), + resource.TestCheckResourceAttrSet("data.stackit_server.server", "created_at"), + resource.TestCheckResourceAttrSet("data.stackit_server.server", "launched_at"), + resource.TestCheckResourceAttrSet("data.stackit_server.server", "updated_at"), ), }, // Import { - ResourceName: "stackit_network.network", + ConfigVariables: testConfigServerVarsMin, + ResourceName: "stackit_server.server", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_server.server"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_server.server") + } + serverId, ok := r.Primary.Attributes["server_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute server_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, serverId), nil + }, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"boot_volume", "network_interfaces"}, // Field is not mapped as it is only relevant on creation + }, + // Update + { + ConfigVariables: testConfigServerVarsMinUpdated, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), 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.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"), + resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_id", testutil.ConvertConfigVariable(testConfigServerVarsMinUpdated["image_id"])), + resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.delete_on_termination", "true"), + resource.TestCheckNoResourceAttr("stackit_server.server", "boot_volume.performance_class"), + resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.size"), + resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.id"), + resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_type", "image"), + resource.TestCheckNoResourceAttr("stackit_server.server", "image_id"), + resource.TestCheckResourceAttr("stackit_server.server", "labels.%", "0"), + resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), + resource.TestCheckResourceAttrSet("stackit_server.server", "availability_zone"), + resource.TestCheckNoResourceAttr("stackit_server.server", "desired_status"), + resource.TestCheckNoResourceAttr("stackit_server.server", "user_data"), + resource.TestCheckNoResourceAttr("stackit_server.server", "keypair_name"), + resource.TestCheckNoResourceAttr("stackit_server.server", "network_interfaces"), + resource.TestCheckResourceAttrSet("stackit_server.server", "created_at"), + resource.TestCheckResourceAttrSet("stackit_server.server", "launched_at"), + resource.TestCheckResourceAttrSet("stackit_server.server", "updated_at"), + ), + }, + // Deletion is done by the framework implicitly + }, + }) +} + +func TestAccServerMax(t *testing.T) { + t.Logf("TestAccServerMax name: %s", testutil.ConvertConfigVariable(testConfigServerVarsMax["name"])) + resource.Test(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckDestroy, + Steps: []resource.TestStep{ + // Creation + { + ConfigVariables: testConfigServerVarsMax, + Config: fmt.Sprintf("%s\n%s\n%s", testutil.IaaSProviderConfig(), resourceServerMaxConfig, resourceServerMaxAttachmentConfig), + Check: resource.ComposeAggregateTestCheckFunc( + // Affinity group + resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["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"), + + // Volume base + resource.TestCheckResourceAttr("stackit_volume.base_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["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"])), + resource.TestCheckResourceAttr("stackit_volume.base_volume", "source.type", "image"), + resource.TestCheckResourceAttrSet("stackit_volume.base_volume", "volume_id"), + resource.TestCheckResourceAttrPair( + "stackit_volume.base_volume", "volume_id", + "stackit_server.server", "boot_volume.source_id", + ), + + // Volume data + resource.TestCheckResourceAttr("stackit_volume.data_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["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", "server_id"), + resource.TestCheckResourceAttrPair( + "stackit_server_volume_attach.data_volume_attachment", "server_id", + "stackit_server.server", "server_id", + ), + resource.TestCheckResourceAttrSet("stackit_server_volume_attach.data_volume_attachment", "volume_id"), + resource.TestCheckResourceAttrPair( + "stackit_volume.data_volume", "volume_id", + "stackit_server_volume_attach.data_volume_attachment", "volume_id", + ), + + // Network + resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["name"])), + + // Network interface init + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_init", "project_id", + "stackit_network.network", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_init", "network_id", + "stackit_network.network", "network_id", + ), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_init", "network_interface_id"), + + // Network interface second + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_second", "project_id", + "stackit_network.network", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_second", "network_id", + "stackit_network.network", "network_id", + ), + 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.TestCheckResourceAttrPair( + "stackit_server_network_interface_attach.network_interface_second_attachment", "network_interface_id", + "stackit_network_interface.network_interface_second", "network_interface_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_server_network_interface_attach.network_interface_second_attachment", "server_id", + "stackit_server.server", "server_id", + ), + + // Keypair + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["name_not_updated"])), + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "public_key", testutil.ConvertConfigVariable(testConfigServerVarsMax["public_key"])), + + // Service account attachment + resource.TestCheckResourceAttrPair( + "stackit_server_service_account_attach.attached_service_account", "project_id", + "stackit_server.server", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_server_service_account_attach.attached_service_account", "server_id", + "stackit_server.server", "server_id", + ), + resource.TestCheckResourceAttr( + "stackit_server_service_account_attach.attached_service_account", "service_account_email", + testutil.ConvertConfigVariable(testConfigServerVarsMax["service_account_mail"]), + ), + + // Server + resource.TestCheckResourceAttr("stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), + resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMax["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( + "stackit_server.server", "affinity_group", + "stackit_affinity_group.affinity_group", "affinity_group_id", + ), + resource.TestCheckResourceAttr("stackit_server.server", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMax["availability_zone"])), + resource.TestCheckResourceAttrPair( + "stackit_key_pair.key_pair", "name", + "stackit_server.server", "keypair_name", + ), + // The network interface which was attached by "stackit_server_network_interface_attach" should not appear here + resource.TestCheckResourceAttr("stackit_server.server", "network_interfaces.#", "1"), + resource.TestCheckResourceAttrPair( + "stackit_server.server", "network_interfaces.0", + "stackit_network_interface.network_interface_init", "network_interface_id", + ), + resource.TestCheckResourceAttr("stackit_server.server", "user_data", testutil.ConvertConfigVariable(testConfigServerVarsMax["user_data"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.id"), + resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_type", "volume"), + resource.TestCheckResourceAttrPair( + "stackit_server.server", "boot_volume.source_id", + "stackit_volume.base_volume", "volume_id", + ), + resource.TestCheckResourceAttr("stackit_server.server", "labels.acc-test", testutil.ConvertConfigVariable(testConfigServerVarsMax["label"])), + ), + }, + // Data source + { + ConfigVariables: testConfigServerVarsMax, + Config: fmt.Sprintf(` + %s + %s + %s + + data "stackit_server" "server" { + project_id = stackit_server.server.project_id + server_id = stackit_server.server.server_id + } + `, + testutil.IaaSProviderConfig(), resourceServerMaxConfig, resourceServerMaxAttachmentConfig, + ), + Check: resource.ComposeAggregateTestCheckFunc( + // Server + resource.TestCheckResourceAttr("data.stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMax["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", "machine_type", testutil.ConvertConfigVariable(testConfigServerVarsMax["machine_type"])), + resource.TestCheckResourceAttrPair( + "data.stackit_server.server", "affinity_group", + "stackit_affinity_group.affinity_group", "affinity_group_id", + ), + resource.TestCheckResourceAttr("data.stackit_server.server", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMax["availability_zone"])), + resource.TestCheckResourceAttrPair( + "stackit_key_pair.key_pair", "name", + "data.stackit_server.server", "keypair_name", + ), + // All network interface which was are attached appear here + resource.TestCheckResourceAttr("data.stackit_server.server", "network_interfaces.#", "2"), + resource.TestCheckTypeSetElemAttrPair( + "data.stackit_server.server", "network_interfaces.*", + "stackit_network_interface.network_interface_init", "network_interface_id", + ), + resource.TestCheckTypeSetElemAttrPair( + "data.stackit_server.server", "network_interfaces.*", + "stackit_network_interface.network_interface_second", "network_interface_id", + ), + resource.TestCheckResourceAttr("data.stackit_server.server", "user_data", testutil.ConvertConfigVariable(testConfigServerVarsMax["user_data"])), + resource.TestCheckResourceAttrSet("data.stackit_server.server", "boot_volume.id"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "boot_volume.source_type"), + resource.TestCheckNoResourceAttr("data.stackit_server.server", "boot_volume.source_id"), + resource.TestCheckResourceAttr("data.stackit_server.server", "labels.acc-test", testutil.ConvertConfigVariable(testConfigServerVarsMax["label"])), + ), + }, + // Import + { + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_affinity_group.affinity_group", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_affinity_group.affinity_group"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_affinity_group.affinity_group") + } + 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", testutil.ProjectId, affinityGroupId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_volume.base_volume", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_volume.base_volume"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_volume.base_volume") + } + volumeId, ok := r.Primary.Attributes["volume_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute volume_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, volumeId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_volume.data_volume", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_volume.data_volume"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_volume.data_volume") + } + volumeId, ok := r.Primary.Attributes["volume_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute volume_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, volumeId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_server_volume_attach.data_volume_attachment", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_server_volume_attach.data_volume_attachment"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_server_volume_attach.data_volume_attachment") + } + serverId, ok := r.Primary.Attributes["server_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute server_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, serverId, volumeId), nil + }, + ImportState: true, + ImportStateVerify: false, + }, + { + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_network.network", ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_network.network"] if !ok { @@ -1012,28 +1707,12 @@ func TestAccServer(t *testing.T) { ImportStateVerifyIgnore: []string{"ipv4_prefix_length", "ipv4_prefix"}, // Field is not returned by the API }, { - ResourceName: "stackit_server.server", + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_network_interface.network_interface_init", ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources["stackit_server.server"] + r, ok := s.RootModule().Resources["stackit_network_interface.network_interface_init"] if !ok { - return "", fmt.Errorf("couldn't find resource stackit_server.server") - } - serverId, ok := r.Primary.Attributes["server_id"] - if !ok { - return "", fmt.Errorf("couldn't find attribute server_id") - } - return fmt.Sprintf("%s,%s", testutil.ProjectId, serverId), nil - }, - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"boot_volume", "user_data", "network_interfaces"}, // Field is not mapped as it is only relevant on creation - }, - { - ResourceName: "stackit_network_interface.network_interface", - ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources["stackit_network_interface.network_interface"] - if !ok { - return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface") + return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface_init") } networkId, ok := r.Primary.Attributes["network_id"] if !ok { @@ -1049,11 +1728,12 @@ func TestAccServer(t *testing.T) { ImportStateVerify: true, }, { - ResourceName: networkInterfaceSecSchemaName, + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_network_interface.network_interface_second", ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources[networkInterfaceSecSchemaName] + r, ok := s.RootModule().Resources["stackit_network_interface.network_interface_second"] if !ok { - return "", fmt.Errorf("couldn't find resource stackit_network_interface.%s", nicAttachTfName) + return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface_second") } networkId, ok := r.Primary.Attributes["network_id"] if !ok { @@ -1069,11 +1749,12 @@ func TestAccServer(t *testing.T) { ImportStateVerify: true, }, { - ResourceName: "stackit_server_network_interface_attach.attach_nic", + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_server_network_interface_attach.network_interface_second_attachment", ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources["stackit_server_network_interface_attach.attach_nic"] + r, ok := s.RootModule().Resources["stackit_server_network_interface_attach.network_interface_second_attachment"] if !ok { - return "", fmt.Errorf("couldn't find resource stackit_network_interface.%s", nicAttachTfName) + return "", fmt.Errorf("couldn't find resource stackit_server_network_interface_attach.network_interface_second_attachment") } serverId, ok := r.Primary.Attributes["server_id"] if !ok { @@ -1089,31 +1770,29 @@ func TestAccServer(t *testing.T) { ImportStateVerify: false, }, { - ResourceName: "stackit_server_volume_attach.attach_volume", + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_key_pair.key_pair", ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources["stackit_server_volume_attach.attach_volume"] + r, ok := s.RootModule().Resources["stackit_key_pair.key_pair"] if !ok { - return "", fmt.Errorf("couldn't find resource stackit_server_volume_attach.attach_volume") + return "", fmt.Errorf("couldn't find resource stackit_key_pair.key_pair") } - serverId, ok := r.Primary.Attributes["server_id"] + keyPairName, ok := r.Primary.Attributes["name"] if !ok { - return "", fmt.Errorf("couldn't find attribute server_id") + return "", fmt.Errorf("couldn't find attribute name") } - 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, serverId, volumeId), nil + return keyPairName, nil }, ImportState: true, - ImportStateVerify: false, + ImportStateVerify: true, }, { - ResourceName: "stackit_server_service_account_attach.attach_sa", + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_server_service_account_attach.attached_service_account", ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources["stackit_server_service_account_attach.attach_sa"] + r, ok := s.RootModule().Resources["stackit_server_service_account_attach.attached_service_account"] if !ok { - return "", fmt.Errorf("couldn't find resource stackit_server_service_account_attach.attach_sa") + return "", fmt.Errorf("couldn't find resource stackit_server_service_account_attach.attached_service_account") } serverId, ok := r.Primary.Attributes["server_id"] if !ok { @@ -1128,84 +1807,232 @@ func TestAccServer(t *testing.T) { ImportState: true, ImportStateVerify: false, }, + { + ConfigVariables: testConfigServerVarsMax, + ResourceName: "stackit_server.server", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_server.server"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_server.server") + } + serverId, ok := r.Primary.Attributes["server_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute server_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, serverId), nil + }, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"boot_volume", "desired_status", "network_interfaces"}, // Field is not mapped as it is only relevant on creation + }, // Update { - Config: testAccServerConfig( - fmt.Sprintf("%s-updated", networkResource["name"]), - fmt.Sprintf( - "[%q, %q]", - networkResource["nameserver0"], - networkResource["nameserver1"], - ), - fmt.Sprintf("%s-updated", serverResource["name"]), - updatedServerMachineType, - networkInterfaceResource["tfName"], - fmt.Sprintf("%s-updated", networkInterfaceResource["name"]), - ), + ConfigVariables: testConfigServerVarsMaxUpdated, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceServerMaxConfig), Check: resource.ComposeAggregateTestCheckFunc( + // Affinity group + resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["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"), + + // Volume base + resource.TestCheckResourceAttr("stackit_volume.base_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["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"])), + resource.TestCheckResourceAttr("stackit_volume.base_volume", "source.type", "image"), + resource.TestCheckResourceAttrSet("stackit_volume.base_volume", "volume_id"), + resource.TestCheckResourceAttrPair( + "stackit_volume.base_volume", "volume_id", + "stackit_server.server", "boot_volume.source_id", + ), + + // Volume data + resource.TestCheckResourceAttr("stackit_volume.data_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["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", networkResource["project_id"]), + resource.TestCheckResourceAttr("stackit_network.network", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["project_id"])), resource.TestCheckResourceAttrSet("stackit_network.network", "network_id"), - resource.TestCheckResourceAttr("stackit_network.network", "name", fmt.Sprintf("%s-updated", networkResource["name"])), - resource.TestCheckResourceAttr("stackit_network.network", "nameservers.#", "2"), - resource.TestCheckTypeSetElemAttr("stackit_network.network", "nameservers.*", networkResource["nameserver0"]), - resource.TestCheckTypeSetElemAttr("stackit_network.network", "nameservers.*", networkResource["nameserver1"]), - resource.TestCheckResourceAttr("stackit_network.network", "ipv4_gateway", networkResource["ipv4_gateway"]), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["name"])), - // Server - resource.TestCheckResourceAttr("stackit_server.server", "project_id", serverResource["project_id"]), - resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), - resource.TestCheckResourceAttr("stackit_server.server", "name", fmt.Sprintf("%s-updated", serverResource["name"])), - resource.TestCheckResourceAttr("stackit_server.server", "availability_zone", serverResource["availability_zone"]), - resource.TestCheckResourceAttr("stackit_server.server", "machine_type", updatedServerMachineType), - resource.TestCheckResourceAttr("stackit_server.server", "labels.label1", serverResource["label1"]), - resource.TestCheckResourceAttr("stackit_server.server", "user_data", serverResource["user_data"]), - resource.TestCheckResourceAttrSet("stackit_server.server", "network_interfaces.0"), - resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.size", serverResource["size"]), - resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_type", serverResource["source_type"]), - resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_id", serverResource["source_id"]), - resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.delete_on_termination", serverResource["delete_on_termination"]), - - // Network interface + // Network interface init resource.TestCheckResourceAttrPair( - "stackit_network_interface.network_interface", "project_id", + "stackit_network_interface.network_interface_init", "project_id", "stackit_network.network", "project_id", ), resource.TestCheckResourceAttrPair( - "stackit_network_interface.network_interface", "network_id", + "stackit_network_interface.network_interface_init", "network_id", "stackit_network.network", "network_id", ), - resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "network_interface_id"), - resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "name", fmt.Sprintf("%s-updated", networkInterfaceResource["name"])), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_init", "network_interface_id"), - // Network Interface second + // Network interface second resource.TestCheckResourceAttrPair( - networkInterfaceSecSchemaName, "project_id", + "stackit_network_interface.network_interface_second", "project_id", "stackit_network.network", "project_id", ), resource.TestCheckResourceAttrPair( - networkInterfaceSecSchemaName, "network_id", + "stackit_network_interface.network_interface_second", "network_id", "stackit_network.network", "network_id", ), - resource.TestCheckResourceAttrSet(networkInterfaceSecSchemaName, "network_interface_id"), - resource.TestCheckResourceAttr( - networkInterfaceSecSchemaName, "name", - fmt.Sprintf("%s-%s", fmt.Sprintf("%s-updated", networkInterfaceResource["name"]), nicAttachTfName), - ), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_second", "network_interface_id"), - // Network Interface Attachment + // Keypair + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["name_not_updated"])), + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "public_key", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["public_key"])), + + // Service account attachment resource.TestCheckResourceAttrPair( - "stackit_server_network_interface_attach.attach_nic", "project_id", - networkInterfaceSecSchemaName, "project_id", + "stackit_server_service_account_attach.attached_service_account", "project_id", + "stackit_server.server", "project_id", ), resource.TestCheckResourceAttrPair( - "stackit_server_network_interface_attach.attach_nic", "server_id", + "stackit_server_service_account_attach.attached_service_account", "server_id", "stackit_server.server", "server_id", ), - resource.TestCheckResourceAttrPair( - "stackit_server_network_interface_attach.attach_nic", "network_interface_id", - networkInterfaceSecSchemaName, "network_interface_id", + resource.TestCheckResourceAttr( + "stackit_server_service_account_attach.attached_service_account", "service_account_email", + testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["service_account_mail"]), ), + + // Server + resource.TestCheckResourceAttr("stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), + resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["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( + "stackit_server.server", "affinity_group", + "stackit_affinity_group.affinity_group", "affinity_group_id", + ), + resource.TestCheckResourceAttr("stackit_server.server", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["availability_zone"])), + resource.TestCheckResourceAttrPair( + "stackit_key_pair.key_pair", "name", + "stackit_server.server", "keypair_name", + ), + // The network interface which was attached by "stackit_server_network_interface_attach" should not appear here + resource.TestCheckResourceAttr("stackit_server.server", "network_interfaces.#", "1"), + resource.TestCheckResourceAttrPair( + "stackit_server.server", "network_interfaces.0", + "stackit_network_interface.network_interface_init", "network_interface_id", + ), + resource.TestCheckResourceAttr("stackit_server.server", "user_data", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["user_data"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.id"), + resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_type", "volume"), + resource.TestCheckResourceAttrPair( + "stackit_server.server", "boot_volume.source_id", + "stackit_volume.base_volume", "volume_id", + ), + resource.TestCheckResourceAttr("stackit_server.server", "labels.acc-test", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdated["label"])), + ), + }, + // Updated desired status + { + ConfigVariables: testConfigServerVarsMaxUpdatedDesiredStatus, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceServerMaxConfig), + Check: resource.ComposeAggregateTestCheckFunc( + // Affinity group + resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["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"), + + // Volume base + resource.TestCheckResourceAttr("stackit_volume.base_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["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"])), + resource.TestCheckResourceAttr("stackit_volume.base_volume", "source.type", "image"), + resource.TestCheckResourceAttrSet("stackit_volume.base_volume", "volume_id"), + resource.TestCheckResourceAttrPair( + "stackit_volume.base_volume", "volume_id", + "stackit_server.server", "boot_volume.source_id", + ), + + // Volume data + resource.TestCheckResourceAttr("stackit_volume.data_volume", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["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", "network_id"), + resource.TestCheckResourceAttr("stackit_network.network", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["name"])), + + // Network interface init + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_init", "project_id", + "stackit_network.network", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_init", "network_id", + "stackit_network.network", "network_id", + ), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_init", "network_interface_id"), + + // Network interface second + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_second", "project_id", + "stackit_network.network", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_second", "network_id", + "stackit_network.network", "network_id", + ), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface_second", "network_interface_id"), + + // Keypair + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["name_not_updated"])), + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "public_key", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["public_key"])), + + // Service account attachment + resource.TestCheckResourceAttrPair( + "stackit_server_service_account_attach.attached_service_account", "project_id", + "stackit_server.server", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_server_service_account_attach.attached_service_account", "server_id", + "stackit_server.server", "server_id", + ), + resource.TestCheckResourceAttr( + "stackit_server_service_account_attach.attached_service_account", "service_account_email", + testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["service_account_mail"]), + ), + + // Server + resource.TestCheckResourceAttr("stackit_server.server", "project_id", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["project_id"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "server_id"), + resource.TestCheckResourceAttr("stackit_server.server", "name", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["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( + "stackit_server.server", "affinity_group", + "stackit_affinity_group.affinity_group", "affinity_group_id", + ), + resource.TestCheckResourceAttr("stackit_server.server", "availability_zone", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["availability_zone"])), + resource.TestCheckResourceAttrPair( + "stackit_key_pair.key_pair", "name", + "stackit_server.server", "keypair_name", + ), + // The network interface which was attached by "stackit_server_network_interface_attach" should not appear here + resource.TestCheckResourceAttr("stackit_server.server", "network_interfaces.#", "1"), + resource.TestCheckResourceAttrPair( + "stackit_server.server", "network_interfaces.0", + "stackit_network_interface.network_interface_init", "network_interface_id", + ), + resource.TestCheckResourceAttr("stackit_server.server", "user_data", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["user_data"])), + resource.TestCheckResourceAttrSet("stackit_server.server", "boot_volume.id"), + resource.TestCheckResourceAttr("stackit_server.server", "boot_volume.source_type", "volume"), + resource.TestCheckResourceAttrPair( + "stackit_server.server", "boot_volume.source_id", + "stackit_volume.base_volume", "volume_id", + ), + resource.TestCheckResourceAttr("stackit_server.server", "labels.acc-test", testutil.ConvertConfigVariable(testConfigServerVarsMaxUpdatedDesiredStatus["label"])), ), }, // Deletion is done by the framework implicitly @@ -1213,25 +2040,88 @@ func TestAccServer(t *testing.T) { }) } -func TestAccIaaSSecurityGroup(t *testing.T) { - resource.Test(t, resource.TestCase{ +func TestAccAffinityGroupMin(t *testing.T) { + t.Logf("TestAccAffinityGroupMin name: %s", testutil.ConvertConfigVariable(testConfigAffinityGroupVarsMin["name"])) + resource.ParallelTest(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, - CheckDestroy: testAccCheckIaaSSecurityGroupDestroy, + CheckDestroy: testAccCheckDestroy, + Steps: []resource.TestStep{ + // Creation + { + ConfigVariables: testConfigAffinityGroupVarsMin, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceAffinityGroupMinConfig), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "project_id", testutil.ConvertConfigVariable(testConfigAffinityGroupVarsMin["project_id"])), + resource.TestCheckResourceAttrSet("stackit_affinity_group.affinity_group", "affinity_group_id"), + resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "name", testutil.ConvertConfigVariable(testConfigAffinityGroupVarsMin["name"])), + resource.TestCheckResourceAttr("stackit_affinity_group.affinity_group", "policy", testutil.ConvertConfigVariable(testConfigAffinityGroupVarsMin["policy"])), + resource.TestCheckNoResourceAttr("stackit_affinity_group.affinity_group", "members.#"), + ), + }, + // Data source + { + ConfigVariables: testConfigAffinityGroupVarsMin, + Config: fmt.Sprintf(` + %s + %s + + data "stackit_affinity_group" "affinity_group" { + project_id = stackit_affinity_group.affinity_group.project_id + affinity_group_id = stackit_affinity_group.affinity_group.affinity_group_id + } + `, + testutil.IaaSProviderConfig(), resourceAffinityGroupMinConfig, + ), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("data.stackit_affinity_group.affinity_group", "project_id", testutil.ConvertConfigVariable(testConfigAffinityGroupVarsMin["project_id"])), + resource.TestCheckResourceAttrPair( + "stackit_affinity_group.affinity_group", "affinity_group_id", + "data.stackit_affinity_group.affinity_group", "affinity_group_id", + ), + resource.TestCheckResourceAttr("data.stackit_affinity_group.affinity_group", "name", testutil.ConvertConfigVariable(testConfigAffinityGroupVarsMin["name"])), + ), + }, + // Import + { + ConfigVariables: testConfigAffinityGroupVarsMin, + ResourceName: "stackit_affinity_group.affinity_group", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_affinity_group.affinity_group"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_affinity_group.affinity_group") + } + 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", testutil.ProjectId, affinityGroupId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + // In this minimal setup, no update can be performed + // Deletion is done by the framework implicitly + }, + }) +} + +func TestAccIaaSSecurityGroupMin(t *testing.T) { + t.Logf("TestAccIaaSSecurityGroupMin name: %s", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMin["name"])) + resource.ParallelTest(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckDestroy, Steps: []resource.TestStep{ // Creation { - Config: resourceConfigSecurityGroup( - securityGroupResource["name"], - securityGroupRuleResource["direction"], - ), + ConfigVariables: testConfigSecurityGroupsVarsMin, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceSecurityGroupMinConfig), Check: resource.ComposeAggregateTestCheckFunc( // Security Group - resource.TestCheckResourceAttr("stackit_security_group.security_group", "project_id", securityGroupResource["project_id"]), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "project_id", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMin["project_id"])), resource.TestCheckResourceAttrSet("stackit_security_group.security_group", "security_group_id"), - resource.TestCheckResourceAttr("stackit_security_group.security_group", "name", securityGroupResource["name"]), - resource.TestCheckResourceAttr("stackit_security_group.security_group", "labels.label1", securityGroupResource["label1"]), - resource.TestCheckResourceAttr("stackit_security_group.security_group", "description", securityGroupResource["description"]), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMin["name"])), + resource.TestCheckResourceAttrSet("stackit_security_group.security_group", "stateful"), // Security Group Rule resource.TestCheckResourceAttrPair( @@ -1243,14 +2133,15 @@ func TestAccIaaSSecurityGroup(t *testing.T) { "stackit_security_group.security_group", "security_group_id", ), resource.TestCheckResourceAttrSet("stackit_security_group_rule.security_group_rule", "security_group_rule_id"), - resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "direction", securityGroupRuleResource["direction"]), - resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "description", securityGroupRuleResource["description"]), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMin["direction"])), ), }, // Data source { + ConfigVariables: testConfigSecurityGroupsVarsMin, Config: fmt.Sprintf(` %s + %s data "stackit_security_group" "security_group" { project_id = stackit_security_group.security_group.project_id @@ -1263,21 +2154,16 @@ func TestAccIaaSSecurityGroup(t *testing.T) { security_group_rule_id = stackit_security_group_rule.security_group_rule.security_group_rule_id } `, - resourceConfigSecurityGroup( - securityGroupResource["name"], - securityGroupRuleResource["direction"], - ), + testutil.IaaSProviderConfig(), resourceSecurityGroupMinConfig, ), Check: resource.ComposeAggregateTestCheckFunc( // Instance - resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "project_id", securityGroupResource["project_id"]), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "project_id", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMin["project_id"])), resource.TestCheckResourceAttrPair( "stackit_security_group.security_group", "security_group_id", "data.stackit_security_group.security_group", "security_group_id", ), - resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "name", securityGroupResource["name"]), - resource.TestCheckResourceAttr("stackit_security_group.security_group", "labels.label1", securityGroupResource["label1"]), - resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "description", securityGroupResource["description"]), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMin["name"])), // Security Group Rule resource.TestCheckResourceAttrPair( @@ -1289,13 +2175,13 @@ func TestAccIaaSSecurityGroup(t *testing.T) { "stackit_security_group.security_group", "security_group_id", ), resource.TestCheckResourceAttrSet("stackit_security_group_rule.security_group_rule", "security_group_rule_id"), - resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "direction", securityGroupRuleResource["direction"]), - resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "description", securityGroupRuleResource["description"]), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMin["direction"])), ), }, // Import { - ResourceName: "stackit_security_group.security_group", + ConfigVariables: testConfigSecurityGroupsVarsMin, + ResourceName: "stackit_security_group.security_group", ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_security_group.security_group"] if !ok { @@ -1311,7 +2197,8 @@ func TestAccIaaSSecurityGroup(t *testing.T) { ImportStateVerify: true, }, { - ResourceName: "stackit_security_group_rule.security_group_rule", + ConfigVariables: testConfigSecurityGroupsVarsMin, + ResourceName: "stackit_security_group_rule.security_group_rule", ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_security_group_rule.security_group_rule"] if !ok { @@ -1332,16 +2219,26 @@ func TestAccIaaSSecurityGroup(t *testing.T) { }, // Update { - Config: resourceConfigSecurityGroup( - fmt.Sprintf("%s-updated", securityGroupResource["name"]), - securityGroupRuleResource["direction"], - ), + ConfigVariables: testConfigSecurityGroupsVarsMinUpdated(), + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceSecurityGroupMinConfig), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_security_group.security_group", "project_id", securityGroupResource["project_id"]), + // Security Group + resource.TestCheckResourceAttr("stackit_security_group.security_group", "project_id", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMinUpdated()["project_id"])), resource.TestCheckResourceAttrSet("stackit_security_group.security_group", "security_group_id"), - resource.TestCheckResourceAttr("stackit_security_group.security_group", "name", fmt.Sprintf("%s-updated", securityGroupResource["name"])), - resource.TestCheckResourceAttr("stackit_security_group.security_group", "labels.label1", securityGroupResource["label1"]), - resource.TestCheckResourceAttr("stackit_security_group.security_group", "description", securityGroupResource["description"]), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMinUpdated()["name"])), + resource.TestCheckResourceAttrSet("stackit_security_group.security_group", "stateful"), + + // Security Group Rule + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "project_id", + "stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "security_group_id", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrSet("stackit_security_group_rule.security_group_rule", "security_group_rule_id"), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMinUpdated()["direction"])), ), }, // Deletion is done by the framework implicitly @@ -1349,91 +2246,507 @@ func TestAccIaaSSecurityGroup(t *testing.T) { }) } -func TestAccPublicIp(t *testing.T) { - resource.Test(t, resource.TestCase{ +func TestAccIaaSSecurityGroupMax(t *testing.T) { + t.Logf("TestAccIaaSSecurityGroupMax name: %s", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["name"])) + resource.ParallelTest(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, - CheckDestroy: testAccCheckIaaSPublicIpDestroy, + CheckDestroy: testAccCheckDestroy, Steps: []resource.TestStep{ // Creation { - Config: testAccPublicIpConfig( - networkResource["name"], - fmt.Sprintf( - "[%q]", - networkResource["nameserver0"], - ), - networkInterfaceResource["tfName"], - networkInterfaceResource["name"], - fmt.Sprintf(` - resource "stackit_public_ip" "public_ip" { - project_id = "%s" - labels = { - "label1" = "%s" - } - network_interface_id = %s - } - `, - publicIpResource["project_id"], - publicIpResource["label1"], - publicIpResource["network_interface_id"], - ), - ), + ConfigVariables: testConfigSecurityGroupsVarsMax, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceSecurityGroupMaxConfig), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "project_id", publicIpResource["project_id"]), - resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "public_ip_id"), - resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "labels.label1", publicIpResource["label1"]), - resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "network_interface_id"), + // Security Group (default) + resource.TestCheckResourceAttr("stackit_security_group.security_group", "project_id", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_security_group.security_group", "security_group_id"), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["name"])), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "description", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["description"])), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "stateful", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["stateful"])), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "labels.%", "1"), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "labels.acc-test", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["label"])), + + // Security Group (remote) + resource.TestCheckResourceAttr("stackit_security_group.security_group_remote", "project_id", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_security_group.security_group_remote", "security_group_id"), + resource.TestCheckResourceAttr("stackit_security_group.security_group_remote", "name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["name_remote"])), + + // Security Group Rule (default) + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "project_id", + "stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "security_group_id", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrSet("stackit_security_group_rule.security_group_rule", "security_group_rule_id"), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["direction"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "description", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["description_rule"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "ether_type", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["ether_type"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "port_range.min", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["port"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "port_range.max", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["port"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "protocol.name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["protocol"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "ip_range", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["ip_range"])), + + // Security Group Rule (icmp) + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule_icmp", "project_id", + "stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule_icmp", "security_group_id", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrSet("stackit_security_group_rule.security_group_rule_icmp", "security_group_rule_id"), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["direction"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "description", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["description_rule"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "ether_type", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["ether_type"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "icmp_parameters.code", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["icmp_code"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "icmp_parameters.type", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["icmp_type"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "protocol.name", "icmp"), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "ip_range", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["ip_range"])), + + // Security Group Rule (remote) + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "project_id", + "stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "security_group_id", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule_remote_security_group", "remote_security_group_id", + "stackit_security_group.security_group_remote", "security_group_id", + ), + resource.TestCheckResourceAttrSet("stackit_security_group_rule.security_group_rule", "security_group_rule_id"), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["direction"])), ), }, - // Data source { + ConfigVariables: testConfigSecurityGroupsVarsMax, Config: fmt.Sprintf(` - %s + %s + %s + + data "stackit_security_group" "security_group" { + project_id = stackit_security_group.security_group.project_id + security_group_id = stackit_security_group.security_group.security_group_id + } - data "stackit_public_ip" "public_ip" { - project_id = stackit_public_ip.public_ip.project_id - public_ip_id = stackit_public_ip.public_ip.public_ip_id - } - `, - testAccPublicIpConfig( - networkResource["name"], - fmt.Sprintf( - "[%q]", - networkResource["nameserver0"], - ), - networkInterfaceResource["tfName"], - networkInterfaceResource["name"], - fmt.Sprintf(` - resource "stackit_public_ip" "public_ip" { - project_id = "%s" - labels = { - "label1" = "%s" - } - network_interface_id = %s - } - `, - publicIpResource["project_id"], - publicIpResource["label1"], - publicIpResource["network_interface_id"], - ), - ), + data "stackit_security_group" "security_group_remote" { + project_id = stackit_security_group.security_group_remote.project_id + security_group_id = stackit_security_group.security_group_remote.security_group_id + } + + data "stackit_security_group_rule" "security_group_rule" { + project_id = stackit_security_group.security_group.project_id + security_group_id = stackit_security_group.security_group.security_group_id + security_group_rule_id = stackit_security_group_rule.security_group_rule.security_group_rule_id + } + + data "stackit_security_group_rule" "security_group_rule_icmp" { + project_id = stackit_security_group.security_group.project_id + security_group_id = stackit_security_group.security_group.security_group_id + security_group_rule_id = stackit_security_group_rule.security_group_rule_icmp.security_group_rule_id + } + + data "stackit_security_group_rule" "security_group_rule_remote_security_group" { + project_id = stackit_security_group.security_group.project_id + security_group_id = stackit_security_group.security_group.security_group_id + security_group_rule_id = stackit_security_group_rule.security_group_rule_remote_security_group.security_group_rule_id + } + `, + testutil.IaaSProviderConfig(), resourceSecurityGroupMaxConfig, ), Check: resource.ComposeAggregateTestCheckFunc( - // Instance - resource.TestCheckResourceAttr("data.stackit_public_ip.public_ip", "project_id", publicIpResource["project_id"]), + // Security Group (default) resource.TestCheckResourceAttrPair( - "stackit_public_ip.public_ip", "public_ip_id", - "data.stackit_public_ip.public_ip", "public_ip_id", + "data.stackit_security_group.security_group", "project_id", + "stackit_security_group.security_group", "project_id", ), - resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "labels.label1", publicIpResource["label1"]), - resource.TestCheckResourceAttrSet("data.stackit_public_ip.public_ip", "network_interface_id"), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group.security_group", "security_group_id", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "project_id", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_security_group.security_group", "security_group_id"), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["name"])), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "description", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["description"])), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "stateful", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["stateful"])), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "labels.%", "1"), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group", "labels.acc-test", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["label"])), + + // Security Group (remote) + resource.TestCheckResourceAttrPair( + "data.stackit_security_group.security_group_remote", "project_id", + "stackit_security_group.security_group_remote", "project_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group.security_group_remote", "security_group_id", + "stackit_security_group.security_group_remote", "security_group_id", + ), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group_remote", "project_id", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("data.stackit_security_group.security_group_remote", "security_group_id"), + resource.TestCheckResourceAttr("data.stackit_security_group.security_group_remote", "name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["name_remote"])), + + // Security Group Rule (default) + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule", "project_id", + "data.stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule", "security_group_id", + "data.stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule", "security_group_rule_id", + "stackit_security_group_rule.security_group_rule", "security_group_rule_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule", "project_id", + "stackit_security_group_rule.security_group_rule", "project_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule", "security_group_id", + "stackit_security_group_rule.security_group_rule", "security_group_id", + ), + resource.TestCheckResourceAttrSet("data.stackit_security_group_rule.security_group_rule", "security_group_rule_id"), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["direction"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "description", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["description_rule"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "ether_type", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["ether_type"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "port_range.min", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["port"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "port_range.max", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["port"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "protocol.name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["protocol"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "ip_range", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["ip_range"])), + + // Security Group Rule (icmp) + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_icmp", "project_id", + "data.stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_icmp", "security_group_id", + "data.stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_icmp", "security_group_rule_id", + "stackit_security_group_rule.security_group_rule_icmp", "security_group_rule_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_icmp", "project_id", + "stackit_security_group_rule.security_group_rule_icmp", "project_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_icmp", "security_group_id", + "stackit_security_group_rule.security_group_rule_icmp", "security_group_id", + ), + resource.TestCheckResourceAttrSet("data.stackit_security_group_rule.security_group_rule_icmp", "security_group_rule_id"), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule_icmp", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["direction"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule_icmp", "description", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["description_rule"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule_icmp", "ether_type", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["ether_type"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule_icmp", "icmp_parameters.code", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["icmp_code"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule_icmp", "icmp_parameters.type", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["icmp_type"])), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule_icmp", "protocol.name", "icmp"), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule_icmp", "ip_range", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["ip_range"])), + + // Security Group Rule (remote) + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_remote_security_group", "project_id", + "data.stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_remote_security_group", "security_group_id", + "data.stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_remote_security_group", "security_group_rule_id", + "stackit_security_group_rule.security_group_rule_remote_security_group", "security_group_rule_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_remote_security_group", "project_id", + "stackit_security_group_rule.security_group_rule_remote_security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_remote_security_group", "security_group_id", + "stackit_security_group_rule.security_group_rule_remote_security_group", "security_group_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_remote_security_group", "remote_security_group_id", + "stackit_security_group_rule.security_group_rule_remote_security_group", "remote_security_group_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_security_group_rule.security_group_rule_remote_security_group", "remote_security_group_id", + "data.stackit_security_group.security_group_remote", "security_group_id", + ), + resource.TestCheckResourceAttrSet("data.stackit_security_group_rule.security_group_rule", "security_group_rule_id"), + resource.TestCheckResourceAttr("data.stackit_security_group_rule.security_group_rule", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMax["direction"])), ), }, // Import { - ResourceName: "stackit_public_ip.public_ip", + ConfigVariables: testConfigSecurityGroupsVarsMax, + ResourceName: "stackit_security_group.security_group", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_security_group.security_group"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_security_group.security_group") + } + securityGroupId, ok := r.Primary.Attributes["security_group_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute security_group_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, securityGroupId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigSecurityGroupsVarsMax, + ResourceName: "stackit_security_group_rule.security_group_rule", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_security_group_rule.security_group_rule"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_security_group_rule.security_group_rule") + } + securityGroupId, ok := r.Primary.Attributes["security_group_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute security_group_id") + } + securityGroupRuleId, ok := r.Primary.Attributes["security_group_rule_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute security_group_rule_id") + } + return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, securityGroupId, securityGroupRuleId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + // Update + { + ConfigVariables: testConfigSecurityGroupsVarsMaxUpdated(), + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceSecurityGroupMaxConfig), + Check: resource.ComposeAggregateTestCheckFunc( + // Security Group (default) + resource.TestCheckResourceAttr("stackit_security_group.security_group", "project_id", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["project_id"])), + resource.TestCheckResourceAttrSet("stackit_security_group.security_group", "security_group_id"), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["name"])), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "description", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["description"])), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "stateful", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["stateful"])), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "labels.%", "1"), + resource.TestCheckResourceAttr("stackit_security_group.security_group", "labels.acc-test", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["label"])), + + // Security Group (remote) + resource.TestCheckResourceAttr("stackit_security_group.security_group_remote", "project_id", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["project_id"])), + resource.TestCheckResourceAttrSet("stackit_security_group.security_group_remote", "security_group_id"), + resource.TestCheckResourceAttr("stackit_security_group.security_group_remote", "name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["name_remote"])), + + // Security Group Rule (default) + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "project_id", + "stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "security_group_id", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrSet("stackit_security_group_rule.security_group_rule", "security_group_rule_id"), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["direction"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "description", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["description_rule"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "ether_type", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["ether_type"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "port_range.min", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["port"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "port_range.max", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["port"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "protocol.name", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["protocol"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "ip_range", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["ip_range"])), + + // Security Group Rule (icmp) + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule_icmp", "project_id", + "stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule_icmp", "security_group_id", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrSet("stackit_security_group_rule.security_group_rule_icmp", "security_group_rule_id"), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["direction"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "description", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["description_rule"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "ether_type", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["ether_type"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "icmp_parameters.code", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["icmp_code"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "icmp_parameters.type", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["icmp_type"])), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "protocol.name", "icmp"), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule_icmp", "ip_range", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["ip_range"])), + + // Security Group Rule (remote) + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "project_id", + "stackit_security_group.security_group", "project_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule", "security_group_id", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_security_group_rule.security_group_rule_remote_security_group", "remote_security_group_id", + "stackit_security_group.security_group_remote", "security_group_id", + ), + resource.TestCheckResourceAttrSet("stackit_security_group_rule.security_group_rule", "security_group_rule_id"), + resource.TestCheckResourceAttr("stackit_security_group_rule.security_group_rule", "direction", testutil.ConvertConfigVariable(testConfigSecurityGroupsVarsMaxUpdated()["direction"])), + ), + }, + // Deletion is done by the framework implicitly + }, + }) +} + +func TestAccNetworkInterfaceMin(t *testing.T) { + t.Logf("TestAccNetworkInterfaceMin name: %s", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMin["name"])) + resource.ParallelTest(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckDestroy, + Steps: []resource.TestStep{ + // Creation + { + ConfigVariables: testConfigNetworkInterfaceVarsMin, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceNetworkInterfaceMinConfig), + 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", "ipv4"), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "allowed_addresses.#"), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "security", "true"), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "labels.#", "0"), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "security_group_ids.#", "0"), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "mac"), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "network_interface_id"), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "type"), + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface", "network_id", + "stackit_network.network", "network_id", + ), + + // 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", "ipv4_prefixes.#"), + resource.TestCheckResourceAttrSet("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", "public_ip_id"), + resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "ip"), + resource.TestCheckNoResourceAttr("stackit_public_ip.public_ip", "network_interface_id"), + resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "labels.%", "0"), + ), + }, + // Data source + { + ConfigVariables: testConfigNetworkInterfaceVarsMin, + Config: fmt.Sprintf(` + %s + %s + + data "stackit_network_interface" "network_interface" { + project_id = stackit_network_interface.network_interface.project_id + network_id = stackit_network_interface.network_interface.network_id + network_interface_id = stackit_network_interface.network_interface.network_interface_id + } + + data "stackit_network" "network" { + project_id = stackit_network.network.project_id + network_id = stackit_network.network.network_id + } + + data "stackit_public_ip" "public_ip" { + project_id = stackit_public_ip.public_ip.project_id + public_ip_id = stackit_public_ip.public_ip.public_ip_id + } + `, + testutil.IaaSProviderConfig(), resourceNetworkInterfaceMinConfig, + ), + Check: resource.ComposeAggregateTestCheckFunc( + // Network interface instance + resource.TestCheckNoResourceAttr("data.stackit_network_interface.network_interface", "name"), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface", "ipv4"), + resource.TestCheckNoResourceAttr("data.stackit_network_interface.network_interface", "allowed_addresses.#"), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "security", "true"), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "labels.#", "0"), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "security_group_ids.#", "0"), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface", "mac"), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface", "network_interface_id"), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface", "type"), + + // 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", "ipv4_prefixes.#"), + resource.TestCheckResourceAttrSet("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.TestCheckResourceAttrPair( + "data.stackit_public_ip.public_ip", "public_ip_id", + "stackit_public_ip.public_ip", "public_ip_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_public_ip.public_ip", "ip", + "stackit_public_ip.public_ip", "ip", + ), + resource.TestCheckNoResourceAttr("data.stackit_public_ip.public_ip", "network_interface_id"), + resource.TestCheckResourceAttr("data.stackit_public_ip.public_ip", "labels.%", "0"), + ), + }, + + // Import + { + ConfigVariables: testConfigNetworkInterfaceVarsMin, + ResourceName: "stackit_network_interface.network_interface", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_network_interface.network_interface"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface") + } + networkId, ok := r.Primary.Attributes["network_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_id") + } + networkInterfaceId, ok := r.Primary.Attributes["network_interface_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_interface_id") + } + return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, networkId, networkInterfaceId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigNetworkInterfaceVarsMin, + ResourceName: "stackit_network.network", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_network.network"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_network.network") + } + networkId, ok := r.Primary.Attributes["network_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, networkId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigNetworkInterfaceVarsMin, + ResourceName: "stackit_public_ip.public_ip", ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_public_ip.public_ip"] if !ok { @@ -1448,33 +2761,397 @@ func TestAccPublicIp(t *testing.T) { ImportState: true, ImportStateVerify: true, }, - // Update + // In this minimal setup, no update can be performed + // Deletion is done by the framework implicitly + }, + }) +} + +func TestAccNetworkInterfaceMax(t *testing.T) { + t.Logf("TestAccNetworkInterfaceMax name: %s", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["name"])) + resource.ParallelTest(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckDestroy, + Steps: []resource.TestStep{ + // Creation { - Config: testAccPublicIpConfig( - networkResource["name"], - fmt.Sprintf( - "[%q]", - networkResource["nameserver0"], + ConfigVariables: testConfigNetworkInterfaceVarsMax, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), 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.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"])), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "security", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["security"])), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "labels.%", "1"), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["label"])), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "security_group_ids.#", "1"), + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface", "network_id", + "stackit_network.network", "network_id", ), - networkInterfaceResource["tfName"], - networkInterfaceResource["name"], - fmt.Sprintf(` - resource "stackit_public_ip" "public_ip" { - project_id = "%s" - labels = { - "label1" = "%s" - } - } - `, - publicIpResource["project_id"], - publicIpResource["label1"], + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface", "security_group_ids.0", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "mac"), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "network_interface_id"), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "type"), + + // 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", "ipv4_prefixes.#"), + resource.TestCheckResourceAttrSet("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", "public_ip_id"), + resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "ip"), + resource.TestCheckResourceAttrPair( + "stackit_public_ip.public_ip", "network_interface_id", + "stackit_network_interface.network_interface", "network_interface_id", + ), + resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "labels.%", "1"), + 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", "network_interface_id"), + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_simple", "network_id", + "stackit_network.network", "network_id", + ), + + // 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", "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.TestCheckResourceAttrPair( + "stackit_public_ip_associate.nic_public_ip_attach", "public_ip_id", + "stackit_public_ip.public_ip_simple", "public_ip_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_public_ip_associate.nic_public_ip_attach", "network_interface_id", + "stackit_network_interface.network_interface_simple", "network_interface_id", ), ), + }, + // Data source + { + ConfigVariables: testConfigNetworkInterfaceVarsMax, + Config: fmt.Sprintf(` + %s + %s + + data "stackit_network_interface" "network_interface" { + project_id = stackit_network_interface.network_interface.project_id + network_id = stackit_network_interface.network_interface.network_id + network_interface_id = stackit_network_interface.network_interface.network_interface_id + } + + data "stackit_network" "network" { + project_id = stackit_network.network.project_id + network_id = stackit_network.network.network_id + } + + data "stackit_public_ip" "public_ip" { + project_id = stackit_public_ip.public_ip.project_id + public_ip_id = stackit_public_ip.public_ip.public_ip_id + } + + data "stackit_network_interface" "network_interface_simple" { + project_id = stackit_network_interface.network_interface_simple.project_id + network_id = stackit_network_interface.network_interface_simple.network_id + network_interface_id = stackit_network_interface.network_interface_simple.network_interface_id + } + + data "stackit_public_ip" "public_ip_simple" { + project_id = stackit_public_ip.public_ip_simple.project_id + public_ip_id = stackit_public_ip.public_ip_simple.public_ip_id + } + `, + testutil.IaaSProviderConfig(), resourceNetworkInterfaceMaxConfig, + ), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "project_id", publicIpResource["project_id"]), + // Network interface instance + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "project_id", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["project_id"])), + resource.TestCheckResourceAttrPair( + "data.stackit_network_interface.network_interface", "project_id", + "stackit_network_interface.network_interface", "project_id", + ), + resource.TestCheckResourceAttrPair( + "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", "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"])), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "security", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["security"])), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "labels.%", "1"), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["label"])), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface", "security_group_ids.#", "1"), + resource.TestCheckResourceAttrPair( + "data.stackit_network_interface.network_interface", "security_group_ids.0", + "stackit_security_group.security_group", "security_group_id", + ), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface", "mac"), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface", "network_interface_id"), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface", "type"), + + // 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", "ipv4_prefixes.#"), + resource.TestCheckResourceAttrSet("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.TestCheckResourceAttrPair( + "data.stackit_public_ip.public_ip", "public_ip_id", + "stackit_public_ip.public_ip", "public_ip_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_public_ip.public_ip", "ip", + "stackit_public_ip.public_ip", "ip", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_public_ip.public_ip", "network_interface_id", + "data.stackit_network_interface.network_interface", "network_interface_id", + ), + resource.TestCheckResourceAttr("data.stackit_public_ip.public_ip", "labels.%", "1"), + resource.TestCheckResourceAttr("data.stackit_public_ip.public_ip", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMax["label"])), + + // Network interface simple + resource.TestCheckNoResourceAttr("data.stackit_network_interface.network_interface_simple", "name"), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface_simple", "ipv4"), + resource.TestCheckNoResourceAttr("data.stackit_network_interface.network_interface_simple", "allowed_addresses.#"), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface_simple", "security", "true"), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface_simple", "labels.#", "0"), + resource.TestCheckResourceAttr("data.stackit_network_interface.network_interface_simple", "security_group_ids.#", "0"), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface_simple", "mac"), + resource.TestCheckResourceAttrSet("data.stackit_network_interface.network_interface_simple", "network_interface_id"), + 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.TestCheckResourceAttrPair( + "data.stackit_public_ip.public_ip_simple", "public_ip_id", + "stackit_public_ip.public_ip_simple", "public_ip_id", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_public_ip.public_ip_simple", "ip", + "stackit_public_ip.public_ip_simple", "ip", + ), + resource.TestCheckResourceAttrPair( + "data.stackit_public_ip.public_ip_simple", "network_interface_id", + "data.stackit_network_interface.network_interface_simple", "network_interface_id", + ), + resource.TestCheckResourceAttr("data.stackit_public_ip.public_ip_simple", "labels.%", "0"), + ), + }, + // Import + { + ConfigVariables: testConfigNetworkInterfaceVarsMax, + ResourceName: "stackit_network_interface.network_interface", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_network_interface.network_interface"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface") + } + networkId, ok := r.Primary.Attributes["network_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_id") + } + networkInterfaceId, ok := r.Primary.Attributes["network_interface_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_interface_id") + } + return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, networkId, networkInterfaceId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigNetworkInterfaceVarsMax, + ResourceName: "stackit_network.network", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_network.network"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_network.network") + } + networkId, ok := r.Primary.Attributes["network_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, networkId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigNetworkInterfaceVarsMax, + ResourceName: "stackit_public_ip.public_ip", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_public_ip.public_ip"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_public_ip.public_ip") + } + 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", testutil.ProjectId, publicIpId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigNetworkInterfaceVarsMax, + ResourceName: "stackit_network_interface.network_interface_simple", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_network_interface.network_interface_simple"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_network_interface.network_interface_simple") + } + networkId, ok := r.Primary.Attributes["network_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_id") + } + networkInterfaceId, ok := r.Primary.Attributes["network_interface_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_interface_id") + } + return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, networkId, networkInterfaceId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigNetworkInterfaceVarsMax, + ResourceName: "stackit_public_ip.public_ip_simple", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_public_ip.public_ip_simple"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_public_ip.public_ip_simple") + } + 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", testutil.ProjectId, publicIpId), nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigNetworkInterfaceVarsMax, + ResourceName: "stackit_public_ip_associate.nic_public_ip_attach", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_public_ip.public_ip"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_public_ip.public_ip") + } + publicIpId, ok := r.Primary.Attributes["public_ip_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute public_ip_id") + } + networkInterfaceId, ok := r.Primary.Attributes["network_interface_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute network_interface_id") + } + return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, 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.TestCheckResourceAttrPair( + "stackit_public_ip_associate.nic_public_ip_attach", "public_ip_id", + "stackit_public_ip.public_ip_simple", "public_ip_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_public_ip_associate.nic_public_ip_attach", "network_interface_id", + "stackit_network_interface.network_interface_simple", "network_interface_id", + ), + ), + }, + // Update + { + ConfigVariables: testConfigNetworkInterfaceVarsMaxUpdated, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), 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.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"])), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "labels.%", "1"), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "labels.acc-test", testutil.ConvertConfigVariable(testConfigNetworkInterfaceVarsMaxUpdated["label"])), + resource.TestCheckResourceAttr("stackit_network_interface.network_interface", "security_group_ids.#", "0"), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "mac"), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "network_interface_id"), + resource.TestCheckResourceAttrSet("stackit_network_interface.network_interface", "type"), + + // 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", "ipv4_prefixes.#"), + resource.TestCheckResourceAttrSet("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", "public_ip_id"), - resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "labels.label1", publicIpResource["label1"]), - resource.TestCheckNoResourceAttr("stackit_public_ip.public_ip", "network_interface_id"), + resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip", "ip"), + resource.TestCheckResourceAttrPair( + "stackit_public_ip.public_ip", "network_interface_id", + "stackit_network_interface.network_interface", "network_interface_id", + ), + resource.TestCheckResourceAttr("stackit_public_ip.public_ip", "labels.%", "1"), + 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", "network_interface_id"), + resource.TestCheckResourceAttrPair( + "stackit_network_interface.network_interface_simple", "network_id", + "stackit_network.network", "network_id", + ), + + // 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", "public_ip_id"), + resource.TestCheckResourceAttrSet("stackit_public_ip.public_ip_simple", "ip"), + resource.TestCheckResourceAttrPair( + "stackit_public_ip.public_ip_simple", "network_interface_id", + "stackit_network_interface.network_interface_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(testConfigNetworkInterfaceVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrPair( + "stackit_public_ip_associate.nic_public_ip_attach", "public_ip_id", + "stackit_public_ip.public_ip_simple", "public_ip_id", + ), + resource.TestCheckResourceAttrPair( + "stackit_public_ip_associate.nic_public_ip_attach", "network_interface_id", + "stackit_network_interface.network_interface_simple", "network_interface_id", + ), ), }, // Deletion is done by the framework implicitly @@ -1482,66 +3159,40 @@ func TestAccPublicIp(t *testing.T) { }) } -func TestAccKeyPair(t *testing.T) { - resource.Test(t, resource.TestCase{ +func TestAccKeyPairMin(t *testing.T) { + t.Logf("TestAccKeyPairMin name: %s", testutil.ConvertConfigVariable(testConfigKeyPairMin["name"])) + resource.ParallelTest(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, - CheckDestroy: testAccCheckIaaSKeyPairDestroy, + CheckDestroy: testAccCheckDestroy, Steps: []resource.TestStep{ - // Creation { - Config: testAccKeyPairConfig( - fmt.Sprintf(` - resource "stackit_key_pair" "key_pair" { - name = "%s" - public_key = "%s" - labels = { - "label1" = "%s" - } - } - `, - keyPairResource["name"], - keyPairResource["public_key"], - keyPairResource["label1"], - ), - ), + ConfigVariables: testConfigKeyPairMin, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceKeyPairMinConfig), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "name", keyPairResource["name"]), - resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "labels.label1", keyPairResource["label1"]), - resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "public_key", keyPairResource["public_key"]), + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "name", testutil.ConvertConfigVariable(testConfigKeyPairMin["name"])), + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "public_key", testutil.ConvertConfigVariable(testConfigKeyPairMin["public_key"])), resource.TestCheckResourceAttrSet("stackit_key_pair.key_pair", "fingerprint"), ), }, // Data source { + ConfigVariables: testConfigKeyPairMin, Config: fmt.Sprintf(` %s + %s data "stackit_key_pair" "key_pair" { name = stackit_key_pair.key_pair.name } `, - testAccKeyPairConfig( - fmt.Sprintf(` - resource "stackit_key_pair" "key_pair" { - name = "%s" - public_key = "%s" - labels = { - "label1" = "%s" - } - } - `, - keyPairResource["name"], - keyPairResource["public_key"], - keyPairResource["label1"], - ), - ), + testutil.IaaSProviderConfig(), resourceKeyPairMinConfig, ), Check: resource.ComposeAggregateTestCheckFunc( // Instance - resource.TestCheckResourceAttr("data.stackit_key_pair.key_pair", "name", keyPairResource["name"]), - resource.TestCheckResourceAttr("data.stackit_key_pair.key_pair", "public_key", keyPairResource["public_key"]), - resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "labels.label1", keyPairResource["label1"]), + resource.TestCheckResourceAttr("data.stackit_key_pair.key_pair", "name", testutil.ConvertConfigVariable(testConfigKeyPairMin["name"])), + resource.TestCheckResourceAttr("data.stackit_key_pair.key_pair", "public_key", testutil.ConvertConfigVariable(testConfigKeyPairMin["public_key"])), + resource.TestCheckResourceAttrSet("data.stackit_key_pair.key_pair", "fingerprint"), resource.TestCheckResourceAttrPair( "stackit_key_pair.key_pair", "fingerprint", "data.stackit_key_pair.key_pair", "fingerprint", @@ -1550,7 +3201,8 @@ func TestAccKeyPair(t *testing.T) { }, // Import { - ResourceName: "stackit_key_pair.key_pair", + ConfigVariables: testConfigKeyPairMin, + ResourceName: "stackit_key_pair.key_pair", ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_key_pair.key_pair"] if !ok { @@ -1565,26 +3217,79 @@ func TestAccKeyPair(t *testing.T) { ImportState: true, ImportStateVerify: true, }, - // Update + // In this minimal setup, no update can be performed + // Deletion is done by the framework implicitly + }, + }) +} + +func TestAccKeyPairMax(t *testing.T) { + t.Logf("TestAccKeyPairMax name: %s", testutil.ConvertConfigVariable(testConfigKeyPairMax["name"])) + resource.ParallelTest(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckDestroy, + Steps: []resource.TestStep{ + // Creation { - Config: testAccKeyPairConfig( - fmt.Sprintf(` - resource "stackit_key_pair" "key_pair" { - name = "%s" - public_key = "%s" - labels = { - "label1" = "%s" - } - } - `, - keyPairResource["name"], - keyPairResource["public_key"], - keyPairResource["label1-updated"], - ), + ConfigVariables: testConfigKeyPairMax, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceKeyPairMaxConfig), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "name", testutil.ConvertConfigVariable(testConfigKeyPairMax["name"])), + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "public_key", testutil.ConvertConfigVariable(testConfigKeyPairMax["public_key"])), + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "labels.acc-test", testutil.ConvertConfigVariable(testConfigKeyPairMax["label"])), + resource.TestCheckResourceAttrSet("stackit_key_pair.key_pair", "fingerprint"), + ), + }, + // Data source + { + ConfigVariables: testConfigKeyPairMax, + Config: fmt.Sprintf(` + %s + %s + + data "stackit_key_pair" "key_pair" { + name = stackit_key_pair.key_pair.name + } + `, + testutil.IaaSProviderConfig(), resourceKeyPairMaxConfig, ), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "name", keyPairResource["name"]), - resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "labels.label1", keyPairResource["label1-updated"]), + // Instance + resource.TestCheckResourceAttr("data.stackit_key_pair.key_pair", "name", testutil.ConvertConfigVariable(testConfigKeyPairMax["name"])), + resource.TestCheckResourceAttr("data.stackit_key_pair.key_pair", "public_key", testutil.ConvertConfigVariable(testConfigKeyPairMax["public_key"])), + resource.TestCheckResourceAttr("data.stackit_key_pair.key_pair", "labels.acc-test", testutil.ConvertConfigVariable(testConfigKeyPairMax["label"])), + resource.TestCheckResourceAttrSet("data.stackit_key_pair.key_pair", "fingerprint"), + resource.TestCheckResourceAttrPair( + "stackit_key_pair.key_pair", "fingerprint", + "data.stackit_key_pair.key_pair", "fingerprint", + ), + ), + }, + // Import + { + ConfigVariables: testConfigKeyPairMax, + ResourceName: "stackit_key_pair.key_pair", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_key_pair.key_pair"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_key_pair.key_pair") + } + keyPairName, ok := r.Primary.Attributes["name"] + if !ok { + return "", fmt.Errorf("couldn't find attribute name") + } + return keyPairName, nil + }, + ImportState: true, + ImportStateVerify: true, + }, + { + ConfigVariables: testConfigKeyPairMaxUpdated, + Config: fmt.Sprintf("%s\n%s", testutil.IaaSProviderConfig(), resourceKeyPairMaxConfig), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "name", testutil.ConvertConfigVariable(testConfigKeyPairMaxUpdated["name"])), + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "public_key", testutil.ConvertConfigVariable(testConfigKeyPairMaxUpdated["public_key"])), + resource.TestCheckResourceAttr("stackit_key_pair.key_pair", "labels.acc-test", testutil.ConvertConfigVariable(testConfigKeyPairMaxUpdated["label"])), resource.TestCheckResourceAttrSet("stackit_key_pair.key_pair", "fingerprint"), ), }, @@ -1593,57 +3298,66 @@ func TestAccKeyPair(t *testing.T) { }) } -func TestAccImage(t *testing.T) { - resource.Test(t, resource.TestCase{ +func TestAccImageMin(t *testing.T) { + t.Logf("TestAccImageMin name: %s", testutil.ConvertConfigVariable(testConfigImageVarsMin["name"])) + resource.ParallelTest(t, resource.TestCase{ ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, - CheckDestroy: testAccCheckIaaSImageDestroy, + CheckDestroy: testAccCheckDestroy, Steps: []resource.TestStep{ // Creation { - Config: testAccImageConfig(imageResource["name"]), + ConfigVariables: testConfigImageVarsMin, + Config: fmt.Sprintf("%s\n%s", resourceImageMinConfig, testutil.IaaSProviderConfig()), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_image.image", "project_id", imageResource["project_id"]), + resource.TestCheckResourceAttr("stackit_image.image", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMin["project_id"])), resource.TestCheckResourceAttrSet("stackit_image.image", "image_id"), - resource.TestCheckResourceAttr("stackit_image.image", "name", imageResource["name"]), - resource.TestCheckResourceAttr("stackit_image.image", "disk_format", imageResource["disk_format"]), - resource.TestCheckResourceAttr("stackit_image.image", "min_disk_size", imageResource["min_disk_size"]), - resource.TestCheckResourceAttr("stackit_image.image", "min_ram", imageResource["min_ram"]), - resource.TestCheckResourceAttrSet("stackit_image.image", "local_file_path"), - resource.TestCheckResourceAttr("stackit_image.image", "local_file_path", imageResource["local_file_path"]), - resource.TestCheckResourceAttr("stackit_image.image", "labels.label1", imageResource["label1"]), - resource.TestCheckResourceAttr("stackit_image.image", "config.boot_menu", imageResource["boot_menu"]), + resource.TestCheckResourceAttr("stackit_image.image", "name", testutil.ConvertConfigVariable(testConfigImageVarsMin["name"])), + resource.TestCheckResourceAttr("stackit_image.image", "disk_format", testutil.ConvertConfigVariable(testConfigImageVarsMin["disk_format"])), + resource.TestCheckResourceAttr("stackit_image.image", "local_file_path", testutil.ConvertConfigVariable(testConfigImageVarsMin["local_file_path"])), + resource.TestCheckResourceAttrSet("stackit_image.image", "protected"), + resource.TestCheckResourceAttrSet("stackit_image.image", "scope"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.digest"), resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.algorithm"), resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.digest"), ), }, // Data source { + ConfigVariables: testConfigImageVarsMin, Config: fmt.Sprintf(` %s + %s data "stackit_image" "image" { project_id = stackit_image.image.project_id image_id = stackit_image.image.image_id } `, - testAccImageConfig(imageResource["name"]), + resourceImageMinConfig, testutil.IaaSProviderConfig(), ), Check: resource.ComposeAggregateTestCheckFunc( // Instance - resource.TestCheckResourceAttr("data.stackit_image.image", "project_id", imageResource["project_id"]), + resource.TestCheckResourceAttr("data.stackit_image.image", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMin["project_id"])), resource.TestCheckResourceAttrPair("data.stackit_image.image", "image_id", "stackit_image.image", "image_id"), resource.TestCheckResourceAttrPair("data.stackit_image.image", "name", "stackit_image.image", "name"), resource.TestCheckResourceAttrPair("data.stackit_image.image", "disk_format", "stackit_image.image", "disk_format"), resource.TestCheckResourceAttrPair("data.stackit_image.image", "min_disk_size", "stackit_image.image", "min_disk_size"), resource.TestCheckResourceAttrPair("data.stackit_image.image", "min_ram", "stackit_image.image", "min_ram"), resource.TestCheckResourceAttrPair("data.stackit_image.image", "protected", "stackit_image.image", "protected"), - resource.TestCheckResourceAttrPair("data.stackit_image.image", "labels.label1", "stackit_image.image", "labels.label1"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "protected"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "scope"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "checksum.digest"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "checksum.digest"), ), }, // Import { - ResourceName: "stackit_image.image", + ConfigVariables: testConfigImageVarsMin, + ResourceName: "stackit_image.image", ImportStateIdFunc: func(s *terraform.State) (string, error) { r, ok := s.RootModule().Resources["stackit_image.image"] if !ok { @@ -1661,11 +3375,20 @@ func TestAccImage(t *testing.T) { }, // Update { - Config: testAccImageConfig(fmt.Sprintf("%s-updated", imageResource["name"])), + ConfigVariables: testConfigImageVarsMinUpdated, + Config: fmt.Sprintf("%s\n%s", resourceImageMinConfig, testutil.IaaSProviderConfig()), Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("stackit_image.image", "name", fmt.Sprintf("%s-updated", imageResource["name"])), - resource.TestCheckResourceAttr("stackit_image.image", "project_id", imageResource["project_id"]), - resource.TestCheckResourceAttr("stackit_image.image", "labels.label1", imageResource["label1"]), + resource.TestCheckResourceAttr("stackit_image.image", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMinUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_image.image", "image_id"), + resource.TestCheckResourceAttr("stackit_image.image", "name", testutil.ConvertConfigVariable(testConfigImageVarsMinUpdated["name"])), + resource.TestCheckResourceAttr("stackit_image.image", "disk_format", testutil.ConvertConfigVariable(testConfigImageVarsMinUpdated["disk_format"])), + resource.TestCheckResourceAttr("stackit_image.image", "local_file_path", testutil.ConvertConfigVariable(testConfigImageVarsMinUpdated["local_file_path"])), + resource.TestCheckResourceAttrSet("stackit_image.image", "protected"), + resource.TestCheckResourceAttrSet("stackit_image.image", "scope"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.digest"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.digest"), ), }, // Deletion is done by the framework implicitly @@ -1673,17 +3396,194 @@ func TestAccImage(t *testing.T) { }) } +func TestAccImageMax(t *testing.T) { + t.Logf("TestAccImageMax name: %s", testutil.ConvertConfigVariable(testConfigImageVarsMax["name"])) + resource.ParallelTest(t, resource.TestCase{ + ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories, + CheckDestroy: testAccCheckDestroy, + Steps: []resource.TestStep{ + + // Creation + { + ConfigVariables: testConfigImageVarsMax, + Config: fmt.Sprintf("%s\n%s", resourceImageMaxConfig, testutil.IaaSProviderConfig()), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("stackit_image.image", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMax["project_id"])), + resource.TestCheckResourceAttrSet("stackit_image.image", "image_id"), + resource.TestCheckResourceAttr("stackit_image.image", "name", testutil.ConvertConfigVariable(testConfigImageVarsMax["name"])), + resource.TestCheckResourceAttr("stackit_image.image", "disk_format", testutil.ConvertConfigVariable(testConfigImageVarsMax["disk_format"])), + resource.TestCheckResourceAttr("stackit_image.image", "local_file_path", testutil.ConvertConfigVariable(testConfigImageVarsMax["local_file_path"])), + resource.TestCheckResourceAttr("stackit_image.image", "min_disk_size", testutil.ConvertConfigVariable(testConfigImageVarsMax["min_disk_size"])), + resource.TestCheckResourceAttr("stackit_image.image", "min_ram", testutil.ConvertConfigVariable(testConfigImageVarsMax["min_ram"])), + resource.TestCheckResourceAttr("stackit_image.image", "labels.acc-test", testutil.ConvertConfigVariable(testConfigImageVarsMax["label"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.boot_menu", testutil.ConvertConfigVariable(testConfigImageVarsMax["boot_menu"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.cdrom_bus", testutil.ConvertConfigVariable(testConfigImageVarsMax["cdrom_bus"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.disk_bus", testutil.ConvertConfigVariable(testConfigImageVarsMax["disk_bus"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.nic_model", testutil.ConvertConfigVariable(testConfigImageVarsMax["nic_model"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.operating_system", testutil.ConvertConfigVariable(testConfigImageVarsMax["operating_system"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.operating_system_distro", testutil.ConvertConfigVariable(testConfigImageVarsMax["operating_system_distro"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.operating_system_version", testutil.ConvertConfigVariable(testConfigImageVarsMax["operating_system_version"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.rescue_bus", testutil.ConvertConfigVariable(testConfigImageVarsMax["rescue_bus"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.rescue_device", testutil.ConvertConfigVariable(testConfigImageVarsMax["rescue_device"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.secure_boot", testutil.ConvertConfigVariable(testConfigImageVarsMax["secure_boot"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.uefi", testutil.ConvertConfigVariable(testConfigImageVarsMax["uefi"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.video_model", testutil.ConvertConfigVariable(testConfigImageVarsMax["video_model"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.virtio_scsi", testutil.ConvertConfigVariable(testConfigImageVarsMax["virtio_scsi"])), + resource.TestCheckResourceAttrSet("stackit_image.image", "protected"), + resource.TestCheckResourceAttrSet("stackit_image.image", "scope"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.digest"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.digest"), + ), + }, + // Data source + { + ConfigVariables: testConfigImageVarsMax, + Config: fmt.Sprintf(` + %s + %s + + data "stackit_image" "image" { + project_id = stackit_image.image.project_id + image_id = stackit_image.image.image_id + } + `, + resourceImageMaxConfig, testutil.IaaSProviderConfig(), + ), + Check: resource.ComposeAggregateTestCheckFunc( + // Instance + resource.TestCheckResourceAttr("data.stackit_image.image", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMax["project_id"])), + resource.TestCheckResourceAttrPair("data.stackit_image.image", "image_id", "stackit_image.image", "image_id"), + resource.TestCheckResourceAttrPair("data.stackit_image.image", "name", "stackit_image.image", "name"), + resource.TestCheckResourceAttrPair("data.stackit_image.image", "disk_format", "stackit_image.image", "disk_format"), + resource.TestCheckResourceAttrPair("data.stackit_image.image", "min_disk_size", "stackit_image.image", "min_disk_size"), + resource.TestCheckResourceAttrPair("data.stackit_image.image", "min_ram", "stackit_image.image", "min_ram"), + resource.TestCheckResourceAttrPair("data.stackit_image.image", "protected", "stackit_image.image", "protected"), + resource.TestCheckResourceAttr("data.stackit_image.image", "min_disk_size", testutil.ConvertConfigVariable(testConfigImageVarsMax["min_disk_size"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "min_ram", testutil.ConvertConfigVariable(testConfigImageVarsMax["min_ram"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "labels.acc-test", testutil.ConvertConfigVariable(testConfigImageVarsMax["label"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.boot_menu", testutil.ConvertConfigVariable(testConfigImageVarsMax["boot_menu"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.cdrom_bus", testutil.ConvertConfigVariable(testConfigImageVarsMax["cdrom_bus"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.disk_bus", testutil.ConvertConfigVariable(testConfigImageVarsMax["disk_bus"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.nic_model", testutil.ConvertConfigVariable(testConfigImageVarsMax["nic_model"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.operating_system", testutil.ConvertConfigVariable(testConfigImageVarsMax["operating_system"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.operating_system_distro", testutil.ConvertConfigVariable(testConfigImageVarsMax["operating_system_distro"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.operating_system_version", testutil.ConvertConfigVariable(testConfigImageVarsMax["operating_system_version"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.rescue_bus", testutil.ConvertConfigVariable(testConfigImageVarsMax["rescue_bus"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.rescue_device", testutil.ConvertConfigVariable(testConfigImageVarsMax["rescue_device"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.secure_boot", testutil.ConvertConfigVariable(testConfigImageVarsMax["secure_boot"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.uefi", testutil.ConvertConfigVariable(testConfigImageVarsMax["uefi"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.video_model", testutil.ConvertConfigVariable(testConfigImageVarsMax["video_model"])), + resource.TestCheckResourceAttr("data.stackit_image.image", "config.virtio_scsi", testutil.ConvertConfigVariable(testConfigImageVarsMax["virtio_scsi"])), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "protected"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "scope"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "checksum.digest"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("data.stackit_image.image", "checksum.digest"), + ), + }, + // Import + { + ConfigVariables: testConfigImageVarsMax, + ResourceName: "stackit_image.image", + ImportStateIdFunc: func(s *terraform.State) (string, error) { + r, ok := s.RootModule().Resources["stackit_image.image"] + if !ok { + return "", fmt.Errorf("couldn't find resource stackit_image.image") + } + imageId, ok := r.Primary.Attributes["image_id"] + if !ok { + return "", fmt.Errorf("couldn't find attribute image_id") + } + return fmt.Sprintf("%s,%s", testutil.ProjectId, imageId), nil + }, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"local_file_path"}, + }, + // Update + { + ConfigVariables: testConfigImageVarsMaxUpdated, + Config: fmt.Sprintf("%s\n%s", resourceImageMaxConfig, testutil.IaaSProviderConfig()), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("stackit_image.image", "project_id", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["project_id"])), + resource.TestCheckResourceAttrSet("stackit_image.image", "image_id"), + resource.TestCheckResourceAttr("stackit_image.image", "name", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["name"])), + resource.TestCheckResourceAttr("stackit_image.image", "disk_format", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["disk_format"])), + resource.TestCheckResourceAttr("stackit_image.image", "local_file_path", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["local_file_path"])), + resource.TestCheckResourceAttr("stackit_image.image", "min_disk_size", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["min_disk_size"])), + resource.TestCheckResourceAttr("stackit_image.image", "min_ram", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["min_ram"])), + resource.TestCheckResourceAttr("stackit_image.image", "labels.acc-test", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["label"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.boot_menu", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["boot_menu"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.cdrom_bus", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["cdrom_bus"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.disk_bus", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["disk_bus"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.nic_model", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["nic_model"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.operating_system", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["operating_system"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.operating_system_distro", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["operating_system_distro"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.operating_system_version", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["operating_system_version"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.rescue_bus", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["rescue_bus"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.rescue_device", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["rescue_device"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.secure_boot", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["secure_boot"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.uefi", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["uefi"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.video_model", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["video_model"])), + resource.TestCheckResourceAttr("stackit_image.image", "config.virtio_scsi", testutil.ConvertConfigVariable(testConfigImageVarsMaxUpdated["virtio_scsi"])), + resource.TestCheckResourceAttrSet("stackit_image.image", "protected"), + resource.TestCheckResourceAttrSet("stackit_image.image", "scope"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.digest"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.algorithm"), + resource.TestCheckResourceAttrSet("stackit_image.image", "checksum.digest"), + ), + }, + // Deletion is done by the framework implicitly + }, + }) +} + +func testAccCheckDestroy(s *terraform.State) error { + checkFunctions := []func(s *terraform.State) error{ + testAccCheckNetworkDestroy, + testAccCheckNetworkInterfaceDestroy, + testAccCheckNetworkAreaDestroy, + testAccCheckIaaSVolumeDestroy, + testAccCheckServerDestroy, + testAccCheckAffinityGroupDestroy, + testAccCheckIaaSSecurityGroupDestroy, + testAccCheckIaaSPublicIpDestroy, + testAccCheckIaaSKeyPairDestroy, + testAccCheckIaaSImageDestroy, + } + var errs []error + + wg := sync.WaitGroup{} + wg.Add(len(checkFunctions)) + + for _, f := range checkFunctions { + go func() { + err := f(s) + if err != nil { + errs = append(errs, err) + } + wg.Done() + }() + } + wg.Wait() + return errors.Join(errs...) +} + func testAccCheckNetworkDestroy(s *terraform.State) error { ctx := context.Background() var client *iaas.APIClient var err error if testutil.IaaSCustomEndpoint == "" { client, err = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) } else { client, err = iaas.NewAPIClient( - config.WithEndpoint(testutil.IaaSCustomEndpoint), + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), ) } if err != nil { @@ -1716,17 +3616,61 @@ func testAccCheckNetworkDestroy(s *terraform.State) error { return errors.Join(errs...) } +func testAccCheckNetworkInterfaceDestroy(s *terraform.State) error { + ctx := context.Background() + var client *iaas.APIClient + var err error + if testutil.IaaSCustomEndpoint == "" { + client, err = iaas.NewAPIClient( + stackitSdkConfig.WithRegion("eu01"), + ) + } else { + client, err = iaas.NewAPIClient( + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), + ) + } + if err != nil { + return fmt.Errorf("creating client: %w", err) + } + + var errs []error + // network interfaces + for _, rs := range s.RootModule().Resources { + if rs.Type != "stackit_network_interface" { + continue + } + ids := strings.Split(rs.Primary.ID, core.Separator) + networkId := ids[1] + networkInterfaceId := ids[2] + err := client.DeleteNicExecute(ctx, testutil.ProjectId, networkId, networkInterfaceId) + if err != nil { + var oapiErr *oapierror.GenericOpenAPIError + if errors.As(err, &oapiErr) { + if oapiErr.StatusCode == http.StatusNotFound || oapiErr.StatusCode == http.StatusBadRequest { + continue + } + } + errs = append(errs, fmt.Errorf("cannot trigger network interface deletion %q: %w", networkInterfaceId, err)) + } + if err != nil { + errs = append(errs, fmt.Errorf("cannot delete network interface %q: %w", networkInterfaceId, err)) + } + } + + return errors.Join(errs...) +} + func testAccCheckNetworkAreaDestroy(s *terraform.State) error { ctx := context.Background() var client *iaas.APIClient var err error if testutil.IaaSCustomEndpoint == "" { client, err = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) } else { client, err = iaas.NewAPIClient( - config.WithEndpoint(testutil.IaaSCustomEndpoint), + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), ) } if err != nil { @@ -1769,11 +3713,11 @@ func testAccCheckIaaSVolumeDestroy(s *terraform.State) error { var err error if testutil.IaaSCustomEndpoint == "" { client, err = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) } else { client, err = iaas.NewAPIClient( - config.WithEndpoint(testutil.IaaSCustomEndpoint), + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), ) } if err != nil { @@ -1818,17 +3762,17 @@ func testAccCheckServerDestroy(s *terraform.State) error { var alphaErr error if testutil.IaaSCustomEndpoint == "" { alphaClient, alphaErr = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) client, err = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) } else { alphaClient, alphaErr = iaas.NewAPIClient( - config.WithEndpoint(testutil.IaaSCustomEndpoint), + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), ) client, err = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) } if err != nil || alphaErr != nil { @@ -1898,17 +3842,64 @@ func testAccCheckServerDestroy(s *terraform.State) error { return nil } +func testAccCheckAffinityGroupDestroy(s *terraform.State) error { + ctx := context.Background() + var client *iaas.APIClient + var err error + if testutil.IaaSCustomEndpoint == "" { + client, err = iaas.NewAPIClient( + stackitSdkConfig.WithRegion("eu01"), + ) + } else { + client, err = iaas.NewAPIClient( + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), + ) + } + if err != nil { + return fmt.Errorf("creating client: %w", err) + } + + affinityGroupsToDestroy := []string{} + for _, rs := range s.RootModule().Resources { + if rs.Type != "stackit_affinity_group" { + continue + } + // affinity group terraform ID: "[project_id],[affinity_group_id]" + affinityGroupId := strings.Split(rs.Primary.ID, core.Separator)[1] + affinityGroupsToDestroy = append(affinityGroupsToDestroy, affinityGroupId) + } + + affinityGroupsResp, err := client.ListAffinityGroupsExecute(ctx, testutil.ProjectId) + if err != nil { + return fmt.Errorf("getting securityGroupsResp: %w", err) + } + + affinityGroups := *affinityGroupsResp.Items + for i := range affinityGroups { + if affinityGroups[i].Id == nil { + continue + } + if utils.Contains(affinityGroupsToDestroy, *affinityGroups[i].Id) { + err := client.DeleteAffinityGroupExecute(ctx, testutil.ProjectId, *affinityGroups[i].Id) + if err != nil { + return fmt.Errorf("destroying affinity group %s during CheckDestroy: %w", *affinityGroups[i].Id, err) + } + } + } + return nil +} + func testAccCheckIaaSSecurityGroupDestroy(s *terraform.State) error { ctx := context.Background() var client *iaas.APIClient var err error if testutil.IaaSCustomEndpoint == "" { client, err = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) } else { client, err = iaas.NewAPIClient( - config.WithEndpoint(testutil.IaaSCustomEndpoint), + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), ) } if err != nil { @@ -1951,11 +3942,11 @@ func testAccCheckIaaSPublicIpDestroy(s *terraform.State) error { var err error if testutil.IaaSCustomEndpoint == "" { client, err = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) } else { client, err = iaas.NewAPIClient( - config.WithEndpoint(testutil.IaaSCustomEndpoint), + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), ) } if err != nil { @@ -1998,11 +3989,11 @@ func testAccCheckIaaSKeyPairDestroy(s *terraform.State) error { var err error if testutil.IaaSCustomEndpoint == "" { client, err = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) } else { client, err = iaas.NewAPIClient( - config.WithEndpoint(testutil.IaaSCustomEndpoint), + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), ) } if err != nil { @@ -2043,21 +4034,13 @@ func testAccCheckIaaSImageDestroy(s *terraform.State) error { var client *iaas.APIClient var err error - if _, err := os.Stat(localFileForIaasImage.Name()); err == nil { - // file exists, delete it - err := os.Remove(localFileForIaasImage.Name()) - if err != nil { - return fmt.Errorf("Error deleting localFileForIaasImage file: %w", err) - } - } - if testutil.IaaSCustomEndpoint == "" { client, err = iaas.NewAPIClient( - config.WithRegion("eu01"), + stackitSdkConfig.WithRegion("eu01"), ) } else { client, err = iaas.NewAPIClient( - config.WithEndpoint(testutil.IaaSCustomEndpoint), + stackitSdkConfig.WithEndpoint(testutil.IaaSCustomEndpoint), ) } if err != nil { diff --git a/stackit/internal/services/iaas/image/datasource.go b/stackit/internal/services/iaas/image/datasource.go index d9a231e2..147613cb 100644 --- a/stackit/internal/services/iaas/image/datasource.go +++ b/stackit/internal/services/iaas/image/datasource.go @@ -309,7 +309,7 @@ func mapDataSourceFields(ctx context.Context, imageResp *iaas.Image, model *Data configModel.SecureBoot = types.BoolPointerValue(imageResp.Config.SecureBoot) configModel.UEFI = types.BoolPointerValue(imageResp.Config.Uefi) configModel.VideoModel = types.StringPointerValue(imageResp.Config.GetVideoModel()) - configModel.VirtioScsi = types.BoolPointerValue(imageResp.Config.VirtioScsi) + configModel.VirtioScsi = types.BoolPointerValue(iaas.PtrBool(imageResp.Config.GetVirtioScsi())) configObject, diags = types.ObjectValue(configTypes, map[string]attr.Value{ "boot_menu": configModel.BootMenu, diff --git a/stackit/internal/services/iaas/image/resource.go b/stackit/internal/services/iaas/image/resource.go index f050163c..285bc4c6 100644 --- a/stackit/internal/services/iaas/image/resource.go +++ b/stackit/internal/services/iaas/image/resource.go @@ -649,7 +649,7 @@ func mapFields(ctx context.Context, imageResp *iaas.Image, model *Model) error { configModel.SecureBoot = types.BoolPointerValue(imageResp.Config.SecureBoot) configModel.UEFI = types.BoolPointerValue(imageResp.Config.Uefi) configModel.VideoModel = types.StringPointerValue(imageResp.Config.GetVideoModel()) - configModel.VirtioScsi = types.BoolPointerValue(imageResp.Config.VirtioScsi) + configModel.VirtioScsi = types.BoolPointerValue(iaas.PtrBool(imageResp.Config.GetVirtioScsi())) configObject, diags = types.ObjectValue(configTypes, map[string]attr.Value{ "boot_menu": configModel.BootMenu, diff --git a/stackit/internal/services/iaas/keypair/resource.go b/stackit/internal/services/iaas/keypair/resource.go index 853b1fb7..4c313379 100644 --- a/stackit/internal/services/iaas/keypair/resource.go +++ b/stackit/internal/services/iaas/keypair/resource.go @@ -107,6 +107,7 @@ func (r *keyPairResource) Schema(_ context.Context, _ resource.SchemaRequest, re Description: "The name of the SSH key pair.", Required: true, PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), stringplanmodifier.UseStateForUnknown(), }, }, diff --git a/stackit/internal/services/iaas/networkarea/resource.go b/stackit/internal/services/iaas/networkarea/resource.go index e8292422..50d23c73 100644 --- a/stackit/internal/services/iaas/networkarea/resource.go +++ b/stackit/internal/services/iaas/networkarea/resource.go @@ -228,7 +228,7 @@ func (r *networkAreaResource) Schema(_ context.Context, _ resource.SchemaRequest Optional: true, Computed: true, Validators: []validator.Int64{ - int64validator.AtLeast(22), + int64validator.AtLeast(8), int64validator.AtMost(29), }, Default: int64default.StaticInt64(24), diff --git a/stackit/internal/services/iaas/publicip/resource.go b/stackit/internal/services/iaas/publicip/resource.go index 4b1c463d..bfb75fa4 100644 --- a/stackit/internal/services/iaas/publicip/resource.go +++ b/stackit/internal/services/iaas/publicip/resource.go @@ -140,6 +140,7 @@ func (r *publicIpResource) Schema(_ context.Context, _ resource.SchemaRequest, r "network_interface_id": schema.StringAttribute{ Description: "Associates the public IP with a network interface or a virtual IP (ID). If you are using this resource with a Kubernetes Load Balancer or any other resource which associates a network interface implicitly, use the lifecycle `ignore_changes` property in this field to prevent unintentional removal of the network interface due to drift in the Terraform state", Optional: true, + Computed: true, Validators: []validator.String{ validate.UUID(), validate.NoSeparator(), diff --git a/stackit/internal/services/iaas/server/datasource.go b/stackit/internal/services/iaas/server/datasource.go index 1b8d1aa7..facb507f 100644 --- a/stackit/internal/services/iaas/server/datasource.go +++ b/stackit/internal/services/iaas/server/datasource.go @@ -323,6 +323,10 @@ func mapDataSourceFields(ctx context.Context, serverResp *iaas.Server, model *Da model.BootVolume = types.ObjectNull(bootVolumeDataTypes) } + if serverResp.UserData != nil && len(*serverResp.UserData) > 0 { + model.UserData = types.StringValue(string(*serverResp.UserData)) + } + model.AvailabilityZone = types.StringPointerValue(serverResp.AvailabilityZone) model.ServerId = types.StringValue(serverId) model.MachineType = types.StringPointerValue(serverResp.MachineType) diff --git a/stackit/internal/services/iaas/server/resource.go b/stackit/internal/services/iaas/server/resource.go index 0a361df6..38d2ac14 100644 --- a/stackit/internal/services/iaas/server/resource.go +++ b/stackit/internal/services/iaas/server/resource.go @@ -960,6 +960,10 @@ func mapFields(ctx context.Context, serverResp *iaas.Server, model *Model) error if serverResp.Status != nil && *serverResp.Status != wait.ServerDeallocatedStatus { model.AvailabilityZone = types.StringPointerValue(serverResp.AvailabilityZone) } + + if serverResp.UserData != nil && len(*serverResp.UserData) > 0 { + model.UserData = types.StringValue(string(*serverResp.UserData)) + } model.Name = types.StringPointerValue(serverResp.Name) model.Labels = labels model.ImageId = types.StringPointerValue(serverResp.ImageId) diff --git a/stackit/internal/services/iaas/testdata/resource-affinity-group-min.tf b/stackit/internal/services/iaas/testdata/resource-affinity-group-min.tf new file mode 100644 index 00000000..2e30e710 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-affinity-group-min.tf @@ -0,0 +1,9 @@ +variable "project_id" {} +variable "name" {} +variable "policy" {} + +resource "stackit_affinity_group" "affinity_group" { + project_id = var.project_id + name = var.name + policy = var.policy +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-image-max.tf b/stackit/internal/services/iaas/testdata/resource-image-max.tf new file mode 100644 index 00000000..83ec1d56 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-image-max.tf @@ -0,0 +1,48 @@ +variable "project_id" {} +variable "name" {} +variable "disk_format" {} +variable "local_file_path" {} +variable "min_disk_size" {} +variable "min_ram" {} +variable "label" {} +variable "boot_menu" {} +variable "cdrom_bus" {} +variable "disk_bus" {} +variable "nic_model" {} +variable "operating_system" {} +variable "operating_system_distro" {} +variable "operating_system_version" {} +variable "rescue_bus" {} +variable "rescue_device" {} +variable "secure_boot" {} +variable "uefi" {} +variable "video_model" {} +variable "virtio_scsi" {} + +resource "stackit_image" "image" { + project_id = var.project_id + name = var.name + disk_format = var.disk_format + local_file_path = var.local_file_path + min_disk_size = var.min_disk_size + min_ram = var.min_ram + labels = { + "acc-test" : var.label + } + config = { + boot_menu = var.boot_menu + cdrom_bus = var.cdrom_bus + disk_bus = var.disk_bus + nic_model = var.nic_model + operating_system = var.operating_system + operating_system_distro = var.operating_system_distro + operating_system_version = var.operating_system_version + rescue_bus = var.rescue_bus + rescue_device = var.rescue_device + secure_boot = var.secure_boot + uefi = var.uefi + video_model = var.video_model + virtio_scsi = var.virtio_scsi + } + +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-image-min.tf b/stackit/internal/services/iaas/testdata/resource-image-min.tf new file mode 100644 index 00000000..ea7e843c --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-image-min.tf @@ -0,0 +1,11 @@ +variable "project_id" {} +variable "name" {} +variable "disk_format" {} +variable "local_file_path" {} + +resource "stackit_image" "image" { + project_id = var.project_id + name = var.name + disk_format = var.disk_format + local_file_path = var.local_file_path +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-key-pair-max.tf b/stackit/internal/services/iaas/testdata/resource-key-pair-max.tf new file mode 100644 index 00000000..281a5f84 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-key-pair-max.tf @@ -0,0 +1,11 @@ +variable "name" {} +variable "public_key" {} +variable "label" {} + +resource "stackit_key_pair" "key_pair" { + name = var.name + public_key = var.public_key + labels = { + "acc-test" : var.label + } +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-key-pair-min.tf b/stackit/internal/services/iaas/testdata/resource-key-pair-min.tf new file mode 100644 index 00000000..87d0adf1 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-key-pair-min.tf @@ -0,0 +1,7 @@ +variable "name" {} +variable "public_key" {} + +resource "stackit_key_pair" "key_pair" { + name = var.name + public_key = var.public_key +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-network-area-max.tf b/stackit/internal/services/iaas/testdata/resource-network-area-max.tf new file mode 100644 index 00000000..2da19e48 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-network-area-max.tf @@ -0,0 +1,41 @@ +variable "organization_id" {} + +variable "name" {} +variable "transfer_network" {} +variable "network_ranges_prefix" {} +variable "default_nameservers" {} +variable "default_prefix_length" {} +variable "max_prefix_length" {} +variable "min_prefix_length" {} + +variable "route_prefix" {} +variable "route_next_hop" {} +variable "label" {} + +resource "stackit_network_area" "network_area" { + organization_id = var.organization_id + name = var.name + network_ranges = [ + { + prefix = var.network_ranges_prefix + } + ] + transfer_network = var.transfer_network + default_nameservers = [var.default_nameservers] + default_prefix_length = var.default_prefix_length + max_prefix_length = var.max_prefix_length + min_prefix_length = var.min_prefix_length + labels = { + "acc-test" : var.label + } +} + +resource "stackit_network_area_route" "network_area_route" { + organization_id = stackit_network_area.network_area.organization_id + network_area_id = stackit_network_area.network_area.network_area_id + prefix = var.route_prefix + next_hop = var.route_next_hop + labels = { + "acc-test" : var.label + } +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-network-area-min.tf b/stackit/internal/services/iaas/testdata/resource-network-area-min.tf new file mode 100644 index 00000000..e1cfee28 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-network-area-min.tf @@ -0,0 +1,26 @@ +variable "organization_id" {} + +variable "name" {} +variable "transfer_network" {} +variable "network_ranges_prefix" {} + +variable "route_prefix" {} +variable "route_next_hop" {} + +resource "stackit_network_area" "network_area" { + organization_id = var.organization_id + name = var.name + transfer_network = var.transfer_network + network_ranges = [ + { + prefix = var.network_ranges_prefix + } + ] +} + +resource "stackit_network_area_route" "network_area_route" { + organization_id = stackit_network_area.network_area.organization_id + network_area_id = stackit_network_area.network_area.network_area_id + prefix = var.route_prefix + next_hop = var.route_next_hop +} \ 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 new file mode 100644 index 00000000..f7b16f7d --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-network-interface-max.tf @@ -0,0 +1,54 @@ +variable "project_id" {} +variable "name" {} +variable "allowed_address" {} +variable "ipv4" {} +variable "ipv4_prefix" {} +variable "security" {} +variable "label" {} + +resource "stackit_network" "network" { + project_id = var.project_id + name = var.name + ipv4_prefix = var.ipv4_prefix +} + +resource "stackit_network_interface" "network_interface" { + project_id = var.project_id + network_id = stackit_network.network.network_id + name = var.name + allowed_addresses = var.security ? [var.allowed_address] : null + ipv4 = var.ipv4 + security = var.security + security_group_ids = var.security ? [stackit_security_group.security_group.security_group_id] : null + labels = { + "acc-test" : var.label + } +} + +resource "stackit_public_ip" "public_ip" { + project_id = var.project_id + network_interface_id = stackit_network_interface.network_interface.network_interface_id + labels = { + "acc-test" : var.label + } +} + +resource "stackit_network_interface" "network_interface_simple" { + project_id = var.project_id + network_id = stackit_network.network.network_id +} + +resource "stackit_public_ip" "public_ip_simple" { + project_id = var.project_id +} + +resource "stackit_public_ip_associate" "nic_public_ip_attach" { + project_id = var.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 +} \ 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 new file mode 100644 index 00000000..6a26db0d --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-network-interface-min.tf @@ -0,0 +1,16 @@ +variable "project_id" {} +variable "name" {} + +resource "stackit_network" "network" { + project_id = var.project_id + name = var.name +} + +resource "stackit_network_interface" "network_interface" { + project_id = var.project_id + network_id = stackit_network.network.network_id +} + +resource "stackit_public_ip" "public_ip" { + project_id = var.project_id +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-network-max.tf b/stackit/internal/services/iaas/testdata/resource-network-max.tf new file mode 100644 index 00000000..ac4d6a12 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-network-max.tf @@ -0,0 +1,22 @@ +variable "project_id" {} +variable "name" {} +variable "ipv4_gateway" {} +variable "ipv4_nameservers" {} +variable "ipv4_prefix" {} +variable "ipv4_prefix_length" {} +variable "routed" {} +variable "label" {} + +resource "stackit_network" "network" { + project_id = var.project_id + name = var.name + ipv4_gateway = var.ipv4_gateway != "" ? var.ipv4_gateway : null + no_ipv4_gateway = var.ipv4_gateway != "" ? null : true + ipv4_nameservers = [var.ipv4_nameservers] + ipv4_prefix = var.ipv4_prefix + ipv4_prefix_length = var.ipv4_prefix_length + routed = var.routed + labels = { + "acc-test" : var.label + } +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-network-min.tf b/stackit/internal/services/iaas/testdata/resource-network-min.tf new file mode 100644 index 00000000..e2748bdd --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-network-min.tf @@ -0,0 +1,7 @@ +variable "project_id" {} +variable "name" {} + +resource "stackit_network" "network" { + project_id = var.project_id + name = var.name +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-security-group-max.tf b/stackit/internal/services/iaas/testdata/resource-security-group-max.tf new file mode 100644 index 00000000..a7e8172d --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-security-group-max.tf @@ -0,0 +1,72 @@ +variable "project_id" {} + +variable "name" {} +variable "description" {} +variable "description_rule" {} +variable "label" {} +variable "stateful" {} +variable "direction" {} +variable "ether_type" {} +variable "ip_range" {} +variable "port" {} +variable "protocol" {} +variable "icmp_code" {} +variable "icmp_type" {} +variable "name_remote" {} + +resource "stackit_security_group" "security_group" { + project_id = var.project_id + name = var.name + description = var.description + labels = { + "acc-test" : var.label + } + stateful = var.stateful +} + +resource "stackit_security_group_rule" "security_group_rule" { + project_id = var.project_id + security_group_id = stackit_security_group.security_group.security_group_id + direction = var.direction + + description = var.description_rule + ether_type = var.ether_type + port_range = { + min = var.port + max = var.port + } + protocol = { + name = var.protocol + } + ip_range = var.ip_range +} + +resource "stackit_security_group_rule" "security_group_rule_icmp" { + project_id = var.project_id + security_group_id = stackit_security_group.security_group.security_group_id + direction = var.direction + + description = var.description_rule + ether_type = var.ether_type + icmp_parameters = { + code = var.icmp_code + type = var.icmp_type + } + protocol = { + name = "icmp" + } + ip_range = var.ip_range +} + +resource "stackit_security_group" "security_group_remote" { + project_id = var.project_id + name = var.name_remote +} + +resource "stackit_security_group_rule" "security_group_rule_remote_security_group" { + project_id = var.project_id + security_group_id = stackit_security_group.security_group.security_group_id + direction = var.direction + + remote_security_group_id = stackit_security_group.security_group_remote.security_group_id +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-security-group-min.tf b/stackit/internal/services/iaas/testdata/resource-security-group-min.tf new file mode 100644 index 00000000..7ae5f6f3 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-security-group-min.tf @@ -0,0 +1,15 @@ +variable "project_id" {} + +variable "name" {} +variable "direction" {} + +resource "stackit_security_group" "security_group" { + project_id = var.project_id + name = var.name +} + +resource "stackit_security_group_rule" "security_group_rule" { + project_id = var.project_id + security_group_id = stackit_security_group.security_group.security_group_id + direction = var.direction +} \ 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 new file mode 100644 index 00000000..d9902e95 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-server-max-server-attachments.tf @@ -0,0 +1,11 @@ +resource "stackit_server_volume_attach" "data_volume_attachment" { + project_id = var.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 + 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 new file mode 100644 index 00000000..4150bcc2 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-server-max.tf @@ -0,0 +1,82 @@ +variable "project_id" {} +variable "name" {} +variable "name_not_updated" {} +variable "machine_type" {} +variable "image_id" {} +variable "availability_zone" {} +variable "label" {} +variable "user_data" {} +variable "desired_status" {} + +variable "policy" {} +variable "size" {} +variable "public_key" {} +variable "service_account_mail" {} + +resource "stackit_affinity_group" "affinity_group" { + project_id = var.project_id + name = var.name_not_updated + policy = var.policy +} + +resource "stackit_volume" "base_volume" { + project_id = var.project_id + availability_zone = var.availability_zone + size = var.size + source = { + id = var.image_id + type = "image" + } +} + +resource "stackit_volume" "data_volume" { + project_id = var.project_id + availability_zone = var.availability_zone + size = var.size +} + + +resource "stackit_network" "network" { + project_id = var.project_id + name = var.name +} + +resource "stackit_network_interface" "network_interface_init" { + project_id = var.project_id + network_id = stackit_network.network.network_id +} + +resource "stackit_network_interface" "network_interface_second" { + project_id = var.project_id + network_id = stackit_network.network.network_id +} + +resource "stackit_key_pair" "key_pair" { + name = var.name_not_updated + public_key = var.public_key +} + +resource "stackit_server_service_account_attach" "attached_service_account" { + project_id = var.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 + machine_type = var.machine_type + affinity_group = stackit_affinity_group.affinity_group.affinity_group_id + availability_zone = var.availability_zone + keypair_name = stackit_key_pair.key_pair.name + desired_status = var.desired_status + network_interfaces = [stackit_network_interface.network_interface_init.network_interface_id] + user_data = var.user_data + boot_volume = { + source_type = "volume" + source_id = stackit_volume.base_volume.volume_id + } + labels = { + "acc-test" : var.label + } +} diff --git a/stackit/internal/services/iaas/testdata/resource-server-min.tf b/stackit/internal/services/iaas/testdata/resource-server-min.tf new file mode 100644 index 00000000..0bf78dc9 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-server-min.tf @@ -0,0 +1,17 @@ +variable "project_id" {} +variable "name" {} +variable "machine_type" {} +variable "image_id" {} + + +resource "stackit_server" "server" { + project_id = var.project_id + name = var.name + machine_type = var.machine_type + boot_volume = { + source_type = "image" + size = 16 + source_id = var.image_id + delete_on_termination = true + } +} diff --git a/stackit/internal/services/iaas/testdata/resource-volume-max.tf b/stackit/internal/services/iaas/testdata/resource-volume-max.tf new file mode 100644 index 00000000..9286078e --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-volume-max.tf @@ -0,0 +1,35 @@ +variable "project_id" {} +variable "availability_zone" {} +variable "name" {} +variable "size" {} +variable "description" {} +variable "performance_class" {} +variable "label" {} + +resource "stackit_volume" "volume_size" { + project_id = var.project_id + availability_zone = var.availability_zone + name = var.name + size = var.size + description = var.description + performance_class = var.performance_class + labels = { + "acc-test" : var.label + } +} + +resource "stackit_volume" "volume_source" { + project_id = var.project_id + availability_zone = var.availability_zone + name = var.name + description = var.description + performance_class = var.performance_class + size = var.size + source = { + id = stackit_volume.volume_size.volume_id + type = "volume" + } + labels = { + "acc-test" : var.label + } +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/testdata/resource-volume-min.tf b/stackit/internal/services/iaas/testdata/resource-volume-min.tf new file mode 100644 index 00000000..bd114676 --- /dev/null +++ b/stackit/internal/services/iaas/testdata/resource-volume-min.tf @@ -0,0 +1,18 @@ +variable "project_id" {} +variable "availability_zone" {} +variable "size" {} + +resource "stackit_volume" "volume_size" { + project_id = var.project_id + availability_zone = var.availability_zone + size = var.size +} + +resource "stackit_volume" "volume_source" { + project_id = var.project_id + availability_zone = var.availability_zone + source = { + id = stackit_volume.volume_size.volume_id + type = "volume" + } +} \ No newline at end of file diff --git a/stackit/internal/services/iaas/volume/resource.go b/stackit/internal/services/iaas/volume/resource.go index f666f9c6..e88b4aaf 100644 --- a/stackit/internal/services/iaas/volume/resource.go +++ b/stackit/internal/services/iaas/volume/resource.go @@ -167,7 +167,6 @@ func (r *volumeResource) Schema(_ context.Context, _ resource.SchemaRequest, res "server_id": schema.StringAttribute{ Description: "The server ID of the server to which the volume is attached to.", Computed: true, - Optional: true, PlanModifiers: []planmodifier.String{ stringplanmodifier.UseStateForUnknown(), }, @@ -234,6 +233,7 @@ func (r *volumeResource) Schema(_ context.Context, _ resource.SchemaRequest, res "size": schema.Int64Attribute{ Description: "The size of the volume in GB. It can only be updated to a larger value than the current size. Either `size` or `source` must be provided", Optional: true, + Computed: true, PlanModifiers: []planmodifier.Int64{ volumeResizeModifier{}, }, @@ -575,6 +575,10 @@ func mapFields(ctx context.Context, volumeResp *iaas.Volume, model *Model) error model.AvailabilityZone = types.StringPointerValue(volumeResp.AvailabilityZone) model.Description = types.StringPointerValue(volumeResp.Description) model.Name = types.StringPointerValue(volumeResp.Name) + // Workaround for volumes with no names which return an empty string instead of nil + if name := volumeResp.Name; name != nil && *name == "" { + model.Name = types.StringNull() + } model.Labels = labels model.PerformanceClass = types.StringPointerValue(volumeResp.PerformanceClass) model.ServerId = types.StringPointerValue(volumeResp.ServerId)