Skip to content

Commit f1331b1

Browse files
committed
actions on/off/terminate OK, server state is now computed
1 parent e00b6fe commit f1331b1

File tree

5 files changed

+4174
-2
lines changed

5 files changed

+4174
-2
lines changed

internal/services/instance/action_server_action.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (a *ServerAction) Invoke(ctx context.Context, req action.InvokeRequest, res
136136
}
137137

138138
_, errWait := a.instanceAPI.WaitForServer(waitReq)
139-
if errWait != nil {
139+
if errWait != nil && data.Action.ValueString() != instance.ServerActionTerminate.String() {
140140
resp.Diagnostics.AddError(
141141
"error in wait server",
142142
fmt.Sprintf("%s", err))

internal/services/instance/action_server_action_test.go

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ package instance_test
22

33
import (
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

1418
func 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+
100268
func TestAccActionServer_UnknownVerb(t *testing.T) {
101269
if acctest.IsRunningOpenTofu() {
102270
t.Skip("Skipping TestAccActionServer_Basic because action are not yet supported on OpenTofu")

internal/services/instance/helpers_instance.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ func serverStateFlatten(fromState instance.ServerState) (string, error) {
135135

136136
// serverStateExpand converts terraform state to an API state or return an error.
137137
func serverStateExpand(rawState string) (instance.ServerState, error) {
138+
if rawState == "" {
139+
return instance.ServerStateRunning, nil
140+
}
138141
apiState, exist := map[string]instance.ServerState{
139142
InstanceServerStateStopped: instance.ServerStateStopped,
140143
InstanceServerStateStandby: instance.ServerStateStoppedInPlace,

internal/services/instance/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ func serverSchema() map[string]*schema.Schema {
255255
"state": {
256256
Type: schema.TypeString,
257257
Optional: true,
258-
Default: InstanceServerStateStarted,
258+
Computed: true,
259259
Description: "The state of the server should be: started, stopped, standby",
260260
ValidateFunc: validation.StringInSlice([]string{
261261
InstanceServerStateStarted,

internal/services/instance/testdata/action-server-on-off.cassette.yaml

Lines changed: 4001 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)