Skip to content

Commit 2f06bc5

Browse files
authored
feat(provider): Added acceptance tests (#891)
* feat(provider): Added acceptance tests Signed-off-by: Alexander Dahmen <alexander.dahmen@inovex.de> * Remove argus custom endpoint from provider. This code was removed. Signed-off-by: Alexander Dahmen <alexander.dahmen@inovex.de> --------- Signed-off-by: Alexander Dahmen <alexander.dahmen@inovex.de>
1 parent 38fdb60 commit 2f06bc5

8 files changed

Lines changed: 323 additions & 28 deletions

File tree

docs/index.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ Note: AWS specific checks must be skipped as they do not work on STACKIT. For de
151151

152152
### Optional
153153

154-
- `argus_custom_endpoint` (String, Deprecated) Custom endpoint for the Argus service
155154
- `authorization_custom_endpoint` (String) Custom endpoint for the Membership service
156155
- `cdn_custom_endpoint` (String) Custom endpoint for the CDN service
157156
- `credentials_path` (String) Path of JSON from where the credentials are read. Takes precedence over the env var `STACKIT_CREDENTIALS_PATH`. Default value is `~/.stackit/credentials.json`.

stackit/internal/core/core.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ type ProviderData struct {
2121
// Deprecated: Use DefaultRegion instead
2222
Region string
2323
DefaultRegion string
24-
ArgusCustomEndpoint string
2524
AuthorizationCustomEndpoint string
2625
CdnCustomEndpoint string
2726
DnsCustomEndpoint string

stackit/internal/testutil/testutil.go

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ var (
5050
// TestImageLocalFilePath is the local path to an image file used for image acceptance tests
5151
TestImageLocalFilePath = getenv("TF_ACC_TEST_IMAGE_LOCAL_FILE_PATH", "default")
5252

53-
ArgusCustomEndpoint = os.Getenv("TF_ACC_ARGUS_CUSTOM_ENDPOINT")
5453
CdnCustomEndpoint = os.Getenv("TF_ACC_CDN_CUSTOM_ENDPOINT")
5554
DnsCustomEndpoint = os.Getenv("TF_ACC_DNS_CUSTOM_ENDPOINT")
5655
GitCustomEndpoint = os.Getenv("TF_ACC_GIT_CUSTOM_ENDPOINT")
@@ -78,22 +77,6 @@ var (
7877

7978
// Provider config helper functions
8079

81-
func ArgusProviderConfig() string {
82-
if ArgusCustomEndpoint == "" {
83-
return `provider "stackit" {
84-
default_region = "eu01"
85-
}`
86-
}
87-
return fmt.Sprintf(`
88-
provider "stackit" {
89-
argus_custom_endpoint = "%s"
90-
}`,
91-
ArgusCustomEndpoint,
92-
)
93-
}
94-
95-
// Provider config helper functions
96-
9780
func ObservabilityProviderConfig() string {
9881
if ObservabilityCustomEndpoint == "" {
9982
return `provider "stackit" {
@@ -299,7 +282,7 @@ func RedisProviderConfig() string {
299282
}
300283

301284
func ResourceManagerProviderConfig() string {
302-
token := getTestProjectServiceAccountToken("")
285+
token := GetTestProjectServiceAccountToken("")
303286
if ResourceManagerCustomEndpoint == "" || AuthorizationCustomEndpoint == "" {
304287
return fmt.Sprintf(`
305288
provider "stackit" {
@@ -458,7 +441,7 @@ func ResourceNameWithDateTime(name string) string {
458441
return fmt.Sprintf("tf-acc-%s-%s", name, dateTimeTrimmed)
459442
}
460443

461-
func getTestProjectServiceAccountToken(path string) string {
444+
func GetTestProjectServiceAccountToken(path string) string {
462445
var err error
463446
token, tokenSet := os.LookupEnv("TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN")
464447
if !tokenSet || token == "" {

stackit/provider.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ type providerModel struct {
115115
// Deprecated: Use DefaultRegion instead
116116
Region types.String `tfsdk:"region"`
117117
DefaultRegion types.String `tfsdk:"default_region"`
118-
ArgusCustomEndpoint types.String `tfsdk:"argus_custom_endpoint"`
119118
CdnCustomEndpoint types.String `tfsdk:"cdn_custom_endpoint"`
120119
DNSCustomEndpoint types.String `tfsdk:"dns_custom_endpoint"`
121120
GitCustomEndpoint types.String `tfsdk:"git_custom_endpoint"`
@@ -157,7 +156,6 @@ func (p *Provider) Schema(_ context.Context, _ provider.SchemaRequest, resp *pro
157156
"service_account_email": "Service account email. It can also be set using the environment variable STACKIT_SERVICE_ACCOUNT_EMAIL. It is required if you want to use the resource manager project resource.",
158157
"region": "Region will be used as the default location for regional services. Not all services require a region, some are global",
159158
"default_region": "Region will be used as the default location for regional services. Not all services require a region, some are global",
160-
"argus_custom_endpoint": "Custom endpoint for the Argus service",
161159
"cdn_custom_endpoint": "Custom endpoint for the CDN service",
162160
"dns_custom_endpoint": "Custom endpoint for the DNS service",
163161
"git_custom_endpoint": "Custom endpoint for the Git service",
@@ -233,11 +231,6 @@ func (p *Provider) Schema(_ context.Context, _ provider.SchemaRequest, resp *pro
233231
stringvalidator.ConflictsWith(path.MatchRoot("region")),
234232
},
235233
},
236-
"argus_custom_endpoint": schema.StringAttribute{
237-
Optional: true,
238-
Description: descriptions["argus_custom_endpoint"],
239-
DeprecationMessage: "Argus service has been deprecated and integration will be removed after February 26th 2025. Please use `observability_custom_endpoint` and `observability` resources instead, which offer the exact same functionality.",
240-
},
241234
"cdn_custom_endpoint": schema.StringAttribute{
242235
Optional: true,
243236
Description: descriptions["cdn_custom_endpoint"],

stackit/provider_acc_test.go

Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
package stackit_test
2+
3+
import (
4+
_ "embed"
5+
"fmt"
6+
"os"
7+
"path"
8+
"regexp"
9+
"runtime"
10+
"testing"
11+
12+
"github.com/hashicorp/terraform-plugin-testing/config"
13+
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
14+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
15+
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/testutil"
16+
)
17+
18+
//go:embed testdata/provider-credentials.tf
19+
var providerCredentialConfig string
20+
21+
//go:embed testdata/provider-invalid-attribute.tf
22+
var providerInvalidAttribute string
23+
24+
//go:embed testdata/provider-all-attributes.tf
25+
var providerValidAttributes string
26+
27+
var testConfigProviderCredentials = config.Variables{
28+
"project_id": config.StringVariable(testutil.ProjectId),
29+
"name": config.StringVariable(fmt.Sprintf("tf-acc-prov%s", acctest.RandStringFromCharSet(3, acctest.CharSetAlphaNum))),
30+
}
31+
32+
// Helper function to obtain the home directory on different systems.
33+
// Based on os.UserHomeDir().
34+
func getHomeEnvVariableName() string {
35+
env := "HOME"
36+
switch runtime.GOOS {
37+
case "windows":
38+
env = "USERPROFILE"
39+
case "plan9":
40+
env = "home"
41+
}
42+
return env
43+
}
44+
45+
// create temporary home and initialize the credentials file as well
46+
func createTemporaryHome(createValidCredentialsFile bool, t *testing.T) string {
47+
// create a temporary file
48+
tempHome, err := os.MkdirTemp("", "tempHome")
49+
if err != nil {
50+
t.Fatalf("Failed to create temporary home directory: %v", err)
51+
}
52+
53+
// create credentials file in temp directory
54+
stackitFolder := path.Join(tempHome, ".stackit")
55+
if err := os.Mkdir(stackitFolder, 0o750); err != nil {
56+
t.Fatalf("Failed to create stackit folder: %v", err)
57+
}
58+
59+
filePath := path.Join(stackitFolder, "credentials.json")
60+
file, err := os.Create(filePath)
61+
if err != nil {
62+
t.Fatalf("Failed to create credentials file: %v", err)
63+
}
64+
defer func() {
65+
if err := file.Close(); err != nil {
66+
t.Fatalf("Error while closing the file: %v", err)
67+
}
68+
}()
69+
70+
// Define content, default = invalid token
71+
token := "foo_token"
72+
if createValidCredentialsFile {
73+
token = testutil.GetTestProjectServiceAccountToken("")
74+
}
75+
content := fmt.Sprintf(`
76+
{
77+
"STACKIT_SERVICE_ACCOUNT_TOKEN": "%s"
78+
}`, token)
79+
80+
if _, err = file.WriteString(content); err != nil {
81+
t.Fatalf("Error writing to file: %v", err)
82+
}
83+
84+
return tempHome
85+
}
86+
87+
// Function to overwrite the home folder
88+
func setTemporaryHome(tempHomePath string) {
89+
env := getHomeEnvVariableName()
90+
if err := os.Setenv(env, tempHomePath); err != nil {
91+
fmt.Printf("Error setting temporary home directory %v", err)
92+
}
93+
}
94+
95+
// cleanup the temporary home and reset the environment variable
96+
func cleanupTemporaryHome(tempHomePath string, t *testing.T) {
97+
if err := os.RemoveAll(tempHomePath); err != nil {
98+
t.Fatalf("Error cleaning up temporary folder: %v", err)
99+
}
100+
originalHomeDir, err := os.UserHomeDir()
101+
if err != nil {
102+
t.Fatalf("Failed to restore home directory back to normal: %v", err)
103+
}
104+
// revert back to original home folder
105+
env := getHomeEnvVariableName()
106+
if err := os.Setenv(env, originalHomeDir); err != nil {
107+
fmt.Printf("Error resetting temporary home directory %v", err)
108+
}
109+
}
110+
111+
func getServiceAccountToken() (string, error) {
112+
token, set := os.LookupEnv("TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN")
113+
if !set || token == "" {
114+
return "", fmt.Errorf("Token not set, please set TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_TOKEN to a valid token to perform tests")
115+
}
116+
return token, nil
117+
}
118+
119+
func TestAccEnvVarTokenValid(t *testing.T) {
120+
// Check if acceptance tests should be run
121+
if v := os.Getenv(resource.EnvTfAcc); v == "" {
122+
t.Skipf(
123+
"Acceptance tests skipped unless env '%s' set",
124+
resource.EnvTfAcc)
125+
return
126+
}
127+
128+
token, err := getServiceAccountToken()
129+
if err != nil {
130+
t.Fatalf("Can't get token: %v", err)
131+
}
132+
133+
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
134+
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", token)
135+
tempHomeFolder := createTemporaryHome(false, t)
136+
defer cleanupTemporaryHome(tempHomeFolder, t)
137+
resource.Test(t, resource.TestCase{
138+
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
139+
Steps: []resource.TestStep{
140+
{
141+
PreConfig: func() { setTemporaryHome(tempHomeFolder) },
142+
ConfigVariables: testConfigProviderCredentials,
143+
Config: providerCredentialConfig,
144+
},
145+
},
146+
})
147+
}
148+
149+
func TestAccEnvVarTokenInvalid(t *testing.T) {
150+
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
151+
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", "foo")
152+
tempHomeFolder := createTemporaryHome(false, t)
153+
defer cleanupTemporaryHome(tempHomeFolder, t)
154+
resource.Test(t, resource.TestCase{
155+
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
156+
Steps: []resource.TestStep{
157+
{
158+
PreConfig: func() { setTemporaryHome(tempHomeFolder) },
159+
ConfigVariables: testConfigProviderCredentials,
160+
Config: providerCredentialConfig,
161+
ExpectError: regexp.MustCompile(`undefined response type, status code 401`),
162+
},
163+
},
164+
})
165+
}
166+
167+
func TestAccCredentialsFileValid(t *testing.T) {
168+
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
169+
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", "")
170+
tempHomeFolder := createTemporaryHome(true, t)
171+
defer cleanupTemporaryHome(tempHomeFolder, t)
172+
resource.Test(t, resource.TestCase{
173+
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
174+
Steps: []resource.TestStep{
175+
{
176+
PreConfig: func() { setTemporaryHome(tempHomeFolder) },
177+
ConfigVariables: testConfigProviderCredentials,
178+
Config: providerCredentialConfig,
179+
},
180+
},
181+
})
182+
}
183+
184+
func TestAccCredentialsFileInvalid(t *testing.T) {
185+
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
186+
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", "")
187+
tempHomeFolder := createTemporaryHome(false, t)
188+
defer cleanupTemporaryHome(tempHomeFolder, t)
189+
resource.Test(t, resource.TestCase{
190+
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
191+
Steps: []resource.TestStep{
192+
{
193+
PreConfig: func() { setTemporaryHome(tempHomeFolder) },
194+
ConfigVariables: testConfigProviderCredentials,
195+
Config: providerCredentialConfig,
196+
ExpectError: regexp.MustCompile(`Jwt is not in(\r\n|\r|\n)the form of Header.Payload.Signature`),
197+
},
198+
},
199+
})
200+
}
201+
202+
func TestAccProviderConfigureValidValues(t *testing.T) {
203+
// Check if acceptance tests should be run
204+
if v := os.Getenv(resource.EnvTfAcc); v == "" {
205+
t.Skipf(
206+
"Acceptance tests skipped unless env '%s' set",
207+
resource.EnvTfAcc)
208+
return
209+
}
210+
// use service account token for these tests
211+
token, err := getServiceAccountToken()
212+
if err != nil {
213+
t.Fatalf("Can't get token: %v", err)
214+
}
215+
216+
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
217+
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", token)
218+
tempHomeFolder := createTemporaryHome(true, t)
219+
defer cleanupTemporaryHome(tempHomeFolder, t)
220+
resource.Test(t, resource.TestCase{
221+
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
222+
Steps: []resource.TestStep{
223+
{ // valid provider attributes
224+
ConfigVariables: testConfigProviderCredentials,
225+
Config: providerValidAttributes,
226+
},
227+
},
228+
})
229+
}
230+
231+
func TestAccProviderConfigureAnInvalidValue(t *testing.T) {
232+
// Check if acceptance tests should be run
233+
if v := os.Getenv(resource.EnvTfAcc); v == "" {
234+
t.Skipf(
235+
"Acceptance tests skipped unless env '%s' set",
236+
resource.EnvTfAcc)
237+
return
238+
}
239+
// use service account token for these tests
240+
token, err := getServiceAccountToken()
241+
if err != nil {
242+
t.Fatalf("Can't get token: %v", err)
243+
}
244+
245+
t.Setenv("STACKIT_CREDENTIALS_PATH", "")
246+
t.Setenv("STACKIT_SERVICE_ACCOUNT_TOKEN", token)
247+
tempHomeFolder := createTemporaryHome(true, t)
248+
defer cleanupTemporaryHome(tempHomeFolder, t)
249+
resource.Test(t, resource.TestCase{
250+
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
251+
Steps: []resource.TestStep{
252+
{ // invalid test attribute should throw an error
253+
ConfigVariables: testConfigProviderCredentials,
254+
Config: providerInvalidAttribute,
255+
ExpectError: regexp.MustCompile(`An argument named "test" is not expected here\.`),
256+
},
257+
},
258+
})
259+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
variable "project_id" {}
2+
variable "name" {}
3+
4+
provider "stackit" {
5+
default_region = "eu01"
6+
credentials_path = "~/.stackit/credentials.json"
7+
service_account_token = ""
8+
service_account_key_path = ""
9+
service_account_key = ""
10+
private_key_path = ""
11+
private_key = ""
12+
service_account_email = "abc@abc.de"
13+
cdn_custom_endpoint = "https://cdn.api.eu01.stackit.cloud"
14+
dns_custom_endpoint = "https://dns.api.stackit.cloud"
15+
git_custom_endpoint = "https://git.api.stackit.cloud"
16+
iaas_custom_endpoint = "https://iaas.api.stackit.cloud"
17+
mongodbflex_custom_endpoint = "https://mongodbflex.api.stackit.cloud"
18+
modelserving_custom_endpoint = "https://modelserving.api.stackit.cloud"
19+
loadbalancer_custom_endpoint = "https://load-balancer.api.stackit.cloud"
20+
mariadb_custom_endpoint = "https://mariadb.api.stackit.cloud"
21+
authorization_custom_endpoint = "https://authorization.api.stackit.cloud"
22+
objectstorage_custom_endpoint = "https://objectstorage.api.stackit.cloud"
23+
observability_custom_endpoint = "https://observability.api.stackit.cloud"
24+
opensearch_custom_endpoint = "https://opensearch.api.stackit.cloud"
25+
postgresflex_custom_endpoint = "https://postgresflex.api.stackit.cloud"
26+
redis_custom_endpoint = "https://redis.api.stackit.cloud"
27+
server_backup_custom_endpoint = "https://server-backup.api.stackit.cloud"
28+
server_update_custom_endpoint = "https://server-update.api.stackit.cloud"
29+
service_account_custom_endpoint = "https://service-account.api.stackit.cloud"
30+
resourcemanager_custom_endpoint = "https://resourcemanager.api.stackit.cloud"
31+
sqlserverflex_custom_endpoint = "https://sqlserverflex.api.stackit.cloud"
32+
ske_custom_endpoint = "https://ske.api.stackit.cloud"
33+
service_enablement_custom_endpoint = "https://service-enablement.api.stackit.cloud"
34+
token_custom_endpoint = "https://token.api.stackit.cloud"
35+
enable_beta_resources = "true"
36+
}
37+
38+
resource "stackit_network" "network" {
39+
name = var.name
40+
project_id = var.project_id
41+
}

0 commit comments

Comments
 (0)