Skip to content

Commit 3484a4a

Browse files
committed
actions on/off OK, server state is now computed
1 parent b919f45 commit 3484a4a

File tree

4 files changed

+4196
-1
lines changed

4 files changed

+4196
-1
lines changed

internal/services/instance/action_server_action_test.go

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ 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"
1215
)
1316

1417
func 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+
100260
func TestAccActionServer_UnknownVerb(t *testing.T) {
101261
if acctest.IsRunningOpenTofu() {
102262
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: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ func ResourceServer() *schema.Resource {
240240
"state": {
241241
Type: schema.TypeString,
242242
Optional: true,
243-
Default: InstanceServerStateStarted,
243+
Computed: true,
244244
Description: "The state of the server should be: started, stopped, standby",
245245
ValidateFunc: validation.StringInSlice([]string{
246246
InstanceServerStateStarted,
@@ -1130,7 +1130,14 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m
11301130
if d.HasChange("state") {
11311131
targetState, err := serverStateExpand(d.Get("state").(string))
11321132
if err != nil {
1133+
//server, err = waitForServer(ctx, api.API, zone, id, d.Timeout(schema.TimeoutUpdate))
1134+
//if err != nil {
1135+
// return diag.FromErr(err)
1136+
//}
1137+
//targetState, err = serverStateExpand(d.Get("state").(string))
1138+
//if err != nil {
11331139
return diag.FromErr(err)
1140+
//}
11341141
}
11351142
// reach expected state
11361143
err = reachState(ctx, api, zone, id, targetState)

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

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

0 commit comments

Comments
 (0)