Skip to content

Commit ed16c61

Browse files
committed
rebase to latest mainline chnages
1 parent 67c9028 commit ed16c61

File tree

6 files changed

+102
-64
lines changed

6 files changed

+102
-64
lines changed

pkg/ipamd/datastore/data_store.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ type ENI struct {
130130
IPv6Cidrs map[string]*CidrInfo
131131
// IsExcludedForPodIPs indicates whether this ENI should be excluded from pod IP allocation
132132
IsExcludedForPodIPs bool
133+
// RouteTableID is the route table ID associated with the ENI on the host
134+
RouteTableID int
133135
}
134136

135137
// AddressInfo contains information about an IP, Exported fields will be marshaled for introspection.

pkg/ipamd/datastore/data_store_test.go

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,7 +1089,7 @@ func TestAssignedIPv6Addresses(t *testing.T) {
10891089
ds := NewDataStore(Testlog, NullCheckpoint{}, true, defaultNetworkCard)
10901090

10911091
// Test ENI with no IPv6 CIDRs
1092-
_ = ds.AddENI("eni-1", 1, true, false, false)
1092+
_ = ds.AddENI("eni-1", 1, true, false, false, 0)
10931093
eniInfo, _ := ds.eniPool["eni-1"]
10941094
assert.Equal(t, 0, eniInfo.AssignedIPv6Addresses(), "ENI with no IPv6 CIDRs should have 0 assigned addresses")
10951095

@@ -1100,13 +1100,13 @@ func TestAssignedIPv6Addresses(t *testing.T) {
11001100

11011101
// Assign first IPv6 address to a pod
11021102
key1 := IPAMKey{"net0", "sandbox-1", "eth0"}
1103-
_, _, err := ds.AssignPodIPv6Address(key1, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-1"})
1103+
_, _, _, err := ds.AssignPodIPv6Address(key1, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-1"})
11041104
assert.NoError(t, err)
11051105
assert.Equal(t, 1, eniInfo.AssignedIPv6Addresses(), "Should have 1 assigned IPv6 address after first pod assignment")
11061106

11071107
// Assign second IPv6 address to another pod
11081108
key2 := IPAMKey{"net0", "sandbox-2", "eth0"}
1109-
_, _, err = ds.AssignPodIPv6Address(key2, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-2"})
1109+
_, _, _, err = ds.AssignPodIPv6Address(key2, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-2"})
11101110
assert.NoError(t, err)
11111111
assert.Equal(t, 2, eniInfo.AssignedIPv6Addresses(), "Should have 2 assigned IPv6 addresses after second pod assignment")
11121112

@@ -1117,12 +1117,12 @@ func TestAssignedIPv6Addresses(t *testing.T) {
11171117

11181118
// Assign address from the second CIDR
11191119
key3 := IPAMKey{"net0", "sandbox-3", "eth0"}
1120-
_, _, err = ds.AssignPodIPv6Address(key3, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-3"})
1120+
_, _, _, err = ds.AssignPodIPv6Address(key3, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-3"})
11211121
assert.NoError(t, err)
11221122
assert.Equal(t, 3, eniInfo.AssignedIPv6Addresses(), "Should have 3 assigned IPv6 addresses across multiple CIDRs")
11231123

11241124
// Unassign one address
1125-
_, _, _, _, err = ds.UnassignPodIPAddress(key1)
1125+
_, _, _, _, _, err = ds.UnassignPodIPAddress(key1)
11261126
assert.NoError(t, err)
11271127
assert.Equal(t, 2, eniInfo.AssignedIPv6Addresses(), "Should have 2 assigned IPv6 addresses after unassignment")
11281128

@@ -1138,7 +1138,7 @@ func TestAssignedIPv6Addresses(t *testing.T) {
11381138
// Assign additional addresses from different CIDRs - they will all go to eni-1 (primary) in IPv6 PD mode
11391139
for i := 0; i < 3; i++ {
11401140
key := IPAMKey{"net0", fmt.Sprintf("sandbox-eni1-%d", i), "eth0"}
1141-
_, _, err = ds.AssignPodIPv6Address(key, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: fmt.Sprintf("pod-eni1-%d", i)})
1141+
_, _, _, err = ds.AssignPodIPv6Address(key, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: fmt.Sprintf("pod-eni1-%d", i)})
11421142
assert.NoError(t, err)
11431143
}
11441144
assert.Equal(t, 5, eniInfo.AssignedIPv6Addresses(), "Should correctly count assigned addresses across multiple CIDRs on primary ENI")
@@ -1785,7 +1785,7 @@ func TestAssignPodIPv4AddressWithExcludedENI(t *testing.T) {
17851785
ds := NewDataStore(Testlog, NullCheckpoint{}, false, defaultNetworkCard)
17861786

17871787
// Add primary ENI and mark it as excluded
1788-
err := ds.AddENI("eni-1", 0, true, false, false)
1788+
err := ds.AddENI("eni-1", 0, true, false, false, 0)
17891789
assert.NoError(t, err)
17901790
err = ds.SetENIExcludedForPodIPs("eni-1", true)
17911791
assert.NoError(t, err)
@@ -1796,7 +1796,7 @@ func TestAssignPodIPv4AddressWithExcludedENI(t *testing.T) {
17961796
assert.NoError(t, err)
17971797

17981798
// Try to assign an IP - should fail as ENI is excluded
1799-
_, _, err = ds.AssignPodIPv4Address(
1799+
_, _, _, err = ds.AssignPodIPv4Address(
18001800
IPAMKey{
18011801
NetworkName: "net0",
18021802
ContainerID: "container-1",
@@ -1811,7 +1811,7 @@ func TestAssignPodIPv4AddressWithExcludedENI(t *testing.T) {
18111811
assert.Contains(t, err.Error(), "no available IP/Prefix addresses")
18121812

18131813
// Add a secondary ENI that is not excluded
1814-
err = ds.AddENI("eni-2", 1, false, false, false)
1814+
err = ds.AddENI("eni-2", 1, false, false, false, 0)
18151815
assert.NoError(t, err)
18161816

18171817
// Add IPs to the secondary ENI
@@ -1820,7 +1820,7 @@ func TestAssignPodIPv4AddressWithExcludedENI(t *testing.T) {
18201820
assert.NoError(t, err)
18211821

18221822
// Now assignment should succeed from the non-excluded ENI
1823-
ip, deviceNum, err := ds.AssignPodIPv4Address(
1823+
ip, deviceNum, _, err := ds.AssignPodIPv4Address(
18241824
IPAMKey{
18251825
NetworkName: "net0",
18261826
ContainerID: "container-1",
@@ -1840,13 +1840,13 @@ func TestGetAllocatableENIsWithExclusion(t *testing.T) {
18401840
ds := NewDataStore(Testlog, NullCheckpoint{}, false, defaultNetworkCard)
18411841

18421842
// Add primary ENI and mark it as excluded
1843-
err := ds.AddENI("eni-1", 0, true, false, false)
1843+
err := ds.AddENI("eni-1", 0, true, false, false, 0)
18441844
assert.NoError(t, err)
18451845
err = ds.SetENIExcludedForPodIPs("eni-1", true)
18461846
assert.NoError(t, err)
18471847

18481848
// Add secondary ENI (not excluded)
1849-
err = ds.AddENI("eni-2", 1, false, false, false)
1849+
err = ds.AddENI("eni-2", 1, false, false, false, 0)
18501850
assert.NoError(t, err)
18511851

18521852
// Get allocatable ENIs - should only return the non-excluded one
@@ -1859,7 +1859,7 @@ func TestGetIPStatsWithExcludedENI(t *testing.T) {
18591859
ds := NewDataStore(Testlog, NullCheckpoint{}, false, defaultNetworkCard)
18601860

18611861
// Add primary ENI with IPs and mark it as excluded
1862-
err := ds.AddENI("eni-1", 0, true, false, false)
1862+
err := ds.AddENI("eni-1", 0, true, false, false, 0)
18631863
assert.NoError(t, err)
18641864
err = ds.SetENIExcludedForPodIPs("eni-1", true)
18651865
assert.NoError(t, err)
@@ -1872,7 +1872,7 @@ func TestGetIPStatsWithExcludedENI(t *testing.T) {
18721872
}
18731873

18741874
// Add secondary ENI with IPs (not excluded)
1875-
err = ds.AddENI("eni-2", 1, false, false, false)
1875+
err = ds.AddENI("eni-2", 1, false, false, false, 0)
18761876
assert.NoError(t, err)
18771877

18781878
for i := 11; i <= 12; i++ {
@@ -1890,7 +1890,7 @@ func TestGetIPStatsWithExcludedENI(t *testing.T) {
18901890

18911891
func TestDelIPv6CidrFromStore(t *testing.T) {
18921892
ds := NewDataStore(Testlog, NullCheckpoint{}, true, defaultNetworkCard)
1893-
err := ds.AddENI("eni-1", 1, true, false, false)
1893+
err := ds.AddENI("eni-1", 1, true, false, false, 0)
18941894
assert.NoError(t, err)
18951895

18961896
// Test 1: Add and delete unassigned IPv6 CIDRs
@@ -1922,7 +1922,7 @@ func TestDelIPv6CidrFromStore(t *testing.T) {
19221922

19231923
// Test 3: Assign an IPv6 address to a pod from the remaining CIDR
19241924
key := IPAMKey{"net0", "sandbox-1", "eth0"}
1925-
ipv6Address, device, err := ds.AssignPodIPv6Address(key, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "sample-pod-1"})
1925+
ipv6Address, device, _, err := ds.AssignPodIPv6Address(key, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "sample-pod-1"})
19261926
assert.NoError(t, err)
19271927
assert.NotEmpty(t, ipv6Address)
19281928
assert.Equal(t, 1, device)
@@ -1948,7 +1948,7 @@ func TestDelIPv6CidrFromStore(t *testing.T) {
19481948

19491949
func TestFreeablePrefixesBothIPv4AndIPv6(t *testing.T) {
19501950
ds := NewDataStore(Testlog, NullCheckpoint{}, true, defaultNetworkCard)
1951-
err := ds.AddENI("eni-1", 1, true, false, false)
1951+
err := ds.AddENI("eni-1", 1, true, false, false, 0)
19521952
assert.NoError(t, err)
19531953

19541954
// Add IPv4 prefixes
@@ -1993,14 +1993,14 @@ func TestFreeablePrefixesBothIPv4AndIPv6(t *testing.T) {
19931993

19941994
// Assign an IP from IPv4 prefix1 to a pod
19951995
key1 := IPAMKey{"net0", "sandbox-1", "eth0"}
1996-
ipv4Address, device, err := ds.AssignPodIPv4Address(key1, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-1"})
1996+
ipv4Address, device, _, err := ds.AssignPodIPv4Address(key1, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-1"})
19971997
assert.NoError(t, err)
19981998
assert.NotEmpty(t, ipv4Address)
19991999
assert.Equal(t, 1, device)
20002000

20012001
// Assign an IP from IPv6 prefix1 to a pod
20022002
key2 := IPAMKey{"net0", "sandbox-2", "eth0"}
2003-
ipv6Address, device, err := ds.AssignPodIPv6Address(key2, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-2"})
2003+
ipv6Address, device, _, err := ds.AssignPodIPv6Address(key2, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-2"})
20042004
assert.NoError(t, err)
20052005
assert.NotEmpty(t, ipv6Address)
20062006
assert.Equal(t, 1, device)
@@ -2036,7 +2036,7 @@ func TestDeallocateEmptyCIDR(t *testing.T) {
20362036

20372037
// Setup test ENI
20382038
eniID := "eni-test-dealloc"
2039-
err := ds.AddENI(eniID, 1, false, false, false)
2039+
err := ds.AddENI(eniID, 1, false, false, false, 0)
20402040
assert.NoError(t, err)
20412041

20422042
// Mark ENI as excluded for pod IPs
@@ -2086,7 +2086,7 @@ func TestDeallocateEmptyCIDR(t *testing.T) {
20862086
t.Run("Skip cleanup when ENI is not excluded", func(t *testing.T) {
20872087
// Create new non-excluded ENI
20882088
nonExcludedENI := "eni-not-excluded"
2089-
err := ds.AddENI(nonExcludedENI, 1, false, false, false)
2089+
err := ds.AddENI(nonExcludedENI, 1, false, false, false, 0)
20902090
assert.NoError(t, err)
20912091

20922092
// Don't mark as excluded (default is false)
@@ -2116,7 +2116,7 @@ func TestDeallocateEmptyCIDR(t *testing.T) {
21162116

21172117
// Create new excluded ENI
21182118
excludedENI := "eni-excluded-with-ips"
2119-
err := dsIsolated.AddENI(excludedENI, 1, false, false, false)
2119+
err := dsIsolated.AddENI(excludedENI, 1, false, false, false, 0)
21202120
assert.NoError(t, err)
21212121

21222122
err = dsIsolated.SetENIExcludedForPodIPs(excludedENI, true)
@@ -2167,7 +2167,7 @@ func TestDeallocateEmptyCIDR(t *testing.T) {
21672167
t.Run("Handle non-existent CIDR gracefully", func(t *testing.T) {
21682168
// Create ENI
21692169
testENI := "eni-cidr-test"
2170-
err := ds.AddENI(testENI, 1, false, false, false)
2170+
err := ds.AddENI(testENI, 1, false, false, false, 0)
21712171
assert.NoError(t, err)
21722172

21732173
err = ds.SetENIExcludedForPodIPs(testENI, true)

pkg/ipamd/datastore/secondary_eni_exclusion_focused_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ func TestSecondaryENIExclusionFocused(t *testing.T) {
2929
ds := NewDataStore(Testlog, NullCheckpoint{}, false, defaultNetworkCard)
3030

3131
// Setup: Primary ENI with one IP
32-
err := ds.AddENI("eni-primary", 0, true, false, false)
32+
err := ds.AddENI("eni-primary", 0, true, false, false, 0)
3333
assert.NoError(t, err)
3434

3535
primaryIP := net.IPNet{IP: net.ParseIP("10.0.1.1"), Mask: net.IPv4Mask(255, 255, 255, 255)}
3636
err = ds.AddIPv4CidrToStore("eni-primary", primaryIP, false)
3737
assert.NoError(t, err)
3838

3939
// Setup: Secondary ENI with one IP
40-
err = ds.AddENI("eni-secondary", 1, false, false, false)
40+
err = ds.AddENI("eni-secondary", 1, false, false, false, 0)
4141
assert.NoError(t, err)
4242

4343
secondaryIP := net.IPNet{IP: net.ParseIP("10.0.2.1"), Mask: net.IPv4Mask(255, 255, 255, 255)}
@@ -60,7 +60,7 @@ func TestSecondaryENIExclusionFocused(t *testing.T) {
6060

6161
// Test 4: Assign first pod - should work and go to primary ENI
6262
key1 := IPAMKey{"net0", "pod-1", "eth0"}
63-
ip1, _, err := ds.AssignPodIPv4Address(key1, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-1"})
63+
ip1, _, _, err := ds.AssignPodIPv4Address(key1, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-1"})
6464
assert.NoError(t, err)
6565
assert.True(t, strings.HasPrefix(ip1, "10.0.1."), "First pod should go to primary ENI, got: %s", ip1)
6666

@@ -70,7 +70,7 @@ func TestSecondaryENIExclusionFocused(t *testing.T) {
7070

7171
// Test 6: Try to assign second pod - should fail since primary is full and secondary is excluded
7272
key2 := IPAMKey{"net0", "pod-2", "eth0"}
73-
_, _, err = ds.AssignPodIPv4Address(key2, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-2"})
73+
_, _, _, err = ds.AssignPodIPv4Address(key2, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-2"})
7474
assert.Error(t, err, "Should fail when only non-excluded ENI is full")
7575
assert.Contains(t, err.Error(), "no available IP/Prefix addresses")
7676

@@ -107,10 +107,10 @@ func TestSecondaryENIExclusionWithPods(t *testing.T) {
107107
ds := NewDataStore(Testlog, NullCheckpoint{}, false, defaultNetworkCard)
108108

109109
// Setup ENIs
110-
err := ds.AddENI("eni-primary", 0, true, false, false)
110+
err := ds.AddENI("eni-primary", 0, true, false, false, 0)
111111
assert.NoError(t, err)
112112

113-
err = ds.AddENI("eni-secondary", 1, false, false, false)
113+
err = ds.AddENI("eni-secondary", 1, false, false, false, 0)
114114
assert.NoError(t, err)
115115

116116
// Add IPs
@@ -124,11 +124,11 @@ func TestSecondaryENIExclusionWithPods(t *testing.T) {
124124

125125
// Assign pods to both ENIs naturally through regular allocation
126126
key1 := IPAMKey{"net0", "pod-1", "eth0"}
127-
ip1, _, err := ds.AssignPodIPv4Address(key1, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-1"})
127+
ip1, _, _, err := ds.AssignPodIPv4Address(key1, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-1"})
128128
assert.NoError(t, err)
129129

130130
key2 := IPAMKey{"net0", "pod-2", "eth0"}
131-
ip2, _, err := ds.AssignPodIPv4Address(key2, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-2"})
131+
ip2, _, _, err := ds.AssignPodIPv4Address(key2, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "pod-2"})
132132
assert.NoError(t, err)
133133

134134
// Find which key corresponds to secondary ENI assignment
@@ -162,12 +162,12 @@ func TestSecondaryENIExclusionWithPods(t *testing.T) {
162162
assert.NoError(t, err)
163163

164164
key3 := IPAMKey{"net0", "new-pod", "eth0"}
165-
ip3, _, err := ds.AssignPodIPv4Address(key3, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "new-pod"})
165+
ip3, _, _, err := ds.AssignPodIPv4Address(key3, IPAMMetadata{K8SPodNamespace: "default", K8SPodName: "new-pod"})
166166
assert.NoError(t, err)
167167
assert.True(t, strings.HasPrefix(ip3, "10.0.1."), "New pod should avoid excluded secondary ENI, got: %s", ip3)
168168

169169
// Test: After removing pod from excluded ENI, it should become deletable
170-
_, _, _, _, err = ds.UnassignPodIPAddress(keyOnSecondary)
170+
_, _, _, _, _, err = ds.UnassignPodIPAddress(keyOnSecondary)
171171
assert.NoError(t, err)
172172

173173
// Clear cooldown

pkg/ipamd/ipamd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1251,7 +1251,7 @@ func (c *IPAMContext) tryAssignPrefixes(ctx context.Context, networkCard int) (i
12511251
// 2) add ENI to datastore
12521252
// 3) set up linux ENI related networking stack.
12531253
// 4) add all ENI's secondary IP addresses to datastore
1254-
func (c *IPAMContext) setupENI(eni string, eniMetadata awsutils.ENIMetadata, isTrunkENI, isEFAENI bool) error {
1254+
func (c *IPAMContext) setupENI(ctx context.Context, eni string, eniMetadata awsutils.ENIMetadata, isTrunkENI, isEFAENI bool) error {
12551255
primaryENI := c.awsClient.GetPrimaryENI()
12561256
var primaryIP string
12571257
if c.enableIPv6 {

0 commit comments

Comments
 (0)