Skip to content

Commit b3ac582

Browse files
test: more elaborate test including checks on IP pool state
1 parent 56f3d48 commit b3ac582

File tree

2 files changed

+92
-24
lines changed

2 files changed

+92
-24
lines changed

cns/restserver/helper_for_nodesubnet_test.go

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,22 @@ func GetRestServiceObjectForNodeSubnetTest(t *testing.T, generator CNIConflistGe
2828
IsPrimary: true,
2929
InterfaceSubnets: []nmagent.InterfaceSubnet{
3030
{
31-
Prefix: "10.240.0.0/16",
31+
Prefix: "10.0.0.0/24",
3232
IPAddress: []nmagent.NodeIP{
3333
{
34-
Address: nmagent.IPAddress(netip.AddrFrom4([4]byte{10, 240, 0, 5})),
34+
Address: nmagent.IPAddress(netip.AddrFrom4([4]byte{10, 0, 0, 4})),
3535
IsPrimary: true,
3636
},
3737
{
38-
Address: nmagent.IPAddress(netip.AddrFrom4([4]byte{10, 240, 0, 6})),
38+
Address: nmagent.IPAddress(netip.AddrFrom4([4]byte{10, 0, 0, 52})),
39+
IsPrimary: false,
40+
},
41+
{
42+
Address: nmagent.IPAddress(netip.AddrFrom4([4]byte{10, 0, 0, 63})),
43+
IsPrimary: false,
44+
},
45+
{
46+
Address: nmagent.IPAddress(netip.AddrFrom4([4]byte{10, 0, 0, 45})),
3947
IsPrimary: false,
4048
},
4149
},
@@ -60,23 +68,20 @@ func GetRestServiceObjectForNodeSubnetTest(t *testing.T, generator CNIConflistGe
6068
t.Cleanup(func() { svc.Uninitialize() })
6169

6270
return &HTTPRestService{
63-
Service: svc,
64-
cniConflistGenerator: generator,
65-
state: &httpRestServiceState{},
66-
PodIPConfigState: make(map[string]cns.IPConfigurationStatus),
71+
Service: svc,
72+
cniConflistGenerator: generator,
73+
state: &httpRestServiceState{},
74+
PodIPConfigState: make(map[string]cns.IPConfigurationStatus),
75+
PodIPIDByPodInterfaceKey: make(map[string][]string),
6776
nma: &fakes.NMAgentClientFake{
6877
GetInterfaceIPInfoF: func(_ context.Context) (nmagent.Interfaces, error) {
6978
return interfaces, nil
7079
},
7180
},
81+
wscli: &fakes.WireserverClientFake{},
7282
}
7383
}
7484

75-
// SetCNIConflistGenerator sets the CNIConflistGenerator for the HTTPRestService.
76-
func (service *HTTPRestService) SetCNIConflistGenerator(generator CNIConflistGenerator) {
77-
service.cniConflistGenerator = generator
78-
}
79-
8085
// GetNodesubnetIPFetcher gets the nodesubnet.IPFetcher from the HTTPRestService.
8186
func (service *HTTPRestService) GetNodesubnetIPFetcher() *nodesubnet.IPFetcher {
8287
return service.nodesubnetIPFetcher

cns/restserver/nodesubnet_test.go

Lines changed: 75 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,54 @@ package restserver_test
22

33
import (
44
"context"
5+
"net"
56
"testing"
67

7-
"github.com/Azure/azure-container-networking/cns"
8+
"github.com/Azure/azure-container-networking/cns/cnireconciler"
89
"github.com/Azure/azure-container-networking/cns/logger"
910
"github.com/Azure/azure-container-networking/cns/restserver"
11+
"github.com/Azure/azure-container-networking/cns/types"
12+
"github.com/Azure/azure-container-networking/store"
1013
)
1114

12-
// Mock implementation of PodInfoByIPProvider
13-
type MockPodInfoByIPProvider struct{}
15+
func getMockStore() store.KeyValueStore {
16+
mockStore := store.NewMockStore("")
17+
endpointState := map[string]*restserver.EndpointInfo{
18+
"12e65d89e58cb23c784e97840cf76866bfc9902089bdc8e87e9f64032e312b0b": {
19+
PodName: "coredns-54b69f46b8-ldmwr",
20+
PodNamespace: "kube-system",
21+
IfnameToIPMap: map[string]*restserver.IPInfo{
22+
"eth0": {
23+
IPv4: []net.IPNet{
24+
{
25+
IP: net.IPv4(10, 0, 0, 52),
26+
Mask: net.CIDRMask(24, 32),
27+
},
28+
},
29+
},
30+
},
31+
},
32+
"1fc5176913a3a1a7facfb823dde3b4ded404041134fef4f4a0c8bba140fc0413": {
33+
PodName: "load-test-7f7d49687d-wxc9p",
34+
PodNamespace: "load-test",
35+
IfnameToIPMap: map[string]*restserver.IPInfo{
36+
"eth0": {
37+
IPv4: []net.IPNet{
38+
{
39+
IP: net.IPv4(10, 0, 0, 63),
40+
Mask: net.CIDRMask(24, 32),
41+
},
42+
},
43+
},
44+
},
45+
},
46+
}
1447

15-
func (m *MockPodInfoByIPProvider) PodInfoByIP() (res map[string]cns.PodInfo, err error) {
16-
return res, nil
48+
err := mockStore.Write(restserver.EndpointStoreKey, endpointState)
49+
if err != nil {
50+
return nil
51+
}
52+
return mockStore
1753
}
1854

1955
// Mock implementation of CNIConflistGenerator
@@ -32,7 +68,10 @@ func (m *MockCNIConflistGenerator) Close() error {
3268
}
3369

3470
func TestNodeSubnet(t *testing.T) {
35-
mockPodInfoProvider := &MockPodInfoByIPProvider{}
71+
podInfoByIPProvider, err := cnireconciler.NewCNSPodInfoProvider(getMockStore())
72+
if err != nil {
73+
t.Fatalf("NewCNSPodInfoProvider returned an error: %v", err)
74+
}
3675

3776
// Create a real HTTPRestService object
3877
mockCNIConflistGenerator := &MockCNIConflistGenerator{
@@ -42,15 +81,22 @@ func TestNodeSubnet(t *testing.T) {
4281
ctx, cancel := testContext(t)
4382
defer cancel()
4483

45-
err := service.InitializeNodeSubnet(ctx, mockPodInfoProvider)
46-
service.StartNodeSubnet(ctx)
84+
err = service.InitializeNodeSubnet(ctx, podInfoByIPProvider)
85+
if err != nil {
86+
t.Fatalf("InitializeNodeSubnet returned an error: %v", err)
87+
}
4788

48-
if service.GetNodesubnetIPFetcher() == nil {
49-
t.Error("NodeSubnetIPFetcher is not initialized")
89+
expectedIPs := map[string]types.IPState{
90+
"10.0.0.52": types.Assigned,
91+
"10.0.0.63": types.Assigned,
5092
}
5193

52-
if err != nil {
53-
t.Fatalf("InitializeNodeSubnet returned an error: %v", err)
94+
checkIPassignment(t, service, expectedIPs)
95+
96+
service.StartNodeSubnet(ctx)
97+
98+
if service.GetNodesubnetIPFetcher() == nil {
99+
t.Fatal("NodeSubnetIPFetcher is not initialized")
54100
}
55101

56102
select {
@@ -60,6 +106,23 @@ func TestNodeSubnet(t *testing.T) {
60106
case <-mockCNIConflistGenerator.GenerateCalled:
61107
break
62108
}
109+
110+
expectedIPs["10.0.0.45"] = types.Available
111+
checkIPassignment(t, service, expectedIPs)
112+
}
113+
114+
func checkIPassignment(t *testing.T, service *restserver.HTTPRestService, expectedIPs map[string]types.IPState) {
115+
if len(service.PodIPConfigState) != len(expectedIPs) {
116+
t.Fatalf("expected 2 entries in PodIPConfigState, got %d", len(service.PodIPConfigState))
117+
}
118+
119+
for ip, config := range service.GetPodIPConfigState() {
120+
if assignmentState, exists := expectedIPs[ip]; !exists {
121+
t.Fatalf("unexpected IP %s in PodIPConfigState", ip)
122+
} else if config.GetState() != assignmentState {
123+
t.Fatalf("expected state 'Assigned' for IP %s, got %s", ip, config.GetState())
124+
}
125+
}
63126
}
64127

65128
// testContext creates a context from the provided testing.T that will be

0 commit comments

Comments
 (0)