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