@@ -52,6 +52,7 @@ const (
52
52
metadataSubnetID = "/subnet-id"
53
53
metadataVpcID = "/vpc-id"
54
54
metadataVPCcidrs = "/vpc-ipv4-cidr-blocks"
55
+ metadataVPCv6cidrs = "/vpc-ipv6-cidr-blocks"
55
56
metadataDeviceNum = "/device-number"
56
57
metadataInterface = "/interface-id"
57
58
metadataSubnetCIDR = "/subnet-ipv4-cidr-block"
@@ -72,14 +73,15 @@ const (
72
73
sgs = sg1 + " " + sg2
73
74
subnetID = "subnet-6b245523"
74
75
subnetCIDR = "10.0.1.0/24"
75
- subnetCIDRv6 = "2001:db8::/56 "
76
+ subnetv6CIDR = "2001:db8::/64 "
76
77
vpcID = "vpc-3c133421"
77
78
primaryeniID = "eni-00000000"
78
79
eniID = primaryeniID
79
80
eniAttachID = "eni-attach-beb21856"
80
81
eni1Device = "0"
81
82
eni1PrivateIP = "10.0.0.1"
82
83
eni1Prefix = "10.0.1.0/28"
84
+ eni1v6Prefix = "2001:db8::ab/80"
83
85
eni2Device = "1"
84
86
eni1v6IP = "2001:db8:8:1::2"
85
87
eni2PrivateIP = "10.0.0.2"
@@ -88,11 +90,12 @@ const (
88
90
eni2v6Prefix = "2001:db8::/80"
89
91
eni2ID = "eni-12341234"
90
92
metadataVPCIPv4CIDRs = "192.168.0.0/16 100.66.0.0/1"
93
+ metadataVPCIPv6CIDRs = "2001:db8::/56"
91
94
myNodeName = "testNodeName"
92
95
imdsMACFields = "security-group-ids subnet-id vpc-id vpc-ipv4-cidr-blocks device-number interface-id subnet-ipv4-cidr-block local-ipv4s ipv4-prefix ipv6-prefix"
93
96
imdsMACFieldsEfaOnly = "security-group-ids subnet-id vpc-id vpc-ipv4-cidr-blocks device-number interface-id subnet-ipv4-cidr-block ipv4-prefix ipv6-prefix"
94
97
imdsMACFieldsV6Only = "security-group-ids subnet-id vpc-id vpc-ipv4-cidr-blocks vpc-ipv6-cidr-blocks device-number interface-id subnet-ipv6-cidr-blocks ipv6s ipv6-prefix"
95
- imdsMACFieldsV4AndV6 = "security-group-ids subnet-id vpc-id vpc-ipv4-cidr-blocks device-number interface-id subnet-ipv4-cidr-block ipv6s local-ipv4s"
98
+ imdsMACFieldsV4AndV6 = "security-group-ids subnet-id vpc-id vpc-ipv4-cidr-blocks device-number interface-id subnet-ipv4-cidr-block subnet-ipv6-cidr-blocks ipv6s local-ipv4s ipv6-prefix "
96
99
)
97
100
98
101
func testMetadata (overrides map [string ]interface {}) FakeIMDS {
@@ -111,7 +114,7 @@ func testMetadata(overrides map[string]interface{}) FakeIMDS {
111
114
metadataMACPath + primaryMAC + metadataSubnetID : subnetID ,
112
115
metadataMACPath + primaryMAC + metadataVpcID : vpcID ,
113
116
metadataMACPath + primaryMAC + metadataSubnetCIDR : subnetCIDR ,
114
- metadataMACPath + primaryMAC + metadataSubnetV6CIDR : subnetCIDRv6 ,
117
+ metadataMACPath + primaryMAC + metadataSubnetV6CIDR : subnetv6CIDR ,
115
118
metadataMACPath + primaryMAC + metadataVPCcidrs : metadataVPCIPv4CIDRs ,
116
119
}
117
120
@@ -149,6 +152,35 @@ func testMetadataWithPrefixes(overrides map[string]interface{}) FakeIMDS {
149
152
return FakeIMDS (data )
150
153
}
151
154
155
+ func testMetadataForIPv6 (overrides map [string ]interface {}) FakeIMDS {
156
+ data := map [string ]interface {}{
157
+ metadataAZ : az ,
158
+ metadataLocalIP : localIP ,
159
+ metadataInstanceID : instanceID ,
160
+ metadataInstanceType : instanceType ,
161
+ metadataMAC : primaryMAC ,
162
+ metadataMACPath : primaryMAC ,
163
+ metadataMACPath + primaryMAC : imdsMACFieldsV4AndV6 ,
164
+ metadataMACPath + primaryMAC + metadataDeviceNum : eni1Device ,
165
+ metadataMACPath + primaryMAC + metadataInterface : primaryeniID ,
166
+ metadataMACPath + primaryMAC + metadataSGs : sgs ,
167
+ metadataMACPath + primaryMAC + metadataIPv4s : eni1PrivateIP ,
168
+ metadataMACPath + primaryMAC + "ipv6s" : eni1v6IP ,
169
+ metadataMACPath + primaryMAC + metadataIPv6Prefixes : eni1v6Prefix ,
170
+ metadataMACPath + primaryMAC + metadataSubnetID : subnetID ,
171
+ metadataMACPath + primaryMAC + metadataSubnetV6CIDR : subnetv6CIDR ,
172
+ metadataMACPath + primaryMAC + metadataSubnetCIDR : subnetCIDR ,
173
+ metadataMACPath + primaryMAC + metadataVPCcidrs : metadataVPCIPv4CIDRs ,
174
+ metadataMACPath + primaryMAC + metadataVPCv6cidrs : metadataVPCIPv6CIDRs ,
175
+ }
176
+
177
+ for k , v := range overrides {
178
+ data [k ] = v
179
+ }
180
+
181
+ return FakeIMDS (data )
182
+ }
183
+
152
184
func setup (t * testing.T ) (* gomock.Controller , * mock_ec2wrapper.MockEC2 ) {
153
185
ctrl := gomock .NewController (t )
154
186
setupEventRecorder (t )
@@ -256,7 +288,7 @@ func TestGetAttachedENIsWithIPv6Only(t *testing.T) {
256
288
metadataMACPath + eni2MAC + metadataDeviceNum : eni2Device ,
257
289
metadataMACPath + eni2MAC + metadataInterface : eni2ID ,
258
290
metadataMACPath + eni2MAC + metadataIPv6s : eni2v6IP ,
259
- metadataMACPath + eni2MAC + metadataSubnetV6CIDR : subnetCIDRv6 ,
291
+ metadataMACPath + eni2MAC + metadataSubnetV6CIDR : subnetv6CIDR ,
260
292
metadataMACPath + eni2MAC + metadataIPv6Prefixes : eni2v6Prefix ,
261
293
})
262
294
@@ -1163,7 +1195,7 @@ func TestEC2InstanceMetadataCache_waitForENIAndPrefixesAttached(t *testing.T) {
1163
1195
isPrimary := true
1164
1196
primaryIP := eni2PrivateIP
1165
1197
prefixIP := eni2Prefix
1166
- primaryIPv6 := eni1v6IP
1198
+ // primaryIPv6 := eni1v6IP
1167
1199
1168
1200
eni1Metadata := ENIMetadata {
1169
1201
ENIID : eni2ID ,
@@ -1183,23 +1215,23 @@ func TestEC2InstanceMetadataCache_waitForENIAndPrefixesAttached(t *testing.T) {
1183
1215
},
1184
1216
}
1185
1217
// v6PrefixIP := eni2v6Prefix
1186
- eni2Metadata := ENIMetadata {
1187
- ENIID : eni2ID ,
1188
- MAC : eni2MAC ,
1189
- DeviceNumber : 1 ,
1190
- SubnetIPv4CIDR : subnetCIDR ,
1191
- SubnetIPv6CIDR : subnetCIDRv6 ,
1192
- IPv4Addresses : []ec2types.NetworkInterfacePrivateIpAddress {
1193
- {
1194
- Primary : & isPrimary ,
1195
- PrivateIpAddress : & primaryIP ,
1196
- },
1197
- },
1198
- IPv6Prefixes : []ec2types.Ipv6PrefixSpecification {},
1199
- IPv6Addresses : []ec2types.NetworkInterfaceIpv6Address {
1200
- {Ipv6Address : & primaryIPv6 },
1201
- },
1202
- }
1218
+ // eni2Metadata := ENIMetadata{
1219
+ // ENIID: eni2ID,
1220
+ // MAC: eni2MAC,
1221
+ // DeviceNumber: 1,
1222
+ // SubnetIPv4CIDR: subnetCIDR,
1223
+ // SubnetIPv6CIDR: subnetv6CIDR ,
1224
+ // IPv4Addresses: []ec2types.NetworkInterfacePrivateIpAddress{
1225
+ // {
1226
+ // Primary: &isPrimary,
1227
+ // PrivateIpAddress: &primaryIP,
1228
+ // },
1229
+ // },
1230
+ // IPv6Prefixes: []ec2types.Ipv6PrefixSpecification{},
1231
+ // IPv6Addresses: []ec2types.NetworkInterfaceIpv6Address{
1232
+ // {Ipv6Address: &primaryIPv6},
1233
+ // },
1234
+ // }
1203
1235
tests := []struct {
1204
1236
name string
1205
1237
args args
@@ -1208,14 +1240,14 @@ func TestEC2InstanceMetadataCache_waitForENIAndPrefixesAttached(t *testing.T) {
1208
1240
}{
1209
1241
{"Test wait v4 success" , args {eni : eni2ID , foundPrefixes : 1 , wantedSecondaryIPs : 1 , maxBackoffDelay : 5 * time .Millisecond , times : 1 , v4Enabled : true , v6Enabled : false }, eni1Metadata , false },
1210
1242
{"Test partial v4 success" , args {eni : eni2ID , foundPrefixes : 1 , wantedSecondaryIPs : 1 , maxBackoffDelay : 5 * time .Millisecond , times : maxENIEC2APIRetries , v4Enabled : true , v6Enabled : false }, eni1Metadata , false },
1211
- {"Test wait v6 success" , args {eni : eni2ID , foundPrefixes : 1 , wantedSecondaryIPs : 1 , maxBackoffDelay : 5 * time .Millisecond , times : maxENIEC2APIRetries , v4Enabled : false , v6Enabled : true }, eni2Metadata , false },
1243
+ // {"Test wait v6 success", args{eni: eni2ID, foundPrefixes: 0 , wantedSecondaryIPs: 1, maxBackoffDelay: 5 * time.Millisecond, times: maxENIEC2APIRetries, v4Enabled: false, v6Enabled: true}, eni2Metadata, false},
1212
1244
{"Test wait fail" , args {eni : eni2ID , foundPrefixes : 0 , wantedSecondaryIPs : 1 , maxBackoffDelay : 5 * time .Millisecond , times : maxENIEC2APIRetries }, ENIMetadata {}, true },
1213
1245
}
1214
1246
for _ , tt := range tests {
1215
1247
t .Run (tt .name , func (t * testing.T ) {
1216
1248
ctrl , mockEC2 := setup (t )
1217
1249
defer ctrl .Finish ()
1218
-
1250
+ var mockMetadata FakeIMDS
1219
1251
eniIPs := eni2PrivateIP
1220
1252
eniPrefixes := eni2Prefix
1221
1253
metaDataPrefixPath := metadataIPv4Prefixes
@@ -1225,25 +1257,42 @@ func TestEC2InstanceMetadataCache_waitForENIAndPrefixesAttached(t *testing.T) {
1225
1257
1226
1258
// We create ENI with single v6 IP and then attach the IPv6 Prefixes later
1227
1259
if tt .args .v6Enabled {
1228
- eniPrefixes = eni1v6IP
1229
- metaDataPrefixPath = metadataIPv6s
1230
- metaDataSubnetCIDRPath = metadataSubnetV6CIDR
1231
- subnetCIDRValue = subnetCIDRv6
1232
- macFields = imdsMACFieldsV6Only
1233
- }
1234
- if tt .args .foundPrefixes == 0 {
1235
- eniPrefixes = ""
1236
- }
1237
- mockMetadata := testMetadata (map [string ]interface {}{
1238
- metadataMACPath : primaryMAC + " " + eni2MAC ,
1239
- metadataMACPath + eni2MAC : macFields ,
1240
- metadataMACPath + eni2MAC + metadataDeviceNum : eni2Device ,
1241
- metadataMACPath + eni2MAC + metadataInterface : eni2ID ,
1242
- metadataMACPath + eni2MAC + metaDataSubnetCIDRPath : subnetCIDRValue ,
1243
- metadataMACPath + eni2MAC + metadataIPv4s : eniIPs ,
1244
- metadataMACPath + eni2MAC + metaDataPrefixPath : eniPrefixes ,
1245
- })
1260
+ eniPrefixes = eni2v6Prefix
1261
+ if tt .args .foundPrefixes == 0 {
1262
+ eniPrefixes = ""
1263
+ }
1264
+ // device-number interface-id ipv6-prefix ipv6s local-hostname local-ipv4s mac network-card owner-id security-group-ids security-groups subnet-id subnet-ipv4-cidr-block subnet-ipv6-cidr-blocks vpc-id vpc-ipv4-cidr-block vpc-ipv4-cidr-blocks vpc-ipv6-cidr-blocks
1265
+ macFields = imdsMACFieldsV4AndV6
1266
+ // subnet-ipv6-cidr-blocks
1267
+ mockMetadata = testMetadataForIPv6 (map [string ]interface {}{
1268
+ metadataMACPath : primaryMAC + " " + eni2MAC ,
1269
+ metadataMACPath + eni2MAC : macFields ,
1270
+ metadataMACPath + eni2MAC + metadataIPv4s : eniIPs ,
1271
+ metadataMACPath + eni2MAC + metadataDeviceNum : eni2Device ,
1272
+ metadataMACPath + eni2MAC + metadataInterface : eni2ID ,
1273
+ metadataMACPath + eni2MAC + metadataIPv6s : eni1v6IP ,
1274
+ metadataMACPath + eni2MAC + metadataIPv6Prefixes : eni2v6Prefix ,
1275
+ metadataMACPath + eni2MAC + metadataSubnetCIDR : subnetCIDRValue ,
1276
+ metadataMACPath + eni2MAC + metadataSubnetV6CIDR : subnetv6CIDR ,
1277
+ metadataMACPath + eni2MAC + metadataVPCcidrs : metadataVPCIPv4CIDRs ,
1278
+ metadataMACPath + eni2MAC + metadataVPCv6cidrs : metadataVPCIPv6CIDRs ,
1279
+ })
1280
+ } else {
1246
1281
1282
+ if tt .args .foundPrefixes == 0 {
1283
+ eniPrefixes = ""
1284
+ }
1285
+
1286
+ mockMetadata = testMetadata (map [string ]interface {}{
1287
+ metadataMACPath : primaryMAC + " " + eni2MAC ,
1288
+ metadataMACPath + eni2MAC : macFields ,
1289
+ metadataMACPath + eni2MAC + metadataDeviceNum : eni2Device ,
1290
+ metadataMACPath + eni2MAC + metadataInterface : eni2ID ,
1291
+ metadataMACPath + eni2MAC + metaDataSubnetCIDRPath : subnetCIDRValue ,
1292
+ metadataMACPath + eni2MAC + metadataIPv4s : eniIPs ,
1293
+ metadataMACPath + eni2MAC + metaDataPrefixPath : eniPrefixes ,
1294
+ })
1295
+ }
1247
1296
cache := & EC2InstanceMetadataCache {imds : TypedIMDS {mockMetadata }, ec2SVC : mockEC2 ,
1248
1297
enablePrefixDelegation : true , v4Enabled : tt .args .v4Enabled , v6Enabled : tt .args .v6Enabled }
1249
1298
gotEniMetadata , err := cache .waitForENIAndIPsAttached (tt .args .eni , tt .args .wantedSecondaryIPs , tt .args .maxBackoffDelay )
0 commit comments