diff --git a/internal/services/block/snapshot.go b/internal/services/block/snapshot.go index 099fc4d683..cacff6934c 100644 --- a/internal/services/block/snapshot.go +++ b/internal/services/block/snapshot.go @@ -9,6 +9,7 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" "github.com/scaleway/terraform-provider-scaleway/v2/internal/dsf" "github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/identity" "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality" "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional" "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/zonal" @@ -34,6 +35,7 @@ func ResourceSnapshot() *schema.Resource { }, SchemaVersion: 0, SchemaFunc: snapshotSchema, + Identity: identity.DefaultZonal(), } } @@ -153,7 +155,10 @@ func ResourceBlockSnapshotCreate(ctx context.Context, d *schema.ResourceData, m } } - d.SetId(zonal.NewIDString(zone, snapshot.ID)) + err = identity.SetZonalIdentity(d, snapshot.Zone, snapshot.ID) + if err != nil { + return diag.FromErr(err) + } _, err = waitForBlockSnapshot(ctx, api, zone, snapshot.ID, d.Timeout(schema.TimeoutCreate)) if err != nil { @@ -194,6 +199,17 @@ func ResourceBlockSnapshotRead(ctx context.Context, d *schema.ResourceData, m an return diag.FromErr(err) } + setSnapshotState(d, snapshot) + + err = identity.SetZonalIdentity(d, snapshot.Zone, snapshot.ID) + if err != nil { + return diag.FromErr(err) + } + + return nil +} + +func setSnapshotState(d *schema.ResourceData, snapshot *block.Snapshot) { _ = d.Set("name", snapshot.Name) _ = d.Set("zone", snapshot.Zone) _ = d.Set("project_id", snapshot.ProjectID) @@ -205,8 +221,6 @@ func ResourceBlockSnapshotRead(ctx context.Context, d *schema.ResourceData, m an } _ = d.Set("tags", snapshot.Tags) - - return nil } func ResourceBlockSnapshotUpdate(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics { diff --git a/internal/services/block/snapshot_data_source.go b/internal/services/block/snapshot_data_source.go index b842092ac7..548ae9314d 100644 --- a/internal/services/block/snapshot_data_source.go +++ b/internal/services/block/snapshot_data_source.go @@ -7,6 +7,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" block "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1" "github.com/scaleway/terraform-provider-scaleway/v2/internal/datasource" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors" "github.com/scaleway/terraform-provider-scaleway/v2/internal/types" "github.com/scaleway/terraform-provider-scaleway/v2/internal/verify" ) @@ -72,14 +73,20 @@ func DataSourceBlockSnapshotRead(ctx context.Context, d *schema.ResourceData, m return diag.FromErr(err) } - diags := ResourceBlockSnapshotRead(ctx, d, m) - if diags != nil { - return append(diags, diag.Errorf("failed to read snapshot state")...) - } + // Wait for the snapshot and use it to set the state + snapshot, err := waitForBlockSnapshot(ctx, api, zone, snapshotID.(string), d.Timeout(schema.TimeoutRead)) + if err != nil { + if httperrors.Is404(err) { + d.SetId("") + + return nil + } - if d.Id() == "" { - return diag.Errorf("snapshot (%s) not found", zoneID) + return diag.FromErr(err) } + // Set the state using the snapshot from waitForBlockSnapshot + setSnapshotState(d, snapshot) + return nil } diff --git a/internal/services/block/volume.go b/internal/services/block/volume.go index 78dc7b76b7..9baab436c9 100644 --- a/internal/services/block/volume.go +++ b/internal/services/block/volume.go @@ -10,6 +10,7 @@ import ( "github.com/scaleway/scaleway-sdk-go/scw" "github.com/scaleway/terraform-provider-scaleway/v2/internal/dsf" "github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/identity" "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality" "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/zonal" "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/account" @@ -38,6 +39,7 @@ func ResourceVolume() *schema.Resource { customDiffSnapshot("snapshot_id"), customDiffCannotShrink("size_in_gb"), ), + Identity: identity.DefaultZonal(), } } @@ -138,7 +140,10 @@ func ResourceBlockVolumeCreate(ctx context.Context, d *schema.ResourceData, m an } } - d.SetId(zonal.NewIDString(zone, volume.ID)) + err = identity.SetZonalIdentity(d, volume.Zone, volume.ID) + if err != nil { + return diag.FromErr(err) + } _, err = waitForBlockVolume(ctx, api.BlockAPI, zone, volume.ID, d.Timeout(schema.TimeoutCreate)) if err != nil { @@ -165,6 +170,17 @@ func ResourceBlockVolumeRead(ctx context.Context, d *schema.ResourceData, m any) return diag.FromErr(err) } + setVolumeState(d, volume, api, zone) + + err = identity.SetZonalIdentity(d, volume.Zone, volume.ID) + if err != nil { + return diag.FromErr(err) + } + + return nil +} + +func setVolumeState(d *schema.ResourceData, volume *block.Volume, api *block.API, zone scw.Zone) { _ = d.Set("name", volume.Name) if volume.Specs != nil { @@ -189,8 +205,6 @@ func ResourceBlockVolumeRead(ctx context.Context, d *schema.ResourceData, m any) } _ = d.Set("snapshot_id", snapshotID) - - return nil } func ResourceBlockVolumeUpdate(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics { diff --git a/internal/services/block/volume_data_source.go b/internal/services/block/volume_data_source.go index 193c98a6f2..6ec754b309 100644 --- a/internal/services/block/volume_data_source.go +++ b/internal/services/block/volume_data_source.go @@ -7,6 +7,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" block "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1" "github.com/scaleway/terraform-provider-scaleway/v2/internal/datasource" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors" "github.com/scaleway/terraform-provider-scaleway/v2/internal/types" "github.com/scaleway/terraform-provider-scaleway/v2/internal/verify" ) @@ -71,14 +72,20 @@ func DataSourceBlockVolumeRead(ctx context.Context, d *schema.ResourceData, m an return diag.FromErr(err) } - diags := ResourceBlockVolumeRead(ctx, d, m) - if diags != nil { - return append(diags, diag.Errorf("failed to read volume state")...) - } + // Wait for the volume and use it to set the state + volume, err := waitForBlockVolume(ctx, api, zone, volumeID.(string), d.Timeout(schema.TimeoutRead)) + if err != nil { + if httperrors.Is404(err) { + d.SetId("") + + return nil + } - if d.Id() == "" { - return diag.Errorf("volume (%s) not found", zoneID) + return diag.FromErr(err) } + // Set the state using the volume from waitForBlockVolume + setVolumeState(d, volume, api, zone) + return nil } diff --git a/provider/sdkv2_test.go b/provider/sdkv2_test.go index 81e9180e83..fcbf8b7b16 100644 --- a/provider/sdkv2_test.go +++ b/provider/sdkv2_test.go @@ -148,8 +148,6 @@ func TestSDKProvider_ResourceIdentityNotEmpty(t *testing.T) { "scaleway_autoscaling_instance_policy", "scaleway_autoscaling_instance_template", "scaleway_baremetal_server", - "scaleway_block_snapshot", - "scaleway_block_volume", "scaleway_cockpit", "scaleway_cockpit_source", "scaleway_cockpit_grafana_user",