Skip to content

Commit 932fff6

Browse files
authored
Onboard SQLServer Flex user resource (#403)
* Onboard SQLServer Flex user resource * change roles * fix unit tests * make database field optional // adapt test and documentation * add sleep time to instance creation * fix service name in logs and descriptions * extend username plan modifiers * update docs * remove database field * remove database // make roles optional * update docs
1 parent 50d74e6 commit 932fff6

11 files changed

Lines changed: 1343 additions & 2 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "stackit_sqlserverflex_user Data Source - stackit"
4+
subcategory: ""
5+
description: |-
6+
SQLServer Flex user data source schema. Must have a region specified in the provider configuration.
7+
---
8+
9+
# stackit_sqlserverflex_user (Data Source)
10+
11+
SQLServer Flex user data source schema. Must have a `region` specified in the provider configuration.
12+
13+
## Example Usage
14+
15+
```terraform
16+
data "stackit_sqlserverflex_user" "example" {
17+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
18+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
19+
user_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
20+
}
21+
```
22+
23+
<!-- schema generated by tfplugindocs -->
24+
## Schema
25+
26+
### Required
27+
28+
- `instance_id` (String) ID of the SQLServer Flex instance.
29+
- `project_id` (String) STACKIT project ID to which the instance is associated.
30+
- `user_id` (String) User ID.
31+
32+
### Read-Only
33+
34+
- `host` (String)
35+
- `id` (String) Terraform's internal data source. ID. It is structured as "`project_id`,`instance_id`,`user_id`".
36+
- `port` (Number)
37+
- `roles` (Set of String)
38+
- `username` (String)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "stackit_sqlserverflex_user Resource - stackit"
4+
subcategory: ""
5+
description: |-
6+
[Warning: BETA] SQLServer Flex user resource schema. Must have a region specified in the provider configuration.
7+
---
8+
9+
# stackit_sqlserverflex_user (Resource)
10+
11+
[Warning: BETA] SQLServer Flex user resource schema. Must have a `region` specified in the provider configuration.
12+
13+
## Example Usage
14+
15+
```terraform
16+
resource "stackit_sqlserverflex_user" "example" {
17+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
18+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
19+
username = "username"
20+
roles = ["role"]
21+
database = "database"
22+
}
23+
```
24+
25+
<!-- schema generated by tfplugindocs -->
26+
## Schema
27+
28+
### Required
29+
30+
- `instance_id` (String) ID of the SQLServer Flex instance.
31+
- `project_id` (String) STACKIT project ID to which the instance is associated.
32+
- `username` (String)
33+
34+
### Optional
35+
36+
- `roles` (Set of String)
37+
38+
### Read-Only
39+
40+
- `host` (String)
41+
- `id` (String) Terraform's internal resource ID. It is structured as "`project_id`,`instance_id`,`user_id`".
42+
- `password` (String, Sensitive)
43+
- `port` (Number)
44+
- `user_id` (String) User ID.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
data "stackit_sqlserverflex_user" "example" {
2+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
3+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
4+
user_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
resource "stackit_sqlserverflex_user" "example" {
2+
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
3+
instance_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
4+
username = "username"
5+
roles = ["role"]
6+
database = "database"
7+
}

stackit/internal/services/sqlserverflex/instance/resource.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,11 @@ func (r *instanceResource) Create(ctx context.Context, req resource.CreateReques
397397
if resp.Diagnostics.HasError() {
398398
return
399399
}
400+
401+
// After the instance creation, database might not be ready to accept connections immediately.
402+
// That is why we add a sleep
403+
time.Sleep(120 * time.Second)
404+
400405
tflog.Info(ctx, "SQLServer Flex instance created")
401406
}
402407

stackit/internal/services/sqlserverflex/sqlserverflex_acc_test.go

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ import (
99
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
1010
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
1111
"github.com/hashicorp/terraform-plugin-testing/terraform"
12-
"github.com/stackitcloud/stackit-sdk-go/core/utils"
13-
1412
"github.com/stackitcloud/stackit-sdk-go/core/config"
13+
"github.com/stackitcloud/stackit-sdk-go/core/utils"
1514
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex"
1615
"github.com/stackitcloud/stackit-sdk-go/services/sqlserverflex/wait"
1716
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
@@ -36,6 +35,13 @@ var instanceResource = map[string]string{
3635
"backup_schedule_updated": "00 12 * * *",
3736
}
3837

38+
// User resource data
39+
var userResource = map[string]string{
40+
"username": fmt.Sprintf("tf-acc-user-%s", acctest.RandStringFromCharSet(7, acctest.CharSetAlpha)),
41+
"role": "##STACKIT_LoginManager##",
42+
"project_id": instanceResource["project_id"],
43+
}
44+
3945
func configResources(backupSchedule string) string {
4046
return fmt.Sprintf(`
4147
%s
@@ -58,6 +64,13 @@ func configResources(backupSchedule string) string {
5864
}
5965
backup_schedule = "%s"
6066
}
67+
68+
resource "stackit_sqlserverflex_user" "user" {
69+
project_id = stackit_sqlserverflex_instance.instance.project_id
70+
instance_id = stackit_sqlserverflex_instance.instance.instance_id
71+
username = "%s"
72+
roles = ["%s"]
73+
}
6174
`,
6275
testutil.SQLServerFlexProviderConfig(),
6376
instanceResource["project_id"],
@@ -70,6 +83,8 @@ func configResources(backupSchedule string) string {
7083
instanceResource["version"],
7184
instanceResource["options_retention_days"],
7285
backupSchedule,
86+
userResource["username"],
87+
userResource["role"],
7388
)
7489
}
7590

@@ -98,6 +113,17 @@ func TestAccSQLServerFlexResource(t *testing.T) {
98113
resource.TestCheckResourceAttr("stackit_sqlserverflex_instance.instance", "version", instanceResource["version"]),
99114
resource.TestCheckResourceAttr("stackit_sqlserverflex_instance.instance", "options.retention_days", instanceResource["options_retention_days"]),
100115
resource.TestCheckResourceAttr("stackit_sqlserverflex_instance.instance", "backup_schedule", instanceResource["backup_schedule"]),
116+
// User
117+
resource.TestCheckResourceAttrPair(
118+
"stackit_sqlserverflex_user.user", "project_id",
119+
"stackit_sqlserverflex_instance.instance", "project_id",
120+
),
121+
resource.TestCheckResourceAttrPair(
122+
"stackit_sqlserverflex_user.user", "instance_id",
123+
"stackit_sqlserverflex_instance.instance", "instance_id",
124+
),
125+
resource.TestCheckResourceAttrSet("stackit_sqlserverflex_user.user", "user_id"),
126+
resource.TestCheckResourceAttrSet("stackit_sqlserverflex_user.user", "password"),
101127
),
102128
},
103129
// data source
@@ -109,6 +135,12 @@ func TestAccSQLServerFlexResource(t *testing.T) {
109135
project_id = stackit_sqlserverflex_instance.instance.project_id
110136
instance_id = stackit_sqlserverflex_instance.instance.instance_id
111137
}
138+
139+
data "stackit_sqlserverflex_user" "user" {
140+
project_id = stackit_sqlserverflex_instance.instance.project_id
141+
instance_id = stackit_sqlserverflex_instance.instance.instance_id
142+
user_id = stackit_sqlserverflex_user.user.user_id
143+
}
112144
`,
113145
configResources(instanceResource["backup_schedule"]),
114146
),
@@ -124,6 +156,11 @@ func TestAccSQLServerFlexResource(t *testing.T) {
124156
"data.stackit_sqlserverflex_instance.instance", "instance_id",
125157
"stackit_sqlserverflex_instance.instance", "instance_id",
126158
),
159+
resource.TestCheckResourceAttrPair(
160+
"data.stackit_sqlserverflex_user.user", "instance_id",
161+
"stackit_sqlserverflex_user.user", "instance_id",
162+
),
163+
127164
resource.TestCheckResourceAttr("data.stackit_sqlserverflex_instance.instance", "acl.#", "1"),
128165
resource.TestCheckResourceAttr("data.stackit_sqlserverflex_instance.instance", "acl.0", instanceResource["acl"]),
129166
resource.TestCheckResourceAttr("data.stackit_sqlserverflex_instance.instance", "flavor.id", instanceResource["flavor_id"]),
@@ -133,6 +170,15 @@ func TestAccSQLServerFlexResource(t *testing.T) {
133170
resource.TestCheckResourceAttr("data.stackit_sqlserverflex_instance.instance", "replicas", instanceResource["replicas"]),
134171
resource.TestCheckResourceAttr("stackit_sqlserverflex_instance.instance", "options.retention_days", instanceResource["options_retention_days"]),
135172
resource.TestCheckResourceAttr("data.stackit_sqlserverflex_instance.instance", "backup_schedule", instanceResource["backup_schedule"]),
173+
174+
// User data
175+
resource.TestCheckResourceAttr("data.stackit_sqlserverflex_user.user", "project_id", userResource["project_id"]),
176+
resource.TestCheckResourceAttrSet("data.stackit_sqlserverflex_user.user", "user_id"),
177+
resource.TestCheckResourceAttr("data.stackit_sqlserverflex_user.user", "username", userResource["username"]),
178+
resource.TestCheckResourceAttr("data.stackit_sqlserverflex_user.user", "roles.#", "1"),
179+
resource.TestCheckResourceAttr("data.stackit_sqlserverflex_user.user", "roles.0", userResource["role"]),
180+
resource.TestCheckResourceAttrSet("data.stackit_sqlserverflex_user.user", "host"),
181+
resource.TestCheckResourceAttrSet("data.stackit_sqlserverflex_user.user", "port"),
136182
),
137183
},
138184
// Import
@@ -163,6 +209,28 @@ func TestAccSQLServerFlexResource(t *testing.T) {
163209
return nil
164210
},
165211
},
212+
{
213+
ResourceName: "stackit_sqlserverflex_user.user",
214+
ImportStateIdFunc: func(s *terraform.State) (string, error) {
215+
r, ok := s.RootModule().Resources["stackit_sqlserverflex_user.user"]
216+
if !ok {
217+
return "", fmt.Errorf("couldn't find resource stackit_sqlserverflex_user.user")
218+
}
219+
instanceId, ok := r.Primary.Attributes["instance_id"]
220+
if !ok {
221+
return "", fmt.Errorf("couldn't find attribute instance_id")
222+
}
223+
userId, ok := r.Primary.Attributes["user_id"]
224+
if !ok {
225+
return "", fmt.Errorf("couldn't find attribute user_id")
226+
}
227+
228+
return fmt.Sprintf("%s,%s,%s", testutil.ProjectId, instanceId, userId), nil
229+
},
230+
ImportState: true,
231+
ImportStateVerify: true,
232+
ImportStateVerifyIgnore: []string{"password"},
233+
},
166234
// Update
167235
{
168236
Config: configResources(instanceResource["backup_schedule_updated"]),

0 commit comments

Comments
 (0)