Skip to content

Commit c9a75c8

Browse files
committed
feat(instance): delete and update filesystem
1 parent 6267b03 commit c9a75c8

File tree

3 files changed

+139
-17
lines changed

3 files changed

+139
-17
lines changed

internal/services/instance/server.go

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m
547547
filesystemID := fs["filesystem_id"]
548548
_, err := api.AttachServerFileSystem(&instanceSDK.AttachServerFileSystemRequest{
549549
Zone: zone,
550-
FilesystemID: filesystemID.(string),
550+
FilesystemID: regional.ExpandID(filesystemID.(string)).ID,
551551
ServerID: res.Server.ID,
552552
})
553553

@@ -681,7 +681,10 @@ func ResourceInstanceServerRead(ctx context.Context, d *schema.ResourceData, m i
681681
if len(server.Tags) > 0 {
682682
_ = d.Set("tags", server.Tags)
683683
}
684-
//_ = d.Set("filesystem_ids", server.filesystems) //TODO when attribut is generated uncomment
684+
685+
if server.Filesystems != nil {
686+
_ = d.Set("filesystems", flattenServerFileSystem(server.Zone, server.Filesystems))
687+
}
685688

686689
_ = d.Set("security_group_id", zonal.NewID(zone, server.SecurityGroup.ID).String())
687690
// EnableIPv6 is deprecated
@@ -1111,6 +1114,51 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m
11111114
}
11121115
}
11131116

1117+
////
1118+
// Update server filesystems
1119+
///
1120+
1121+
if d.HasChange("filesystems") {
1122+
if fs, ok := d.GetOk("filesystems"); ok {
1123+
for i := range fs.([]interface{}) {
1124+
fsKey := fmt.Sprintf("filesystems.%d.filesystem_id", i)
1125+
if d.HasChange(fsKey) {
1126+
old, new := d.GetChange(fsKey)
1127+
if !cmp.Equal(old, new) {
1128+
_, err := waitForServer(ctx, api.API, zone, id, d.Timeout(schema.TimeoutUpdate))
1129+
if err != nil {
1130+
return diag.FromErr(err)
1131+
}
1132+
1133+
if old != nil {
1134+
oldFileSystemID := types.ExpandStringPtr(old)
1135+
_, err = api.DetachServerFileSystem(&instanceSDK.DetachServerFileSystemRequest{
1136+
Zone: zone,
1137+
ServerID: server.ID,
1138+
FilesystemID: locality.ExpandID(*oldFileSystemID),
1139+
})
1140+
if err != nil {
1141+
return diag.FromErr(err)
1142+
}
1143+
}
1144+
1145+
if new != nil {
1146+
newFileSystemID := types.ExpandStringPtr(new)
1147+
_, err = api.AttachServerFileSystem(&instanceSDK.AttachServerFileSystemRequest{
1148+
Zone: zone,
1149+
ServerID: server.ID,
1150+
FilesystemID: locality.ExpandID(*newFileSystemID),
1151+
})
1152+
if err != nil {
1153+
return diag.FromErr(err)
1154+
}
1155+
}
1156+
}
1157+
}
1158+
}
1159+
}
1160+
}
1161+
11141162
////
11151163
// Update server private network
11161164
////
@@ -1242,6 +1290,23 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m
12421290
return diag.FromErr(err)
12431291
}
12441292

1293+
// Detach filesystem
1294+
if filesystems, ok := d.GetOk("filesystems"); ok {
1295+
for index := range filesystems.([]interface{}) {
1296+
filesystemKey := fmt.Sprintf("filesystem.%d.filesystem_id", index)
1297+
fs := d.Get(filesystemKey)
1298+
newFileSystemID := types.ExpandStringPtr(fs)
1299+
_, err = api.AttachServerFileSystem(&instanceSDK.AttachServerFileSystemRequest{
1300+
Zone: zone,
1301+
ServerID: id,
1302+
FilesystemID: locality.ExpandID(*newFileSystemID),
1303+
})
1304+
if err != nil {
1305+
return diag.FromErr(err)
1306+
}
1307+
}
1308+
}
1309+
12451310
// Delete private-nic if managed by instance_server resource
12461311
if raw, ok := d.GetOk("private_network"); ok {
12471312
ph, err := newPrivateNICHandler(api.API, id, zone)

internal/services/instance/server_test.go

Lines changed: 57 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,44 +2105,86 @@ func TestAccServer_AttachDetachFileSystem(t *testing.T) {
21052105
Steps: []resource.TestStep{
21062106
{
21072107
Config: `
2108-
resource scaleway_vpc_private_network pn {}
2108+
resource "scaleway_block_volume" "volume" {
2109+
iops = 15000
2110+
size_in_gb = 15
2111+
}
2112+
21092113
resource "scaleway_file_filesystem" "terraform_instance_filesystem"{
21102114
name="filesystem-instance-terraform-test"
21112115
size = 100000000000
21122116
}
21132117
2114-
data "scaleway_marketplace_image" "ubuntu" {
2115-
instance_type = "DEV1-S"
2116-
label = "ubuntu_focal"
2118+
resource "scaleway_instance_server" "base" {
2119+
type = "POP2-2C-8G"
2120+
state = "started"
2121+
tags = [ "terraform-test", "scaleway_instance_server", "state" ]
2122+
root_volume {
2123+
volume_type = "sbs_volume"
2124+
volume_id = scaleway_block_volume.volume.id
2125+
}
2126+
filesystems {
2127+
filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem.id
2128+
}
2129+
}`,
2130+
Check: resource.ComposeTestCheckFunc(
2131+
isServerPresent(tt, "scaleway_instance_server.base"),
2132+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "type", "POP2-2C-8G"),
2133+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.delete_on_termination", "true"),
2134+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "15"),
2135+
resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "root_volume.0.volume_id"),
2136+
resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "filesystems.0.filesystem_id"),
2137+
serverHasNewVolume(tt, "scaleway_instance_server.base"),
2138+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.0", "terraform-test"),
2139+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.1", "scaleway_instance_server"),
2140+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.2", "state"),
2141+
),
2142+
},
2143+
{
2144+
Config: `
2145+
resource "scaleway_block_volume" "volume" {
2146+
iops = 15000
2147+
size_in_gb = 15
21172148
}
2118-
2149+
2150+
resource "scaleway_file_filesystem" "terraform_instance_filesystem"{
2151+
name="filesystem-instance-terraform-test"
2152+
size = 100000000000
2153+
}
2154+
2155+
resource "scaleway_file_filesystem" "terraform_instance_filesystem_2"{
2156+
name="filesystem-instance-terraform-test-2"
2157+
size = 100000000000
2158+
}
2159+
21192160
resource "scaleway_instance_server" "base" {
2120-
image = "${data.scaleway_marketplace_image.ubuntu.id}"
2121-
type = "DEV1-S"
2161+
type = "POP2-2C-8G"
21222162
state = "started"
21232163
tags = [ "terraform-test", "scaleway_instance_server", "state" ]
21242164
root_volume {
2125-
size_in_gb = 100
2165+
volume_type = "sbs_volume"
2166+
volume_id = scaleway_block_volume.volume.id
21262167
}
21272168
filesystems {
21282169
filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem.id
21292170
}
2130-
private_network {
2131-
pn_id = scaleway_vpc_private_network.pn.id
2171+
2172+
filesystems {
2173+
filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem_2.id
21322174
}
21332175
}`,
21342176
Check: resource.ComposeTestCheckFunc(
21352177
isServerPresent(tt, "scaleway_instance_server.base"),
2136-
resource.TestCheckResourceAttr("scaleway_instance_server.base", "image", "ubuntu_focal"),
2137-
resource.TestCheckResourceAttr("scaleway_instance_server.base", "type", "DEV1-S"),
2178+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "type", "POP2-2C-8G"),
21382179
resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.delete_on_termination", "true"),
2139-
resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "10"),
2180+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "15"),
21402181
resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "root_volume.0.volume_id"),
2182+
resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "filesystems.0.filesystem_id"),
2183+
resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "filesystems.0.filesystem_id_2"),
21412184
serverHasNewVolume(tt, "scaleway_instance_server.base"),
2142-
resource.TestCheckResourceAttr("scaleway_instance_server.base", "enable_dynamic_ip", "false"),
21432185
resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.0", "terraform-test"),
21442186
resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.1", "scaleway_instance_server"),
2145-
resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.2", "minimal"),
2187+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.2", "state"),
21462188
),
21472189
},
21482190
},

internal/services/instance/types.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package instance
22

33
import (
4+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional"
45
"strconv"
56

67
"github.com/scaleway/scaleway-sdk-go/api/instance/v1"
@@ -101,6 +102,20 @@ func flattenServerPublicIPs(zone scw.Zone, ips []*instance.ServerIP) []interface
101102
return flattenedIPs
102103
}
103104

105+
func flattenServerFileSystem(zone scw.Zone, fs []*instance.ServerFilesystem) []interface{} {
106+
filesystems := make([]interface{}, len(fs))
107+
region, _ := zone.Region()
108+
109+
for i, f := range fs {
110+
filesystems[i] = map[string]interface{}{
111+
"filesystem_id": regional.NewIDString(region, f.FilesystemID),
112+
"status": f.State,
113+
}
114+
}
115+
116+
return filesystems
117+
}
118+
104119
func flattenServerIPIDs(ips []*instance.ServerIP) []interface{} {
105120
ipIDs := make([]interface{}, len(ips))
106121

0 commit comments

Comments
 (0)