blob: dafd1f7d1a5dd85b20c9de81aa9cfbee56c84135 [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 Stanke11f6d532016-07-05 16:17:59 -040030import org.onosproject.incubator.net.tunnel.TunnelId;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050031import 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;
Brian Stanke7a81b532016-06-14 15:43:51 -040035import org.onosproject.incubator.net.virtual.VirtualHost;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050036import org.onosproject.incubator.net.virtual.VirtualLink;
37import org.onosproject.incubator.net.virtual.VirtualNetwork;
38import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
Brian Stanke11f6d532016-07-05 16:17:59 -040039import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050040import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
Brian Stankefb61df42016-07-25 11:47:51 -040041import org.onosproject.incubator.net.virtual.VirtualNetworkProviderService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050042import org.onosproject.incubator.net.virtual.VirtualPort;
yoonseon214963b2016-11-21 15:41:07 -080043import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualNetworkProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050044import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
45import org.onosproject.net.ConnectPoint;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050046import org.onosproject.net.DeviceId;
Brian Stankefb61df42016-07-25 11:47:51 -040047import org.onosproject.net.Link;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050048import org.onosproject.net.NetTestTools;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050049import org.onosproject.net.PortNumber;
Brian Stanke7a81b532016-06-14 15:43:51 -040050import org.onosproject.net.TestDeviceParams;
Brian Stanke11f6d532016-07-05 16:17:59 -040051import org.onosproject.net.intent.FakeIntentManager;
52import org.onosproject.net.intent.Intent;
53import org.onosproject.net.intent.IntentState;
54import org.onosproject.net.intent.Key;
55import org.onosproject.net.intent.MockIdGenerator;
56import org.onosproject.net.intent.TestableIntentService;
Brian Stankefb61df42016-07-25 11:47:51 -040057import org.onosproject.net.topology.Topology;
58import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050059import org.onosproject.store.service.TestStorageService;
60
Brian Stankefb61df42016-07-25 11:47:51 -040061import java.util.ArrayList;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050062import java.util.Collection;
63import java.util.List;
64import java.util.Set;
65import java.util.concurrent.atomic.AtomicLong;
66
67import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040068import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050069
70/**
71 * Junit tests for VirtualNetworkManager.
72 */
Brian Stanke7a81b532016-06-14 15:43:51 -040073public class VirtualNetworkManagerTest extends TestDeviceParams {
Brian Stanke86914282016-05-25 15:36:50 -040074 private final String tenantIdValue1 = "TENANT_ID1";
75 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -050076
77 private VirtualNetworkManager manager;
yoonseon214963b2016-11-21 15:41:07 -080078 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050079 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
80 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -040081 private TestListener listener = new TestListener();
Brian Stanke11f6d532016-07-05 16:17:59 -040082 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -040083 private TopologyService topologyService;
Brian Stanke11f6d532016-07-05 16:17:59 -040084 private IdGenerator idGenerator = new MockIdGenerator();
Brian Stanke0e5c94e2016-03-08 11:20:04 -050085
Brian Stankefb61df42016-07-25 11:47:51 -040086 private ConnectPoint cp6;
87 private ConnectPoint cp7;
88
Brian Stanke0e5c94e2016-03-08 11:20:04 -050089 @Before
90 public void setUp() throws Exception {
91 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Brian Stanke11f6d532016-07-05 16:17:59 -040092 Intent.bindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050093
94 coreService = new TestCoreService();
95 virtualNetworkManagerStore.setCoreService(coreService);
96 TestUtils.setField(coreService, "coreService", new TestCoreService());
yoonseon214963b2016-11-21 15:41:07 -080097 TestUtils.setField(virtualNetworkManagerStore, "storageService",
98 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -050099 virtualNetworkManagerStore.activate();
100
101 manager = new VirtualNetworkManager();
102 manager.store = virtualNetworkManagerStore;
103 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400104 manager.intentService = intentService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500105 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
106 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500107 }
108
109 @After
110 public void tearDown() {
111 virtualNetworkManagerStore.deactivate();
112 manager.removeListener(listener);
113 manager.deactivate();
114 NetTestTools.injectEventDispatcher(manager, null);
Brian Stanke11f6d532016-07-05 16:17:59 -0400115 Intent.unbindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500116 }
117
118 /**
119 * Tests registering a null tenant id.
120 */
121 @Test(expected = NullPointerException.class)
122 public void testRegisterNullTenantId() {
123 manager.registerTenantId(null);
124 }
125
126 /**
127 * Tests registering/unregistering a tenant id.
128 */
129 @Test
130 public void testRegisterUnregisterTenantId() {
131 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
132 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
133 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
134 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
135 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
136
137 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
138 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
139 tenantIdCollection = manager.getTenantIds();
140 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
141
142 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800143 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
144 VirtualNetworkEvent.Type.TENANT_REGISTERED,
145 VirtualNetworkEvent.Type.TENANT_REGISTERED,
146 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500147 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
148 }
149
150 /**
151 * Tests adding a null virtual network.
152 */
153 @Test(expected = NullPointerException.class)
154 public void testCreateNullVirtualNetwork() {
155 manager.createVirtualNetwork(null);
156 }
157
158 /**
159 * Tests add and remove of virtual networks.
160 */
161 @Test
162 public void testAddRemoveVirtualNetwork() {
163 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
164 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
165 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
166 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
167 assertNotNull("The virtual network set should not be null", virtualNetworks);
168 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
169
Brian Stanke5df14472016-03-11 19:34:38 -0500170 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500171 for (VirtualNetwork virtualNetwork : virtualNetworks) {
172 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500173 assertEquals("The expected virtual network size does not match",
174 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500175 // attempt to remove the same virtual network again.
176 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500177 assertEquals("The expected virtual network size does not match",
178 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500179 }
180 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
181 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
182
Brian Stanke5df14472016-03-11 19:34:38 -0500183 // Create/remove a virtual network.
184 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
185 manager.removeVirtualNetwork(virtualNetwork.id());
186
187 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
188 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
189
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500190 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800191 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
192 VirtualNetworkEvent.Type.NETWORK_ADDED,
193 VirtualNetworkEvent.Type.NETWORK_ADDED,
194 VirtualNetworkEvent.Type.NETWORK_REMOVED,
195 VirtualNetworkEvent.Type.NETWORK_REMOVED,
196 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500197 VirtualNetworkEvent.Type.NETWORK_REMOVED);
198 }
199
200 /**
201 * Tests adding a null virtual device.
202 */
203 @Test(expected = NullPointerException.class)
204 public void testCreateNullVirtualDevice() {
205 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
206 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
207
208 manager.createVirtualDevice(virtualNetwork.id(), null);
209 }
210
211 /**
212 * Tests adding a virtual device where no virtual network exists.
213 */
214 @Test(expected = IllegalStateException.class)
215 public void testCreateVirtualDeviceWithNoNetwork() {
216 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800217 VirtualNetwork virtualNetwork =
218 new DefaultVirtualNetwork(NetworkId.NONE,
219 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500220
Brian Stanke7a81b532016-06-14 15:43:51 -0400221 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500222 }
223
224 /**
225 * Tests add and remove of virtual devices.
226 */
227 @Test
228 public void testAddRemoveVirtualDevice() {
229 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800230 VirtualNetwork virtualNetwork1 =
231 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
232 VirtualNetwork virtualNetwork2 =
233 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400234 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
235 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500236
237 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
238 assertNotNull("The virtual device set should not be null", virtualDevices1);
239 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
240
241 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
242 assertNotNull("The virtual device set should not be null", virtualDevices2);
243 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
244
245 for (VirtualDevice virtualDevice : virtualDevices1) {
246 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
247 // attempt to remove the same virtual device again.
248 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
249 }
250 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
251 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
252
Brian Stanke5df14472016-03-11 19:34:38 -0500253 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400254 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke5df14472016-03-11 19:34:38 -0500255 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
256 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
257 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
258
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500259 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800260 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
261 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500262 VirtualNetworkEvent.Type.NETWORK_ADDED);
263 }
264
265 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400266 * Tests adding a null virtual host.
267 */
268 @Test(expected = NullPointerException.class)
269 public void testCreateNullVirtualHost() {
270 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800271 VirtualNetwork virtualNetwork =
272 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400273
274 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
275 }
276
277 /**
278 * Tests adding a virtual host where no virtual network exists.
279 */
280 @Test(expected = IllegalStateException.class)
281 public void testCreateVirtualHostWithNoNetwork() {
282 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800283 VirtualNetwork virtualNetwork =
284 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400285
286 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
287 }
288
289 /**
290 * Tests add and remove of virtual hosts.
291 */
292 @Test
293 public void testAddRemoveVirtualHost() {
294 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800295 VirtualNetwork virtualNetwork1 =
296 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
297 VirtualNetwork virtualNetwork2 =
298 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400299 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
300 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
301
302 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
303 assertNotNull("The virtual host set should not be null", virtualHosts1);
304 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
305
306 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
307 assertNotNull("The virtual host set should not be null", virtualHosts2);
308 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
309
310 for (VirtualHost virtualHost : virtualHosts1) {
311 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
312 // attempt to remove the same virtual host again.
313 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
314 }
315 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
316 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
317
318 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800319 VirtualHost virtualHost =
320 manager.createVirtualHost(virtualNetwork1.id(),
321 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400322 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
323 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
324 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
325 }
326
327 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500328 * Tests add and remove of virtual links.
329 */
330 @Test
331 public void testAddRemoveVirtualLink() {
332 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800333 VirtualNetwork virtualNetwork1 =
334 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500335 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400336 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500337 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400338 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500339 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400340 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700341 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400342
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500343 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400344 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700345 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400346
Brian Stanke9a108972016-04-11 15:25:17 -0400347 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
348 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500349
350 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
351 assertNotNull("The virtual link set should not be null", virtualLinks);
352 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
353
354 for (VirtualLink virtualLink : virtualLinks) {
355 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
356 // attempt to remove the same virtual link again.
357 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
358 }
359 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
360 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500361
362 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400363 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500364 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
365 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
366 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500367 }
368
369 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400370 * Tests adding the same virtual link twice.
371 */
372 @Test(expected = IllegalStateException.class)
373 public void testAddSameVirtualLink() {
374 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800375 VirtualNetwork virtualNetwork1 =
376 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400377 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400378 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400379 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400380 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400381 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400382 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700383 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400384
Brian Stanke9a108972016-04-11 15:25:17 -0400385 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400386 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700387 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400388
Brian Stanke9a108972016-04-11 15:25:17 -0400389 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
390 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
391 }
392
393 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500394 * Tests add and remove of virtual ports.
395 */
396 @Test
397 public void testAddRemoveVirtualPort() {
398 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800399 VirtualNetwork virtualNetwork1 =
400 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke5df14472016-03-11 19:34:38 -0500401 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400402 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Yoonseon Han6c603892016-09-01 11:52:21 -0700403 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500404
yoonseon214963b2016-11-21 15:41:07 -0800405 manager.createVirtualPort(virtualNetwork1.id(),
406 virtualDevice.id(), PortNumber.portNumber(1), cp);
407 manager.createVirtualPort(virtualNetwork1.id(),
408 virtualDevice.id(), PortNumber.portNumber(2), cp);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500409
Brian Stanke5df14472016-03-11 19:34:38 -0500410 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500411 assertNotNull("The virtual port set should not be null", virtualPorts);
412 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
413
414 for (VirtualPort virtualPort : virtualPorts) {
415 manager.removeVirtualPort(virtualNetwork1.id(),
416 (DeviceId) virtualPort.element().id(), virtualPort.number());
417 // attempt to remove the same virtual port again.
418 manager.removeVirtualPort(virtualNetwork1.id(),
419 (DeviceId) virtualPort.element().id(), virtualPort.number());
420 }
Brian Stanke5df14472016-03-11 19:34:38 -0500421 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
422 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
423
424 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800425 VirtualPort virtualPort =
426 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700427 PortNumber.portNumber(1), cp);
yoonseon214963b2016-11-21 15:41:07 -0800428 manager.removeVirtualPort(virtualNetwork1.id(),
429 (DeviceId) virtualPort.element().id(), virtualPort.number());
Brian Stanke5df14472016-03-11 19:34:38 -0500430 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500431 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
432 }
433
434 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400435 * Tests the addOrUpdateIntent() method in the store with a null intent.
436 */
437 @Test(expected = NullPointerException.class)
438 public void testAddOrUpdateNullIntent() {
439 manager.store.addOrUpdateIntent(null, null);
440 }
441
442 /**
443 * Tests the removeIntent() method in the store with a null intent key.
444 */
445 @Test(expected = NullPointerException.class)
446 public void testRemoveNullIntentKey() {
447 manager.store.removeIntent(null);
448 }
449
450 /**
451 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
452 */
453 @Test
454 public void testAddOrUpdateIntent() {
455 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800456 VirtualNetwork virtualNetwork =
457 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke11f6d532016-07-05 16:17:59 -0400458 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
459 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
460
461 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
462 .networkId(virtualNetwork.id())
463 .key(Key.of("Test", APP_ID))
464 .appId(APP_ID)
465 .ingressPoint(cp1)
466 .egressPoint(cp2)
467 .build();
468
469 // Add the intent to the store.
470 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
yoonseon214963b2016-11-21 15:41:07 -0800471 assertEquals("The intent size should match.", 1,
472 manager.store.getIntents().size());
473 assertNotNull("The intent should not be null.",
474 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400475
476 // remove the intent from the store.
477 manager.store.removeIntent(virtualIntent.key());
yoonseon214963b2016-11-21 15:41:07 -0800478 assertTrue("The intents should be empty.",
479 manager.store.getIntents().isEmpty());
480 assertNull("The intent should be null.",
481 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400482 }
483
484 /**
485 * Tests the addTunnelId() method in the store with a null intent.
486 */
487 @Test(expected = NullPointerException.class)
488 public void testAddTunnelIdNullIntent() {
489 manager.store.addTunnelId(null, null);
490 }
491
492 /**
493 * Tests the removeTunnelId() method in the store with a null intent.
494 */
495 @Test(expected = NullPointerException.class)
496 public void testRemoveTunnelIdNullIntent() {
497 manager.store.removeTunnelId(null, null);
498 }
499
500 /**
501 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
502 */
503 @Test
504 public void testAddTunnelId() {
505 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
506 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
507 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
508 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
509
510 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
511 .networkId(virtualNetwork.id())
512 .key(Key.of("Test", APP_ID))
513 .appId(APP_ID)
514 .ingressPoint(cp1)
515 .egressPoint(cp2)
516 .build();
517
518 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
519 // Add the intent to tunnelID mapping to the store.
520 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800521 assertEquals("The tunnels size should match.", 1,
522 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400523
524 // Remove the intent to tunnelID mapping from the store.
525 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800526 assertTrue("The tunnels should be empty.",
527 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400528 }
529
Brian Stankefb61df42016-07-25 11:47:51 -0400530
531 /**
532 * Method to create the virtual network for further testing.
533 **/
534 private VirtualNetwork setupVirtualNetworkTopology() {
535 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800536 VirtualNetwork virtualNetwork =
537 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400538
539 VirtualDevice virtualDevice1 =
540 manager.createVirtualDevice(virtualNetwork.id(), DID1);
541 VirtualDevice virtualDevice2 =
542 manager.createVirtualDevice(virtualNetwork.id(), DID2);
543 VirtualDevice virtualDevice3 =
544 manager.createVirtualDevice(virtualNetwork.id(), DID3);
545 VirtualDevice virtualDevice4 =
546 manager.createVirtualDevice(virtualNetwork.id(), DID4);
547 VirtualDevice virtualDevice5 =
548 manager.createVirtualDevice(virtualNetwork.id(), DID5);
549
550 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
551 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700552 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400553
554 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
555 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700556 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400557
558 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
559 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700560 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400561
562 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
563 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700564 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400565
566 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
567 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700568 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400569
570 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
571 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700572 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400573
574 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
575 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700576 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400577
578 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
579 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700580 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400581
582 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
583 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700584 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400585
586 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
587 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
588 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
589 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
590 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
591 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
592 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
593 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
594 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
595 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
596 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
597 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
598
599 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800600 topologyProvider = new DefaultVirtualNetworkProvider();
601 try {
602 TestUtils.setField(topologyProvider, "topologyService", topologyService);
603 } catch (TestUtils.TestUtilsException e) {
604 e.printStackTrace();
605 }
606// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400607
608 return virtualNetwork;
609 }
610
611 /**
612 * Test the topologyChanged() method.
613 */
614 @Test
615 public void testTopologyChanged() {
616 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800617 VirtualNetworkProviderService providerService =
618 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400619
620 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800621 assertEquals("The cluster count did not match.", 2,
622 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400623
624 // Adding this link will join the two clusters together.
625 List<Event> reasons = new ArrayList<>();
626 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
627 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
628 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
629 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
630
631 Topology topology = topologyService.currentTopology();
632 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
633
634 // Validate that all links are still active.
635 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800636 assertTrue("The virtual link should be active.",
637 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400638 });
639
640 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
641 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
642 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
643
644 // Validate that all links are active again.
645 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800646 assertTrue("The virtual link should be active.",
647 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400648 });
649 }
650
Brian Stanke11f6d532016-07-05 16:17:59 -0400651 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500652 * Method to validate that the actual versus expected virtual network events were
653 * received correctly.
654 *
655 * @param types expected virtual network events.
656 */
657 private void validateEvents(Enum... types) {
658 TestTools.assertAfter(100, () -> {
659 int i = 0;
660 assertEquals("wrong events received", types.length, listener.events.size());
661 for (Event event : listener.events) {
662 assertEquals("incorrect event type", types[i], event.type());
663 i++;
664 }
665 listener.events.clear();
666 });
667 }
668
669 /**
670 * Test listener class to receive virtual network events.
671 */
672 private static class TestListener implements VirtualNetworkListener {
673
Brian Stanke7a81b532016-06-14 15:43:51 -0400674 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500675
676 @Override
677 public void event(VirtualNetworkEvent event) {
678 events.add(event);
679 }
680
681 }
682
Brian Stanke5df14472016-03-11 19:34:38 -0500683 /**
684 * Core service test class.
685 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500686 private class TestCoreService extends CoreServiceAdapter {
687
688 @Override
689 public IdGenerator getIdGenerator(String topic) {
690 return new IdGenerator() {
691 private AtomicLong counter = new AtomicLong(0);
692
693 @Override
694 public long getNewId() {
695 return counter.getAndIncrement();
696 }
697 };
698 }
699 }
700}