Skip to content

Commit 7dbc3fa

Browse files
committed
refactor
1 parent bfc5db7 commit 7dbc3fa

File tree

6 files changed

+125
-158
lines changed

6 files changed

+125
-158
lines changed

internal/locality/regional/ids.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"strings"
66

7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
78
"github.com/scaleway/scaleway-sdk-go/scw"
89
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
910
)
@@ -81,3 +82,50 @@ func ParseID(regionalID string) (region scw.Region, id string, err error) {
8182

8283
return
8384
}
85+
86+
func ResolveRegionAndID(
87+
d *schema.ResourceData,
88+
fallbackDefaultRegion func(*schema.ResourceData) (scw.Region, error),
89+
) (scw.Region, string, error) {
90+
if identity, err := d.Identity(); err == nil && identity != nil {
91+
if v := identity.Get("id"); v != nil {
92+
ID, _ := v.(string)
93+
if ID != "" {
94+
if rv := identity.Get("region"); rv != nil {
95+
if rstr, ok := rv.(string); ok && rstr != "" {
96+
return scw.Region(rstr), ID, nil
97+
}
98+
}
99+
100+
if sid := d.Id(); sid != "" {
101+
if rFromState, _, err := ParseID(sid); err == nil && rFromState != "" {
102+
return rFromState, ID, nil
103+
}
104+
}
105+
106+
if fallbackDefaultRegion != nil {
107+
if region, err := fallbackDefaultRegion(d); err == nil && region != "" {
108+
return region, ID, nil
109+
}
110+
}
111+
112+
return "", "", fmt.Errorf("cannot resolve region for identity (id=%q)", ID)
113+
}
114+
}
115+
}
116+
117+
if sid := d.Id(); sid != "" {
118+
region, ID, err := ParseID(sid)
119+
if err != nil {
120+
return "", "", err
121+
}
122+
123+
if ID == "" {
124+
return "", "", fmt.Errorf("empty id parsed from state ID %q", sid)
125+
}
126+
127+
return region, ID, nil
128+
}
129+
130+
return "", "", fmt.Errorf("cannot resolve identity: both identity.id and state ID are empty")
131+
}

internal/services/vpc/acl.go

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package vpc
22

33
import (
44
"context"
5-
"errors"
6-
"fmt"
75

86
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
97
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -12,7 +10,6 @@ import (
1210
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
1311
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
1412
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional"
15-
"github.com/scaleway/terraform-provider-scaleway/v2/internal/meta"
1613
"github.com/scaleway/terraform-provider-scaleway/v2/internal/verify"
1714
)
1815

@@ -23,40 +20,7 @@ func ResourceACL() *schema.Resource {
2320
UpdateContext: ResourceVPCACLUpdate,
2421
DeleteContext: ResourceVPCACLDelete,
2522
Importer: &schema.ResourceImporter{
26-
StateContext: func(
27-
ctx context.Context,
28-
d *schema.ResourceData,
29-
m interface{},
30-
) ([]*schema.ResourceData, error) {
31-
// If importing by ID (e.g. "fr-par/8cef…"), we just set the ID field to state, allowing the read to fill in the rest of the data
32-
if d.Id() != "" {
33-
return []*schema.ResourceData{d}, nil
34-
}
35-
36-
// Otherwise, we're importing by identity “identity = { id = ..., region = ... }”
37-
identity, err := d.Identity()
38-
if err != nil {
39-
return nil, fmt.Errorf("error retrieving identity: %w", err)
40-
}
41-
42-
rawID := identity.Get("id").(string)
43-
44-
regionVal := identity.Get("region").(string)
45-
if regionVal == "" {
46-
region, err := meta.ExtractRegion(d, m)
47-
if err != nil {
48-
return nil, errors.New("identity.region was not set")
49-
}
50-
51-
regionVal = region.String()
52-
}
53-
54-
localizedID := fmt.Sprintf("%s/%s", regionVal, rawID)
55-
56-
d.SetId(localizedID)
57-
58-
return []*schema.ResourceData{d}, nil
59-
},
23+
StateContext: schema.ImportStatePassthroughWithIdentity("id"),
6024
},
6125
Identity: &schema.ResourceIdentity{
6226
Version: 0,
@@ -186,11 +150,23 @@ func ResourceVPCACLCreate(ctx context.Context, d *schema.ResourceData, m any) di
186150

187151
d.SetId(regional.NewIDString(region, regional.ExpandID(d.Get("vpc_id").(string)).ID))
188152

153+
identity, err := d.Identity()
154+
if err != nil {
155+
return diag.FromErr(err)
156+
}
157+
158+
if err = identity.Set("id", regional.ExpandID(d.Get("vpc_id").(string)).ID); err != nil {
159+
return diag.FromErr(err)
160+
}
161+
if err = identity.Set("region", region); err != nil {
162+
return diag.FromErr(err)
163+
}
164+
189165
return ResourceVPCACLRead(ctx, d, m)
190166
}
191167

192168
func ResourceVPCACLRead(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
193-
vpcAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
169+
vpcAPI, region, ID, err := NewAPIWithRegionAndIDFromState(m, d)
194170
if err != nil {
195171
return diag.FromErr(err)
196172
}
@@ -217,7 +193,7 @@ func ResourceVPCACLRead(ctx context.Context, d *schema.ResourceData, m any) diag
217193
}
218194

219195
func ResourceVPCACLUpdate(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
220-
vpcAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
196+
vpcAPI, region, ID, err := NewAPIWithRegionAndIDFromState(m, d)
221197
if err != nil {
222198
return diag.FromErr(err)
223199
}
@@ -247,7 +223,7 @@ func ResourceVPCACLUpdate(ctx context.Context, d *schema.ResourceData, m any) di
247223
}
248224

249225
func ResourceVPCACLDelete(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
250-
vpcAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
226+
vpcAPI, region, ID, err := NewAPIWithRegionAndIDFromState(m, d)
251227
if err != nil {
252228
return diag.FromErr(err)
253229
}

internal/services/vpc/helpers.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@ func NewAPIWithRegionAndID(m any, id string) (*vpc.API, scw.Region, string, erro
4343
return vpcAPI, region, ID, err
4444
}
4545

46+
func NewAPIWithRegionAndIDFromState(m interface{}, d *schema.ResourceData) (*vpc.API, scw.Region, string, error) {
47+
vpcAPI := vpc.NewAPI(meta.ExtractScwClient(m))
48+
region, ID, err := regional.ResolveRegionAndID(d, func(d *schema.ResourceData) (scw.Region, error) {
49+
_, provRegion, err := vpcAPIWithRegion(d, m)
50+
return provRegion, err
51+
})
52+
if err != nil {
53+
return nil, "", "", err
54+
}
55+
56+
return vpcAPI, region, ID, nil
57+
}
58+
4659
func NewAPI(m any) (*vpc.API, error) {
4760
return vpc.NewAPI(meta.ExtractScwClient(m)), nil
4861
}

internal/services/vpc/private_network.go

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package vpc
22

33
import (
44
"context"
5-
"errors"
6-
"fmt"
75

86
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
97
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry"
@@ -27,40 +25,7 @@ func ResourcePrivateNetwork() *schema.Resource {
2725
UpdateContext: ResourceVPCPrivateNetworkUpdate,
2826
DeleteContext: ResourceVPCPrivateNetworkDelete,
2927
Importer: &schema.ResourceImporter{
30-
StateContext: func(
31-
ctx context.Context,
32-
d *schema.ResourceData,
33-
m interface{},
34-
) ([]*schema.ResourceData, error) {
35-
// If importing by ID (e.g. "fr-par/8cef…"), we just set the ID field to state, allowing the read to fill in the rest of the data
36-
if d.Id() != "" {
37-
return []*schema.ResourceData{d}, nil
38-
}
39-
40-
// Otherwise, we're importing by identity “identity = { id = ..., region = ... }”
41-
identity, err := d.Identity()
42-
if err != nil {
43-
return nil, fmt.Errorf("error retrieving identity: %w", err)
44-
}
45-
46-
rawID := identity.Get("id").(string)
47-
48-
regionVal := identity.Get("region").(string)
49-
if regionVal == "" {
50-
region, err := meta.ExtractRegion(d, m)
51-
if err != nil {
52-
return nil, errors.New("identity.region was not set")
53-
}
54-
55-
regionVal = region.String()
56-
}
57-
58-
localizedID := fmt.Sprintf("%s/%s", regionVal, rawID)
59-
60-
d.SetId(localizedID)
61-
62-
return []*schema.ResourceData{d}, nil
63-
},
28+
StateContext: schema.ImportStatePassthroughWithIdentity("id"),
6429
},
6530
Identity: &schema.ResourceIdentity{
6631
Version: 0,
@@ -282,11 +247,23 @@ func ResourceVPCPrivateNetworkCreate(ctx context.Context, d *schema.ResourceData
282247

283248
d.SetId(regional.NewIDString(region, pn.ID))
284249

250+
identity, err := d.Identity()
251+
if err != nil {
252+
return diag.FromErr(err)
253+
}
254+
255+
if err = identity.Set("id", pn.ID); err != nil {
256+
return diag.FromErr(err)
257+
}
258+
if err = identity.Set("region", region); err != nil {
259+
return diag.FromErr(err)
260+
}
261+
285262
return ResourceVPCPrivateNetworkRead(ctx, d, m)
286263
}
287264

288265
func ResourceVPCPrivateNetworkRead(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
289-
vpcAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
266+
vpcAPI, region, ID, err := NewAPIWithRegionAndIDFromState(m, d)
290267
if err != nil {
291268
return diag.FromErr(err)
292269
}
@@ -342,7 +319,7 @@ func ResourceVPCPrivateNetworkRead(ctx context.Context, d *schema.ResourceData,
342319
}
343320

344321
func ResourceVPCPrivateNetworkUpdate(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
345-
vpcAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
322+
vpcAPI, region, ID, err := NewAPIWithRegionAndIDFromState(m, d)
346323
if err != nil {
347324
return diag.FromErr(err)
348325
}
@@ -362,7 +339,7 @@ func ResourceVPCPrivateNetworkUpdate(ctx context.Context, d *schema.ResourceData
362339
}
363340

364341
func ResourceVPCPrivateNetworkDelete(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
365-
vpcAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
342+
vpcAPI, region, ID, err := NewAPIWithRegionAndIDFromState(m, d)
366343
if err != nil {
367344
return diag.FromErr(err)
368345
}

internal/services/vpc/route.go

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package vpc
22

33
import (
44
"context"
5-
"errors"
6-
"fmt"
75

86
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
97
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -13,7 +11,6 @@ import (
1311
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
1412
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
1513
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional"
16-
"github.com/scaleway/terraform-provider-scaleway/v2/internal/meta"
1714
"github.com/scaleway/terraform-provider-scaleway/v2/internal/types"
1815
)
1916

@@ -24,40 +21,7 @@ func ResourceRoute() *schema.Resource {
2421
UpdateContext: ResourceRouteUpdate,
2522
DeleteContext: ResourceRouteDelete,
2623
Importer: &schema.ResourceImporter{
27-
StateContext: func(
28-
ctx context.Context,
29-
d *schema.ResourceData,
30-
m interface{},
31-
) ([]*schema.ResourceData, error) {
32-
// If importing by ID (e.g. "fr-par/8cef…"), we just set the ID field to state, allowing the read to fill in the rest of the data
33-
if d.Id() != "" {
34-
return []*schema.ResourceData{d}, nil
35-
}
36-
37-
// Otherwise, we're importing by identity “identity = { id = ..., region = ... }”
38-
identity, err := d.Identity()
39-
if err != nil {
40-
return nil, fmt.Errorf("error retrieving identity: %w", err)
41-
}
42-
43-
rawID := identity.Get("id").(string)
44-
45-
regionVal := identity.Get("region").(string)
46-
if regionVal == "" {
47-
region, err := meta.ExtractRegion(d, m)
48-
if err != nil {
49-
return nil, errors.New("identity.region was not set")
50-
}
51-
52-
regionVal = region.String()
53-
}
54-
55-
localizedID := fmt.Sprintf("%s/%s", regionVal, rawID)
56-
57-
d.SetId(localizedID)
58-
59-
return []*schema.ResourceData{d}, nil
60-
},
24+
StateContext: schema.ImportStatePassthroughWithIdentity("id"),
6125
},
6226
Identity: &schema.ResourceIdentity{
6327
Version: 0,
@@ -164,11 +128,23 @@ func ResourceRouteCreate(ctx context.Context, d *schema.ResourceData, m any) dia
164128

165129
d.SetId(regional.NewIDString(region, res.ID))
166130

131+
identity, err := d.Identity()
132+
if err != nil {
133+
return diag.FromErr(err)
134+
}
135+
136+
if err = identity.Set("id", res.ID); err != nil {
137+
return diag.FromErr(err)
138+
}
139+
if err = identity.Set("region", region); err != nil {
140+
return diag.FromErr(err)
141+
}
142+
167143
return ResourceRouteRead(ctx, d, m)
168144
}
169145

170146
func ResourceRouteRead(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
171-
vpcAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
147+
vpcAPI, region, ID, err := NewAPIWithRegionAndIDFromState(m, d)
172148
if err != nil {
173149
return diag.FromErr(err)
174150
}
@@ -210,7 +186,7 @@ func ResourceRouteRead(ctx context.Context, d *schema.ResourceData, m any) diag.
210186
}
211187

212188
func ResourceRouteUpdate(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
213-
vpcAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
189+
vpcAPI, region, ID, err := NewAPIWithRegionAndIDFromState(m, d)
214190
if err != nil {
215191
return diag.FromErr(err)
216192
}
@@ -268,7 +244,7 @@ func ResourceRouteUpdate(ctx context.Context, d *schema.ResourceData, m any) dia
268244
}
269245

270246
func ResourceRouteDelete(ctx context.Context, d *schema.ResourceData, m any) diag.Diagnostics {
271-
vpcAPI, region, ID, err := NewAPIWithRegionAndID(m, d.Id())
247+
vpcAPI, region, ID, err := NewAPIWithRegionAndIDFromState(m, d)
272248
if err != nil {
273249
return diag.FromErr(err)
274250
}

0 commit comments

Comments
 (0)