blob: dbb036b6190238bd8ed6869c744ea951ff10a823 [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;
yoonseonc6a69272017-01-12 18:22:20 -080025import org.onlab.osgi.TestServiceDirectory;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050026import org.onosproject.common.event.impl.TestEventDispatcher;
27import org.onosproject.core.CoreService;
28import org.onosproject.core.CoreServiceAdapter;
29import org.onosproject.core.IdGenerator;
30import org.onosproject.event.Event;
Brian Stanke11f6d532016-07-05 16:17:59 -040031import org.onosproject.incubator.net.tunnel.TunnelId;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050032import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
33import org.onosproject.incubator.net.virtual.NetworkId;
34import org.onosproject.incubator.net.virtual.TenantId;
35import org.onosproject.incubator.net.virtual.VirtualDevice;
Brian Stanke7a81b532016-06-14 15:43:51 -040036import org.onosproject.incubator.net.virtual.VirtualHost;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050037import org.onosproject.incubator.net.virtual.VirtualLink;
38import org.onosproject.incubator.net.virtual.VirtualNetwork;
39import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
Brian Stanke11f6d532016-07-05 16:17:59 -040040import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050041import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
yoonseon6b972c32016-12-06 16:45:03 -080042import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050043import org.onosproject.incubator.net.virtual.VirtualPort;
yoonseon214963b2016-11-21 15:41:07 -080044import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualNetworkProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050045import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
46import org.onosproject.net.ConnectPoint;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050047import org.onosproject.net.DeviceId;
Brian Stankefb61df42016-07-25 11:47:51 -040048import org.onosproject.net.Link;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050049import org.onosproject.net.NetTestTools;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050050import org.onosproject.net.PortNumber;
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
61import java.util.Collection;
62import java.util.List;
sangyun-han3c3e99e2017-02-08 15:30:53 +090063import java.util.ArrayList;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050064import java.util.Set;
sangyun-han3c3e99e2017-02-08 15:30:53 +090065import java.util.HashSet;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050066import java.util.concurrent.atomic.AtomicLong;
67
68import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040069import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050070
71/**
72 * Junit tests for VirtualNetworkManager.
73 */
sangyun-han3c3e99e2017-02-08 15:30:53 +090074public class VirtualNetworkManagerTest extends VirtualNetworkTestUtil {
Brian Stanke86914282016-05-25 15:36:50 -040075 private final String tenantIdValue1 = "TENANT_ID1";
76 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -050077
78 private VirtualNetworkManager manager;
yoonseon214963b2016-11-21 15:41:07 -080079 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050080 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
81 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -040082 private TestListener listener = new TestListener();
Brian Stanke11f6d532016-07-05 16:17:59 -040083 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -040084 private TopologyService topologyService;
Brian Stanke11f6d532016-07-05 16:17:59 -040085 private IdGenerator idGenerator = new MockIdGenerator();
Brian Stanke0e5c94e2016-03-08 11:20:04 -050086
Brian Stankefb61df42016-07-25 11:47:51 -040087 private ConnectPoint cp6;
88 private ConnectPoint cp7;
89
yoonseonc6a69272017-01-12 18:22:20 -080090 private TestServiceDirectory testDirectory;
91
Brian Stanke0e5c94e2016-03-08 11:20:04 -050092 @Before
93 public void setUp() throws Exception {
94 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Thomas Vachuska23235962017-02-03 11:44:15 -080095 Intent.unbindIdGenerator(idGenerator);
Brian Stanke11f6d532016-07-05 16:17:59 -040096 Intent.bindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050097
98 coreService = new TestCoreService();
yoonseonc6a69272017-01-12 18:22:20 -080099 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon214963b2016-11-21 15:41:07 -0800100 TestUtils.setField(virtualNetworkManagerStore, "storageService",
101 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500102 virtualNetworkManagerStore.activate();
103
104 manager = new VirtualNetworkManager();
105 manager.store = virtualNetworkManagerStore;
106 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400107 manager.intentService = intentService;
yoonseon322c9c32016-12-07 16:47:02 -0800108 manager.coreService = coreService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500109 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800110
111 testDirectory = new TestServiceDirectory();
112 TestUtils.setField(manager, "serviceDirectory", testDirectory);
113
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500114 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500115 }
116
117 @After
118 public void tearDown() {
119 virtualNetworkManagerStore.deactivate();
120 manager.removeListener(listener);
121 manager.deactivate();
122 NetTestTools.injectEventDispatcher(manager, null);
Brian Stanke11f6d532016-07-05 16:17:59 -0400123 Intent.unbindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500124 }
125
126 /**
127 * Tests registering a null tenant id.
128 */
129 @Test(expected = NullPointerException.class)
130 public void testRegisterNullTenantId() {
131 manager.registerTenantId(null);
132 }
133
134 /**
135 * Tests registering/unregistering a tenant id.
136 */
137 @Test
138 public void testRegisterUnregisterTenantId() {
139 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
140 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
141 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
142 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
143 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
144
145 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
146 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
147 tenantIdCollection = manager.getTenantIds();
148 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
149
150 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800151 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
152 VirtualNetworkEvent.Type.TENANT_REGISTERED,
153 VirtualNetworkEvent.Type.TENANT_REGISTERED,
154 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500155 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
156 }
157
158 /**
159 * Tests adding a null virtual network.
160 */
161 @Test(expected = NullPointerException.class)
162 public void testCreateNullVirtualNetwork() {
163 manager.createVirtualNetwork(null);
164 }
165
166 /**
167 * Tests add and remove of virtual networks.
168 */
169 @Test
170 public void testAddRemoveVirtualNetwork() {
171 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
172 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
173 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
174 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
175 assertNotNull("The virtual network set should not be null", virtualNetworks);
176 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
177
Brian Stanke5df14472016-03-11 19:34:38 -0500178 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500179 for (VirtualNetwork virtualNetwork : virtualNetworks) {
180 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500181 assertEquals("The expected virtual network size does not match",
182 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500183 // attempt to remove the same virtual network again.
184 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500185 assertEquals("The expected virtual network size does not match",
186 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500187 }
188 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
189 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
190
Brian Stanke5df14472016-03-11 19:34:38 -0500191 // Create/remove a virtual network.
192 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
193 manager.removeVirtualNetwork(virtualNetwork.id());
194
195 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
196 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
197
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500198 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800199 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
200 VirtualNetworkEvent.Type.NETWORK_ADDED,
201 VirtualNetworkEvent.Type.NETWORK_ADDED,
202 VirtualNetworkEvent.Type.NETWORK_REMOVED,
203 VirtualNetworkEvent.Type.NETWORK_REMOVED,
204 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500205 VirtualNetworkEvent.Type.NETWORK_REMOVED);
206 }
207
208 /**
209 * Tests adding a null virtual device.
210 */
211 @Test(expected = NullPointerException.class)
212 public void testCreateNullVirtualDevice() {
213 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
214 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
215
216 manager.createVirtualDevice(virtualNetwork.id(), null);
217 }
218
219 /**
220 * Tests adding a virtual device where no virtual network exists.
221 */
222 @Test(expected = IllegalStateException.class)
223 public void testCreateVirtualDeviceWithNoNetwork() {
224 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800225 VirtualNetwork virtualNetwork =
226 new DefaultVirtualNetwork(NetworkId.NONE,
227 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500228
Brian Stanke7a81b532016-06-14 15:43:51 -0400229 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500230 }
231
232 /**
233 * Tests add and remove of virtual devices.
234 */
235 @Test
236 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500237 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
238
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500239 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500240 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800241 VirtualNetwork virtualNetwork1 =
242 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500243 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800244 VirtualNetwork virtualNetwork2 =
245 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500246 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400247 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500248 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400249 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500250 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500251
252 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
253 assertNotNull("The virtual device set should not be null", virtualDevices1);
254 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
255
256 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
257 assertNotNull("The virtual device set should not be null", virtualDevices2);
258 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
259
260 for (VirtualDevice virtualDevice : virtualDevices1) {
261 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500262 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
263 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500264 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
265 }
266 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
267 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
268
Brian Stanke5df14472016-03-11 19:34:38 -0500269 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400270 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500271 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500272 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500273 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500274 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
275 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
276
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500277 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500278 validateEvents((Enum[]) expectedEventTypes.toArray(
279 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500280 }
281
282 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900283 * Tests getting a collection of physical device identifier corresponding to
284 * the specified virtual device.
285 */
286 @Test
287 public void testGetPhysicalDevices() {
288 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
289 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
290
291 VirtualNetwork virtualNetwork1 =
292 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
293 VirtualNetwork virtualNetwork2 =
294 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
295
296 // two virtual device in first virtual network
297 VirtualDevice vDevice1InVnet1 =
298 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
299 VirtualDevice vDevice2InVnet1 =
300 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
301 // Two virtual device in second virtual network
302 VirtualDevice vDevice1InVnet2 =
303 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
304 VirtualDevice vDevice2InVnet2 =
305 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
306
307 // Connection Point from each physical device
308 // Virtual network 1
309 ConnectPoint cp1InVnet1 =
310 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
311 ConnectPoint cp2InVnet1 =
312 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
313 ConnectPoint cp3InVnet1 =
314 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
315 ConnectPoint cp4InVnet1 =
316 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
317 // Virtual network 2
318 ConnectPoint cp1InVnet2 =
319 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
320 ConnectPoint cp2InVnet2 =
321 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
322 ConnectPoint cp3InVnet2 =
323 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
324 ConnectPoint cp4InVnet2 =
325 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
326
327 // Make simple BigSwitch by mapping two phyDevice to one vDevice
328 // First vDevice in first virtual network
329 manager.createVirtualPort(virtualNetwork1.id(),
330 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
331 manager.createVirtualPort(virtualNetwork1.id(),
332 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
333 // Second vDevice in first virtual network
334 manager.createVirtualPort(virtualNetwork1.id(),
335 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
336 manager.createVirtualPort(virtualNetwork1.id(),
337 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
338 // First vDevice in second virtual network
339 manager.createVirtualPort(virtualNetwork2.id(),
340 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
341 manager.createVirtualPort(virtualNetwork2.id(),
342 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
343 // Second vDevice in second virtual network
344 manager.createVirtualPort(virtualNetwork2.id(),
345 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
346 manager.createVirtualPort(virtualNetwork2.id(),
347 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
348
349
350 Set<DeviceId> physicalDeviceSet;
351 Set<DeviceId> testSet = new HashSet<>();
352 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1);
353 testSet.add(PHYDID1);
354 testSet.add(PHYDID2);
355 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
356 physicalDeviceSet.clear();
357 testSet.clear();
358
359 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1);
360 testSet.add(PHYDID3);
361 testSet.add(PHYDID4);
362 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
363 physicalDeviceSet.clear();
364 testSet.clear();
365
366 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2);
367 testSet.add(PHYDID1);
368 testSet.add(PHYDID2);
369 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
370 physicalDeviceSet.clear();
371 testSet.clear();
372
373 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2);
374 testSet.add(PHYDID3);
375 testSet.add(PHYDID4);
376 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
377 physicalDeviceSet.clear();
378 testSet.clear();
379 }
380
381 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400382 * Tests adding a null virtual host.
383 */
384 @Test(expected = NullPointerException.class)
385 public void testCreateNullVirtualHost() {
386 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800387 VirtualNetwork virtualNetwork =
388 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400389
390 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
391 }
392
393 /**
394 * Tests adding a virtual host where no virtual network exists.
395 */
396 @Test(expected = IllegalStateException.class)
397 public void testCreateVirtualHostWithNoNetwork() {
398 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800399 VirtualNetwork virtualNetwork =
400 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400401
402 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
403 }
404
405 /**
406 * Tests add and remove of virtual hosts.
407 */
408 @Test
409 public void testAddRemoveVirtualHost() {
410 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800411 VirtualNetwork virtualNetwork1 =
412 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
413 VirtualNetwork virtualNetwork2 =
414 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400415 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
416 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
417
418 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
419 assertNotNull("The virtual host set should not be null", virtualHosts1);
420 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
421
422 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
423 assertNotNull("The virtual host set should not be null", virtualHosts2);
424 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
425
426 for (VirtualHost virtualHost : virtualHosts1) {
427 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
428 // attempt to remove the same virtual host again.
429 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
430 }
431 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
432 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
433
434 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800435 VirtualHost virtualHost =
436 manager.createVirtualHost(virtualNetwork1.id(),
437 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400438 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
439 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
440 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
441 }
442
443 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500444 * Tests add and remove of virtual links.
445 */
446 @Test
447 public void testAddRemoveVirtualLink() {
448 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800449 VirtualNetwork virtualNetwork1 =
450 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500451 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400452 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500453 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400454 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500455 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400456 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700457 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400458
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500459 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400460 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700461 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400462
Brian Stanke9a108972016-04-11 15:25:17 -0400463 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
464 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500465
466 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
467 assertNotNull("The virtual link set should not be null", virtualLinks);
468 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
469
470 for (VirtualLink virtualLink : virtualLinks) {
471 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
472 // attempt to remove the same virtual link again.
473 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
474 }
475 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
476 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500477
478 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400479 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500480 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
481 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
482 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500483 }
484
485 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400486 * Tests adding the same virtual link twice.
487 */
488 @Test(expected = IllegalStateException.class)
489 public void testAddSameVirtualLink() {
490 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800491 VirtualNetwork virtualNetwork1 =
492 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400493 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400494 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400495 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400496 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400497 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400498 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700499 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400500
Brian Stanke9a108972016-04-11 15:25:17 -0400501 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400502 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700503 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400504
Brian Stanke9a108972016-04-11 15:25:17 -0400505 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
506 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
507 }
508
509 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500510 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500511 */
512 @Test
513 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500514 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
515
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500516 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500517 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800518 VirtualNetwork virtualNetwork1 =
519 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500520 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500521 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400522 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500523 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700524 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500525
yoonseon214963b2016-11-21 15:41:07 -0800526 manager.createVirtualPort(virtualNetwork1.id(),
527 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500528 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800529 manager.createVirtualPort(virtualNetwork1.id(),
530 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500531 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500532
Brian Stanke5df14472016-03-11 19:34:38 -0500533 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500534 assertNotNull("The virtual port set should not be null", virtualPorts);
535 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
536
537 for (VirtualPort virtualPort : virtualPorts) {
538 manager.removeVirtualPort(virtualNetwork1.id(),
539 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500540 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500541 // attempt to remove the same virtual port again.
542 manager.removeVirtualPort(virtualNetwork1.id(),
543 (DeviceId) virtualPort.element().id(), virtualPort.number());
544 }
Brian Stanke5df14472016-03-11 19:34:38 -0500545 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
546 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
547
548 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800549 VirtualPort virtualPort =
550 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700551 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500552 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
553
554 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
555 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
556 PortNumber.portNumber(1), newCp);
557 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
558
yoonseon214963b2016-11-21 15:41:07 -0800559 manager.removeVirtualPort(virtualNetwork1.id(),
560 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500561 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500562 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500563 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500564
565 // Validate that the events were all received in the correct order.
566 validateEvents((Enum[]) expectedEventTypes.toArray(
567 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500568 }
569
570 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400571 * Tests the addOrUpdateIntent() method in the store with a null intent.
572 */
573 @Test(expected = NullPointerException.class)
574 public void testAddOrUpdateNullIntent() {
575 manager.store.addOrUpdateIntent(null, null);
576 }
577
578 /**
579 * Tests the removeIntent() method in the store with a null intent key.
580 */
581 @Test(expected = NullPointerException.class)
582 public void testRemoveNullIntentKey() {
583 manager.store.removeIntent(null);
584 }
585
586 /**
587 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
588 */
589 @Test
590 public void testAddOrUpdateIntent() {
591 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800592 VirtualNetwork virtualNetwork =
593 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke11f6d532016-07-05 16:17:59 -0400594 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
595 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
596
597 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
598 .networkId(virtualNetwork.id())
599 .key(Key.of("Test", APP_ID))
600 .appId(APP_ID)
601 .ingressPoint(cp1)
602 .egressPoint(cp2)
603 .build();
604
605 // Add the intent to the store.
606 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
yoonseon214963b2016-11-21 15:41:07 -0800607 assertEquals("The intent size should match.", 1,
608 manager.store.getIntents().size());
609 assertNotNull("The intent should not be null.",
610 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400611
612 // remove the intent from the store.
613 manager.store.removeIntent(virtualIntent.key());
yoonseon214963b2016-11-21 15:41:07 -0800614 assertTrue("The intents should be empty.",
615 manager.store.getIntents().isEmpty());
616 assertNull("The intent should be null.",
617 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400618 }
619
620 /**
621 * Tests the addTunnelId() method in the store with a null intent.
622 */
623 @Test(expected = NullPointerException.class)
624 public void testAddTunnelIdNullIntent() {
625 manager.store.addTunnelId(null, null);
626 }
627
628 /**
629 * Tests the removeTunnelId() method in the store with a null intent.
630 */
631 @Test(expected = NullPointerException.class)
632 public void testRemoveTunnelIdNullIntent() {
633 manager.store.removeTunnelId(null, null);
634 }
635
636 /**
637 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
638 */
639 @Test
640 public void testAddTunnelId() {
641 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
642 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
643 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
644 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
645
646 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
647 .networkId(virtualNetwork.id())
648 .key(Key.of("Test", APP_ID))
649 .appId(APP_ID)
650 .ingressPoint(cp1)
651 .egressPoint(cp2)
652 .build();
653
654 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
655 // Add the intent to tunnelID mapping to the store.
656 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800657 assertEquals("The tunnels size should match.", 1,
658 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400659
660 // Remove the intent to tunnelID mapping from the store.
661 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800662 assertTrue("The tunnels should be empty.",
663 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400664 }
665
Brian Stankefb61df42016-07-25 11:47:51 -0400666
667 /**
668 * Method to create the virtual network for further testing.
669 **/
670 private VirtualNetwork setupVirtualNetworkTopology() {
671 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800672 VirtualNetwork virtualNetwork =
673 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400674
675 VirtualDevice virtualDevice1 =
676 manager.createVirtualDevice(virtualNetwork.id(), DID1);
677 VirtualDevice virtualDevice2 =
678 manager.createVirtualDevice(virtualNetwork.id(), DID2);
679 VirtualDevice virtualDevice3 =
680 manager.createVirtualDevice(virtualNetwork.id(), DID3);
681 VirtualDevice virtualDevice4 =
682 manager.createVirtualDevice(virtualNetwork.id(), DID4);
683 VirtualDevice virtualDevice5 =
684 manager.createVirtualDevice(virtualNetwork.id(), DID5);
685
686 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
687 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700688 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400689
690 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
691 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700692 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400693
694 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
695 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700696 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400697
698 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
699 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700700 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400701
702 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
703 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700704 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400705
706 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
707 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700708 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400709
710 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
711 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700712 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400713
714 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
715 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700716 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400717
718 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
719 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700720 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400721
722 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
723 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
724 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
725 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
726 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
727 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
728 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
729 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
730 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
731 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
732 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
733 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
734
735 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800736 topologyProvider = new DefaultVirtualNetworkProvider();
737 try {
738 TestUtils.setField(topologyProvider, "topologyService", topologyService);
739 } catch (TestUtils.TestUtilsException e) {
740 e.printStackTrace();
741 }
742// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400743
744 return virtualNetwork;
745 }
746
747 /**
748 * Test the topologyChanged() method.
749 */
750 @Test
751 public void testTopologyChanged() {
752 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800753 VirtualNetworkProviderService providerService =
754 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400755
756 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800757 assertEquals("The cluster count did not match.", 2,
758 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400759
760 // Adding this link will join the two clusters together.
761 List<Event> reasons = new ArrayList<>();
762 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
763 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
764 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
765 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
766
767 Topology topology = topologyService.currentTopology();
768 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
769
770 // Validate that all links are still active.
771 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800772 assertTrue("The virtual link should be active.",
773 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400774 });
775
776 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
777 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
778 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
779
780 // Validate that all links are active again.
781 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800782 assertTrue("The virtual link should be active.",
783 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400784 });
785 }
786
Brian Stanke11f6d532016-07-05 16:17:59 -0400787 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500788 * Method to validate that the actual versus expected virtual network events were
789 * received correctly.
790 *
791 * @param types expected virtual network events.
792 */
793 private void validateEvents(Enum... types) {
794 TestTools.assertAfter(100, () -> {
795 int i = 0;
796 assertEquals("wrong events received", types.length, listener.events.size());
797 for (Event event : listener.events) {
798 assertEquals("incorrect event type", types[i], event.type());
799 i++;
800 }
801 listener.events.clear();
802 });
803 }
804
805 /**
806 * Test listener class to receive virtual network events.
807 */
808 private static class TestListener implements VirtualNetworkListener {
809
Brian Stanke7a81b532016-06-14 15:43:51 -0400810 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500811
812 @Override
813 public void event(VirtualNetworkEvent event) {
814 events.add(event);
815 }
816
817 }
818
Brian Stanke5df14472016-03-11 19:34:38 -0500819 /**
820 * Core service test class.
821 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500822 private class TestCoreService extends CoreServiceAdapter {
823
824 @Override
825 public IdGenerator getIdGenerator(String topic) {
826 return new IdGenerator() {
827 private AtomicLong counter = new AtomicLong(0);
828
829 @Override
830 public long getNewId() {
831 return counter.getAndIncrement();
832 }
833 };
834 }
835 }
836}