master
go 179 lines 7.31 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package l2topology
4
5 import (
6 "net/netip"
7 "testing"
8
9 "github.com/stretchr/testify/require"
10 )
11
12 func TestSubNetworkLifecycleAndHelpers(t *testing.T) {
13 subnet, err := NewSubNetwork(2, netip.MustParseAddr("192.0.2.2"), netip.MustParseAddr("255.255.255.252"))
14 require.NoError(t, err)
15 require.Equal(t, netip.MustParseAddr("192.0.2.0"), subnet.Network())
16 require.Equal(t, netip.MustParseAddr("255.255.255.252"), subnet.Netmask())
17 require.Equal(t, "192.0.2.0/30", subnet.CIDR())
18 require.Equal(t, 30, subnet.NetworkPrefix())
19 require.True(t, subnet.IsIPv4Subnetwork())
20 require.Equal(t, []int{2}, subnet.NodeIDs())
21
22 require.True(t, subnet.IsInRange(netip.MustParseAddr("192.0.2.1")))
23 require.False(t, subnet.IsInRange(netip.MustParseAddr("192.0.2.8")))
24
25 require.True(t, subnet.Add(1, netip.MustParseAddr("192.0.2.1")))
26 require.False(t, subnet.Add(1, netip.MustParseAddr("192.0.2.1")))
27 require.False(t, subnet.Add(3, netip.MustParseAddr("192.0.2.8")))
28 require.Equal(t, []int{1, 2}, subnet.NodeIDs())
29
30 require.True(t, subnet.Add(3, netip.MustParseAddr("192.0.2.1")))
31 require.True(t, subnet.HasDuplicatedAddress())
32 require.True(t, subnet.Remove(3, netip.MustParseAddr("192.0.2.1")))
33 require.False(t, subnet.HasDuplicatedAddress())
34 require.False(t, subnet.Remove(3, netip.MustParseAddr("192.0.2.1")))
35
36 cloned := subnet.clone()
37 require.NotNil(t, cloned)
38 require.True(t, cloned.Remove(1, netip.MustParseAddr("192.0.2.1")))
39 require.Equal(t, []int{1, 2}, subnet.NodeIDs())
40 require.Equal(t, []int{2}, cloned.NodeIDs())
41
42 require.Equal(t, "192.0.2.0\x00255.255.255.252", subnet.key())
43 require.Equal(t, "192.0.2.0\x00255.255.255.252", subnetKey(subnet.Network(), subnet.Netmask()))
44 require.Equal(t, []string{"a", "b"}, sortedSubnetworkKeys(map[string]*SubNetwork{
45 "b": subnet,
46 "a": cloned,
47 }))
48
49 require.Equal(t, -1, compareAddr(netip.MustParseAddr("10.0.0.1"), netip.MustParseAddr("10.0.0.2")))
50 require.Equal(t, 1, compareAddr(netip.MustParseAddr("2001:db8::2"), netip.MustParseAddr("2001:db8::1")))
51 require.Equal(t, 0, compareAddr(netip.MustParseAddr("10.0.0.1"), netip.MustParseAddr("10.0.0.1")))
52
53 require.True(t, IsPointToPointMask(netip.MustParseAddr("255.255.255.252")))
54 require.True(t, IsPointToPointMask(netip.MustParseAddr("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe")))
55 require.True(t, IsLoopbackMask(netip.MustParseAddr("255.255.255.255")))
56 require.True(t, InSameNetwork(
57 netip.MustParseAddr("10.0.0.1"),
58 netip.MustParseAddr("10.0.0.2"),
59 netip.MustParseAddr("255.255.255.252"),
60 ))
61 require.False(t, InSameNetwork(
62 netip.MustParseAddr("10.0.0.1"),
63 netip.MustParseAddr("10.0.0.5"),
64 netip.MustParseAddr("255.255.255.252"),
65 ))
66
67 network, ok := NetworkAddress(netip.MustParseAddr("10.0.0.2"), netip.MustParseAddr("255.255.255.252"))
68 require.True(t, ok)
69 require.Equal(t, netip.MustParseAddr("10.0.0.0"), network)
70
71 prefix, err := MaskToCIDRPrefix(netip.MustParseAddr("255.255.255.252"))
72 require.NoError(t, err)
73 require.Equal(t, 30, prefix)
74 _, err = MaskToCIDRPrefix(netip.MustParseAddr("255.0.255.0"))
75 require.Error(t, err)
76 }
77
78 func TestNodeTopologyServiceAndRouterTopology(t *testing.T) {
79 service := NewNodeTopologyService(
80 []NodeTopologyEntity{
81 {ID: 3, Label: "node-3", Address: netip.MustParseAddr("192.168.1.3")},
82 {ID: 1, Label: "node-1", Address: netip.MustParseAddr("10.0.0.1")},
83 {ID: 2, Label: "node-2", Address: netip.MustParseAddr("10.0.0.2")},
84 },
85 []IPInterfaceTopologyEntity{
86 {ID: 5, NodeID: 2, IPAddress: netip.MustParseAddr("192.168.1.2"), NetMask: netip.MustParseAddr("255.255.255.0"), IsManaged: true, SnmpInterfaceID: 103},
87 {ID: 2, NodeID: 1, IPAddress: netip.MustParseAddr("10.0.0.1"), NetMask: netip.MustParseAddr("255.255.255.252"), IsManaged: true, IsSnmpPrimary: true, SnmpInterfaceID: 101},
88 {ID: 6, NodeID: 3, IPAddress: netip.MustParseAddr("127.0.0.1"), NetMask: netip.MustParseAddr("255.255.255.255"), IsManaged: true},
89 {ID: 4, NodeID: 3, IPAddress: netip.MustParseAddr("192.168.1.3"), NetMask: netip.MustParseAddr("255.255.255.0"), IsManaged: true, IsSnmpPrimary: true, SnmpInterfaceID: 104},
90 {ID: 3, NodeID: 2, IPAddress: netip.MustParseAddr("10.0.0.2"), NetMask: netip.MustParseAddr("255.255.255.252"), IsManaged: true, IsSnmpPrimary: true, SnmpInterfaceID: 102},
91 {ID: 1, NodeID: 1, IPAddress: netip.MustParseAddr("10.10.10.1"), IsManaged: false},
92 },
93 []SnmpInterfaceTopologyEntity{
94 {ID: 104, NodeID: 3, IfIndex: 4, IfName: "eth4"},
95 {ID: 101, NodeID: 1, IfIndex: 1, IfName: "eth1"},
96 {ID: 103, NodeID: 2, IfIndex: 3, IfName: "eth3"},
97 {ID: 102, NodeID: 2, IfIndex: 2, IfName: "eth2"},
98 },
99 )
100
101 nodes := service.FindAllNode()
102 require.Equal(t, []int{1, 2, 3}, []int{nodes[0].ID, nodes[1].ID, nodes[2].ID})
103
104 ips := service.FindAllIP()
105 require.Equal(t, []int{1, 2, 3, 4, 5, 6}, []int{ips[0].ID, ips[1].ID, ips[2].ID, ips[3].ID, ips[4].ID, ips[5].ID})
106
107 snmp := service.FindAllSnmp()
108 require.Equal(t, []int{101, 102, 103, 104}, []int{snmp[0].ID, snmp[1].ID, snmp[2].ID, snmp[3].ID})
109
110 allSubnets := service.FindAllSubNetwork()
111 require.Len(t, allSubnets, 3)
112 require.Equal(t, []string{"10.0.0.0/30", "127.0.0.1/32", "192.168.1.0/24"}, []string{
113 allSubnets[0].CIDR(),
114 allSubnets[1].CIDR(),
115 allSubnets[2].CIDR(),
116 })
117
118 legal := service.FindAllLegalSubNetwork()
119 require.Len(t, legal, 2)
120 require.Equal(t, []string{"10.0.0.0/30", "192.168.1.0/24"}, []string{legal[0].CIDR(), legal[1].CIDR()})
121
122 ptp := service.FindAllPointToPointSubNetwork()
123 require.Len(t, ptp, 1)
124 require.Equal(t, "10.0.0.0/30", ptp[0].CIDR())
125
126 legalPTP := service.FindAllLegalPointToPointSubNetwork()
127 require.Len(t, legalPTP, 1)
128 require.Equal(t, []int{1, 2}, legalPTP[0].NodeIDs())
129
130 loopbacks := service.FindAllLoopbacks()
131 require.Len(t, loopbacks, 1)
132 require.Equal(t, "127.0.0.1/32", loopbacks[0].CIDR())
133
134 legalLoopbacks := service.FindAllLegalLoopbacks()
135 require.Len(t, legalLoopbacks, 1)
136 require.Equal(t, []int{3}, legalLoopbacks[0].NodeIDs())
137
138 multibet := service.FindSubNetworkByNetworkPrefixLessThen(30, 126)
139 require.Len(t, multibet, 1)
140 require.Equal(t, "192.168.1.0/24", multibet[0].CIDR())
141
142 require.Equal(t, map[int]int{
143 1: 0,
144 2: 0,
145 3: 1,
146 }, service.GetNodeIDPriorityMap())
147
148 router := BuildNetworkRouterTopology(service, 30, 126)
149 require.Equal(t, "1", router.DefaultVertex)
150 require.Len(t, router.Vertices, 4)
151 require.Len(t, router.Edges, 3)
152
153 require.Equal(t, []string{"1", "192.168.1.0/24", "2", "3"}, []string{
154 router.Vertices[0].ID,
155 router.Vertices[1].ID,
156 router.Vertices[2].ID,
157 router.Vertices[3].ID,
158 })
159
160 require.Equal(t, []string{
161 "1\x0010.0.0.1->2\x0010.0.0.2",
162 "192.168.1.0/24\x00192.168.1.0/24to:192.168.1.2->2\x00192.168.1.2",
163 "192.168.1.0/24\x00192.168.1.0/24to:192.168.1.3->3\x00192.168.1.3",
164 }, []string{
165 router.Edges[0].ID,
166 router.Edges[1].ID,
167 router.Edges[2].ID,
168 })
169 require.Equal(t, "1", router.Edges[0].SourcePort.Vertex)
170 require.Equal(t, "2", router.Edges[0].TargetPort.Vertex)
171 require.Equal(t, "eth1", router.Edges[0].SourcePort.IfName)
172 require.Equal(t, "eth2", router.Edges[0].TargetPort.IfName)
173 require.Equal(t, "192.168.1.0/24", router.Edges[1].SourcePort.Vertex)
174 require.Equal(t, "2", router.Edges[1].TargetPort.Vertex)
175 require.Equal(t, "", router.Edges[1].SourcePort.IfName)
176 require.Equal(t, "eth3", router.Edges[1].TargetPort.IfName)
177 require.Equal(t, "192.168.1.0/24", router.Edges[2].SourcePort.Vertex)
178 require.Equal(t, "3", router.Edges[2].TargetPort.Vertex)
179 }