From a0c2c30cedb044ee9f2aa5ae24d251ea5c88eea7 Mon Sep 17 00:00:00 2001 From: Alexander Dahmen Date: Thu, 20 Feb 2025 13:36:31 +0100 Subject: [PATCH] Ft/rework acceptance tests follow up (#684) * Enable CI Signed-off-by: Alexander Dahmen * Add default local file for IaaS image test Signed-off-by: Alexander Dahmen * Opensearch acceptance test typo Signed-off-by: Alexander Dahmen * Postgresflex acceptance test fix ignore Signed-off-by: Alexander Dahmen * Redis acceptance test remove mid uuid Signed-off-by: Alexander Dahmen * Objectstorage acceptance test ignore region for import Signed-off-by: Alexander Dahmen * Add more environment variables for CI build Signed-off-by: Alexander Dahmen --------- Signed-off-by: Alexander Dahmen --- .github/workflows/tf-acc-test.yaml | 18 +++++--------- Makefile | 11 +++++++-- .../internal/services/iaas/iaas_acc_test.go | 22 +++++++++++++++++ .../objectstorage/objectstorage_acc_test.go | 7 +++--- .../opensearch/opensearch_acc_test.go | 6 ++--- .../postgresflex/postgresflex_acc_test.go | 7 +++--- .../internal/services/redis/redis_acc_test.go | 2 -- stackit/internal/testutil/testutil.go | 24 ++++++++++++++++++- 8 files changed, 71 insertions(+), 26 deletions(-) diff --git a/.github/workflows/tf-acc-test.yaml b/.github/workflows/tf-acc-test.yaml index 8bd0491c..164d384e 100644 --- a/.github/workflows/tf-acc-test.yaml +++ b/.github/workflows/tf-acc-test.yaml @@ -16,18 +16,12 @@ jobs: - name: Install project tools and dependencies run: make project-tools - name: Run tests - run: make test-acceptance-tf TF_ACC_PROJECT_ID=$${{ secrets.TF_ACC_PROJECT_ID }} + run: | + make test-acceptance-tf TF_ACC_PROJECT_ID=$${{ secrets.TF_ACC_PROJECT_ID }} TF_ACC_ORGANIZATION_ID=$${{ secrets.TF_ACC_ORGANIZATION_ID }} env: - TF_ACC_ARGUS_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_ARGUS_CUSTOM_ENDPOINT }} - TF_ACC_DNS_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_DNS_CUSTOM_ENDPOINT }} - TF_ACC_LOGME_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_LOGME_CUSTOM_ENDPOINT }} - TF_ACC_MARIADB_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_MARIADB_CUSTOM_ENDPOINT }} - TF_ACC_OBSERVABILITY_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_OBSERVABILITY_CUSTOM_ENDPOINT }} - TF_ACC_OPENSEARCH_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_OPENSEARCH_CUSTOM_ENDPOINT }} - TF_ACC_POSTGRESFLEX_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_POSTGRESFLEX_CUSTOM_ENDPOINT }} - TF_ACC_RABBITMQ_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_RABBITMQ_CUSTOM_ENDPOINT }} - TF_ACC_REDIS_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_REDIS_CUSTOM_ENDPOINT }} - TF_ACC_RESOURCEMANAGER_CUSTOM_ENDPOINT: ${{ secrets.TF_ACC_RESOURCEMANAGER_CUSTOM_ENDPOINT }} - TF_ACC_SERVICE_ACCOUNT_TOKEN: ${{ secrets.TF_ACC_SERVICE_ACCOUNT_TOKEN }} + STACKIT_SERVICE_ACCOUNT_TOKEN: ${{ secrets.TF_ACC_SERVICE_ACCOUNT_TOKEN }} TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_EMAIL: ${{ secrets.TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_EMAIL }} TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN: ${{ secrets.TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN }} + TF_ACC_TEST_PROJECT_PARENT_CONTAINER_ID: ${{ secrets.TF_ACC_TEST_PROJECT_PARENT_CONTAINER_ID }} + TF_ACC_TEST_PROJECT_PARENT_UUID: ${{ secrets.TF_ACC_TEST_PROJECT_PARENT_UUID }} + TF_ACC_TEST_PROJECT_USER_EMAIL: ${{ secrets.TF_ACC_TEST_PROJECT_USER_EMAIL }} diff --git a/Makefile b/Makefile index 9ddc24f3..91d641b5 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,13 @@ test: test-acceptance-tf: @if [ -z $(TF_ACC_PROJECT_ID) ]; then echo "Input TF_ACC_PROJECT_ID missing"; exit 1; fi + @if [ -z $(TF_ACC_ORGANIZATION_ID) ]; then echo "Input TF_ACC_ORGANIZATION_ID missing"; exit 1; fi + @if [ -z $(TF_ACC_TEST_IMAGE_LOCAL_FILE_PATH) ]; then \ + echo "Input TF_ACC_TEST_IMAGE_LOCAL_FILE_PATH missing. Creating a default file for testing."; \ + fi @echo "Running acceptance tests for the terraform provider" - @cd $(ROOT_DIR)/stackit && TF_ACC=1 TF_ACC_PROJECT_ID=$(TF_ACC_PROJECT_ID) go test ./... -count=1 -timeout=30m && cd $(ROOT_DIR) - + @cd $(ROOT_DIR)/stackit && TF_ACC=1 \ + TF_ACC_PROJECT_ID=$(TF_ACC_PROJECT_ID) \ + TF_ACC_ORGANIZATION_ID=$(TF_ACC_ORGANIZATION_ID) \ + go test ./... -count=1 -timeout=30m && \ + cd $(ROOT_DIR) diff --git a/stackit/internal/services/iaas/iaas_acc_test.go b/stackit/internal/services/iaas/iaas_acc_test.go index 8c8c6694..50d4da6f 100644 --- a/stackit/internal/services/iaas/iaas_acc_test.go +++ b/stackit/internal/services/iaas/iaas_acc_test.go @@ -3,6 +3,8 @@ package iaas_test import ( "context" "fmt" + "os" + "path/filepath" "strings" "testing" @@ -124,6 +126,9 @@ var imageResource = map[string]string{ "boot_menu": "true", } +// 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 networkResourceConfig(name, nameservers string) string { return fmt.Sprintf(` resource "stackit_network" "network" { @@ -331,6 +336,14 @@ func serviceAccountAttachmentResourceConfig() string { } func imageResourceConfig(name string) string { + if imageResource["local_file_path"] == "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 + } return fmt.Sprintf(` resource "stackit_image" "image" { project_id = "%s" @@ -1866,6 +1879,15 @@ func testAccCheckIaaSImageDestroy(s *terraform.State) error { ctx := context.Background() 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"), diff --git a/stackit/internal/services/objectstorage/objectstorage_acc_test.go b/stackit/internal/services/objectstorage/objectstorage_acc_test.go index 8e831d4f..0d7aace7 100644 --- a/stackit/internal/services/objectstorage/objectstorage_acc_test.go +++ b/stackit/internal/services/objectstorage/objectstorage_acc_test.go @@ -192,8 +192,9 @@ func TestAccObjectStorageResource(t *testing.T) { return fmt.Sprintf("%s,%s", testutil.ProjectId, credentialsGroupId), nil }, - ImportState: true, - ImportStateVerify: true, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"region"}, }, { ResourceName: "stackit_objectstorage_credential.credential", @@ -214,7 +215,7 @@ func TestAccObjectStorageResource(t *testing.T) { }, ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"access_key", "secret_access_key"}, + ImportStateVerifyIgnore: []string{"access_key", "secret_access_key", "region"}, }, // Deletion is done by the framework implicitly }, diff --git a/stackit/internal/services/opensearch/opensearch_acc_test.go b/stackit/internal/services/opensearch/opensearch_acc_test.go index 64117f9a..f7a9731b 100644 --- a/stackit/internal/services/opensearch/opensearch_acc_test.go +++ b/stackit/internal/services/opensearch/opensearch_acc_test.go @@ -102,7 +102,7 @@ func TestAccOpenSearchResource(t *testing.T) { resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "plan_name", instanceResource["plan_name"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "version", instanceResource["version"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "name", instanceResource["name"]), - resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.sgw_acl", instanceResource["sqw_acl-1"]), + resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.sgw_acl", instanceResource["sgw_acl-1"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.max_disk_threshold", instanceResource["max_disk_threshold"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.enable_monitoring", instanceResource["enable_monitoring"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.syslog.#", "1"), @@ -153,7 +153,7 @@ func TestAccOpenSearchResource(t *testing.T) { "data.stackit_opensearch_credential.credential", "credential_id"), resource.TestCheckResourceAttr("data.stackit_opensearch_instance.instance", "plan_id", instanceResource["plan_id"]), resource.TestCheckResourceAttr("data.stackit_opensearch_instance.instance", "name", instanceResource["name"]), - resource.TestCheckResourceAttr("data.stackit_opensearch_instance.instance", "parameters.sgw_acl", instanceResource["sqw_acl-1"]), + resource.TestCheckResourceAttr("data.stackit_opensearch_instance.instance", "parameters.sgw_acl", instanceResource["sgw_acl-1"]), resource.TestCheckResourceAttr("data.stackit_opensearch_instance.instance", "parameters.max_disk_threshold", instanceResource["max_disk_threshold"]), resource.TestCheckResourceAttr("data.stackit_opensearch_instance.instance", "parameters.enable_monitoring", instanceResource["enable_monitoring"]), resource.TestCheckResourceAttr("data.stackit_opensearch_instance.instance", "parameters.syslog.#", "1"), @@ -223,7 +223,7 @@ func TestAccOpenSearchResource(t *testing.T) { resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "plan_name", instanceResource["plan_name"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "version", instanceResource["version"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "name", instanceResource["name"]), - resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.sgw_acl", instanceResource["sqw_acl-2"]), + resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.sgw_acl", instanceResource["sgw_acl-2"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.max_disk_threshold", instanceResource["max_disk_threshold"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.enable_monitoring", instanceResource["enable_monitoring"]), resource.TestCheckResourceAttr("stackit_opensearch_instance.instance", "parameters.syslog.#", "1"), diff --git a/stackit/internal/services/postgresflex/postgresflex_acc_test.go b/stackit/internal/services/postgresflex/postgresflex_acc_test.go index bf119aaf..64148217 100644 --- a/stackit/internal/services/postgresflex/postgresflex_acc_test.go +++ b/stackit/internal/services/postgresflex/postgresflex_acc_test.go @@ -239,8 +239,9 @@ func TestAccPostgresFlexFlexResource(t *testing.T) { return fmt.Sprintf("%s,%s", testutil.ProjectId, instanceId), nil }, - ImportState: true, - ImportStateVerify: true, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"password"}, }, { ResourceName: "stackit_postgresflex_user.user", @@ -262,7 +263,7 @@ func TestAccPostgresFlexFlexResource(t *testing.T) { }, ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"password"}, + ImportStateVerifyIgnore: []string{"password", "uri"}, }, { ResourceName: "stackit_postgresflex_database.database", diff --git a/stackit/internal/services/redis/redis_acc_test.go b/stackit/internal/services/redis/redis_acc_test.go index 53821561..d38ff5d6 100644 --- a/stackit/internal/services/redis/redis_acc_test.go +++ b/stackit/internal/services/redis/redis_acc_test.go @@ -116,7 +116,6 @@ func TestAccRedisResource(t *testing.T) { "metrics_frequency": "10", "metrics_prefix": "prefix", "min_replicas_max_lag": "15", - "monitoring_instance_id": "mid", "notify_keyspace_events": "Ex", "syslog": `["syslog.example.com:123"]`, "tls_protocols": "TLSv1.2", @@ -146,7 +145,6 @@ func TestAccRedisResource(t *testing.T) { resource.TestCheckResourceAttr("stackit_redis_instance.instance", "parameters.metrics_frequency", "10"), resource.TestCheckResourceAttr("stackit_redis_instance.instance", "parameters.metrics_prefix", "prefix"), resource.TestCheckResourceAttr("stackit_redis_instance.instance", "parameters.min_replicas_max_lag", "15"), - resource.TestCheckResourceAttr("stackit_redis_instance.instance", "parameters.monitoring_instance_id", "mid"), resource.TestCheckResourceAttr("stackit_redis_instance.instance", "parameters.notify_keyspace_events", "Ex"), resource.TestCheckResourceAttr("stackit_redis_instance.instance", "parameters.syslog.#", "1"), resource.TestCheckResourceAttr("stackit_redis_instance.instance", "parameters.syslog.0", "syslog.example.com:123"), diff --git a/stackit/internal/testutil/testutil.go b/stackit/internal/testutil/testutil.go index 297365b3..4d3e2319 100644 --- a/stackit/internal/testutil/testutil.go +++ b/stackit/internal/testutil/testutil.go @@ -48,7 +48,7 @@ var ( // Default email: acc-test@sa.stackit.cloud TestProjectUserEmail = getenv("TF_ACC_TEST_PROJECT_USER_EMAIL", "acc-test@sa.stackit.cloud") // TestImageLocalFilePath is the local path to an image file used for image acceptance tests - TestImageLocalFilePath = os.Getenv("TF_ACC_TEST_IMAGE_LOCAL_FILE_PATH") + TestImageLocalFilePath = getenv("TF_ACC_TEST_IMAGE_LOCAL_FILE_PATH", "default") ArgusCustomEndpoint = os.Getenv("TF_ACC_ARGUS_CUSTOM_ENDPOINT") DnsCustomEndpoint = os.Getenv("TF_ACC_DNS_CUSTOM_ENDPOINT") @@ -432,3 +432,25 @@ func getenv(key, defaultValue string) string { } return val } + +// helper for local_file_path +// no real data is created +func CreateDefaultLocalFile() os.File { + // Define the file name and size + fileName := "test-512k.img" + size := 512 * 1024 // 512 KB + + // Create the file + file, err := os.Create(fileName) + if err != nil { + panic(err) + } + + // Seek to the desired position (512 KB) + _, err = file.Seek(int64(size), 0) + if err != nil { + panic(err) + } + + return *file +}