@@ -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
305376func updateGatewayV1 (ctx context.Context , d * schema.ResourceData , apiV1 * vpcgw.API , zone scw.Zone , id string ) error {
306377 v1UpdateRequest := & vpcgw.UpdateGatewayRequest {
0 commit comments