@@ -2,13 +2,17 @@ package instance_test
22
33import (
44 "errors"
5+ "fmt"
56 "regexp"
67 "strings"
78 "testing"
89
910 "github.com/hashicorp/terraform-plugin-testing/helper/resource"
1011 "github.com/hashicorp/terraform-plugin-testing/terraform"
12+ instanceSDK "github.com/scaleway/scaleway-sdk-go/api/instance/v1"
1113 "github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
14+ "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/instance"
15+ instancechecks "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/instance/testfuncs"
1216)
1317
1418func TestAccActionServer_Basic (t * testing.T ) {
@@ -21,6 +25,7 @@ func TestAccActionServer_Basic(t *testing.T) {
2125
2226 resource .ParallelTest (t , resource.TestCase {
2327 ProtoV6ProviderFactories : tt .ProviderFactories ,
28+ CheckDestroy : instancechecks .IsServerDestroyed (tt ),
2429 Steps : []resource.TestStep {
2530 {
2631 Config : `
@@ -97,6 +102,169 @@ func TestAccActionServer_Basic(t *testing.T) {
97102 })
98103}
99104
105+ func TestAccActionServer_On_Off (t * testing.T ) {
106+ if acctest .IsRunningOpenTofu () {
107+ t .Skip ("Skipping TestAccActionServer_Basic because action are not yet supported on OpenTofu" )
108+ }
109+
110+ tt := acctest .NewTestTools (t )
111+ defer tt .Cleanup ()
112+
113+ resource .ParallelTest (t , resource.TestCase {
114+ ProtoV6ProviderFactories : tt .ProviderFactories ,
115+ CheckDestroy : instancechecks .IsServerDestroyed (tt ),
116+ Steps : []resource.TestStep {
117+ {
118+ Config : fmt .Sprintf (`
119+ resource "scaleway_instance_server" "main" {
120+ name = "test-terraform-action-server-on-off"
121+ type = "DEV1-S"
122+ image = "ubuntu_jammy"
123+
124+ lifecycle {
125+ action_trigger {
126+ events = [after_create]
127+ actions = [action.scaleway_instance_server_action.stop]
128+ }
129+ }
130+ }
131+
132+ action "scaleway_instance_server_action" "stop" {
133+ config {
134+ action = "%s"
135+ server_id = scaleway_instance_server.main.id
136+ wait = true
137+ }
138+ }` , instanceSDK .ServerActionStopInPlace ),
139+ },
140+ {
141+ RefreshState : true ,
142+ Check : resource .ComposeTestCheckFunc (
143+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "state" , instance .InstanceServerStateStandby ),
144+ readActualServerState (tt , "scaleway_instance_server.main" , instanceSDK .ServerStateStoppedInPlace .String ()),
145+ ),
146+ },
147+ {
148+ Config : fmt .Sprintf (`
149+ resource "scaleway_instance_server" "main" {
150+ name = "should-be-powered-off"
151+ type = "DEV1-S"
152+ image = "ubuntu_jammy"
153+
154+ lifecycle {
155+ action_trigger {
156+ events = [after_update]
157+ actions = [action.scaleway_instance_server_action.poweroff]
158+ }
159+ }
160+ }
161+
162+ action "scaleway_instance_server_action" "poweroff" {
163+ config {
164+ action = "%s"
165+ server_id = scaleway_instance_server.main.id
166+ wait = true
167+ }
168+ }` , instanceSDK .ServerActionPoweroff ),
169+ },
170+ {
171+ RefreshState : true ,
172+ Check : resource .ComposeTestCheckFunc (
173+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "state" , instance .InstanceServerStateStopped ),
174+ readActualServerState (tt , "scaleway_instance_server.main" , instanceSDK .ServerStateStopped .String ()),
175+ ),
176+ },
177+ {
178+ Config : fmt .Sprintf (`
179+ resource "scaleway_instance_server" "main" {
180+ name = "should-be-started"
181+ type = "DEV1-S"
182+ image = "ubuntu_jammy"
183+
184+ lifecycle {
185+ action_trigger {
186+ events = [after_update]
187+ actions = [action.scaleway_instance_server_action.start]
188+ }
189+ }
190+ }
191+
192+ action "scaleway_instance_server_action" "start" {
193+ config {
194+ action = "%s"
195+ server_id = scaleway_instance_server.main.id
196+ wait = true
197+ }
198+ }` , instanceSDK .ServerActionPoweron ),
199+ },
200+ {
201+ RefreshState : true ,
202+ Check : resource .ComposeTestCheckFunc (
203+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "state" , instance .InstanceServerStateStarted ),
204+ readActualServerState (tt , "scaleway_instance_server.main" , instanceSDK .ServerStateRunning .String ()),
205+ ),
206+ },
207+ {
208+ Config : fmt .Sprintf (`
209+ resource "scaleway_instance_server" "main" {
210+ name = "should-be-terminated"
211+ type = "DEV1-S"
212+ image = "ubuntu_jammy"
213+
214+ lifecycle {
215+ action_trigger {
216+ events = [after_update]
217+ actions = [action.scaleway_instance_server_action.terminate]
218+ }
219+ }
220+ }
221+
222+ action "scaleway_instance_server_action" "terminate" {
223+ config {
224+ action = "%s"
225+ server_id = scaleway_instance_server.main.id
226+ wait = false
227+ }
228+ }` , instanceSDK .ServerActionTerminate ),
229+ ExpectNonEmptyPlan : true ,
230+ },
231+ {
232+ RefreshState : true ,
233+ Check : instancechecks .IsServerDestroyed (tt ),
234+ ExpectNonEmptyPlan : true ,
235+ },
236+ },
237+ })
238+ }
239+
240+ func readActualServerState (tt * acctest.TestTools , n string , expectedState string ) resource.TestCheckFunc {
241+ return func (state * terraform.State ) error {
242+ rs , ok := state .RootModule ().Resources [n ]
243+ if ! ok {
244+ return fmt .Errorf ("resource not found: %s" , n )
245+ }
246+
247+ api , zone , id , err := instance .NewAPIWithZoneAndID (tt .Meta , rs .Primary .ID )
248+ if err != nil {
249+ return err
250+ }
251+
252+ server , err := api .GetServer (& instanceSDK.GetServerRequest {
253+ Zone : zone ,
254+ ServerID : id ,
255+ })
256+ if err != nil {
257+ return err
258+ }
259+
260+ if server .Server .State .String () != expectedState {
261+ return fmt .Errorf ("expected server state to be %q, got %q" , expectedState , server .Server .State )
262+ }
263+
264+ return nil
265+ }
266+ }
267+
100268func TestAccActionServer_UnknownVerb (t * testing.T ) {
101269 if acctest .IsRunningOpenTofu () {
102270 t .Skip ("Skipping TestAccActionServer_Basic because action are not yet supported on OpenTofu" )
0 commit comments