Skip to content

Commit 8530f08

Browse files
authored
feat(vpc-gw-dhcp-entries): add data-source for reservations (#1397)
1 parent 9675c2c commit 8530f08

6 files changed

+12341
-40
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
---
2+
page_title: "Scaleway: scaleway_vpc_public_gateway_dhcp_reservation"
3+
description: |- Get information about Scaleway VPC Public Gateway DHCP Reservation.
4+
---
5+
6+
# scaleway_vpc_public_gateway_dhcp_reservation
7+
8+
Gets information about a dhcp entries. For further information please check the
9+
API [documentation](https://developers.scaleway.com/en/products/vpc-gw/api/v1/#dhcp-entries-e40fb6)
10+
11+
## Example Dynamic
12+
13+
```hcl
14+
resource scaleway_vpc_private_network main {
15+
}
16+
17+
resource "scaleway_instance_server" "main" {
18+
image = "ubuntu_focal"
19+
type = "DEV1-S"
20+
zone = "fr-par-1"
21+
22+
private_network {
23+
pn_id = scaleway_vpc_private_network.main.id
24+
}
25+
}
26+
27+
resource scaleway_vpc_public_gateway_ip main {
28+
}
29+
30+
resource scaleway_vpc_public_gateway_dhcp main {
31+
subnet = "192.168.1.0/24"
32+
}
33+
34+
resource scaleway_vpc_public_gateway main {
35+
name = "foobar"
36+
type = "VPC-GW-S"
37+
ip_id = scaleway_vpc_public_gateway_ip.main.id
38+
}
39+
40+
resource scaleway_vpc_gateway_network main {
41+
gateway_id = scaleway_vpc_public_gateway.main.id
42+
private_network_id = scaleway_vpc_private_network.main.id
43+
dhcp_id = scaleway_vpc_public_gateway_dhcp.main.id
44+
cleanup_dhcp = true
45+
enable_masquerade = true
46+
}
47+
48+
## Retrieve the dynamic entries generated by mac address
49+
data "scaleway_vpc_public_gateway_dhcp_reservation" "by_mac_address" {
50+
mac_address = "${scaleway_instance_server.main.private_network.0.mac_address}"
51+
}
52+
```
53+
54+
## Example Static and PAT rule
55+
56+
```hcl
57+
resource scaleway_vpc_private_network main {}
58+
59+
resource "scaleway_instance_security_group" main {
60+
inbound_default_policy = "drop"
61+
outbound_default_policy = "accept"
62+
63+
inbound_rule {
64+
action = "accept"
65+
port = "22"
66+
}
67+
}
68+
69+
resource "scaleway_instance_server" "main" {
70+
image = "ubuntu_focal"
71+
type = "DEV1-S"
72+
zone = "fr-par-1"
73+
74+
security_group_id = scaleway_instance_security_group.main.id
75+
76+
private_network {
77+
pn_id = scaleway_vpc_private_network.main.id
78+
}
79+
}
80+
81+
resource scaleway_vpc_public_gateway_ip main {
82+
}
83+
84+
resource scaleway_vpc_public_gateway_dhcp main {
85+
subnet = "192.168.1.0/24"
86+
}
87+
88+
resource scaleway_vpc_public_gateway main {
89+
name = "foobar"
90+
type = "VPC-GW-S"
91+
ip_id = scaleway_vpc_public_gateway_ip.main.id
92+
}
93+
94+
resource scaleway_vpc_gateway_network main {
95+
gateway_id = scaleway_vpc_public_gateway.main.id
96+
private_network_id = scaleway_vpc_private_network.main.id
97+
dhcp_id = scaleway_vpc_public_gateway_dhcp.main.id
98+
cleanup_dhcp = true
99+
enable_masquerade = true
100+
}
101+
102+
resource scaleway_vpc_public_gateway_dhcp_reservation main {
103+
gateway_network_id = scaleway_vpc_gateway_network.main.id
104+
mac_address = scaleway_instance_server.main.private_network.0.mac_address
105+
ip_address = "192.168.1.4"
106+
}
107+
108+
### VPC PAT RULE
109+
resource "scaleway_vpc_public_gateway_pat_rule" "main" {
110+
gateway_id = scaleway_vpc_public_gateway.main.id
111+
private_ip = scaleway_vpc_public_gateway_dhcp_reservation.main.ip_address
112+
private_port = 22
113+
public_port = 2222
114+
protocol = "tcp"
115+
}
116+
117+
data "scaleway_vpc_public_gateway_dhcp_reservation" "by_id" {
118+
reservation_id = "${scaleway_vpc_public_gateway_dhcp_reservation.main.id}"
119+
}
120+
```
121+
122+
## Argument Reference
123+
124+
- `reservation_id` (Required) The ID of the Reservation to retrieve
125+
- `mac_address` (Optional) The MAC address of the reservation to retrieve
126+
- `zone` - (Defaults to [provider](../index.md#zone) `zone`) The [zone](../guides/regions_and_zones.md#zones) in which
127+
the image exists.
128+
129+
## Attributes Reference
130+
131+
The following arguments are exported:
132+
133+
- `gateway_network_id` - The ID of the owning GatewayNetwork.
134+
- `ip_address` - The IP address to give to the machine (IP address).
135+
- `hostname` - The Hostname of the client machine.
136+
- `type` - The reservation type, either static (DHCP reservation) or dynamic (DHCP lease). Possible values are reservation and lease.
137+
- `created_at` - The date and time of the creation of the public gateway DHCP config.
138+
- `updated_at` - The date and time of the last update of the public gateway DHCP config.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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 dataSourceScalewayVPCPublicGatewayDHCPReservation() *schema.Resource {
14+
// Generate datasource schema from resource
15+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayVPCPublicGatewayDHCPReservation().Schema)
16+
17+
// Set 'Optional' schema elements
18+
addOptionalFieldsToSchema(dsSchema, "mac_address")
19+
20+
dsSchema["mac_address"].ConflictsWith = []string{"reservation_id"}
21+
dsSchema["reservation_id"] = &schema.Schema{
22+
Type: schema.TypeString,
23+
Optional: true,
24+
Description: "The ID of dhcp entry reservation",
25+
ValidateFunc: validationUUIDorUUIDWithLocality(),
26+
}
27+
28+
// Set 'Optional' schema elements
29+
addOptionalFieldsToSchema(dsSchema, "zone")
30+
31+
return &schema.Resource{
32+
Schema: dsSchema,
33+
ReadContext: dataSourceScalewayVPCPublicGatewayDHCPReservationRead,
34+
}
35+
}
36+
37+
func dataSourceScalewayVPCPublicGatewayDHCPReservationRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
38+
vpcgwAPI, zone, err := vpcgwAPIWithZone(d, meta)
39+
if err != nil {
40+
return diag.FromErr(err)
41+
}
42+
43+
reservationIDRaw, ok := d.GetOk("reservation_id")
44+
if !ok {
45+
res, err := vpcgwAPI.ListDHCPEntries(
46+
&vpcgw.ListDHCPEntriesRequest{
47+
MacAddress: expandStringPtr(d.Get("mac_address").(string)),
48+
}, scw.WithContext(ctx))
49+
if err != nil {
50+
return diag.FromErr(err)
51+
}
52+
if res.TotalCount == 0 {
53+
return diag.FromErr(
54+
fmt.Errorf(
55+
"no dhcp-entry on public gateway found with the mac_address %s",
56+
d.Get("mac_address"),
57+
),
58+
)
59+
}
60+
if res.TotalCount > 1 {
61+
return diag.FromErr(
62+
fmt.Errorf(
63+
"%d on public gateways found with the mac address %s",
64+
res.TotalCount,
65+
d.Get("mac_address"),
66+
),
67+
)
68+
}
69+
reservationIDRaw = res.DHCPEntries[0].ID
70+
}
71+
72+
zonedID := datasourceNewZonedID(reservationIDRaw, zone)
73+
d.SetId(zonedID)
74+
_ = d.Set("reservation_id", zonedID)
75+
76+
diags := resourceScalewayVPCPublicGatewayDHCPReservationRead(ctx, d, meta)
77+
if diags != nil {
78+
return append(diags, diag.Errorf("failed to read DHCP Entries")...)
79+
}
80+
81+
if d.Id() == "" {
82+
return diag.Errorf("DHCP ENTRY(%s) not found", zonedID)
83+
}
84+
85+
return nil
86+
}
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package scaleway
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func TestAccScalewayDataSourceVPCPublicGatewayDHCPReservation_Basic(t *testing.T) {
11+
tt := NewTestTools(t)
12+
defer tt.Cleanup()
13+
pnName := "TestAccScalewayDataSourceVPCPublicGatewayDHCPReservation_Basic"
14+
resource.ParallelTest(t, resource.TestCase{
15+
PreCheck: func() { testAccPreCheck(t) },
16+
ProviderFactories: tt.ProviderFactories,
17+
CheckDestroy: testAccCheckScalewayVPCPublicGatewayDHCPDestroy(tt),
18+
19+
Steps: []resource.TestStep{
20+
{
21+
Config: fmt.Sprintf(`
22+
resource scaleway_vpc_private_network main {
23+
name = "%s"
24+
}
25+
26+
resource "scaleway_instance_server" "main" {
27+
image = "ubuntu_focal"
28+
type = "DEV1-S"
29+
zone = "fr-par-1"
30+
31+
private_network {
32+
pn_id = scaleway_vpc_private_network.main.id
33+
}
34+
}
35+
36+
resource scaleway_vpc_public_gateway_ip main {
37+
}
38+
39+
resource scaleway_vpc_public_gateway_dhcp main {
40+
subnet = "192.168.1.0/24"
41+
}
42+
43+
resource scaleway_vpc_public_gateway main {
44+
name = "foobar"
45+
type = "VPC-GW-S"
46+
ip_id = scaleway_vpc_public_gateway_ip.main.id
47+
}
48+
49+
resource scaleway_vpc_gateway_network main {
50+
gateway_id = scaleway_vpc_public_gateway.main.id
51+
private_network_id = scaleway_vpc_private_network.main.id
52+
dhcp_id = scaleway_vpc_public_gateway_dhcp.main.id
53+
cleanup_dhcp = true
54+
enable_masquerade = true
55+
depends_on = [scaleway_vpc_public_gateway_ip.main, scaleway_vpc_private_network.main]
56+
}
57+
58+
data "scaleway_vpc_public_gateway_dhcp_reservation" "by_mac_address" {
59+
mac_address = "${scaleway_instance_server.main.private_network.0.mac_address}"
60+
depends_on = [scaleway_vpc_gateway_network.main, scaleway_vpc_public_gateway_dhcp.main, scaleway_vpc_private_network.main]
61+
}
62+
`, pnName),
63+
Check: resource.ComposeTestCheckFunc(
64+
resource.TestCheckResourceAttrPair(
65+
"data.scaleway_vpc_public_gateway_dhcp_reservation.by_mac_address", "mac_address",
66+
"scaleway_instance_server.main", "private_network.0.mac_address"),
67+
),
68+
},
69+
},
70+
})
71+
}
72+
73+
func TestAccScalewayDataSourceVPCPublicGatewayDHCPReservation_Static(t *testing.T) {
74+
tt := NewTestTools(t)
75+
defer tt.Cleanup()
76+
pnName := "TestAccScalewayDataSourceVPCPublicGatewayDHCPReservation_Static"
77+
resource.ParallelTest(t, resource.TestCase{
78+
PreCheck: func() { testAccPreCheck(t) },
79+
ProviderFactories: tt.ProviderFactories,
80+
CheckDestroy: testAccCheckScalewayVPCPublicGatewayDHCPDestroy(tt),
81+
82+
Steps: []resource.TestStep{
83+
{
84+
Config: fmt.Sprintf(`
85+
resource scaleway_vpc_private_network main {
86+
name = "%s"
87+
}
88+
89+
resource "scaleway_instance_security_group" main {
90+
inbound_default_policy = "drop"
91+
outbound_default_policy = "accept"
92+
93+
inbound_rule {
94+
action = "accept"
95+
port = "22"
96+
}
97+
}
98+
99+
resource "scaleway_instance_server" "main" {
100+
image = "ubuntu_focal"
101+
type = "DEV1-S"
102+
zone = "fr-par-1"
103+
104+
security_group_id = scaleway_instance_security_group.main.id
105+
106+
private_network {
107+
pn_id = scaleway_vpc_private_network.main.id
108+
}
109+
}
110+
111+
resource scaleway_vpc_public_gateway_ip main {
112+
}
113+
114+
resource scaleway_vpc_public_gateway_dhcp main {
115+
subnet = "192.168.1.0/24"
116+
}
117+
118+
resource scaleway_vpc_public_gateway main {
119+
name = "foobar"
120+
type = "VPC-GW-S"
121+
ip_id = scaleway_vpc_public_gateway_ip.main.id
122+
}
123+
124+
resource scaleway_vpc_gateway_network main {
125+
gateway_id = scaleway_vpc_public_gateway.main.id
126+
private_network_id = scaleway_vpc_private_network.main.id
127+
dhcp_id = scaleway_vpc_public_gateway_dhcp.main.id
128+
cleanup_dhcp = true
129+
enable_masquerade = true
130+
depends_on = [scaleway_vpc_public_gateway_ip.main, scaleway_vpc_private_network.main]
131+
}
132+
133+
resource scaleway_vpc_public_gateway_dhcp_reservation main {
134+
gateway_network_id = scaleway_vpc_gateway_network.main.id
135+
mac_address = scaleway_instance_server.main.private_network.0.mac_address
136+
ip_address = "192.168.1.4"
137+
}
138+
139+
### VPC PAT RULE
140+
resource "scaleway_vpc_public_gateway_pat_rule" "main" {
141+
gateway_id = scaleway_vpc_public_gateway.main.id
142+
private_ip = scaleway_vpc_public_gateway_dhcp_reservation.main.ip_address
143+
private_port = 22
144+
public_port = 2222
145+
protocol = "tcp"
146+
}
147+
148+
data "scaleway_vpc_public_gateway_dhcp_reservation" "by_id" {
149+
reservation_id = "${scaleway_vpc_public_gateway_dhcp_reservation.main.id}"
150+
}
151+
`, pnName),
152+
Check: resource.ComposeTestCheckFunc(
153+
resource.TestCheckResourceAttrPair(
154+
"data.scaleway_vpc_public_gateway_dhcp_reservation.by_id", "mac_address",
155+
"scaleway_instance_server.main", "private_network.0.mac_address"),
156+
),
157+
},
158+
},
159+
})
160+
}

0 commit comments

Comments
 (0)