blob: c953c8b47b54a60ee7c8d0b3b485fe3866baaeca [file] [log] [blame]
Jian Li49109b52019-01-22 00:17:28 +09001/*
2 * Copyright 2019-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.k8snode.api;
17
18import com.google.common.testing.EqualsTester;
19import org.junit.Before;
20import org.junit.Test;
21import org.onlab.packet.ChassisId;
22import org.onlab.packet.IpAddress;
Jian Li6d2ffbf2020-11-04 15:58:18 +090023import org.onlab.packet.MacAddress;
Jian Li49109b52019-01-22 00:17:28 +090024import org.onosproject.k8snode.api.K8sNode.Type;
25import org.onosproject.net.DefaultDevice;
26import org.onosproject.net.Device;
27import org.onosproject.net.DeviceId;
28import org.onosproject.net.provider.ProviderId;
29
30import static junit.framework.TestCase.assertEquals;
31import static junit.framework.TestCase.assertSame;
32import static org.onosproject.k8snode.api.K8sNode.Type.MINION;
33import static org.onosproject.k8snode.api.K8sNodeState.COMPLETE;
34import static org.onosproject.k8snode.api.K8sNodeState.DEVICE_CREATED;
35import static org.onosproject.k8snode.api.K8sNodeState.INIT;
36import static org.onosproject.net.Device.Type.SWITCH;
37
38/**
39 * Unit test for DefaultK8sNode.
40 */
41public final class DefaultK8sNodeTest {
42
43 private static final IpAddress TEST_IP = IpAddress.valueOf("10.100.0.3");
44
Jian Lie2a04ce2020-07-01 19:07:02 +090045 private static final String CLUSTER_NAME = "cluster";
Jian Li49109b52019-01-22 00:17:28 +090046 private static final String HOSTNAME_1 = "hostname_1";
47 private static final String HOSTNAME_2 = "hostname_2";
48 private static final Device DEVICE_1 = createDevice(1);
49 private static final Device DEVICE_2 = createDevice(2);
Jian Lie2a04ce2020-07-01 19:07:02 +090050 private static final int SEGMENT_ID_1 = 1;
51 private static final int SEGMENT_ID_2 = 2;
Jian Li49109b52019-01-22 00:17:28 +090052
53 private static final IpAddress MANAGEMENT_IP = IpAddress.valueOf("10.10.10.10");
54 private static final IpAddress DATA_IP = IpAddress.valueOf("20.20.20.20");
Jian Li4294af72020-10-07 02:12:33 +090055 private static final IpAddress NODE_IP = IpAddress.valueOf("30.30.30.30");
Jian Li6d2ffbf2020-11-04 15:58:18 +090056 private static final MacAddress NODE_MAC = MacAddress.valueOf("fa:00:00:00:00:08");
57 private static final K8sNodeInfo NODE_INFO = new K8sNodeInfo(NODE_IP, NODE_MAC);
Jian Li49109b52019-01-22 00:17:28 +090058
Jian Li0c632722019-05-08 15:58:04 +090059 private static final String BRIDGE_INTF_1 = "eth1";
60 private static final String BRIDGE_INTF_2 = "eth2";
61
62 private static final IpAddress EXT_BRIDGE_IP_1 = IpAddress.valueOf("10.10.10.5");
63 private static final IpAddress EXT_BRIDGE_IP_2 = IpAddress.valueOf("20.20.20.5");
64
65 private static final IpAddress EXT_GATEWAY_IP_1 = IpAddress.valueOf("10.10.10.1");
66 private static final IpAddress EXT_GATEWAY_IP_2 = IpAddress.valueOf("20.20.20.1");
67
68 private static final String POD_CIDR_1 = "10.10.0.0/24";
69 private static final String POD_CIDR_2 = "20.20.0.0/24";
70
Jian Li49109b52019-01-22 00:17:28 +090071 private K8sNode refNode;
72
73 private static final K8sNode K8S_NODE_1 = createNode(
Jian Lie2a04ce2020-07-01 19:07:02 +090074 CLUSTER_NAME,
Jian Li49109b52019-01-22 00:17:28 +090075 HOSTNAME_1,
76 MINION,
Jian Lie2a04ce2020-07-01 19:07:02 +090077 SEGMENT_ID_1,
78 DEVICE_1,
Jian Li49109b52019-01-22 00:17:28 +090079 DEVICE_1,
Jian Libf562c22019-04-15 18:07:14 +090080 DEVICE_1,
Jian Li1a2eb5d2019-08-27 02:07:05 +090081 DEVICE_1,
Jian Li0c632722019-05-08 15:58:04 +090082 BRIDGE_INTF_1,
Jian Li49109b52019-01-22 00:17:28 +090083 TEST_IP,
Jian Li6d2ffbf2020-11-04 15:58:18 +090084 NODE_INFO,
Jian Li0c632722019-05-08 15:58:04 +090085 INIT,
86 EXT_BRIDGE_IP_1,
87 EXT_GATEWAY_IP_1,
88 POD_CIDR_1);
Jian Li49109b52019-01-22 00:17:28 +090089 private static final K8sNode K8S_NODE_2 = createNode(
Jian Lie2a04ce2020-07-01 19:07:02 +090090 CLUSTER_NAME,
Jian Li49109b52019-01-22 00:17:28 +090091 HOSTNAME_1,
92 MINION,
Jian Lie2a04ce2020-07-01 19:07:02 +090093 SEGMENT_ID_1,
94 DEVICE_1,
Jian Li49109b52019-01-22 00:17:28 +090095 DEVICE_1,
Jian Libf562c22019-04-15 18:07:14 +090096 DEVICE_1,
Jian Li1a2eb5d2019-08-27 02:07:05 +090097 DEVICE_1,
Jian Li0c632722019-05-08 15:58:04 +090098 BRIDGE_INTF_1,
Jian Li49109b52019-01-22 00:17:28 +090099 TEST_IP,
Jian Li6d2ffbf2020-11-04 15:58:18 +0900100 NODE_INFO,
Jian Li0c632722019-05-08 15:58:04 +0900101 INIT,
102 EXT_BRIDGE_IP_1,
103 EXT_GATEWAY_IP_1,
104 POD_CIDR_1);
Jian Li49109b52019-01-22 00:17:28 +0900105 private static final K8sNode K8S_NODE_3 = createNode(
Jian Lie2a04ce2020-07-01 19:07:02 +0900106 CLUSTER_NAME,
Jian Li49109b52019-01-22 00:17:28 +0900107 HOSTNAME_2,
108 MINION,
Jian Lie2a04ce2020-07-01 19:07:02 +0900109 SEGMENT_ID_2,
110 DEVICE_2,
Jian Li49109b52019-01-22 00:17:28 +0900111 DEVICE_2,
Jian Libf562c22019-04-15 18:07:14 +0900112 DEVICE_2,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900113 DEVICE_2,
Jian Li0c632722019-05-08 15:58:04 +0900114 BRIDGE_INTF_2,
Jian Li49109b52019-01-22 00:17:28 +0900115 TEST_IP,
Jian Li6d2ffbf2020-11-04 15:58:18 +0900116 NODE_INFO,
Jian Li0c632722019-05-08 15:58:04 +0900117 INIT,
118 EXT_BRIDGE_IP_2,
119 EXT_GATEWAY_IP_2,
120 POD_CIDR_2);
Jian Li49109b52019-01-22 00:17:28 +0900121
122 /**
123 * Initial setup for this unit test.
124 */
125 @Before
126 public void setUp() {
127 refNode = DefaultK8sNode.builder()
Jian Lie2a04ce2020-07-01 19:07:02 +0900128 .clusterName(CLUSTER_NAME)
Jian Li49109b52019-01-22 00:17:28 +0900129 .hostname(HOSTNAME_1)
130 .type(MINION)
Jian Lie2a04ce2020-07-01 19:07:02 +0900131 .segmentId(SEGMENT_ID_1)
Jian Li49109b52019-01-22 00:17:28 +0900132 .managementIp(MANAGEMENT_IP)
133 .dataIp(DATA_IP)
Jian Li6d2ffbf2020-11-04 15:58:18 +0900134 .nodeInfo(NODE_INFO)
Jian Li49109b52019-01-22 00:17:28 +0900135 .intgBridge(DEVICE_1.id())
Jian Libf562c22019-04-15 18:07:14 +0900136 .extBridge(DEVICE_1.id())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900137 .localBridge(DEVICE_1.id())
Jian Lie2a04ce2020-07-01 19:07:02 +0900138 .tunBridge(DEVICE_1.id())
Jian Li0c632722019-05-08 15:58:04 +0900139 .extIntf(BRIDGE_INTF_1)
Jian Li49109b52019-01-22 00:17:28 +0900140 .state(COMPLETE)
Jian Li0c632722019-05-08 15:58:04 +0900141 .extBridgeIp(EXT_BRIDGE_IP_1)
142 .extGatewayIp(EXT_GATEWAY_IP_1)
143 .podCidr(POD_CIDR_1)
Jian Li49109b52019-01-22 00:17:28 +0900144 .build();
145 }
146
147 /**
148 * Checks equals method works as expected.
149 */
150 @Test
151 public void testEquality() {
152 new EqualsTester().addEqualityGroup(K8S_NODE_1, K8S_NODE_2)
153 .addEqualityGroup(K8S_NODE_3)
154 .testEquals();
155 }
156
157 /**
158 * Test object construction.
159 */
160 @Test
161 public void testConstruction() {
162 checkCommonProperties(refNode);
163 assertSame(refNode.state(), COMPLETE);
164 assertEquals(refNode.intgBridge(), DEVICE_1.id());
Jian Libf562c22019-04-15 18:07:14 +0900165 assertEquals(refNode.extBridge(), DEVICE_1.id());
Jian Li1a2eb5d2019-08-27 02:07:05 +0900166 assertEquals(refNode.localBridge(), DEVICE_1.id());
Jian Lie2a04ce2020-07-01 19:07:02 +0900167 assertEquals(refNode.tunBridge(), DEVICE_1.id());
Jian Li49109b52019-01-22 00:17:28 +0900168 }
169
170 /**
171 * Checks the functionality of update state method.
172 */
173 @Test
174 public void testUpdateState() {
175 K8sNode updatedNode = refNode.updateState(DEVICE_CREATED);
176
177 checkCommonProperties(updatedNode);
178 assertSame(updatedNode.state(), DEVICE_CREATED);
179 }
180
181 /**
182 * Checks the functionality of from method.
183 */
184 @Test
185 public void testFrom() {
186 K8sNode updatedNode = DefaultK8sNode.from(refNode).build();
187
188 assertEquals(updatedNode, refNode);
189 }
190
191 /**
192 * Checks building a node without hostname fails with proper exception.
193 */
194 @Test(expected = IllegalArgumentException.class)
195 public void testBuildWithoutHostname() {
196 DefaultK8sNode.builder()
197 .type(MINION)
Jian Lie2a04ce2020-07-01 19:07:02 +0900198 .clusterName(CLUSTER_NAME)
199 .segmentId(SEGMENT_ID_1)
Jian Li49109b52019-01-22 00:17:28 +0900200 .intgBridge(DEVICE_1.id())
Jian Libf562c22019-04-15 18:07:14 +0900201 .extBridge(DEVICE_1.id())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900202 .localBridge(DEVICE_1.id())
Jian Lie2a04ce2020-07-01 19:07:02 +0900203 .tunBridge(DEVICE_1.id())
Jian Li0c632722019-05-08 15:58:04 +0900204 .extIntf(BRIDGE_INTF_1)
Jian Li49109b52019-01-22 00:17:28 +0900205 .managementIp(TEST_IP)
206 .dataIp(TEST_IP)
Jian Li6d2ffbf2020-11-04 15:58:18 +0900207 .nodeInfo(NODE_INFO)
Jian Li49109b52019-01-22 00:17:28 +0900208 .state(INIT)
Jian Li0c632722019-05-08 15:58:04 +0900209 .extBridgeIp(EXT_BRIDGE_IP_1)
210 .extGatewayIp(EXT_GATEWAY_IP_1)
211 .podCidr(POD_CIDR_1)
Jian Li49109b52019-01-22 00:17:28 +0900212 .build();
213 }
214
215 /**
216 * Checks building a node without type fails with proper exception.
217 */
218 @Test(expected = IllegalArgumentException.class)
219 public void testBuildWithoutType() {
220 DefaultK8sNode.builder()
221 .hostname(HOSTNAME_1)
Jian Lie2a04ce2020-07-01 19:07:02 +0900222 .clusterName(CLUSTER_NAME)
223 .segmentId(SEGMENT_ID_1)
Jian Li49109b52019-01-22 00:17:28 +0900224 .intgBridge(DEVICE_1.id())
Jian Libf562c22019-04-15 18:07:14 +0900225 .extBridge(DEVICE_1.id())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900226 .localBridge(DEVICE_1.id())
Jian Lie2a04ce2020-07-01 19:07:02 +0900227 .tunBridge(DEVICE_1.id())
Jian Li0c632722019-05-08 15:58:04 +0900228 .extIntf(BRIDGE_INTF_1)
Jian Li49109b52019-01-22 00:17:28 +0900229 .managementIp(TEST_IP)
230 .dataIp(TEST_IP)
Jian Li6d2ffbf2020-11-04 15:58:18 +0900231 .nodeInfo(NODE_INFO)
Jian Li49109b52019-01-22 00:17:28 +0900232 .state(INIT)
Jian Li0c632722019-05-08 15:58:04 +0900233 .extBridgeIp(EXT_BRIDGE_IP_1)
234 .extGatewayIp(EXT_GATEWAY_IP_1)
235 .podCidr(POD_CIDR_1)
Jian Li49109b52019-01-22 00:17:28 +0900236 .build();
237 }
238
239 /**
240 * Checks building a node without management IP address fails with
241 * proper exception.
242 */
243 @Test(expected = IllegalArgumentException.class)
244 public void testBuildWithoutManagementIp() {
245 DefaultK8sNode.builder()
Jian Lie2a04ce2020-07-01 19:07:02 +0900246 .clusterName(CLUSTER_NAME)
Jian Li49109b52019-01-22 00:17:28 +0900247 .hostname(HOSTNAME_1)
248 .type(MINION)
Jian Lie2a04ce2020-07-01 19:07:02 +0900249 .segmentId(SEGMENT_ID_1)
Jian Li49109b52019-01-22 00:17:28 +0900250 .intgBridge(DEVICE_1.id())
Jian Libf562c22019-04-15 18:07:14 +0900251 .extBridge(DEVICE_1.id())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900252 .localBridge(DEVICE_1.id())
Jian Lie2a04ce2020-07-01 19:07:02 +0900253 .tunBridge(DEVICE_1.id())
Jian Li0c632722019-05-08 15:58:04 +0900254 .extIntf(BRIDGE_INTF_1)
Jian Li49109b52019-01-22 00:17:28 +0900255 .dataIp(TEST_IP)
Jian Li6d2ffbf2020-11-04 15:58:18 +0900256 .nodeInfo(NODE_INFO)
Jian Li49109b52019-01-22 00:17:28 +0900257 .state(INIT)
Jian Li0c632722019-05-08 15:58:04 +0900258 .extBridgeIp(EXT_BRIDGE_IP_1)
259 .extGatewayIp(EXT_GATEWAY_IP_1)
260 .podCidr(POD_CIDR_1)
Jian Li49109b52019-01-22 00:17:28 +0900261 .build();
262 }
263
264 private void checkCommonProperties(K8sNode node) {
Jian Lie2a04ce2020-07-01 19:07:02 +0900265 assertEquals(node.clusterName(), CLUSTER_NAME);
Jian Li49109b52019-01-22 00:17:28 +0900266 assertEquals(node.hostname(), HOSTNAME_1);
267 assertEquals(node.type(), MINION);
268 assertEquals(node.managementIp(), MANAGEMENT_IP);
269 assertEquals(node.dataIp(), DATA_IP);
Jian Li6d2ffbf2020-11-04 15:58:18 +0900270 assertEquals(node.nodeInfo(), NODE_INFO);
Jian Li49109b52019-01-22 00:17:28 +0900271 }
272
273 private static Device createDevice(long devIdNum) {
274 return new DefaultDevice(new ProviderId("of", "foo"),
275 DeviceId.deviceId(String.format("of:%016d", devIdNum)),
276 SWITCH,
277 "manufacturer",
278 "hwVersion",
279 "swVersion",
280 "serialNumber",
281 new ChassisId(1));
282 }
283
Jian Lie2a04ce2020-07-01 19:07:02 +0900284 private static K8sNode createNode(String clusterName, String hostname, Type type,
285 int segmentId, Device intgBridge, Device extBridge,
286 Device localBridge, Device tunBridge, String bridgeIntf,
Jian Li6d2ffbf2020-11-04 15:58:18 +0900287 IpAddress ipAddr, K8sNodeInfo info, K8sNodeState state,
Jian Li1a2eb5d2019-08-27 02:07:05 +0900288 IpAddress extBridgeIp, IpAddress extGatewayIp,
289 String podCidr) {
Jian Li49109b52019-01-22 00:17:28 +0900290 return DefaultK8sNode.builder()
Jian Lie2a04ce2020-07-01 19:07:02 +0900291 .clusterName(clusterName)
Jian Li49109b52019-01-22 00:17:28 +0900292 .hostname(hostname)
293 .type(type)
Jian Lie2a04ce2020-07-01 19:07:02 +0900294 .segmentId(segmentId)
Jian Li49109b52019-01-22 00:17:28 +0900295 .intgBridge(intgBridge.id())
Jian Libf562c22019-04-15 18:07:14 +0900296 .extBridge(extBridge.id())
Jian Li1a2eb5d2019-08-27 02:07:05 +0900297 .localBridge(localBridge.id())
Jian Lie2a04ce2020-07-01 19:07:02 +0900298 .tunBridge(tunBridge.id())
Jian Li0c632722019-05-08 15:58:04 +0900299 .extIntf(bridgeIntf)
Jian Li49109b52019-01-22 00:17:28 +0900300 .managementIp(ipAddr)
301 .dataIp(ipAddr)
Jian Li6d2ffbf2020-11-04 15:58:18 +0900302 .nodeInfo(info)
Jian Li49109b52019-01-22 00:17:28 +0900303 .state(state)
Jian Li0c632722019-05-08 15:58:04 +0900304 .extBridgeIp(extBridgeIp)
305 .extGatewayIp(extGatewayIp)
306 .podCidr(podCidr)
Jian Li49109b52019-01-22 00:17:28 +0900307 .build();
308 }
309}