@@ -2,13 +2,16 @@ 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"
1215)
1316
1417func TestAccActionServer_Basic (t * testing.T ) {
@@ -97,6 +100,163 @@ func TestAccActionServer_Basic(t *testing.T) {
97100 })
98101}
99102
103+ func TestAccActionServer_On_Off (t * testing.T ) {
104+ if acctest .IsRunningOpenTofu () {
105+ t .Skip ("Skipping TestAccActionServer_Basic because action are not yet supported on OpenTofu" )
106+ }
107+
108+ tt := acctest .NewTestTools (t )
109+ defer tt .Cleanup ()
110+
111+ resource .ParallelTest (t , resource.TestCase {
112+ ProtoV6ProviderFactories : tt .ProviderFactories ,
113+ Steps : []resource.TestStep {
114+ {
115+ Config : fmt .Sprintf (`
116+ resource "scaleway_instance_server" "main" {
117+ name = "test-terraform-action-server-on-off"
118+ type = "DEV1-S"
119+ image = "ubuntu_jammy"
120+
121+ lifecycle {
122+ action_trigger {
123+ events = [after_create]
124+ actions = [action.scaleway_instance_server_action.stop]
125+ }
126+ }
127+ }
128+
129+ action "scaleway_instance_server_action" "stop" {
130+ config {
131+ action = "%s"
132+ server_id = scaleway_instance_server.main.id
133+ wait = true
134+ }
135+ }` , instanceSDK .ServerActionStopInPlace ),
136+ },
137+ {
138+ RefreshState : true ,
139+ Check : resource .ComposeTestCheckFunc (
140+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "state" , instance .InstanceServerStateStandby ),
141+ readActualServerState (tt , "scaleway_instance_server.main" , instanceSDK .ServerStateStoppedInPlace .String ()),
142+ ),
143+ },
144+ {
145+ Config : fmt .Sprintf (`
146+ resource "scaleway_instance_server" "main" {
147+ name = "should-be-started"
148+ type = "DEV1-S"
149+ image = "ubuntu_jammy"
150+
151+ lifecycle {
152+ action_trigger {
153+ events = [after_create]
154+ actions = [action.scaleway_instance_server_action.stop]
155+ }
156+ action_trigger {
157+ events = [after_update]
158+ actions = [action.scaleway_instance_server_action.start]
159+ }
160+ }
161+ }
162+
163+ action "scaleway_instance_server_action" "stop" {
164+ config {
165+ action = "%s"
166+ server_id = scaleway_instance_server.main.id
167+ wait = true
168+ }
169+ }
170+
171+ action "scaleway_instance_server_action" "start" {
172+ config {
173+ action = "%s"
174+ server_id = scaleway_instance_server.main.id
175+ wait = true
176+ }
177+ }` , instanceSDK .ServerActionStopInPlace , instanceSDK .ServerActionPoweron ),
178+ },
179+ {
180+ RefreshState : true ,
181+ Check : resource .ComposeTestCheckFunc (
182+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "state" , instance .InstanceServerStateStarted ),
183+ readActualServerState (tt , "scaleway_instance_server.main" , instanceSDK .ServerStateRunning .String ()),
184+ ),
185+ },
186+ {
187+ Config : fmt .Sprintf (`
188+ resource "scaleway_instance_server" "main" {
189+ name = "should-be-powered-off"
190+ type = "DEV1-S"
191+ image = "ubuntu_jammy"
192+
193+ lifecycle {
194+ action_trigger {
195+ events = [after_create]
196+ actions = [action.scaleway_instance_server_action.stop]
197+ }
198+ action_trigger {
199+ events = [after_update]
200+ actions = [action.scaleway_instance_server_action.poweroff]
201+ }
202+ }
203+ }
204+
205+ action "scaleway_instance_server_action" "stop" {
206+ config {
207+ action = "%s"
208+ server_id = scaleway_instance_server.main.id
209+ wait = true
210+ }
211+ }
212+
213+ action "scaleway_instance_server_action" "poweroff" {
214+ config {
215+ action = "%s"
216+ server_id = scaleway_instance_server.main.id
217+ wait = true
218+ }
219+ }` , instanceSDK .ServerActionStopInPlace , instanceSDK .ServerActionPoweroff ),
220+ },
221+ {
222+ RefreshState : true ,
223+ Check : resource .ComposeTestCheckFunc (
224+ resource .TestCheckResourceAttr ("scaleway_instance_server.main" , "state" , instance .InstanceServerStateStopped ),
225+ readActualServerState (tt , "scaleway_instance_server.main" , instanceSDK .ServerStateStopped .String ()),
226+ ),
227+ },
228+ },
229+ })
230+ }
231+
232+ func readActualServerState (tt * acctest.TestTools , n string , expectedState string ) resource.TestCheckFunc {
233+ return func (state * terraform.State ) error {
234+ rs , ok := state .RootModule ().Resources [n ]
235+ if ! ok {
236+ return fmt .Errorf ("resource not found: %s" , n )
237+ }
238+
239+ api , zone , id , err := instance .NewAPIWithZoneAndID (tt .Meta , rs .Primary .ID )
240+ if err != nil {
241+ return err
242+ }
243+
244+ server , err := api .GetServer (& instanceSDK.GetServerRequest {
245+ Zone : zone ,
246+ ServerID : id ,
247+ })
248+ if err != nil {
249+ return err
250+ }
251+
252+ if server .Server .State .String () != expectedState {
253+ return fmt .Errorf ("expected server state to be %q, got %q" , expectedState , server .Server .State )
254+ }
255+
256+ return nil
257+ }
258+ }
259+
100260func TestAccActionServer_UnknownVerb (t * testing.T ) {
101261 if acctest .IsRunningOpenTofu () {
102262 t .Skip ("Skipping TestAccActionServer_Basic because action are not yet supported on OpenTofu" )
0 commit comments