@@ -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
3233var 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
4247var 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
5362func configVarsInvalid (vars config.Variables ) config.Variables {
@@ -72,13 +81,12 @@ func configVarsMaxUpdated() config.Variables {
7281}
7382
7483func 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
166181func 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+ }
0 commit comments