@@ -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
3334var 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
4347var 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
5461func configVarsInvalid (vars config.Variables ) config.Variables {
@@ -73,13 +80,12 @@ func configVarsMaxUpdated() config.Variables {
7380}
7481
7582func 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
162179func 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+ }
0 commit comments