From c8d65455e357219837958f55bba2bff2c4e2949b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Mon, 25 Aug 2025 14:49:02 +0200 Subject: [PATCH 1/9] chore(block): add support for identity schema --- internal/services/block/snapshot.go | 31 +++++++++++++++++++++++++++++ internal/services/block/volume.go | 31 +++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/internal/services/block/snapshot.go b/internal/services/block/snapshot.go index 3920f813d1..adba684a1c 100644 --- a/internal/services/block/snapshot.go +++ b/internal/services/block/snapshot.go @@ -33,6 +33,25 @@ func ResourceSnapshot() *schema.Resource { Default: schema.DefaultTimeout(defaultBlockTimeout), }, SchemaVersion: 0, + Identity: &schema.ResourceIdentity{ + Version: 0, + SchemaFunc: func() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "snapshot_id": { + Type: schema.TypeString, + Computed: true, + RequiredForImport: true, + Description: "Snapshot ID", + }, + "zone": { + Type: schema.TypeString, + Computed: true, + RequiredForImport: true, + Description: "Zone ID", + }, + } + }, + }, Schema: map[string]*schema.Schema{ "name": { Type: schema.TypeString, @@ -202,6 +221,18 @@ func ResourceBlockSnapshotRead(ctx context.Context, d *schema.ResourceData, m an _ = d.Set("tags", snapshot.Tags) + identity, err := d.Identity() + if err != nil { + return diag.FromErr(err) + } + + if err = identity.Set("snapshot_id", snapshot.ID); err != nil { + return diag.FromErr(err) + } + if err = identity.Set("zone", snapshot.Zone); err != nil { + return diag.FromErr(err) + } + return nil } diff --git a/internal/services/block/volume.go b/internal/services/block/volume.go index 09c0e0bdc6..83d8672827 100644 --- a/internal/services/block/volume.go +++ b/internal/services/block/volume.go @@ -26,6 +26,25 @@ func ResourceVolume() *schema.Resource { Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, + Identity: &schema.ResourceIdentity{ + Version: 0, + SchemaFunc: func() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "volume_id": { + Type: schema.TypeString, + Computed: true, + RequiredForImport: true, + Description: "Volume ID", + }, + "zone": { + Type: schema.TypeString, + Computed: true, + RequiredForImport: true, + Description: "Zone", + }, + } + }, + }, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(defaultBlockTimeout), Read: schema.DefaultTimeout(defaultBlockTimeout), @@ -186,6 +205,18 @@ func ResourceBlockVolumeRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("snapshot_id", snapshotID) + identity, err := d.Identity() + if err != nil { + return diag.FromErr(err) + } + + if err = identity.Set("volume_id", volume.ID); err != nil { + return diag.FromErr(err) + } + if err = identity.Set("zone", volume.Zone); err != nil { + return diag.FromErr(err) + } + return nil } From 5d578ed3377c77902998e293b819c5fe2b2a0edd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Mon, 25 Aug 2025 15:03:54 +0200 Subject: [PATCH 2/9] Ignore false positive linter --- GNUmakefile | 2 +- internal/services/block/snapshot.go | 2 -- internal/services/block/volume.go | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index fa6e7e3727..da286102eb 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -56,7 +56,7 @@ website: .PHONY: build test testacc vet fmt fmtcheck errcheck test-compile website tfproviderlint: - go tool tfproviderlint -R014=false -AT001.ignored-filename-suffixes=_data_source_test.go ./... + go tool tfproviderlint -R014=false -S013=false -AT001.ignored-filename-suffixes=_data_source_test.go ./... tfproviderdocs: go tool tfproviderdocs check -provider-name scaleway -enable-contents-check diff --git a/internal/services/block/snapshot.go b/internal/services/block/snapshot.go index adba684a1c..dc51b956ad 100644 --- a/internal/services/block/snapshot.go +++ b/internal/services/block/snapshot.go @@ -39,13 +39,11 @@ func ResourceSnapshot() *schema.Resource { return map[string]*schema.Schema{ "snapshot_id": { Type: schema.TypeString, - Computed: true, RequiredForImport: true, Description: "Snapshot ID", }, "zone": { Type: schema.TypeString, - Computed: true, RequiredForImport: true, Description: "Zone ID", }, diff --git a/internal/services/block/volume.go b/internal/services/block/volume.go index 83d8672827..10db415a85 100644 --- a/internal/services/block/volume.go +++ b/internal/services/block/volume.go @@ -32,13 +32,11 @@ func ResourceVolume() *schema.Resource { return map[string]*schema.Schema{ "volume_id": { Type: schema.TypeString, - Computed: true, RequiredForImport: true, Description: "Volume ID", }, "zone": { Type: schema.TypeString, - Computed: true, RequiredForImport: true, Description: "Zone", }, From afc4bf974143a0ed1b6083f3abf0557304eb1fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Mon, 25 Aug 2025 15:14:39 +0200 Subject: [PATCH 3/9] mutualize between ressource schema and data source schema --- internal/services/block/snapshot.go | 39 +++++++++++-------- .../services/block/snapshot_data_source.go | 1 + internal/services/block/volume.go | 39 +++++++++++-------- internal/services/block/volume_data_source.go | 1 + 4 files changed, 46 insertions(+), 34 deletions(-) diff --git a/internal/services/block/snapshot.go b/internal/services/block/snapshot.go index dc51b956ad..6db1df93a5 100644 --- a/internal/services/block/snapshot.go +++ b/internal/services/block/snapshot.go @@ -33,23 +33,7 @@ func ResourceSnapshot() *schema.Resource { Default: schema.DefaultTimeout(defaultBlockTimeout), }, SchemaVersion: 0, - Identity: &schema.ResourceIdentity{ - Version: 0, - SchemaFunc: func() map[string]*schema.Schema { - return map[string]*schema.Schema{ - "snapshot_id": { - Type: schema.TypeString, - RequiredForImport: true, - Description: "Snapshot ID", - }, - "zone": { - Type: schema.TypeString, - RequiredForImport: true, - Description: "Zone ID", - }, - } - }, - }, + Identity: blockIdentity(), Schema: map[string]*schema.Schema{ "name": { Type: schema.TypeString, @@ -227,6 +211,7 @@ func ResourceBlockSnapshotRead(ctx context.Context, d *schema.ResourceData, m an if err = identity.Set("snapshot_id", snapshot.ID); err != nil { return diag.FromErr(err) } + if err = identity.Set("zone", snapshot.Zone); err != nil { return diag.FromErr(err) } @@ -311,3 +296,23 @@ func ResourceBlockSnapshotDelete(ctx context.Context, d *schema.ResourceData, m return nil } + +func blockIdentity() *schema.ResourceIdentity { + return &schema.ResourceIdentity{ + Version: 0, + SchemaFunc: func() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "snapshot_id": { + Type: schema.TypeString, + RequiredForImport: true, + Description: "Snapshot ID", + }, + "zone": { + Type: schema.TypeString, + RequiredForImport: true, + Description: "Zone ID", + }, + } + }, + } +} diff --git a/internal/services/block/snapshot_data_source.go b/internal/services/block/snapshot_data_source.go index b017dd1638..5234435b25 100644 --- a/internal/services/block/snapshot_data_source.go +++ b/internal/services/block/snapshot_data_source.go @@ -28,6 +28,7 @@ func DataSourceSnapshot() *schema.Resource { return &schema.Resource{ ReadContext: DataSourceBlockSnapshotRead, Schema: dsSchema, + Identity: blockIdentity(), } } diff --git a/internal/services/block/volume.go b/internal/services/block/volume.go index 10db415a85..94a8a9b6f4 100644 --- a/internal/services/block/volume.go +++ b/internal/services/block/volume.go @@ -26,23 +26,7 @@ func ResourceVolume() *schema.Resource { Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, - Identity: &schema.ResourceIdentity{ - Version: 0, - SchemaFunc: func() map[string]*schema.Schema { - return map[string]*schema.Schema{ - "volume_id": { - Type: schema.TypeString, - RequiredForImport: true, - Description: "Volume ID", - }, - "zone": { - Type: schema.TypeString, - RequiredForImport: true, - Description: "Zone", - }, - } - }, - }, + Identity: volumeIdentity(), Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(defaultBlockTimeout), Read: schema.DefaultTimeout(defaultBlockTimeout), @@ -100,6 +84,26 @@ func ResourceVolume() *schema.Resource { } } +func volumeIdentity() *schema.ResourceIdentity { + return &schema.ResourceIdentity{ + Version: 0, + SchemaFunc: func() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "volume_id": { + Type: schema.TypeString, + RequiredForImport: true, + Description: "Volume ID", + }, + "zone": { + Type: schema.TypeString, + RequiredForImport: true, + Description: "Zone", + }, + } + }, + } +} + func ResourceBlockVolumeCreate(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics { api, zone, err := instancehelpers.InstanceAndBlockAPIWithZone(d, m) if err != nil { @@ -211,6 +215,7 @@ func ResourceBlockVolumeRead(ctx context.Context, d *schema.ResourceData, m any) if err = identity.Set("volume_id", volume.ID); err != nil { return diag.FromErr(err) } + if err = identity.Set("zone", volume.Zone); err != nil { return diag.FromErr(err) } diff --git a/internal/services/block/volume_data_source.go b/internal/services/block/volume_data_source.go index 57c74fdfca..24a7e80b54 100644 --- a/internal/services/block/volume_data_source.go +++ b/internal/services/block/volume_data_source.go @@ -28,6 +28,7 @@ func DataSourceVolume() *schema.Resource { return &schema.Resource{ ReadContext: DataSourceBlockVolumeRead, Schema: dsSchema, + Identity: volumeIdentity(), } } From 810228fbe45e4a8b8e448c1626f56324b1b24b60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Mon, 25 Aug 2025 15:32:13 +0200 Subject: [PATCH 4/9] Fix reuse between data source and ressource --- internal/services/block/snapshot.go | 13 +++++++++++-- internal/services/block/snapshot_data_source.go | 2 ++ internal/services/block/volume.go | 13 +++++++++++-- internal/services/block/volume_data_source.go | 2 ++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/internal/services/block/snapshot.go b/internal/services/block/snapshot.go index 6db1df93a5..9b9ec4ff04 100644 --- a/internal/services/block/snapshot.go +++ b/internal/services/block/snapshot.go @@ -203,16 +203,25 @@ func ResourceBlockSnapshotRead(ctx context.Context, d *schema.ResourceData, m an _ = d.Set("tags", snapshot.Tags) + diags := applySnapshotIdentity(d, snapshot.ID, zone) + if diags != nil { + return diags + } + + return nil +} + +func applySnapshotIdentity(d *schema.ResourceData, snapshotID string, zone scw.Zone) diag.Diagnostics { identity, err := d.Identity() if err != nil { return diag.FromErr(err) } - if err = identity.Set("snapshot_id", snapshot.ID); err != nil { + if err = identity.Set("snapshot_id", snapshotID); err != nil { return diag.FromErr(err) } - if err = identity.Set("zone", snapshot.Zone); err != nil { + if err = identity.Set("zone", zone); err != nil { return diag.FromErr(err) } diff --git a/internal/services/block/snapshot_data_source.go b/internal/services/block/snapshot_data_source.go index 5234435b25..571389ac94 100644 --- a/internal/services/block/snapshot_data_source.go +++ b/internal/services/block/snapshot_data_source.go @@ -82,5 +82,7 @@ func DataSourceBlockSnapshotRead(ctx context.Context, d *schema.ResourceData, m return diag.Errorf("snapshot (%s) not found", zoneID) } + applySnapshotIdentity(d, snapshotID.(string), zone) + return nil } diff --git a/internal/services/block/volume.go b/internal/services/block/volume.go index 94a8a9b6f4..0ba381051e 100644 --- a/internal/services/block/volume.go +++ b/internal/services/block/volume.go @@ -207,16 +207,25 @@ func ResourceBlockVolumeRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("snapshot_id", snapshotID) + diags := applyVolumeIdentity(d, volume.ID, zone) + if diags != nil { + return diags + } + + return nil +} + +func applyVolumeIdentity(d *schema.ResourceData, volumeID string, zone scw.Zone) diag.Diagnostics { identity, err := d.Identity() if err != nil { return diag.FromErr(err) } - if err = identity.Set("volume_id", volume.ID); err != nil { + if err = identity.Set("volume_id", volumeID); err != nil { return diag.FromErr(err) } - if err = identity.Set("zone", volume.Zone); err != nil { + if err = identity.Set("zone", zone); err != nil { return diag.FromErr(err) } diff --git a/internal/services/block/volume_data_source.go b/internal/services/block/volume_data_source.go index 24a7e80b54..dfb06489da 100644 --- a/internal/services/block/volume_data_source.go +++ b/internal/services/block/volume_data_source.go @@ -81,5 +81,7 @@ func DataSourceBlockVolumeRead(ctx context.Context, d *schema.ResourceData, m an return diag.Errorf("volume (%s) not found", zoneID) } + applyVolumeIdentity(d, volumeID.(string), zone) + return nil } From 3beeb57bce7fcec259cdac1ef6ddf7f970f77f1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Mon, 25 Aug 2025 15:56:08 +0200 Subject: [PATCH 5/9] ignore checks in tfproviderlintx as well --- GNUmakefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GNUmakefile b/GNUmakefile index da286102eb..8ce7ac6342 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -62,4 +62,4 @@ tfproviderdocs: go tool tfproviderdocs check -provider-name scaleway -enable-contents-check tfproviderlintx: - go tool tfproviderlintx -XR001=false -XS002=false ./... + go tool tfproviderlintx -XR001=false -S013=false -XS002=false ./... From bb9db15cc7dfe97b7b230497b459eb9a6bdf1d3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Mon, 25 Aug 2025 18:09:45 +0200 Subject: [PATCH 6/9] Add identity creation in the create as well --- internal/services/block/snapshot.go | 4 ++++ internal/services/block/volume.go | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/internal/services/block/snapshot.go b/internal/services/block/snapshot.go index 9b9ec4ff04..38458e203a 100644 --- a/internal/services/block/snapshot.go +++ b/internal/services/block/snapshot.go @@ -151,6 +151,10 @@ func ResourceBlockSnapshotCreate(ctx context.Context, d *schema.ResourceData, m } d.SetId(zonal.NewIDString(zone, snapshot.ID)) + diags := applySnapshotIdentity(d, snapshot.ID, zone) + if diags != nil { + return diags + } _, err = waitForBlockSnapshot(ctx, api, zone, snapshot.ID, d.Timeout(schema.TimeoutCreate)) if err != nil { diff --git a/internal/services/block/volume.go b/internal/services/block/volume.go index 0ba381051e..19ebaebe41 100644 --- a/internal/services/block/volume.go +++ b/internal/services/block/volume.go @@ -156,6 +156,10 @@ func ResourceBlockVolumeCreate(ctx context.Context, d *schema.ResourceData, m an } d.SetId(zonal.NewIDString(zone, volume.ID)) + diags := applyVolumeIdentity(d, volume.ID, zone) + if diags != nil { + return diags + } _, err = waitForBlockVolume(ctx, api.BlockAPI, zone, volume.ID, d.Timeout(schema.TimeoutCreate)) if err != nil { From 441c093f21325dd875460878dc416ba75f7620ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Mon, 25 Aug 2025 18:14:05 +0200 Subject: [PATCH 7/9] Fix linter --- internal/services/block/snapshot.go | 1 + internal/services/block/volume.go | 1 + 2 files changed, 2 insertions(+) diff --git a/internal/services/block/snapshot.go b/internal/services/block/snapshot.go index 38458e203a..ad919cad5c 100644 --- a/internal/services/block/snapshot.go +++ b/internal/services/block/snapshot.go @@ -151,6 +151,7 @@ func ResourceBlockSnapshotCreate(ctx context.Context, d *schema.ResourceData, m } d.SetId(zonal.NewIDString(zone, snapshot.ID)) + diags := applySnapshotIdentity(d, snapshot.ID, zone) if diags != nil { return diags diff --git a/internal/services/block/volume.go b/internal/services/block/volume.go index 19ebaebe41..c87340f9cb 100644 --- a/internal/services/block/volume.go +++ b/internal/services/block/volume.go @@ -156,6 +156,7 @@ func ResourceBlockVolumeCreate(ctx context.Context, d *schema.ResourceData, m an } d.SetId(zonal.NewIDString(zone, volume.ID)) + diags := applyVolumeIdentity(d, volume.ID, zone) if diags != nil { return diags From c5288438d7975bc1b2fae91a1daab193a0723ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Wed, 27 Aug 2025 12:01:56 +0200 Subject: [PATCH 8/9] remove identity from data source --- internal/services/block/snapshot_data_source.go | 1 - internal/services/block/volume_data_source.go | 1 - 2 files changed, 2 deletions(-) diff --git a/internal/services/block/snapshot_data_source.go b/internal/services/block/snapshot_data_source.go index 571389ac94..030f3f09ec 100644 --- a/internal/services/block/snapshot_data_source.go +++ b/internal/services/block/snapshot_data_source.go @@ -28,7 +28,6 @@ func DataSourceSnapshot() *schema.Resource { return &schema.Resource{ ReadContext: DataSourceBlockSnapshotRead, Schema: dsSchema, - Identity: blockIdentity(), } } diff --git a/internal/services/block/volume_data_source.go b/internal/services/block/volume_data_source.go index dfb06489da..94619ca43e 100644 --- a/internal/services/block/volume_data_source.go +++ b/internal/services/block/volume_data_source.go @@ -28,7 +28,6 @@ func DataSourceVolume() *schema.Resource { return &schema.Resource{ ReadContext: DataSourceBlockVolumeRead, Schema: dsSchema, - Identity: volumeIdentity(), } } From b9e8dd8304acc5f0dc4b0b1c6e872afdef43b564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Wed, 27 Aug 2025 12:03:27 +0200 Subject: [PATCH 9/9] Fix --- internal/services/block/snapshot_data_source.go | 2 -- internal/services/block/volume_data_source.go | 2 -- 2 files changed, 4 deletions(-) diff --git a/internal/services/block/snapshot_data_source.go b/internal/services/block/snapshot_data_source.go index 030f3f09ec..b017dd1638 100644 --- a/internal/services/block/snapshot_data_source.go +++ b/internal/services/block/snapshot_data_source.go @@ -81,7 +81,5 @@ func DataSourceBlockSnapshotRead(ctx context.Context, d *schema.ResourceData, m return diag.Errorf("snapshot (%s) not found", zoneID) } - applySnapshotIdentity(d, snapshotID.(string), zone) - return nil } diff --git a/internal/services/block/volume_data_source.go b/internal/services/block/volume_data_source.go index 94619ca43e..57c74fdfca 100644 --- a/internal/services/block/volume_data_source.go +++ b/internal/services/block/volume_data_source.go @@ -80,7 +80,5 @@ func DataSourceBlockVolumeRead(ctx context.Context, d *schema.ResourceData, m an return diag.Errorf("volume (%s) not found", zoneID) } - applyVolumeIdentity(d, volumeID.(string), zone) - return nil }