blob: 837b501d8d72ece29843dffc94e40f4b7da13917 [file] [log] [blame]
Brian Stanke0e5c94e2016-03-08 11:20:04 -05001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Brian Stanke0e5c94e2016-03-08 11:20:04 -05003 *
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 */
16
17package org.onosproject.incubator.net.virtual.impl;
18
19import com.google.common.collect.Lists;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestTools;
24import org.onlab.junit.TestUtils;
25import org.onosproject.common.event.impl.TestEventDispatcher;
26import org.onosproject.core.CoreService;
27import org.onosproject.core.CoreServiceAdapter;
28import org.onosproject.core.IdGenerator;
29import org.onosproject.event.Event;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050030import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
31import org.onosproject.incubator.net.virtual.NetworkId;
32import org.onosproject.incubator.net.virtual.TenantId;
33import org.onosproject.incubator.net.virtual.VirtualDevice;
34import org.onosproject.incubator.net.virtual.VirtualLink;
35import org.onosproject.incubator.net.virtual.VirtualNetwork;
36import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
37import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
38import org.onosproject.incubator.net.virtual.VirtualNetworkService;
39import org.onosproject.incubator.net.virtual.VirtualPort;
40import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
41import org.onosproject.net.ConnectPoint;
42import org.onosproject.net.DefaultPort;
43import org.onosproject.net.DeviceId;
44import org.onosproject.net.NetTestTools;
45import org.onosproject.net.Port;
46import org.onosproject.net.PortNumber;
47import org.onosproject.store.service.TestStorageService;
48
49import java.util.Collection;
50import java.util.List;
51import java.util.Set;
52import java.util.concurrent.atomic.AtomicLong;
53
54import static org.junit.Assert.*;
55
56/**
57 * Junit tests for VirtualNetworkManager.
58 */
59public class VirtualNetworkManagerTest {
60 final String tenantIdValue1 = "TENANT_ID1";
61 final String tenantIdValue2 = "TENANT_ID2";
62 final String deviceIdValue1 = "DEVICE_ID1";
63 final String deviceIdValue2 = "DEVICE_ID2";
64
65 private VirtualNetworkManager manager;
66 private VirtualNetworkService virtualNetworkManagerService;
67 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
68 private CoreService coreService;
69 protected TestListener listener = new TestListener();
70
71 @Before
72 public void setUp() throws Exception {
73 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
74
75 coreService = new TestCoreService();
76 virtualNetworkManagerStore.setCoreService(coreService);
77 TestUtils.setField(coreService, "coreService", new TestCoreService());
78 TestUtils.setField(virtualNetworkManagerStore, "storageService", new TestStorageService());
79 virtualNetworkManagerStore.activate();
80
81 manager = new VirtualNetworkManager();
82 manager.store = virtualNetworkManagerStore;
83 manager.addListener(listener);
84 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
85 manager.activate();
86 virtualNetworkManagerService = manager;
87
88 }
89
90 @After
91 public void tearDown() {
92 virtualNetworkManagerStore.deactivate();
93 manager.removeListener(listener);
94 manager.deactivate();
95 NetTestTools.injectEventDispatcher(manager, null);
96 }
97
98 /**
99 * Tests registering a null tenant id.
100 */
101 @Test(expected = NullPointerException.class)
102 public void testRegisterNullTenantId() {
103 manager.registerTenantId(null);
104 }
105
106 /**
107 * Tests registering/unregistering a tenant id.
108 */
109 @Test
110 public void testRegisterUnregisterTenantId() {
111 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
112 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
113 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
114 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
115 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
116
117 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
118 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
119 tenantIdCollection = manager.getTenantIds();
120 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
121
122 // Validate that the events were all received in the correct order.
123 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED, VirtualNetworkEvent.Type.TENANT_REGISTERED,
124 VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
125 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
126 }
127
128 /**
129 * Tests adding a null virtual network.
130 */
131 @Test(expected = NullPointerException.class)
132 public void testCreateNullVirtualNetwork() {
133 manager.createVirtualNetwork(null);
134 }
135
136 /**
137 * Tests add and remove of virtual networks.
138 */
139 @Test
140 public void testAddRemoveVirtualNetwork() {
141 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
142 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
143 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
144 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
145 assertNotNull("The virtual network set should not be null", virtualNetworks);
146 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
147
Brian Stanke5df14472016-03-11 19:34:38 -0500148 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500149 for (VirtualNetwork virtualNetwork : virtualNetworks) {
150 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500151 assertEquals("The expected virtual network size does not match",
152 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500153 // attempt to remove the same virtual network again.
154 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500155 assertEquals("The expected virtual network size does not match",
156 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500157 }
158 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
159 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
160
Brian Stanke5df14472016-03-11 19:34:38 -0500161 // Create/remove a virtual network.
162 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
163 manager.removeVirtualNetwork(virtualNetwork.id());
164
165 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
166 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
167
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500168 // Validate that the events were all received in the correct order.
169 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
170 VirtualNetworkEvent.Type.NETWORK_ADDED, VirtualNetworkEvent.Type.NETWORK_REMOVED,
Brian Stanke5df14472016-03-11 19:34:38 -0500171 VirtualNetworkEvent.Type.NETWORK_REMOVED, VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500172 VirtualNetworkEvent.Type.NETWORK_REMOVED);
173 }
174
175 /**
176 * Tests adding a null virtual device.
177 */
178 @Test(expected = NullPointerException.class)
179 public void testCreateNullVirtualDevice() {
180 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
181 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
182
183 manager.createVirtualDevice(virtualNetwork.id(), null);
184 }
185
186 /**
187 * Tests adding a virtual device where no virtual network exists.
188 */
189 @Test(expected = IllegalStateException.class)
190 public void testCreateVirtualDeviceWithNoNetwork() {
191 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
192 VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
193
194 manager.createVirtualDevice(virtualNetwork.id(), DeviceId.deviceId(deviceIdValue1));
195 }
196
197 /**
198 * Tests add and remove of virtual devices.
199 */
200 @Test
201 public void testAddRemoveVirtualDevice() {
202 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
203 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
204 VirtualNetwork virtualNetwork2 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
205 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
206 manager.createVirtualDevice(virtualNetwork2.id(), DeviceId.deviceId(deviceIdValue2));
207
208 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
209 assertNotNull("The virtual device set should not be null", virtualDevices1);
210 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
211
212 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
213 assertNotNull("The virtual device set should not be null", virtualDevices2);
214 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
215
216 for (VirtualDevice virtualDevice : virtualDevices1) {
217 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
218 // attempt to remove the same virtual device again.
219 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
220 }
221 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
222 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
223
Brian Stanke5df14472016-03-11 19:34:38 -0500224 // Add/remove the virtual device again.
225 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(),
226 DeviceId.deviceId(deviceIdValue1));
227 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
228 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
229 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
230
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500231 // Validate that the events were all received in the correct order.
232 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
233 VirtualNetworkEvent.Type.NETWORK_ADDED);
234 }
235
236 /**
237 * Tests add and remove of virtual links.
238 */
239 @Test
240 public void testAddRemoveVirtualLink() {
241 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
242 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
243 VirtualDevice srcVirtualDevice =
244 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
245 VirtualDevice dstVirtualDevice =
246 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue2));
247 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
248 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stanke9a108972016-04-11 15:25:17 -0400249 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
250 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500251
252 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
253 assertNotNull("The virtual link set should not be null", virtualLinks);
254 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
255
256 for (VirtualLink virtualLink : virtualLinks) {
257 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
258 // attempt to remove the same virtual link again.
259 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
260 }
261 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
262 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500263
264 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400265 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500266 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
267 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
268 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500269 }
270
271 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400272 * Tests adding the same virtual link twice.
273 */
274 @Test(expected = IllegalStateException.class)
275 public void testAddSameVirtualLink() {
276 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
277 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
278 VirtualDevice srcVirtualDevice =
279 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
280 VirtualDevice dstVirtualDevice =
281 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue2));
282 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
283 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
284 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
285 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
286 }
287
288 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500289 * Tests add and remove of virtual ports.
290 */
291 @Test
292 public void testAddRemoveVirtualPort() {
293 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
294 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke5df14472016-03-11 19:34:38 -0500295 VirtualDevice virtualDevice =
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500296 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
Brian Stanke5df14472016-03-11 19:34:38 -0500297 Port port = new DefaultPort(virtualDevice, PortNumber.portNumber(1), true);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500298
Brian Stanke5df14472016-03-11 19:34:38 -0500299 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), port);
300 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), port);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500301
Brian Stanke5df14472016-03-11 19:34:38 -0500302 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500303 assertNotNull("The virtual port set should not be null", virtualPorts);
304 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
305
Brian Stanke5df14472016-03-11 19:34:38 -0500306
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500307 for (VirtualPort virtualPort : virtualPorts) {
308 manager.removeVirtualPort(virtualNetwork1.id(),
309 (DeviceId) virtualPort.element().id(), virtualPort.number());
310 // attempt to remove the same virtual port again.
311 manager.removeVirtualPort(virtualNetwork1.id(),
312 (DeviceId) virtualPort.element().id(), virtualPort.number());
313 }
Brian Stanke5df14472016-03-11 19:34:38 -0500314 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
315 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
316
317 // Add/remove the virtual port again.
318 VirtualPort virtualPort = manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
319 PortNumber.portNumber(1), port);
320 manager.removeVirtualPort(virtualNetwork1.id(), (DeviceId) virtualPort.element().id(), virtualPort.number());
321 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500322 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
323 }
324
325 /**
326 * Method to validate that the actual versus expected virtual network events were
327 * received correctly.
328 *
329 * @param types expected virtual network events.
330 */
331 private void validateEvents(Enum... types) {
332 TestTools.assertAfter(100, () -> {
333 int i = 0;
334 assertEquals("wrong events received", types.length, listener.events.size());
335 for (Event event : listener.events) {
336 assertEquals("incorrect event type", types[i], event.type());
337 i++;
338 }
339 listener.events.clear();
340 });
341 }
342
343 /**
344 * Test listener class to receive virtual network events.
345 */
346 private static class TestListener implements VirtualNetworkListener {
347
348 protected List<VirtualNetworkEvent> events = Lists.newArrayList();
349
350 @Override
351 public void event(VirtualNetworkEvent event) {
352 events.add(event);
353 }
354
355 }
356
Brian Stanke5df14472016-03-11 19:34:38 -0500357 /**
358 * Core service test class.
359 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500360 private class TestCoreService extends CoreServiceAdapter {
361
362 @Override
363 public IdGenerator getIdGenerator(String topic) {
364 return new IdGenerator() {
365 private AtomicLong counter = new AtomicLong(0);
366
367 @Override
368 public long getNewId() {
369 return counter.getAndIncrement();
370 }
371 };
372 }
373 }
374}