From 874f583d6d7faf5a093301e346007fa47be54c92 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Fri, 6 Jun 2025 11:22:14 +0200 Subject: [PATCH 1/8] feat(instance): add support filesystem feat(file): add support v1beta1 Create, Read and Update function Delete Methode add tests fix date issue and register cassettes test: add validation for filesystem size granularity fix: convertion fix(instance): update schema filesystem test(instance): add test attach filesystem feat(instance): delete and update filesystem chore: master sdk-go go mod tidy update doc and tests --- docs/resources/instance_server.md | 34 +++++ go.mod | 2 +- go.sum | 1 + internal/services/file/filesystem_test.go | 25 +++ .../services/instance/helpers_instance.go | 3 +- internal/services/instance/server.go | 144 ++++++++++++++++++ internal/services/instance/server_test.go | 139 +++++++++++++++++ internal/services/instance/types.go | 16 ++ internal/services/instance/waiters.go | 15 ++ 9 files changed, 377 insertions(+), 2 deletions(-) diff --git a/docs/resources/instance_server.md b/docs/resources/instance_server.md index b07436d7b5..8f595b0560 100644 --- a/docs/resources/instance_server.md +++ b/docs/resources/instance_server.md @@ -45,6 +45,36 @@ resource "scaleway_instance_server" "web" { } ``` +### With filesystem + +```terraform + +resource "scaleway_block_volume" "volume" { + iops = 15000 + size_in_gb = 15 +} + +resource "scaleway_file_filesystem" "terraform_instance_filesystem"{ + name="filesystem-instance-terraform" + size = 100000000000 +} + +resource "scaleway_instance_server" "base" { + type = "POP2-HM-2C-16G" + state = "started" + tags = [ "terraform-test", "scaleway_instance_server", "state" ] + root_volume { + volume_type = "sbs_volume" + volume_id = scaleway_block_volume.volume.id + } + filesystems { + filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem.id + } +}` +``` + + + ### With a reserved IP ```terraform @@ -227,6 +257,9 @@ attached to the server. Updates to this field will trigger a stop/start of the s ~> **Important:** If this field contains local volumes, you have to first detach them, in one apply, and then delete the volume in another apply. +- `filesystem` - (Optional) List of filesystems attached to the server. + - `filesystem_id` - (Optional) The unique ID of the filesystem attached to the server. + - `enable_ipv6` - (Defaults to `false`) Determines if IPv6 is enabled for the server. Deprecated: Please use a scaleway_instance_ip with a `routed_ipv6` type. @@ -288,6 +321,7 @@ In addition to all arguments above, the following attributes are exported: - `placement_group_policy_respected` - (Deprecated) Always false, use [instance_placement_group ressource](instance_placement_group.md) to known when the placement group policy is respected. - `root_volume` - `volume_id` - The volume ID of the root volume of the server. +- `filesystem` - (Computed) The current status of the filesystem (e.g., attached, detached). - `private_ip` - The Scaleway internal IP address of the server (Deprecated use [ipam_ip datasource](../data-sources/ipam_ip.md#instance-private-network-ip) instead). - `public_ip` - The public IP address of the server (Deprecated use `public_ips` instead). - `public_ips` - The list of public IPs of the server. diff --git a/go.mod b/go.mod index 70ad934c46..b1ff42f683 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/nats-io/jwt/v2 v2.7.4 github.com/nats-io/nats.go v1.38.0 github.com/robfig/cron/v3 v3.0.1 - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250604134054-a06406d42247 + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250610132304-0ea56270b666 github.com/stretchr/testify v1.10.0 golang.org/x/crypto v0.38.0 gopkg.in/dnaeon/go-vcr.v3 v3.2.0 diff --git a/go.sum b/go.sum index 4439f5b0f6..6dee472ee7 100644 --- a/go.sum +++ b/go.sum @@ -449,6 +449,7 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250604134054-a06406d42247 h1:wlIvcSpGl3mGDpQmwrZHnYMIlB7Mwx3bhg151LG22Ws= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250604134054-a06406d42247/go.mod h1:qiGzapFyNPFwBBLJ+hTFykKSnU95n1zL64+o1ubmwf0= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250610132304-0ea56270b666/go.mod h1:zFWiHphneiey3s8HOtAEnGrRlWivNaxW5T6d5Xfco7g= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= diff --git a/internal/services/file/filesystem_test.go b/internal/services/file/filesystem_test.go index 06b2347997..fd9c3c1329 100644 --- a/internal/services/file/filesystem_test.go +++ b/internal/services/file/filesystem_test.go @@ -106,6 +106,31 @@ func TestAccFileSystem_InvalidSizeGranularityFails(t *testing.T) { }) } +func TestAccFileSystem_InvalidSizeGranularityFails(t *testing.T) { + tt := acctest.NewTestTools(t) + defer tt.Cleanup() + + fileSystemName := "TestAccFileSystem_Basic" + size := int64(25_000_000_000) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + ProviderFactories: tt.ProviderFactories, + CheckDestroy: filetestfuncs.CheckFileDestroy(tt), + Steps: []resource.TestStep{ + { + Config: fmt.Sprintf(` + resource "scaleway_file_filesystem" "fs" { + name = "%s" + size = %d + } + `, fileSystemName, size), + ExpectError: regexp.MustCompile("size does not respect constraint, size must be greater or equal to 100000000000"), + }, + }, + }) +} + func testAccCheckFileSystemExists(tt *acctest.TestTools, n string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] diff --git a/internal/services/instance/helpers_instance.go b/internal/services/instance/helpers_instance.go index e9d2ad9a2e..617dfa5c4d 100644 --- a/internal/services/instance/helpers_instance.go +++ b/internal/services/instance/helpers_instance.go @@ -33,7 +33,7 @@ const ( // InstanceServerStateStandby transient state of the instance event waiting third action or rescue mode InstanceServerStateStandby = "standby" - DefaultInstanceServerWaitTimeout = 10 * time.Minute + DefaultInstanceServerWaitTimeout = 15 * time.Minute defaultInstancePrivateNICWaitTimeout = 10 * time.Minute defaultInstanceVolumeDeleteTimeout = 10 * time.Minute defaultInstanceSecurityGroupTimeout = 1 * time.Minute @@ -41,6 +41,7 @@ const ( defaultInstancePlacementGroupTimeout = 1 * time.Minute defaultInstanceIPTimeout = 1 * time.Minute defaultInstanceIPReverseDNSTimeout = 10 * time.Minute + defaultFileSystemWaitTimeout = 15 * time.Minute defaultInstanceSnapshotWaitTimeout = 1 * time.Hour diff --git a/internal/services/instance/server.go b/internal/services/instance/server.go index ebba13d059..36e71478d7 100644 --- a/internal/services/instance/server.go +++ b/internal/services/instance/server.go @@ -190,6 +190,26 @@ func ResourceServer() *schema.Resource { Optional: true, Description: "The additional volumes attached to the server", }, + "filesystems": { + Type: schema.TypeList, + Optional: true, + Computed: true, + Description: "Filesystems attach to the server", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "filesystem_id": { + Type: schema.TypeString, + Optional: true, + Description: "The filesystem ID attached to the server", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "The state of the filesystem", + }, + }, + }, + }, "enable_ipv6": { Type: schema.TypeBool, Optional: true, @@ -516,6 +536,26 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m } } + /// + // Attach Filesystem + /// + _, err = waitForServer(ctx, api.API, zone, res.Server.ID, d.Timeout(schema.TimeoutCreate)) + if filesystems, ok := d.GetOk("filesystems"); ok { + for _, filesystem := range filesystems.([]interface{}) { + fs := filesystem.(map[string]interface{}) + filesystemID := fs["filesystem_id"] + _, err := api.AttachServerFileSystem(&instanceSDK.AttachServerFileSystemRequest{ + Zone: zone, + FilesystemID: regional.ExpandID(filesystemID.(string)).ID, + ServerID: res.Server.ID, + }) + + if err != nil { + return nil + } + } + } + //// // Set user data //// @@ -641,6 +681,10 @@ func ResourceInstanceServerRead(ctx context.Context, d *schema.ResourceData, m a _ = d.Set("tags", server.Tags) } + if server.Filesystems != nil { + _ = d.Set("filesystems", flattenServerFileSystem(server.Zone, server.Filesystems)) + } + _ = d.Set("security_group_id", zonal.NewID(zone, server.SecurityGroup.ID).String()) // EnableIPv6 is deprecated _ = d.Set("enable_ipv6", server.EnableIPv6) //nolint:staticcheck @@ -1069,6 +1113,38 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m } } + //// + // Update server filesystems + /// + + if d.HasChange("filesystems") { + oldRaw, newRaw := d.GetChange("filesystems") + + oldList := oldRaw.([]interface{}) + newList := newRaw.([]interface{}) + + oldIDs := make(map[string]struct{}) + newIDs := make(map[string]struct{}) + + collectFilesystemIDs(oldList, oldIDs) + collectFilesystemIDs(newList, newIDs) + + diagnostics, done := detachOlDFileSystem(oldIDs, newIDs, api, zone, server) + if done { + return diagnostics + } + + _, err := waitForFilesystems(ctx, api.API, zone, id, *scw.TimeDurationPtr(defaultFileSystemWaitTimeout)) + if err != nil { + return diag.FromErr(err) + } + + d2, done2 := attachNewFileSystem(newIDs, oldIDs, api, zone, server) + if done2 { + return d2 + } + } + //// // Update server private network //// @@ -1163,6 +1239,48 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m return append(warnings, ResourceInstanceServerRead(ctx, d, m)...) } + +func attachNewFileSystem(newIDs map[string]struct{}, oldIDs map[string]struct{}, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, server *instanceSDK.Server) (diag.Diagnostics, bool) { + for id := range newIDs { + if _, alreadyAttached := oldIDs[id]; !alreadyAttached { + _, err := api.AttachServerFileSystem(&instanceSDK.AttachServerFileSystemRequest{ + Zone: zone, + ServerID: server.ID, + FilesystemID: locality.ExpandID(id), + }) + if err != nil { + return diag.FromErr(fmt.Errorf("error attaching filesystem %s: %w", id, err)), true + } + } + } + return nil, false +} + +func detachOlDFileSystem(oldIDs map[string]struct{}, newIDs map[string]struct{}, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, server *instanceSDK.Server) (diag.Diagnostics, bool) { + for id := range oldIDs { + if _, stillPresent := newIDs[id]; !stillPresent { + _, err := api.DetachServerFileSystem(&instanceSDK.DetachServerFileSystemRequest{ + Zone: zone, + ServerID: server.ID, + FilesystemID: locality.ExpandID(id), + }) + if err != nil { + return diag.FromErr(fmt.Errorf("error detaching filesystem %s: %w", id, err)), true + } + } + } + return nil, false +} + +func collectFilesystemIDs(fsList []interface{}, target map[string]struct{}) { + for _, fs := range fsList { + if fsMap, ok := fs.(map[string]interface{}); ok { + id := fsMap["filesystem_id"].(string) + target[id] = struct{}{} + } + } +} + func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics { api, zone, id, err := instancehelpers.InstanceAndBlockAPIWithZoneAndID(m, d.Id()) if err != nil { @@ -1200,6 +1318,32 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m return diag.FromErr(err) } + // Detach filesystem + if filesystems, ok := d.GetOk("filesystems"); ok { + fsList := filesystems.([]interface{}) + for i, fsRaw := range fsList { + fsMap := fsRaw.(map[string]interface{}) + fsIDRaw, ok := fsMap["filesystem_id"] + if !ok || fsIDRaw == nil { + return diag.Errorf("filesystem_id is missing or nil for filesystem at index %d", i) + } + fsID := fsIDRaw.(string) + newFileSystemID := types.ExpandStringPtr(fsID) + if newFileSystemID == nil { + return diag.Errorf("failed to expand filesystem_id pointer at index %d", i) + } + + _, err = api.DetachServerFileSystem(&instanceSDK.DetachServerFileSystemRequest{ + Zone: zone, + ServerID: id, + FilesystemID: locality.ExpandID(*newFileSystemID), + }) + if err != nil { + return diag.FromErr(err) + } + } + } + // Delete private-nic if managed by instance_server resource if raw, ok := d.GetOk("private_network"); ok { ph, err := newPrivateNICHandler(api.API, id, zone) diff --git a/internal/services/instance/server_test.go b/internal/services/instance/server_test.go index 7eb2df1cc1..d51a3884ce 100644 --- a/internal/services/instance/server_test.go +++ b/internal/services/instance/server_test.go @@ -2094,3 +2094,142 @@ func TestAccServer_PrivateNetworkMissingPNIC(t *testing.T) { }, }) } + +func TestAccServer_AttachDetachFileSystem(t *testing.T) { + tt := acctest.NewTestTools(t) + defer tt.Cleanup() + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(t) }, + ProviderFactories: tt.ProviderFactories, + CheckDestroy: instancechecks.IsServerDestroyed(tt), + Steps: []resource.TestStep{ + { + Config: ` + resource "scaleway_block_volume" "volume" { + iops = 15000 + size_in_gb = 15 + } + + resource "scaleway_file_filesystem" "terraform_instance_filesystem"{ + name="filesystem-instance-terraform-test" + size = 100000000000 + } + + resource "scaleway_instance_server" "base" { + type = "POP2-HM-2C-16G" + state = "started" + tags = [ "terraform-test", "scaleway_instance_server", "state" ] + root_volume { + volume_type = "sbs_volume" + volume_id = scaleway_block_volume.volume.id + } + filesystems { + filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem.id + } + }`, + Check: resource.ComposeTestCheckFunc( + isServerPresent(tt, "scaleway_instance_server.base"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "type", "POP2-HM-2C-16G"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.delete_on_termination", "true"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "15"), + resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "root_volume.0.volume_id"), + resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "filesystems.0.filesystem_id"), + serverHasNewVolume(tt, "scaleway_instance_server.base"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.0", "terraform-test"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.1", "scaleway_instance_server"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.2", "state"), + ), + }, + { + Config: ` + resource "scaleway_block_volume" "volume" { + iops = 15000 + size_in_gb = 15 + } + + resource "scaleway_file_filesystem" "terraform_instance_filesystem"{ + name="filesystem-instance-terraform-test" + size = 100000000000 + } + + resource "scaleway_file_filesystem" "terraform_instance_filesystem_2"{ + name="filesystem-instance-terraform-test-2" + size = 100000000000 + } + + resource "scaleway_instance_server" "base" { + type = "POP2-HM-2C-16G" + state = "started" + tags = [ "terraform-test", "scaleway_instance_server", "state" ] + root_volume { + volume_type = "sbs_volume" + volume_id = scaleway_block_volume.volume.id + } + + filesystems { + filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem_2.id + } + }`, + Check: resource.ComposeTestCheckFunc( + isServerPresent(tt, "scaleway_instance_server.base"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "type", "POP2-HM-2C-16G"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.delete_on_termination", "true"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "15"), + resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "root_volume.0.volume_id"), + resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "filesystems.0.filesystem_id"), + resource.TestCheckNoResourceAttr("scaleway_instance_server.base", "filesystems.1.filesystem_id"), + serverHasNewVolume(tt, "scaleway_instance_server.base"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.0", "terraform-test"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.1", "scaleway_instance_server"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.2", "state"), + ), + }, + { + Config: ` + resource "scaleway_block_volume" "volume" { + iops = 15000 + size_in_gb = 15 + } + + resource "scaleway_file_filesystem" "terraform_instance_filesystem"{ + name="filesystem-instance-terraform-test" + size = 100000000000 + } + + resource "scaleway_file_filesystem" "terraform_instance_filesystem_2"{ + name="filesystem-instance-terraform-test-2" + size = 100000000000 + } + + resource "scaleway_instance_server" "base" { + type = "POP2-HM-2C-16G" + state = "started" + tags = [ "terraform-test", "scaleway_instance_server", "state" ] + root_volume { + volume_type = "sbs_volume" + volume_id = scaleway_block_volume.volume.id + } + filesystems { + filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem_2.id + } + filesystems { + filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem.id + } + }`, + Check: resource.ComposeTestCheckFunc( + isServerPresent(tt, "scaleway_instance_server.base"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "type", "POP2-HM-2C-16G"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.delete_on_termination", "true"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "15"), + resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "root_volume.0.volume_id"), + resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "filesystems.0.filesystem_id"), + resource.TestCheckResourceAttrSet("scaleway_instance_server.base", "filesystems.1.filesystem_id"), + serverHasNewVolume(tt, "scaleway_instance_server.base"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.0", "terraform-test"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.1", "scaleway_instance_server"), + resource.TestCheckResourceAttr("scaleway_instance_server.base", "tags.2", "state"), + ), + }, + }, + }) +} diff --git a/internal/services/instance/types.go b/internal/services/instance/types.go index 7afb3f6d67..4671488ff3 100644 --- a/internal/services/instance/types.go +++ b/internal/services/instance/types.go @@ -1,6 +1,7 @@ package instance import ( + "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional" "strconv" "github.com/scaleway/scaleway-sdk-go/api/instance/v1" @@ -101,6 +102,21 @@ func flattenServerPublicIPs(zone scw.Zone, ips []*instance.ServerIP) []any { return flattenedIPs } + +func flattenServerFileSystem(zone scw.Zone, fs []*instance.ServerFilesystem) []interface{} { + filesystems := make([]interface{}, len(fs)) + region, _ := zone.Region() + + for i, f := range fs { + filesystems[i] = map[string]interface{}{ + "filesystem_id": regional.NewIDString(region, f.FilesystemID), + "status": f.State, + } + } + + return filesystems +} + func flattenServerIPIDs(ips []*instance.ServerIP) []any { ipIDs := make([]any, len(ips)) diff --git a/internal/services/instance/waiters.go b/internal/services/instance/waiters.go index bfafd398f5..0272db2775 100644 --- a/internal/services/instance/waiters.go +++ b/internal/services/instance/waiters.go @@ -91,3 +91,18 @@ func waitForImage(ctx context.Context, api *instance.API, zone scw.Zone, id stri return image, err } + +func waitForFilesystems(ctx context.Context, api *instance.API, zone scw.Zone, id string, timeout time.Duration) (*instance.Server, error) { + retryInterval := instancehelpers.DefaultInstanceRetryInterval + if transport.DefaultWaitRetryInterval != nil { + retryInterval = *transport.DefaultWaitRetryInterval + } + server, err := api.WaitForServerFileSystem(&instance.WaitForServerFileSystemRequest{ + ServerID: id, + Zone: zone, + Timeout: scw.TimeDurationPtr(timeout), + RetryInterval: &retryInterval, + }, scw.WithContext(ctx)) + + return server, err +} From a774dcf4cb58b437a9442f3f6f6a765915710411 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Mon, 16 Jun 2025 10:18:40 +0200 Subject: [PATCH 2/8] fix fmt --- docs/resources/instance_server.md | 42 +++++++++---------- go.sum | 3 +- .../services/instance/helpers_instance.go | 1 - internal/services/instance/server.go | 3 +- internal/services/instance/types.go | 1 - 5 files changed, 22 insertions(+), 28 deletions(-) diff --git a/docs/resources/instance_server.md b/docs/resources/instance_server.md index 8f595b0560..56b5c34692 100644 --- a/docs/resources/instance_server.md +++ b/docs/resources/instance_server.md @@ -48,33 +48,30 @@ resource "scaleway_instance_server" "web" { ### With filesystem ```terraform - -resource "scaleway_block_volume" "volume" { - iops = 15000 - size_in_gb = 15 +resource scaleway_block_volume volume { + iops = 15000 + size_in_gb = 15 } -resource "scaleway_file_filesystem" "terraform_instance_filesystem"{ - name="filesystem-instance-terraform" - size = 100000000000 +resource scaleway_file_filesystem terraform_instance_filesystem { + name = "filesystem-instance-terraform" + size = 100000000000 } -resource "scaleway_instance_server" "base" { - type = "POP2-HM-2C-16G" - state = "started" - tags = [ "terraform-test", "scaleway_instance_server", "state" ] - root_volume { - volume_type = "sbs_volume" - volume_id = scaleway_block_volume.volume.id - } - filesystems { - filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem.id - } -}` +resource scaleway_instance_server base { + type = "POP2-HM-2C-16G" + state = "started" + tags = ["terraform-test", "scaleway_instance_server", "state"] + root_volume { + volume_type = "sbs_volume" + volume_id = scaleway_block_volume.volume.id + } + filesystems { + filesystem_id = scaleway_file_filesystem.terraform_instance_filesystem.id + } +} ``` - - ### With a reserved IP ```terraform @@ -321,7 +318,8 @@ In addition to all arguments above, the following attributes are exported: - `placement_group_policy_respected` - (Deprecated) Always false, use [instance_placement_group ressource](instance_placement_group.md) to known when the placement group policy is respected. - `root_volume` - `volume_id` - The volume ID of the root volume of the server. -- `filesystem` - (Computed) The current status of the filesystem (e.g., attached, detached). +- `filesystem` + - `state` - The current status of the filesystem (e.g., attached, detached). - `private_ip` - The Scaleway internal IP address of the server (Deprecated use [ipam_ip datasource](../data-sources/ipam_ip.md#instance-private-network-ip) instead). - `public_ip` - The public IP address of the server (Deprecated use `public_ips` instead). - `public_ips` - The list of public IPs of the server. diff --git a/go.sum b/go.sum index 6dee472ee7..0f448dc4a9 100644 --- a/go.sum +++ b/go.sum @@ -447,8 +447,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250604134054-a06406d42247 h1:wlIvcSpGl3mGDpQmwrZHnYMIlB7Mwx3bhg151LG22Ws= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250604134054-a06406d42247/go.mod h1:qiGzapFyNPFwBBLJ+hTFykKSnU95n1zL64+o1ubmwf0= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250610132304-0ea56270b666 h1:NYaPksM7wPC69Fe9VCUoYY8GYB1hplR6s5hO2PA9rSQ= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250610132304-0ea56270b666/go.mod h1:zFWiHphneiey3s8HOtAEnGrRlWivNaxW5T6d5Xfco7g= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= diff --git a/internal/services/instance/helpers_instance.go b/internal/services/instance/helpers_instance.go index 617dfa5c4d..3843350c15 100644 --- a/internal/services/instance/helpers_instance.go +++ b/internal/services/instance/helpers_instance.go @@ -41,7 +41,6 @@ const ( defaultInstancePlacementGroupTimeout = 1 * time.Minute defaultInstanceIPTimeout = 1 * time.Minute defaultInstanceIPReverseDNSTimeout = 10 * time.Minute - defaultFileSystemWaitTimeout = 15 * time.Minute defaultInstanceSnapshotWaitTimeout = 1 * time.Hour diff --git a/internal/services/instance/server.go b/internal/services/instance/server.go index 36e71478d7..762aa1de2f 100644 --- a/internal/services/instance/server.go +++ b/internal/services/instance/server.go @@ -1134,7 +1134,7 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m return diagnostics } - _, err := waitForFilesystems(ctx, api.API, zone, id, *scw.TimeDurationPtr(defaultFileSystemWaitTimeout)) + _, err := waitForFilesystems(ctx, api.API, zone, id, *scw.TimeDurationPtr(DefaultInstanceServerWaitTimeout)) if err != nil { return diag.FromErr(err) } @@ -1239,7 +1239,6 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m return append(warnings, ResourceInstanceServerRead(ctx, d, m)...) } - func attachNewFileSystem(newIDs map[string]struct{}, oldIDs map[string]struct{}, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, server *instanceSDK.Server) (diag.Diagnostics, bool) { for id := range newIDs { if _, alreadyAttached := oldIDs[id]; !alreadyAttached { diff --git a/internal/services/instance/types.go b/internal/services/instance/types.go index 4671488ff3..24b254e4c3 100644 --- a/internal/services/instance/types.go +++ b/internal/services/instance/types.go @@ -102,7 +102,6 @@ func flattenServerPublicIPs(zone scw.Zone, ips []*instance.ServerIP) []any { return flattenedIPs } - func flattenServerFileSystem(zone scw.Zone, fs []*instance.ServerFilesystem) []interface{} { filesystems := make([]interface{}, len(fs)) region, _ := zone.Region() From d38c38c881ca3d0aed0c42dfc3a16ff1a5cb61b7 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Mon, 16 Jun 2025 10:28:34 +0200 Subject: [PATCH 3/8] update go.mod --- docs/resources/instance_server.md | 6 +- go.mod | 2 +- go.sum | 4 +- internal/services/file/filesystem_test.go | 25 -------- .../services/instance/helpers_instance.go | 44 +++++++++++++ internal/services/instance/server.go | 62 ++++--------------- internal/services/instance/types.go | 8 +-- internal/services/instance/waiters.go | 1 + 8 files changed, 67 insertions(+), 85 deletions(-) diff --git a/docs/resources/instance_server.md b/docs/resources/instance_server.md index 56b5c34692..910dfaa17f 100644 --- a/docs/resources/instance_server.md +++ b/docs/resources/instance_server.md @@ -255,7 +255,7 @@ attached to the server. Updates to this field will trigger a stop/start of the s ~> **Important:** If this field contains local volumes, you have to first detach them, in one apply, and then delete the volume in another apply. - `filesystem` - (Optional) List of filesystems attached to the server. - - `filesystem_id` - (Optional) The unique ID of the filesystem attached to the server. + - `filesystem_id` - (Optional) The unique ID of the filesystem attached to the server. - `enable_ipv6` - (Defaults to `false`) Determines if IPv6 is enabled for the server. Deprecated: Please use a scaleway_instance_ip with a `routed_ipv6` type. @@ -318,8 +318,8 @@ In addition to all arguments above, the following attributes are exported: - `placement_group_policy_respected` - (Deprecated) Always false, use [instance_placement_group ressource](instance_placement_group.md) to known when the placement group policy is respected. - `root_volume` - `volume_id` - The volume ID of the root volume of the server. -- `filesystem` - - `state` - The current status of the filesystem (e.g., attached, detached). +- `filesystem` + - `state` - The current status of the filesystem (e.g., attached, detached). - `private_ip` - The Scaleway internal IP address of the server (Deprecated use [ipam_ip datasource](../data-sources/ipam_ip.md#instance-private-network-ip) instead). - `public_ip` - The public IP address of the server (Deprecated use `public_ips` instead). - `public_ips` - The list of public IPs of the server. diff --git a/go.mod b/go.mod index b1ff42f683..134cd0c039 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/nats-io/jwt/v2 v2.7.4 github.com/nats-io/nats.go v1.38.0 github.com/robfig/cron/v3 v3.0.1 - github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250610132304-0ea56270b666 + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250613151004-c065a4eb7430 github.com/stretchr/testify v1.10.0 golang.org/x/crypto v0.38.0 gopkg.in/dnaeon/go-vcr.v3 v3.2.0 diff --git a/go.sum b/go.sum index 0f448dc4a9..8298ec15c0 100644 --- a/go.sum +++ b/go.sum @@ -447,8 +447,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250610132304-0ea56270b666 h1:NYaPksM7wPC69Fe9VCUoYY8GYB1hplR6s5hO2PA9rSQ= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250610132304-0ea56270b666/go.mod h1:zFWiHphneiey3s8HOtAEnGrRlWivNaxW5T6d5Xfco7g= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250613151004-c065a4eb7430 h1:npqerdt+HbDkv1+43FdhXNKnzKqkxfwgCCZDHgZRKNE= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33.0.20250613151004-c065a4eb7430/go.mod h1:zFWiHphneiey3s8HOtAEnGrRlWivNaxW5T6d5Xfco7g= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= diff --git a/internal/services/file/filesystem_test.go b/internal/services/file/filesystem_test.go index fd9c3c1329..06b2347997 100644 --- a/internal/services/file/filesystem_test.go +++ b/internal/services/file/filesystem_test.go @@ -106,31 +106,6 @@ func TestAccFileSystem_InvalidSizeGranularityFails(t *testing.T) { }) } -func TestAccFileSystem_InvalidSizeGranularityFails(t *testing.T) { - tt := acctest.NewTestTools(t) - defer tt.Cleanup() - - fileSystemName := "TestAccFileSystem_Basic" - size := int64(25_000_000_000) - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { acctest.PreCheck(t) }, - ProviderFactories: tt.ProviderFactories, - CheckDestroy: filetestfuncs.CheckFileDestroy(tt), - Steps: []resource.TestStep{ - { - Config: fmt.Sprintf(` - resource "scaleway_file_filesystem" "fs" { - name = "%s" - size = %d - } - `, fileSystemName, size), - ExpectError: regexp.MustCompile("size does not respect constraint, size must be greater or equal to 100000000000"), - }, - }, - }) -} - func testAccCheckFileSystemExists(tt *acctest.TestTools, n string) resource.TestCheckFunc { return func(s *terraform.State) error { rs, ok := s.RootModule().Resources[n] diff --git a/internal/services/instance/helpers_instance.go b/internal/services/instance/helpers_instance.go index 3843350c15..5a0957a4af 100644 --- a/internal/services/instance/helpers_instance.go +++ b/internal/services/instance/helpers_instance.go @@ -10,6 +10,7 @@ import ( "github.com/dustin/go-humanize" "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" blockSDK "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1" "github.com/scaleway/scaleway-sdk-go/api/instance/v1" @@ -552,3 +553,46 @@ func getServerProjectID(ctx context.Context, api *instance.API, zone scw.Zone, s return server.Server.Project, nil } + +func attachNewFileSystem(newIDs map[string]struct{}, oldIDs map[string]struct{}, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, server *instance.Server) (diag.Diagnostics, bool) { + for id := range newIDs { + if _, alreadyAttached := oldIDs[id]; !alreadyAttached { + _, err := api.AttachServerFileSystem(&instance.AttachServerFileSystemRequest{ + Zone: zone, + ServerID: server.ID, + FilesystemID: locality.ExpandID(id), + }) + if err != nil { + return diag.FromErr(fmt.Errorf("error attaching filesystem %s: %w", id, err)), true + } + } + } + + return nil, false +} + +func detachOldFileSystem(oldIDs map[string]struct{}, newIDs map[string]struct{}, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, server *instance.Server) (diag.Diagnostics, bool) { + for id := range oldIDs { + if _, stillPresent := newIDs[id]; !stillPresent { + _, err := api.DetachServerFileSystem(&instance.DetachServerFileSystemRequest{ + Zone: zone, + ServerID: server.ID, + FilesystemID: locality.ExpandID(id), + }) + if err != nil { + return diag.FromErr(fmt.Errorf("error detaching filesystem %s: %w", id, err)), true + } + } + } + + return nil, false +} + +func collectFilesystemIDs(fsList []any, target map[string]struct{}) { + for _, fs := range fsList { + if fsMap, ok := fs.(map[string]any); ok { + id := fsMap["filesystem_id"].(string) + target[id] = struct{}{} + } + } +} diff --git a/internal/services/instance/server.go b/internal/services/instance/server.go index 762aa1de2f..31e2c48c1d 100644 --- a/internal/services/instance/server.go +++ b/internal/services/instance/server.go @@ -539,17 +539,17 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m /// // Attach Filesystem /// - _, err = waitForServer(ctx, api.API, zone, res.Server.ID, d.Timeout(schema.TimeoutCreate)) + if filesystems, ok := d.GetOk("filesystems"); ok { - for _, filesystem := range filesystems.([]interface{}) { - fs := filesystem.(map[string]interface{}) + for _, filesystem := range filesystems.([]any) { + fs := filesystem.(map[string]any) filesystemID := fs["filesystem_id"] + _, err := api.AttachServerFileSystem(&instanceSDK.AttachServerFileSystemRequest{ Zone: zone, FilesystemID: regional.ExpandID(filesystemID.(string)).ID, ServerID: res.Server.ID, }) - if err != nil { return nil } @@ -1120,8 +1120,8 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m if d.HasChange("filesystems") { oldRaw, newRaw := d.GetChange("filesystems") - oldList := oldRaw.([]interface{}) - newList := newRaw.([]interface{}) + oldList := oldRaw.([]any) + newList := newRaw.([]any) oldIDs := make(map[string]struct{}) newIDs := make(map[string]struct{}) @@ -1129,7 +1129,7 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m collectFilesystemIDs(oldList, oldIDs) collectFilesystemIDs(newList, newIDs) - diagnostics, done := detachOlDFileSystem(oldIDs, newIDs, api, zone, server) + diagnostics, done := detachOldFileSystem(oldIDs, newIDs, api, zone, server) if done { return diagnostics } @@ -1239,47 +1239,6 @@ func ResourceInstanceServerUpdate(ctx context.Context, d *schema.ResourceData, m return append(warnings, ResourceInstanceServerRead(ctx, d, m)...) } -func attachNewFileSystem(newIDs map[string]struct{}, oldIDs map[string]struct{}, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, server *instanceSDK.Server) (diag.Diagnostics, bool) { - for id := range newIDs { - if _, alreadyAttached := oldIDs[id]; !alreadyAttached { - _, err := api.AttachServerFileSystem(&instanceSDK.AttachServerFileSystemRequest{ - Zone: zone, - ServerID: server.ID, - FilesystemID: locality.ExpandID(id), - }) - if err != nil { - return diag.FromErr(fmt.Errorf("error attaching filesystem %s: %w", id, err)), true - } - } - } - return nil, false -} - -func detachOlDFileSystem(oldIDs map[string]struct{}, newIDs map[string]struct{}, api *instancehelpers.BlockAndInstanceAPI, zone scw.Zone, server *instanceSDK.Server) (diag.Diagnostics, bool) { - for id := range oldIDs { - if _, stillPresent := newIDs[id]; !stillPresent { - _, err := api.DetachServerFileSystem(&instanceSDK.DetachServerFileSystemRequest{ - Zone: zone, - ServerID: server.ID, - FilesystemID: locality.ExpandID(id), - }) - if err != nil { - return diag.FromErr(fmt.Errorf("error detaching filesystem %s: %w", id, err)), true - } - } - } - return nil, false -} - -func collectFilesystemIDs(fsList []interface{}, target map[string]struct{}) { - for _, fs := range fsList { - if fsMap, ok := fs.(map[string]interface{}); ok { - id := fsMap["filesystem_id"].(string) - target[id] = struct{}{} - } - } -} - func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics { api, zone, id, err := instancehelpers.InstanceAndBlockAPIWithZoneAndID(m, d.Id()) if err != nil { @@ -1319,14 +1278,17 @@ func ResourceInstanceServerDelete(ctx context.Context, d *schema.ResourceData, m // Detach filesystem if filesystems, ok := d.GetOk("filesystems"); ok { - fsList := filesystems.([]interface{}) + fsList := filesystems.([]any) for i, fsRaw := range fsList { - fsMap := fsRaw.(map[string]interface{}) + fsMap := fsRaw.(map[string]any) + fsIDRaw, ok := fsMap["filesystem_id"] if !ok || fsIDRaw == nil { return diag.Errorf("filesystem_id is missing or nil for filesystem at index %d", i) } + fsID := fsIDRaw.(string) + newFileSystemID := types.ExpandStringPtr(fsID) if newFileSystemID == nil { return diag.Errorf("failed to expand filesystem_id pointer at index %d", i) diff --git a/internal/services/instance/types.go b/internal/services/instance/types.go index 24b254e4c3..2935b464ca 100644 --- a/internal/services/instance/types.go +++ b/internal/services/instance/types.go @@ -1,11 +1,11 @@ package instance import ( - "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional" "strconv" "github.com/scaleway/scaleway-sdk-go/api/instance/v1" "github.com/scaleway/scaleway-sdk-go/scw" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional" "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/zonal" ) @@ -102,12 +102,12 @@ func flattenServerPublicIPs(zone scw.Zone, ips []*instance.ServerIP) []any { return flattenedIPs } -func flattenServerFileSystem(zone scw.Zone, fs []*instance.ServerFilesystem) []interface{} { - filesystems := make([]interface{}, len(fs)) +func flattenServerFileSystem(zone scw.Zone, fs []*instance.ServerFilesystem) []any { + filesystems := make([]any, len(fs)) region, _ := zone.Region() for i, f := range fs { - filesystems[i] = map[string]interface{}{ + filesystems[i] = map[string]any{ "filesystem_id": regional.NewIDString(region, f.FilesystemID), "status": f.State, } diff --git a/internal/services/instance/waiters.go b/internal/services/instance/waiters.go index 0272db2775..6d3b43658c 100644 --- a/internal/services/instance/waiters.go +++ b/internal/services/instance/waiters.go @@ -97,6 +97,7 @@ func waitForFilesystems(ctx context.Context, api *instance.API, zone scw.Zone, i if transport.DefaultWaitRetryInterval != nil { retryInterval = *transport.DefaultWaitRetryInterval } + server, err := api.WaitForServerFileSystem(&instance.WaitForServerFileSystemRequest{ ServerID: id, Zone: zone, From 28052de923891329e46023200ed0da5754bf14dd Mon Sep 17 00:00:00 2001 From: Laure-di Date: Mon, 16 Jun 2025 13:30:01 +0200 Subject: [PATCH 4/8] fix(file): rename attribut size to size_in_gb --- docs/resources/file_filesystem.md | 4 ++-- docs/resources/instance_server.md | 2 +- internal/services/file/filesystem.go | 12 +++++----- internal/services/file/filesystem_test.go | 28 +++++++++++------------ 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/resources/file_filesystem.md b/docs/resources/file_filesystem.md index 2da3bca5f1..b4aecf305e 100644 --- a/docs/resources/file_filesystem.md +++ b/docs/resources/file_filesystem.md @@ -16,14 +16,14 @@ This resource allows you to define and manage the size, tags, and region of a fi ```terraform resource scaleway_file_filesystem file { name = "my-nfs-filesystem" - size = 100000000000 # 100 GB + size_in_gb = 100000000000 # 100 GB } ``` ## Argument Reference - `name` - (Optional) The name of the filesystem. If not provided, a random name will be generated. -- `size` - (Required) The size of the filesystem in bytes, with a granularity of 100 GB (10¹¹ bytes). +- `size_in_gb` - (Required) The size of the filesystem in bytes, with a granularity of 100 GB (10¹¹ bytes). - Minimum: 100 GB (100000000000 bytes) - Maximum: 10 TB (10000000000000 bytes) - `tags` - (Optional) A list of tags associated with the filesystem. diff --git a/docs/resources/instance_server.md b/docs/resources/instance_server.md index 910dfaa17f..9b9c2b1df9 100644 --- a/docs/resources/instance_server.md +++ b/docs/resources/instance_server.md @@ -55,7 +55,7 @@ resource scaleway_block_volume volume { resource scaleway_file_filesystem terraform_instance_filesystem { name = "filesystem-instance-terraform" - size = 100000000000 + size_in_gb = 100000000000 } resource scaleway_instance_server base { diff --git a/internal/services/file/filesystem.go b/internal/services/file/filesystem.go index 3e577e741e..1eb3231605 100644 --- a/internal/services/file/filesystem.go +++ b/internal/services/file/filesystem.go @@ -37,10 +37,10 @@ func ResourceFileSystem() *schema.Resource { Optional: true, Description: "The name of the filesystem", }, - "size": { + "size_in_gb": { Type: schema.TypeInt, Required: true, - Description: "The Filesystem size in bytes, with a granularity of 100 GB (10^11 bytes). Must be compliant with the minimum (100 GB) and maximum (10 TB) allowed size.", + Description: "The Filesystem size_in_gb in bytes, with a granularity of 100 GB (10^11 bytes). Must be compliant with the minimum (100 GB) and maximum (10 TB) allowed size_in_gb.", }, "tags": { Type: schema.TypeList, @@ -87,7 +87,7 @@ func ResourceFileSystemCreate(ctx context.Context, d *schema.ResourceData, m any Region: region, Name: types.ExpandOrGenerateString(d.Get("name").(string), "file"), ProjectID: d.Get("project_id").(string), - Size: *types.ExpandUint64Ptr(d.Get("size")), + Size: *types.ExpandUint64Ptr(d.Get("size_in_gb")), Tags: types.ExpandStrings(d.Get("tags")), } @@ -128,7 +128,7 @@ func ResourceFileSystemRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("region", fileSystem.Region) _ = d.Set("organization_id", fileSystem.OrganizationID) _ = d.Set("status", fileSystem.Status) - _ = d.Set("size", int64(fileSystem.Size)) + _ = d.Set("size_in_gb", int64(fileSystem.Size)) _ = d.Set("tags", fileSystem.Tags) _ = d.Set("created_at", fileSystem.CreatedAt.Format(time.RFC3339)) _ = d.Set("updated_at", fileSystem.UpdatedAt.Format(time.RFC3339)) @@ -163,8 +163,8 @@ func ResourceFileSystemUpdate(ctx context.Context, d *schema.ResourceData, m any req.Name = types.ExpandUpdatedStringPtr(d.Get("name")) } - if d.HasChange("size") { - req.Size = types.ExpandUint64Ptr(d.Get("size")) + if d.HasChange("size_in_gb_in_gb") { + req.Size = types.ExpandUint64Ptr(d.Get("size_in_gb")) } if d.HasChange("tags") { diff --git a/internal/services/file/filesystem_test.go b/internal/services/file/filesystem_test.go index 06b2347997..ea47f5e1b9 100644 --- a/internal/services/file/filesystem_test.go +++ b/internal/services/file/filesystem_test.go @@ -20,7 +20,7 @@ func TestAccFileSystem_Basic(t *testing.T) { fileSystemName := "TestAccFileSystem_Basic" fileSystemNameUpdated := "TestAccFileSystem_BasicUpdate" - size := int64(100_000_000_000) + sizeInGB := int64(100_000_000_000) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, @@ -31,25 +31,25 @@ func TestAccFileSystem_Basic(t *testing.T) { Config: fmt.Sprintf(` resource "scaleway_file_filesystem" "fs" { name = "%s" - size = %d + size_in_gb = %d } - `, fileSystemName, size), + `, fileSystemName, sizeInGB), Check: resource.ComposeTestCheckFunc( testAccCheckFileSystemExists(tt, "scaleway_file_filesystem.fs"), resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "name", fileSystemName), - resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "size", strconv.FormatInt(size, 10)), + resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "size_in_gb", strconv.FormatInt(sizeInGB, 10)), ), }, { Config: fmt.Sprintf(` resource "scaleway_file_filesystem" "fs" { name = "%s" - size = %d + size_in_gb = %d } - `, fileSystemNameUpdated, size), + `, fileSystemNameUpdated, sizeInGB), Check: resource.ComposeTestCheckFunc( testAccCheckFileSystemExists(tt, "scaleway_file_filesystem.fs"), - resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "size", strconv.FormatInt(size, 10)), + resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "size_in_gb", strconv.FormatInt(sizeInGB, 10)), ), }, }, @@ -61,7 +61,7 @@ func TestAccFileSystem_SizeTooSmallFails(t *testing.T) { defer tt.Cleanup() fileSystemName := "TestAccFileSystem_SizeTooSmallFails" - size := int64(10_000_000_000) + sizeInGB := int64(10_000_000_000) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, @@ -72,9 +72,9 @@ func TestAccFileSystem_SizeTooSmallFails(t *testing.T) { Config: fmt.Sprintf(` resource "scaleway_file_filesystem" "fs" { name = "%s" - size = %d + size_in_gb = %d } - `, fileSystemName, size), + `, fileSystemName, sizeInGB), ExpectError: regexp.MustCompile("size must be greater or equal to 100000000000"), }, }, @@ -86,7 +86,7 @@ func TestAccFileSystem_InvalidSizeGranularityFails(t *testing.T) { defer tt.Cleanup() fileSystemName := "TestAccFileSystem_InvalidSizeGranularityFails" - size := int64(25_000_000_000) + sizeInGB := int64(25_000_000_000) resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, @@ -97,10 +97,10 @@ func TestAccFileSystem_InvalidSizeGranularityFails(t *testing.T) { Config: fmt.Sprintf(` resource "scaleway_file_filesystem" "fs" { name = "%s" - size = %d + size_in_gb = %d } - `, fileSystemName, size), - ExpectError: regexp.MustCompile("size must be greater or equal to 100000000000"), + `, fileSystemName, sizeInGB), + ExpectError: regexp.MustCompile("size_in_gb must be greater or equal to 100000000000"), }, }, }) From 9d32c106fb43ef6cb330e83fab1890a5a0bdea0f Mon Sep 17 00:00:00 2001 From: Laure-di Date: Mon, 16 Jun 2025 13:36:25 +0200 Subject: [PATCH 5/8] fix: error return attachFS and typo doc --- docs/resources/instance_server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/resources/instance_server.md b/docs/resources/instance_server.md index 9b9c2b1df9..c0a4c11f1a 100644 --- a/docs/resources/instance_server.md +++ b/docs/resources/instance_server.md @@ -254,7 +254,7 @@ attached to the server. Updates to this field will trigger a stop/start of the s ~> **Important:** If this field contains local volumes, you have to first detach them, in one apply, and then delete the volume in another apply. -- `filesystem` - (Optional) List of filesystems attached to the server. +- `filesystems` - (Optional) List of filesystems attached to the server. - `filesystem_id` - (Optional) The unique ID of the filesystem attached to the server. - `enable_ipv6` - (Defaults to `false`) Determines if IPv6 is enabled for the server. From e0e533c9d933c16a506655af2711dea7f9781afc Mon Sep 17 00:00:00 2001 From: Laure-di Date: Mon, 16 Jun 2025 13:39:14 +0200 Subject: [PATCH 6/8] fix: error return attachFS and typo doc --- internal/services/file/filesystem.go | 2 +- internal/services/instance/server.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/services/file/filesystem.go b/internal/services/file/filesystem.go index 1eb3231605..8e66b8faed 100644 --- a/internal/services/file/filesystem.go +++ b/internal/services/file/filesystem.go @@ -163,7 +163,7 @@ func ResourceFileSystemUpdate(ctx context.Context, d *schema.ResourceData, m any req.Name = types.ExpandUpdatedStringPtr(d.Get("name")) } - if d.HasChange("size_in_gb_in_gb") { + if d.HasChange("size_in_gb") { req.Size = types.ExpandUint64Ptr(d.Get("size_in_gb")) } diff --git a/internal/services/instance/server.go b/internal/services/instance/server.go index 31e2c48c1d..340087eaa4 100644 --- a/internal/services/instance/server.go +++ b/internal/services/instance/server.go @@ -551,7 +551,7 @@ func ResourceInstanceServerCreate(ctx context.Context, d *schema.ResourceData, m ServerID: res.Server.ID, }) if err != nil { - return nil + return diag.FromErr(err) } } } From 3575502c26c25667d766d9ffb64a5a1eddcb4e34 Mon Sep 17 00:00:00 2001 From: Laure-di Date: Mon, 16 Jun 2025 14:42:35 +0200 Subject: [PATCH 7/8] update FileSystem Size to GB --- internal/services/file/filesystem.go | 12 +- internal/services/file/filesystem_test.go | 12 +- .../testdata/file-system-basic.cassette.yaml | 240 +++++++++--------- ...valid-size-granularity-fails.cassette.yaml | 18 +- ...-system-size-too-small-fails.cassette.yaml | 8 +- 5 files changed, 149 insertions(+), 141 deletions(-) diff --git a/internal/services/file/filesystem.go b/internal/services/file/filesystem.go index 8e66b8faed..b9bc8963cc 100644 --- a/internal/services/file/filesystem.go +++ b/internal/services/file/filesystem.go @@ -91,6 +91,12 @@ func ResourceFileSystemCreate(ctx context.Context, d *schema.ResourceData, m any Tags: types.ExpandStrings(d.Get("tags")), } + if size, ok := d.GetOk("size_in_gb"); ok { + sizeInGB := size.(int) + sizeInBytes := uint64(sizeInGB) * uint64(scw.GB) + req.Size = sizeInBytes + } + file, err := api.CreateFileSystem(req, scw.WithContext(ctx)) if err != nil { return diag.FromErr(err) @@ -128,7 +134,8 @@ func ResourceFileSystemRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("region", fileSystem.Region) _ = d.Set("organization_id", fileSystem.OrganizationID) _ = d.Set("status", fileSystem.Status) - _ = d.Set("size_in_gb", int64(fileSystem.Size)) + _ = d.Set("size_in_gb", int(fileSystem.Size/scw.GB)) + ) _ = d.Set("tags", fileSystem.Tags) _ = d.Set("created_at", fileSystem.CreatedAt.Format(time.RFC3339)) _ = d.Set("updated_at", fileSystem.UpdatedAt.Format(time.RFC3339)) @@ -164,7 +171,8 @@ func ResourceFileSystemUpdate(ctx context.Context, d *schema.ResourceData, m any } if d.HasChange("size_in_gb") { - req.Size = types.ExpandUint64Ptr(d.Get("size_in_gb")) + sizeInGB := uint64(d.Get("size_in_gb").(int)) * uint64(scw.GB) + req.Size = types.ExpandUint64Ptr(sizeInGB) } if d.HasChange("tags") { diff --git a/internal/services/file/filesystem_test.go b/internal/services/file/filesystem_test.go index ea47f5e1b9..edeb3e9943 100644 --- a/internal/services/file/filesystem_test.go +++ b/internal/services/file/filesystem_test.go @@ -20,7 +20,7 @@ func TestAccFileSystem_Basic(t *testing.T) { fileSystemName := "TestAccFileSystem_Basic" fileSystemNameUpdated := "TestAccFileSystem_BasicUpdate" - sizeInGB := int64(100_000_000_000) + sizeInGB := 100 resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, @@ -37,7 +37,7 @@ func TestAccFileSystem_Basic(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckFileSystemExists(tt, "scaleway_file_filesystem.fs"), resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "name", fileSystemName), - resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "size_in_gb", strconv.FormatInt(sizeInGB, 10)), + resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "size_in_gb", strconv.Itoa(sizeInGB)), ), }, { @@ -49,7 +49,7 @@ func TestAccFileSystem_Basic(t *testing.T) { `, fileSystemNameUpdated, sizeInGB), Check: resource.ComposeTestCheckFunc( testAccCheckFileSystemExists(tt, "scaleway_file_filesystem.fs"), - resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "size_in_gb", strconv.FormatInt(sizeInGB, 10)), + resource.TestCheckResourceAttr("scaleway_file_filesystem.fs", "size_in_gb", strconv.Itoa(sizeInGB)), ), }, }, @@ -61,7 +61,7 @@ func TestAccFileSystem_SizeTooSmallFails(t *testing.T) { defer tt.Cleanup() fileSystemName := "TestAccFileSystem_SizeTooSmallFails" - sizeInGB := int64(10_000_000_000) + sizeInGB := 10 resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, @@ -86,7 +86,7 @@ func TestAccFileSystem_InvalidSizeGranularityFails(t *testing.T) { defer tt.Cleanup() fileSystemName := "TestAccFileSystem_InvalidSizeGranularityFails" - sizeInGB := int64(25_000_000_000) + sizeInGB := 250 resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acctest.PreCheck(t) }, @@ -100,7 +100,7 @@ func TestAccFileSystem_InvalidSizeGranularityFails(t *testing.T) { size_in_gb = %d } `, fileSystemName, sizeInGB), - ExpectError: regexp.MustCompile("size_in_gb must be greater or equal to 100000000000"), + ExpectError: regexp.MustCompile("size does not respect constraint, size must be a multiple of 100000000000"), }, }, }) diff --git a/internal/services/file/testdata/file-system-basic.cassette.yaml b/internal/services/file/testdata/file-system-basic.cassette.yaml index a5a78bd993..e0df6fc6dd 100644 --- a/internal/services/file/testdata/file-system-basic.cassette.yaml +++ b/internal/services/file/testdata/file-system-basic.cassette.yaml @@ -27,20 +27,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 377 + content_length: 367 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"creating","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"creating","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "377" + - "367" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:33 GMT + - Mon, 16 Jun 2025 12:40:20 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -48,10 +48,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 4df7f46a-4ead-45db-9d5f-b9e3ff8e472c + - 41978b6e-eff8-4b7d-8afc-f5e524fe6e13 status: 200 OK code: 200 - duration: 274.625083ms + duration: 176.580333ms - id: 1 request: proto: HTTP/1.1 @@ -68,7 +68,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -76,20 +76,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 377 + content_length: 367 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"creating","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"creating","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "377" + - "367" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:33 GMT + - Mon, 16 Jun 2025 12:40:20 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -97,10 +97,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 84d60524-ece9-4219-925a-fd3d5238e121 + - 63fb8928-9db5-48db-8645-59178ecabb10 status: 200 OK code: 200 - duration: 78.254833ms + duration: 43.219459ms - id: 2 request: proto: HTTP/1.1 @@ -117,7 +117,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -125,20 +125,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 378 + content_length: 368 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "378" + - "368" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:38 GMT + - Mon, 16 Jun 2025 12:40:25 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -146,10 +146,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 20f8bc16-b5f3-4aa8-93db-7e2110d7226f + - 6ee8ca43-dcbc-494d-be90-c8291b10acca status: 200 OK code: 200 - duration: 226.728042ms + duration: 482.33925ms - id: 3 request: proto: HTTP/1.1 @@ -166,7 +166,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -174,20 +174,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 378 + content_length: 368 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "378" + - "368" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:38 GMT + - Mon, 16 Jun 2025 12:40:25 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -195,10 +195,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 85533205-70f3-4507-8a2e-b5b5c872db7d + - ece86495-710f-4fcc-87c9-e7a903472caf status: 200 OK code: 200 - duration: 72.933083ms + duration: 61.259708ms - id: 4 request: proto: HTTP/1.1 @@ -215,7 +215,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -223,20 +223,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 378 + content_length: 368 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "378" + - "368" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:38 GMT + - Mon, 16 Jun 2025 12:40:25 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -244,10 +244,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - ffb6ba44-4198-402b-bade-9d1056f62c1e + - bb490fc0-5df0-4782-a65d-6e3df4108f0c status: 200 OK code: 200 - duration: 93.981208ms + duration: 63.040666ms - id: 5 request: proto: HTTP/1.1 @@ -264,7 +264,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -272,20 +272,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 378 + content_length: 368 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "378" + - "368" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:39 GMT + - Mon, 16 Jun 2025 12:40:26 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -293,10 +293,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 8d1980a9-616d-4cb7-8379-a965875aa615 + - 4f8b3f4a-35a2-4dd2-9e81-dd8da1539984 status: 200 OK code: 200 - duration: 147.937375ms + duration: 55.424458ms - id: 6 request: proto: HTTP/1.1 @@ -313,7 +313,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -321,20 +321,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 378 + content_length: 368 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "378" + - "368" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:40 GMT + - Mon, 16 Jun 2025 12:40:27 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -342,10 +342,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 279f4589-9a60-4355-af18-b065577575c3 + - 8f5924bc-9312-4c50-a92c-bf16a5d757a0 status: 200 OK code: 200 - duration: 96.605459ms + duration: 48.312833ms - id: 7 request: proto: HTTP/1.1 @@ -362,7 +362,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -370,20 +370,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 378 + content_length: 368 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_Basic","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "378" + - "368" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:41 GMT + - Mon, 16 Jun 2025 12:40:28 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -391,10 +391,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - f8975b8a-e0ed-45c2-9a8f-346bf790a5dc + - 8fae955b-906e-4fa5-9a70-25e64069e59f status: 200 OK code: 200 - duration: 73.752958ms + duration: 50.334708ms - id: 8 request: proto: HTTP/1.1 @@ -413,7 +413,7 @@ interactions: - application/json User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: PATCH response: proto: HTTP/2.0 @@ -421,20 +421,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 384 + content_length: 374 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "384" + - "374" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:41 GMT + - Mon, 16 Jun 2025 12:40:28 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -442,10 +442,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 51ef71a4-08af-419a-81e4-5909b1c7b3f8 + - f70a4f86-f671-4d02-9fe5-7a5af17d8bea status: 200 OK code: 200 - duration: 360.532708ms + duration: 100.775958ms - id: 9 request: proto: HTTP/1.1 @@ -462,7 +462,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -470,20 +470,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 384 + content_length: 374 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "384" + - "374" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:41 GMT + - Mon, 16 Jun 2025 12:40:28 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -491,10 +491,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - e9b678e6-2fa3-4f6c-9d33-dc266b7b6768 + - 47273c4c-c3db-4169-af5f-e892bf5e75a9 status: 200 OK code: 200 - duration: 119.121167ms + duration: 42.200667ms - id: 10 request: proto: HTTP/1.1 @@ -511,7 +511,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -519,20 +519,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 384 + content_length: 374 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "384" + - "374" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:42 GMT + - Mon, 16 Jun 2025 12:40:28 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -540,10 +540,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 50f62ab1-20a2-464c-89ed-a2e379cbf195 + - e317c6dd-2dd5-4c5d-86f8-530ea0467ce9 status: 200 OK code: 200 - duration: 216.022333ms + duration: 56.060375ms - id: 11 request: proto: HTTP/1.1 @@ -560,7 +560,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -568,20 +568,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 384 + content_length: 374 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "384" + - "374" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:42 GMT + - Mon, 16 Jun 2025 12:40:29 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -589,10 +589,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 65c3582f-73c5-4b28-8965-c819f2a6fae1 + - 25fa7dfe-b99c-49a6-b963-26da0e4bea41 status: 200 OK code: 200 - duration: 162.31775ms + duration: 65.977459ms - id: 12 request: proto: HTTP/1.1 @@ -609,7 +609,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -617,20 +617,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 384 + content_length: 374 uncompressed: false - body: '{"created_at":"2025-06-05T14:14:33.172071Z","id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-05T14:14:33.172071Z"}' + body: '{"created_at":"2025-06-16T12:40:19.942819Z","id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","name":"TestAccFileSystem_BasicUpdate","number_of_attachments":0,"organization_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","region":"fr-par","size":100000000000,"status":"available","tags":[],"updated_at":"2025-06-16T12:40:19.942819Z"}' headers: Content-Length: - - "384" + - "374" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:43 GMT + - Mon, 16 Jun 2025 12:40:30 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -638,10 +638,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - fe3263a9-6ccc-4d2f-9f86-2c4b3a5d4667 + - b7e9e1db-a32d-4673-b027-00a6b0a1dde6 status: 200 OK code: 200 - duration: 137.156792ms + duration: 41.812958ms - id: 13 request: proto: HTTP/1.1 @@ -658,7 +658,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: DELETE response: proto: HTTP/2.0 @@ -675,9 +675,9 @@ interactions: Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:44 GMT + - Mon, 16 Jun 2025 12:40:30 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -685,10 +685,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 190f61ce-0cbc-41e7-9bad-d44345208cba + - 6393c566-4efb-407d-9e7e-0f19ebbfd784 status: 204 No Content code: 204 - duration: 132.4795ms + duration: 82.050917ms - id: 14 request: proto: HTTP/1.1 @@ -705,7 +705,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -715,7 +715,7 @@ interactions: trailer: {} content_length: 131 uncompressed: false - body: '{"message":"resource is not found","resource":"filesystem","resource_id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","type":"not_found"}' + body: '{"message":"resource is not found","resource":"filesystem","resource_id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","type":"not_found"}' headers: Content-Length: - "131" @@ -724,9 +724,9 @@ interactions: Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:44 GMT + - Mon, 16 Jun 2025 12:40:30 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -734,10 +734,10 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - aea2d290-84b6-4302-ad90-f87143eb6f06 + - df373ae5-3b7a-475e-8976-47ece4e88f36 status: 404 Not Found code: 404 - duration: 87.874208ms + duration: 37.103625ms - id: 15 request: proto: HTTP/1.1 @@ -754,7 +754,7 @@ interactions: headers: User-Agent: - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.24.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/19c1099a-95a9-4ddb-85c4-1c609dfc4d34 + url: https://api.scaleway.com/file/v1alpha1/regions/fr-par/filesystems/f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b method: GET response: proto: HTTP/2.0 @@ -764,7 +764,7 @@ interactions: trailer: {} content_length: 131 uncompressed: false - body: '{"message":"resource is not found","resource":"filesystem","resource_id":"19c1099a-95a9-4ddb-85c4-1c609dfc4d34","type":"not_found"}' + body: '{"message":"resource is not found","resource":"filesystem","resource_id":"f92df0ae-6ba3-4f34-9576-9dbdb4bfde0b","type":"not_found"}' headers: Content-Length: - "131" @@ -773,9 +773,9 @@ interactions: Content-Type: - application/json Date: - - Thu, 05 Jun 2025 14:14:44 GMT + - Mon, 16 Jun 2025 12:40:30 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -783,7 +783,7 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - f458d891-e526-49da-99c3-8da82a0b0ef9 + - 308cf894-f126-4ba1-a643-d119c99717e7 status: 404 Not Found code: 404 - duration: 86.334708ms + duration: 37.545458ms diff --git a/internal/services/file/testdata/file-system-invalid-size-granularity-fails.cassette.yaml b/internal/services/file/testdata/file-system-invalid-size-granularity-fails.cassette.yaml index 3706bfef8a..a613a3a6bb 100644 --- a/internal/services/file/testdata/file-system-invalid-size-granularity-fails.cassette.yaml +++ b/internal/services/file/testdata/file-system-invalid-size-granularity-fails.cassette.yaml @@ -6,13 +6,13 @@ interactions: proto: HTTP/1.1 proto_major: 1 proto_minor: 1 - content_length: 137 + content_length: 138 transfer_encoding: [] trailer: {} host: api.scaleway.com remote_addr: "" request_uri: "" - body: '{"name":"TestAccFileSystem_InvalidSizeGranularityFails","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","size":25000000000,"tags":[]}' + body: '{"name":"TestAccFileSystem_InvalidSizeGranularityFails","project_id":"d3520a52-2c75-4ba0-bda8-82dd087f07f2","size":250000000000,"tags":[]}' form: {} headers: Content-Type: @@ -27,20 +27,20 @@ interactions: proto_minor: 0 transfer_encoding: [] trailer: {} - content_length: 182 + content_length: 176 uncompressed: false - body: '{"details":[{"argument_name":"size","help_message":"size must be greater or equal to 100000000000","reason":"constraint"}],"message":"invalid argument(s)","type":"invalid_arguments"}' + body: '{"details":[{"argument_name":"size","help_message":"size must be a multiple of 100000000000","reason":"constraint"}],"message":"invalid argument(s)","type":"invalid_arguments"}' headers: Content-Length: - - "182" + - "176" Content-Security-Policy: - default-src 'none'; frame-ancestors 'none' Content-Type: - application/json Date: - - Thu, 05 Jun 2025 15:04:00 GMT + - Mon, 16 Jun 2025 12:41:54 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -48,7 +48,7 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 1a3119e1-bf60-4f56-ae77-75a725054db8 + - c4b3c3a3-2afa-476e-aa57-0e45eac69c8d status: 400 Bad Request code: 400 - duration: 184.383ms + duration: 56.899875ms diff --git a/internal/services/file/testdata/file-system-size-too-small-fails.cassette.yaml b/internal/services/file/testdata/file-system-size-too-small-fails.cassette.yaml index 11bfd1ce3b..1b8487158b 100644 --- a/internal/services/file/testdata/file-system-size-too-small-fails.cassette.yaml +++ b/internal/services/file/testdata/file-system-size-too-small-fails.cassette.yaml @@ -38,9 +38,9 @@ interactions: Content-Type: - application/json Date: - - Thu, 05 Jun 2025 15:04:02 GMT + - Mon, 16 Jun 2025 12:40:19 GMT Server: - - Scaleway API Gateway (fr-par-1;edge01) + - Scaleway API Gateway (fr-par-1;edge02) Strict-Transport-Security: - max-age=63072000 X-Content-Type-Options: @@ -48,7 +48,7 @@ interactions: X-Frame-Options: - DENY X-Request-Id: - - 1fb11366-c9f7-412e-883d-fc8dd92c0d3d + - 0ec41b57-e5b9-4d56-94af-29939ef7c007 status: 400 Bad Request code: 400 - duration: 309.532458ms + duration: 66.228416ms From 1965bc67d2873b21ef7b1fecad91eff2ba43938d Mon Sep 17 00:00:00 2001 From: Laure-di Date: Mon, 16 Jun 2025 14:42:35 +0200 Subject: [PATCH 8/8] update FileSystem Size to GB --- internal/services/file/filesystem.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/services/file/filesystem.go b/internal/services/file/filesystem.go index b9bc8963cc..13db89cc0f 100644 --- a/internal/services/file/filesystem.go +++ b/internal/services/file/filesystem.go @@ -2,6 +2,7 @@ package file import ( "context" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "time" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" @@ -38,9 +39,10 @@ func ResourceFileSystem() *schema.Resource { Description: "The name of the filesystem", }, "size_in_gb": { - Type: schema.TypeInt, - Required: true, - Description: "The Filesystem size_in_gb in bytes, with a granularity of 100 GB (10^11 bytes). Must be compliant with the minimum (100 GB) and maximum (10 TB) allowed size_in_gb.", + Type: schema.TypeInt, + Required: true, + ValidateFunc: validation.IntBetween(1, 1000), + Description: "The Filesystem size_in_gb in bytes, with a granularity of 100 GB (10^11 bytes). Must be compliant with the minimum (100 GB) and maximum (10 TB) allowed size_in_gb.", }, "tags": { Type: schema.TypeList, @@ -135,7 +137,6 @@ func ResourceFileSystemRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("organization_id", fileSystem.OrganizationID) _ = d.Set("status", fileSystem.Status) _ = d.Set("size_in_gb", int(fileSystem.Size/scw.GB)) - ) _ = d.Set("tags", fileSystem.Tags) _ = d.Set("created_at", fileSystem.CreatedAt.Format(time.RFC3339)) _ = d.Set("updated_at", fileSystem.UpdatedAt.Format(time.RFC3339))