Skip to content

Commit 722da8f

Browse files
Volatusbeyhan
authored andcommitted
feat: update cloud config generator to support IPv6
Signed-off-by: Ismayil Mirzali <[email protected]>
1 parent 9f041aa commit 722da8f

File tree

2 files changed

+64
-25
lines changed

2 files changed

+64
-25
lines changed

cloudconfig/aws/ops_generator.go

Lines changed: 62 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package aws
33
import (
44
"errors"
55
"fmt"
6+
"maps"
67
"sort"
78
"strings"
89

@@ -92,23 +93,38 @@ func (o OpsGenerator) GenerateVars(state storage.State) (string, error) {
9293
"internal_az_subnet_id_mapping",
9394
"internal_az_subnet_cidr_mapping",
9495
}
96+
cfRequiredOutputs := []string{
97+
"cf_router_lb_name",
98+
"cf_router_lb_internal_security_group",
99+
"cf_ssh_lb_name",
100+
"cf_ssh_lb_internal_security_group",
101+
"cf_tcp_lb_name",
102+
"cf_tcp_lb_internal_security_group",
103+
}
104+
dualstackOutput, ok := terraformOutputs.Map["dualstack"]
105+
if !ok {
106+
return "", fmt.Errorf("dualstack output not present")
107+
}
108+
var dualstack bool
109+
if dualstackOutput.(bool) {
110+
requiredOutputs = append(requiredOutputs,
111+
"internal_cidr_ipv6",
112+
"internal_az_subnet_ipv6_cidr_mapping",
113+
)
114+
dualstack = true
115+
}
116+
95117
switch state.LB.Type {
96118
case "concourse":
97119
requiredOutputs = append(
98120
requiredOutputs,
99121
"concourse_lb_target_groups",
100122
"concourse_lb_internal_security_group",
101123
)
124+
case "nlb":
125+
fallthrough
102126
case "cf":
103-
requiredOutputs = append(
104-
requiredOutputs,
105-
"cf_router_lb_name",
106-
"cf_router_lb_internal_security_group",
107-
"cf_ssh_lb_name",
108-
"cf_ssh_lb_internal_security_group",
109-
"cf_tcp_lb_name",
110-
"cf_tcp_lb_internal_security_group",
111-
)
127+
requiredOutputs = append(requiredOutputs, cfRequiredOutputs...)
112128
}
113129

114130
for _, output := range requiredOutputs {
@@ -124,21 +140,34 @@ func (o OpsGenerator) GenerateVars(state storage.State) (string, error) {
124140
if err != nil {
125141
return "", err
126142
}
143+
if dualstack {
144+
internalAZSubnetIPv6CIDRMap := terraformOutputs.GetStringMap("internal_az_subnet_ipv6_cidr_mapping")
145+
ipv6AvailabilityZones, err := generateAZs(3, internalAZSubnetIDMap, internalAZSubnetIPv6CIDRMap)
146+
if err != nil {
147+
return "", err
148+
}
149+
azs = append(azs, ipv6AvailabilityZones...)
150+
}
127151

128152
varsYAML := map[string]interface{}{}
129-
for k, v := range terraformOutputs.Map {
130-
varsYAML[k] = v
131-
}
153+
maps.Copy(varsYAML, terraformOutputs.Map)
154+
132155
for _, az := range azs {
133156
for key, value := range az {
134157
varsYAML[key] = value
135158
}
136159
}
137-
160+
// TODO: Make the ISO Segments handle IPv6
138161
isoSegAZSubnetIDMap := terraformOutputs.GetStringMap("iso_az_subnet_id_mapping")
139162
isoSegAZSubnetCIDRMap := terraformOutputs.GetStringMap("iso_az_subnet_cidr_mapping")
140163
if len(isoSegAZSubnetIDMap) > 0 && len(isoSegAZSubnetCIDRMap) > 0 {
141-
isoSegAzs, err := generateAZs(len(azs), isoSegAZSubnetIDMap, isoSegAZSubnetCIDRMap)
164+
// If not running IPv6, start the index after len(azs) many subnets
165+
// If running IPv6, double we need to offset by another len(azs) to accommodate the IPv6 entries
166+
offset := len(azs)
167+
if dualstack {
168+
offset = len(azs) * 2
169+
}
170+
isoSegAzs, err := generateAZs(offset, isoSegAZSubnetIDMap, isoSegAZSubnetCIDRMap)
142171
if err == nil {
143172
for _, az := range isoSegAzs {
144173
for key, value := range az {
@@ -219,7 +248,7 @@ func (o OpsGenerator) generateOps(state storage.State) ([]op, error) {
219248
if err != nil {
220249
return []op{}, fmt.Errorf("Retrieve availability zones: %s", err) //nolint:staticcheck
221250
}
222-
251+
// This block doesn't seem to handle generating the OPs for isolation segments?
223252
for i := range azs {
224253
azOp := createOp("replace", "/azs/-", az{
225254
Name: fmt.Sprintf("z%d", i+1),
@@ -229,8 +258,15 @@ func (o OpsGenerator) generateOps(state storage.State) ([]op, error) {
229258
})
230259
ops = append(ops, azOp)
231260

232-
subnet := generateNetworkSubnet(i)
233-
subnets = append(subnets, subnet)
261+
// IPv4 Subnets don't need offset
262+
ipv4Subnet := generateNetworkSubnet(i, 0)
263+
subnets = append(subnets, ipv4Subnet)
264+
265+
if state.LB.Type == "nlb" {
266+
// IPv6 subnets need to set the same values as IPv4 for
267+
// AZ name (e.g z1, z2, z3) but require an offset value for templating reasons
268+
subnets = append(subnets, generateNetworkSubnet(i, len(azs)))
269+
}
234270
}
235271

236272
ops = append(ops, createOp("replace", "/networks/-", network{
@@ -246,6 +282,8 @@ func (o OpsGenerator) generateOps(state storage.State) ([]op, error) {
246282
}))
247283

248284
switch state.LB.Type {
285+
case "nlb":
286+
fallthrough
249287
case "cf":
250288
lbSecurityGroups := []map[string]string{
251289
{"name": "cf-router-network-properties", "lb": "((cf_router_lb_name))", "group": "((cf_router_lb_internal_security_group))"},
@@ -307,21 +345,21 @@ func azify(az int, azName, cidr, subnet string) (map[string]string, error) {
307345
}, nil
308346
}
309347

310-
func generateNetworkSubnet(az int) networkSubnet {
348+
func generateNetworkSubnet(az int, offset int) networkSubnet {
311349
az++
312350
return networkSubnet{
313351
AZ: fmt.Sprintf("z%d", az),
314-
Gateway: fmt.Sprintf("((az%d_gateway))", az),
315-
Range: fmt.Sprintf("((az%d_range))", az),
352+
Gateway: fmt.Sprintf("((az%d_gateway))", az+offset),
353+
Range: fmt.Sprintf("((az%d_range))", az+offset),
316354
Reserved: []string{
317-
fmt.Sprintf("((az%d_reserved_1))", az),
318-
fmt.Sprintf("((az%d_reserved_2))", az),
355+
fmt.Sprintf("((az%d_reserved_1))", az+offset),
356+
fmt.Sprintf("((az%d_reserved_2))", az+offset),
319357
},
320358
Static: []string{
321-
fmt.Sprintf("((az%d_static))", az),
359+
fmt.Sprintf("((az%d_static))", az+offset),
322360
},
323361
CloudProperties: networkSubnetCloudProperties{
324-
Subnet: fmt.Sprintf("((az%d_subnet))", az),
362+
Subnet: fmt.Sprintf("((az%d_subnet))", az+offset),
325363
SecurityGroups: []string{"((internal_security_group))"},
326364
},
327365
}

cloudconfig/aws/ops_generator_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ var _ = Describe("OpsGenerator", func() {
4747
"cf_tcp_lb_internal_security_group": "some-cf-tcp-lb-internal-security-group",
4848
"concourse_lb_target_groups": []string{"some-concourse-lb-target-group", "some-other-concourse-lb-target-group"},
4949
"concourse_lb_internal_security_group": "some-concourse-lb-internal-security-group",
50+
"dualstack": "false",
5051
"internal_az_subnet_id_mapping": map[string]interface{}{
5152
"us-east-1c": "some-internal-subnet-ids-3",
5253
"us-east-1a": "some-internal-subnet-ids-1",
@@ -191,7 +192,7 @@ iso_az_subnet_id_mapping:
191192
Expect(err).To(MatchError(fmt.Sprintf("missing %s terraform output", outputKey)))
192193
},
193194
Entry("when internal_security_group is missing", "internal_security_group", ""),
194-
195+
Entry("when dualstack is missing", "dualstack", "nlb"),
195196
Entry("when internal_az_subnet_id_mapping is missing", "internal_az_subnet_id_mapping", "cf"),
196197
Entry("when internal_az_subnet_cidr_mapping is missing", "internal_az_subnet_cidr_mapping", "cf"),
197198
Entry("when cf_router_lb_name is missing", "cf_router_lb_name", "cf"),

0 commit comments

Comments
 (0)