Skip to content

Commit 98d8468

Browse files
nicolai86stack72
authored andcommitted
provider/scaleway server volume property (hashicorp#9695)
* provider/scaleway: extract volume validation helpers * provider/scaleway: add server volume property fixes hashicorp#9499 * provider/scaleway: update `scaleway_server` docu * provider/scaleway: fix volume handling this actually broken when merging the latest SDK update :( * provider/scaleway: fix volume attachment * provider/scaleway: fix volume expectation
1 parent 18b3736 commit 98d8468

7 files changed

Lines changed: 140 additions & 24 deletions

File tree

builtin/providers/scaleway/helpers.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,22 @@ func String(val string) *string {
1818
return &val
1919
}
2020

21+
func validateVolumeType(v interface{}, k string) (ws []string, errors []error) {
22+
value := v.(string)
23+
if value != "l_ssd" {
24+
errors = append(errors, fmt.Errorf("%q must be l_ssd", k))
25+
}
26+
return
27+
}
28+
29+
func validateVolumeSize(v interface{}, k string) (ws []string, errors []error) {
30+
value := v.(int)
31+
if value < 1 || value > 150 {
32+
errors = append(errors, fmt.Errorf("%q be more than 1 and less than 150", k))
33+
}
34+
return
35+
}
36+
2137
// deleteRunningServer terminates the server and waits until it is removed.
2238
func deleteRunningServer(scaleway *api.ScalewayAPI, server *api.ScalewayServer) error {
2339
err := scaleway.PostServerAction(server.Identifier, "terminate")

builtin/providers/scaleway/resource_scaleway_server.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,29 @@ func resourceScalewayServer() *schema.Resource {
5757
Type: schema.TypeString,
5858
Optional: true,
5959
},
60+
"volume": &schema.Schema{
61+
Type: schema.TypeList,
62+
Optional: true,
63+
ForceNew: true,
64+
Elem: &schema.Resource{
65+
Schema: map[string]*schema.Schema{
66+
"size_in_gb": {
67+
Type: schema.TypeInt,
68+
Required: true,
69+
ValidateFunc: validateVolumeSize,
70+
},
71+
"type": &schema.Schema{
72+
Type: schema.TypeString,
73+
Required: true,
74+
ValidateFunc: validateVolumeType,
75+
},
76+
"volume_id": &schema.Schema{
77+
Type: schema.TypeString,
78+
Computed: true,
79+
},
80+
},
81+
},
82+
},
6083
"private_ip": &schema.Schema{
6184
Type: schema.TypeString,
6285
Computed: true,
@@ -97,6 +120,28 @@ func resourceScalewayServerCreate(d *schema.ResourceData, m interface{}) error {
97120
server.Bootscript = String(bootscript.(string))
98121
}
99122

123+
if vs, ok := d.GetOk("volume"); ok {
124+
server.Volumes = make(map[string]string)
125+
126+
volumes := vs.([]interface{})
127+
for i, v := range volumes {
128+
volume := v.(map[string]interface{})
129+
130+
volumeID, err := scaleway.PostVolume(api.ScalewayVolumeDefinition{
131+
Size: uint64(volume["size_in_gb"].(int)) * gb,
132+
Type: volume["type"].(string),
133+
Name: fmt.Sprintf("%s-%d", server.Name, volume["size_in_gb"].(int)),
134+
})
135+
if err != nil {
136+
return err
137+
}
138+
volume["volume_id"] = volumeID
139+
volumes[i] = volume
140+
server.Volumes[fmt.Sprintf("%d", i+1)] = volumeID
141+
}
142+
d.Set("volume", volumes)
143+
}
144+
100145
if raw, ok := d.GetOk("tags"); ok {
101146
for _, tag := range raw.([]interface{}) {
102147
server.Tags = append(server.Tags, tag.(string))

builtin/providers/scaleway/resource_scaleway_server_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,39 @@ func TestAccScalewayServer_Basic(t *testing.T) {
3131
})
3232
}
3333

34+
func TestAccScalewayServer_Volumes(t *testing.T) {
35+
resource.Test(t, resource.TestCase{
36+
PreCheck: func() { testAccPreCheck(t) },
37+
Providers: testAccProviders,
38+
CheckDestroy: testAccCheckScalewayServerDestroy,
39+
Steps: []resource.TestStep{
40+
resource.TestStep{
41+
Config: testAccCheckScalewayServerVolumeConfig,
42+
Check: resource.ComposeTestCheckFunc(
43+
testAccCheckScalewayServerExists("scaleway_server.base"),
44+
testAccCheckScalewayServerAttributes("scaleway_server.base"),
45+
resource.TestCheckResourceAttr(
46+
"scaleway_server.base", "type", "C1"),
47+
resource.TestCheckResourceAttr(
48+
"scaleway_server.base", "volume.#", "2"),
49+
resource.TestCheckResourceAttrSet(
50+
"scaleway_server.base", "volume.0.volume_id"),
51+
resource.TestCheckResourceAttr(
52+
"scaleway_server.base", "volume.0.type", "l_ssd"),
53+
resource.TestCheckResourceAttr(
54+
"scaleway_server.base", "volume.0.size_in_gb", "20"),
55+
resource.TestCheckResourceAttrSet(
56+
"scaleway_server.base", "volume.1.volume_id"),
57+
resource.TestCheckResourceAttr(
58+
"scaleway_server.base", "volume.1.type", "l_ssd"),
59+
resource.TestCheckResourceAttr(
60+
"scaleway_server.base", "volume.1.size_in_gb", "30"),
61+
),
62+
},
63+
},
64+
})
65+
}
66+
3467
func TestAccScalewayServer_SecurityGroup(t *testing.T) {
3568
resource.Test(t, resource.TestCase{
3669
PreCheck: func() { testAccPreCheck(t) },
@@ -161,6 +194,25 @@ resource "scaleway_server" "base" {
161194
tags = [ "terraform-test" ]
162195
}`, armImageIdentifier)
163196

197+
var testAccCheckScalewayServerVolumeConfig = fmt.Sprintf(`
198+
resource "scaleway_server" "base" {
199+
name = "test"
200+
# ubuntu 14.04
201+
image = "%s"
202+
type = "C1"
203+
tags = [ "terraform-test" ]
204+
205+
volume {
206+
size_in_gb = 20
207+
type = "l_ssd"
208+
}
209+
210+
volume {
211+
size_in_gb = 30
212+
type = "l_ssd"
213+
}
214+
}`, armImageIdentifier)
215+
164216
var testAccCheckScalewayServerConfig_SecurityGroup = fmt.Sprintf(`
165217
resource "scaleway_security_group" "blue" {
166218
name = "blue"

builtin/providers/scaleway/resource_scaleway_volume.go

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,14 @@ func resourceScalewayVolume() *schema.Resource {
2626
Required: true,
2727
},
2828
"size_in_gb": &schema.Schema{
29-
Type: schema.TypeInt,
30-
Required: true,
31-
ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
32-
value := v.(int)
33-
if value < 1 || value > 150 {
34-
errors = append(errors, fmt.Errorf("%q be more than 1 and less than 150", k))
35-
}
36-
return
37-
},
29+
Type: schema.TypeInt,
30+
Required: true,
31+
ValidateFunc: validateVolumeSize,
3832
},
3933
"type": &schema.Schema{
40-
Type: schema.TypeString,
41-
Required: true,
42-
ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) {
43-
value := v.(string)
44-
if value != "l_ssd" {
45-
errors = append(errors, fmt.Errorf("%q must be l_ssd", k))
46-
}
47-
return
48-
},
34+
Type: schema.TypeString,
35+
Required: true,
36+
ValidateFunc: validateVolumeType,
4937
},
5038
"server": &schema.Schema{
5139
Type: schema.TypeString,
@@ -88,8 +76,8 @@ func resourceScalewayVolumeRead(d *schema.ResourceData, m interface{}) error {
8876
return err
8977
}
9078
d.Set("name", volume.Name)
91-
if size, ok := volume.Size.(uint64); ok {
92-
d.Set("size_in_gb", size/gb)
79+
if size, ok := volume.Size.(float64); ok {
80+
d.Set("size_in_gb", uint64(size)/gb)
9381
}
9482
d.Set("type", volume.VolumeType)
9583
d.Set("server", "")

builtin/providers/scaleway/resource_scaleway_volume_attachment.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func resourceScalewayVolumeAttachmentCreate(d *schema.ResourceData, m interface{
6969

7070
// the API request requires most volume attributes to be unset to succeed
7171
for k, v := range volumes {
72-
v.Size = 0
72+
v.Size = nil
7373
v.CreationDate = ""
7474
v.Organization = ""
7575
v.ModificationDate = ""
@@ -174,7 +174,7 @@ func resourceScalewayVolumeAttachmentDelete(d *schema.ResourceData, m interface{
174174

175175
// the API request requires most volume attributes to be unset to succeed
176176
for k, v := range volumes {
177-
v.Size = 0
177+
v.Size = nil
178178
v.CreationDate = ""
179179
v.Organization = ""
180180
v.ModificationDate = ""

builtin/providers/scaleway/resource_scaleway_volume_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func testAccCheckScalewayVolumeAttributes(n string) resource.TestCheckFunc {
6060
if volume.Name != "test" {
6161
return fmt.Errorf("volume has wrong name: %q", volume.Name)
6262
}
63-
if volume.Size != 2000000000 {
63+
if volume.Size != 2e+09 {
6464
return fmt.Errorf("volume has wrong size: %d", volume.Size)
6565
}
6666
if volume.VolumeType != "l_ssd" {

website/source/docs/providers/scaleway/r/server.html.markdown

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ For additional details please refer to [API documentation](https://developer.sca
1717
resource "scaleway_server" "test" {
1818
name = "test"
1919
image = "5faef9cd-ea9b-4a63-9171-9e26bec03dbc"
20-
type = "C1"
20+
type = "VC1M"
21+
22+
volume {
23+
size_in_gb = 20
24+
type = "l_ssd"
25+
}
2126
}
2227
```
2328

@@ -36,6 +41,16 @@ The following arguments are supported:
3641

3742
Field `name`, `type`, `tags`, `dynamic_ip_required`, `security_group` are editable.
3843

44+
## Volume
45+
46+
You can attach additional volumes to your instance, which will share the lifetime
47+
of your `scaleway_server` resource.
48+
49+
The `volume` mapping supports the following:
50+
51+
* `type` - (Required) The type of volume. Can be `"l_ssd"`
52+
* `size_in_gb` - (Required) The size of the volume in gigabytes.
53+
3954
## Attributes Reference
4055

4156
The following attributes are exported:

0 commit comments

Comments
 (0)