diff --git a/.github/actions/setup-cache-go/action.yaml b/.github/actions/setup-cache-go/action.yaml new file mode 100644 index 00000000..8837ca59 --- /dev/null +++ b/.github/actions/setup-cache-go/action.yaml @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: MIT +name: 'Forgejo Actions to setup Go and cache dependencies' +author: 'Forgejo authors' +description: | + Wrap the setup-go with improved dependency caching. +inputs: + username: + description: 'User for which to manage the dependency cache' + default: root + +runs: + using: "composite" + steps: + - name: "Install zstd for faster caching" + run: | + apt-get update -qq + apt-get -q install -qq -y zstd + + - name: "Set up Go using setup-go" + uses: https://data.forgejo.org/actions/setup-go@v6 + id: go-version + with: + go-version-file: "go.mod" + # do not cache dependencies, we do this manually + cache: false + + - name: "Get go environment information" + id: go-environment + run: | + chmod 755 $HOME # ensure ${RUN_AS_USER} has permission when go is located in $HOME + export GOROOT="$(go env GOROOT)" + echo "modcache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOMODCACHE')" >> "$GITHUB_OUTPUT" + echo "cache=$(su ${RUN_AS_USER} -c '${GOROOT}/bin/go env GOCACHE')" >> "$GITHUB_OUTPUT" + env: + RUN_AS_USER: ${{ inputs.username }} + GO_VERSION: ${{ steps.go-version.outputs.go-version }} + + - name: "Create cache folders with correct permissions (for non-root users)" + if: inputs.username != 'root' + # when the cache is restored, only the permissions of the last part are restored + # so assuming that /home/user exists and we are restoring /home/user/go/pkg/mod, + # both folders will have the correct permissions, but + # /home/user/go and /home/user/go/pkg might be owned by root + run: | + su ${RUN_AS_USER} -c 'mkdir -p "${MODCACHE_DIR}" "${CACHE_DIR}"' + env: + RUN_AS_USER: ${{ inputs.username }} + MODCACHE_DIR: ${{ steps.go-environment.outputs.modcache }} + CACHE_DIR: ${{ steps.go-environment.outputs.cache }} + + - name: "Restore Go dependencies from cache or mark for later caching" + id: cache-deps + uses: https://code.forgejo.org/actions/cache@v5 + with: + key: setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}-${{ steps.go-version.outputs.go_version }}-${{ hashFiles('go.sum', 'go.mod') }} + restore-keys: | + setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}-${{ steps.go-version.outputs.go_version }}- + setup-cache-go-deps-${{ runner.os }}-${{ inputs.username }}- + path: | + ${{ steps.go-environment.outputs.modcache }} + ${{ steps.go-environment.outputs.cache }} diff --git a/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go b/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go index 6c8a6bf5..dba1a086 100644 --- a/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go +++ b/stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go @@ -3,26 +3,16 @@ package postgresflexalpha_test import ( "context" _ "embed" - "encoding/json" "fmt" - "log" - "net/http" - "net/http/httptest" "os" - "strings" + "strconv" "testing" "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/utils" postgresflexalpha "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance" - "github.com/stackitcloud/stackit-sdk-go/core/config" "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/internal/testutils" - "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/core" - - postgresflex "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/postgresflexalpha" // The fwresource import alias is so there is no collision // with the more typical acceptance testing import: // "github.com/hashicorp/terraform-plugin-testing/helper/resource" @@ -151,7 +141,7 @@ func TestAccResourceExample_basic(t *testing.T) { ) updNameData := exData - updNameData.Name = "name_updated" + updNameData.Name = "name-updated" updSizeData := exData updSizeData.Size = 25 @@ -188,7 +178,11 @@ func TestAccResourceExample_basic(t *testing.T) { updSizeData, ), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(resName, "size", updNameData.Name), + resource.TestCheckResourceAttr( + resName, + "storage.size", + strconv.Itoa(int(updSizeData.Size)), + ), ), }, //// Import test @@ -201,66 +195,44 @@ func TestAccResourceExample_basic(t *testing.T) { }) } -//func testCheckResourceExists(resourceName string) resource.TestCheckFunc { -// return func(s *terraform.State) error { -// rs, ok := s.RootModule().Resources[resourceName] -// if !ok { -// return fmt.Errorf("resource not found: %s", resourceName) +//func setupMockServer() *httptest.Server { +// mux := http.NewServeMux() +// +// mux.HandleFunc("/api/resources", func(w http.ResponseWriter, r *http.Request) { +// switch r.Method { +// case http.MethodPost: +// w.WriteHeader(http.StatusCreated) +// err := json.NewEncoder(w).Encode(map[string]string{ +// "id": "mock-id-123", +// "name": "test-resource", +// }) +// if err != nil { +// log.Fatalln(err) +// } +// case http.MethodGet: +// w.WriteHeader(http.StatusOK) +// err := json.NewEncoder(w).Encode([]map[string]string{}) +// if err != nil { +// log.Fatalln(err) +// } // } +// }) // -// if rs.Primary.ID == "" { -// return fmt.Errorf("resource ID not set") -// } -// -// // Verify resource exists in the API -// //client := testAccProvider.Meta().(*APIClient) -// //_, err := client.GetResource(rs.Primary.ID) -// //if err != nil { -// // return fmt.Errorf("error fetching resource: %w", err) -// //} -// -// return nil -// } +// return httptest.NewServer(mux) +//} +// +//func TestUnitResourceCreate(t *testing.T) { +// server := setupMockServer() +// defer server.Close() +// +// // Configure provider to use mock server URL +// err := os.Setenv("API_ENDPOINT", server.URL) +// if err != nil { +// log.Fatalln(err) +// } +// +// // Run unit tests against mock //} - -func setupMockServer() *httptest.Server { - mux := http.NewServeMux() - - mux.HandleFunc("/api/resources", func(w http.ResponseWriter, r *http.Request) { - switch r.Method { - case http.MethodPost: - w.WriteHeader(http.StatusCreated) - err := json.NewEncoder(w).Encode(map[string]string{ - "id": "mock-id-123", - "name": "test-resource", - }) - if err != nil { - log.Fatalln(err) - } - case http.MethodGet: - w.WriteHeader(http.StatusOK) - err := json.NewEncoder(w).Encode([]map[string]string{}) - if err != nil { - log.Fatalln(err) - } - } - }) - - return httptest.NewServer(mux) -} - -func TestUnitResourceCreate(t *testing.T) { - server := setupMockServer() - defer server.Close() - - // Configure provider to use mock server URL - err := os.Setenv("API_ENDPOINT", server.URL) - if err != nil { - log.Fatalln(err) - } - - // Run unit tests against mock -} // type postgresFlexClientMocked struct { // returnError bool @@ -313,578 +285,578 @@ func TestUnitResourceCreate(t *testing.T) { // //} //} -// Instance resource data -var instanceResource = map[string]string{ - "project_id": testutils.ProjectId, - "region": "eu01", - "name": fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(7, acctest.CharSetAlphaNum)), - "acl": "192.168.0.0/16", - "backup_schedule": "00 16 * * *", - "backup_schedule_updated": "00 12 * * *", - "retention_days": "33", - "flavor_cpu": "2", - "flavor_ram": "4", - "flavor_description": "Small, Compute optimized", - "replicas": "1", - "storage_class": "premium-perf12-stackit", - "storage_size": "5", - "version": "14", - "flavor_id": "2.4", - "kek_key_id": "UUID1", - "kek_key_ring_id": "UUID2", - "kek_key_version": "1", - "service_account": "service@account.com", - "access_scope": "SNA", -} - -// User resource data -var userResource = map[string]string{ - "username": fmt.Sprintf("tfaccuser%s", acctest.RandStringFromCharSet(4, acctest.CharSetAlpha)), - "role": "createdb", - "project_id": testutils.ProjectId, -} - -// Database resource data -var databaseResource = map[string]string{ - "name": fmt.Sprintf("tfaccdb%s", acctest.RandStringFromCharSet(4, acctest.CharSetAlphaNum)), - "project_id": testutils.ProjectId, -} - -func configResources(backupSchedule string, _ *string) string { - return fmt.Sprintf( - ` - %s - - - resource "stackitprivatepreview_postgresflexalpha_instance" "instance" { - project_id = "%s" - region = "%s" - name = "%s" - backup_schedule = "%s" - retention_days = %s - flavor_id = %s - replicas = %s - storage = { - performance_class = "%s" - size = %s - } - encryption = { - kek_key_id = "%s" - kek_key_ring_id = "%s" - kek_key_version = "%s" - service_account = "%s" - } - network = { - acl = ["%s"] - access_scope = "%s" - } - version = %s - } - - resource "stackitprivatepreview_postgresflexalpha_user" "user" { - project_id = "%s" - instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id - username = "%s" - roles = ["%s"] - } - - resource "stackitprivatepreview_postgresflexalpha_database" "database" { - project_id = "%s" - instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id - name = "%s" - owner = stackitprivatepreview_postgresflexalpha_user.user.username - } - `, - testutils.PostgresFlexProviderConfig( - utils.GetEnvOrDefault("TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_FILE", "~/service-account.json"), - ), - instanceResource["project_id"], - instanceResource["region"], - instanceResource["name"], - backupSchedule, - instanceResource["retention_days"], - instanceResource["flavor_id"], - instanceResource["replicas"], - instanceResource["storage_class"], - instanceResource["storage_size"], - instanceResource["kek_key_id"], - instanceResource["kek_key_ring_id"], - instanceResource["kek_key_version"], - instanceResource["service_account"], - instanceResource["acl"], - instanceResource["access_scope"], - instanceResource["version"], - - userResource["project_id"], - userResource["username"], - userResource["role"], - - databaseResource["project_id"], - databaseResource["name"], - ) -} - -func TestAccPostgresFlexFlexResource(t *testing.T) { - resource.Test( - t, resource.TestCase{ - ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories, - CheckDestroy: testAccCheckPostgresFlexDestroy, - Steps: []resource.TestStep{ - // Creation - { - // testdata/ - // ConfigDirectory: config.TestNameDirectory(), - - // testdata// - // ConfigDirectory: config.TestStepDirectory(), - Config: configResources(instanceResource["backup_schedule"], &testutils.Region), - Check: resource.ComposeAggregateTestCheckFunc( - // Instance - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "project_id", - instanceResource["project_id"], - ), - resource.TestCheckResourceAttrSet( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "instance_id", - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "name", - instanceResource["name"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "acl.#", - "1", - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "acl.0", - instanceResource["acl"], - ), - resource.TestCheckResourceAttrSet( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.id", - ), - resource.TestCheckResourceAttrSet( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.description", - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "backup_schedule", - instanceResource["backup_schedule"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.cpu", - instanceResource["flavor_cpu"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.ram", - instanceResource["flavor_ram"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "replicas", - instanceResource["replicas"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "storage.class", - instanceResource["storage_class"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "storage.size", - instanceResource["storage_size"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "version", - instanceResource["version"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "region", - testutils.Region, - ), - - // User - resource.TestCheckResourceAttrPair( - "stackitprivatepreview_postgresflexalpha_user.user", "project_id", - "stackitprivatepreview_postgresflexalpha_instance.instance", "project_id", - ), - resource.TestCheckResourceAttrPair( - "stackitprivatepreview_postgresflexalpha_user.user", "instance_id", - "stackitprivatepreview_postgresflexalpha_instance.instance", "instance_id", - ), - resource.TestCheckResourceAttrSet("stackitprivatepreview_postgresflexalpha_user.user", "user_id"), - resource.TestCheckResourceAttrSet("stackitprivatepreview_postgresflexalpha_user.user", "password"), - - // Database - resource.TestCheckResourceAttrPair( - "stackitprivatepreview_postgresflexalpha_database.database", "project_id", - "stackitprivatepreview_postgresflexalpha_instance.instance", "project_id", - ), - resource.TestCheckResourceAttrPair( - "stackitprivatepreview_postgresflexalpha_database.database", "instance_id", - "stackitprivatepreview_postgresflexalpha_instance.instance", "instance_id", - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_database.database", - "name", - databaseResource["name"], - ), - resource.TestCheckResourceAttrPair( - "stackitprivatepreview_postgresflexalpha_database.database", "owner", - "stackitprivatepreview_postgresflexalpha_user.user", "username", - ), - ), - }, - // data source - { - Config: fmt.Sprintf( - ` - %s - - data "stackitprivatepreview_postgresflexalpha_instance" "instance" { - project_id = stackitprivatepreview_postgresflexalpha_instance.instance.project_id - instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id - } - - data "stackitprivatepreview_postgresflexalpha_user" "user" { - project_id = stackitprivatepreview_postgresflexalpha_instance.instance.project_id - instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id - user_id = stackitprivatepreview_postgresflexalpha_user.user.user_id - } - - data "stackitprivatepreview_postgresflexalpha_database" "database" { - project_id = stackitprivatepreview_postgresflexalpha_instance.instance.project_id - instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id - database_id = stackitprivatepreview_postgresflexalpha_database.database.database_id - } - `, - configResources(instanceResource["backup_schedule"], nil), - ), - Check: resource.ComposeAggregateTestCheckFunc( - // Instance data - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "project_id", - instanceResource["project_id"], - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "name", - instanceResource["name"], - ), - resource.TestCheckResourceAttrPair( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", "project_id", - "stackitprivatepreview_postgresflexalpha_instance.instance", "project_id", - ), - resource.TestCheckResourceAttrPair( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", "instance_id", - "stackitprivatepreview_postgresflexalpha_instance.instance", "instance_id", - ), - resource.TestCheckResourceAttrPair( - "data.stackitprivatepreview_postgresflexalpha_user.user", "instance_id", - "stackitprivatepreview_postgresflexalpha_user.user", "instance_id", - ), - - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "acl.#", - "1", - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "acl.0", - instanceResource["acl"], - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "backup_schedule", - instanceResource["backup_schedule"], - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.id", - instanceResource["flavor_id"], - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.description", - instanceResource["flavor_description"], - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.cpu", - instanceResource["flavor_cpu"], - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.ram", - instanceResource["flavor_ram"], - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_instance.instance", - "replicas", - instanceResource["replicas"], - ), - - // User data - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_user.user", - "project_id", - userResource["project_id"], - ), - resource.TestCheckResourceAttrSet( - "data.stackitprivatepreview_postgresflexalpha_user.user", - "user_id", - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_user.user", - "username", - userResource["username"], - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_user.user", - "roles.#", - "1", - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_user.user", - "roles.0", - userResource["role"], - ), - resource.TestCheckResourceAttrSet( - "data.stackitprivatepreview_postgresflexalpha_user.user", - "host", - ), - resource.TestCheckResourceAttrSet( - "data.stackitprivatepreview_postgresflexalpha_user.user", - "port", - ), - - // Database data - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_database.database", - "project_id", - instanceResource["project_id"], - ), - resource.TestCheckResourceAttr( - "data.stackitprivatepreview_postgresflexalpha_database.database", - "name", - databaseResource["name"], - ), - resource.TestCheckResourceAttrPair( - "data.stackitprivatepreview_postgresflexalpha_database.database", - "instance_id", - "stackitprivatepreview_postgresflexalpha_instance.instance", - "instance_id", - ), - resource.TestCheckResourceAttrPair( - "data.stackitprivatepreview_postgresflexalpha_database.database", - "owner", - "data.stackitprivatepreview_postgresflexalpha_user.user", - "username", - ), - ), - }, - // Import - { - ResourceName: "stackitprivatepreview_postgresflexalpha_instance.instance", - ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources["stackitprivatepreview_postgresflexalpha_instance.instance"] - if !ok { - return "", fmt.Errorf("couldn't find resource stackitprivatepreview_postgresflexalpha_instance.instance") - } - instanceId, ok := r.Primary.Attributes["instance_id"] - if !ok { - return "", fmt.Errorf("couldn't find attribute instance_id") - } - - return fmt.Sprintf("%s,%s,%s", testutils.ProjectId, testutils.Region, instanceId), nil - }, - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"password"}, - }, - { - ResourceName: "stackitprivatepreview_postgresflexalpha_user.user", - ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources["stackitprivatepreview_postgresflexalpha_user.user"] - if !ok { - return "", fmt.Errorf("couldn't find resource stackitprivatepreview_postgresflexalpha_user.user") - } - instanceId, ok := r.Primary.Attributes["instance_id"] - if !ok { - return "", fmt.Errorf("couldn't find attribute instance_id") - } - userId, ok := r.Primary.Attributes["user_id"] - if !ok { - return "", fmt.Errorf("couldn't find attribute user_id") - } - - return fmt.Sprintf("%s,%s,%s,%s", testutils.ProjectId, testutils.Region, instanceId, userId), nil - }, - ImportState: true, - ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"password", "uri"}, - }, - { - ResourceName: "stackitprivatepreview_postgresflexalpha_database.database", - ImportStateIdFunc: func(s *terraform.State) (string, error) { - r, ok := s.RootModule().Resources["stackitprivatepreview_postgresflexalpha_database.database"] - if !ok { - return "", fmt.Errorf("couldn't find resource stackitprivatepreview_postgresflexalpha_database.database") - } - instanceId, ok := r.Primary.Attributes["instance_id"] - if !ok { - return "", fmt.Errorf("couldn't find attribute instance_id") - } - databaseId, ok := r.Primary.Attributes["database_id"] - if !ok { - return "", fmt.Errorf("couldn't find attribute database_id") - } - - return fmt.Sprintf( - "%s,%s,%s,%s", - testutils.ProjectId, - testutils.Region, - instanceId, - databaseId, - ), nil - }, - ImportState: true, - ImportStateVerify: true, - }, - // Update - { - Config: configResources(instanceResource["backup_schedule_updated"], nil), - Check: resource.ComposeAggregateTestCheckFunc( - // Instance data - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "project_id", - instanceResource["project_id"], - ), - resource.TestCheckResourceAttrSet( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "instance_id", - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "name", - instanceResource["name"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "acl.#", - "1", - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "acl.0", - instanceResource["acl"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "backup_schedule", - instanceResource["backup_schedule_updated"], - ), - resource.TestCheckResourceAttrSet( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.id", - ), - resource.TestCheckResourceAttrSet( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.description", - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.cpu", - instanceResource["flavor_cpu"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "flavor.ram", - instanceResource["flavor_ram"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "replicas", - instanceResource["replicas"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "storage.class", - instanceResource["storage_class"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "storage.size", - instanceResource["storage_size"], - ), - resource.TestCheckResourceAttr( - "stackitprivatepreview_postgresflexalpha_instance.instance", - "version", - instanceResource["version"], - ), - ), - }, - // Deletion is done by the framework implicitly - }, - }, - ) -} - -func testAccCheckPostgresFlexDestroy(s *terraform.State) error { - ctx := context.Background() - var client *postgresflex.APIClient - var err error - if testutils.PostgresFlexCustomEndpoint == "" { - client, err = postgresflex.NewAPIClient() - } else { - client, err = postgresflex.NewAPIClient( - config.WithEndpoint(testutils.PostgresFlexCustomEndpoint), - ) - } - if err != nil { - return fmt.Errorf("creating client: %w", err) - } - - instancesToDestroy := []string{} - for _, rs := range s.RootModule().Resources { - if rs.Type != "stackitprivatepreview_postgresflexalpha_instance" { - continue - } - // instance terraform ID: = "[project_id],[region],[instance_id]" - instanceId := strings.Split(rs.Primary.ID, core.Separator)[2] - instancesToDestroy = append(instancesToDestroy, instanceId) - } - - instancesResp, err := client.ListInstancesRequest(ctx, testutils.ProjectId, testutils.Region).Execute() - if err != nil { - return fmt.Errorf("getting instancesResp: %w", err) - } - - items := *instancesResp.Instances - for i := range items { - if items[i].Id == nil { - continue - } - if utils.Contains(instancesToDestroy, *items[i].Id) { - // TODO @mhenselin - does force still exist? - err := client.DeleteInstanceRequestExecute(ctx, testutils.ProjectId, testutils.Region, *items[i].Id) - if err != nil { - return fmt.Errorf("deleting instance %s during CheckDestroy: %w", *items[i].Id, err) - } - } - } - return nil -} +//// Instance resource data +//var instanceResource = map[string]string{ +// "project_id": testutils.ProjectId, +// "region": "eu01", +// "name": fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(7, acctest.CharSetAlphaNum)), +// "acl": "192.168.0.0/16", +// "backup_schedule": "00 16 * * *", +// "backup_schedule_updated": "00 12 * * *", +// "retention_days": "33", +// "flavor_cpu": "2", +// "flavor_ram": "4", +// "flavor_description": "Small, Compute optimized", +// "replicas": "1", +// "storage_class": "premium-perf12-stackit", +// "storage_size": "5", +// "version": "14", +// "flavor_id": "2.4", +// "kek_key_id": "UUID1", +// "kek_key_ring_id": "UUID2", +// "kek_key_version": "1", +// "service_account": "service@account.com", +// "access_scope": "SNA", +//} +// +//// User resource data +//var userResource = map[string]string{ +// "username": fmt.Sprintf("tfaccuser%s", acctest.RandStringFromCharSet(4, acctest.CharSetAlpha)), +// "role": "createdb", +// "project_id": testutils.ProjectId, +//} +// +//// Database resource data +//var databaseResource = map[string]string{ +// "name": fmt.Sprintf("tfaccdb%s", acctest.RandStringFromCharSet(4, acctest.CharSetAlphaNum)), +// "project_id": testutils.ProjectId, +//} +// +//func configResources(backupSchedule string, _ *string) string { +// return fmt.Sprintf( +// ` +// %s +// +// +// resource "stackitprivatepreview_postgresflexalpha_instance" "instance" { +// project_id = "%s" +// region = "%s" +// name = "%s" +// backup_schedule = "%s" +// retention_days = %s +// flavor_id = %s +// replicas = %s +// storage = { +// performance_class = "%s" +// size = %s +// } +// encryption = { +// kek_key_id = "%s" +// kek_key_ring_id = "%s" +// kek_key_version = "%s" +// service_account = "%s" +// } +// network = { +// acl = ["%s"] +// access_scope = "%s" +// } +// version = %s +// } +// +// resource "stackitprivatepreview_postgresflexalpha_user" "user" { +// project_id = "%s" +// instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id +// username = "%s" +// roles = ["%s"] +// } +// +// resource "stackitprivatepreview_postgresflexalpha_database" "database" { +// project_id = "%s" +// instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id +// name = "%s" +// owner = stackitprivatepreview_postgresflexalpha_user.user.username +// } +// `, +// testutils.PostgresFlexProviderConfig( +// utils.GetEnvOrDefault("TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_FILE", "~/service-account.json"), +// ), +// instanceResource["project_id"], +// instanceResource["region"], +// instanceResource["name"], +// backupSchedule, +// instanceResource["retention_days"], +// instanceResource["flavor_id"], +// instanceResource["replicas"], +// instanceResource["storage_class"], +// instanceResource["storage_size"], +// instanceResource["kek_key_id"], +// instanceResource["kek_key_ring_id"], +// instanceResource["kek_key_version"], +// instanceResource["service_account"], +// instanceResource["acl"], +// instanceResource["access_scope"], +// instanceResource["version"], +// +// userResource["project_id"], +// userResource["username"], +// userResource["role"], +// +// databaseResource["project_id"], +// databaseResource["name"], +// ) +//} +// +//func TestAccPostgresFlexFlexResource(t *testing.T) { +// resource.Test( +// t, resource.TestCase{ +// ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories, +// CheckDestroy: testAccCheckPostgresFlexDestroy, +// Steps: []resource.TestStep{ +// // Creation +// { +// // testdata/ +// // ConfigDirectory: config.TestNameDirectory(), +// +// // testdata// +// // ConfigDirectory: config.TestStepDirectory(), +// Config: configResources(instanceResource["backup_schedule"], &testutils.Region), +// Check: resource.ComposeAggregateTestCheckFunc( +// // Instance +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "project_id", +// instanceResource["project_id"], +// ), +// resource.TestCheckResourceAttrSet( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "instance_id", +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "name", +// instanceResource["name"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "acl.#", +// "1", +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "acl.0", +// instanceResource["acl"], +// ), +// resource.TestCheckResourceAttrSet( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.id", +// ), +// resource.TestCheckResourceAttrSet( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.description", +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "backup_schedule", +// instanceResource["backup_schedule"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.cpu", +// instanceResource["flavor_cpu"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.ram", +// instanceResource["flavor_ram"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "replicas", +// instanceResource["replicas"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "storage.class", +// instanceResource["storage_class"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "storage.size", +// instanceResource["storage_size"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "version", +// instanceResource["version"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "region", +// testutils.Region, +// ), +// +// // User +// resource.TestCheckResourceAttrPair( +// "stackitprivatepreview_postgresflexalpha_user.user", "project_id", +// "stackitprivatepreview_postgresflexalpha_instance.instance", "project_id", +// ), +// resource.TestCheckResourceAttrPair( +// "stackitprivatepreview_postgresflexalpha_user.user", "instance_id", +// "stackitprivatepreview_postgresflexalpha_instance.instance", "instance_id", +// ), +// resource.TestCheckResourceAttrSet("stackitprivatepreview_postgresflexalpha_user.user", "user_id"), +// resource.TestCheckResourceAttrSet("stackitprivatepreview_postgresflexalpha_user.user", "password"), +// +// // Database +// resource.TestCheckResourceAttrPair( +// "stackitprivatepreview_postgresflexalpha_database.database", "project_id", +// "stackitprivatepreview_postgresflexalpha_instance.instance", "project_id", +// ), +// resource.TestCheckResourceAttrPair( +// "stackitprivatepreview_postgresflexalpha_database.database", "instance_id", +// "stackitprivatepreview_postgresflexalpha_instance.instance", "instance_id", +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_database.database", +// "name", +// databaseResource["name"], +// ), +// resource.TestCheckResourceAttrPair( +// "stackitprivatepreview_postgresflexalpha_database.database", "owner", +// "stackitprivatepreview_postgresflexalpha_user.user", "username", +// ), +// ), +// }, +// // data source +// { +// Config: fmt.Sprintf( +// ` +// %s +// +// data "stackitprivatepreview_postgresflexalpha_instance" "instance" { +// project_id = stackitprivatepreview_postgresflexalpha_instance.instance.project_id +// instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id +// } +// +// data "stackitprivatepreview_postgresflexalpha_user" "user" { +// project_id = stackitprivatepreview_postgresflexalpha_instance.instance.project_id +// instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id +// user_id = stackitprivatepreview_postgresflexalpha_user.user.user_id +// } +// +// data "stackitprivatepreview_postgresflexalpha_database" "database" { +// project_id = stackitprivatepreview_postgresflexalpha_instance.instance.project_id +// instance_id = stackitprivatepreview_postgresflexalpha_instance.instance.instance_id +// database_id = stackitprivatepreview_postgresflexalpha_database.database.database_id +// } +// `, +// configResources(instanceResource["backup_schedule"], nil), +// ), +// Check: resource.ComposeAggregateTestCheckFunc( +// // Instance data +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "project_id", +// instanceResource["project_id"], +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "name", +// instanceResource["name"], +// ), +// resource.TestCheckResourceAttrPair( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", "project_id", +// "stackitprivatepreview_postgresflexalpha_instance.instance", "project_id", +// ), +// resource.TestCheckResourceAttrPair( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", "instance_id", +// "stackitprivatepreview_postgresflexalpha_instance.instance", "instance_id", +// ), +// resource.TestCheckResourceAttrPair( +// "data.stackitprivatepreview_postgresflexalpha_user.user", "instance_id", +// "stackitprivatepreview_postgresflexalpha_user.user", "instance_id", +// ), +// +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "acl.#", +// "1", +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "acl.0", +// instanceResource["acl"], +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "backup_schedule", +// instanceResource["backup_schedule"], +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.id", +// instanceResource["flavor_id"], +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.description", +// instanceResource["flavor_description"], +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.cpu", +// instanceResource["flavor_cpu"], +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.ram", +// instanceResource["flavor_ram"], +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_instance.instance", +// "replicas", +// instanceResource["replicas"], +// ), +// +// // User data +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_user.user", +// "project_id", +// userResource["project_id"], +// ), +// resource.TestCheckResourceAttrSet( +// "data.stackitprivatepreview_postgresflexalpha_user.user", +// "user_id", +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_user.user", +// "username", +// userResource["username"], +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_user.user", +// "roles.#", +// "1", +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_user.user", +// "roles.0", +// userResource["role"], +// ), +// resource.TestCheckResourceAttrSet( +// "data.stackitprivatepreview_postgresflexalpha_user.user", +// "host", +// ), +// resource.TestCheckResourceAttrSet( +// "data.stackitprivatepreview_postgresflexalpha_user.user", +// "port", +// ), +// +// // Database data +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_database.database", +// "project_id", +// instanceResource["project_id"], +// ), +// resource.TestCheckResourceAttr( +// "data.stackitprivatepreview_postgresflexalpha_database.database", +// "name", +// databaseResource["name"], +// ), +// resource.TestCheckResourceAttrPair( +// "data.stackitprivatepreview_postgresflexalpha_database.database", +// "instance_id", +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "instance_id", +// ), +// resource.TestCheckResourceAttrPair( +// "data.stackitprivatepreview_postgresflexalpha_database.database", +// "owner", +// "data.stackitprivatepreview_postgresflexalpha_user.user", +// "username", +// ), +// ), +// }, +// // Import +// { +// ResourceName: "stackitprivatepreview_postgresflexalpha_instance.instance", +// ImportStateIdFunc: func(s *terraform.State) (string, error) { +// r, ok := s.RootModule().Resources["stackitprivatepreview_postgresflexalpha_instance.instance"] +// if !ok { +// return "", fmt.Errorf("couldn't find resource stackitprivatepreview_postgresflexalpha_instance.instance") +// } +// instanceId, ok := r.Primary.Attributes["instance_id"] +// if !ok { +// return "", fmt.Errorf("couldn't find attribute instance_id") +// } +// +// return fmt.Sprintf("%s,%s,%s", testutils.ProjectId, testutils.Region, instanceId), nil +// }, +// ImportState: true, +// ImportStateVerify: true, +// ImportStateVerifyIgnore: []string{"password"}, +// }, +// { +// ResourceName: "stackitprivatepreview_postgresflexalpha_user.user", +// ImportStateIdFunc: func(s *terraform.State) (string, error) { +// r, ok := s.RootModule().Resources["stackitprivatepreview_postgresflexalpha_user.user"] +// if !ok { +// return "", fmt.Errorf("couldn't find resource stackitprivatepreview_postgresflexalpha_user.user") +// } +// instanceId, ok := r.Primary.Attributes["instance_id"] +// if !ok { +// return "", fmt.Errorf("couldn't find attribute instance_id") +// } +// userId, ok := r.Primary.Attributes["user_id"] +// if !ok { +// return "", fmt.Errorf("couldn't find attribute user_id") +// } +// +// return fmt.Sprintf("%s,%s,%s,%s", testutils.ProjectId, testutils.Region, instanceId, userId), nil +// }, +// ImportState: true, +// ImportStateVerify: true, +// ImportStateVerifyIgnore: []string{"password", "uri"}, +// }, +// { +// ResourceName: "stackitprivatepreview_postgresflexalpha_database.database", +// ImportStateIdFunc: func(s *terraform.State) (string, error) { +// r, ok := s.RootModule().Resources["stackitprivatepreview_postgresflexalpha_database.database"] +// if !ok { +// return "", fmt.Errorf("couldn't find resource stackitprivatepreview_postgresflexalpha_database.database") +// } +// instanceId, ok := r.Primary.Attributes["instance_id"] +// if !ok { +// return "", fmt.Errorf("couldn't find attribute instance_id") +// } +// databaseId, ok := r.Primary.Attributes["database_id"] +// if !ok { +// return "", fmt.Errorf("couldn't find attribute database_id") +// } +// +// return fmt.Sprintf( +// "%s,%s,%s,%s", +// testutils.ProjectId, +// testutils.Region, +// instanceId, +// databaseId, +// ), nil +// }, +// ImportState: true, +// ImportStateVerify: true, +// }, +// // Update +// { +// Config: configResources(instanceResource["backup_schedule_updated"], nil), +// Check: resource.ComposeAggregateTestCheckFunc( +// // Instance data +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "project_id", +// instanceResource["project_id"], +// ), +// resource.TestCheckResourceAttrSet( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "instance_id", +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "name", +// instanceResource["name"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "acl.#", +// "1", +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "acl.0", +// instanceResource["acl"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "backup_schedule", +// instanceResource["backup_schedule_updated"], +// ), +// resource.TestCheckResourceAttrSet( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.id", +// ), +// resource.TestCheckResourceAttrSet( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.description", +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.cpu", +// instanceResource["flavor_cpu"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "flavor.ram", +// instanceResource["flavor_ram"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "replicas", +// instanceResource["replicas"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "storage.class", +// instanceResource["storage_class"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "storage.size", +// instanceResource["storage_size"], +// ), +// resource.TestCheckResourceAttr( +// "stackitprivatepreview_postgresflexalpha_instance.instance", +// "version", +// instanceResource["version"], +// ), +// ), +// }, +// // Deletion is done by the framework implicitly +// }, +// }, +// ) +//} +// +//func testAccCheckPostgresFlexDestroy(s *terraform.State) error { +// ctx := context.Background() +// var client *postgresflex.APIClient +// var err error +// if testutils.PostgresFlexCustomEndpoint == "" { +// client, err = postgresflex.NewAPIClient() +// } else { +// client, err = postgresflex.NewAPIClient( +// config.WithEndpoint(testutils.PostgresFlexCustomEndpoint), +// ) +// } +// if err != nil { +// return fmt.Errorf("creating client: %w", err) +// } +// +// instancesToDestroy := []string{} +// for _, rs := range s.RootModule().Resources { +// if rs.Type != "stackitprivatepreview_postgresflexalpha_instance" { +// continue +// } +// // instance terraform ID: = "[project_id],[region],[instance_id]" +// instanceId := strings.Split(rs.Primary.ID, core.Separator)[2] +// instancesToDestroy = append(instancesToDestroy, instanceId) +// } +// +// instancesResp, err := client.ListInstancesRequest(ctx, testutils.ProjectId, testutils.Region).Execute() +// if err != nil { +// return fmt.Errorf("getting instancesResp: %w", err) +// } +// +// items := *instancesResp.Instances +// for i := range items { +// if items[i].Id == nil { +// continue +// } +// if utils.Contains(instancesToDestroy, *items[i].Id) { +// // TODO @mhenselin - does force still exist? +// err := client.DeleteInstanceRequestExecute(ctx, testutils.ProjectId, testutils.Region, *items[i].Id) +// if err != nil { +// return fmt.Errorf("deleting instance %s during CheckDestroy: %w", *items[i].Id, err) +// } +// } +// } +// return nil +//}