Skip to content

Commit 96aeffa

Browse files
yfodilremyleone
andauthored
feat(lb): add ipam ids config on private network (#2650)
* bump sdk go * add support for ipam ids * add doc * fix * fix --------- Co-authored-by: Rémy Léone <[email protected]>
1 parent 5177d3c commit 96aeffa

File tree

10 files changed

+2112
-19
lines changed

10 files changed

+2112
-19
lines changed

docs/resources/lb.md

+38-2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,42 @@ resource scaleway_lb main {
5151
}
5252
```
5353

54+
### With IPAM IDs
55+
56+
```terraform
57+
resource "scaleway_vpc" "vpc01" {
58+
name = "my vpc"
59+
}
60+
61+
resource "scaleway_vpc_private_network" "pn01" {
62+
vpc_id = scaleway_vpc.vpc01.id
63+
ipv4_subnet {
64+
subnet = "172.16.32.0/22"
65+
}
66+
}
67+
68+
resource "scaleway_ipam_ip" "ip01" {
69+
address = "172.16.32.7"
70+
source {
71+
private_network_id = scaleway_vpc_private_network.pn01.id
72+
}
73+
}
74+
75+
resource "scaleway_lb_ip" "v4" {
76+
}
77+
78+
resource scaleway_lb main {
79+
ip_ids = [scaleway_lb_ip.v4.id]
80+
name = "my-lb"
81+
type = "LB-S"
82+
83+
private_network {
84+
private_network_id = scaleway_vpc_private_network.pn01.id
85+
ipam_ids = [scaleway_ipam_ip.ip01.id]
86+
}
87+
}
88+
```
89+
5490
### Multiple configurations
5591

5692
```terraform
@@ -206,11 +242,11 @@ resource "scaleway_lb" "main" {
206242

207243
- ~> **Important:** Updates to `private_network` will recreate the attachment.
208244

209-
- `static_config` - (Deprecated) Please use `dhcp_config`. Define a local ip address of your choice for the load balancer instance.
245+
- `ipam_ids` - (Optional) IPAM ID of a pre-reserved IP address to assign to the Load Balancer on this Private Network.
210246

211247
- `dhcp_config` - (Optional) Set to `true` if you want to let DHCP assign IP addresses. See below.
212248

213-
~> **Important:** Only dhcp_config may be set.
249+
- `static_config` - (Deprecated) Please use `ipam_ids`. Define a local ip address of your choice for the load balancer instance.
214250

215251
- `zone` - (Defaults to [provider](../index.md#zone) `zone`) The [zone](../guides/regions_and_zones.md#zones) in which the Private Network was created.
216252

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ require (
2323
github.com/nats-io/jwt/v2 v2.5.7
2424
github.com/nats-io/nats.go v1.36.0
2525
github.com/robfig/cron/v3 v3.0.1
26-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.28.0.20240627072537-5f842364d6c9
26+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.28.0.20240701163427-0792fd8679cc
2727
github.com/stretchr/testify v1.9.0
2828
golang.org/x/crypto v0.24.0
2929
gopkg.in/dnaeon/go-vcr.v3 v3.2.0

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,8 @@ github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXq
242242
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
243243
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
244244
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
245-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.28.0.20240627072537-5f842364d6c9 h1:Gt4xayTKi0W7t5tC+O+/L8lm99rCMjyM0orOwE3fKNw=
246-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.28.0.20240627072537-5f842364d6c9/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
245+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.28.0.20240701163427-0792fd8679cc h1:8qXfdtlHHpk7rATrznSV0yy9KUIMP3YqijMdz64OO9Q=
246+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.28.0.20240701163427-0792fd8679cc/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
247247
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
248248
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
249249
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=

internal/locality/ids.go

+12
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,15 @@ func ExpandID(id interface{}) string {
88
}
99
return ID
1010
}
11+
12+
func ExpandIDs(data interface{}) []string {
13+
expandedIDs := make([]string, 0, len(data.([]interface{})))
14+
for _, s := range data.([]interface{}) {
15+
if s == nil {
16+
s = ""
17+
}
18+
expandedID := ExpandID(s.(string))
19+
expandedIDs = append(expandedIDs, expandedID)
20+
}
21+
return expandedIDs
22+
}

internal/services/flexibleip/data_source_flexible_ips.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
88
flexibleip "github.com/scaleway/scaleway-sdk-go/api/flexibleip/v1alpha1"
99
"github.com/scaleway/scaleway-sdk-go/scw"
10+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
1011
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/zonal"
1112
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/account"
1213
"github.com/scaleway/terraform-provider-scaleway/v2/internal/types"
@@ -133,7 +134,7 @@ func DataSourceFlexibleIPsRead(ctx context.Context, d *schema.ResourceData, m in
133134

134135
res, err := fipAPI.ListFlexibleIPs(&flexibleip.ListFlexibleIPsRequest{
135136
Zone: zone,
136-
ServerIDs: expandServerIDs(d.Get("server_ids")),
137+
ServerIDs: locality.ExpandIDs(d.Get("server_ids")),
137138
ProjectID: types.ExpandStringPtr(d.Get("project_id")),
138139
Tags: types.ExpandStrings(d.Get("tags")),
139140
}, scw.WithContext(ctx))

internal/services/flexibleip/types.go

-13
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package flexibleip
22

33
import (
44
flexibleip "github.com/scaleway/scaleway-sdk-go/api/flexibleip/v1alpha1"
5-
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
65
"github.com/scaleway/terraform-provider-scaleway/v2/internal/types"
76
)
87

@@ -22,15 +21,3 @@ func flattenFlexibleIPMacAddress(mac *flexibleip.MACAddress) interface{} {
2221
},
2322
}
2423
}
25-
26-
func expandServerIDs(data interface{}) []string {
27-
expandedIDs := make([]string, 0, len(data.([]interface{})))
28-
for _, s := range data.([]interface{}) {
29-
if s == nil {
30-
s = ""
31-
}
32-
expandedID := locality.ExpandID(s.(string))
33-
expandedIDs = append(expandedIDs, expandedID)
34-
}
35-
return expandedIDs
36-
}

internal/services/lb/lb.go

+10
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,16 @@ func ResourceLb() *schema.Resource {
143143
Optional: true,
144144
Computed: true,
145145
},
146+
"ipam_ids": {
147+
Type: schema.TypeList,
148+
Elem: &schema.Schema{
149+
Type: schema.TypeString,
150+
},
151+
MaxItems: 1,
152+
Optional: true,
153+
Computed: true,
154+
Description: "IPAM ID of a pre-reserved IP address to assign to the Load Balancer on this Private Network",
155+
},
146156
// Readonly attributes
147157
"status": {
148158
Type: schema.TypeString,

internal/services/lb/lb_test.go

+66
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,72 @@ func TestAccLB_WithPrivateNetworksOnDHCPConfig(t *testing.T) {
460460
})
461461
}
462462

463+
func TestAccLB_WithPrivateNetworksIPAMIDs(t *testing.T) {
464+
tt := acctest.NewTestTools(t)
465+
defer tt.Cleanup()
466+
resource.ParallelTest(t, resource.TestCase{
467+
PreCheck: func() { acctest.PreCheck(t) },
468+
ProviderFactories: tt.ProviderFactories,
469+
CheckDestroy: resource.ComposeTestCheckFunc(
470+
isLbDestroyed(tt),
471+
vpcchecks.CheckPrivateNetworkDestroy(tt),
472+
),
473+
Steps: []resource.TestStep{
474+
{
475+
Config: `
476+
resource "scaleway_vpc" "vpc01" {
477+
name = "my vpc"
478+
}
479+
480+
resource "scaleway_vpc_private_network" "pn01" {
481+
vpc_id = scaleway_vpc.vpc01.id
482+
ipv4_subnet {
483+
subnet = "172.16.32.0/22"
484+
}
485+
}
486+
487+
resource "scaleway_ipam_ip" "ip01" {
488+
address = "172.16.32.7"
489+
source {
490+
private_network_id = scaleway_vpc_private_network.pn01.id
491+
}
492+
}
493+
494+
resource scaleway_lb lb01 {
495+
name = "test-lb-with-private-network-ipam"
496+
type = "LB-S"
497+
498+
private_network {
499+
private_network_id = scaleway_vpc_private_network.pn01.id
500+
ipam_ids = [scaleway_ipam_ip.ip01.id]
501+
}
502+
}
503+
504+
data "scaleway_ipam_ip" "by_name" {
505+
resource {
506+
name = scaleway_lb.lb01.name
507+
type = "lb_server"
508+
}
509+
type = "ipv4"
510+
}
511+
`,
512+
Check: resource.ComposeTestCheckFunc(
513+
isLbPresent(tt, "scaleway_lb.lb01"),
514+
resource.TestCheckResourceAttrPair(
515+
"scaleway_lb.lb01", "private_network.0.private_network_id",
516+
"scaleway_vpc_private_network.pn01", "id"),
517+
resource.TestCheckResourceAttrPair(
518+
"scaleway_lb.lb01", "private_network.0.ipam_ids.0",
519+
"scaleway_ipam_ip.ip01", "id"),
520+
resource.TestCheckResourceAttrPair(
521+
"scaleway_ipam_ip.ip01", "address",
522+
"data.scaleway_ipam_ip.by_name", "address_cidr"),
523+
),
524+
},
525+
},
526+
})
527+
}
528+
463529
func TestAccLB_WithoutPNConfig(t *testing.T) {
464530
tt := acctest.NewTestTools(t)
465531
defer tt.Cleanup()

0 commit comments

Comments
 (0)