Skip to content

Commit 4c41af5

Browse files
committed
chore(serverupdate): Imporve acceptance tests
Signed-off-by: Alexander Dahmen <alexander.dahmen@inovex.de>
1 parent b9b6aad commit 4c41af5

5 files changed

Lines changed: 181 additions & 34 deletions

File tree

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,7 @@ Additionally:
225225
| Env var | Value | Example value | needed for Acc tests of the following services |
226226
|---------------------------------------------|---------------------------------------------------------------------------------------------------------|----------------------------------------|------------------------------------------------|
227227
| `TF_ACC_ORGANIZATION_ID` | ID of the STACKIT test organization | `5353ccfa-a984-4b96-a71d-b863dd2b7087` | `authorization`, `iaas` |
228-
| `TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_EMAIL` | Email of the STACKIT service account | `abc-serviceaccount@sa.stackit.cloud` | `authorization`, `resourcemanager` |
229-
| `TF_ACC_SERVER_ID` | ID of a STACKIT Server with STACKIT Server Agent enabled | `5353ccfa-a984-4b96-a71d-b863dd2b7087` | `serverbackup`, `serverupdate` |
228+
| `TF_ACC_TEST_PROJECT_SERVICE_ACCOUNT_EMAIL` | Email of the STACKIT service account | `abc-serviceaccount@sa.stackit.cloud` | `authorization`, `resourcemanager` | |
230229
| `TF_ACC_TEST_PROJECT_PARENT_CONTAINER_ID` | Container ID of the project parent container (folder within an organization or the organization itself) | `organization-d2b7087` | `resourcemanager` |
231230
| `TF_ACC_TEST_PROJECT_PARENT_UUID` | UUID ID of the project parent container (folder within an organization or the organization itself) | `5353ccfa-a984-4b96-a71d-b863dd2b7087` | `resourcemanager` |
232231

stackit/internal/services/serverupdate/serverupdate_acc_test.go

Lines changed: 109 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/hashicorp/terraform-plugin-testing/terraform"
1818
core_config "github.com/stackitcloud/stackit-sdk-go/core/config"
1919
"github.com/stackitcloud/stackit-sdk-go/core/utils"
20+
"github.com/stackitcloud/stackit-sdk-go/services/iaas"
2021
"github.com/stackitcloud/stackit-sdk-go/services/serverupdate"
2122
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
2223
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/testutil"
@@ -32,23 +33,29 @@ var (
3233

3334
var testConfigVarsMin = config.Variables{
3435
"project_id": config.StringVariable(testutil.ProjectId),
35-
"server_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlpha)),
3636
"schedule_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlpha)),
3737
"rrule": config.StringVariable("DTSTART;TZID=Europe/Sofia:20200803T023000 RRULE:FREQ=DAILY;INTERVAL=1"),
3838
"enabled": config.BoolVariable(true),
3939
"maintenance_window": config.IntegerVariable(1),
40-
//"server_id": config.StringVariable(testutil.ServerId),
40+
"server_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlphaNum)),
41+
"network_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlphaNum)),
42+
"machine_type": config.StringVariable("t1.1"),
43+
// image needs to contain the STACKIT Server Agent
44+
"image_id": config.StringVariable("fb5b3fa8-5e20-478a-929a-2b7da1676b18"),
4145
}
4246

4347
var testConfigVarsMax = config.Variables{
4448
"project_id": config.StringVariable(testutil.ProjectId),
45-
"server_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlpha)),
4649
"schedule_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlpha)),
4750
"rrule": config.StringVariable("DTSTART;TZID=Europe/Sofia:20200803T023000 RRULE:FREQ=DAILY;INTERVAL=1"),
4851
"enabled": config.BoolVariable(true),
4952
"maintenance_window": config.IntegerVariable(1),
5053
"region": config.StringVariable("eu01"),
51-
//"server_id": config.StringVariable(testutil.ServerId),
54+
"server_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlphaNum)),
55+
"network_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlphaNum)),
56+
"machine_type": config.StringVariable("t1.1"),
57+
// image needs to contain the STACKIT Server Agent
58+
"image_id": config.StringVariable("fb5b3fa8-5e20-478a-929a-2b7da1676b18"),
5259
}
5360

5461
func configVarsInvalid(vars config.Variables) config.Variables {
@@ -73,13 +80,12 @@ func configVarsMaxUpdated() config.Variables {
7380
}
7481

7582
func TestAccServerUpdateScheduleMinResource(t *testing.T) {
76-
/*if testutil.ServerId == "" {
77-
fmt.Println("TF_ACC_SERVER_ID not set, skipping test")
78-
return
79-
}*/
8083
resource.Test(t, resource.TestCase{
8184
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
82-
CheckDestroy: testAccCheckServerUpdateScheduleDestroy,
85+
CheckDestroy: resource.ComposeTestCheckFunc(
86+
testAccCheckServerUpdateScheduleDestroy,
87+
testAccCheckServerDestroy,
88+
),
8389
Steps: []resource.TestStep{
8490
// Creation fail
8591
{
@@ -94,12 +100,14 @@ func TestAccServerUpdateScheduleMinResource(t *testing.T) {
94100
Check: resource.ComposeAggregateTestCheckFunc(
95101
// Update schedule data
96102
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "project_id", testutil.ConvertConfigVariable(testConfigVarsMin["project_id"])),
97-
resource.TestCheckResourceAttrSet("stackit_server_update_schedule.test_schedule", "server_id"),
98103
resource.TestCheckResourceAttrSet("stackit_server_update_schedule.test_schedule", "update_schedule_id"),
99104
resource.TestCheckResourceAttrSet("stackit_server_update_schedule.test_schedule", "id"),
100105
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "name", testutil.ConvertConfigVariable(testConfigVarsMin["schedule_name"])),
101106
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "rrule", testutil.ConvertConfigVariable(testConfigVarsMin["rrule"])),
102107
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "enabled", testutil.ConvertConfigVariable(testConfigVarsMin["enabled"])),
108+
109+
// server
110+
resource.TestCheckResourceAttrSet("stackit_server_update_schedule.test_schedule", "server_id"),
103111
),
104112
},
105113
// data source
@@ -117,8 +125,10 @@ func TestAccServerUpdateScheduleMinResource(t *testing.T) {
117125

118126
// Server update schedules data
119127
resource.TestCheckResourceAttr("data.stackit_server_update_schedules.schedules_data_test", "project_id", testutil.ConvertConfigVariable(testConfigVarsMin["project_id"])),
120-
resource.TestCheckResourceAttr("data.stackit_server_update_schedules.schedules_data_test", "server_id", testutil.ConvertConfigVariable(testConfigVarsMin["server_id"])),
121128
resource.TestCheckResourceAttrSet("data.stackit_server_update_schedules.schedules_data_test", "id"),
129+
130+
// server
131+
resource.TestCheckResourceAttrSet("data.stackit_server_update_schedules.schedules_data_test", "server_id"),
122132
),
123133
},
124134
// Import
@@ -134,7 +144,11 @@ func TestAccServerUpdateScheduleMinResource(t *testing.T) {
134144
if !ok {
135145
return "", fmt.Errorf("couldn't find attribute update_schedule_id")
136146
}
137-
return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, testutil.ServerId, scheduleId), nil
147+
serverId, ok := r.Primary.Attributes["server_id"]
148+
if !ok {
149+
return "", fmt.Errorf("couldn't find attribute server_id")
150+
}
151+
return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, serverId, scheduleId), nil
138152
},
139153
ImportState: true,
140154
ImportStateVerify: true,
@@ -152,6 +166,9 @@ func TestAccServerUpdateScheduleMinResource(t *testing.T) {
152166
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "rrule", testutil.ConvertConfigVariable(configVarsMinUpdated()["rrule"])),
153167
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "enabled", testutil.ConvertConfigVariable(configVarsMinUpdated()["enabled"])),
154168
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "maintenance_window", testutil.ConvertConfigVariable(configVarsMinUpdated()["maintenance_window"])),
169+
170+
// server
171+
resource.TestCheckResourceAttrSet("stackit_server_update_schedule.test_schedule", "server_id"),
155172
),
156173
},
157174
// Deletion is done by the framework implicitly
@@ -160,13 +177,12 @@ func TestAccServerUpdateScheduleMinResource(t *testing.T) {
160177
}
161178

162179
func TestAccServerUpdateScheduleMaxResource(t *testing.T) {
163-
/*if testutil.ServerId == "" {
164-
fmt.Println("TF_ACC_SERVER_ID not set, skipping test")
165-
return
166-
}*/
167180
resource.Test(t, resource.TestCase{
168181
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
169-
CheckDestroy: testAccCheckServerUpdateScheduleDestroy,
182+
CheckDestroy: resource.ComposeTestCheckFunc(
183+
testAccCheckServerUpdateScheduleDestroy,
184+
testAccCheckServerDestroy,
185+
),
170186
Steps: []resource.TestStep{
171187
// Creation fail
172188
{
@@ -188,6 +204,9 @@ func TestAccServerUpdateScheduleMaxResource(t *testing.T) {
188204
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "rrule", testutil.ConvertConfigVariable(testConfigVarsMax["rrule"])),
189205
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "enabled", testutil.ConvertConfigVariable(testConfigVarsMax["enabled"])),
190206
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "region", testutil.Region),
207+
208+
// server
209+
resource.TestCheckResourceAttrSet("stackit_server_update_schedule.test_schedule", "server_id"),
191210
),
192211
},
193212
// data source
@@ -205,8 +224,10 @@ func TestAccServerUpdateScheduleMaxResource(t *testing.T) {
205224

206225
// Server update schedules data
207226
resource.TestCheckResourceAttr("data.stackit_server_update_schedules.schedules_data_test", "project_id", testutil.ConvertConfigVariable(testConfigVarsMax["project_id"])),
208-
resource.TestCheckResourceAttr("data.stackit_server_update_schedules.schedules_data_test", "server_id", testutil.ConvertConfigVariable(testConfigVarsMax["server_id"])),
209227
resource.TestCheckResourceAttrSet("data.stackit_server_update_schedules.schedules_data_test", "id"),
228+
229+
// server
230+
resource.TestCheckResourceAttrSet("data.stackit_server_update_schedules.schedules_data_test", "server_id"),
210231
),
211232
},
212233
// Import
@@ -244,6 +265,9 @@ func TestAccServerUpdateScheduleMaxResource(t *testing.T) {
244265
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "enabled", testutil.ConvertConfigVariable(configVarsMinUpdated()["enabled"])),
245266
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "maintenance_window", testutil.ConvertConfigVariable(configVarsMinUpdated()["maintenance_window"])),
246267
resource.TestCheckResourceAttr("stackit_server_update_schedule.test_schedule", "region", testutil.Region),
268+
269+
// server
270+
resource.TestCheckResourceAttrSet("stackit_server_update_schedule.test_schedule", "server_id"),
247271
),
248272
},
249273
// Deletion is done by the framework implicitly
@@ -274,6 +298,19 @@ func deleteSchedule(ctx context.Context, s *terraform.State) error {
274298
return fmt.Errorf("creating client: %w", err)
275299
}
276300

301+
var serverId string
302+
for _, rs := range s.RootModule().Resources {
303+
if rs.Type == "stackit_server" {
304+
// server terraform ID: "[project_id],[region],[server_id]"
305+
serverId = strings.Split(rs.Primary.ID, core.Separator)[2]
306+
break
307+
}
308+
}
309+
310+
if serverId == "" {
311+
return fmt.Errorf("could not find server ID in state")
312+
}
313+
277314
schedulesToDestroy := []string{}
278315
for _, rs := range s.RootModule().Resources {
279316
if rs.Type != "stackit_server_update_schedule" {
@@ -284,8 +321,13 @@ func deleteSchedule(ctx context.Context, s *terraform.State) error {
284321
schedulesToDestroy = append(schedulesToDestroy, scheduleId)
285322
}
286323

287-
schedulesResp, err := client.ListUpdateSchedules(ctx, testutil.ProjectId, testutil.ServerId, testutil.Region).Execute()
324+
schedulesResp, err := client.ListUpdateSchedules(ctx, testutil.ProjectId, serverId, testutil.Region).Execute()
325+
// The destroy functions are called after all resources are cleaned up.
326+
// If the server was successfully destroyed we should see a 404 here.
288327
if err != nil {
328+
if strings.Contains(err.Error(), "404") || strings.Contains(err.Error(), "Server not found") {
329+
return nil
330+
}
289331
return fmt.Errorf("getting schedulesResp: %w", err)
290332
}
291333

@@ -296,11 +338,58 @@ func deleteSchedule(ctx context.Context, s *terraform.State) error {
296338
}
297339
scheduleId := strconv.FormatInt(*schedules[i].Id, 10)
298340
if utils.Contains(schedulesToDestroy, scheduleId) {
299-
err := client.DeleteUpdateScheduleExecute(ctx, testutil.ProjectId, testutil.ServerId, scheduleId, testutil.Region)
341+
err := client.DeleteUpdateScheduleExecute(ctx, testutil.ProjectId, serverId, scheduleId, testutil.Region)
300342
if err != nil {
301343
return fmt.Errorf("destroying server update schedule %s during CheckDestroy: %w", scheduleId, err)
302344
}
303345
}
304346
}
305347
return nil
306348
}
349+
350+
// Additional function to check if the server was deleted if something went wrong in the first case.
351+
func testAccCheckServerDestroy(s *terraform.State) error {
352+
ctx := context.Background()
353+
var client *iaas.APIClient
354+
var err error
355+
356+
if testutil.IaaSCustomEndpoint == "" {
357+
client, err = iaas.NewAPIClient()
358+
} else {
359+
client, err = iaas.NewAPIClient(
360+
core_config.WithEndpoint(testutil.ServerBackupCustomEndpoint),
361+
)
362+
}
363+
if err != nil {
364+
return fmt.Errorf("creating client: %w", err)
365+
}
366+
367+
serversToDestroy := []string{}
368+
for _, rs := range s.RootModule().Resources {
369+
if rs.Type != "stackit_server" {
370+
continue
371+
}
372+
// server terraform ID: "[project_id],[region],[server_id]"
373+
serverId := strings.Split(rs.Primary.ID, core.Separator)[2]
374+
serversToDestroy = append(serversToDestroy, serverId)
375+
}
376+
377+
serversResp, err := client.ListServersExecute(ctx, testutil.ProjectId, testutil.Region)
378+
if err != nil {
379+
return fmt.Errorf("getting serversResp: %w", err)
380+
}
381+
382+
servers := *serversResp.Items
383+
for i := range servers {
384+
if servers[i].Id == nil {
385+
continue
386+
}
387+
if utils.Contains(serversToDestroy, *servers[i].Id) {
388+
err := client.DeleteServerExecute(ctx, testutil.ProjectId, testutil.Region, *servers[i].Id)
389+
if err != nil {
390+
return fmt.Errorf("destroying server %s during CheckDestroy: %w", *servers[i].Id, err)
391+
}
392+
}
393+
}
394+
return nil
395+
}
Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,45 @@
11
variable "project_id" {}
2-
variable "server_name" {}
32
variable "schedule_name" {}
43
variable "rrule" {}
54
variable "enabled" {}
65
variable "maintenance_window" {}
7-
variable "server_id" {}
86
variable "region" {}
97

8+
# server
9+
variable "server_name" {}
10+
variable "network_name" {}
11+
variable "machine_type" {}
12+
variable "image_id" {}
13+
14+
# create server
15+
resource "stackit_network" "network" {
16+
project_id = var.project_id
17+
name = var.network_name
18+
}
19+
20+
resource "stackit_network_interface" "nic" {
21+
project_id = var.project_id
22+
network_id = stackit_network.network.network_id
23+
}
24+
25+
resource "stackit_server" "server" {
26+
project_id = var.project_id
27+
name = var.server_name
28+
machine_type = var.machine_type
29+
boot_volume = {
30+
source_type = "image"
31+
size = 16
32+
source_id = var.image_id
33+
delete_on_termination = true
34+
}
35+
network_interfaces = [
36+
stackit_network_interface.nic.network_interface_id
37+
]
38+
}
39+
1040
resource "stackit_server_update_schedule" "test_schedule" {
1141
project_id = var.project_id
12-
server_id = var.server_id
42+
server_id = stackit_server.server.server_id
1343
name = var.schedule_name
1444
rrule = var.rrule
1545
enabled = var.enabled
@@ -19,11 +49,11 @@ resource "stackit_server_update_schedule" "test_schedule" {
1949

2050
data "stackit_server_update_schedule" "test_schedule" {
2151
project_id = var.project_id
22-
server_id = var.server_id
52+
server_id = stackit_server.server.server_id
2353
update_schedule_id = stackit_server_update_schedule.test_schedule.update_schedule_id
2454
}
2555

2656
data "stackit_server_update_schedules" "schedules_data_test" {
2757
project_id = var.project_id
28-
server_id = var.server_id
58+
server_id = stackit_server.server.server_id
2959
}
Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,45 @@
11
variable "project_id" {}
2-
variable "server_name" {}
32
variable "schedule_name" {}
43
variable "rrule" {}
54
variable "enabled" {}
65
variable "maintenance_window" {}
7-
variable "server_id" {}
6+
7+
# server
8+
variable "server_name" {}
9+
variable "network_name" {}
10+
variable "machine_type" {}
11+
variable "image_id" {}
12+
13+
# create server
14+
resource "stackit_network" "network" {
15+
project_id = var.project_id
16+
name = var.network_name
17+
}
18+
19+
resource "stackit_network_interface" "nic" {
20+
project_id = var.project_id
21+
network_id = stackit_network.network.network_id
22+
}
23+
24+
resource "stackit_server" "server" {
25+
project_id = var.project_id
26+
name = var.server_name
27+
machine_type = var.machine_type
28+
boot_volume = {
29+
source_type = "image"
30+
size = 16
31+
source_id = var.image_id
32+
delete_on_termination = true
33+
}
34+
network_interfaces = [
35+
stackit_network_interface.nic.network_interface_id
36+
]
37+
}
38+
839

940
resource "stackit_server_update_schedule" "test_schedule" {
1041
project_id = var.project_id
11-
server_id = var.server_id
42+
server_id = stackit_server.server.server_id
1243
name = var.schedule_name
1344
rrule = var.rrule
1445
enabled = var.enabled
@@ -17,11 +48,11 @@ resource "stackit_server_update_schedule" "test_schedule" {
1748

1849
data "stackit_server_update_schedule" "test_schedule" {
1950
project_id = var.project_id
20-
server_id = var.server_id
51+
server_id = stackit_server.server.server_id
2152
update_schedule_id = stackit_server_update_schedule.test_schedule.update_schedule_id
2253
}
2354

2455
data "stackit_server_update_schedules" "schedules_data_test" {
2556
project_id = var.project_id
26-
server_id = var.server_id
57+
server_id = stackit_server.server.server_id
2758
}

0 commit comments

Comments
 (0)