Skip to content

Commit 89935f1

Browse files
Mia-Crossyfodil
andauthored
feat(vpcgw): read gateway network's private IPs (#3077)
Co-authored-by: Yacine FODIL <[email protected]>
1 parent 36647fe commit 89935f1

11 files changed

+9222
-7637
lines changed

docs/resources/vpc_gateway_network.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ 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 private IPv4 address associated with the resource.
117+
- `id` - The ID of the IPv4 address resource.
118+
- `address` - The private IPv4 address.
116119

117120
## Import
118121

internal/services/k8s/testdata/pool-public-ip-disabled.cassette.yaml

Lines changed: 2998 additions & 3341 deletions
Large diffs are not rendered by default.

internal/services/rdb/testdata/instance-private-network.cassette.yaml

Lines changed: 734 additions & 685 deletions
Large diffs are not rendered by default.

internal/services/vpc/testdata/data-source-routes-basic.cassette.yaml

Lines changed: 1180 additions & 690 deletions
Large diffs are not rendered by default.

internal/services/vpcgw/helpers.go

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ 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"
10+
ipamAPI "github.com/scaleway/scaleway-sdk-go/api/ipam/v1"
911
"github.com/scaleway/scaleway-sdk-go/api/vpcgw/v1"
1012
v2 "github.com/scaleway/scaleway-sdk-go/api/vpcgw/v2"
1113
"github.com/scaleway/scaleway-sdk-go/scw"
@@ -14,6 +16,7 @@ import (
1416
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/zonal"
1517
"github.com/scaleway/terraform-provider-scaleway/v2/internal/meta"
1618
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/instance"
19+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/ipam"
1720
"github.com/scaleway/terraform-provider-scaleway/v2/internal/types"
1821
)
1922

@@ -223,10 +226,10 @@ func readVPCGWResourceDataV2(d *schema.ResourceData, gw *v2.Gateway) diag.Diagno
223226
}
224227

225228
// readVPCGWNetworkResourceDataV1 sets the resource data using a v1 gateway network
226-
func readVPCGWNetworkResourceDataV1(d *schema.ResourceData, gatewayNetwork *vpcgw.GatewayNetwork) diag.Diagnostics {
229+
func readVPCGWNetworkResourceDataV1(d *schema.ResourceData, gatewayNetwork *vpcgw.GatewayNetwork, diags diag.Diagnostics) diag.Diagnostics {
227230
fetchRegion, err := gatewayNetwork.Zone.Region()
228231
if err != nil {
229-
return diag.FromErr(err)
232+
return append(diags, diag.FromErr(err)...)
230233
}
231234

232235
_ = d.Set("private_network_id", regional.NewIDString(fetchRegion, gatewayNetwork.PrivateNetworkID))
@@ -265,10 +268,10 @@ func readVPCGWNetworkResourceDataV1(d *schema.ResourceData, gatewayNetwork *vpcg
265268
}
266269

267270
// readVPCGWNetworkResourceDataV2 sets the resource data using a v1 gateway network
268-
func readVPCGWNetworkResourceDataV2(d *schema.ResourceData, gatewayNetwork *v2.GatewayNetwork) diag.Diagnostics {
271+
func readVPCGWNetworkResourceDataV2(d *schema.ResourceData, gatewayNetwork *v2.GatewayNetwork, diags diag.Diagnostics) diag.Diagnostics {
269272
fetchRegion, err := gatewayNetwork.Zone.Region()
270273
if err != nil {
271-
return diag.FromErr(err)
274+
return append(diags, diag.FromErr(err)...)
272275
}
273276

274277
_ = d.Set("private_network_id", regional.NewIDString(fetchRegion, gatewayNetwork.PrivateNetworkID))
@@ -301,6 +304,74 @@ func readVPCGWNetworkResourceDataV2(d *schema.ResourceData, gatewayNetwork *v2.G
301304
return nil
302305
}
303306

307+
func getPrivateIPsV1(ctx context.Context, gn *vpcgw.GatewayNetwork, m interface{}) (interface{}, diag.Diagnostics) {
308+
var privateIPs []map[string]interface{}
309+
310+
resourceID := gn.ID
311+
312+
region, err := gn.Zone.Region()
313+
if err != nil {
314+
return nil, diag.FromErr(err)
315+
}
316+
317+
resourceType := ipamAPI.ResourceTypeVpcGatewayNetwork
318+
opts := &ipam.GetResourcePrivateIPsOptions{
319+
ResourceID: &resourceID,
320+
ResourceType: &resourceType,
321+
PrivateNetworkID: &gn.PrivateNetworkID,
322+
}
323+
324+
privateIPs, err = ipam.GetResourcePrivateIPs(ctx, m, region, opts)
325+
if err != nil {
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+
}}
336+
}
337+
338+
return privateIPs, nil
339+
}
340+
341+
func getPrivateIPsV2(ctx context.Context, gn *v2.GatewayNetwork, m interface{}) (interface{}, diag.Diagnostics) {
342+
var privateIPs []map[string]interface{}
343+
344+
resourceID := gn.ID
345+
346+
region, err := gn.Zone.Region()
347+
if err != nil {
348+
return nil, diag.FromErr(err)
349+
}
350+
351+
resourceType := ipamAPI.ResourceTypeVpcGatewayNetwork
352+
opts := &ipam.GetResourcePrivateIPsOptions{
353+
ResourceID: &resourceID,
354+
ResourceType: &resourceType,
355+
PrivateNetworkID: &gn.PrivateNetworkID,
356+
}
357+
358+
privateIPs, err = ipam.GetResourcePrivateIPs(ctx, m, region, opts)
359+
if err != nil {
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+
}}
370+
}
371+
372+
return privateIPs, nil
373+
}
374+
304375
// updateGatewayV1 performs the update of the public gateway using the v1 API
305376
func updateGatewayV1(ctx context.Context, d *schema.ResourceData, apiV1 *vpcgw.API, zone scw.Zone, id string) error {
306377
v1UpdateRequest := &vpcgw.UpdateGatewayRequest{

internal/services/vpcgw/network.go

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,25 @@ func ResourceNetwork() *schema.Resource {
125125
Computed: true,
126126
Description: "The mac address on this network",
127127
},
128+
"private_ip": {
129+
Type: schema.TypeList,
130+
Computed: true,
131+
Description: "The private IPv4 address associated with the resource.",
132+
Elem: &schema.Resource{
133+
Schema: map[string]*schema.Schema{
134+
"id": {
135+
Type: schema.TypeString,
136+
Computed: true,
137+
Description: "The ID of the IPv4 address resource.",
138+
},
139+
"address": {
140+
Type: schema.TypeString,
141+
Computed: true,
142+
Description: "The private IPv4 address.",
143+
},
144+
},
145+
},
146+
},
128147
"created_at": {
129148
Type: schema.TypeString,
130149
Computed: true,
@@ -207,6 +226,8 @@ func ResourceVPCGatewayNetworkRead(ctx context.Context, d *schema.ResourceData,
207226
return diag.FromErr(err)
208227
}
209228

229+
var diags diag.Diagnostics
230+
210231
gatewayNetwork, err := waitForVPCGatewayNetworkV2(ctx, api, zone, ID, d.Timeout(schema.TimeoutRead))
211232
if err != nil {
212233
if httperrors.Is412(err) {
@@ -218,7 +239,16 @@ func ResourceVPCGatewayNetworkRead(ctx context.Context, d *schema.ResourceData,
218239
return diag.FromErr(err)
219240
}
220241

221-
return readVPCGWNetworkResourceDataV1(d, gatewayV1)
242+
if gatewayNetwork.PrivateNetworkID != "" {
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)
249+
}
250+
251+
return readVPCGWNetworkResourceDataV1(d, gatewayV1, diags)
222252
} else if httperrors.Is404(err) {
223253
d.SetId("")
224254

@@ -228,7 +258,16 @@ func ResourceVPCGatewayNetworkRead(ctx context.Context, d *schema.ResourceData,
228258
return diag.FromErr(err)
229259
}
230260

231-
return readVPCGWNetworkResourceDataV2(d, gatewayNetwork)
261+
if gatewayNetwork.PrivateNetworkID != "" {
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)
268+
}
269+
270+
return readVPCGWNetworkResourceDataV2(d, gatewayNetwork, diags)
232271
}
233272

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

internal/services/vpcgw/network_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +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_ip.0.id"),
68+
resource.TestCheckResourceAttrSet("scaleway_vpc_gateway_network.main", "private_ip.0.address"),
6769
),
6870
},
6971
{

0 commit comments

Comments
 (0)