From 2e8cf265b31210defa2913945999346e8cf07743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Tue, 9 Sep 2025 12:12:37 +0200 Subject: [PATCH 01/14] chore: add mux to support terraform framework --- go.mod | 1 + go.sum | 2 + internal/acctest/acctest.go | 2 +- internal/acctest/fixtures.go | 2 +- internal/locality/regional/schemas.go | 1 - internal/locality/zonal/schemas.go | 1 - internal/provider/provider_framework.go | 79 +++++++++++++++++++ internal/provider/provider_mux_test.go | 48 +++++++++++ .../{provider.go => provider_sdkv2.go} | 4 +- ...rovider_test.go => provider_sdkv2_test.go} | 8 +- .../testdata/test-mux-server.cassette.yaml | 52 ++++++++++++ internal/services/instance/ip.go | 2 +- internal/services/mnq/sqs_queue_test.go | 2 +- .../scwconfig/scw_config_data_source_test.go | 6 +- main.go | 4 +- 15 files changed, 197 insertions(+), 17 deletions(-) create mode 100644 internal/provider/provider_framework.go create mode 100644 internal/provider/provider_mux_test.go rename internal/provider/{provider.go => provider_sdkv2.go} (99%) rename internal/provider/{provider_test.go => provider_sdkv2_test.go} (92%) create mode 100644 internal/provider/testdata/test-mux-server.cassette.yaml diff --git a/go.mod b/go.mod index 6ee71b6f38..8203429c14 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,7 @@ require ( github.com/hashicorp/go-cty v1.5.0 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-retryablehttp v0.7.8 + github.com/hashicorp/terraform-plugin-framework v1.15.1 github.com/hashicorp/terraform-plugin-go v0.29.0 github.com/hashicorp/terraform-plugin-log v0.9.0 github.com/hashicorp/terraform-plugin-mux v0.21.0 diff --git a/go.sum b/go.sum index 7ce8988b6d..1d7dc96f41 100644 --- a/go.sum +++ b/go.sum @@ -324,6 +324,8 @@ github.com/hashicorp/terraform-json v0.27.2 h1:BwGuzM6iUPqf9JYM/Z4AF1OJ5VVJEEzoK github.com/hashicorp/terraform-json v0.27.2/go.mod h1:GzPLJ1PLdUG5xL6xn1OXWIjteQRT2CNT9o/6A9mi9hE= github.com/hashicorp/terraform-plugin-docs v0.23.0 h1:sipnfD4/9EJBg9zekym+s1H6qmLAKJHhGWBwvN9v/hE= github.com/hashicorp/terraform-plugin-docs v0.23.0/go.mod h1:J4b5AtMRgJlDrwCQz+G4hKABgHY5m56PnsRmdAzBwW8= +github.com/hashicorp/terraform-plugin-framework v1.15.1 h1:2mKDkwb8rlx/tvJTlIcpw0ykcmvdWv+4gY3SIgk8Pq8= +github.com/hashicorp/terraform-plugin-framework v1.15.1/go.mod h1:hxrNI/GY32KPISpWqlCoTLM9JZsGH3CyYlir09bD/fI= github.com/hashicorp/terraform-plugin-go v0.29.0 h1:1nXKl/nSpaYIUBU1IG/EsDOX0vv+9JxAltQyDMpq5mU= github.com/hashicorp/terraform-plugin-go v0.29.0/go.mod h1:vYZbIyvxyy0FWSmDHChCqKvI40cFTDGSb3D8D70i9GM= github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= diff --git a/internal/acctest/acctest.go b/internal/acctest/acctest.go index a74825a84f..6e62db36f5 100644 --- a/internal/acctest/acctest.go +++ b/internal/acctest/acctest.go @@ -66,7 +66,7 @@ func NewTestTools(t *testing.T) *TestTools { Meta: m, ProviderFactories: map[string]func() (*schema.Provider, error){ "scaleway": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: m})(), nil + return provider.SDKProvider(&provider.Config{Meta: m})(), nil }, }, Cleanup: cleanup, diff --git a/internal/acctest/fixtures.go b/internal/acctest/fixtures.go index 3bd53b17c9..0e53111a80 100644 --- a/internal/acctest/fixtures.go +++ b/internal/acctest/fixtures.go @@ -32,7 +32,7 @@ func FakeSideProjectProviders(ctx context.Context, tt *TestTools, project *accou providers := map[string]func() (*schema.Provider, error){ "side": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: metaSide})(), nil + return provider.SDKProvider(&provider.Config{Meta: metaSide})(), nil }, } diff --git a/internal/locality/regional/schemas.go b/internal/locality/regional/schemas.go index 29b5e196ad..4eef2e6bd7 100644 --- a/internal/locality/regional/schemas.go +++ b/internal/locality/regional/schemas.go @@ -31,7 +31,6 @@ func Schema() *schema.Schema { Description: "The region you want to attach the resource to", Optional: true, ForceNew: true, - Computed: true, ValidateDiagFunc: locality.ValidateStringInSliceWithWarning(allRegions(), "region"), } } diff --git a/internal/locality/zonal/schemas.go b/internal/locality/zonal/schemas.go index 279a981e18..7fe3cd5583 100644 --- a/internal/locality/zonal/schemas.go +++ b/internal/locality/zonal/schemas.go @@ -31,7 +31,6 @@ func Schema() *schema.Schema { Description: "The zone you want to attach the resource to", Optional: true, ForceNew: true, - Computed: true, ValidateDiagFunc: locality.ValidateStringInSliceWithWarning(AllZones(), "zone"), } } diff --git a/internal/provider/provider_framework.go b/internal/provider/provider_framework.go new file mode 100644 index 0000000000..5522f0b333 --- /dev/null +++ b/internal/provider/provider_framework.go @@ -0,0 +1,79 @@ +package provider + +import ( + "context" + + "github.com/hashicorp/terraform-plugin-framework/datasource" + "github.com/hashicorp/terraform-plugin-framework/ephemeral" + "github.com/hashicorp/terraform-plugin-framework/provider" + "github.com/hashicorp/terraform-plugin-framework/provider/schema" + "github.com/hashicorp/terraform-plugin-framework/resource" +) + +var _ provider.Provider = &ScalewayProvider{} + +type ScalewayProvider struct{} + +func NewFrameworkProvider() func() provider.Provider { + return func() provider.Provider { + return &ScalewayProvider{} + } +} + +func (p *ScalewayProvider) Metadata(ctx context.Context, req provider.MetadataRequest, resp *provider.MetadataResponse) { + resp.TypeName = "scaleway" +} + +func (p *ScalewayProvider) Schema(ctx context.Context, req provider.SchemaRequest, resp *provider.SchemaResponse) { + resp.Schema = schema.Schema{ + Attributes: map[string]schema.Attribute{ + "access_key": schema.StringAttribute{ + Optional: true, + Description: "The Scaleway access key.", + }, + "secret_key": schema.StringAttribute{ + Optional: true, + Description: "The Scaleway secret Key.", + }, + "profile": schema.StringAttribute{ + Optional: true, + Description: "The Scaleway profile to use.", + }, + "project_id": schema.StringAttribute{ + Optional: true, + Description: "The Scaleway project ID.", + }, + "organization_id": schema.StringAttribute{ + Optional: true, + Description: "The Scaleway organization ID.", + }, + "api_url": schema.StringAttribute{ + Optional: true, + Description: "The Scaleway API URL to use.", + }, + "region": schema.StringAttribute{ + Optional: true, + Description: "The region you want to attach the resource to", + }, + "zone": schema.StringAttribute{ + Description: "The zone you want to attach the resource to", + Optional: true, + }, + }, + } +} + +func (p *ScalewayProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) { +} + +func (p *ScalewayProvider) Resources(ctx context.Context) []func() resource.Resource { + return []func() resource.Resource{} +} + +func (p *ScalewayProvider) EphemeralResources(_ context.Context) []func() ephemeral.EphemeralResource { + return []func() ephemeral.EphemeralResource{} +} + +func (p *ScalewayProvider) DataSources(_ context.Context) []func() datasource.DataSource { + return []func() datasource.DataSource{} +} diff --git a/internal/provider/provider_mux_test.go b/internal/provider/provider_mux_test.go new file mode 100644 index 0000000000..ea3d395189 --- /dev/null +++ b/internal/provider/provider_mux_test.go @@ -0,0 +1,48 @@ +package provider_test + +import ( + "context" + "testing" + + "github.com/hashicorp/terraform-plugin-framework/providerserver" + "github.com/hashicorp/terraform-plugin-go/tfprotov5" + "github.com/hashicorp/terraform-plugin-mux/tf5muxserver" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/provider" + instancechecks "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/instance/testfuncs" +) + +func TestMuxServer(t *testing.T) { + tt := acctest.NewTestTools(t) + defer tt.Cleanup() + + resource.Test(t, resource.TestCase{ + ProtoV5ProviderFactories: map[string]func() (tfprotov5.ProviderServer, error){ + "scaleway": func() (tfprotov5.ProviderServer, error) { + ctx := context.Background() + providers := []func() tfprotov5.ProviderServer{ + providerserver.NewProtocol5(provider.NewFrameworkProvider()()), // terraform-plugin-framework provider + provider.SDKProvider(provider.DefaultConfig())().GRPCProvider, // terraform-plugin-sdk provider + } + + muxServer, err := tf5muxserver.NewMuxServer(ctx, providers...) + + if err != nil { + return nil, err + } + + return muxServer.ProviderServer(), nil + }, + }, + Steps: []resource.TestStep{ + { + Config: ` + resource scaleway_instance_ip main {}`, + Check: resource.ComposeTestCheckFunc( + instancechecks.CheckIPExists(tt, "scaleway_instance_ip.main"), + ), + }, + }, + }) +} diff --git a/internal/provider/provider.go b/internal/provider/provider_sdkv2.go similarity index 99% rename from internal/provider/provider.go rename to internal/provider/provider_sdkv2.go index e7f61941da..87d74c17b8 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider_sdkv2.go @@ -82,8 +82,8 @@ func addBetaResources(provider *schema.Provider) { } } -// Provider returns a terraform.ResourceProvider. -func Provider(config *Config) plugin.ProviderFunc { +// SDKProvider returns a terraform.ResourceProvider. +func SDKProvider(config *Config) plugin.ProviderFunc { return func() *schema.Provider { p := &schema.Provider{ Schema: map[string]*schema.Schema{ diff --git a/internal/provider/provider_test.go b/internal/provider/provider_sdkv2_test.go similarity index 92% rename from internal/provider/provider_test.go rename to internal/provider/provider_sdkv2_test.go index 4e87b505f8..fa05ca5b8b 100644 --- a/internal/provider/provider_test.go +++ b/internal/provider/provider_sdkv2_test.go @@ -40,10 +40,10 @@ func TestAccProvider_InstanceIPZones(t *testing.T) { return map[string]func() (*schema.Provider, error){ "prod": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: metaProd})(), nil + return provider.SDKProvider(&provider.Config{Meta: metaProd})(), nil }, "dev": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: metaDev})(), nil + return provider.SDKProvider(&provider.Config{Meta: metaDev})(), nil }, } }(), @@ -96,10 +96,10 @@ func TestAccProvider_SSHKeys(t *testing.T) { return map[string]func() (*schema.Provider, error){ "prod": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: metaProd})(), nil + return provider.SDKProvider(&provider.Config{Meta: metaProd})(), nil }, "dev": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: metaDev})(), nil + return provider.SDKProvider(&provider.Config{Meta: metaDev})(), nil }, } }(), diff --git a/internal/provider/testdata/test-mux-server.cassette.yaml b/internal/provider/testdata/test-mux-server.cassette.yaml new file mode 100644 index 0000000000..7f12b6e4ae --- /dev/null +++ b/internal/provider/testdata/test-mux-server.cassette.yaml @@ -0,0 +1,52 @@ +--- +version: 2 +interactions: + - id: 0 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: api.scaleway.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + User-Agent: + - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.25.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests + url: https://api.scaleway.com/instance/v1/zones/fr-par-1/ips/e2522f57-cf3c-4fc1-87cd-a2f84530d8d4 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 364 + uncompressed: false + body: '{"ip":{"address":"51.158.121.9","id":"e2522f57-cf3c-4fc1-87cd-a2f84530d8d4","ipam_id":"7e11ad1c-b6f7-4892-9894-cc12f38b3633","organization":"951df375-e094-4d26-97c1-ba548eeb9c42","prefix":null,"project":"951df375-e094-4d26-97c1-ba548eeb9c42","reverse":null,"server":null,"state":"detached","tags":[],"type":"routed_ipv4","zone":"fr-par-1"}}' + headers: + Content-Length: + - "364" + Content-Security-Policy: + - default-src 'none'; frame-ancestors 'none' + Content-Type: + - application/json + Date: + - Tue, 09 Sep 2025 10:10:18 GMT + Server: + - Scaleway API Gateway (fr-par-2;edge01) + Strict-Transport-Security: + - max-age=63072000 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Request-Id: + - 9dfeedbf-2b01-4e7f-9ff6-190c774f9017 + status: 200 OK + code: 200 + duration: 83.337708ms diff --git a/internal/services/instance/ip.go b/internal/services/instance/ip.go index fa372b5f83..5f18955f31 100644 --- a/internal/services/instance/ip.go +++ b/internal/services/instance/ip.go @@ -172,7 +172,7 @@ func ResourceInstanceIPRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("address", address) _ = d.Set("prefix", prefix) - _ = d.Set("zone", zone) + _ = d.Set("zone", res.IP.Zone) _ = d.Set("organization_id", res.IP.Organization) _ = d.Set("project_id", res.IP.Project) _ = d.Set("reverse", res.IP.Reverse) diff --git a/internal/services/mnq/sqs_queue_test.go b/internal/services/mnq/sqs_queue_test.go index e1449c50f3..c7d27fd6c1 100644 --- a/internal/services/mnq/sqs_queue_test.go +++ b/internal/services/mnq/sqs_queue_test.go @@ -127,7 +127,7 @@ func TestAccSQSQueue_DefaultProject(t *testing.T) { return map[string]func() (*schema.Provider, error){ "scaleway": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: metaProd})(), nil + return provider.SDKProvider(&provider.Config{Meta: metaProd})(), nil }, } }(), diff --git a/internal/services/scwconfig/scw_config_data_source_test.go b/internal/services/scwconfig/scw_config_data_source_test.go index e95b24dc39..395b341712 100644 --- a/internal/services/scwconfig/scw_config_data_source_test.go +++ b/internal/services/scwconfig/scw_config_data_source_test.go @@ -40,7 +40,7 @@ func TestAccDataSourceConfig_ActiveProfile(t *testing.T) { return map[string]func() (*schema.Provider, error){ "default": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: metaDefault})(), nil + return provider.SDKProvider(&provider.Config{Meta: metaDefault})(), nil }, } }(), @@ -95,7 +95,7 @@ func TestAccDataSourceConfig_OtherProfile(t *testing.T) { return map[string]func() (*schema.Provider, error){ "other": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: metaOther})(), nil + return provider.SDKProvider(&provider.Config{Meta: metaOther})(), nil }, } }(), @@ -151,7 +151,7 @@ func TestAccDataSourceConfig_MixedProfile(t *testing.T) { return map[string]func() (*schema.Provider, error){ "mixed": func() (*schema.Provider, error) { - return provider.Provider(&provider.Config{Meta: metaMixed})(), nil + return provider.SDKProvider(&provider.Config{Meta: metaMixed})(), nil }, } }(), diff --git a/main.go b/main.go index 108588da61..ded766545f 100644 --- a/main.go +++ b/main.go @@ -25,8 +25,8 @@ func main() { } providers := []func() tfprotov5.ProviderServer{ - // Provider using terraform-plugin-sdk - provider.Provider(provider.DefaultConfig())().GRPCProvider, + // SDKProvider using terraform-plugin-sdk + provider.SDKProvider(provider.DefaultConfig())().GRPCProvider, } muxServer, err := tf5muxserver.NewMuxServer(ctx, providers...) From 54d347355ec60749aa0b0ef9eabac65acfa15df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Tue, 9 Sep 2025 15:55:18 +0200 Subject: [PATCH 02/14] chore: remove computed from locality schemas --- internal/locality/regional/schemas.go | 5 +++++ internal/locality/zonal/schemas.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/internal/locality/regional/schemas.go b/internal/locality/regional/schemas.go index 4eef2e6bd7..e416d7583c 100644 --- a/internal/locality/regional/schemas.go +++ b/internal/locality/regional/schemas.go @@ -32,5 +32,10 @@ func Schema() *schema.Schema { Optional: true, ForceNew: true, ValidateDiagFunc: locality.ValidateStringInSliceWithWarning(allRegions(), "region"), + DiffSuppressFunc: suppressSDKNullAssignment, } } + +func suppressSDKNullAssignment(k, old, new string, d *schema.ResourceData) bool { + return new == "" && old != "" +} diff --git a/internal/locality/zonal/schemas.go b/internal/locality/zonal/schemas.go index 7fe3cd5583..382519038d 100644 --- a/internal/locality/zonal/schemas.go +++ b/internal/locality/zonal/schemas.go @@ -32,5 +32,10 @@ func Schema() *schema.Schema { Optional: true, ForceNew: true, ValidateDiagFunc: locality.ValidateStringInSliceWithWarning(AllZones(), "zone"), + DiffSuppressFunc: suppressSDKNullAssignment, } } + +func suppressSDKNullAssignment(k, old, new string, d *schema.ResourceData) bool { + return new == "" && old != "" +} From d6adc1fcd82682792b70118c9de5a732ae70076e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Tue, 9 Sep 2025 16:38:13 +0200 Subject: [PATCH 03/14] fix locality setup --- internal/services/ipam/ip.go | 2 +- internal/services/rdb/read_replica.go | 4 +--- internal/services/tem/domain_validation.go | 1 + internal/services/vpc/private_network.go | 2 +- internal/services/vpc/vpc.go | 2 +- internal/services/webhosting/webhosting.go | 2 +- 6 files changed, 6 insertions(+), 7 deletions(-) diff --git a/internal/services/ipam/ip.go b/internal/services/ipam/ip.go index af19925ada..d87c8b6074 100644 --- a/internal/services/ipam/ip.go +++ b/internal/services/ipam/ip.go @@ -281,7 +281,7 @@ func ResourceIPAMIPRead(ctx context.Context, d *schema.ResourceData, m any) diag _ = d.Set("created_at", types.FlattenTime(res.CreatedAt)) _ = d.Set("updated_at", types.FlattenTime(res.UpdatedAt)) _ = d.Set("is_ipv6", res.IsIPv6) - _ = d.Set("region", region) + _ = d.Set("region", res.Region.String()) if res.Zone != nil { _ = d.Set("zone", res.Zone.String()) diff --git a/internal/services/rdb/read_replica.go b/internal/services/rdb/read_replica.go index e20f4f3708..9dda2670d8 100644 --- a/internal/services/rdb/read_replica.go +++ b/internal/services/rdb/read_replica.go @@ -224,10 +224,8 @@ func ResourceRdbReadReplicaRead(ctx context.Context, d *schema.ResourceData, m a directAccess, privateNetwork := flattenReadReplicaEndpoints(rr.Endpoints) _ = d.Set("direct_access", directAccess) _ = d.Set("private_network", privateNetwork) - - regionStr := region.String() _ = d.Set("same_zone", rr.SameZone) - _ = d.Set("region", regionStr) + _ = d.Set("region", rr.Region.String()) _ = d.Set("instance_id", regional.NewIDString(region, rr.InstanceID)) return nil diff --git a/internal/services/tem/domain_validation.go b/internal/services/tem/domain_validation.go index 671d2954ee..db1e50b67e 100644 --- a/internal/services/tem/domain_validation.go +++ b/internal/services/tem/domain_validation.go @@ -126,6 +126,7 @@ func ResourceDomainValidationRead(ctx context.Context, d *schema.ResourceData, m } _ = d.Set("validated", domain.Status == "checked") + _ = d.Set("region", domain.Region.String()) return nil } diff --git a/internal/services/vpc/private_network.go b/internal/services/vpc/private_network.go index 07777c5373..ac830c7fb3 100644 --- a/internal/services/vpc/private_network.go +++ b/internal/services/vpc/private_network.go @@ -266,7 +266,7 @@ func ResourceVPCPrivateNetworkRead(ctx context.Context, d *schema.ResourceData, _ = d.Set("updated_at", types.FlattenTime(pn.UpdatedAt)) _ = d.Set("tags", pn.Tags) _ = d.Set("enable_default_route_propagation", pn.DefaultRoutePropagationEnabled) - _ = d.Set("region", region) + _ = d.Set("region", pn.Region.String()) _ = d.Set("is_regional", true) _ = d.Set("zone", zone) diff --git a/internal/services/vpc/vpc.go b/internal/services/vpc/vpc.go index d14d728937..a7394f3ad6 100644 --- a/internal/services/vpc/vpc.go +++ b/internal/services/vpc/vpc.go @@ -142,7 +142,7 @@ func ResourceVPCRead(ctx context.Context, d *schema.ResourceData, m any) diag.Di _ = d.Set("is_default", res.IsDefault) _ = d.Set("enable_routing", res.RoutingEnabled) _ = d.Set("enable_custom_routes_propagation", res.CustomRoutesPropagationEnabled) - _ = d.Set("region", region) + _ = d.Set("region", res.Region.String()) if len(res.Tags) > 0 { _ = d.Set("tags", res.Tags) diff --git a/internal/services/webhosting/webhosting.go b/internal/services/webhosting/webhosting.go index c390324b2b..daf18cbb59 100644 --- a/internal/services/webhosting/webhosting.go +++ b/internal/services/webhosting/webhosting.go @@ -325,7 +325,7 @@ func resourceWebhostingRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("dns_status", webhostingResponse.DNSStatus.String()) //nolint:staticcheck _ = d.Set("cpanel_urls", flattenHostingCpanelUrls(webhostingResponse.Platform.ControlPanel.URLs)) _ = d.Set("username", webhostingResponse.User.Username) - _ = d.Set("region", string(region)) + _ = d.Set("region", webhostingResponse.Region.String()) _ = d.Set("organization_id", "") _ = d.Set("project_id", webhostingResponse.ProjectID) From 8f3cb02d36f436818646655b636de65080030d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Tue, 9 Sep 2025 18:34:48 +0200 Subject: [PATCH 04/14] fix code --- internal/locality/dsf.go | 7 +++++++ internal/locality/regional/schemas.go | 6 +----- internal/locality/zonal/schemas.go | 6 +----- 3 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 internal/locality/dsf.go diff --git a/internal/locality/dsf.go b/internal/locality/dsf.go new file mode 100644 index 0000000000..70fb7a2fd0 --- /dev/null +++ b/internal/locality/dsf.go @@ -0,0 +1,7 @@ +package locality + +import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + +func SuppressSDKNullAssignment(k, old, new string, d *schema.ResourceData) bool { + return (new == "" && old != "") || (new != "" && old == "") +} diff --git a/internal/locality/regional/schemas.go b/internal/locality/regional/schemas.go index e416d7583c..aa5426c35c 100644 --- a/internal/locality/regional/schemas.go +++ b/internal/locality/regional/schemas.go @@ -32,10 +32,6 @@ func Schema() *schema.Schema { Optional: true, ForceNew: true, ValidateDiagFunc: locality.ValidateStringInSliceWithWarning(allRegions(), "region"), - DiffSuppressFunc: suppressSDKNullAssignment, + DiffSuppressFunc: locality.SuppressSDKNullAssignment, } } - -func suppressSDKNullAssignment(k, old, new string, d *schema.ResourceData) bool { - return new == "" && old != "" -} diff --git a/internal/locality/zonal/schemas.go b/internal/locality/zonal/schemas.go index 382519038d..dfcf33c3b7 100644 --- a/internal/locality/zonal/schemas.go +++ b/internal/locality/zonal/schemas.go @@ -32,10 +32,6 @@ func Schema() *schema.Schema { Optional: true, ForceNew: true, ValidateDiagFunc: locality.ValidateStringInSliceWithWarning(AllZones(), "zone"), - DiffSuppressFunc: suppressSDKNullAssignment, + DiffSuppressFunc: locality.SuppressSDKNullAssignment, } } - -func suppressSDKNullAssignment(k, old, new string, d *schema.ResourceData) bool { - return new == "" && old != "" -} From cb1ab68e0fb91b6c09e54836526174ef14962983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Tue, 9 Sep 2025 18:56:09 +0200 Subject: [PATCH 05/14] Remove useless changes --- internal/locality/dsf.go | 1 + .../testdata/test-mux-server.cassette.yaml | 52 ------------------- internal/services/instance/ip.go | 2 +- internal/services/ipam/ip.go | 2 +- internal/services/rdb/read_replica.go | 4 +- internal/services/tem/domain_validation.go | 1 - internal/services/vpc/private_network.go | 2 +- internal/services/vpc/vpc.go | 2 +- internal/services/webhosting/webhosting.go | 2 +- 9 files changed, 9 insertions(+), 59 deletions(-) delete mode 100644 internal/provider/testdata/test-mux-server.cassette.yaml diff --git a/internal/locality/dsf.go b/internal/locality/dsf.go index 70fb7a2fd0..abb4771e28 100644 --- a/internal/locality/dsf.go +++ b/internal/locality/dsf.go @@ -2,6 +2,7 @@ package locality import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +// SuppressSDKNullAssignment aims to remove apply inconsistency on SDKv2 based resources func SuppressSDKNullAssignment(k, old, new string, d *schema.ResourceData) bool { return (new == "" && old != "") || (new != "" && old == "") } diff --git a/internal/provider/testdata/test-mux-server.cassette.yaml b/internal/provider/testdata/test-mux-server.cassette.yaml deleted file mode 100644 index 7f12b6e4ae..0000000000 --- a/internal/provider/testdata/test-mux-server.cassette.yaml +++ /dev/null @@ -1,52 +0,0 @@ ---- -version: 2 -interactions: - - id: 0 - request: - proto: HTTP/1.1 - proto_major: 1 - proto_minor: 1 - content_length: 0 - transfer_encoding: [] - trailer: {} - host: api.scaleway.com - remote_addr: "" - request_uri: "" - body: "" - form: {} - headers: - User-Agent: - - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.25.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests - url: https://api.scaleway.com/instance/v1/zones/fr-par-1/ips/e2522f57-cf3c-4fc1-87cd-a2f84530d8d4 - method: GET - response: - proto: HTTP/2.0 - proto_major: 2 - proto_minor: 0 - transfer_encoding: [] - trailer: {} - content_length: 364 - uncompressed: false - body: '{"ip":{"address":"51.158.121.9","id":"e2522f57-cf3c-4fc1-87cd-a2f84530d8d4","ipam_id":"7e11ad1c-b6f7-4892-9894-cc12f38b3633","organization":"951df375-e094-4d26-97c1-ba548eeb9c42","prefix":null,"project":"951df375-e094-4d26-97c1-ba548eeb9c42","reverse":null,"server":null,"state":"detached","tags":[],"type":"routed_ipv4","zone":"fr-par-1"}}' - headers: - Content-Length: - - "364" - Content-Security-Policy: - - default-src 'none'; frame-ancestors 'none' - Content-Type: - - application/json - Date: - - Tue, 09 Sep 2025 10:10:18 GMT - Server: - - Scaleway API Gateway (fr-par-2;edge01) - Strict-Transport-Security: - - max-age=63072000 - X-Content-Type-Options: - - nosniff - X-Frame-Options: - - DENY - X-Request-Id: - - 9dfeedbf-2b01-4e7f-9ff6-190c774f9017 - status: 200 OK - code: 200 - duration: 83.337708ms diff --git a/internal/services/instance/ip.go b/internal/services/instance/ip.go index 5f18955f31..fa372b5f83 100644 --- a/internal/services/instance/ip.go +++ b/internal/services/instance/ip.go @@ -172,7 +172,7 @@ func ResourceInstanceIPRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("address", address) _ = d.Set("prefix", prefix) - _ = d.Set("zone", res.IP.Zone) + _ = d.Set("zone", zone) _ = d.Set("organization_id", res.IP.Organization) _ = d.Set("project_id", res.IP.Project) _ = d.Set("reverse", res.IP.Reverse) diff --git a/internal/services/ipam/ip.go b/internal/services/ipam/ip.go index d87c8b6074..af19925ada 100644 --- a/internal/services/ipam/ip.go +++ b/internal/services/ipam/ip.go @@ -281,7 +281,7 @@ func ResourceIPAMIPRead(ctx context.Context, d *schema.ResourceData, m any) diag _ = d.Set("created_at", types.FlattenTime(res.CreatedAt)) _ = d.Set("updated_at", types.FlattenTime(res.UpdatedAt)) _ = d.Set("is_ipv6", res.IsIPv6) - _ = d.Set("region", res.Region.String()) + _ = d.Set("region", region) if res.Zone != nil { _ = d.Set("zone", res.Zone.String()) diff --git a/internal/services/rdb/read_replica.go b/internal/services/rdb/read_replica.go index 9dda2670d8..e20f4f3708 100644 --- a/internal/services/rdb/read_replica.go +++ b/internal/services/rdb/read_replica.go @@ -224,8 +224,10 @@ func ResourceRdbReadReplicaRead(ctx context.Context, d *schema.ResourceData, m a directAccess, privateNetwork := flattenReadReplicaEndpoints(rr.Endpoints) _ = d.Set("direct_access", directAccess) _ = d.Set("private_network", privateNetwork) + + regionStr := region.String() _ = d.Set("same_zone", rr.SameZone) - _ = d.Set("region", rr.Region.String()) + _ = d.Set("region", regionStr) _ = d.Set("instance_id", regional.NewIDString(region, rr.InstanceID)) return nil diff --git a/internal/services/tem/domain_validation.go b/internal/services/tem/domain_validation.go index db1e50b67e..671d2954ee 100644 --- a/internal/services/tem/domain_validation.go +++ b/internal/services/tem/domain_validation.go @@ -126,7 +126,6 @@ func ResourceDomainValidationRead(ctx context.Context, d *schema.ResourceData, m } _ = d.Set("validated", domain.Status == "checked") - _ = d.Set("region", domain.Region.String()) return nil } diff --git a/internal/services/vpc/private_network.go b/internal/services/vpc/private_network.go index ac830c7fb3..07777c5373 100644 --- a/internal/services/vpc/private_network.go +++ b/internal/services/vpc/private_network.go @@ -266,7 +266,7 @@ func ResourceVPCPrivateNetworkRead(ctx context.Context, d *schema.ResourceData, _ = d.Set("updated_at", types.FlattenTime(pn.UpdatedAt)) _ = d.Set("tags", pn.Tags) _ = d.Set("enable_default_route_propagation", pn.DefaultRoutePropagationEnabled) - _ = d.Set("region", pn.Region.String()) + _ = d.Set("region", region) _ = d.Set("is_regional", true) _ = d.Set("zone", zone) diff --git a/internal/services/vpc/vpc.go b/internal/services/vpc/vpc.go index a7394f3ad6..d14d728937 100644 --- a/internal/services/vpc/vpc.go +++ b/internal/services/vpc/vpc.go @@ -142,7 +142,7 @@ func ResourceVPCRead(ctx context.Context, d *schema.ResourceData, m any) diag.Di _ = d.Set("is_default", res.IsDefault) _ = d.Set("enable_routing", res.RoutingEnabled) _ = d.Set("enable_custom_routes_propagation", res.CustomRoutesPropagationEnabled) - _ = d.Set("region", res.Region.String()) + _ = d.Set("region", region) if len(res.Tags) > 0 { _ = d.Set("tags", res.Tags) diff --git a/internal/services/webhosting/webhosting.go b/internal/services/webhosting/webhosting.go index daf18cbb59..c390324b2b 100644 --- a/internal/services/webhosting/webhosting.go +++ b/internal/services/webhosting/webhosting.go @@ -325,7 +325,7 @@ func resourceWebhostingRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("dns_status", webhostingResponse.DNSStatus.String()) //nolint:staticcheck _ = d.Set("cpanel_urls", flattenHostingCpanelUrls(webhostingResponse.Platform.ControlPanel.URLs)) _ = d.Set("username", webhostingResponse.User.Username) - _ = d.Set("region", webhostingResponse.Region.String()) + _ = d.Set("region", string(region)) _ = d.Set("organization_id", "") _ = d.Set("project_id", webhostingResponse.ProjectID) From 08b459898c026307578fa995af232d970b9b7d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Tue, 9 Sep 2025 19:10:21 +0200 Subject: [PATCH 06/14] Fix linter --- internal/locality/dsf.go | 4 ++-- internal/provider/provider_mux_test.go | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/internal/locality/dsf.go b/internal/locality/dsf.go index abb4771e28..37d59c5835 100644 --- a/internal/locality/dsf.go +++ b/internal/locality/dsf.go @@ -3,6 +3,6 @@ package locality import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" // SuppressSDKNullAssignment aims to remove apply inconsistency on SDKv2 based resources -func SuppressSDKNullAssignment(k, old, new string, d *schema.ResourceData) bool { - return (new == "" && old != "") || (new != "" && old == "") +func SuppressSDKNullAssignment(k, oldValue, newValue string, d *schema.ResourceData) bool { + return (newValue == "" && oldValue != "") || (newValue != "" && oldValue == "") } diff --git a/internal/provider/provider_mux_test.go b/internal/provider/provider_mux_test.go index ea3d395189..663376547b 100644 --- a/internal/provider/provider_mux_test.go +++ b/internal/provider/provider_mux_test.go @@ -27,7 +27,6 @@ func TestMuxServer(t *testing.T) { } muxServer, err := tf5muxserver.NewMuxServer(ctx, providers...) - if err != nil { return nil, err } From d96a960a02489f6209bcc9d033ee7ebfd654a1a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Wed, 17 Sep 2025 15:50:36 +0200 Subject: [PATCH 07/14] bump framework version --- go.mod | 23 ++++----- go.sum | 62 ++++++++++++------------- internal/provider/provider_framework.go | 14 +++++- 3 files changed, 51 insertions(+), 48 deletions(-) diff --git a/go.mod b/go.mod index 8203429c14..7f9e91afff 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/hashicorp/go-cty v1.5.0 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/go-retryablehttp v0.7.8 - github.com/hashicorp/terraform-plugin-framework v1.15.1 + github.com/hashicorp/terraform-plugin-framework v1.16.0 github.com/hashicorp/terraform-plugin-go v0.29.0 github.com/hashicorp/terraform-plugin-log v0.9.0 github.com/hashicorp/terraform-plugin-mux v0.21.0 @@ -98,8 +98,8 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl/v2 v2.24.0 // indirect github.com/hashicorp/logutils v1.0.0 // indirect - github.com/hashicorp/terraform-exec v0.24.0 // indirect - github.com/hashicorp/terraform-json v0.27.2 // indirect + github.com/hashicorp/terraform-exec v0.23.1 // indirect + github.com/hashicorp/terraform-json v0.27.1 // indirect github.com/hashicorp/terraform-plugin-docs v0.23.0 // indirect github.com/hashicorp/terraform-registry-address v0.4.0 // indirect github.com/hashicorp/terraform-svchost v0.1.1 // indirect @@ -113,7 +113,7 @@ require ( github.com/magiconair/properties v1.8.6 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mitchellh/cli v1.1.5 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect @@ -134,7 +134,6 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/posener/complete v1.2.3 // indirect - github.com/rivo/uniseg v0.4.7 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.9.2 // indirect @@ -148,29 +147,27 @@ require ( github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - github.com/yuin/goldmark v1.7.13 // indirect + github.com/yuin/goldmark v1.7.7 // indirect github.com/yuin/goldmark-meta v1.1.0 // indirect github.com/zclconf/go-cty v1.17.0 // indirect go.abhg.dev/goldmark/frontmatter v0.2.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect go.opentelemetry.io/otel v1.38.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect go.opentelemetry.io/otel/metric v1.38.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect go.opentelemetry.io/otel/trace v1.38.0 // indirect - golang.org/x/exp v0.0.0-20250911091902-df9299821621 // indirect + golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect golang.org/x/mod v0.28.0 // indirect golang.org/x/net v0.44.0 // indirect golang.org/x/sync v0.17.0 // indirect golang.org/x/sys v0.36.0 // indirect golang.org/x/term v0.35.0 // indirect golang.org/x/text v0.29.0 // indirect - golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.37.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect google.golang.org/grpc v1.75.1 // indirect google.golang.org/protobuf v1.36.9 // indirect gopkg.in/ini.v1 v1.66.4 // indirect diff --git a/go.sum b/go.sum index 1d7dc96f41..87cdb3105b 100644 --- a/go.sum +++ b/go.sum @@ -128,8 +128,8 @@ github.com/bmatcuk/doublestar/v4 v4.9.1 h1:X8jg9rRZmJd4yRy7ZeNDRnM+T3ZfHv15JiBJ/ github.com/bmatcuk/doublestar/v4 v4.9.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -274,8 +274,8 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.5.1 h1:Vjg2VEcdHpwq+oY63s/ksHrgJYCTo0bwWvmmYWdE9fQ= github.com/gookit/color v1.5.1/go.mod h1:wZFzea4X8qN6vHOSP2apMb4/+w/orMznEzYsIHPaqKM= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= github.com/hashicorp/aws-sdk-go-base v1.1.0 h1:27urM3JAp6v+Oj/Ea5ULZwuFPK9cO1RUdEpV+rNdSAc= github.com/hashicorp/aws-sdk-go-base v1.1.0/go.mod h1:2fRjWDv3jJBeN6mVWFHV6hFTNeFBx2gpDLQaZNxUVAY= github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.66 h1:HA6blfR0h6kGnw4oJ92tZzghubreIkWbQJ4NVNqS688= @@ -318,14 +318,14 @@ github.com/hashicorp/hcl/v2 v2.24.0 h1:2QJdZ454DSsYGoaE6QheQZjtKZSUs9Nh2izTWiwQx github.com/hashicorp/hcl/v2 v2.24.0/go.mod h1:oGoO1FIQYfn/AgyOhlg9qLC6/nOJPX3qGbkZpYAcqfM= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/terraform-exec v0.24.0 h1:mL0xlk9H5g2bn0pPF6JQZk5YlByqSqrO5VoaNtAf8OE= -github.com/hashicorp/terraform-exec v0.24.0/go.mod h1:lluc/rDYfAhYdslLJQg3J0oDqo88oGQAdHR+wDqFvo4= -github.com/hashicorp/terraform-json v0.27.2 h1:BwGuzM6iUPqf9JYM/Z4AF1OJ5VVJEEzoKST/tRDBJKU= -github.com/hashicorp/terraform-json v0.27.2/go.mod h1:GzPLJ1PLdUG5xL6xn1OXWIjteQRT2CNT9o/6A9mi9hE= +github.com/hashicorp/terraform-exec v0.23.1 h1:diK5NSSDXDKqHEOIQefBMu9ny+FhzwlwV0xgUTB7VTo= +github.com/hashicorp/terraform-exec v0.23.1/go.mod h1:e4ZEg9BJDRaSalGm2z8vvrPONt0XWG0/tXpmzYTf+dM= +github.com/hashicorp/terraform-json v0.27.1 h1:zWhEracxJW6lcjt/JvximOYyc12pS/gaKSy/wzzE7nY= +github.com/hashicorp/terraform-json v0.27.1/go.mod h1:GzPLJ1PLdUG5xL6xn1OXWIjteQRT2CNT9o/6A9mi9hE= github.com/hashicorp/terraform-plugin-docs v0.23.0 h1:sipnfD4/9EJBg9zekym+s1H6qmLAKJHhGWBwvN9v/hE= github.com/hashicorp/terraform-plugin-docs v0.23.0/go.mod h1:J4b5AtMRgJlDrwCQz+G4hKABgHY5m56PnsRmdAzBwW8= -github.com/hashicorp/terraform-plugin-framework v1.15.1 h1:2mKDkwb8rlx/tvJTlIcpw0ykcmvdWv+4gY3SIgk8Pq8= -github.com/hashicorp/terraform-plugin-framework v1.15.1/go.mod h1:hxrNI/GY32KPISpWqlCoTLM9JZsGH3CyYlir09bD/fI= +github.com/hashicorp/terraform-plugin-framework v1.16.0 h1:tP0f+yJg0Z672e7levixDe5EpWwrTrNryPM9kDMYIpE= +github.com/hashicorp/terraform-plugin-framework v1.16.0/go.mod h1:0xFOxLy5lRzDTayc4dzK/FakIgBhNf/lC4499R9cV4Y= github.com/hashicorp/terraform-plugin-go v0.29.0 h1:1nXKl/nSpaYIUBU1IG/EsDOX0vv+9JxAltQyDMpq5mU= github.com/hashicorp/terraform-plugin-go v0.29.0/go.mod h1:vYZbIyvxyy0FWSmDHChCqKvI40cFTDGSb3D8D70i9GM= github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= @@ -391,8 +391,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -449,9 +449,6 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -511,8 +508,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.13 h1:GPddIs617DnBLFFVJFgpo1aBfe/4xcvMc3SB5t/D0pA= -github.com/yuin/goldmark v1.7.13/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= +github.com/yuin/goldmark v1.7.7 h1:5m9rrB1sW3JUMToKFQfb+FGt1U7r57IHu5GrYrG2nqU= +github.com/yuin/goldmark v1.7.7/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-meta v1.1.0 h1:pWw+JLHGZe8Rk0EGsMVssiNb/AaPMHfSRszZeUeiOUc= github.com/yuin/goldmark-meta v1.1.0/go.mod h1:U4spWENafuA7Zyg+Lj5RqK/MF+ovMYtBvXi1lBb2VP0= github.com/zclconf/go-cty v1.17.0 h1:seZvECve6XX4tmnvRzWtJNHdscMtYEx5R7bnnVyd/d0= @@ -529,14 +526,14 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0 h1:sv9kVfal0MK0wBMCOGr+HeJm9v803BkJxGrk2au7j08= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.47.0/go.mod h1:SK2UL73Zy1quvRPonmOmRDiWk1KBV3LyIeeIxcEApWw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0 h1:9M3+rhx7kZCIQQhQRYaZCdNu1V73tm4TvXs2ntl98C4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.22.0/go.mod h1:noq80iT8rrHP1SfybmPiRGc9dc5M8RPmGvtwo7Oo7tc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0 h1:FyjCyI9jVEfqhUh2MoSkmolPjfh5fp2hnV0b0irxH4Q= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= @@ -545,8 +542,8 @@ go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6 go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= -go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= -go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= +go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -570,8 +567,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250911091902-df9299821621 h1:2id6c1/gto0kaHYyrixvknJ8tUK/Qs5IsmBtrc+FtgU= -golang.org/x/exp v0.0.0-20250911091902-df9299821621/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= +golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -729,9 +726,8 @@ golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -855,10 +851,10 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY= +google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/internal/provider/provider_framework.go b/internal/provider/provider_framework.go index 5522f0b333..c58df6a2cf 100644 --- a/internal/provider/provider_framework.go +++ b/internal/provider/provider_framework.go @@ -3,8 +3,10 @@ package provider import ( "context" + "github.com/hashicorp/terraform-plugin-framework/action" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/ephemeral" + "github.com/hashicorp/terraform-plugin-framework/list" "github.com/hashicorp/terraform-plugin-framework/provider" "github.com/hashicorp/terraform-plugin-framework/provider/schema" "github.com/hashicorp/terraform-plugin-framework/resource" @@ -20,11 +22,11 @@ func NewFrameworkProvider() func() provider.Provider { } } -func (p *ScalewayProvider) Metadata(ctx context.Context, req provider.MetadataRequest, resp *provider.MetadataResponse) { +func (p *ScalewayProvider) Metadata(_ context.Context, _ provider.MetadataRequest, resp *provider.MetadataResponse) { resp.TypeName = "scaleway" } -func (p *ScalewayProvider) Schema(ctx context.Context, req provider.SchemaRequest, resp *provider.SchemaResponse) { +func (p *ScalewayProvider) Schema(_ context.Context, _ provider.SchemaRequest, resp *provider.SchemaResponse) { resp.Schema = schema.Schema{ Attributes: map[string]schema.Attribute{ "access_key": schema.StringAttribute{ @@ -77,3 +79,11 @@ func (p *ScalewayProvider) EphemeralResources(_ context.Context) []func() epheme func (p *ScalewayProvider) DataSources(_ context.Context) []func() datasource.DataSource { return []func() datasource.DataSource{} } + +func (p *ScalewayProvider) Actions(_ context.Context) []func() action.Action { + return []func() action.Action{} +} + +func (p *ScalewayProvider) ListResources(_ context.Context) []func() list.ListResource { + return []func() list.ListResource{} +} From 1aa3a8e174590d312c2cd60d669d5e53bcb14e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Wed, 17 Sep 2025 19:03:28 +0200 Subject: [PATCH 08/14] Add RawConfigAccess guess --- internal/meta/extractors.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/internal/meta/extractors.go b/internal/meta/extractors.go index ce66771dd9..00c12d8b2b 100644 --- a/internal/meta/extractors.go +++ b/internal/meta/extractors.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/hashicorp/go-cty/cty" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/scaleway/scaleway-sdk-go/scw" "github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional" @@ -18,12 +19,25 @@ type terraformResourceData interface { GetOk(string) (any, bool) Get(string) any Id() string + GetRawConfig() cty.Value + GetRawConfigAt(valPath cty.Path) (cty.Value, diag.Diagnostics) } +var ( + _ terraformResourceData = (*schema.ResourceData)(nil) + _ terraformResourceData = (*schema.ResourceDiff)(nil) +) + // ExtractZone will try to guess the zone from the following: // - zone field of the resource data // - default zone from config func ExtractZone(d terraformResourceData, m any) (scw.Zone, error) { + rawConfig, err := d.GetRawConfigAt(cty.GetAttrPath("zone")) + if err == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { + if rawConfig.AsString() != "" { + return scw.ParseZone(rawConfig.AsString()) + } + } rawZone, exist := d.GetOk("zone") if exist { return scw.ParseZone(rawZone.(string)) @@ -41,6 +55,12 @@ func ExtractZone(d terraformResourceData, m any) (scw.Zone, error) { // - region field of the resource data // - default region from config func ExtractRegion(d terraformResourceData, m any) (scw.Region, error) { + rawConfig, err := d.GetRawConfigAt(cty.GetAttrPath("region")) + if err == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { + if rawConfig.AsString() != "" { + return scw.ParseRegion(rawConfig.AsString()) + } + } rawRegion, exist := d.GetOk("region") if exist { return scw.ParseRegion(rawRegion.(string)) @@ -59,6 +79,12 @@ func ExtractRegion(d terraformResourceData, m any) (scw.Region, error) { // - default region given in argument // - default region from config func ExtractRegionWithDefault(d terraformResourceData, m any, defaultRegion scw.Region) (scw.Region, error) { + rawConfig, err := d.GetRawConfigAt(cty.GetAttrPath("region")) + if err == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { + if rawConfig.AsString() != "" { + return scw.ParseRegion(rawConfig.AsString()) + } + } rawRegion, exist := d.GetOk("region") if exist { return scw.ParseRegion(rawRegion.(string)) From 062d02ad6dccca67be7574e2690032e94cbf0922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Wed, 17 Sep 2025 19:34:26 +0200 Subject: [PATCH 09/14] Fix webhosting --- internal/services/webhosting/webhosting.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/internal/services/webhosting/webhosting.go b/internal/services/webhosting/webhosting.go index c390324b2b..039221945f 100644 --- a/internal/services/webhosting/webhosting.go +++ b/internal/services/webhosting/webhosting.go @@ -230,8 +230,6 @@ func ResourceWebhosting() *schema.Resource { return nil }, - EnableLegacyTypeSystemPlanErrors: true, - EnableLegacyTypeSystemApplyErrors: true, } } @@ -325,7 +323,7 @@ func resourceWebhostingRead(ctx context.Context, d *schema.ResourceData, m any) _ = d.Set("dns_status", webhostingResponse.DNSStatus.String()) //nolint:staticcheck _ = d.Set("cpanel_urls", flattenHostingCpanelUrls(webhostingResponse.Platform.ControlPanel.URLs)) _ = d.Set("username", webhostingResponse.User.Username) - _ = d.Set("region", string(region)) + _ = d.Set("region", webhostingResponse.Region) _ = d.Set("organization_id", "") _ = d.Set("project_id", webhostingResponse.ProjectID) From bd4b8f4e544ba24789eb220e3e67ecce8ca80b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Wed, 17 Sep 2025 19:42:16 +0200 Subject: [PATCH 10/14] Fix some tests --- internal/meta/extractors.go | 3 ++ .../testdata/test-mux-server.cassette.yaml | 52 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 internal/provider/testdata/test-mux-server.cassette.yaml diff --git a/internal/meta/extractors.go b/internal/meta/extractors.go index 00c12d8b2b..01991a681f 100644 --- a/internal/meta/extractors.go +++ b/internal/meta/extractors.go @@ -38,6 +38,7 @@ func ExtractZone(d terraformResourceData, m any) (scw.Zone, error) { return scw.ParseZone(rawConfig.AsString()) } } + rawZone, exist := d.GetOk("zone") if exist { return scw.ParseZone(rawZone.(string)) @@ -61,6 +62,7 @@ func ExtractRegion(d terraformResourceData, m any) (scw.Region, error) { return scw.ParseRegion(rawConfig.AsString()) } } + rawRegion, exist := d.GetOk("region") if exist { return scw.ParseRegion(rawRegion.(string)) @@ -85,6 +87,7 @@ func ExtractRegionWithDefault(d terraformResourceData, m any, defaultRegion scw. return scw.ParseRegion(rawConfig.AsString()) } } + rawRegion, exist := d.GetOk("region") if exist { return scw.ParseRegion(rawRegion.(string)) diff --git a/internal/provider/testdata/test-mux-server.cassette.yaml b/internal/provider/testdata/test-mux-server.cassette.yaml new file mode 100644 index 0000000000..779b4b5a3c --- /dev/null +++ b/internal/provider/testdata/test-mux-server.cassette.yaml @@ -0,0 +1,52 @@ +--- +version: 2 +interactions: + - id: 0 + request: + proto: HTTP/1.1 + proto_major: 1 + proto_minor: 1 + content_length: 0 + transfer_encoding: [] + trailer: {} + host: api.scaleway.com + remote_addr: "" + request_uri: "" + body: "" + form: {} + headers: + User-Agent: + - scaleway-sdk-go/v1.0.0-beta.7+dev (go1.25.1; darwin; arm64) terraform-provider/develop terraform/terraform-tests + url: https://api.scaleway.com/instance/v1/zones/fr-par-1/ips/65a60f6b-fa89-4e49-bc25-fced17fa3df3 + method: GET + response: + proto: HTTP/2.0 + proto_major: 2 + proto_minor: 0 + transfer_encoding: [] + trailer: {} + content_length: 365 + uncompressed: false + body: '{"ip":{"address":"51.15.236.240","id":"65a60f6b-fa89-4e49-bc25-fced17fa3df3","ipam_id":"c6282852-e659-4072-826d-37f253693648","organization":"105bdce1-64c0-48ab-899d-868455867ecf","prefix":null,"project":"105bdce1-64c0-48ab-899d-868455867ecf","reverse":null,"server":null,"state":"detached","tags":[],"type":"routed_ipv4","zone":"fr-par-1"}}' + headers: + Content-Length: + - "365" + Content-Security-Policy: + - default-src 'none'; frame-ancestors 'none' + Content-Type: + - application/json + Date: + - Wed, 17 Sep 2025 17:41:41 GMT + Server: + - Scaleway API Gateway (fr-par-2;edge02) + Strict-Transport-Security: + - max-age=63072000 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - DENY + X-Request-Id: + - 218c4ae8-78af-4ffa-a81a-f6a58d7a766b + status: 200 OK + code: 200 + duration: 149.750417ms From 1cf421d3b2439bab4e9e78b46755b9b0d5d9c4b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Thu, 18 Sep 2025 11:23:04 +0200 Subject: [PATCH 11/14] fix ipam test --- internal/services/ipam/ips_data_source.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/services/ipam/ips_data_source.go b/internal/services/ipam/ips_data_source.go index 442773ae23..c487e291e8 100644 --- a/internal/services/ipam/ips_data_source.go +++ b/internal/services/ipam/ips_data_source.go @@ -158,7 +158,6 @@ func DataSourceIPAMIPsRead(ctx context.Context, d *schema.ResourceData, m any) d req := &ipam.ListIPsRequest{ Region: region, ProjectID: types.ExpandStringPtr(d.Get("project_id")), - Zonal: types.ExpandStringPtr(d.Get("zonal")), PrivateNetworkID: types.ExpandStringPtr(d.Get("private_network_id")), ResourceID: types.ExpandStringPtr(expandLastID(d.Get("resource.0.id"))), ResourceType: ipam.ResourceType(d.Get("resource.0.type").(string)), @@ -168,6 +167,13 @@ func DataSourceIPAMIPsRead(ctx context.Context, d *schema.ResourceData, m any) d OrganizationID: types.ExpandStringPtr(d.Get("organization_id")), } + rawConfig, diagError := d.GetRawConfigAt(cty.GetAttrPath("zonal")) + if diagError == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { + if rawConfig.AsString() != "" { + req.Zonal = types.ExpandStringPtr(rawConfig.AsString()) + } + } + attached, attachedExists := d.GetOk("attached") if attachedExists { req.Attached = types.ExpandBoolPtr(attached) From de93bdf0295c5198c2191f96f12d95c5c534454c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Thu, 18 Sep 2025 14:24:48 +0200 Subject: [PATCH 12/14] Fix test --- internal/services/k8s/pool.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/internal/services/k8s/pool.go b/internal/services/k8s/pool.go index 024cb95559..0ac64f2a1d 100644 --- a/internal/services/k8s/pool.go +++ b/internal/services/k8s/pool.go @@ -5,6 +5,7 @@ import ( "fmt" "time" + "github.com/hashicorp/go-cty/cty" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/scaleway/scaleway-sdk-go/api/k8s/v1" @@ -286,12 +287,18 @@ func ResourceK8SPoolCreate(ctx context.Context, d *schema.ResourceData, m any) d PublicIPDisabled: d.Get("public_ip_disabled").(bool), } - if v, ok := d.GetOk("region"); ok { - req.Region = scw.Region(v.(string)) + rawConfig, diags := d.GetRawConfigAt(cty.GetAttrPath("region")) + if diags == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { + if rawConfig.AsString() != "" { + req.Region = scw.Region(rawConfig.AsString()) + } } - if v, ok := d.GetOk("zone"); ok { - req.Zone = scw.Zone(v.(string)) + rawConfig, diags = d.GetRawConfigAt(cty.GetAttrPath("zone")) + if diags == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { + if rawConfig.AsString() != "" { + req.Zone = scw.Zone(rawConfig.AsString()) + } } if placementGroupID, ok := d.GetOk("placement_group_id"); ok { From 56294ddf5da0454dfab7dcf3179ed699e0b8f0e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Thu, 18 Sep 2025 17:45:25 +0200 Subject: [PATCH 13/14] Factorize function --- internal/meta/extractors.go | 34 +++++++++++++---------- internal/services/ipam/ips_data_source.go | 9 +++--- internal/services/k8s/pool.go | 18 +++++------- 3 files changed, 30 insertions(+), 31 deletions(-) diff --git a/internal/meta/extractors.go b/internal/meta/extractors.go index 01991a681f..da969b67c0 100644 --- a/internal/meta/extractors.go +++ b/internal/meta/extractors.go @@ -28,15 +28,23 @@ var ( _ terraformResourceData = (*schema.ResourceDiff)(nil) ) +func ExtractRawConfigString(d terraformResourceData, field string) (string, diag.Diagnostics) { + rawConfig, diags := d.GetRawConfigAt(cty.GetAttrPath(field)) + if diags == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { + if rawConfig.AsString() != "" { + return rawConfig.AsString(), nil + } + } + return "", diags +} + // ExtractZone will try to guess the zone from the following: // - zone field of the resource data // - default zone from config func ExtractZone(d terraformResourceData, m any) (scw.Zone, error) { - rawConfig, err := d.GetRawConfigAt(cty.GetAttrPath("zone")) - if err == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { - if rawConfig.AsString() != "" { - return scw.ParseZone(rawConfig.AsString()) - } + rawConfigZone, diags := ExtractRawConfigString(d, "zone") + if diags == nil && rawConfigZone != "" { + return scw.ParseZone(rawConfigZone) } rawZone, exist := d.GetOk("zone") @@ -56,11 +64,9 @@ func ExtractZone(d terraformResourceData, m any) (scw.Zone, error) { // - region field of the resource data // - default region from config func ExtractRegion(d terraformResourceData, m any) (scw.Region, error) { - rawConfig, err := d.GetRawConfigAt(cty.GetAttrPath("region")) - if err == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { - if rawConfig.AsString() != "" { - return scw.ParseRegion(rawConfig.AsString()) - } + rawConfigZone, diags := ExtractRawConfigString(d, "region") + if diags == nil && rawConfigZone != "" { + return scw.ParseRegion(rawConfigZone) } rawRegion, exist := d.GetOk("region") @@ -81,11 +87,9 @@ func ExtractRegion(d terraformResourceData, m any) (scw.Region, error) { // - default region given in argument // - default region from config func ExtractRegionWithDefault(d terraformResourceData, m any, defaultRegion scw.Region) (scw.Region, error) { - rawConfig, err := d.GetRawConfigAt(cty.GetAttrPath("region")) - if err == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { - if rawConfig.AsString() != "" { - return scw.ParseRegion(rawConfig.AsString()) - } + rawConfigZone, diags := ExtractRawConfigString(d, "region") + if diags == nil && rawConfigZone != "" { + return scw.ParseRegion(rawConfigZone) } rawRegion, exist := d.GetOk("region") diff --git a/internal/services/ipam/ips_data_source.go b/internal/services/ipam/ips_data_source.go index c487e291e8..d9953c6847 100644 --- a/internal/services/ipam/ips_data_source.go +++ b/internal/services/ipam/ips_data_source.go @@ -10,6 +10,7 @@ import ( "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" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/meta" "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/account" "github.com/scaleway/terraform-provider-scaleway/v2/internal/types" ) @@ -167,11 +168,9 @@ func DataSourceIPAMIPsRead(ctx context.Context, d *schema.ResourceData, m any) d OrganizationID: types.ExpandStringPtr(d.Get("organization_id")), } - rawConfig, diagError := d.GetRawConfigAt(cty.GetAttrPath("zonal")) - if diagError == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { - if rawConfig.AsString() != "" { - req.Zonal = types.ExpandStringPtr(rawConfig.AsString()) - } + rawConfigZonal, diags := meta.ExtractRawConfigString(d, "zonal") + if diags == nil && rawConfigZonal != "" { + req.Zonal = types.ExpandStringPtr(rawConfigZonal) } attached, attachedExists := d.GetOk("attached") diff --git a/internal/services/k8s/pool.go b/internal/services/k8s/pool.go index 0ac64f2a1d..1c29a67a1a 100644 --- a/internal/services/k8s/pool.go +++ b/internal/services/k8s/pool.go @@ -5,7 +5,6 @@ import ( "fmt" "time" - "github.com/hashicorp/go-cty/cty" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/scaleway/scaleway-sdk-go/api/k8s/v1" @@ -15,6 +14,7 @@ import ( "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" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/meta" "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/ipam" "github.com/scaleway/terraform-provider-scaleway/v2/internal/types" "github.com/scaleway/terraform-provider-scaleway/v2/internal/verify" @@ -287,18 +287,14 @@ func ResourceK8SPoolCreate(ctx context.Context, d *schema.ResourceData, m any) d PublicIPDisabled: d.Get("public_ip_disabled").(bool), } - rawConfig, diags := d.GetRawConfigAt(cty.GetAttrPath("region")) - if diags == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { - if rawConfig.AsString() != "" { - req.Region = scw.Region(rawConfig.AsString()) - } + rawConfigRegion, diags := meta.ExtractRawConfigString(d, "region") + if diags == nil && rawConfigRegion != "" { + req.Region = scw.Region(rawConfigRegion) } - rawConfig, diags = d.GetRawConfigAt(cty.GetAttrPath("zone")) - if diags == nil && rawConfig.IsKnown() && !rawConfig.IsNull() { - if rawConfig.AsString() != "" { - req.Zone = scw.Zone(rawConfig.AsString()) - } + rawConfigZone, diags := meta.ExtractRawConfigString(d, "zone") + if diags == nil && rawConfigZone != "" { + req.Region = scw.Region(rawConfigRegion) } if placementGroupID, ok := d.GetOk("placement_group_id"); ok { From 7263e1843292d5a866ae764983ecfe9da9638a76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Thu, 18 Sep 2025 17:52:09 +0200 Subject: [PATCH 14/14] linter --- internal/meta/extractors.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/meta/extractors.go b/internal/meta/extractors.go index da969b67c0..4d0d67f565 100644 --- a/internal/meta/extractors.go +++ b/internal/meta/extractors.go @@ -35,6 +35,7 @@ func ExtractRawConfigString(d terraformResourceData, field string) (string, diag return rawConfig.AsString(), nil } } + return "", diags }