Skip to content

Commit cb09ae0

Browse files
committed
fix wording + handle 403 + first cassette
1 parent fbde1b1 commit cb09ae0

File tree

5 files changed

+531
-402
lines changed

5 files changed

+531
-402
lines changed

docs/resources/vpc_gateway_network.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ In addition to all arguments above, the following attributes are exported:
113113
- `created_at` - The date and time of the creation of the GatewayNetwork.
114114
- `updated_at` - The date and time of the last update of the GatewayNetwork.
115115
- `status` - The status of the Public Gateway's connection to the Private Network.
116-
- `private_ip` - The list of private IPv4 addresses associated with the resource.
116+
- `private_ip` - The private IPv4 address associated with the resource.
117117
- `id` - The ID of the IPv4 address resource.
118118
- `address` - The private IPv4 address.
119119

internal/services/vpcgw/helpers.go

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"time"
66

7+
"github.com/hashicorp/go-cty/cty"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
910
ipamAPI "github.com/scaleway/scaleway-sdk-go/api/ipam/v1"
@@ -225,10 +226,10 @@ func readVPCGWResourceDataV2(d *schema.ResourceData, gw *v2.Gateway) diag.Diagno
225226
}
226227

227228
// readVPCGWNetworkResourceDataV1 sets the resource data using a v1 gateway network
228-
func readVPCGWNetworkResourceDataV1(d *schema.ResourceData, gatewayNetwork *vpcgw.GatewayNetwork) diag.Diagnostics {
229+
func readVPCGWNetworkResourceDataV1(d *schema.ResourceData, gatewayNetwork *vpcgw.GatewayNetwork, diags diag.Diagnostics) diag.Diagnostics {
229230
fetchRegion, err := gatewayNetwork.Zone.Region()
230231
if err != nil {
231-
return diag.FromErr(err)
232+
return append(diags, diag.FromErr(err)...)
232233
}
233234

234235
_ = d.Set("private_network_id", regional.NewIDString(fetchRegion, gatewayNetwork.PrivateNetworkID))
@@ -267,10 +268,10 @@ func readVPCGWNetworkResourceDataV1(d *schema.ResourceData, gatewayNetwork *vpcg
267268
}
268269

269270
// readVPCGWNetworkResourceDataV2 sets the resource data using a v1 gateway network
270-
func readVPCGWNetworkResourceDataV2(d *schema.ResourceData, gatewayNetwork *v2.GatewayNetwork) diag.Diagnostics {
271+
func readVPCGWNetworkResourceDataV2(d *schema.ResourceData, gatewayNetwork *v2.GatewayNetwork, diags diag.Diagnostics) diag.Diagnostics {
271272
fetchRegion, err := gatewayNetwork.Zone.Region()
272273
if err != nil {
273-
return diag.FromErr(err)
274+
return append(diags, diag.FromErr(err)...)
274275
}
275276

276277
_ = d.Set("private_network_id", regional.NewIDString(fetchRegion, gatewayNetwork.PrivateNetworkID))
@@ -303,14 +304,14 @@ func readVPCGWNetworkResourceDataV2(d *schema.ResourceData, gatewayNetwork *v2.G
303304
return nil
304305
}
305306

306-
func getPrivateIPsV1(ctx context.Context, gn *vpcgw.GatewayNetwork, m interface{}) interface{} {
307+
func getPrivateIPsV1(ctx context.Context, gn *vpcgw.GatewayNetwork, m interface{}) (interface{}, diag.Diagnostics) {
307308
var privateIPs []map[string]interface{}
308309

309310
resourceID := gn.ID
310311

311312
region, err := gn.Zone.Region()
312313
if err != nil {
313-
return diag.FromErr(err)
314+
return nil, diag.FromErr(err)
314315
}
315316

316317
resourceType := ipamAPI.ResourceTypeVpcGatewayNetwork
@@ -322,20 +323,29 @@ func getPrivateIPsV1(ctx context.Context, gn *vpcgw.GatewayNetwork, m interface{
322323

323324
privateIPs, err = ipam.GetResourcePrivateIPs(ctx, m, region, opts)
324325
if err != nil {
325-
return diag.FromErr(err)
326+
if !httperrors.Is403(err) {
327+
return nil, diag.FromErr(err)
328+
}
329+
330+
return nil, diag.Diagnostics{diag.Diagnostic{
331+
Severity: diag.Warning,
332+
Summary: err.Error(),
333+
Detail: "Got 403 while reading private IPs from IPAM API, please check your IAM permissions",
334+
AttributePath: cty.GetAttrPath("private_ips"),
335+
}}
326336
}
327337

328-
return privateIPs
338+
return privateIPs, nil
329339
}
330340

331-
func getPrivateIPsV2(ctx context.Context, gn *v2.GatewayNetwork, m interface{}) interface{} {
341+
func getPrivateIPsV2(ctx context.Context, gn *v2.GatewayNetwork, m interface{}) (interface{}, diag.Diagnostics) {
332342
var privateIPs []map[string]interface{}
333343

334344
resourceID := gn.ID
335345

336346
region, err := gn.Zone.Region()
337347
if err != nil {
338-
return diag.FromErr(err)
348+
return nil, diag.FromErr(err)
339349
}
340350

341351
resourceType := ipamAPI.ResourceTypeVpcGatewayNetwork
@@ -347,10 +357,19 @@ func getPrivateIPsV2(ctx context.Context, gn *v2.GatewayNetwork, m interface{})
347357

348358
privateIPs, err = ipam.GetResourcePrivateIPs(ctx, m, region, opts)
349359
if err != nil {
350-
return diag.FromErr(err)
360+
if !httperrors.Is403(err) {
361+
return nil, diag.FromErr(err)
362+
}
363+
364+
return nil, diag.Diagnostics{diag.Diagnostic{
365+
Severity: diag.Warning,
366+
Summary: err.Error(),
367+
Detail: "Got 403 while reading private IPs from IPAM API, please check your IAM permissions",
368+
AttributePath: cty.GetAttrPath("private_ips"),
369+
}}
351370
}
352371

353-
return privateIPs
372+
return privateIPs, nil
354373
}
355374

356375
// updateGatewayV1 performs the update of the public gateway using the v1 API

internal/services/vpcgw/network.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,10 @@ func ResourceNetwork() *schema.Resource {
125125
Computed: true,
126126
Description: "The mac address on this network",
127127
},
128-
"private_ips": {
128+
"private_ip": {
129129
Type: schema.TypeList,
130130
Computed: true,
131-
Description: "List of private IPv4 addresses associated with the resource.",
131+
Description: "The private IPv4 address associated with the resource.",
132132
Elem: &schema.Resource{
133133
Schema: map[string]*schema.Schema{
134134
"id": {
@@ -226,6 +226,8 @@ func ResourceVPCGatewayNetworkRead(ctx context.Context, d *schema.ResourceData,
226226
return diag.FromErr(err)
227227
}
228228

229+
var diags diag.Diagnostics
230+
229231
gatewayNetwork, err := waitForVPCGatewayNetworkV2(ctx, api, zone, ID, d.Timeout(schema.TimeoutRead))
230232
if err != nil {
231233
if httperrors.Is412(err) {
@@ -238,10 +240,15 @@ func ResourceVPCGatewayNetworkRead(ctx context.Context, d *schema.ResourceData,
238240
}
239241

240242
if gatewayNetwork.PrivateNetworkID != "" {
241-
_ = d.Set("private_ips", getPrivateIPsV1(ctx, gatewayV1, m))
243+
privateIPs, diags := getPrivateIPsV1(ctx, gatewayV1, m)
244+
if diags != nil && len(diags) > 0 && diags[0].Severity == diag.Error {
245+
return diags
246+
}
247+
248+
_ = d.Set("private_ip", privateIPs)
242249
}
243250

244-
return readVPCGWNetworkResourceDataV1(d, gatewayV1)
251+
return readVPCGWNetworkResourceDataV1(d, gatewayV1, diags)
245252
} else if httperrors.Is404(err) {
246253
d.SetId("")
247254

@@ -252,10 +259,15 @@ func ResourceVPCGatewayNetworkRead(ctx context.Context, d *schema.ResourceData,
252259
}
253260

254261
if gatewayNetwork.PrivateNetworkID != "" {
255-
_ = d.Set("private_ips", getPrivateIPsV2(ctx, gatewayNetwork, m))
262+
privateIPs, diags := getPrivateIPsV2(ctx, gatewayNetwork, m)
263+
if diags != nil && len(diags) > 0 && diags[0].Severity == diag.Error {
264+
return diags
265+
}
266+
267+
_ = d.Set("private_ip", privateIPs)
256268
}
257269

258-
return readVPCGWNetworkResourceDataV2(d, gatewayNetwork)
270+
return readVPCGWNetworkResourceDataV2(d, gatewayNetwork, diags)
259271
}
260272

261273
func ResourceVPCGatewayNetworkUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {

internal/services/vpcgw/network_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ func TestAccVPCGatewayNetwork_WithIPAMConfig(t *testing.T) {
6464
resource.TestCheckResourceAttr("scaleway_vpc_gateway_network.main", "ipam_config.0.push_default_route", "true"),
6565
resource.TestCheckResourceAttrSet("scaleway_vpc_gateway_network.main", "ipam_config.0.ipam_ip_id"),
6666
resource.TestCheckResourceAttr("scaleway_vpc_gateway_network.main", "enable_masquerade", "true"),
67-
resource.TestCheckResourceAttrSet("scaleway_vpc_gateway_network.main", "private_ips.0.id"),
68-
resource.TestCheckResourceAttrSet("scaleway_vpc_gateway_network.main", "private_ips.0.address"),
67+
resource.TestCheckResourceAttrSet("scaleway_vpc_gateway_network.main", "private_ip.0.id"),
68+
resource.TestCheckResourceAttrSet("scaleway_vpc_gateway_network.main", "private_ip.0.address"),
6969
),
7070
},
7171
{

0 commit comments

Comments
 (0)