@@ -3,6 +3,7 @@ package aws
3
3
import (
4
4
"errors"
5
5
"fmt"
6
+ "maps"
6
7
"sort"
7
8
"strings"
8
9
@@ -92,23 +93,38 @@ func (o OpsGenerator) GenerateVars(state storage.State) (string, error) {
92
93
"internal_az_subnet_id_mapping" ,
93
94
"internal_az_subnet_cidr_mapping" ,
94
95
}
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
+
95
117
switch state .LB .Type {
96
118
case "concourse" :
97
119
requiredOutputs = append (
98
120
requiredOutputs ,
99
121
"concourse_lb_target_groups" ,
100
122
"concourse_lb_internal_security_group" ,
101
123
)
124
+ case "nlb" :
125
+ fallthrough
102
126
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 ... )
112
128
}
113
129
114
130
for _ , output := range requiredOutputs {
@@ -124,21 +140,34 @@ func (o OpsGenerator) GenerateVars(state storage.State) (string, error) {
124
140
if err != nil {
125
141
return "" , err
126
142
}
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
+ }
127
151
128
152
varsYAML := map [string ]interface {}{}
129
- for k , v := range terraformOutputs .Map {
130
- varsYAML [k ] = v
131
- }
153
+ maps .Copy (varsYAML , terraformOutputs .Map )
154
+
132
155
for _ , az := range azs {
133
156
for key , value := range az {
134
157
varsYAML [key ] = value
135
158
}
136
159
}
137
-
160
+ // TODO: Make the ISO Segments handle IPv6
138
161
isoSegAZSubnetIDMap := terraformOutputs .GetStringMap ("iso_az_subnet_id_mapping" )
139
162
isoSegAZSubnetCIDRMap := terraformOutputs .GetStringMap ("iso_az_subnet_cidr_mapping" )
140
163
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 )
142
171
if err == nil {
143
172
for _ , az := range isoSegAzs {
144
173
for key , value := range az {
@@ -219,7 +248,7 @@ func (o OpsGenerator) generateOps(state storage.State) ([]op, error) {
219
248
if err != nil {
220
249
return []op {}, fmt .Errorf ("Retrieve availability zones: %s" , err ) //nolint:staticcheck
221
250
}
222
-
251
+ // This block doesn't seem to handle generating the OPs for isolation segments?
223
252
for i := range azs {
224
253
azOp := createOp ("replace" , "/azs/-" , az {
225
254
Name : fmt .Sprintf ("z%d" , i + 1 ),
@@ -229,8 +258,15 @@ func (o OpsGenerator) generateOps(state storage.State) ([]op, error) {
229
258
})
230
259
ops = append (ops , azOp )
231
260
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
+ }
234
270
}
235
271
236
272
ops = append (ops , createOp ("replace" , "/networks/-" , network {
@@ -246,6 +282,8 @@ func (o OpsGenerator) generateOps(state storage.State) ([]op, error) {
246
282
}))
247
283
248
284
switch state .LB .Type {
285
+ case "nlb" :
286
+ fallthrough
249
287
case "cf" :
250
288
lbSecurityGroups := []map [string ]string {
251
289
{"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) {
307
345
}, nil
308
346
}
309
347
310
- func generateNetworkSubnet (az int ) networkSubnet {
348
+ func generateNetworkSubnet (az int , offset int ) networkSubnet {
311
349
az ++
312
350
return networkSubnet {
313
351
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 ),
316
354
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 ),
319
357
},
320
358
Static : []string {
321
- fmt .Sprintf ("((az%d_static))" , az ),
359
+ fmt .Sprintf ("((az%d_static))" , az + offset ),
322
360
},
323
361
CloudProperties : networkSubnetCloudProperties {
324
- Subnet : fmt .Sprintf ("((az%d_subnet))" , az ),
362
+ Subnet : fmt .Sprintf ("((az%d_subnet))" , az + offset ),
325
363
SecurityGroups : []string {"((internal_security_group))" },
326
364
},
327
365
}
0 commit comments