terraform-provider-stackitp.../stackit/internal/services/postgresflexalpha/postgresflex_acc_test.go

1033 lines
33 KiB
Go

package postgresflexalpha_test
import (
"context"
_ "embed"
"fmt"
"log"
"os"
"strconv"
"strings"
"testing"
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/stackitcloud/stackit-sdk-go/core/config"
postgresflexalpha2 "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/postgresflexalpha"
postgresflexalpha "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance"
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/internal/testutils"
// 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"
fwresource "github.com/hashicorp/terraform-plugin-framework/resource"
)
const pfx = "stackitprivatepreview_postgresflexalpha"
var testInstances []string
func init() {
sweeperName := fmt.Sprintf("%s_%s", pfx, "sweeper")
resource.AddTestSweepers(
sweeperName, &resource.Sweeper{
Name: sweeperName,
F: func(_ string) error { // region is passed by the testing framework
ctx := context.Background()
apiClientConfigOptions := []config.ConfigurationOption{}
apiClient, err := postgresflexalpha2.NewAPIClient(apiClientConfigOptions...)
if err != nil {
log.Fatalln(err)
}
instances, err := apiClient.ListInstancesRequest(ctx, testutils.ProjectId, testutils.Region).
Size(100).
Execute()
if err != nil {
log.Fatalln(err)
}
for _, inst := range instances.GetInstances() {
if strings.HasPrefix(inst.GetName(), "tf-acc-") {
for _, item := range testInstances {
if inst.GetName() == item {
delErr := apiClient.DeleteInstanceRequestExecute(
ctx,
testutils.ProjectId,
testutils.Region,
inst.GetId(),
)
if delErr != nil {
// TODO: maybe just warn?
log.Fatalln(delErr)
}
}
}
}
}
return nil
},
},
)
}
func TestInstanceResourceSchema(t *testing.T) {
t.Parallel()
ctx := context.Background()
schemaRequest := fwresource.SchemaRequest{}
schemaResponse := &fwresource.SchemaResponse{}
// Instantiate the resource.Resource and call its Schema method
postgresflexalpha.NewInstanceResource().Schema(ctx, schemaRequest, schemaResponse)
if schemaResponse.Diagnostics.HasError() {
t.Fatalf("Schema method diagnostics: %+v", schemaResponse.Diagnostics)
}
// Validate the schema
diagnostics := schemaResponse.Schema.ValidateImplementation(ctx)
if diagnostics.HasError() {
t.Fatalf("Schema validation diagnostics: %+v", diagnostics)
}
}
var (
//go:embed testdata/resource-no-enc.tf
resourceConfigNoEnc string //nolint:unused // needs implementation
//go:embed testdata/resource-enc.tf
resourceConfigEnc string //nolint:unused // needs implementation
)
func TestMain(m *testing.M) {
testutils.Setup()
code := m.Run()
// shutdown()
os.Exit(code)
}
func testAccPreCheck(t *testing.T) {
if _, ok := os.LookupEnv("TF_ACC"); !ok {
t.Skip("TF_ACC is not set")
}
if _, ok := os.LookupEnv("TF_ACC_PROJECT_ID"); !ok {
t.Fatalf("could not find env var TF_ACC_PROJECT_ID")
}
}
// func TestAccResourceExample_parallel(t *testing.T) {
// t.Parallel()
//
// exData := resData{
// Region: "eu01",
// ServiceAccountFilePath: sa_file,
// ProjectID: project_id,
// Name: acctest.RandomWithPrefix("tf-acc"),
// }
//
// resource.Test(t, resource.TestCase{
// ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
// Steps: []resource.TestStep{
// {
// Config: testAccResourceEncryptionExampleConfig(exData),
// Check: resource.TestCheckResourceAttrSet("example_resource.test", "id"),
// },
// },
// })
//}
type resData struct {
ServiceAccountFilePath string
ProjectId string
Region string
Name string
TfName string
FlavorId string
BackupSchedule string
UseEncryption bool
KekKeyId string
KekKeyRingId string
KekKeyVersion uint8
KekServiceAccount string
PerformanceClass string
Replicas uint32
Size uint32
AclString string
AccessScope string
RetentionDays uint32
Version string
Users []User
Databases []Database
}
type User struct {
Name string
ProjectId string
Roles []string
}
type Database struct {
Name string
ProjectId string
Owner string
}
func getExample() resData {
name := acctest.RandomWithPrefix("tf-acc")
return resData{
Region: os.Getenv("TF_ACC_REGION"),
ServiceAccountFilePath: os.Getenv("TF_ACC_SERVICE_ACCOUNT_FILE"),
ProjectId: os.Getenv("TF_ACC_PROJECT_ID"),
Name: name,
TfName: name,
FlavorId: "2.4",
BackupSchedule: "0 0 * * *",
UseEncryption: false,
RetentionDays: 33,
Replicas: 1,
PerformanceClass: "premium-perf2-stackit",
Size: 10,
AclString: "0.0.0.0/0",
AccessScope: "PUBLIC",
Version: "17",
}
}
func TestAccInstance(t *testing.T) {
exData := getExample()
updNameData := exData
updNameData.Name = "name-updated"
updSizeData := exData
updSizeData.Size = 25
resource.ParallelTest(
t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
t.Logf(" ... working on instance %s", exData.TfName)
testInstances = append(testInstances, exData.TfName)
},
ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
Steps: []resource.TestStep{
// Create and verify
{
Config: testutils.StringFromTemplateMust(
"testdata/instance_template.gompl",
exData,
),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(
testutils.ResStr(pfx, "instance", exData.TfName),
"name",
exData.Name,
),
resource.TestCheckResourceAttrSet(testutils.ResStr(pfx, "instance", exData.TfName), "id"),
),
},
// Update name and verify
{
Config: testutils.StringFromTemplateMust(
"testdata/instance_template.gompl",
updNameData,
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(
testutils.ResStr(pfx, "instance", exData.TfName),
"name",
updNameData.Name,
),
),
},
// Update size and verify
{
Config: testutils.StringFromTemplateMust(
"testdata/instance_template.gompl",
updSizeData,
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(
testutils.ResStr(pfx, "instance", exData.TfName),
"storage.size",
strconv.Itoa(int(updSizeData.Size)),
),
),
},
//// Import test
//{
// ResourceName: "example_resource.test",
// ImportState: true,
// ImportStateVerify: true,
// },
},
},
)
}
func TestAccInstanceWithUsers(t *testing.T) {
data := getExample()
userName := "testUser"
data.Users = []User{
{
Name: userName,
ProjectId: os.Getenv("TF_ACC_PROJECT_ID"),
Roles: []string{"login"},
},
}
resource.ParallelTest(
t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
t.Logf(" ... working on instance %s", data.TfName)
testInstances = append(testInstances, data.TfName)
},
ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
Steps: []resource.TestStep{
// Create and verify
{
Config: testutils.StringFromTemplateMust(
"testdata/instance_template.gompl",
data,
),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(
testutils.ResStr(pfx, "instance", data.TfName),
"name",
data.Name,
),
resource.TestCheckResourceAttrSet(testutils.ResStr(pfx, "instance", data.TfName), "id"),
resource.TestCheckResourceAttr(testutils.ResStr(pfx, "user", userName), "name", userName),
resource.TestCheckResourceAttrSet(testutils.ResStr(pfx, "user", userName), "id"),
),
},
},
},
)
}
func TestAccInstanceWithDatabases(t *testing.T) {
data := getExample()
dbName := "testdb"
userName := "testUser"
data.Users = []User{
{
Name: userName,
ProjectId: os.Getenv("TF_ACC_PROJECT_ID"),
Roles: []string{"login"},
},
}
data.Databases = []Database{
{
Name: dbName,
ProjectId: os.Getenv("TF_ACC_PROJECT_ID"),
Owner: userName,
},
}
resource.ParallelTest(
t, resource.TestCase{
PreCheck: func() {
testAccPreCheck(t)
t.Logf(" ... working on instance %s", data.TfName)
testInstances = append(testInstances, data.TfName)
},
ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
Steps: []resource.TestStep{
// Create and verify
{
Config: testutils.StringFromTemplateMust(
"testdata/instance_template.gompl",
data,
),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(
testutils.ResStr(pfx, "instance", data.TfName),
"name",
data.Name,
),
resource.TestCheckResourceAttrSet(testutils.ResStr(pfx, "instance", data.TfName), "id"),
resource.TestCheckResourceAttr(testutils.ResStr(pfx, "user", userName), "name", userName),
resource.TestCheckResourceAttrSet(testutils.ResStr(pfx, "user", userName), "id"),
resource.TestCheckResourceAttr(testutils.ResStr(pfx, "database", dbName), "name", dbName),
resource.TestCheckResourceAttr(testutils.ResStr(pfx, "database", dbName), "owner", userName),
resource.TestCheckResourceAttrSet(testutils.ResStr(pfx, "database", dbName), "id"),
),
},
},
},
)
}
// 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
// getFlavorsResp *postgresflex.GetFlavorsResponse
// }
//
// func (c *postgresFlexClientMocked) ListFlavorsExecute(_ context.Context, _, _ string) (*postgresflex.GetFlavorsResponse, error) {
// if c.returnError {
// return nil, fmt.Errorf("get flavors failed")
// }
//
// return c.getFlavorsResp, nil
// }
// func TestNewInstanceResource(t *testing.T) {
// exData := resData{
// Region: "eu01",
// ServiceAccountFilePath: sa_file,
// ProjectID: project_id,
// Name: "testRes",
// }
// resource.ParallelTest(t, resource.TestCase{
// ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
// Steps: []resource.TestStep{
// {
// Config: testAccResourceEncryptionExampleConfig(exData),
// Check: resource.ComposeAggregateTestCheckFunc(
// resource.TestCheckResourceAttr("example_resource.test", "name", exData.Name),
// resource.TestCheckResourceAttrSet("example_resource.test", "id"),
// ),
// },
// },
// })
//
// //tests := []struct {
// // name string
// // want resource.Resource
// //}{
// // {
// // name: "create empty instance resource",
// // want: &instanceResource{},
// // },
// //}
// //for _, tt := range tests {
// // t.Run(tt.name, func(t *testing.T) {
// // if got := NewInstanceResource(); !reflect.DeepEqual(got, tt.want) {
// // t.Errorf("NewInstanceResource() = %v, want %v", got, tt.want)
// // }
// // })
// //}
//}
//// 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.ParallelTest(
// t, resource.TestCase{
// ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
// CheckDestroy: testAccCheckPostgresFlexDestroy,
// Steps: []resource.TestStep{
// // Creation
// {
// // testdata/<Test_Name>
// // ConfigDirectory: config.TestNameDirectory(),
//
// // testdata/<Test_Name>/<step_number>
// // 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
//}