blob: 8976a7e75d701cbb16709ed142350a7622d59d53 [file] [log] [blame]
Brian Stanke0e5c94e2016-03-08 11:20:04 -05001/*
2 * Copyright 2016 Open Networking Laboratory
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 */
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
149 for (VirtualNetwork virtualNetwork : virtualNetworks) {
150 manager.removeVirtualNetwork(virtualNetwork.id());
151 // attempt to remove the same virtual network again.
152 manager.removeVirtualNetwork(virtualNetwork.id());
153 }
154 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
155 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
156
157 // Validate that the events were all received in the correct order.
158 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
159 VirtualNetworkEvent.Type.NETWORK_ADDED, VirtualNetworkEvent.Type.NETWORK_REMOVED,
160 VirtualNetworkEvent.Type.NETWORK_REMOVED);
161 }
162
163 /**
164 * Tests adding a null virtual device.
165 */
166 @Test(expected = NullPointerException.class)
167 public void testCreateNullVirtualDevice() {
168 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
169 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
170
171 manager.createVirtualDevice(virtualNetwork.id(), null);
172 }
173
174 /**
175 * Tests adding a virtual device where no virtual network exists.
176 */
177 @Test(expected = IllegalStateException.class)
178 public void testCreateVirtualDeviceWithNoNetwork() {
179 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
180 VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
181
182 manager.createVirtualDevice(virtualNetwork.id(), DeviceId.deviceId(deviceIdValue1));
183 }
184
185 /**
186 * Tests add and remove of virtual devices.
187 */
188 @Test
189 public void testAddRemoveVirtualDevice() {
190 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
191 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
192 VirtualNetwork virtualNetwork2 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
193 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
194 manager.createVirtualDevice(virtualNetwork2.id(), DeviceId.deviceId(deviceIdValue2));
195
196 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
197 assertNotNull("The virtual device set should not be null", virtualDevices1);
198 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
199
200 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
201 assertNotNull("The virtual device set should not be null", virtualDevices2);
202 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
203
204 for (VirtualDevice virtualDevice : virtualDevices1) {
205 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
206 // attempt to remove the same virtual device again.
207 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
208 }
209 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
210 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
211
212 // Validate that the events were all received in the correct order.
213 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
214 VirtualNetworkEvent.Type.NETWORK_ADDED);
215 }
216
217 /**
218 * Tests add and remove of virtual links.
219 */
220 @Test
221 public void testAddRemoveVirtualLink() {
222 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
223 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
224 VirtualDevice srcVirtualDevice =
225 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
226 VirtualDevice dstVirtualDevice =
227 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue2));
228 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
229 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
230 manager.createVirtualLink(virtualNetwork1.id(), src, dst, TunnelId.valueOf(0));
231 manager.createVirtualLink(virtualNetwork1.id(), dst, src, TunnelId.valueOf(1));
232
233 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
234 assertNotNull("The virtual link set should not be null", virtualLinks);
235 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
236
237 for (VirtualLink virtualLink : virtualLinks) {
238 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
239 // attempt to remove the same virtual link again.
240 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
241 }
242 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
243 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
244 }
245
246 /**
247 * Tests add and remove of virtual ports.
248 */
249 @Test
250 public void testAddRemoveVirtualPort() {
251 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
252 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
253 VirtualDevice srcVirtualDevice =
254 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue1));
255 VirtualDevice dstVirtualDevice =
256 manager.createVirtualDevice(virtualNetwork1.id(), DeviceId.deviceId(deviceIdValue2));
257 Port port = new DefaultPort(srcVirtualDevice, PortNumber.portNumber(1), true);
258
259 manager.createVirtualPort(virtualNetwork1.id(), srcVirtualDevice.id(), PortNumber.portNumber(1), port);
260 manager.createVirtualPort(virtualNetwork1.id(), dstVirtualDevice.id(), PortNumber.portNumber(1), port);
261
262 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), srcVirtualDevice.id());
263 assertNotNull("The virtual port set should not be null", virtualPorts);
264 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
265
266 for (VirtualPort virtualPort : virtualPorts) {
267 manager.removeVirtualPort(virtualNetwork1.id(),
268 (DeviceId) virtualPort.element().id(), virtualPort.number());
269 // attempt to remove the same virtual port again.
270 manager.removeVirtualPort(virtualNetwork1.id(),
271 (DeviceId) virtualPort.element().id(), virtualPort.number());
272 }
273 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), srcVirtualDevice.id());
274 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
275 }
276
277 /**
278 * Method to validate that the actual versus expected virtual network events were
279 * received correctly.
280 *
281 * @param types expected virtual network events.
282 */
283 private void validateEvents(Enum... types) {
284 TestTools.assertAfter(100, () -> {
285 int i = 0;
286 assertEquals("wrong events received", types.length, listener.events.size());
287 for (Event event : listener.events) {
288 assertEquals("incorrect event type", types[i], event.type());
289 i++;
290 }
291 listener.events.clear();
292 });
293 }
294
295 /**
296 * Test listener class to receive virtual network events.
297 */
298 private static class TestListener implements VirtualNetworkListener {
299
300 protected List<VirtualNetworkEvent> events = Lists.newArrayList();
301
302 @Override
303 public void event(VirtualNetworkEvent event) {
304 events.add(event);
305 }
306
307 }
308
309 private class TestCoreService extends CoreServiceAdapter {
310
311 @Override
312 public IdGenerator getIdGenerator(String topic) {
313 return new IdGenerator() {
314 private AtomicLong counter = new AtomicLong(0);
315
316 @Override
317 public long getNewId() {
318 return counter.getAndIncrement();
319 }
320 };
321 }
322 }
323}