blob: 214e25248e9b4352cb55a5c416374fc465003f05 [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;
30import org.onosproject.incubator.net.tunnel.TunnelId;
31import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
32import org.onosproject.incubator.net.virtual.NetworkId;
33import org.onosproject.incubator.net.virtual.TenantId;
34import org.onosproject.incubator.net.virtual.VirtualDevice;
35import org.onosproject.incubator.net.virtual.VirtualLink;
36import org.onosproject.incubator.net.virtual.VirtualNetwork;
37import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
38import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
39import org.onosproject.incubator.net.virtual.VirtualNetworkService;
40import org.onosproject.incubator.net.virtual.VirtualPort;
41import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
42import org.onosproject.net.ConnectPoint;
43import org.onosproject.net.DefaultPort;
44import org.onosproject.net.DeviceId;
45import org.onosproject.net.NetTestTools;
46import org.onosproject.net.Port;
47import org.onosproject.net.PortNumber;
48import org.onosproject.store.service.TestStorageService;
49
50import java.util.Collection;
51import java.util.List;
52import java.util.Set;
53import java.util.concurrent.atomic.AtomicLong;
54
55import static org.junit.Assert.*;
56
57/**
58 * Junit tests for VirtualNetworkManager.
59 */
60public class VirtualNetworkManagerTest {
61 final String tenantIdValue1 = "TENANT_ID1";
62 final String tenantIdValue2 = "TENANT_ID2";
63 final String deviceIdValue1 = "DEVICE_ID1";
64 final String deviceIdValue2 = "DEVICE_ID2";
65
66 private VirtualNetworkManager manager;
67 private VirtualNetworkService virtualNetworkManagerService;
68 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
69 private CoreService coreService;
70 protected TestListener listener = new TestListener();
71
72 @Before
73 public void setUp() throws Exception {
74 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
75
76 coreService = new TestCoreService();
77 virtualNetworkManagerStore.setCoreService(coreService);
78 TestUtils.setField(coreService, "coreService", new TestCoreService());
79 TestUtils.setField(virtualNetworkManagerStore, "storageService", new TestStorageService());
80 virtualNetworkManagerStore.activate();
81
82 manager = new VirtualNetworkManager();
83 manager.store = virtualNetworkManagerStore;
84 manager.addListener(listener);
85 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
86 manager.activate();
87 virtualNetworkManagerService = manager;
88
89 }
90
91 @After
92 public void tearDown() {
93 virtualNetworkManagerStore.deactivate();
94 manager.removeListener(listener);
95 manager.deactivate();
96 NetTestTools.injectEventDispatcher(manager, null);
97 }
98
99 /**
100 * Tests registering a null tenant id.
101 */
102 @Test(expected = NullPointerException.class)
103 public void testRegisterNullTenantId() {
104 manager.registerTenantId(null);
105 }
106
107 /**
108 * Tests registering/unregistering a tenant id.
109 */
110 @Test
111 public void testRegisterUnregisterTenantId() {
112 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
113 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
114 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
115 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
116 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
117
118 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
119 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
120 tenantIdCollection = manager.getTenantIds();
121 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
122
123 // Validate that the events were all received in the correct order.
124 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED, VirtualNetworkEvent.Type.TENANT_REGISTERED,
125 VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
126 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
127 }
128
129 /**
130 * Tests adding a null virtual network.
131 */
132 @Test(expected = NullPointerException.class)
133 public void testCreateNullVirtualNetwork() {
134 manager.createVirtualNetwork(null);
135 }
136
137 /**
138 * Tests add and remove of virtual networks.
139 */
140 @Test
141 public void testAddRemoveVirtualNetwork() {
142 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
143 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
144 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
145 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
146 assertNotNull("The virtual network set should not be null", virtualNetworks);
147 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
148
Brian Stanke5df14472016-03-11 19:34:38 -0500149 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500150 for (VirtualNetwork virtualNetwork : virtualNetworks) {
151 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500152 assertEquals("The expected virtual network size does not match",
153 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500154 // attempt to remove the same virtual network again.
155 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500156 assertEquals("The expected virtual network size does not match",
157 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500158 }
159 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
160 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
161
Brian Stanke5df14472016-03-11 19:34:38 -0500162 // Create/remove a virtual network.
163 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
164 manager.removeVirtualNetwork(virtualNetwork.id());
165
166 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
167 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
168
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500169 // Validate that the events were all received in the correct order.
170 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
171 VirtualNetworkEvent.Type.NETWORK_ADDED, VirtualNetworkEvent.Type.NETWORK_REMOVED,
Brian Stanke5df14472016-03-11 19:34:38 -0500172 VirtualNetworkEvent.Type.NETWORK_REMOVED, VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500173 VirtualNetworkEvent.Type.NETWORK_REMOVED);
174 }
175
176 /**
177 * Tests adding a null virtual device.
178 */
179 @Test(expected = NullPointerException.class)
180 public void testCreateNullVirtualDevice() {
181 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
182 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
183
184 manager.createVirtualDevice(virtualNetwork.id(), null);
185 }
186
187 /**
188 * Tests adding a virtual device where no virtual network exists.
189 */
190 @Test(expected = IllegalStateException.class)
191 public void testCreateVirtualDeviceWithNoNetwork() {
192 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
193 VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
194
195 manager.createVirtualDevice(virtualNetwork.id(), DeviceId.deviceId(deviceIdValue1));
196 }
197
198 /**
199 * Tests add and remove of virtual devices.
200 */
201 @Test
202 public void testAddRemoveVirtualDevice() {
203 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
204 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
205 VirtualNetwork virtualNetwork2 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
206 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
207 manager.createVirtualDevice(virtualNetwork2.id(), DeviceId.deviceId(deviceIdValue2));
208
209 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
210 assertNotNull("The virtual device set should not be null", virtualDevices1);
211 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
212
213 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
214 assertNotNull("The virtual device set should not be null", virtualDevices2);
215 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
216
217 for (VirtualDevice virtualDevice : virtualDevices1) {
218 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
219 // attempt to remove the same virtual device again.
220 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
221 }
222 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
223 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
224
Brian Stanke5df14472016-03-11 19:34:38 -0500225 // Add/remove the virtual device again.
226 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(),
227 DeviceId.deviceId(deviceIdValue1));
228 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
229 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
230 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
231
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500232 // Validate that the events were all received in the correct order.
233 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
234 VirtualNetworkEvent.Type.NETWORK_ADDED);
235 }
236
237 /**
238 * Tests add and remove of virtual links.
239 */
240 @Test
241 public void testAddRemoveVirtualLink() {
242 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
243 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
244 VirtualDevice srcVirtualDevice =
245 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
246 VirtualDevice dstVirtualDevice =
247 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue2));
248 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
249 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
250 manager.createVirtualLink(virtualNetwork1.id(), src, dst, TunnelId.valueOf(0));
251 manager.createVirtualLink(virtualNetwork1.id(), dst, src, TunnelId.valueOf(1));
252
253 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
254 assertNotNull("The virtual link set should not be null", virtualLinks);
255 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
256
257 for (VirtualLink virtualLink : virtualLinks) {
258 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
259 // attempt to remove the same virtual link again.
260 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
261 }
262 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
263 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500264
265 // Add/remove the virtual link again.
266 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst, TunnelId.valueOf(0));
267 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
268 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
269 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500270 }
271
272 /**
273 * Tests add and remove of virtual ports.
274 */
275 @Test
276 public void testAddRemoveVirtualPort() {
277 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
278 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke5df14472016-03-11 19:34:38 -0500279 VirtualDevice virtualDevice =
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500280 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
Brian Stanke5df14472016-03-11 19:34:38 -0500281 Port port = new DefaultPort(virtualDevice, PortNumber.portNumber(1), true);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500282
Brian Stanke5df14472016-03-11 19:34:38 -0500283 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), port);
284 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), port);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500285
Brian Stanke5df14472016-03-11 19:34:38 -0500286 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500287 assertNotNull("The virtual port set should not be null", virtualPorts);
288 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
289
Brian Stanke5df14472016-03-11 19:34:38 -0500290
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500291 for (VirtualPort virtualPort : virtualPorts) {
292 manager.removeVirtualPort(virtualNetwork1.id(),
293 (DeviceId) virtualPort.element().id(), virtualPort.number());
294 // attempt to remove the same virtual port again.
295 manager.removeVirtualPort(virtualNetwork1.id(),
296 (DeviceId) virtualPort.element().id(), virtualPort.number());
297 }
Brian Stanke5df14472016-03-11 19:34:38 -0500298 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
299 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
300
301 // Add/remove the virtual port again.
302 VirtualPort virtualPort = manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
303 PortNumber.portNumber(1), port);
304 manager.removeVirtualPort(virtualNetwork1.id(), (DeviceId) virtualPort.element().id(), virtualPort.number());
305 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500306 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
307 }
308
309 /**
310 * Method to validate that the actual versus expected virtual network events were
311 * received correctly.
312 *
313 * @param types expected virtual network events.
314 */
315 private void validateEvents(Enum... types) {
316 TestTools.assertAfter(100, () -> {
317 int i = 0;
318 assertEquals("wrong events received", types.length, listener.events.size());
319 for (Event event : listener.events) {
320 assertEquals("incorrect event type", types[i], event.type());
321 i++;
322 }
323 listener.events.clear();
324 });
325 }
326
327 /**
328 * Test listener class to receive virtual network events.
329 */
330 private static class TestListener implements VirtualNetworkListener {
331
332 protected List<VirtualNetworkEvent> events = Lists.newArrayList();
333
334 @Override
335 public void event(VirtualNetworkEvent event) {
336 events.add(event);
337 }
338
339 }
340
Brian Stanke5df14472016-03-11 19:34:38 -0500341 /**
342 * Core service test class.
343 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500344 private class TestCoreService extends CoreServiceAdapter {
345
346 @Override
347 public IdGenerator getIdGenerator(String topic) {
348 return new IdGenerator() {
349 private AtomicLong counter = new AtomicLong(0);
350
351 @Override
352 public long getNewId() {
353 return counter.getAndIncrement();
354 }
355 };
356 }
357 }
358}