Skip to content

Commit b9b6aad

Browse files
committed
chore(serverbackup): Improve acceptance tests
Signed-off-by: Alexander Dahmen <alexander.dahmen@inovex.de>
1 parent 76d2775 commit b9b6aad

5 files changed

Lines changed: 191 additions & 41 deletions

File tree

stackit/internal/services/serverbackup/serverbackup_acc_test.go

Lines changed: 111 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/hashicorp/terraform-plugin-testing/terraform"
1717
core_config "github.com/stackitcloud/stackit-sdk-go/core/config"
1818
"github.com/stackitcloud/stackit-sdk-go/core/utils"
19+
"github.com/stackitcloud/stackit-sdk-go/services/iaas"
1920
"github.com/stackitcloud/stackit-sdk-go/services/serverbackup"
2021
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/core"
2122
"github.com/stackitcloud/terraform-provider-stackit/stackit/internal/testutil"
@@ -31,23 +32,31 @@ var (
3132

3233
var testConfigVarsMin = config.Variables{
3334
"project_id": config.StringVariable(testutil.ProjectId),
34-
"server_id": config.StringVariable(testutil.ServerId),
3535
"schedule_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlpha)),
3636
"rrule": config.StringVariable("DTSTART;TZID=Europe/Sofia:20200803T023000 RRULE:FREQ=DAILY;INTERVAL=1"),
3737
"enabled": config.BoolVariable(true),
3838
"backup_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlpha)),
3939
"retention_period": config.IntegerVariable(14),
40+
"server_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))),
41+
"network_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, 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"),
4045
}
4146

4247
var testConfigVarsMax = config.Variables{
4348
"project_id": config.StringVariable(testutil.ProjectId),
44-
"server_id": config.StringVariable(testutil.ServerId),
4549
"schedule_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlpha)),
4650
"rrule": config.StringVariable("DTSTART;TZID=Europe/Sofia:20200803T023000 RRULE:FREQ=DAILY;INTERVAL=1"),
4751
"enabled": config.BoolVariable(true),
4852
"backup_name": config.StringVariable("tf-acc-" + acctest.RandStringFromCharSet(8, acctest.CharSetAlpha)),
4953
"retention_period": config.IntegerVariable(14),
5054
"region": config.StringVariable("eu01"),
55+
"server_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))),
56+
"network_name": config.StringVariable(fmt.Sprintf("tf-acc-%s", acctest.RandStringFromCharSet(5, acctest.CharSetAlphaNum))),
57+
"machine_type": config.StringVariable("t1.1"),
58+
// image needs to contain the STACKIT Server Agent
59+
"image_id": config.StringVariable("fb5b3fa8-5e20-478a-929a-2b7da1676b18"),
5160
}
5261

5362
func configVarsInvalid(vars config.Variables) config.Variables {
@@ -72,13 +81,12 @@ func configVarsMaxUpdated() config.Variables {
7281
}
7382

7483
func TestAccServerBackupScheduleMinResource(t *testing.T) {
75-
if testutil.ServerId == "" {
76-
fmt.Println("TF_ACC_SERVER_ID not set, skipping test")
77-
return
78-
}
7984
resource.Test(t, resource.TestCase{
8085
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
81-
CheckDestroy: testAccCheckServerBackupScheduleDestroy,
86+
CheckDestroy: resource.ComposeTestCheckFunc(
87+
testAccCheckServerBackupScheduleDestroy,
88+
testAccCheckServerDestroy,
89+
),
8290
Steps: []resource.TestStep{
8391
// Creation fail
8492
{
@@ -93,13 +101,15 @@ func TestAccServerBackupScheduleMinResource(t *testing.T) {
93101
Check: resource.ComposeAggregateTestCheckFunc(
94102
// Backup schedule data
95103
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "project_id", testutil.ConvertConfigVariable(testConfigVarsMin["project_id"])),
96-
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "server_id", testutil.ConvertConfigVariable(testConfigVarsMin["server_id"])),
97104
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "backup_schedule_id"),
98105
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "id"),
99106
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "name", testutil.ConvertConfigVariable(testConfigVarsMin["schedule_name"])),
100107
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "rrule", testutil.ConvertConfigVariable(testConfigVarsMin["rrule"])),
101108
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "enabled", strconv.FormatBool(true)),
102109
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "backup_properties.name", testutil.ConvertConfigVariable(testConfigVarsMin["backup_name"])),
110+
111+
// server
112+
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "server_id"),
103113
),
104114
},
105115
// data source
@@ -109,7 +119,6 @@ func TestAccServerBackupScheduleMinResource(t *testing.T) {
109119
Check: resource.ComposeAggregateTestCheckFunc(
110120
// Server backup schedule data
111121
resource.TestCheckResourceAttr("data.stackit_server_backup_schedule.schedule_data_test", "project_id", testutil.ConvertConfigVariable(testConfigVarsMin["project_id"])),
112-
resource.TestCheckResourceAttr("data.stackit_server_backup_schedule.schedule_data_test", "server_id", testutil.ConvertConfigVariable(testConfigVarsMin["server_id"])),
113122
resource.TestCheckResourceAttrSet("data.stackit_server_backup_schedule.schedule_data_test", "backup_schedule_id"),
114123
resource.TestCheckResourceAttrSet("data.stackit_server_backup_schedule.schedule_data_test", "id"),
115124
resource.TestCheckResourceAttr("data.stackit_server_backup_schedule.schedule_data_test", "name", testutil.ConvertConfigVariable(testConfigVarsMin["schedule_name"])),
@@ -119,8 +128,8 @@ func TestAccServerBackupScheduleMinResource(t *testing.T) {
119128

120129
// Server backup schedules data
121130
resource.TestCheckResourceAttr("data.stackit_server_backup_schedules.schedules_data_test", "project_id", testutil.ConvertConfigVariable(testConfigVarsMin["project_id"])),
122-
resource.TestCheckResourceAttr("data.stackit_server_backup_schedules.schedules_data_test", "server_id", testutil.ConvertConfigVariable(testConfigVarsMin["server_id"])),
123131
resource.TestCheckResourceAttrSet("data.stackit_server_backup_schedules.schedules_data_test", "id"),
132+
resource.TestCheckResourceAttrSet("data.stackit_server_backup_schedules.schedules_data_test", "server_id"),
124133
),
125134
},
126135
// Import
@@ -136,7 +145,11 @@ func TestAccServerBackupScheduleMinResource(t *testing.T) {
136145
if !ok {
137146
return "", fmt.Errorf("couldn't find attribute backup_schedule_id")
138147
}
139-
return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, testutil.ServerId, scheduleId), nil
148+
serverId, ok := r.Primary.Attributes["server_id"]
149+
if !ok {
150+
return "", fmt.Errorf("couldn't find attribute server_id")
151+
}
152+
return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, serverId, scheduleId), nil
140153
},
141154
ImportState: true,
142155
ImportStateVerify: true,
@@ -148,14 +161,16 @@ func TestAccServerBackupScheduleMinResource(t *testing.T) {
148161
Check: resource.ComposeAggregateTestCheckFunc(
149162
// Backup schedule data
150163
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "project_id", testutil.ConvertConfigVariable(configVarsMinUpdated()["project_id"])),
151-
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "server_id", testutil.ConvertConfigVariable(configVarsMinUpdated()["server_id"])),
152164
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "backup_schedule_id"),
153165
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "id"),
154166
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "name", testutil.ConvertConfigVariable(configVarsMinUpdated()["schedule_name"])),
155167
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "rrule", testutil.ConvertConfigVariable(configVarsMinUpdated()["rrule"])),
156168
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "enabled", testutil.ConvertConfigVariable(configVarsMinUpdated()["enabled"])),
157169
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "backup_properties.retention_period", testutil.ConvertConfigVariable(configVarsMinUpdated()["retention_period"])),
158170
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "backup_properties.name", testutil.ConvertConfigVariable(configVarsMinUpdated()["backup_name"])),
171+
172+
// server
173+
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "server_id"),
159174
),
160175
},
161176
// Deletion is done by the framework implicitly
@@ -164,13 +179,12 @@ func TestAccServerBackupScheduleMinResource(t *testing.T) {
164179
}
165180

166181
func TestAccServerBackupScheduleMaxResource(t *testing.T) {
167-
if testutil.ServerId == "" {
168-
fmt.Println("TF_ACC_SERVER_ID not set, skipping test")
169-
return
170-
}
171182
resource.Test(t, resource.TestCase{
172183
ProtoV6ProviderFactories: testutil.TestAccProtoV6ProviderFactories,
173-
CheckDestroy: testAccCheckServerBackupScheduleDestroy,
184+
CheckDestroy: resource.ComposeTestCheckFunc(
185+
testAccCheckServerBackupScheduleDestroy,
186+
testAccCheckServerDestroy,
187+
),
174188
Steps: []resource.TestStep{
175189
// Creation fail
176190
{
@@ -185,13 +199,15 @@ func TestAccServerBackupScheduleMaxResource(t *testing.T) {
185199
Check: resource.ComposeAggregateTestCheckFunc(
186200
// Backup schedule data
187201
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "project_id", testutil.ConvertConfigVariable(testConfigVarsMax["project_id"])),
188-
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "server_id", testutil.ConvertConfigVariable(testConfigVarsMax["server_id"])),
189202
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "backup_schedule_id"),
190203
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "id"),
191204
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "name", testutil.ConvertConfigVariable(testConfigVarsMax["schedule_name"])),
192205
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "rrule", testutil.ConvertConfigVariable(testConfigVarsMax["rrule"])),
193206
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "enabled", strconv.FormatBool(true)),
194207
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "backup_properties.name", testutil.ConvertConfigVariable(testConfigVarsMax["backup_name"])),
208+
209+
// server
210+
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "server_id"),
195211
),
196212
},
197213
// data source
@@ -201,7 +217,6 @@ func TestAccServerBackupScheduleMaxResource(t *testing.T) {
201217
Check: resource.ComposeAggregateTestCheckFunc(
202218
// Server backup schedule data
203219
resource.TestCheckResourceAttr("data.stackit_server_backup_schedule.schedule_data_test", "project_id", testutil.ConvertConfigVariable(testConfigVarsMax["project_id"])),
204-
resource.TestCheckResourceAttr("data.stackit_server_backup_schedule.schedule_data_test", "server_id", testutil.ConvertConfigVariable(testConfigVarsMax["server_id"])),
205220
resource.TestCheckResourceAttrSet("data.stackit_server_backup_schedule.schedule_data_test", "backup_schedule_id"),
206221
resource.TestCheckResourceAttrSet("data.stackit_server_backup_schedule.schedule_data_test", "id"),
207222
resource.TestCheckResourceAttr("data.stackit_server_backup_schedule.schedule_data_test", "name", testutil.ConvertConfigVariable(testConfigVarsMax["schedule_name"])),
@@ -211,8 +226,8 @@ func TestAccServerBackupScheduleMaxResource(t *testing.T) {
211226

212227
// Server backup schedules data
213228
resource.TestCheckResourceAttr("data.stackit_server_backup_schedules.schedules_data_test", "project_id", testutil.ConvertConfigVariable(testConfigVarsMax["project_id"])),
214-
resource.TestCheckResourceAttr("data.stackit_server_backup_schedules.schedules_data_test", "server_id", testutil.ConvertConfigVariable(testConfigVarsMax["server_id"])),
215229
resource.TestCheckResourceAttrSet("data.stackit_server_backup_schedules.schedules_data_test", "id"),
230+
resource.TestCheckResourceAttrSet("data.stackit_server_backup_schedules.schedules_data_test", "server_id"),
216231
),
217232
},
218233
// Import
@@ -228,7 +243,11 @@ func TestAccServerBackupScheduleMaxResource(t *testing.T) {
228243
if !ok {
229244
return "", fmt.Errorf("couldn't find attribute backup_schedule_id")
230245
}
231-
return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, testutil.ServerId, scheduleId), nil
246+
serverId, ok := r.Primary.Attributes["server_id"]
247+
if !ok {
248+
return "", fmt.Errorf("couldn't find attribute server_id")
249+
}
250+
return fmt.Sprintf("%s,%s,%s,%s", testutil.ProjectId, testutil.Region, serverId, scheduleId), nil
232251
},
233252
ImportState: true,
234253
ImportStateVerify: true,
@@ -240,14 +259,16 @@ func TestAccServerBackupScheduleMaxResource(t *testing.T) {
240259
Check: resource.ComposeAggregateTestCheckFunc(
241260
// Backup schedule data
242261
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "project_id", testutil.ConvertConfigVariable(configVarsMaxUpdated()["project_id"])),
243-
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "server_id", testutil.ConvertConfigVariable(configVarsMaxUpdated()["server_id"])),
244262
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "backup_schedule_id"),
245263
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "id"),
246264
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "name", testutil.ConvertConfigVariable(configVarsMaxUpdated()["schedule_name"])),
247265
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "rrule", testutil.ConvertConfigVariable(configVarsMaxUpdated()["rrule"])),
248266
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "enabled", testutil.ConvertConfigVariable(configVarsMaxUpdated()["enabled"])),
249267
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "backup_properties.retention_period", testutil.ConvertConfigVariable(configVarsMaxUpdated()["retention_period"])),
250268
resource.TestCheckResourceAttr("stackit_server_backup_schedule.test_schedule", "backup_properties.name", testutil.ConvertConfigVariable(configVarsMaxUpdated()["backup_name"])),
269+
270+
// server
271+
resource.TestCheckResourceAttrSet("stackit_server_backup_schedule.test_schedule", "server_id"),
251272
),
252273
},
253274
// Deletion is done by the framework implicitly
@@ -267,7 +288,20 @@ func testAccCheckServerBackupScheduleDestroy(s *terraform.State) error {
267288
)
268289
}
269290
if err != nil {
270-
return fmt.Errorf("creating client: %w", err)
291+
return fmt.Errorf("creating serverbackup client: %w", err)
292+
}
293+
294+
var serverId string
295+
for _, rs := range s.RootModule().Resources {
296+
if rs.Type == "stackit_server" {
297+
// server terraform ID: "[project_id],[region],[server_id]"
298+
serverId = strings.Split(rs.Primary.ID, core.Separator)[2]
299+
break
300+
}
301+
}
302+
303+
if serverId == "" {
304+
return fmt.Errorf("could not find server ID in state")
271305
}
272306

273307
schedulesToDestroy := []string{}
@@ -280,8 +314,13 @@ func testAccCheckServerBackupScheduleDestroy(s *terraform.State) error {
280314
schedulesToDestroy = append(schedulesToDestroy, scheduleId)
281315
}
282316

283-
schedulesResp, err := client.ListBackupSchedules(ctx, testutil.ProjectId, testutil.ServerId, testutil.Region).Execute()
317+
schedulesResp, err := client.ListBackupSchedules(ctx, testutil.ProjectId, serverId, testutil.Region).Execute()
318+
// The destroy functions are called after all resources are cleaned up.
319+
// If the server was successfully destroyed we should see a 404 here.
284320
if err != nil {
321+
if strings.Contains(err.Error(), "404") || strings.Contains(err.Error(), "Server not found") {
322+
return nil
323+
}
285324
return fmt.Errorf("getting schedulesResp: %w", err)
286325
}
287326

@@ -292,11 +331,58 @@ func testAccCheckServerBackupScheduleDestroy(s *terraform.State) error {
292331
}
293332
scheduleId := strconv.FormatInt(*schedules[i].Id, 10)
294333
if utils.Contains(schedulesToDestroy, scheduleId) {
295-
err := client.DeleteBackupScheduleExecute(ctx, testutil.ProjectId, testutil.ServerId, scheduleId, testutil.Region)
334+
err := client.DeleteBackupScheduleExecute(ctx, testutil.ProjectId, serverId, scheduleId, testutil.Region)
296335
if err != nil {
297336
return fmt.Errorf("destroying server backup schedule %s during CheckDestroy: %w", scheduleId, err)
298337
}
299338
}
300339
}
301340
return nil
302341
}
342+
343+
// Additional function to check if the server was deleted if something went wrong in the first case.
344+
func testAccCheckServerDestroy(s *terraform.State) error {
345+
ctx := context.Background()
346+
var client *iaas.APIClient
347+
var err error
348+
349+
if testutil.IaaSCustomEndpoint == "" {
350+
client, err = iaas.NewAPIClient()
351+
} else {
352+
client, err = iaas.NewAPIClient(
353+
core_config.WithEndpoint(testutil.ServerBackupCustomEndpoint),
354+
)
355+
}
356+
if err != nil {
357+
return fmt.Errorf("creating client: %w", err)
358+
}
359+
360+
serversToDestroy := []string{}
361+
for _, rs := range s.RootModule().Resources {
362+
if rs.Type != "stackit_server" {
363+
continue
364+
}
365+
// server terraform ID: "[project_id],[region],[server_id]"
366+
serverId := strings.Split(rs.Primary.ID, core.Separator)[2]
367+
serversToDestroy = append(serversToDestroy, serverId)
368+
}
369+
370+
serversResp, err := client.ListServersExecute(ctx, testutil.ProjectId, testutil.Region)
371+
if err != nil {
372+
return fmt.Errorf("getting serversResp: %w", err)
373+
}
374+
375+
servers := *serversResp.Items
376+
for i := range servers {
377+
if servers[i].Id == nil {
378+
continue
379+
}
380+
if utils.Contains(serversToDestroy, *servers[i].Id) {
381+
err := client.DeleteServerExecute(ctx, testutil.ProjectId, testutil.Region, *servers[i].Id)
382+
if err != nil {
383+
return fmt.Errorf("destroying server %s during CheckDestroy: %w", *servers[i].Id, err)
384+
}
385+
}
386+
}
387+
return nil
388+
}

stackit/internal/services/serverbackup/testdata/resource-max.tf

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,46 @@
11
variable "project_id" {}
2-
variable "server_id" {}
32
variable "schedule_name" {}
43
variable "rrule" {}
54
variable "enabled" {}
65
variable "backup_name" {}
76
variable "retention_period" {}
87
variable "region" {}
98

9+
# server
10+
variable "server_name" {}
11+
variable "network_name" {}
12+
variable "machine_type" {}
13+
variable "image_id" {}
14+
15+
# create server
16+
resource "stackit_network" "network" {
17+
project_id = var.project_id
18+
name = var.network_name
19+
}
20+
21+
resource "stackit_network_interface" "nic" {
22+
project_id = var.project_id
23+
network_id = stackit_network.network.network_id
24+
}
25+
26+
resource "stackit_server" "server" {
27+
project_id = var.project_id
28+
name = var.server_name
29+
machine_type = var.machine_type
30+
boot_volume = {
31+
source_type = "image"
32+
size = 16
33+
source_id = var.image_id
34+
delete_on_termination = true
35+
}
36+
network_interfaces = [
37+
stackit_network_interface.nic.network_interface_id
38+
]
39+
}
1040

1141
resource "stackit_server_backup_schedule" "test_schedule" {
1242
project_id = var.project_id
13-
server_id = var.server_id
43+
server_id = stackit_server.server.server_id
1444
name = var.schedule_name
1545
rrule = var.rrule
1646
enabled = var.enabled
@@ -24,11 +54,11 @@ resource "stackit_server_backup_schedule" "test_schedule" {
2454

2555
data "stackit_server_backup_schedule" "schedule_data_test" {
2656
project_id = var.project_id
27-
server_id = var.server_id
57+
server_id = stackit_server.server.server_id
2858
backup_schedule_id = stackit_server_backup_schedule.test_schedule.backup_schedule_id
2959
}
3060

3161
data "stackit_server_backup_schedules" "schedules_data_test" {
3262
project_id = var.project_id
33-
server_id = var.server_id
63+
server_id = stackit_server.server.server_id
3464
}

0 commit comments

Comments
 (0)