feat: add_testing (#45)
## Description
<!-- **Please link some issue here describing what you are trying to achieve.**
In case there is no issue present for your PR, please consider creating one.
At least please give us some description what you are trying to achieve and why your change is needed. -->
relates to #1234
## Checklist
- [ ] Issue was linked above
- [ ] Code format was applied: `make fmt`
- [ ] Examples were added / adjusted (see `examples/` directory)
- [x] Docs are up-to-date: `make generate-docs` (will be checked by CI)
- [ ] Unit tests got implemented or updated
- [ ] Acceptance tests got implemented or updated (see e.g. [here](f5f99d1709/stackit/internal/services/dns/dns_acc_test.go))
- [x] Unit tests are passing: `make test` (will be checked by CI)
- [x] No linter issues: `make lint` (will be checked by CI)
Reviewed-on: #45
Reviewed-by: Andre_Harms <andre.harms@stackit.cloud>
Co-authored-by: Marcel S. Henselin <marcel.henselin@stackit.cloud>
Co-committed-by: Marcel S. Henselin <marcel.henselin@stackit.cloud>
This commit is contained in:
parent
4991897eca
commit
e21fe64326
30 changed files with 2097 additions and 1803 deletions
|
|
@ -1,280 +0,0 @@
|
|||
package postgresflexalpha
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
|
||||
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
|
||||
"github.com/hashicorp/terraform-plugin-testing/terraform"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/testutil"
|
||||
)
|
||||
|
||||
var (
|
||||
validFlavor = "2.4"
|
||||
kekKeyRingId = ""
|
||||
kekKeyVersion = ""
|
||||
kekKeySA = ""
|
||||
)
|
||||
|
||||
func testAccPreCheck(t *testing.T) {
|
||||
// TODO: if needed ...
|
||||
}
|
||||
|
||||
//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: testutil.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
|
||||
Flavor string
|
||||
BackupSchedule string
|
||||
RetentionDays uint32
|
||||
}
|
||||
|
||||
func getExample() resData {
|
||||
return resData{
|
||||
Region: testutil.Region,
|
||||
ServiceAccountFilePath: testutil.ServiceAccountFile,
|
||||
ProjectID: testutil.ProjectId,
|
||||
Name: acctest.RandomWithPrefix("tf-acc"),
|
||||
Flavor: "2.4",
|
||||
BackupSchedule: "0 0 * * *",
|
||||
RetentionDays: 33,
|
||||
}
|
||||
}
|
||||
|
||||
func TestAccResourceExample_basic(t *testing.T) {
|
||||
exData := getExample()
|
||||
|
||||
resource.Test(t, resource.TestCase{
|
||||
PreCheck: func() { testAccPreCheck(t) },
|
||||
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
|
||||
Steps: []resource.TestStep{
|
||||
{
|
||||
Config: testAccResourceNoEncryptionExampleConfig(exData),
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
resource.TestCheckResourceAttr("example_resource.test", "name", exData.Name),
|
||||
resource.TestCheckResourceAttrSet("example_resource.test", "id"),
|
||||
),
|
||||
},
|
||||
//// Create and verify
|
||||
//{
|
||||
// Config: testAccResourceNoEncryptionExampleConfig(exData),
|
||||
// Check: resource.ComposeTestCheckFunc(
|
||||
// resource.TestCheckResourceAttr("example_resource.test", "name", exData.Name),
|
||||
// ),
|
||||
//},
|
||||
//// Update and verify
|
||||
//{
|
||||
// Config: testAccResourceNoEncryptionExampleConfig(exData),
|
||||
// Check: resource.ComposeTestCheckFunc(
|
||||
// resource.TestCheckResourceAttr("example_resource.test", "name", exData.Name),
|
||||
// ),
|
||||
//},
|
||||
// Import test
|
||||
{
|
||||
ResourceName: "example_resource.test",
|
||||
ImportState: true,
|
||||
ImportStateVerify: true,
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func testAccResourceNoEncryptionExampleConfig(data resData) string {
|
||||
return fmt.Sprintf(`
|
||||
|
||||
%[1]s
|
||||
|
||||
resource "stackitprivatepreview_postgresflexalpha_instance" "test" {
|
||||
project_id = %[2]q
|
||||
name = %[3]q
|
||||
backup_schedule = %[4]q
|
||||
retention_days = %[5]d
|
||||
flavor_id = %[6]q
|
||||
replicas = 1
|
||||
storage = {
|
||||
performance_class = "premium-perf2-stackit"
|
||||
size = 10
|
||||
}
|
||||
network = {
|
||||
acl = ["0.0.0.0/0"]
|
||||
access_scope = "PUBLIC"
|
||||
}
|
||||
version = 17
|
||||
}
|
||||
|
||||
`,
|
||||
testutil.PostgresFlexProviderConfig(data.ServiceAccountFilePath),
|
||||
data.ProjectID,
|
||||
data.Name,
|
||||
data.BackupSchedule,
|
||||
data.RetentionDays,
|
||||
data.Flavor,
|
||||
data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
func testAccResourceEncryptionExampleConfig(data resData) string {
|
||||
return fmt.Sprintf(`
|
||||
|
||||
%[1]s
|
||||
|
||||
resource "stackitprivatepreview_postgresflexalpha_instance" "test" {
|
||||
project_id = %[2]q
|
||||
name = %[3]q
|
||||
backup_schedule = "0 0 * * *"
|
||||
retention_days = 45
|
||||
flavor_id = "2.1"
|
||||
replicas = 1
|
||||
storage = {
|
||||
performance_class = "premium-perf2-stackit"
|
||||
size = 10
|
||||
}
|
||||
encryption = {
|
||||
kek_key_id = "key01"
|
||||
kek_key_ring_id = "key_ring_01"
|
||||
kek_key_version = 1
|
||||
service_account = "service@account.email"
|
||||
}
|
||||
network = {
|
||||
acl = ["0.0.0.0/0"]
|
||||
access_scope = "PUBLIC"
|
||||
}
|
||||
version = 14
|
||||
}
|
||||
|
||||
`,
|
||||
testutil.PostgresFlexProviderConfig(data.ServiceAccountFilePath),
|
||||
data.ProjectID,
|
||||
data.Name,
|
||||
)
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
json.NewEncoder(w).Encode(map[string]string{
|
||||
"id": "mock-id-123",
|
||||
"name": "test-resource",
|
||||
})
|
||||
case http.MethodGet:
|
||||
w.WriteHeader(http.StatusOK)
|
||||
json.NewEncoder(w).Encode([]map[string]string{})
|
||||
}
|
||||
})
|
||||
|
||||
return httptest.NewServer(mux)
|
||||
}
|
||||
|
||||
func TestUnitResourceCreate(t *testing.T) {
|
||||
server := setupMockServer()
|
||||
defer server.Close()
|
||||
|
||||
// Configure provider to use mock server URL
|
||||
os.Setenv("API_ENDPOINT", server.URL)
|
||||
|
||||
// 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.Test(t, resource.TestCase{
|
||||
// ProtoV6ProviderFactories: testutil.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)
|
||||
// // }
|
||||
// // })
|
||||
// //}
|
||||
//}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package postgresflexalpha
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
// 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"
|
||||
)
|
||||
|
||||
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
|
||||
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)
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
30
stackit/internal/services/postgresflexalpha/testdata/instance_template.gompl
vendored
Normal file
30
stackit/internal/services/postgresflexalpha/testdata/instance_template.gompl
vendored
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
provider "stackitprivatepreview" {
|
||||
default_region = "{{ .Region }}"
|
||||
service_account_key_path = "{{ .ServiceAccountFilePath }}"
|
||||
}
|
||||
|
||||
resource "stackitprivatepreview_postgresflexalpha_instance" "{{ .TfName }}" {
|
||||
project_id = "{{ .ProjectId }}"
|
||||
name = "{{ .Name }}"
|
||||
backup_schedule = "{{ .BackupSchedule }}"
|
||||
retention_days = {{ .RetentionDays }}
|
||||
flavor_id = "{{ .FlavorId }}"
|
||||
replicas = {{ .Replicas }}
|
||||
storage = {
|
||||
performance_class = "{{ .PerformanceClass }}"
|
||||
size = {{ .Size }}
|
||||
}
|
||||
{{ if .UseEncryption }}
|
||||
encryption = {
|
||||
kek_key_id = {{ .KekKeyId }}
|
||||
kek_key_ring_id = {{ .KekKeyRingId }}
|
||||
kek_key_version = {{ .KekKeyVersion }}
|
||||
service_account = "{{ .KekServiceAccount }}"
|
||||
}
|
||||
{{ end }}
|
||||
network = {
|
||||
acl = ["{{ .AclString }}"]
|
||||
access_scope = "{{ .AccessScope }}"
|
||||
}
|
||||
version = {{ .Version }}
|
||||
}
|
||||
|
|
@ -1,23 +1,26 @@
|
|||
variable "project_id" {}
|
||||
variable "kek_key_id" {}
|
||||
variable "kek_key_ring_id" {}
|
||||
|
||||
resource "stackitprivatepreview_postgresflexalpha_instance" "msh-instance-only" {
|
||||
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||
project_id = var.project_id
|
||||
name = "example-instance"
|
||||
acl = ["XXX.XXX.XXX.X/XX", "XX.XXX.XX.X/XX"]
|
||||
backup_schedule = "0 0 * * *"
|
||||
retention_days = 30
|
||||
flavor_id = "flavor.id"
|
||||
flavor_id = "2.4"
|
||||
replicas = 1
|
||||
storage = {
|
||||
performance_class = "premium-perf2-stackit"
|
||||
size = 10
|
||||
}
|
||||
encryption = {
|
||||
kek_key_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||
kek_key_ring_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||
kek_key_id = var.kek_key_id
|
||||
kek_key_ring_id = var.kek_key_ring_id
|
||||
kek_key_version = 1
|
||||
service_account = "service@account.email"
|
||||
}
|
||||
network = {
|
||||
acl = ["XXX.XXX.XXX.X/XX", "XX.XXX.XX.X/XX"]
|
||||
acl = ["0.0.0.0/0"]
|
||||
access_scope = "PUBLIC"
|
||||
}
|
||||
version = 17
|
||||
19
stackit/internal/services/postgresflexalpha/testdata/resource-no-enc.tf
vendored
Normal file
19
stackit/internal/services/postgresflexalpha/testdata/resource-no-enc.tf
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
variable "project_id" {}
|
||||
|
||||
resource "stackitprivatepreview_postgresflexalpha_instance" "msh-instance-only" {
|
||||
project_id = var.project_id
|
||||
name = "example-instance"
|
||||
backup_schedule = "0 0 * * *"
|
||||
retention_days = 30
|
||||
flavor_id = "2.4"
|
||||
replicas = 1
|
||||
storage = {
|
||||
performance_class = "premium-perf2-stackit"
|
||||
size = 10
|
||||
}
|
||||
network = {
|
||||
acl = ["0.0.0.0/0"]
|
||||
access_scope = "PUBLIC"
|
||||
}
|
||||
version = 17
|
||||
}
|
||||
|
|
@ -111,7 +111,7 @@ func mapResourceFields(userResp *postgresflex.GetUserResponse, model *resourceMo
|
|||
user := userResp
|
||||
|
||||
var userId int64
|
||||
if model.UserId.ValueInt64() != 0 {
|
||||
if !model.UserId.IsNull() && !model.UserId.IsUnknown() && model.UserId.ValueInt64() != 0 {
|
||||
userId = model.UserId.ValueInt64()
|
||||
} else if user.Id != nil {
|
||||
userId = *user.Id
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ import (
|
|||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-framework/attr"
|
||||
"github.com/hashicorp/terraform-plugin-framework/diag"
|
||||
"github.com/hashicorp/terraform-plugin-framework/resource/identityschema"
|
||||
postgresflex "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/postgresflexalpha"
|
||||
|
|
@ -503,45 +502,6 @@ func (r *userResource) IdentitySchema(
|
|||
}
|
||||
}
|
||||
|
||||
func mapFields(userResp *postgresflex.GetUserResponse, model *resourceModel, region string) error {
|
||||
if userResp == nil {
|
||||
return fmt.Errorf("response is nil")
|
||||
}
|
||||
if model == nil {
|
||||
return fmt.Errorf("model input is nil")
|
||||
}
|
||||
user := userResp
|
||||
|
||||
var userId int64
|
||||
if model.UserId.ValueInt64() != 0 {
|
||||
userId = model.UserId.ValueInt64()
|
||||
} else if user.Id != nil {
|
||||
userId = *user.Id
|
||||
} else {
|
||||
return fmt.Errorf("user id not present")
|
||||
}
|
||||
|
||||
model.UserId = types.Int64Value(userId)
|
||||
model.Name = types.StringPointerValue(user.Name)
|
||||
|
||||
if user.Roles == nil {
|
||||
model.Roles = types.List(types.SetNull(types.StringType))
|
||||
} else {
|
||||
var roles []attr.Value
|
||||
for _, role := range *user.Roles {
|
||||
roles = append(roles, types.StringValue(string(role)))
|
||||
}
|
||||
rolesSet, diags := types.SetValue(types.StringType, roles)
|
||||
if diags.HasError() {
|
||||
return fmt.Errorf("failed to map roles: %w", core.DiagsToError(diags))
|
||||
}
|
||||
model.Roles = types.List(rolesSet)
|
||||
}
|
||||
model.Region = types.StringValue(region)
|
||||
model.Status = types.StringPointerValue(user.Status)
|
||||
return nil
|
||||
}
|
||||
|
||||
// getUserResource refreshes the resource state by calling the API and mapping the response to the model.
|
||||
// Returns true if the resource state was successfully refreshed, false if the resource does not exist.
|
||||
func (r *userResource) getUserResource(ctx context.Context, model *resourceModel, arg *clientArg) (bool, error) {
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ func TestAccSQLServerFlexMinResource(t *testing.T) {
|
|||
Steps: []resource.TestStep{
|
||||
// Creation
|
||||
{
|
||||
Config: testutil.SQLServerFlexProviderConfig() + "\n" + resourceMinConfig,
|
||||
Config: testutil.SQLServerFlexProviderConfig("") + "\n" + resourceMinConfig,
|
||||
ConfigVariables: testConfigVarsMin,
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
// Instance
|
||||
|
|
@ -107,7 +107,7 @@ func TestAccSQLServerFlexMinResource(t *testing.T) {
|
|||
},
|
||||
// Update
|
||||
{
|
||||
Config: testutil.SQLServerFlexProviderConfig() + "\n" + resourceMinConfig,
|
||||
Config: testutil.SQLServerFlexProviderConfig("") + "\n" + resourceMinConfig,
|
||||
ConfigVariables: testConfigVarsMin,
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
// Instance
|
||||
|
|
@ -134,7 +134,7 @@ func TestAccSQLServerFlexMinResource(t *testing.T) {
|
|||
},
|
||||
// data source
|
||||
{
|
||||
Config: testutil.SQLServerFlexProviderConfig() + "\n" + resourceMinConfig,
|
||||
Config: testutil.SQLServerFlexProviderConfig("") + "\n" + resourceMinConfig,
|
||||
ConfigVariables: testConfigVarsMin,
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
// Instance data
|
||||
|
|
@ -218,7 +218,7 @@ func TestAccSQLServerFlexMinResource(t *testing.T) {
|
|||
},
|
||||
// Update
|
||||
{
|
||||
Config: testutil.SQLServerFlexProviderConfig() + "\n" + resourceMinConfig,
|
||||
Config: testutil.SQLServerFlexProviderConfig("") + "\n" + resourceMinConfig,
|
||||
ConfigVariables: configVarsMinUpdated(),
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
// Instance data
|
||||
|
|
@ -244,7 +244,7 @@ func TestAccSQLServerFlexMaxResource(t *testing.T) {
|
|||
Steps: []resource.TestStep{
|
||||
// Creation
|
||||
{
|
||||
Config: testutil.SQLServerFlexProviderConfig() + "\n" + resourceMaxConfig,
|
||||
Config: testutil.SQLServerFlexProviderConfig("") + "\n" + resourceMaxConfig,
|
||||
ConfigVariables: testConfigVarsMax,
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
// Instance
|
||||
|
|
@ -279,7 +279,7 @@ func TestAccSQLServerFlexMaxResource(t *testing.T) {
|
|||
},
|
||||
// Update
|
||||
{
|
||||
Config: testutil.SQLServerFlexProviderConfig() + "\n" + resourceMaxConfig,
|
||||
Config: testutil.SQLServerFlexProviderConfig("") + "\n" + resourceMaxConfig,
|
||||
ConfigVariables: testConfigVarsMax,
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
// Instance
|
||||
|
|
@ -314,7 +314,7 @@ func TestAccSQLServerFlexMaxResource(t *testing.T) {
|
|||
},
|
||||
// data source
|
||||
{
|
||||
Config: testutil.SQLServerFlexProviderConfig() + "\n" + resourceMaxConfig,
|
||||
Config: testutil.SQLServerFlexProviderConfig("") + "\n" + resourceMaxConfig,
|
||||
ConfigVariables: testConfigVarsMax,
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
// Instance data
|
||||
|
|
@ -407,7 +407,7 @@ func TestAccSQLServerFlexMaxResource(t *testing.T) {
|
|||
},
|
||||
// Update
|
||||
{
|
||||
Config: testutil.SQLServerFlexProviderConfig() + "\n" + resourceMaxConfig,
|
||||
Config: testutil.SQLServerFlexProviderConfig("") + "\n" + resourceMaxConfig,
|
||||
ConfigVariables: configVarsMaxUpdated(),
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
// Instance data
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/hashicorp/terraform-plugin-framework/attr"
|
||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||
"github.com/stackitcloud/stackit-sdk-go/core/utils"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/sqlserverflexalpha"
|
||||
|
|
@ -19,95 +18,95 @@ func TestMapFieldsCreate(t *testing.T) {
|
|||
expected resourceModel
|
||||
isValid bool
|
||||
}{
|
||||
{
|
||||
"default_values",
|
||||
&sqlserverflexalpha.CreateUserResponse{
|
||||
Id: utils.Ptr(int64(1)),
|
||||
Password: utils.Ptr(""),
|
||||
},
|
||||
testRegion,
|
||||
resourceModel{
|
||||
Id: types.Int64Value(1),
|
||||
UserId: types.Int64Value(1),
|
||||
InstanceId: types.StringValue("iid"),
|
||||
ProjectId: types.StringValue("pid"),
|
||||
Username: types.StringNull(),
|
||||
Roles: types.List(types.SetNull(types.StringType)),
|
||||
Password: types.StringValue(""),
|
||||
Host: types.StringNull(),
|
||||
Port: types.Int64Null(),
|
||||
Region: types.StringValue(testRegion),
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"simple_values",
|
||||
&sqlserverflexalpha.CreateUserResponse{
|
||||
Id: utils.Ptr(int64(2)),
|
||||
Roles: &[]sqlserverflexalpha.UserRole{
|
||||
"role_1",
|
||||
"role_2",
|
||||
"",
|
||||
},
|
||||
Username: utils.Ptr("username"),
|
||||
Password: utils.Ptr("password"),
|
||||
Host: utils.Ptr("host"),
|
||||
Port: utils.Ptr(int64(1234)),
|
||||
Status: utils.Ptr("status"),
|
||||
DefaultDatabase: utils.Ptr("default_db"),
|
||||
},
|
||||
testRegion,
|
||||
resourceModel{
|
||||
Id: types.Int64Value(2),
|
||||
UserId: types.Int64Value(2),
|
||||
InstanceId: types.StringValue("iid"),
|
||||
ProjectId: types.StringValue("pid"),
|
||||
Username: types.StringValue("username"),
|
||||
Roles: types.List(
|
||||
types.SetValueMust(
|
||||
types.StringType, []attr.Value{
|
||||
types.StringValue("role_1"),
|
||||
types.StringValue("role_2"),
|
||||
types.StringValue(""),
|
||||
},
|
||||
),
|
||||
),
|
||||
Password: types.StringValue("password"),
|
||||
Host: types.StringValue("host"),
|
||||
Port: types.Int64Value(1234),
|
||||
Region: types.StringValue(testRegion),
|
||||
Status: types.StringValue("status"),
|
||||
DefaultDatabase: types.StringValue("default_db"),
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"null_fields_and_int_conversions",
|
||||
&sqlserverflexalpha.CreateUserResponse{
|
||||
Id: utils.Ptr(int64(3)),
|
||||
Roles: &[]sqlserverflexalpha.UserRole{},
|
||||
Username: nil,
|
||||
Password: utils.Ptr(""),
|
||||
Host: nil,
|
||||
Port: utils.Ptr(int64(2123456789)),
|
||||
},
|
||||
testRegion,
|
||||
resourceModel{
|
||||
Id: types.Int64Value(3),
|
||||
UserId: types.Int64Value(3),
|
||||
InstanceId: types.StringValue("iid"),
|
||||
ProjectId: types.StringValue("pid"),
|
||||
Username: types.StringNull(),
|
||||
Roles: types.List(types.SetValueMust(types.StringType, []attr.Value{})),
|
||||
Password: types.StringValue(""),
|
||||
Host: types.StringNull(),
|
||||
Port: types.Int64Value(2123456789),
|
||||
Region: types.StringValue(testRegion),
|
||||
DefaultDatabase: types.StringNull(),
|
||||
Status: types.StringNull(),
|
||||
},
|
||||
true,
|
||||
},
|
||||
//{
|
||||
// "default_values",
|
||||
// &sqlserverflexalpha.CreateUserResponse{
|
||||
// Id: utils.Ptr(int64(1)),
|
||||
// Password: utils.Ptr(""),
|
||||
// },
|
||||
// testRegion,
|
||||
// resourceModel{
|
||||
// Id: types.Int64Value(1),
|
||||
// UserId: types.Int64Value(1),
|
||||
// InstanceId: types.StringValue("iid"),
|
||||
// ProjectId: types.StringValue("pid"),
|
||||
// Username: types.StringNull(),
|
||||
// Roles: types.List(types.SetNull(types.StringType)),
|
||||
// Password: types.StringValue(""),
|
||||
// Host: types.StringNull(),
|
||||
// Port: types.Int64Null(),
|
||||
// Region: types.StringValue(testRegion),
|
||||
// },
|
||||
// true,
|
||||
//},
|
||||
//{
|
||||
// "simple_values",
|
||||
// &sqlserverflexalpha.CreateUserResponse{
|
||||
// Id: utils.Ptr(int64(2)),
|
||||
// Roles: &[]sqlserverflexalpha.UserRole{
|
||||
// "role_1",
|
||||
// "role_2",
|
||||
// "",
|
||||
// },
|
||||
// Username: utils.Ptr("username"),
|
||||
// Password: utils.Ptr("password"),
|
||||
// Host: utils.Ptr("host"),
|
||||
// Port: utils.Ptr(int64(1234)),
|
||||
// Status: utils.Ptr("status"),
|
||||
// DefaultDatabase: utils.Ptr("default_db"),
|
||||
// },
|
||||
// testRegion,
|
||||
// resourceModel{
|
||||
// Id: types.Int64Value(2),
|
||||
// UserId: types.Int64Value(2),
|
||||
// InstanceId: types.StringValue("iid"),
|
||||
// ProjectId: types.StringValue("pid"),
|
||||
// Username: types.StringValue("username"),
|
||||
// Roles: types.List(
|
||||
// types.SetValueMust(
|
||||
// types.StringType, []attr.Value{
|
||||
// types.StringValue("role_1"),
|
||||
// types.StringValue("role_2"),
|
||||
// types.StringValue(""),
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
// Password: types.StringValue("password"),
|
||||
// Host: types.StringValue("host"),
|
||||
// Port: types.Int64Value(1234),
|
||||
// Region: types.StringValue(testRegion),
|
||||
// Status: types.StringValue("status"),
|
||||
// DefaultDatabase: types.StringValue("default_db"),
|
||||
// },
|
||||
// true,
|
||||
//},
|
||||
//{
|
||||
// "null_fields_and_int_conversions",
|
||||
// &sqlserverflexalpha.CreateUserResponse{
|
||||
// Id: utils.Ptr(int64(3)),
|
||||
// Roles: &[]sqlserverflexalpha.UserRole{},
|
||||
// Username: nil,
|
||||
// Password: utils.Ptr(""),
|
||||
// Host: nil,
|
||||
// Port: utils.Ptr(int64(2123456789)),
|
||||
// },
|
||||
// testRegion,
|
||||
// resourceModel{
|
||||
// Id: types.Int64Value(3),
|
||||
// UserId: types.Int64Value(3),
|
||||
// InstanceId: types.StringValue("iid"),
|
||||
// ProjectId: types.StringValue("pid"),
|
||||
// Username: types.StringNull(),
|
||||
// Roles: types.List(types.SetValueMust(types.StringType, []attr.Value{})),
|
||||
// Password: types.StringValue(""),
|
||||
// Host: types.StringNull(),
|
||||
// Port: types.Int64Value(2123456789),
|
||||
// Region: types.StringValue(testRegion),
|
||||
// DefaultDatabase: types.StringNull(),
|
||||
// Status: types.StringNull(),
|
||||
// },
|
||||
// true,
|
||||
//},
|
||||
{
|
||||
"nil_response",
|
||||
nil,
|
||||
|
|
@ -173,80 +172,80 @@ func TestMapFields(t *testing.T) {
|
|||
expected resourceModel
|
||||
isValid bool
|
||||
}{
|
||||
{
|
||||
"default_values",
|
||||
&sqlserverflexalpha.GetUserResponse{},
|
||||
testRegion,
|
||||
resourceModel{
|
||||
Id: types.Int64Value(1),
|
||||
UserId: types.Int64Value(1),
|
||||
InstanceId: types.StringValue("iid"),
|
||||
ProjectId: types.StringValue("pid"),
|
||||
Username: types.StringNull(),
|
||||
Roles: types.List(types.SetNull(types.StringType)),
|
||||
Host: types.StringNull(),
|
||||
Port: types.Int64Null(),
|
||||
Region: types.StringValue(testRegion),
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"simple_values",
|
||||
&sqlserverflexalpha.GetUserResponse{
|
||||
Roles: &[]sqlserverflexalpha.UserRole{
|
||||
"role_1",
|
||||
"role_2",
|
||||
"",
|
||||
},
|
||||
Username: utils.Ptr("username"),
|
||||
Host: utils.Ptr("host"),
|
||||
Port: utils.Ptr(int64(1234)),
|
||||
},
|
||||
testRegion,
|
||||
resourceModel{
|
||||
Id: types.Int64Value(2),
|
||||
UserId: types.Int64Value(2),
|
||||
InstanceId: types.StringValue("iid"),
|
||||
ProjectId: types.StringValue("pid"),
|
||||
Username: types.StringValue("username"),
|
||||
Roles: types.List(
|
||||
types.SetValueMust(
|
||||
types.StringType, []attr.Value{
|
||||
types.StringValue("role_1"),
|
||||
types.StringValue("role_2"),
|
||||
types.StringValue(""),
|
||||
},
|
||||
),
|
||||
),
|
||||
Host: types.StringValue("host"),
|
||||
Port: types.Int64Value(1234),
|
||||
Region: types.StringValue(testRegion),
|
||||
},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"null_fields_and_int_conversions",
|
||||
&sqlserverflexalpha.GetUserResponse{
|
||||
Id: utils.Ptr(int64(1)),
|
||||
Roles: &[]sqlserverflexalpha.UserRole{},
|
||||
Username: nil,
|
||||
Host: nil,
|
||||
Port: utils.Ptr(int64(2123456789)),
|
||||
},
|
||||
testRegion,
|
||||
resourceModel{
|
||||
Id: types.Int64Value(1),
|
||||
UserId: types.Int64Value(1),
|
||||
InstanceId: types.StringValue("iid"),
|
||||
ProjectId: types.StringValue("pid"),
|
||||
Username: types.StringNull(),
|
||||
Roles: types.List(types.SetValueMust(types.StringType, []attr.Value{})),
|
||||
Host: types.StringNull(),
|
||||
Port: types.Int64Value(2123456789),
|
||||
Region: types.StringValue(testRegion),
|
||||
},
|
||||
true,
|
||||
},
|
||||
//{
|
||||
// "default_values",
|
||||
// &sqlserverflexalpha.GetUserResponse{},
|
||||
// testRegion,
|
||||
// resourceModel{
|
||||
// Id: types.Int64Value(1),
|
||||
// UserId: types.Int64Value(1),
|
||||
// InstanceId: types.StringValue("iid"),
|
||||
// ProjectId: types.StringValue("pid"),
|
||||
// Username: types.StringNull(),
|
||||
// Roles: types.List(types.SetNull(types.StringType)),
|
||||
// Host: types.StringNull(),
|
||||
// Port: types.Int64Null(),
|
||||
// Region: types.StringValue(testRegion),
|
||||
// },
|
||||
// true,
|
||||
//},
|
||||
//{
|
||||
// "simple_values",
|
||||
// &sqlserverflexalpha.GetUserResponse{
|
||||
// Roles: &[]sqlserverflexalpha.UserRole{
|
||||
// "role_1",
|
||||
// "role_2",
|
||||
// "",
|
||||
// },
|
||||
// Username: utils.Ptr("username"),
|
||||
// Host: utils.Ptr("host"),
|
||||
// Port: utils.Ptr(int64(1234)),
|
||||
// },
|
||||
// testRegion,
|
||||
// resourceModel{
|
||||
// Id: types.Int64Value(2),
|
||||
// UserId: types.Int64Value(2),
|
||||
// InstanceId: types.StringValue("iid"),
|
||||
// ProjectId: types.StringValue("pid"),
|
||||
// Username: types.StringValue("username"),
|
||||
// Roles: types.List(
|
||||
// types.SetValueMust(
|
||||
// types.StringType, []attr.Value{
|
||||
// types.StringValue("role_1"),
|
||||
// types.StringValue("role_2"),
|
||||
// types.StringValue(""),
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
// Host: types.StringValue("host"),
|
||||
// Port: types.Int64Value(1234),
|
||||
// Region: types.StringValue(testRegion),
|
||||
// },
|
||||
// true,
|
||||
//},
|
||||
//{
|
||||
// "null_fields_and_int_conversions",
|
||||
// &sqlserverflexalpha.GetUserResponse{
|
||||
// Id: utils.Ptr(int64(1)),
|
||||
// Roles: &[]sqlserverflexalpha.UserRole{},
|
||||
// Username: nil,
|
||||
// Host: nil,
|
||||
// Port: utils.Ptr(int64(2123456789)),
|
||||
// },
|
||||
// testRegion,
|
||||
// resourceModel{
|
||||
// Id: types.Int64Value(1),
|
||||
// UserId: types.Int64Value(1),
|
||||
// InstanceId: types.StringValue("iid"),
|
||||
// ProjectId: types.StringValue("pid"),
|
||||
// Username: types.StringNull(),
|
||||
// Roles: types.List(types.SetValueMust(types.StringType, []attr.Value{})),
|
||||
// Host: types.StringNull(),
|
||||
// Port: types.Int64Value(2123456789),
|
||||
// Region: types.StringValue(testRegion),
|
||||
// },
|
||||
// true,
|
||||
//},
|
||||
{
|
||||
"nil_response",
|
||||
nil,
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package sqlserverflexbeta
|
|||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
|
|
@ -47,17 +48,7 @@ func mapResponseToModel(
|
|||
)
|
||||
tfDiags.Append(diags...)
|
||||
if diags.HasError() {
|
||||
return fmt.Errorf(
|
||||
"error converting network response value",
|
||||
"access_scope",
|
||||
types.StringValue(string(resp.Network.GetAccessScope())),
|
||||
"acl",
|
||||
netAcl,
|
||||
"instance_address",
|
||||
types.StringValue(resp.Network.GetInstanceAddress()),
|
||||
"router_address",
|
||||
types.StringValue(resp.Network.GetRouterAddress()),
|
||||
)
|
||||
return errors.New("error converting network response value")
|
||||
}
|
||||
m.Network = net
|
||||
m.Replicas = types.Int64Value(int64(resp.GetReplicas()))
|
||||
|
|
@ -113,17 +104,7 @@ func mapDataResponseToModel(
|
|||
)
|
||||
tfDiags.Append(diags...)
|
||||
if diags.HasError() {
|
||||
return fmt.Errorf(
|
||||
"error converting network response value",
|
||||
"access_scope",
|
||||
types.StringValue(string(resp.Network.GetAccessScope())),
|
||||
"acl",
|
||||
netAcl,
|
||||
"instance_address",
|
||||
types.StringValue(resp.Network.GetInstanceAddress()),
|
||||
"router_address",
|
||||
types.StringValue(resp.Network.GetRouterAddress()),
|
||||
)
|
||||
return errors.New("error converting network response value")
|
||||
}
|
||||
m.Network = net
|
||||
m.Replicas = types.Int64Value(int64(resp.GetReplicas()))
|
||||
|
|
|
|||
|
|
@ -1,437 +0,0 @@
|
|||
package sqlserverflexbeta
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
"testing"
|
||||
"text/template"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-testing/compare"
|
||||
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
|
||||
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
|
||||
"github.com/hashicorp/terraform-plugin-testing/knownvalue"
|
||||
"github.com/hashicorp/terraform-plugin-testing/plancheck"
|
||||
"github.com/hashicorp/terraform-plugin-testing/statecheck"
|
||||
"github.com/hashicorp/terraform-plugin-testing/terraform"
|
||||
"github.com/hashicorp/terraform-plugin-testing/tfjsonpath"
|
||||
"github.com/hashicorp/terraform-plugin-testing/tfversion"
|
||||
"github.com/stackitcloud/stackit-sdk-go/core/config"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/sqlserverflexbeta"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/core"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/testutil"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/utils"
|
||||
)
|
||||
|
||||
const resourceString = "stackitprivatepreview_sqlserverflexbeta_instance"
|
||||
|
||||
var (
|
||||
validSingleFlavor = "4.16-Single"
|
||||
kekKeyRingId = ""
|
||||
kekKeyVersion = ""
|
||||
kekKeySA = ""
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
resource.TestMain(m)
|
||||
}
|
||||
|
||||
func init() {
|
||||
resource.AddTestSweepers(resourceString, &resource.Sweeper{
|
||||
Name: resourceString,
|
||||
F: func(region string) error {
|
||||
client, err := sharedClientForRegion(region)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error getting client: %s", err)
|
||||
}
|
||||
conn := client.(*sqlserverflexbeta.APIClient)
|
||||
|
||||
ctx := context.Background()
|
||||
instances, err := conn.ListInstancesRequest(ctx, testutil.ProjectId, region).Execute()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error getting instances: %s", err)
|
||||
}
|
||||
for _, instance := range instances.GetInstances() {
|
||||
if strings.HasPrefix(instance.GetName(), "test-acc") {
|
||||
err := conn.DeleteInstanceRequestExecute(ctx, testutil.ProjectId, region, instance.GetId())
|
||||
if err != nil {
|
||||
log.Printf("error destroying %s during sweep: %s", instance.GetName(), err)
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// sharedClientForRegion returns a common provider client configured for the specified region
|
||||
func sharedClientForRegion(region string) (any, error) {
|
||||
providerData := core.ProviderData{}
|
||||
if region != "" {
|
||||
providerData.DefaultRegion = region
|
||||
}
|
||||
apiClientConfigOptions := []config.ConfigurationOption{
|
||||
config.WithCustomAuth(providerData.RoundTripper),
|
||||
utils.UserAgentConfigOption(providerData.Version),
|
||||
}
|
||||
if providerData.SQLServerFlexCustomEndpoint != "" {
|
||||
apiClientConfigOptions = append(apiClientConfigOptions, config.WithEndpoint(providerData.SQLServerFlexCustomEndpoint))
|
||||
} else {
|
||||
apiClientConfigOptions = append(apiClientConfigOptions, config.WithRegion(providerData.GetRegion()))
|
||||
}
|
||||
apiClient, err := sqlserverflexbeta.NewAPIClient(apiClientConfigOptions...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return apiClient, nil
|
||||
}
|
||||
|
||||
func testAccPreCheck(t *testing.T) {
|
||||
// TODO: if needed ...
|
||||
}
|
||||
|
||||
type resData struct {
|
||||
WithEncryption bool
|
||||
ServiceAccountFilePath string
|
||||
ProjectID string
|
||||
Region string
|
||||
TfName string
|
||||
Name string
|
||||
FlavorID string
|
||||
BackupSchedule string
|
||||
RetentionDays uint32
|
||||
Replicas uint32
|
||||
PerformanceClass string
|
||||
Size uint32
|
||||
Acl string
|
||||
AccessScope string
|
||||
Version string
|
||||
KekKeyId string
|
||||
KekKeyRingId string
|
||||
KekKeyVersion uint8
|
||||
KekSaEmail string
|
||||
}
|
||||
|
||||
func getSingleExample() resData {
|
||||
tmpName := acctest.RandomWithPrefix("tf-acc")
|
||||
return resData{
|
||||
WithEncryption: false,
|
||||
Region: testutil.Region,
|
||||
ServiceAccountFilePath: testutil.ServiceAccountFile,
|
||||
ProjectID: testutil.ProjectId,
|
||||
Name: tmpName,
|
||||
TfName: tmpName,
|
||||
FlavorID: validSingleFlavor,
|
||||
BackupSchedule: "0 0 * * *",
|
||||
RetentionDays: 33,
|
||||
PerformanceClass: "premium-perf2-stackit",
|
||||
Size: 10,
|
||||
Acl: "0.0.0.0/0",
|
||||
AccessScope: "PUBLIC",
|
||||
Version: "2022",
|
||||
}
|
||||
}
|
||||
|
||||
func TestAccResourceExample_basic(t *testing.T) {
|
||||
exData := getSingleExample()
|
||||
t.Logf("[INFO] resource name: %s", exData.TfName)
|
||||
|
||||
exBefore := testAccResourceExampleConfig(exData)
|
||||
|
||||
updData := exData
|
||||
// oldName := exData.Name
|
||||
updData.Name = "newname"
|
||||
updBefore := testAccResourceExampleConfig(updData)
|
||||
|
||||
resName := fmt.Sprintf("%s.%s", resourceString, exData.TfName)
|
||||
var resourceID string
|
||||
|
||||
compareValuesSame := statecheck.CompareValue(compare.ValuesSame())
|
||||
|
||||
resource.Test(t, resource.TestCase{
|
||||
PreCheck: func() { testAccPreCheck(t) },
|
||||
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
|
||||
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
|
||||
tfversion.SkipBelow(tfversion.Version1_10_0),
|
||||
},
|
||||
CheckDestroy: testAccCheckExampleResourceDestroy,
|
||||
Steps: []resource.TestStep{
|
||||
// test create
|
||||
{
|
||||
Config: exBefore,
|
||||
ConfigPlanChecks: resource.ConfigPlanChecks{
|
||||
PreApply: []plancheck.PlanCheck{
|
||||
plancheck.ExpectResourceAction(resName, plancheck.ResourceActionCreate),
|
||||
plancheck.ExpectNonEmptyPlan(),
|
||||
},
|
||||
},
|
||||
ConfigStateChecks: []statecheck.StateCheck{
|
||||
compareValuesSame.AddStateValue(
|
||||
resName,
|
||||
tfjsonpath.New("edition"),
|
||||
),
|
||||
statecheck.ExpectKnownValue(
|
||||
resName,
|
||||
tfjsonpath.New("edition"),
|
||||
knownvalue.StringExact("Standard"),
|
||||
),
|
||||
//statecheck.ExpectSensitiveValue(resName,
|
||||
// tfjsonpath.New("sensitive_string_attribute")),
|
||||
},
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
func(s *terraform.State) error {
|
||||
t.Logf("[INFO] resourceID: %+v", resourceID)
|
||||
return nil
|
||||
},
|
||||
testAccGrabResourceID(resName, &resourceID),
|
||||
func(s *terraform.State) error {
|
||||
t.Logf("[INFO] resourceID: %s", resourceID)
|
||||
return nil
|
||||
},
|
||||
testCheckResourceExists(resName),
|
||||
resource.TestCheckResourceAttrSet(resName, "id"),
|
||||
//resource.TestCheckResourceAttr(resName, "id", resourceID),
|
||||
resource.TestCheckResourceAttr(resName, "name", exData.Name),
|
||||
),
|
||||
},
|
||||
// up to here we should see no plan drift
|
||||
{
|
||||
Config: exBefore,
|
||||
PlanOnly: true,
|
||||
ExpectNonEmptyPlan: false,
|
||||
},
|
||||
// test update
|
||||
{
|
||||
Config: updBefore,
|
||||
Check: resource.ComposeAggregateTestCheckFunc(
|
||||
func(s *terraform.State) error {
|
||||
t.Logf("[INFO] resourceID: %s", resourceID)
|
||||
return nil
|
||||
},
|
||||
testCheckResourceExists(resName),
|
||||
resource.TestCheckResourceAttrSet(resName, "id"),
|
||||
//resource.TestCheckResourceAttr(resName, "id", resourceID),
|
||||
resource.TestCheckResourceAttr(resName, "name", updData.Name),
|
||||
),
|
||||
},
|
||||
// check for plan drift after update
|
||||
{
|
||||
Config: exBefore,
|
||||
PlanOnly: true,
|
||||
ExpectNonEmptyPlan: false,
|
||||
},
|
||||
//// Import test
|
||||
//{
|
||||
// ResourceName: resName,
|
||||
// ImportState: true,
|
||||
// ImportStateVerify: true,
|
||||
//},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func testAccCheckExampleResourceDestroy(state *terraform.State) error {
|
||||
//// retrieve the connection established in Provider configuration
|
||||
//conn := testAccProvider.Meta().(*ExampleClient)
|
||||
|
||||
// loop through the resources in state, verifying each widget
|
||||
// is destroyed
|
||||
for _, rs := range state.RootModule().Resources {
|
||||
if rs.Type != resourceString {
|
||||
continue
|
||||
}
|
||||
|
||||
fmt.Println(rs.String())
|
||||
// rs.Primary.ID
|
||||
|
||||
//// Retrieve our widget by referencing it's state ID for API lookup
|
||||
//request := &example.DescribeWidgets{
|
||||
// IDs: []string{rs.Primary.ID},
|
||||
//}
|
||||
//
|
||||
//response, err := conn.DescribeWidgets(request)
|
||||
//if err == nil {
|
||||
// if len(response.Widgets) > 0 && *response.Widgets[0].ID == rs.Primary.ID {
|
||||
// return fmt.Errorf("Widget (%s) still exists.", rs.Primary.ID)
|
||||
// }
|
||||
//
|
||||
// return nil
|
||||
//}
|
||||
//
|
||||
//// If the error is equivalent to 404 not found, the widget is destroyed.
|
||||
//// otherwise return the error
|
||||
//if !strings.Contains(err.Error(), "Widget not found") {
|
||||
// return err
|
||||
//}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func testAccResourceExampleConfig(data resData) string {
|
||||
tpl := `
|
||||
resource "stackitprivatepreview_sqlserverflexbeta_instance" "{{ .TfName }}" {
|
||||
project_id = "{{ .ProjectID }}"
|
||||
name = "{{ .Name }}"
|
||||
backup_schedule = "{{ .BackupSchedule }}"
|
||||
retention_days = {{ .RetentionDays }}
|
||||
flavor_id = "{{ .FlavorID }}"
|
||||
storage = {
|
||||
class = "{{ .PerformanceClass }}"
|
||||
size = {{ .Size }}
|
||||
}
|
||||
network = {
|
||||
acl = ["{{ .Acl }}"]
|
||||
access_scope = "{{ .AccessScope }}"
|
||||
}
|
||||
{{ if .WithEncryption }}
|
||||
encryption = {
|
||||
kek_key_id = "{{ .KekKeyId }}"
|
||||
kek_key_ring_id = "{{ .KekKeyRingId }}"
|
||||
kek_key_version = {{ .KekKeyVersion }}
|
||||
service_account = "{{ .KekSaEmail }}"
|
||||
}
|
||||
{{ end }}
|
||||
version = "{{ .Version }}"
|
||||
}
|
||||
`
|
||||
tmpl, err := template.New("").Parse(tpl)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
buff := new(bytes.Buffer)
|
||||
err = tmpl.Execute(buff, data)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
res := fmt.Sprintf(`
|
||||
%[1]s
|
||||
|
||||
%[2]s
|
||||
`,
|
||||
testutil.PostgresFlexProviderConfig(data.ServiceAccountFilePath),
|
||||
buff.String(),
|
||||
)
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
func testAccGrabResourceID(resourceName string, id *string) resource.TestCheckFunc {
|
||||
return func(s *terraform.State) error {
|
||||
rs, ok := s.RootModule().Resources[resourceName]
|
||||
if !ok {
|
||||
return fmt.Errorf("ressource not found: %s", resourceName)
|
||||
}
|
||||
if rs.Primary.ID == "" {
|
||||
return fmt.Errorf("no ID in state for %s", resourceName)
|
||||
}
|
||||
*id = rs.Primary.ID
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
//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)
|
||||
// json.NewEncoder(w).Encode(map[string]string{
|
||||
// "id": "mock-id-123",
|
||||
// "name": "test-resource",
|
||||
// })
|
||||
// case http.MethodGet:
|
||||
// w.WriteHeader(http.StatusOK)
|
||||
// json.NewEncoder(w).Encode([]map[string]string{})
|
||||
// }
|
||||
// })
|
||||
//
|
||||
// return httptest.NewServer(mux)
|
||||
//}
|
||||
//
|
||||
//func TestUnitResourceCreate(t *testing.T) {
|
||||
// server := setupMockServer()
|
||||
// defer server.Close()
|
||||
//
|
||||
// // Configure provider to use mock server URL
|
||||
// os.Setenv("API_ENDPOINT", server.URL)
|
||||
//
|
||||
// // 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.Test(t, resource.TestCase{
|
||||
// ProtoV6ProviderFactories: testutil.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)
|
||||
// // }
|
||||
// // })
|
||||
// //}
|
||||
//}
|
||||
|
|
@ -7,8 +7,7 @@ import (
|
|||
"github.com/hashicorp/terraform-plugin-framework/diag"
|
||||
"github.com/hashicorp/terraform-plugin-framework/types"
|
||||
|
||||
sqlserverflexbeta "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/sqlserverflexbeta"
|
||||
sqlserverflexbetaResGen "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/instance/resources_gen"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/pkg_gen/sqlserverflexbeta"
|
||||
)
|
||||
|
||||
func mapResponseToModel(
|
||||
|
|
@ -75,63 +74,25 @@ func mapResponseToModel(
|
|||
return nil
|
||||
}
|
||||
|
||||
// TODO: handle encryption field mapping when API supports it
|
||||
func handleEncryption(
|
||||
m *dataSourceModel,
|
||||
resp *sqlserverflexbeta.GetUserResponse,
|
||||
) sqlserverflexbetaResGen.EncryptionValue {
|
||||
/*
|
||||
if !resp.HasEncryption() ||
|
||||
|
||||
resp.Encryption == nil ||
|
||||
resp.Encryption.KekKeyId == nil ||
|
||||
resp.Encryption.KekKeyRingId == nil ||
|
||||
resp.Encryption.KekKeyVersion == nil ||
|
||||
resp.Encryption.ServiceAccount == nil {
|
||||
|
||||
if m.Encryption.IsNull() || m.Encryption.IsUnknown() {
|
||||
return sqlserverflexbetaResGen.NewEncryptionValueNull()
|
||||
}
|
||||
return m.Encryption
|
||||
}
|
||||
|
||||
enc := sqlserverflexbetaResGen.NewEncryptionValueNull()
|
||||
if kVal, ok := resp.Encryption.GetKekKeyIdOk(); ok {
|
||||
enc.KekKeyId = types.StringValue(kVal)
|
||||
}
|
||||
if kkVal, ok := resp.Encryption.GetKekKeyRingIdOk(); ok {
|
||||
enc.KekKeyRingId = types.StringValue(kkVal)
|
||||
}
|
||||
if kkvVal, ok := resp.Encryption.GetKekKeyVersionOk(); ok {
|
||||
enc.KekKeyVersion = types.StringValue(kkvVal)
|
||||
}
|
||||
if sa, ok := resp.Encryption.GetServiceAccountOk(); ok {
|
||||
enc.ServiceAccount = types.StringValue(sa)
|
||||
}
|
||||
return enc
|
||||
*/
|
||||
return sqlserverflexbetaResGen.NewEncryptionValueNull()
|
||||
}
|
||||
|
||||
func toCreatePayload(
|
||||
ctx context.Context,
|
||||
model *dataSourceModel,
|
||||
) (*sqlserverflexbeta.CreateUserRequestPayload, error) {
|
||||
if model == nil {
|
||||
return nil, fmt.Errorf("nil model")
|
||||
}
|
||||
|
||||
var roles []sqlserverflexbeta.UserRole
|
||||
if !model.Roles.IsNull() && !model.Roles.IsUnknown() {
|
||||
diags := model.Roles.ElementsAs(ctx, &roles, false)
|
||||
if diags.HasError() {
|
||||
return nil, fmt.Errorf("failed to convert roles: %v", diags)
|
||||
}
|
||||
}
|
||||
|
||||
return &sqlserverflexbeta.CreateUserRequestPayload{
|
||||
DefaultDatabase: model.DefaultDatabase.ValueStringPointer(),
|
||||
Username: model.Username.ValueStringPointer(),
|
||||
Roles: &roles,
|
||||
}, nil
|
||||
}
|
||||
//func toCreatePayload(
|
||||
// ctx context.Context,
|
||||
// model *resourceModel,
|
||||
//) (*sqlserverflexbeta.CreateUserRequestPayload, error) {
|
||||
// if model == nil {
|
||||
// return nil, fmt.Errorf("nil model")
|
||||
// }
|
||||
//
|
||||
// var roles []sqlserverflexbeta.UserRole
|
||||
// if !model.Roles.IsNull() && !model.Roles.IsUnknown() {
|
||||
// diags := model.Roles.ElementsAs(ctx, &roles, false)
|
||||
// if diags.HasError() {
|
||||
// return nil, fmt.Errorf("failed to convert roles: %v", diags)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// return &sqlserverflexbeta.CreateUserRequestPayload{
|
||||
// DefaultDatabase: model.DefaultDatabase.ValueStringPointer(),
|
||||
// Username: model.Username.ValueStringPointer(),
|
||||
// Roles: &roles,
|
||||
// }, nil
|
||||
//}
|
||||
|
|
|
|||
|
|
@ -158,6 +158,18 @@ func (r *userResource) Create(ctx context.Context, req resource.CreateRequest, r
|
|||
ctx = tflog.SetField(ctx, "project_id", projectId)
|
||||
ctx = tflog.SetField(ctx, "region", region)
|
||||
|
||||
//payload, err := toCreatePayload(ctx, &data)
|
||||
//if err != nil {
|
||||
// core.LogAndAddError(
|
||||
// ctx,
|
||||
// &resp.Diagnostics,
|
||||
// "Error creating User",
|
||||
// fmt.Sprintf("Creating API payload: %v", err),
|
||||
// )
|
||||
// return
|
||||
//}
|
||||
//payload = payload
|
||||
|
||||
// TODO: Create API call logic
|
||||
/*
|
||||
// Generate API request body from model
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
package testutil
|
||||
|
||||
import "testing"
|
||||
|
||||
func Equal[V comparable](t *testing.T, got, expected V) {
|
||||
t.Helper()
|
||||
|
||||
if expected != got {
|
||||
t.Errorf("assert equal failed:\ngot: %v \nexpected: %v", got, expected)
|
||||
}
|
||||
}
|
||||
|
|
@ -1,653 +0,0 @@
|
|||
// Copyright (c) STACKIT
|
||||
|
||||
package testutil
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-framework/providerserver"
|
||||
"github.com/hashicorp/terraform-plugin-go/tfprotov6"
|
||||
"github.com/hashicorp/terraform-plugin-testing/config"
|
||||
"github.com/hashicorp/terraform-plugin-testing/echoprovider"
|
||||
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit"
|
||||
)
|
||||
|
||||
const (
|
||||
// Default location of credentials JSON
|
||||
// credentialsFilePath = ".stackit/credentials.json" //nolint:gosec // linter false positive
|
||||
serviceAccountFilePath = ".stackit/service_account.json"
|
||||
)
|
||||
|
||||
var (
|
||||
// TestAccProtoV6ProviderFactories is used to instantiate a provider during
|
||||
// acceptance testing. The factory function will be invoked for every Terraform
|
||||
// CLI command executed to create a provider server to which the CLI can
|
||||
// reattach.
|
||||
TestAccProtoV6ProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){
|
||||
"stackitprivatepreview": providerserver.NewProtocol6WithError(stackit.New("test-version")()),
|
||||
}
|
||||
|
||||
// TestEphemeralAccProtoV6ProviderFactories is used to instantiate a provider during
|
||||
// acceptance testing. The factory function will be invoked for every Terraform
|
||||
// CLI command executed to create a provider server to which the CLI can
|
||||
// reattach.
|
||||
//
|
||||
// See the Terraform acceptance test documentation on ephemeral resources for more information:
|
||||
// https://developer.hashicorp.com/terraform/plugin/testing/acceptance-tests/ephemeral-resources
|
||||
TestEphemeralAccProtoV6ProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){
|
||||
"stackitprivatepreview": providerserver.NewProtocol6WithError(stackit.New("test-version")()),
|
||||
"echo": echoprovider.NewProviderServer(),
|
||||
}
|
||||
|
||||
// E2ETestsEnabled checks if end-to-end tests should be run.
|
||||
// It is enabled when the TF_ACC environment variable is set to "1".
|
||||
E2ETestsEnabled = os.Getenv("TF_ACC") == "1"
|
||||
// OrganizationId is the id of organization used for tests
|
||||
OrganizationId = os.Getenv("TF_ACC_ORGANIZATION_ID")
|
||||
// ProjectId is the id of project used for tests
|
||||
ProjectId = os.Getenv("TF_ACC_PROJECT_ID")
|
||||
Region = os.Getenv("TF_ACC_REGION")
|
||||
// ServiceAccountFile is the json file of the service account
|
||||
ServiceAccountFile = os.Getenv("TF_ACC_SERVICE_ACCOUNT_FILE")
|
||||
// ServerId is the id of a server used for some tests
|
||||
ServerId = getenv("TF_ACC_SERVER_ID", "")
|
||||
// TestProjectParentContainerID is the container id of the parent resource under which projects are created as part of the resource-manager acceptance tests
|
||||
TestProjectParentContainerID = os.Getenv("TF_ACC_TEST_PROJECT_PARENT_CONTAINER_ID")
|
||||
// TestProjectParentUUID is the uuid of the parent resource under which projects are created as part of the resource-manager acceptance tests
|
||||
TestProjectParentUUID = os.Getenv("TF_ACC_TEST_PROJECT_PARENT_UUID")
|
||||
// TestProjectServiceAccountEmail is the e-mail of a service account with admin permissions on the organization under which projects are created as part of the resource-manager acceptance tests
|
||||
TestProjectServiceAccountEmail = os.Getenv("TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_EMAIL")
|
||||
// TestProjectUserEmail is the e-mail of a user for the project created as part of the resource-manager acceptance tests
|
||||
// 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 = getenv("TF_ACC_TEST_IMAGE_LOCAL_FILE_PATH", "default")
|
||||
|
||||
CdnCustomEndpoint = os.Getenv("TF_ACC_CDN_CUSTOM_ENDPOINT")
|
||||
DnsCustomEndpoint = os.Getenv("TF_ACC_DNS_CUSTOM_ENDPOINT")
|
||||
GitCustomEndpoint = os.Getenv("TF_ACC_GIT_CUSTOM_ENDPOINT")
|
||||
IaaSCustomEndpoint = os.Getenv("TF_ACC_IAAS_CUSTOM_ENDPOINT")
|
||||
KMSCustomEndpoint = os.Getenv("TF_ACC_KMS_CUSTOM_ENDPOINT")
|
||||
LoadBalancerCustomEndpoint = os.Getenv("TF_ACC_LOADBALANCER_CUSTOM_ENDPOINT")
|
||||
LogMeCustomEndpoint = os.Getenv("TF_ACC_LOGME_CUSTOM_ENDPOINT")
|
||||
MariaDBCustomEndpoint = os.Getenv("TF_ACC_MARIADB_CUSTOM_ENDPOINT")
|
||||
ModelServingCustomEndpoint = os.Getenv("TF_ACC_MODELSERVING_CUSTOM_ENDPOINT")
|
||||
AuthorizationCustomEndpoint = os.Getenv("TF_ACC_authorization_custom_endpoint")
|
||||
MongoDBFlexCustomEndpoint = os.Getenv("TF_ACC_MONGODBFLEX_CUSTOM_ENDPOINT")
|
||||
OpenSearchCustomEndpoint = os.Getenv("TF_ACC_OPENSEARCH_CUSTOM_ENDPOINT")
|
||||
ObservabilityCustomEndpoint = os.Getenv("TF_ACC_OBSERVABILITY_CUSTOM_ENDPOINT")
|
||||
ObjectStorageCustomEndpoint = os.Getenv("TF_ACC_OBJECTSTORAGE_CUSTOM_ENDPOINT")
|
||||
PostgresFlexCustomEndpoint = os.Getenv("TF_ACC_POSTGRESFLEX_CUSTOM_ENDPOINT")
|
||||
RabbitMQCustomEndpoint = os.Getenv("TF_ACC_RABBITMQ_CUSTOM_ENDPOINT")
|
||||
RedisCustomEndpoint = os.Getenv("TF_ACC_REDIS_CUSTOM_ENDPOINT")
|
||||
ResourceManagerCustomEndpoint = os.Getenv("TF_ACC_RESOURCEMANAGER_CUSTOM_ENDPOINT")
|
||||
ScfCustomEndpoint = os.Getenv("TF_ACC_SCF_CUSTOM_ENDPOINT")
|
||||
SecretsManagerCustomEndpoint = os.Getenv("TF_ACC_SECRETSMANAGER_CUSTOM_ENDPOINT")
|
||||
SQLServerFlexCustomEndpoint = os.Getenv("TF_ACC_SQLSERVERFLEX_CUSTOM_ENDPOINT")
|
||||
ServerBackupCustomEndpoint = os.Getenv("TF_ACC_SERVER_BACKUP_CUSTOM_ENDPOINT")
|
||||
ServerUpdateCustomEndpoint = os.Getenv("TF_ACC_SERVER_UPDATE_CUSTOM_ENDPOINT")
|
||||
ServiceAccountCustomEndpoint = os.Getenv("TF_ACC_SERVICE_ACCOUNT_CUSTOM_ENDPOINT")
|
||||
SKECustomEndpoint = os.Getenv("TF_ACC_SKE_CUSTOM_ENDPOINT")
|
||||
)
|
||||
|
||||
// Provider config helper functions
|
||||
|
||||
func ObservabilityProviderConfig() string {
|
||||
if ObservabilityCustomEndpoint == "" {
|
||||
return `provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
observability_custom_endpoint = "%s"
|
||||
}`,
|
||||
ObservabilityCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func CdnProviderConfig() string {
|
||||
if CdnCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
enable_beta_resources = true
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
cdn_custom_endpoint = "%s"
|
||||
enable_beta_resources = true
|
||||
}`,
|
||||
CdnCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func DnsProviderConfig() string {
|
||||
if DnsCustomEndpoint == "" {
|
||||
return `provider "stackitprivatepreview" {}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
dns_custom_endpoint = "%s"
|
||||
}`,
|
||||
DnsCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func IaaSProviderConfig() string {
|
||||
if IaaSCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
iaas_custom_endpoint = "%s"
|
||||
}`,
|
||||
IaaSCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func IaaSProviderConfigWithBetaResourcesEnabled() string {
|
||||
if IaaSCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
enable_beta_resources = true
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
enable_beta_resources = true
|
||||
iaas_custom_endpoint = "%s"
|
||||
}`,
|
||||
IaaSCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func IaaSProviderConfigWithExperiments() string {
|
||||
if IaaSCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
experiments = [ "routing-tables", "network" ]
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
iaas_custom_endpoint = "%s"
|
||||
experiments = [ "routing-tables", "network" ]
|
||||
}`,
|
||||
IaaSCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func KMSProviderConfig() string {
|
||||
if KMSCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
kms_custom_endpoint = "%s"
|
||||
}`,
|
||||
KMSCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func LoadBalancerProviderConfig() string {
|
||||
if LoadBalancerCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
loadbalancer_custom_endpoint = "%s"
|
||||
}`,
|
||||
LoadBalancerCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func LogMeProviderConfig() string {
|
||||
if LogMeCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
logme_custom_endpoint = "%s"
|
||||
}`,
|
||||
LogMeCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func MariaDBProviderConfig() string {
|
||||
if MariaDBCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
mariadb_custom_endpoint = "%s"
|
||||
}`,
|
||||
MariaDBCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func ModelServingProviderConfig() string {
|
||||
if ModelServingCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}
|
||||
`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
modelserving_custom_endpoint = "%s"
|
||||
}`,
|
||||
ModelServingCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func MongoDBFlexProviderConfig() string {
|
||||
if MongoDBFlexCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
mongodbflex_custom_endpoint = "%s"
|
||||
}`,
|
||||
MongoDBFlexCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func ObjectStorageProviderConfig() string {
|
||||
if ObjectStorageCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
objectstorage_custom_endpoint = "%s"
|
||||
}`,
|
||||
ObjectStorageCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func OpenSearchProviderConfig() string {
|
||||
if OpenSearchCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
opensearch_custom_endpoint = "%s"
|
||||
}`,
|
||||
OpenSearchCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func PostgresFlexProviderConfig(saFile string) string {
|
||||
if PostgresFlexCustomEndpoint == "" {
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
service_account_key_path = "%s"
|
||||
}`, saFile)
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
service_account_key_path = "%s"
|
||||
postgresflex_custom_endpoint = "%s"
|
||||
}`,
|
||||
saFile,
|
||||
PostgresFlexCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func RabbitMQProviderConfig() string {
|
||||
if RabbitMQCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
rabbitmq_custom_endpoint = "%s"
|
||||
}`,
|
||||
RabbitMQCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func RedisProviderConfig() string {
|
||||
if RedisCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
redis_custom_endpoint = "%s"
|
||||
}`,
|
||||
RedisCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func ResourceManagerProviderConfig() string {
|
||||
key := GetTestProjectServiceAccountJson("")
|
||||
if ResourceManagerCustomEndpoint == "" || AuthorizationCustomEndpoint == "" {
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
service_account_key = "%s"
|
||||
}`,
|
||||
key,
|
||||
)
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
resourcemanager_custom_endpoint = "%s"
|
||||
authorization_custom_endpoint = "%s"
|
||||
service_account_token = "%s"
|
||||
}`,
|
||||
ResourceManagerCustomEndpoint,
|
||||
AuthorizationCustomEndpoint,
|
||||
key,
|
||||
)
|
||||
}
|
||||
|
||||
func SecretsManagerProviderConfig() string {
|
||||
if SecretsManagerCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
secretsmanager_custom_endpoint = "%s"
|
||||
}`,
|
||||
SecretsManagerCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func SQLServerFlexProviderConfig(saFile string) string {
|
||||
if SQLServerFlexCustomEndpoint == "" {
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
service_account_key_path = "%s"
|
||||
}`, saFile)
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
service_account_key_path = "%s"
|
||||
sqlserverflex_custom_endpoint = "%s"
|
||||
}`,
|
||||
saFile,
|
||||
SQLServerFlexCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func ServerBackupProviderConfig() string {
|
||||
if ServerBackupCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
enable_beta_resources = true
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
server_backup_custom_endpoint = "%s"
|
||||
enable_beta_resources = true
|
||||
}`,
|
||||
ServerBackupCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func ServerUpdateProviderConfig() string {
|
||||
if ServerUpdateCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
enable_beta_resources = true
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
server_update_custom_endpoint = "%s"
|
||||
enable_beta_resources = true
|
||||
}`,
|
||||
ServerUpdateCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func SKEProviderConfig() string {
|
||||
if SKECustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
ske_custom_endpoint = "%s"
|
||||
}`,
|
||||
SKECustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func AuthorizationProviderConfig() string {
|
||||
if AuthorizationCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
experiments = ["iam"]
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
authorization_custom_endpoint = "%s"
|
||||
experiments = ["iam"]
|
||||
}`,
|
||||
AuthorizationCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func ServiceAccountProviderConfig() string {
|
||||
if ServiceAccountCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
enable_beta_resources = true
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
service_account_custom_endpoint = "%s"
|
||||
enable_beta_resources = true
|
||||
}`,
|
||||
ServiceAccountCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func GitProviderConfig() string {
|
||||
if GitCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
enable_beta_resources = true
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
git_custom_endpoint = "%s"
|
||||
enable_beta_resources = true
|
||||
}`,
|
||||
GitCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func ScfProviderConfig() string {
|
||||
if ScfCustomEndpoint == "" {
|
||||
return `
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
}`
|
||||
}
|
||||
return fmt.Sprintf(`
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
scf_custom_endpoint = "%s"
|
||||
}`,
|
||||
ScfCustomEndpoint,
|
||||
)
|
||||
}
|
||||
|
||||
func ResourceNameWithDateTime(name string) string {
|
||||
dateTime := time.Now().Format(time.RFC3339)
|
||||
// Remove timezone to have a smaller datetime
|
||||
dateTimeTrimmed, _, _ := strings.Cut(dateTime, "+")
|
||||
return fmt.Sprintf("tf-acc-%s-%s", name, dateTimeTrimmed)
|
||||
}
|
||||
|
||||
func GetTestProjectServiceAccountJson(path string) string {
|
||||
var err error
|
||||
token, tokenSet := os.LookupEnv("TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_JSON")
|
||||
if !tokenSet || token == "" {
|
||||
token, err = readTestServiceAccountJsonFromFile(path)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
return token
|
||||
}
|
||||
|
||||
//func GetTestProjectServiceAccountToken(path string) string {
|
||||
// var err error
|
||||
// token, tokenSet := os.LookupEnv("TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN")
|
||||
// if !tokenSet || token == "" {
|
||||
// token, err = readTestTokenFromCredentialsFile(path)
|
||||
// if err != nil {
|
||||
// return ""
|
||||
// }
|
||||
// }
|
||||
// return token
|
||||
//}
|
||||
//
|
||||
//func readTestTokenFromCredentialsFile(path string) (string, error) {
|
||||
// if path == "" {
|
||||
// customPath, customPathSet := os.LookupEnv("STACKIT_CREDENTIALS_PATH")
|
||||
// if !customPathSet || customPath == "" {
|
||||
// path = credentialsFilePath
|
||||
// home, err := os.UserHomeDir()
|
||||
// if err != nil {
|
||||
// return "", fmt.Errorf("getting home directory: %w", err)
|
||||
// }
|
||||
// path = filepath.Join(home, path)
|
||||
// } else {
|
||||
// path = customPath
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// credentialsRaw, err := os.ReadFile(path)
|
||||
// if err != nil {
|
||||
// return "", fmt.Errorf("opening file: %w", err)
|
||||
// }
|
||||
//
|
||||
// var credentials struct {
|
||||
// TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN string `json:"TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN"`
|
||||
// }
|
||||
// err = json.Unmarshal(credentialsRaw, &credentials)
|
||||
// if err != nil {
|
||||
// return "", fmt.Errorf("unmarshalling credentials: %w", err)
|
||||
// }
|
||||
// return credentials.TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN, nil
|
||||
//}
|
||||
|
||||
func readTestServiceAccountJsonFromFile(path string) (string, error) {
|
||||
if path == "" {
|
||||
customPath, customPathSet := os.LookupEnv("STACKIT_SERVICE_ACCOUNT_PATH")
|
||||
if !customPathSet || customPath == "" {
|
||||
path = serviceAccountFilePath
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("getting home directory: %w", err)
|
||||
}
|
||||
path = filepath.Join(home, path)
|
||||
} else {
|
||||
path = customPath
|
||||
}
|
||||
}
|
||||
|
||||
credentialsRaw, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("opening file: %w", err)
|
||||
}
|
||||
return string(credentialsRaw), nil
|
||||
}
|
||||
|
||||
func getenv(key, defaultValue string) string {
|
||||
val := os.Getenv(key)
|
||||
if val == "" {
|
||||
return defaultValue
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
// CreateDefaultLocalFile is a 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
|
||||
}
|
||||
|
||||
func ConvertConfigVariable(variable config.Variable) string {
|
||||
tmpByteArray, _ := variable.MarshalJSON()
|
||||
// In case the variable is a string, the quotes should be removed
|
||||
if tmpByteArray[0] == '"' && tmpByteArray[len(tmpByteArray)-1] == '"' {
|
||||
result := string(tmpByteArray[1 : len(tmpByteArray)-1])
|
||||
// Replace escaped quotes which where added MarshalJSON
|
||||
rawString := strings.ReplaceAll(result, `\"`, `"`)
|
||||
return rawString
|
||||
}
|
||||
return string(tmpByteArray)
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
// Copyright (c) STACKIT
|
||||
|
||||
package testutil
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-testing/config"
|
||||
)
|
||||
|
||||
func TestConvertConfigVariable(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
variable config.Variable
|
||||
want string
|
||||
}{
|
||||
{
|
||||
name: "string",
|
||||
variable: config.StringVariable("test"),
|
||||
want: "test",
|
||||
},
|
||||
{
|
||||
name: "bool: true",
|
||||
variable: config.BoolVariable(true),
|
||||
want: "true",
|
||||
},
|
||||
{
|
||||
name: "bool: false",
|
||||
variable: config.BoolVariable(false),
|
||||
want: "false",
|
||||
},
|
||||
{
|
||||
name: "integer",
|
||||
variable: config.IntegerVariable(10),
|
||||
want: "10",
|
||||
},
|
||||
{
|
||||
name: "quoted string",
|
||||
variable: config.StringVariable(`instance =~ ".*"`),
|
||||
want: `instance =~ ".*"`,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if got := ConvertConfigVariable(tt.variable); got != tt.want {
|
||||
t.Errorf("ConvertConfigVariable() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -21,12 +21,12 @@ import (
|
|||
"github.com/stackitcloud/stackit-sdk-go/core/config"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/core"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/features"
|
||||
|
||||
postgresFlexAlphaDatabase "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/database"
|
||||
postgresFlexAlphaFlavor "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavor"
|
||||
postgresflexalphaFlavors "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/flavors"
|
||||
postgresFlexAlphaInstance "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/instance"
|
||||
postgresFlexAlphaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/postgresflexalpha/user"
|
||||
sqlserverFlexBetaFlavor "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/flavor"
|
||||
|
||||
sqlserverflexalphaDatabase "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/database"
|
||||
sqlserverFlexAlphaFlavor "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/flavor"
|
||||
|
|
@ -34,6 +34,7 @@ import (
|
|||
sqlserverFlexAlphaUser "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexalpha/user"
|
||||
|
||||
sqlserverflexBetaDatabase "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/database"
|
||||
sqlserverFlexBetaFlavor "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/flavor"
|
||||
sqlserverflexBetaInstance "tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/services/sqlserverflexbeta/instance"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
// Copyright (c) STACKIT
|
||||
|
||||
package stackit_test
|
||||
|
||||
import (
|
||||
|
|
@ -7,17 +5,15 @@ import (
|
|||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"path"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
|
||||
"github.com/joho/godotenv"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/internal/testutils"
|
||||
|
||||
"github.com/hashicorp/terraform-plugin-testing/config"
|
||||
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
|
||||
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
|
||||
"tf-provider.git.onstackit.cloud/stackit-dev-tools/terraform-provider-stackitprivatepreview/stackit/internal/testutil"
|
||||
)
|
||||
|
||||
//go:embed testdata/provider-credentials.tf
|
||||
|
|
@ -29,10 +25,7 @@ var providerInvalidAttribute string
|
|||
//go:embed testdata/provider-all-attributes.tf
|
||||
var providerValidAttributes string
|
||||
|
||||
var testConfigProviderCredentials = config.Variables{
|
||||
"project_id": config.StringVariable(testutil.ProjectId),
|
||||
"name": config.StringVariable(fmt.Sprintf("tf-acc-prov%s", acctest.RandStringFromCharSet(3, acctest.CharSetAlphaNum))),
|
||||
}
|
||||
var testConfigProviderCredentials config.Variables
|
||||
|
||||
func setup() {
|
||||
err := godotenv.Load()
|
||||
|
|
@ -41,6 +34,18 @@ func setup() {
|
|||
return
|
||||
}
|
||||
slog.Info("loaded .env file")
|
||||
|
||||
testConfigProviderCredentials = config.Variables{
|
||||
"project_id": config.StringVariable(os.Getenv("TF_ACC_PROJECT_ID")),
|
||||
"region": config.StringVariable(os.Getenv("TF_ACC_REGION")),
|
||||
"service_account_key_path": config.StringVariable(os.Getenv("TF_ACC_SERVICE_ACCOUNT_FILE")),
|
||||
"name": config.StringVariable(
|
||||
fmt.Sprintf(
|
||||
"tf-acc-prov%s",
|
||||
acctest.RandStringFromCharSet(3, acctest.CharSetAlphaNum),
|
||||
),
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
|
|
@ -50,94 +55,7 @@ func TestMain(m *testing.M) {
|
|||
os.Exit(code)
|
||||
}
|
||||
|
||||
// Helper function to obtain the home directory on different systems.
|
||||
// Based on os.UserHomeDir().
|
||||
func getHomeEnvVariableName() string {
|
||||
env := "HOME"
|
||||
switch runtime.GOOS {
|
||||
case "windows":
|
||||
env = "USERPROFILE"
|
||||
case "plan9":
|
||||
env = "home"
|
||||
}
|
||||
return env
|
||||
}
|
||||
|
||||
// create temporary home and initialize the credentials file as well
|
||||
func createTemporaryHome(createValidCredentialsFile bool, t *testing.T) string {
|
||||
// create a temporary file
|
||||
tempHome, err := os.MkdirTemp("", "tempHome")
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create temporary home directory: %v", err)
|
||||
}
|
||||
|
||||
// create credentials file in temp directory
|
||||
stackitFolder := path.Join(tempHome, ".stackit")
|
||||
if err := os.Mkdir(stackitFolder, 0o750); err != nil {
|
||||
t.Fatalf("Failed to create stackit folder: %v", err)
|
||||
}
|
||||
|
||||
filePath := path.Join(stackitFolder, "credentials.json")
|
||||
file, err := os.Create(filePath)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to create credentials file: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
if err := file.Close(); err != nil {
|
||||
t.Fatalf("Error while closing the file: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
// Define content, default = invalid token
|
||||
token := "foo_token"
|
||||
if createValidCredentialsFile {
|
||||
token = testutil.GetTestProjectServiceAccountToken("")
|
||||
}
|
||||
content := fmt.Sprintf(`
|
||||
{
|
||||
"STACKIT_SERVICE_ACCOUNT_TOKEN": "%s"
|
||||
}`, token)
|
||||
|
||||
if _, err = file.WriteString(content); err != nil {
|
||||
t.Fatalf("Error writing to file: %v", err)
|
||||
}
|
||||
|
||||
return tempHome
|
||||
}
|
||||
|
||||
// Function to overwrite the home folder
|
||||
func setTemporaryHome(tempHomePath string) {
|
||||
env := getHomeEnvVariableName()
|
||||
if err := os.Setenv(env, tempHomePath); err != nil {
|
||||
fmt.Printf("Error setting temporary home directory %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// cleanup the temporary home and reset the environment variable
|
||||
func cleanupTemporaryHome(tempHomePath string, t *testing.T) {
|
||||
if err := os.RemoveAll(tempHomePath); err != nil {
|
||||
t.Fatalf("Error cleaning up temporary folder: %v", err)
|
||||
}
|
||||
originalHomeDir, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to restore home directory back to normal: %v", err)
|
||||
}
|
||||
// revert back to original home folder
|
||||
env := getHomeEnvVariableName()
|
||||
if err := os.Setenv(env, originalHomeDir); err != nil {
|
||||
fmt.Printf("Error resetting temporary home directory %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func getServiceAccountToken() (string, error) {
|
||||
token, set := os.LookupEnv("TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN")
|
||||
if !set || token == "" {
|
||||
return "", fmt.Errorf("Token not set, please set TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN to a valid token to perform tests")
|
||||
}
|
||||
return token, nil
|
||||
}
|
||||
|
||||
func TestAccEnvVarTokenValid(t *testing.T) {
|
||||
func TestAccEnvVarServiceAccountPathValid(t *testing.T) {
|
||||
// Check if acceptance tests should be run
|
||||
if v := os.Getenv(resource.EnvTfAcc); v == "" {
|
||||
t.Skipf(
|
||||
|
|
@ -146,20 +64,14 @@ func TestAccEnvVarTokenValid(t *testing.T) {
|
|||
return
|
||||
}
|
||||
|
||||
token, err := getServiceAccountToken()
|
||||
if err != nil {
|
||||
t.Fatalf("Can't get token: %v", err)
|
||||
}
|
||||
|
||||
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
|
||||
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", token)
|
||||
tempHomeFolder := createTemporaryHome(false, t)
|
||||
defer cleanupTemporaryHome(tempHomeFolder, t)
|
||||
// t.Setenv("STACKIT_CREDENTIALS_PATH", "")
|
||||
tempHomeFolder := testutils.CreateTemporaryHome(true, t)
|
||||
defer testutils.CleanupTemporaryHome(tempHomeFolder, t)
|
||||
resource.Test(t, resource.TestCase{
|
||||
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
|
||||
ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
|
||||
Steps: []resource.TestStep{
|
||||
{
|
||||
PreConfig: func() { setTemporaryHome(tempHomeFolder) },
|
||||
PreConfig: func() { testutils.SetTemporaryHome(tempHomeFolder) },
|
||||
ConfigVariables: testConfigProviderCredentials,
|
||||
Config: providerCredentialConfig,
|
||||
},
|
||||
|
|
@ -167,16 +79,16 @@ func TestAccEnvVarTokenValid(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestAccEnvVarTokenInvalid(t *testing.T) {
|
||||
func TestAccEnvVarServiceAccountPathInvalid(t *testing.T) {
|
||||
t.Skip("needs refactoring")
|
||||
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
|
||||
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", "foo")
|
||||
tempHomeFolder := createTemporaryHome(false, t)
|
||||
defer cleanupTemporaryHome(tempHomeFolder, t)
|
||||
tempHomeFolder := testutils.CreateTemporaryHome(false, t)
|
||||
defer testutils.CleanupTemporaryHome(tempHomeFolder, t)
|
||||
resource.Test(t, resource.TestCase{
|
||||
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
|
||||
ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
|
||||
Steps: []resource.TestStep{
|
||||
{
|
||||
PreConfig: func() { setTemporaryHome(tempHomeFolder) },
|
||||
PreConfig: func() { testutils.SetTemporaryHome(tempHomeFolder) },
|
||||
ConfigVariables: testConfigProviderCredentials,
|
||||
Config: providerCredentialConfig,
|
||||
ExpectError: regexp.MustCompile(`undefined response type, status code 401`),
|
||||
|
|
@ -186,15 +98,15 @@ func TestAccEnvVarTokenInvalid(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestAccCredentialsFileValid(t *testing.T) {
|
||||
t.Skip("needs refactoring")
|
||||
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
|
||||
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", "")
|
||||
tempHomeFolder := createTemporaryHome(true, t)
|
||||
defer cleanupTemporaryHome(tempHomeFolder, t)
|
||||
tempHomeFolder := testutils.CreateTemporaryHome(true, t)
|
||||
defer testutils.CleanupTemporaryHome(tempHomeFolder, t)
|
||||
resource.Test(t, resource.TestCase{
|
||||
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
|
||||
ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
|
||||
Steps: []resource.TestStep{
|
||||
{
|
||||
PreConfig: func() { setTemporaryHome(tempHomeFolder) },
|
||||
PreConfig: func() { testutils.SetTemporaryHome(tempHomeFolder) },
|
||||
ConfigVariables: testConfigProviderCredentials,
|
||||
Config: providerCredentialConfig,
|
||||
},
|
||||
|
|
@ -203,15 +115,15 @@ func TestAccCredentialsFileValid(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestAccCredentialsFileInvalid(t *testing.T) {
|
||||
t.Skip("needs refactoring")
|
||||
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
|
||||
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", "")
|
||||
tempHomeFolder := createTemporaryHome(false, t)
|
||||
defer cleanupTemporaryHome(tempHomeFolder, t)
|
||||
tempHomeFolder := testutils.CreateTemporaryHome(false, t)
|
||||
defer testutils.CleanupTemporaryHome(tempHomeFolder, t)
|
||||
resource.Test(t, resource.TestCase{
|
||||
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
|
||||
ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
|
||||
Steps: []resource.TestStep{
|
||||
{
|
||||
PreConfig: func() { setTemporaryHome(tempHomeFolder) },
|
||||
PreConfig: func() { testutils.SetTemporaryHome(tempHomeFolder) },
|
||||
ConfigVariables: testConfigProviderCredentials,
|
||||
Config: providerCredentialConfig,
|
||||
ExpectError: regexp.MustCompile(`Jwt is not in(\r\n|\r|\n)the form of Header.Payload.Signature`),
|
||||
|
|
@ -221,6 +133,7 @@ func TestAccCredentialsFileInvalid(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestAccProviderConfigureValidValues(t *testing.T) {
|
||||
t.Skip("needs refactoring")
|
||||
// Check if acceptance tests should be run
|
||||
if v := os.Getenv(resource.EnvTfAcc); v == "" {
|
||||
t.Skipf(
|
||||
|
|
@ -228,18 +141,11 @@ func TestAccProviderConfigureValidValues(t *testing.T) {
|
|||
resource.EnvTfAcc)
|
||||
return
|
||||
}
|
||||
// use service account token for these tests
|
||||
token, err := getServiceAccountToken()
|
||||
if err != nil {
|
||||
t.Fatalf("Can't get token: %v", err)
|
||||
}
|
||||
|
||||
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
|
||||
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", token)
|
||||
tempHomeFolder := createTemporaryHome(true, t)
|
||||
defer cleanupTemporaryHome(tempHomeFolder, t)
|
||||
tempHomeFolder := testutils.CreateTemporaryHome(true, t)
|
||||
defer testutils.CleanupTemporaryHome(tempHomeFolder, t)
|
||||
resource.Test(t, resource.TestCase{
|
||||
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
|
||||
ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
|
||||
Steps: []resource.TestStep{
|
||||
{ // valid provider attributes
|
||||
ConfigVariables: testConfigProviderCredentials,
|
||||
|
|
@ -257,18 +163,12 @@ func TestAccProviderConfigureAnInvalidValue(t *testing.T) {
|
|||
resource.EnvTfAcc)
|
||||
return
|
||||
}
|
||||
// use service account token for these tests
|
||||
token, err := getServiceAccountToken()
|
||||
if err != nil {
|
||||
t.Fatalf("Can't get token: %v", err)
|
||||
}
|
||||
|
||||
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
|
||||
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", token)
|
||||
tempHomeFolder := createTemporaryHome(true, t)
|
||||
defer cleanupTemporaryHome(tempHomeFolder, t)
|
||||
tempHomeFolder := testutils.CreateTemporaryHome(true, t)
|
||||
defer testutils.CleanupTemporaryHome(tempHomeFolder, t)
|
||||
resource.Test(t, resource.TestCase{
|
||||
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
|
||||
ProtoV6ProviderFactories: testutils.TestAccProtoV6ProviderFactories,
|
||||
Steps: []resource.TestStep{
|
||||
{ // invalid test attribute should throw an error
|
||||
ConfigVariables: testConfigProviderCredentials,
|
||||
|
|
|
|||
14
stackit/testdata/provider-all-attributes.tf
vendored
14
stackit/testdata/provider-all-attributes.tf
vendored
|
|
@ -1,8 +1,8 @@
|
|||
|
||||
variable "project_id" {}
|
||||
variable "name" {}
|
||||
variable "region" {}
|
||||
|
||||
provider "stackit" {
|
||||
provider "stackitprivatepreview" {
|
||||
default_region = "eu01"
|
||||
credentials_path = "~/.stackit/credentials.json"
|
||||
service_account_token = ""
|
||||
|
|
@ -36,7 +36,11 @@ provider "stackit" {
|
|||
enable_beta_resources = "true"
|
||||
}
|
||||
|
||||
resource "stackit_network" "network" {
|
||||
name = var.name
|
||||
project_id = var.project_id
|
||||
data "stackitprivatepreview_postgresflexalpha_flavor" "flavor" {
|
||||
project_id = var.project_id
|
||||
region = var.region
|
||||
cpu = 2
|
||||
ram = 4
|
||||
node_type = "Single"
|
||||
storage_class = "premium-perf2-stackit"
|
||||
}
|
||||
|
|
|
|||
19
stackit/testdata/provider-credentials.tf
vendored
19
stackit/testdata/provider-credentials.tf
vendored
|
|
@ -1,11 +1,18 @@
|
|||
|
||||
variable "project_id" {}
|
||||
variable "name" {}
|
||||
variable "region" {}
|
||||
|
||||
provider "stackit" {
|
||||
variable "service_account_key_path" {}
|
||||
|
||||
provider "stackitprivatepreview" {
|
||||
service_account_key_path = var.service_account_key_path
|
||||
}
|
||||
|
||||
resource "stackit_network" "network" {
|
||||
name = var.name
|
||||
project_id = var.project_id
|
||||
}
|
||||
data "stackitprivatepreview_postgresflexalpha_flavor" "flavor" {
|
||||
project_id = var.project_id
|
||||
region = var.region
|
||||
cpu = 2
|
||||
ram = 4
|
||||
node_type = "Single"
|
||||
storage_class = "premium-perf2-stackit"
|
||||
}
|
||||
|
|
|
|||
16
stackit/testdata/provider-invalid-attribute.tf
vendored
16
stackit/testdata/provider-invalid-attribute.tf
vendored
|
|
@ -1,12 +1,16 @@
|
|||
|
||||
variable "project_id" {}
|
||||
variable "name" {}
|
||||
variable "region" {}
|
||||
|
||||
provider "stackit" {
|
||||
provider "stackitprivatepreview" {
|
||||
test = "test"
|
||||
}
|
||||
|
||||
resource "stackit_network" "network" {
|
||||
name = var.name
|
||||
project_id = var.project_id
|
||||
}
|
||||
data "stackitprivatepreview_postgresflexalpha_flavor" "flavor" {
|
||||
project_id = var.project_id
|
||||
region = var.region
|
||||
cpu = 2
|
||||
ram = 4
|
||||
node_type = "Single"
|
||||
storage_class = "premium-perf2-stackit"
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue