blob: 468f68251b1a4a8d101583d3f3502e976bff6c24 [file] [log] [blame]
Jian Li7e8f57e2019-01-24 18:31:03 +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.k8snetworking.impl;
17
18import com.google.common.collect.Lists;
19import com.google.common.util.concurrent.MoreExecutors;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestUtils;
24import org.onlab.packet.IpAddress;
25import org.onlab.packet.MacAddress;
26import org.onosproject.core.ApplicationId;
27import org.onosproject.core.CoreServiceAdapter;
28import org.onosproject.core.DefaultApplicationId;
29import org.onosproject.event.Event;
30import org.onosproject.k8snetworking.api.DefaultK8sNetwork;
31import org.onosproject.k8snetworking.api.DefaultK8sPort;
32import org.onosproject.k8snetworking.api.K8sNetwork;
33import org.onosproject.k8snetworking.api.K8sNetworkEvent;
34import org.onosproject.k8snetworking.api.K8sNetworkListener;
35import org.onosproject.k8snetworking.api.K8sPort;
36import org.onosproject.net.DeviceId;
37import org.onosproject.net.PortNumber;
38import org.onosproject.store.service.TestStorageService;
39
40import java.util.List;
41
42import static org.junit.Assert.assertEquals;
43import static org.junit.Assert.assertNotNull;
44import static org.junit.Assert.assertNull;
45import static org.onosproject.k8snetworking.api.K8sNetworkEvent.Type.K8S_NETWORK_CREATED;
46import static org.onosproject.k8snetworking.api.K8sNetworkEvent.Type.K8S_NETWORK_REMOVED;
47import static org.onosproject.k8snetworking.api.K8sNetworkEvent.Type.K8S_NETWORK_UPDATED;
48import static org.onosproject.k8snetworking.api.K8sNetworkEvent.Type.K8S_PORT_CREATED;
49import static org.onosproject.k8snetworking.api.K8sNetworkEvent.Type.K8S_PORT_REMOVED;
50import static org.onosproject.k8snetworking.api.K8sNetworkEvent.Type.K8S_PORT_UPDATED;
51
52/**
53 * Unit tests for kubernetes network manager.
54 */
55public class K8sNetworkManagerTest {
56
57 private static final ApplicationId TEST_APP_ID = new DefaultApplicationId(1, "test");
58
59 private static final String UNKNOWN_ID = "unknown_id";
60 private static final String UPDATED_ID = "updated_id";
61 private static final String UPDATED_NAME = "updated_name";
62
63 private static final String NETWORK_ID = "network_id";
64 private static final String NETWORK_NAME = "network_name";
65 private static final K8sNetwork NETWORK = DefaultK8sNetwork.builder()
66 .networkId(NETWORK_ID)
67 .name(NETWORK_NAME)
68 .type(K8sNetwork.Type.VXLAN)
69 .segmentId("1")
Jian Li5a9c2bb2019-05-07 13:21:52 +090070 .cidr("10.10.0.0/24")
Jian Li7e8f57e2019-01-24 18:31:03 +090071 .mtu(1500)
72 .build();
73 private static final K8sNetwork NETWORK_UPDATED = DefaultK8sNetwork.builder()
74 .networkId(NETWORK_ID)
75 .name(UPDATED_NAME)
76 .type(K8sNetwork.Type.VXLAN)
77 .segmentId("1")
Jian Li5a9c2bb2019-05-07 13:21:52 +090078 .cidr("10.10.0.0/24")
Jian Li7e8f57e2019-01-24 18:31:03 +090079 .mtu(1500)
80 .build();
81
82 private static final String PORT_ID = "port_id";
83 private static final K8sPort PORT = DefaultK8sPort.builder()
84 .portId(PORT_ID)
85 .networkId(NETWORK_ID)
86 .deviceId(DeviceId.deviceId("dev-1"))
87 .ipAddress(IpAddress.valueOf("20.20.20.20"))
88 .macAddress(MacAddress.valueOf("00:11:22:33:44:55"))
89 .portNumber(PortNumber.portNumber("1"))
90 .state(K8sPort.State.ACTIVE)
91 .build();
92 private static final K8sPort PORT_UPDATED = DefaultK8sPort.builder()
93 .portId(PORT_ID)
94 .networkId(UPDATED_ID)
95 .deviceId(DeviceId.deviceId("dev-1"))
96 .ipAddress(IpAddress.valueOf("20.20.20.20"))
97 .macAddress(MacAddress.valueOf("00:11:22:33:44:55"))
98 .portNumber(PortNumber.portNumber("1"))
99 .state(K8sPort.State.ACTIVE)
100 .build();
101
102 private final TestK8sNetworkListener testListener = new TestK8sNetworkListener();
103
104 private K8sNetworkManager target;
105 private DistributedK8sNetworkStore k8sNetworkStore;
106
107 @Before
108 public void setUp() throws Exception {
109 k8sNetworkStore = new DistributedK8sNetworkStore();
110 TestUtils.setField(k8sNetworkStore, "coreService", new TestCoreService());
111 TestUtils.setField(k8sNetworkStore, "storageService", new TestStorageService());
112 TestUtils.setField(k8sNetworkStore, "eventExecutor", MoreExecutors.newDirectExecutorService());
113 k8sNetworkStore.activate();
114
115 target = new K8sNetworkManager();
116 TestUtils.setField(target, "coreService", new TestCoreService());
117 target.k8sNetworkStore = k8sNetworkStore;
118 target.addListener(testListener);
119 target.activate();
120 }
121
122 @After
123 public void tearDown() {
124 target.removeListener(testListener);
125 k8sNetworkStore.deactivate();
126 target.deactivate();
127 k8sNetworkStore = null;
128 target = null;
129 }
130
131 /**
132 * Tests if getting all networks returns the correct set of networks.
133 */
134 @Test
135 public void testGetNetworks() {
136 createBasicNetworks();
137 assertEquals("Number of network did not match", 1, target.networks().size());
138 }
139
140 /**
141 * Tests if getting a network with ID returns the correct network.
142 */
143 @Test
144 public void testGetNetworkById() {
145 createBasicNetworks();
146 assertNotNull("Network did not match", target.network(NETWORK_ID));
147 assertNull("Network did not match", target.network(UNKNOWN_ID));
148 }
149
150 /**
151 * Tests creating and removing a network, and checks if it triggers proper events.
152 */
153 @Test
154 public void testCreateAndRemoveNetwork() {
155 target.createNetwork(NETWORK);
156 assertEquals("Number of networks did not match", 1, target.networks().size());
157 assertNotNull("Network was not created", target.network(NETWORK_ID));
158
159 target.removeNetwork(NETWORK_ID);
160 assertEquals("Number of networks did not match", 0, target.networks().size());
161 assertNull("Network was not removed", target.network(NETWORK_ID));
162
163 validateEvents(K8S_NETWORK_CREATED, K8S_NETWORK_REMOVED);
164 }
165
166 /**
167 * Tests updating a network, and checks if it triggers proper events.
168 */
169 @Test
170 public void testCreateAndUpdateNetwork() {
171 target.createNetwork(NETWORK);
172 assertEquals("Number of networks did not match", 1, target.networks().size());
173 assertEquals("Network did not match", NETWORK_NAME, target.network(NETWORK_ID).name());
174
175 target.updateNetwork(NETWORK_UPDATED);
176
177 assertEquals("Number of networks did not match", 1, target.networks().size());
178 assertEquals("Network did not match", UPDATED_NAME, target.network(NETWORK_ID).name());
179 validateEvents(K8S_NETWORK_CREATED, K8S_NETWORK_UPDATED);
180 }
181
182 /**
183 * Tests if creating a null network fails with an exception.
184 */
185 @Test(expected = NullPointerException.class)
186 public void testCreateNullNetwork() {
187 target.createNetwork(null);
188 }
189
190 /**
191 * Tests if creating a duplicate network fails with an exception.
192 */
193 @Test(expected = IllegalArgumentException.class)
194 public void testCreateDuplicateNetwork() {
195 target.createNetwork(NETWORK);
196 target.createNetwork(NETWORK);
197 }
198
199 /**
200 * Tests if removing network with null ID fails with an exception.
201 */
202 @Test(expected = IllegalArgumentException.class)
203 public void testRemoveNetworkWithNull() {
204 target.removeNetwork(null);
205 }
206
207 /**
208 * Tests if updating an unregistered network fails with an exception.
209 */
210 @Test(expected = IllegalArgumentException.class)
211 public void testUpdateUnregisteredNetwork() {
212 target.updateNetwork(NETWORK);
213 }
214
215 /**
216 * Tests if getting all ports returns correct set of values.
217 */
218 @Test
219 public void testGetPorts() {
220 createBasicNetworks();
221 assertEquals("Number of port did not match", 1, target.ports().size());
222 }
223
224 /**
225 * Tests if getting a port with network ID returns correct set of values.
226 */
227 @Test
228 public void testGetPortsByNetworkId() {
229 createBasicNetworks();
230 assertEquals("Number of port did not match", 1, target.ports(NETWORK_ID).size());
231 assertEquals("Number of port did not match", 0, target.ports(UNKNOWN_ID).size());
232 }
233
234 /**
235 * Tests if getting a port with ID returns correct value.
236 */
237 @Test
238 public void testGetPortById() {
239 createBasicNetworks();
240 assertNotNull("Port did not match", target.port(PORT_ID));
241 assertNull("Port did not match", target.port(UNKNOWN_ID));
242 }
243
244 /**
245 * Tests creating and removing a port, and checks if proper event is triggered.
246 */
247 @Test
248 public void testCreateAndRemovePort() {
249 target.createPort(PORT);
250 assertEquals("Number of port did not match", 1, target.ports().size());
251 assertNotNull("Port was not created", target.port(PORT_ID));
252
253 target.removePort(PORT_ID);
254 assertEquals("Number of port did not match", 0, target.ports().size());
255 assertNull("Port was not created", target.port(PORT_ID));
256
257 validateEvents(K8S_PORT_CREATED, K8S_PORT_REMOVED);
258 }
259
260 /**
261 * Tests creating and updating a port, and checks if proper event is triggered.
262 */
263 @Test
264 public void testCreateAndUpdatePort() {
265 target.createPort(PORT);
266 assertEquals("Number of port did not match", 1, target.ports().size());
267
268 target.updatePort(PORT_UPDATED);
269
270 assertEquals("Number of port did not match", 1, target.ports().size());
271 assertEquals("Port did not match", UPDATED_ID, target.port(PORT_ID).networkId());
272
273 validateEvents(K8S_PORT_CREATED, K8S_PORT_UPDATED);
274 }
275
276 /**
277 * Tests if creating a null port fails with an exception.
278 */
279 @Test(expected = NullPointerException.class)
280 public void testCreateNullPort() {
281 target.createPort(null);
282 }
283
284
285 /**
286 * Tests if creating a duplicate port fails with an exception.
287 */
288 @Test(expected = IllegalArgumentException.class)
289 public void createDuplicatePort() {
290 target.createPort(PORT);
291 target.createPort(PORT);
292 }
293
294 /**
295 * Tests if updating an unregistered port fails with an exception.
296 */
297 @Test(expected = IllegalArgumentException.class)
298 public void testUpdateUnregisteredPort() {
299 target.updatePort(PORT);
300 }
301
302 /**
303 * Tests if updating a null port fails with an exception.
304 */
305 @Test(expected = NullPointerException.class)
306 public void testUpdateNullPort() {
307 target.updatePort(null);
308 }
309
310
311 private void createBasicNetworks() {
312 target.createNetwork(NETWORK);
313 target.createPort(PORT);
314 }
315
316 private static class TestCoreService extends CoreServiceAdapter {
317
318 @Override
319 public ApplicationId registerApplication(String name) {
320 return TEST_APP_ID;
321 }
322 }
323
324 private static class TestK8sNetworkListener implements K8sNetworkListener {
325 private List<K8sNetworkEvent> events = Lists.newArrayList();
326
327 @Override
328 public void event(K8sNetworkEvent event) {
329 events.add(event);
330 }
331 }
332
333 private void validateEvents(Enum... types) {
334 int i = 0;
335 assertEquals("Number of events did not match", types.length, testListener.events.size());
336 for (Event event : testListener.events) {
337 assertEquals("Incorrect event received", types[i], event.type());
338 i++;
339 }
340 testListener.events.clear();
341 }
342}