Skip to content

Commit 854d1af

Browse files
authored
feat(gateway_network): add vpc gateway network data source (#1383)
1 parent e1f4607 commit 854d1af

5 files changed

+3195
-0
lines changed
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
---
2+
page_title: "Scaleway: scaleway_vpc_gateway_network"
3+
description: |-
4+
Get information about Scaleway VPC Gateway Networks.
5+
---
6+
7+
# scaleway_vpc_gateway_network
8+
9+
Gets information about a gateway network.
10+
11+
## Example Usage
12+
13+
```hcl
14+
resource "scaleway_vpc_gateway_network" "main" {
15+
gateway_id = scaleway_vpc_public_gateway.pg01.id
16+
private_network_id = scaleway_vpc_private_network.pn01.id
17+
dhcp_id = scaleway_vpc_public_gateway_dhcp.dhcp01.id
18+
cleanup_dhcp = true
19+
enable_masquerade = true
20+
}
21+
22+
data scaleway_vpc_gateway_network by_id {
23+
gateway_network_id = scaleway_vpc_gateway_network.main.id
24+
}
25+
26+
data scaleway_vpc_gateway_network by_gateway_and_pn {
27+
gateway_id = scaleway_vpc_public_gateway.pg01.id
28+
private_network_id = scaleway_vpc_private_network.pn01.id
29+
}
30+
```
31+
32+
## Argument Reference
33+
34+
* `gateway_network_id` - (Optional) ID of the gateway network.
35+
36+
~> Only one of `gateway_network_id` or filters should be specified. You can use all the filters you want.
37+
38+
* `gateway_id` - (Optional) ID of the public gateway the gateway network is linked to
39+
* `private_network_id` - (Optional) ID of the private network the gateway network is linked to
40+
* `enable_masquerade` - (Optional) If masquerade is enabled on requested network
41+
* `dhcp_id` - (Optional) ID of the public gateway DHCP config
42+
43+
## Attributes Reference
44+
45+
Exported attributes are the attributes of the [resource](../resources/vpc_gateway_network.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package scaleway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/scaleway/scaleway-sdk-go/api/vpcgw/v1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
func dataSourceScalewayVPCGatewayNetwork() *schema.Resource {
14+
// Generate datasource schema from resource
15+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayVPCGatewayNetwork().Schema)
16+
17+
// Set 'Optional' schema elements
18+
searchFields := []string{
19+
"gateway_id",
20+
"private_network_id",
21+
"enable_masquerade",
22+
"dhcp_id",
23+
}
24+
addOptionalFieldsToSchema(dsSchema, searchFields...)
25+
26+
dsSchema["gateway_network_id"] = &schema.Schema{
27+
Type: schema.TypeString,
28+
Optional: true,
29+
Description: "The ID of the gateway network",
30+
ValidateFunc: validationUUIDorUUIDWithLocality(),
31+
ConflictsWith: searchFields,
32+
}
33+
34+
return &schema.Resource{
35+
Schema: dsSchema,
36+
ReadContext: dataSourceScalewayVPCGatewayNetworkRead,
37+
}
38+
}
39+
40+
func dataSourceScalewayVPCGatewayNetworkRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
41+
vpcAPI, zone, err := vpcgwAPIWithZone(d, meta)
42+
if err != nil {
43+
return diag.FromErr(err)
44+
}
45+
46+
gatewayNetworkID, ok := d.GetOk("gateway_network_id")
47+
if !ok {
48+
res, err := vpcAPI.ListGatewayNetworks(&vpcgw.ListGatewayNetworksRequest{
49+
GatewayID: expandStringPtr(expandID(d.Get("gateway_id"))),
50+
PrivateNetworkID: expandStringPtr(expandID(d.Get("private_network_id"))),
51+
EnableMasquerade: expandBoolPtr(getBool(d, "enable_masquerade")),
52+
DHCPID: expandStringPtr(expandID(d.Get("dhcp_id").(string))),
53+
Zone: zone,
54+
}, scw.WithContext(ctx))
55+
if err != nil {
56+
return diag.FromErr(err)
57+
}
58+
if res.TotalCount == 0 {
59+
return diag.FromErr(fmt.Errorf("no gateway network found with the filters"))
60+
}
61+
if res.TotalCount > 1 {
62+
return diag.FromErr(fmt.Errorf("%d gateway networks found with filters", res.TotalCount))
63+
}
64+
gatewayNetworkID = res.GatewayNetworks[0].ID
65+
}
66+
67+
zonedID := datasourceNewZonedID(gatewayNetworkID, zone)
68+
d.SetId(zonedID)
69+
70+
_ = d.Set("gateway_network_id", zonedID)
71+
72+
diags := resourceScalewayVPCGatewayNetworkRead(ctx, d, meta)
73+
if len(diags) > 0 {
74+
return append(diags, diag.Errorf("failed to read gateway network state")...)
75+
}
76+
77+
if d.Id() == "" {
78+
return diag.Errorf("gateway network (%s) not found", zonedID)
79+
}
80+
81+
return nil
82+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package scaleway
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccScalewayDataSourceVPCGatewayNetwork_Basic(t *testing.T) {
10+
tt := NewTestTools(t)
11+
defer tt.Cleanup()
12+
resource.ParallelTest(t, resource.TestCase{
13+
PreCheck: func() { testAccPreCheck(t) },
14+
ProviderFactories: tt.ProviderFactories,
15+
CheckDestroy: testAccCheckScalewayVPCGatewayNetworkDestroy(tt),
16+
Steps: []resource.TestStep{
17+
{
18+
Config: `
19+
resource "scaleway_vpc_private_network" "pn01" {
20+
}
21+
22+
resource "scaleway_vpc_public_gateway_ip" "gw01" {
23+
}
24+
25+
resource "scaleway_vpc_public_gateway_dhcp" "dhcp01" {
26+
subnet = "192.168.1.0/24"
27+
push_default_route = true
28+
}
29+
30+
resource "scaleway_vpc_public_gateway" "pg01" {
31+
type = "VPC-GW-S"
32+
ip_id = scaleway_vpc_public_gateway_ip.gw01.id
33+
}
34+
35+
resource "scaleway_vpc_gateway_network" "main" {
36+
gateway_id = scaleway_vpc_public_gateway.pg01.id
37+
private_network_id = scaleway_vpc_private_network.pn01.id
38+
dhcp_id = scaleway_vpc_public_gateway_dhcp.dhcp01.id
39+
cleanup_dhcp = true
40+
enable_masquerade = true
41+
}`,
42+
},
43+
{
44+
Config: `
45+
resource "scaleway_vpc_private_network" "pn01" {
46+
}
47+
48+
resource "scaleway_vpc_public_gateway_ip" "gw01" {
49+
}
50+
51+
resource "scaleway_vpc_public_gateway_dhcp" "dhcp01" {
52+
subnet = "192.168.1.0/24"
53+
push_default_route = true
54+
}
55+
56+
resource "scaleway_vpc_public_gateway" "pg01" {
57+
type = "VPC-GW-S"
58+
ip_id = scaleway_vpc_public_gateway_ip.gw01.id
59+
}
60+
61+
resource "scaleway_vpc_gateway_network" "main" {
62+
gateway_id = scaleway_vpc_public_gateway.pg01.id
63+
private_network_id = scaleway_vpc_private_network.pn01.id
64+
dhcp_id = scaleway_vpc_public_gateway_dhcp.dhcp01.id
65+
cleanup_dhcp = true
66+
enable_masquerade = true
67+
}
68+
69+
data scaleway_vpc_gateway_network by_id {
70+
gateway_network_id = scaleway_vpc_gateway_network.main.id
71+
}
72+
73+
data scaleway_vpc_gateway_network by_gateway_and_pn {
74+
gateway_id = scaleway_vpc_public_gateway.pg01.id
75+
private_network_id = scaleway_vpc_private_network.pn01.id
76+
}
77+
`,
78+
Check: resource.ComposeTestCheckFunc(
79+
testAccCheckScalewayVPCGatewayNetworkExists(tt, "scaleway_vpc_gateway_network.main"),
80+
resource.TestCheckResourceAttrPair(
81+
"data.scaleway_vpc_gateway_network.by_id", "id",
82+
"scaleway_vpc_gateway_network.main", "id",
83+
),
84+
resource.TestCheckResourceAttrPair(
85+
"data.scaleway_vpc_gateway_network.by_gateway_and_pn", "id",
86+
"scaleway_vpc_gateway_network.main", "id",
87+
),
88+
),
89+
},
90+
},
91+
})
92+
}

scaleway/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
183183
"scaleway_registry_namespace": dataSourceScalewayRegistryNamespace(),
184184
"scaleway_registry_image": dataSourceScalewayRegistryImage(),
185185
"scaleway_vpc_public_gateway": dataSourceScalewayVPCPublicGateway(),
186+
"scaleway_vpc_gateway_network": dataSourceScalewayVPCGatewayNetwork(),
186187
"scaleway_vpc_public_gateway_dhcp": dataSourceScalewayVPCPublicGatewayDHCP(),
187188
"scaleway_vpc_public_gateway_ip": dataSourceScalewayVPCPublicGatewayIP(),
188189
"scaleway_vpc_private_network": dataSourceScalewayVPCPrivateNetwork(),

0 commit comments

Comments
 (0)