blob: 1f1624e1c6371b3a6bc922257d893b6b7bc68742 [file] [log] [blame]
Brian Stanke0e5c94e2016-03-08 11:20:04 -05001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
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;
Claudine Chiu9a18f492017-02-27 15:57:06 -050026import org.onosproject.cluster.ClusterService;
27import org.onosproject.cluster.ClusterServiceAdapter;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050028import org.onosproject.common.event.impl.TestEventDispatcher;
29import org.onosproject.core.CoreService;
30import org.onosproject.core.CoreServiceAdapter;
31import org.onosproject.core.IdGenerator;
32import org.onosproject.event.Event;
Claudine Chiu9a18f492017-02-27 15:57:06 -050033import org.onosproject.event.EventDeliveryService;
Brian Stanke11f6d532016-07-05 16:17:59 -040034import org.onosproject.incubator.net.tunnel.TunnelId;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050035import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
36import org.onosproject.incubator.net.virtual.NetworkId;
37import org.onosproject.incubator.net.virtual.TenantId;
38import org.onosproject.incubator.net.virtual.VirtualDevice;
Brian Stanke7a81b532016-06-14 15:43:51 -040039import org.onosproject.incubator.net.virtual.VirtualHost;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050040import org.onosproject.incubator.net.virtual.VirtualLink;
41import org.onosproject.incubator.net.virtual.VirtualNetwork;
42import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
yoonseon86bebed2017-02-03 15:23:57 -080043import org.onosproject.incubator.net.virtual.VirtualNetworkFlowObjectiveStore;
Claudine Chiu9a18f492017-02-27 15:57:06 -050044import org.onosproject.incubator.net.virtual.VirtualNetworkFlowRuleStore;
45import org.onosproject.incubator.net.virtual.VirtualNetworkGroupStore;
Brian Stanke11f6d532016-07-05 16:17:59 -040046import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
Yoonseon Han096cea02017-05-15 15:10:41 -070047import org.onosproject.incubator.net.virtual.VirtualNetworkIntentStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050048import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
Claudine Chiu9a18f492017-02-27 15:57:06 -050049import org.onosproject.incubator.net.virtual.VirtualNetworkPacketStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050050import org.onosproject.incubator.net.virtual.VirtualPort;
Claudine Chiu9a18f492017-02-27 15:57:06 -050051import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualFlowRuleProvider;
52import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualGroupProvider;
yoonseon214963b2016-11-21 15:41:07 -080053import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualNetworkProvider;
Claudine Chiu9a18f492017-02-27 15:57:06 -050054import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualPacketProvider;
55import org.onosproject.incubator.net.virtual.impl.provider.VirtualProviderManager;
56import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderService;
57import org.onosproject.incubator.net.virtual.provider.VirtualProviderRegistryService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050058import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
yoonseon86bebed2017-02-03 15:23:57 -080059import org.onosproject.incubator.store.virtual.impl.SimpleVirtualFlowObjectiveStore;
Claudine Chiu9a18f492017-02-27 15:57:06 -050060import org.onosproject.incubator.store.virtual.impl.SimpleVirtualFlowRuleStore;
61import org.onosproject.incubator.store.virtual.impl.SimpleVirtualGroupStore;
Yoonseon Han096cea02017-05-15 15:10:41 -070062import org.onosproject.incubator.store.virtual.impl.SimpleVirtualIntentStore;
Claudine Chiu9a18f492017-02-27 15:57:06 -050063import org.onosproject.incubator.store.virtual.impl.SimpleVirtualPacketStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050064import org.onosproject.net.ConnectPoint;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050065import org.onosproject.net.DeviceId;
Brian Stankefb61df42016-07-25 11:47:51 -040066import org.onosproject.net.Link;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050067import org.onosproject.net.NetTestTools;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050068import org.onosproject.net.PortNumber;
Claudine Chiu9a18f492017-02-27 15:57:06 -050069import org.onosproject.net.device.DeviceService;
70import org.onosproject.net.flow.FlowRuleService;
Claudine Chiu1f036b82017-03-09 16:45:56 -050071import org.onosproject.net.flowobjective.FlowObjectiveService;
Claudine Chiu9a18f492017-02-27 15:57:06 -050072import org.onosproject.net.group.GroupService;
73import org.onosproject.net.host.HostService;
Claudine Chiu9a18f492017-02-27 15:57:06 -050074import org.onosproject.net.intent.IntentService;
Brian Stanke11f6d532016-07-05 16:17:59 -040075import org.onosproject.net.intent.Key;
76import org.onosproject.net.intent.MockIdGenerator;
Claudine Chiu9a18f492017-02-27 15:57:06 -050077import org.onosproject.net.link.LinkService;
78import org.onosproject.net.packet.PacketService;
79import org.onosproject.net.topology.PathService;
Brian Stankefb61df42016-07-25 11:47:51 -040080import org.onosproject.net.topology.Topology;
81import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050082import org.onosproject.store.service.TestStorageService;
83
sangyun-han3c3e99e2017-02-08 15:30:53 +090084import java.util.ArrayList;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070085import java.util.Collection;
sangyun-han3c3e99e2017-02-08 15:30:53 +090086import java.util.HashSet;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070087import java.util.List;
88import java.util.Set;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050089import java.util.concurrent.atomic.AtomicLong;
90
91import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040092import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050093
94/**
95 * Junit tests for VirtualNetworkManager.
96 */
sangyun-han3c3e99e2017-02-08 15:30:53 +090097public class VirtualNetworkManagerTest extends VirtualNetworkTestUtil {
Brian Stanke86914282016-05-25 15:36:50 -040098 private final String tenantIdValue1 = "TENANT_ID1";
99 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500100
101 private VirtualNetworkManager manager;
yoonseon214963b2016-11-21 15:41:07 -0800102 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500103 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
104 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -0400105 private TestListener listener = new TestListener();
Brian Stankefb61df42016-07-25 11:47:51 -0400106 private TopologyService topologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500107
Brian Stankefb61df42016-07-25 11:47:51 -0400108 private ConnectPoint cp6;
109 private ConnectPoint cp7;
110
yoonseonc6a69272017-01-12 18:22:20 -0800111 private TestServiceDirectory testDirectory;
112
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500113 @Before
114 public void setUp() throws Exception {
115 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700116 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500117
118 coreService = new TestCoreService();
yoonseonc6a69272017-01-12 18:22:20 -0800119 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon214963b2016-11-21 15:41:07 -0800120 TestUtils.setField(virtualNetworkManagerStore, "storageService",
121 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500122 virtualNetworkManagerStore.activate();
123
124 manager = new VirtualNetworkManager();
125 manager.store = virtualNetworkManagerStore;
126 manager.addListener(listener);
yoonseon322c9c32016-12-07 16:47:02 -0800127 manager.coreService = coreService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500128 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800129
130 testDirectory = new TestServiceDirectory();
131 TestUtils.setField(manager, "serviceDirectory", testDirectory);
132
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500133 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500134 }
135
136 @After
137 public void tearDown() {
138 virtualNetworkManagerStore.deactivate();
139 manager.removeListener(listener);
140 manager.deactivate();
141 NetTestTools.injectEventDispatcher(manager, null);
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700142 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500143 }
144
145 /**
146 * Tests registering a null tenant id.
147 */
148 @Test(expected = NullPointerException.class)
149 public void testRegisterNullTenantId() {
150 manager.registerTenantId(null);
151 }
152
153 /**
154 * Tests registering/unregistering a tenant id.
155 */
156 @Test
157 public void testRegisterUnregisterTenantId() {
158 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
159 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
160 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
161 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
162 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
163
164 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
165 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
166 tenantIdCollection = manager.getTenantIds();
167 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
168
169 // Validate that the events were all received in the correct order.
Yuta HIGUCHI86ac40b2017-11-16 12:25:39 -0800170 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
yoonseon214963b2016-11-21 15:41:07 -0800171 VirtualNetworkEvent.Type.TENANT_REGISTERED,
172 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500173 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
174 }
175
176 /**
177 * Tests adding a null virtual network.
178 */
179 @Test(expected = NullPointerException.class)
180 public void testCreateNullVirtualNetwork() {
181 manager.createVirtualNetwork(null);
182 }
183
184 /**
Claudine Chiu70e2db82017-05-04 09:53:11 -0400185 * Tests removal of a virtual network twice.
186 */
187 @Test(expected = IllegalStateException.class)
188 public void testRemoveVnetTwice() {
189 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
190 VirtualNetwork virtualNetwork =
191 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
192 manager.removeVirtualNetwork(virtualNetwork.id());
193 manager.removeVirtualNetwork(virtualNetwork.id());
194 }
195
196 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500197 * Tests add and remove of virtual networks.
198 */
199 @Test
200 public void testAddRemoveVirtualNetwork() {
201 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
202 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
203 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
204 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
205 assertNotNull("The virtual network set should not be null", virtualNetworks);
206 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
207
Brian Stanke5df14472016-03-11 19:34:38 -0500208 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500209 for (VirtualNetwork virtualNetwork : virtualNetworks) {
210 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500211 assertEquals("The expected virtual network size does not match",
212 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500213 }
214 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
215 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
216
Brian Stanke5df14472016-03-11 19:34:38 -0500217 // Create/remove a virtual network.
218 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
219 manager.removeVirtualNetwork(virtualNetwork.id());
220
221 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
222 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
223
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500224 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800225 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
226 VirtualNetworkEvent.Type.NETWORK_ADDED,
227 VirtualNetworkEvent.Type.NETWORK_ADDED,
228 VirtualNetworkEvent.Type.NETWORK_REMOVED,
229 VirtualNetworkEvent.Type.NETWORK_REMOVED,
230 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500231 VirtualNetworkEvent.Type.NETWORK_REMOVED);
232 }
233
234 /**
235 * Tests adding a null virtual device.
236 */
237 @Test(expected = NullPointerException.class)
238 public void testCreateNullVirtualDevice() {
239 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
240 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
241
242 manager.createVirtualDevice(virtualNetwork.id(), null);
243 }
244
245 /**
246 * Tests adding a virtual device where no virtual network exists.
247 */
248 @Test(expected = IllegalStateException.class)
249 public void testCreateVirtualDeviceWithNoNetwork() {
250 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800251 VirtualNetwork virtualNetwork =
252 new DefaultVirtualNetwork(NetworkId.NONE,
253 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500254
Brian Stanke7a81b532016-06-14 15:43:51 -0400255 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500256 }
257
258 /**
259 * Tests add and remove of virtual devices.
260 */
261 @Test
262 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500263 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
264
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500265 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500266 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800267 VirtualNetwork virtualNetwork1 =
268 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500269 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800270 VirtualNetwork virtualNetwork2 =
271 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500272 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400273 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500274 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400275 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500276 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500277
278 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
279 assertNotNull("The virtual device set should not be null", virtualDevices1);
280 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
281
282 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
283 assertNotNull("The virtual device set should not be null", virtualDevices2);
284 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
285
286 for (VirtualDevice virtualDevice : virtualDevices1) {
287 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500288 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
289 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500290 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
291 }
292 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
293 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
294
Brian Stanke5df14472016-03-11 19:34:38 -0500295 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400296 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500297 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500298 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500299 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500300 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
301 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
302
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500303 // Validate that the events were all received in the correct order.
Yuta HIGUCHI86ac40b2017-11-16 12:25:39 -0800304 validateEvents(expectedEventTypes.toArray(
Claudine Chiu945828d2016-11-21 12:47:07 -0500305 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500306 }
307
308 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900309 * Tests getting a collection of physical device identifier corresponding to
310 * the specified virtual device.
311 */
312 @Test
313 public void testGetPhysicalDevices() {
314 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
315 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
316
317 VirtualNetwork virtualNetwork1 =
318 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
319 VirtualNetwork virtualNetwork2 =
320 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
321
322 // two virtual device in first virtual network
323 VirtualDevice vDevice1InVnet1 =
324 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
325 VirtualDevice vDevice2InVnet1 =
326 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
327 // Two virtual device in second virtual network
328 VirtualDevice vDevice1InVnet2 =
329 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
330 VirtualDevice vDevice2InVnet2 =
331 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
332
333 // Connection Point from each physical device
334 // Virtual network 1
335 ConnectPoint cp1InVnet1 =
336 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
337 ConnectPoint cp2InVnet1 =
338 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
339 ConnectPoint cp3InVnet1 =
340 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
341 ConnectPoint cp4InVnet1 =
342 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
343 // Virtual network 2
344 ConnectPoint cp1InVnet2 =
345 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
346 ConnectPoint cp2InVnet2 =
347 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
348 ConnectPoint cp3InVnet2 =
349 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
350 ConnectPoint cp4InVnet2 =
351 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
352
353 // Make simple BigSwitch by mapping two phyDevice to one vDevice
354 // First vDevice in first virtual network
355 manager.createVirtualPort(virtualNetwork1.id(),
356 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
357 manager.createVirtualPort(virtualNetwork1.id(),
358 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
359 // Second vDevice in first virtual network
360 manager.createVirtualPort(virtualNetwork1.id(),
361 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
362 manager.createVirtualPort(virtualNetwork1.id(),
363 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
364 // First vDevice in second virtual network
365 manager.createVirtualPort(virtualNetwork2.id(),
366 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
367 manager.createVirtualPort(virtualNetwork2.id(),
368 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
369 // Second vDevice in second virtual network
370 manager.createVirtualPort(virtualNetwork2.id(),
371 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
372 manager.createVirtualPort(virtualNetwork2.id(),
373 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
374
375
376 Set<DeviceId> physicalDeviceSet;
377 Set<DeviceId> testSet = new HashSet<>();
Harold Huang3fcf7432017-05-16 16:21:08 +0800378 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900379 testSet.add(PHYDID1);
380 testSet.add(PHYDID2);
381 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900382 testSet.clear();
383
Harold Huang3fcf7432017-05-16 16:21:08 +0800384 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900385 testSet.add(PHYDID3);
386 testSet.add(PHYDID4);
387 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900388 testSet.clear();
389
Harold Huang3fcf7432017-05-16 16:21:08 +0800390 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900391 testSet.add(PHYDID1);
392 testSet.add(PHYDID2);
393 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900394 testSet.clear();
395
Harold Huang3fcf7432017-05-16 16:21:08 +0800396 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900397 testSet.add(PHYDID3);
398 testSet.add(PHYDID4);
399 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900400 testSet.clear();
401 }
402
403 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400404 * Tests adding a null virtual host.
405 */
406 @Test(expected = NullPointerException.class)
407 public void testCreateNullVirtualHost() {
408 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800409 VirtualNetwork virtualNetwork =
410 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400411
412 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
413 }
414
415 /**
416 * Tests adding a virtual host where no virtual network exists.
417 */
418 @Test(expected = IllegalStateException.class)
419 public void testCreateVirtualHostWithNoNetwork() {
420 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800421 VirtualNetwork virtualNetwork =
422 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400423
424 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
425 }
426
427 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800428 * Tests adding a virtual host where no virtual port exists.
429 */
430 @Test(expected = IllegalStateException.class)
431 public void testCreateVirtualHostWithNoVirtualPort() {
432 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
433 VirtualNetwork virtualNetwork1 =
434 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
435 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
436 }
437
438 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400439 * Tests add and remove of virtual hosts.
440 */
441 @Test
442 public void testAddRemoveVirtualHost() {
443 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800444 VirtualNetwork virtualNetwork1 =
445 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
446 VirtualNetwork virtualNetwork2 =
447 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800448
449 VirtualDevice virtualDevice1 =
450 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
451 VirtualDevice virtualDevice2 =
452 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
453
454 ConnectPoint hostCp1 = new ConnectPoint(DID1, P1);
455 ConnectPoint hostCp2 = new ConnectPoint(DID2, P2);
456 manager.createVirtualPort(virtualNetwork1.id(), hostCp1.deviceId(), hostCp1.port(),
457 new ConnectPoint(virtualDevice1.id(), hostCp1.port()));
458 manager.createVirtualPort(virtualNetwork2.id(), hostCp2.deviceId(), hostCp2.port(),
459 new ConnectPoint(virtualDevice2.id(), hostCp2.port()));
460
Brian Stanke7a81b532016-06-14 15:43:51 -0400461 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
462 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
463
464 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
465 assertNotNull("The virtual host set should not be null", virtualHosts1);
466 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
467
468 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
469 assertNotNull("The virtual host set should not be null", virtualHosts2);
470 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
471
472 for (VirtualHost virtualHost : virtualHosts1) {
473 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
474 // attempt to remove the same virtual host again.
475 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
476 }
477 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
478 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
479
480 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800481 VirtualHost virtualHost =
482 manager.createVirtualHost(virtualNetwork1.id(),
483 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400484 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
485 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
486 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
487 }
488
489 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500490 * Tests add and remove of virtual links.
491 */
492 @Test
493 public void testAddRemoveVirtualLink() {
494 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800495 VirtualNetwork virtualNetwork1 =
496 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500497 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400498 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500499 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400500 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500501 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400502 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700503 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400504
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500505 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400506 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700507 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400508
Brian Stanke9a108972016-04-11 15:25:17 -0400509 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
510 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500511
512 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
513 assertNotNull("The virtual link set should not be null", virtualLinks);
514 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
515
516 for (VirtualLink virtualLink : virtualLinks) {
517 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
518 // attempt to remove the same virtual link again.
519 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
520 }
521 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
522 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500523
524 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400525 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500526 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
527 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
528 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500529 }
530
531 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400532 * Tests adding the same virtual link twice.
533 */
534 @Test(expected = IllegalStateException.class)
535 public void testAddSameVirtualLink() {
536 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800537 VirtualNetwork virtualNetwork1 =
538 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400539 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400540 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400541 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400542 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400543 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400544 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700545 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400546
Brian Stanke9a108972016-04-11 15:25:17 -0400547 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400548 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700549 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400550
Brian Stanke9a108972016-04-11 15:25:17 -0400551 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
552 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
553 }
554
Claudine Chiu579969d2017-10-06 14:32:18 -0400555 private VirtualPort getPort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) {
556 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(networkId, deviceId);
557 return virtualPorts.stream().filter(virtualPort -> virtualPort.number().equals(portNumber))
558 .findFirst().orElse(null);
559 }
560
Brian Stanke9a108972016-04-11 15:25:17 -0400561 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500562 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500563 */
564 @Test
565 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500566 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
567
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500568 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500569 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800570 VirtualNetwork virtualNetwork1 =
571 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500572 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500573 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400574 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500575 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700576 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500577
yoonseon214963b2016-11-21 15:41:07 -0800578 manager.createVirtualPort(virtualNetwork1.id(),
579 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500580 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800581 manager.createVirtualPort(virtualNetwork1.id(),
582 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500583 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500584
Brian Stanke5df14472016-03-11 19:34:38 -0500585 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500586 assertNotNull("The virtual port set should not be null", virtualPorts);
587 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
Claudine Chiu579969d2017-10-06 14:32:18 -0400588 virtualPorts.forEach(vp -> assertFalse("Initial virtual port state should be disabled", vp.isEnabled()));
589
590 // verify change state of virtual port (disabled -> enabled)
591 manager.updatePortState(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), true);
592 VirtualPort changedPort = getPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1));
593 assertNotNull("The changed virtual port should not be null", changedPort);
594 assertEquals("Virtual port state should be enabled", true, changedPort.isEnabled());
595 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
596
597 // verify change state of virtual port (disabled -> disabled)
598 manager.updatePortState(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), false);
599 changedPort = getPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2));
600 assertNotNull("The changed virtual port should not be null", changedPort);
601 assertEquals("Virtual port state should be disabled", false, changedPort.isEnabled());
602 // no VIRTUAL_PORT_UPDATED event is expected - the requested state (disabled) is same as previous state.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500603
604 for (VirtualPort virtualPort : virtualPorts) {
605 manager.removeVirtualPort(virtualNetwork1.id(),
606 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500607 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500608 // attempt to remove the same virtual port again.
609 manager.removeVirtualPort(virtualNetwork1.id(),
610 (DeviceId) virtualPort.element().id(), virtualPort.number());
611 }
Brian Stanke5df14472016-03-11 19:34:38 -0500612 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
613 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
614
615 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800616 VirtualPort virtualPort =
617 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700618 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500619 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
620
621 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
622 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
623 PortNumber.portNumber(1), newCp);
624 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
625
yoonseon214963b2016-11-21 15:41:07 -0800626 manager.removeVirtualPort(virtualNetwork1.id(),
627 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500628 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500629 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500630 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500631
632 // Validate that the events were all received in the correct order.
Yuta HIGUCHI86ac40b2017-11-16 12:25:39 -0800633 validateEvents(expectedEventTypes.toArray(
Claudine Chiu7f872a72016-12-16 13:51:39 -0500634 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500635 }
636
637 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800638 * Tests when a virtual element is removed, all the other elements depending on it are also removed.
639 */
640 @Test
641 public void testRemoveAllElements() {
642 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
643 VirtualNetwork virtualNetwork1 =
644 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
645 VirtualDevice virtualDevice1 =
646 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
647 VirtualDevice virtualDevice2 =
648 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
649 ConnectPoint src = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
650 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
651 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
652
653 ConnectPoint dst = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(2));
654 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
655 new ConnectPoint(PHYDID2, PortNumber.portNumber(2)));
656
657 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
658 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
659
660 ConnectPoint hostCp = new ConnectPoint(DID1, P1);
661 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
662 new ConnectPoint(PHYDID1, P1));
663 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
664
665 //When a virtual port is removed, all virtual links connected to it should also be removed.
666 manager.removeVirtualPort(virtualNetwork1.id(), DID1, PortNumber.portNumber(1));
667 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
668 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
669
670 //When a virtual port is removed, all virtual hosts located to it should also be removed.
671 manager.removeVirtualPort(virtualNetwork1.id(), DID1, P1);
672 Set<VirtualHost> virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
673 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
674
675 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
676 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
677 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
678 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
679 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
680 new ConnectPoint(PHYDID1, P1));
681 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
682
683 //When a virtual device is removed, all virtual ports, hosts and links depended on it should also be removed.
684 manager.removeVirtualDevice(virtualNetwork1.id(), DID1);
685 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), DID1);
686 assertTrue("The virtual port set of DID1 should be empty", virtualPorts.isEmpty());
687 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
688 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
689 virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
690 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
691
692 //When a tenantId is removed, all the virtual networks belonging to it should also be removed.
693 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
694 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
695 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
696 assertNotNull("The virtual network set should not be null", virtualNetworks);
697 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
698 }
699
Brian Stanke11f6d532016-07-05 16:17:59 -0400700 /**
701 * Tests the addTunnelId() method in the store with a null intent.
702 */
703 @Test(expected = NullPointerException.class)
704 public void testAddTunnelIdNullIntent() {
705 manager.store.addTunnelId(null, null);
706 }
707
708 /**
709 * Tests the removeTunnelId() method in the store with a null intent.
710 */
711 @Test(expected = NullPointerException.class)
712 public void testRemoveTunnelIdNullIntent() {
713 manager.store.removeTunnelId(null, null);
714 }
715
716 /**
717 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
718 */
719 @Test
720 public void testAddTunnelId() {
721 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
722 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
723 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
724 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
725
726 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
727 .networkId(virtualNetwork.id())
728 .key(Key.of("Test", APP_ID))
729 .appId(APP_ID)
730 .ingressPoint(cp1)
731 .egressPoint(cp2)
732 .build();
733
734 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
735 // Add the intent to tunnelID mapping to the store.
736 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800737 assertEquals("The tunnels size should match.", 1,
738 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400739
740 // Remove the intent to tunnelID mapping from the store.
741 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800742 assertTrue("The tunnels should be empty.",
743 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400744 }
745
Brian Stankefb61df42016-07-25 11:47:51 -0400746
747 /**
748 * Method to create the virtual network for further testing.
749 **/
750 private VirtualNetwork setupVirtualNetworkTopology() {
751 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800752 VirtualNetwork virtualNetwork =
753 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400754
755 VirtualDevice virtualDevice1 =
756 manager.createVirtualDevice(virtualNetwork.id(), DID1);
757 VirtualDevice virtualDevice2 =
758 manager.createVirtualDevice(virtualNetwork.id(), DID2);
759 VirtualDevice virtualDevice3 =
760 manager.createVirtualDevice(virtualNetwork.id(), DID3);
761 VirtualDevice virtualDevice4 =
762 manager.createVirtualDevice(virtualNetwork.id(), DID4);
763 VirtualDevice virtualDevice5 =
764 manager.createVirtualDevice(virtualNetwork.id(), DID5);
765
766 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
767 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700768 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400769
770 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
771 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700772 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400773
774 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
775 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700776 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400777
778 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
779 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700780 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400781
782 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
783 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700784 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400785
786 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
787 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700788 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400789
790 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
791 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700792 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400793
794 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
795 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700796 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400797
798 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
799 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700800 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400801
802 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
803 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
804 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
805 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
806 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
807 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
808 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
809 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
810 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
811 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
812 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
813 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
814
815 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800816 topologyProvider = new DefaultVirtualNetworkProvider();
817 try {
818 TestUtils.setField(topologyProvider, "topologyService", topologyService);
819 } catch (TestUtils.TestUtilsException e) {
820 e.printStackTrace();
821 }
822// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400823
824 return virtualNetwork;
825 }
826
827 /**
828 * Test the topologyChanged() method.
829 */
830 @Test
831 public void testTopologyChanged() {
832 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800833 VirtualNetworkProviderService providerService =
834 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400835
836 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800837 assertEquals("The cluster count did not match.", 2,
838 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400839
840 // Adding this link will join the two clusters together.
841 List<Event> reasons = new ArrayList<>();
842 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
843 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
844 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
845 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
846
847 Topology topology = topologyService.currentTopology();
848 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
849
850 // Validate that all links are still active.
851 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800852 assertTrue("The virtual link should be active.",
853 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400854 });
855
856 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
857 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
858 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
859
860 // Validate that all links are active again.
861 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800862 assertTrue("The virtual link should be active.",
863 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400864 });
865 }
866
Brian Stanke11f6d532016-07-05 16:17:59 -0400867 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500868 * Tests that the get() method returns saved service instances.
869 */
870 @Test
871 public void testServiceGetReturnsSavedInstance() {
872 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
873 VirtualNetwork virtualNetwork =
874 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
875
876 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
877 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
878 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500879 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
880 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
881
Yoonseon Han096cea02017-05-15 15:10:41 -0700882 // extra setup needed for FlowRuleService, PacketService, GroupService, and IntentService
Claudine Chiu9a18f492017-02-27 15:57:06 -0500883 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
884 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
885 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
886 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
887 testDirectory.add(CoreService.class, coreService)
888 .add(VirtualProviderRegistryService.class, virtualProviderManager)
889 .add(EventDeliveryService.class, new TestEventDispatcher())
890 .add(ClusterService.class, new ClusterServiceAdapter())
891 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
892 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
yoonseon86bebed2017-02-03 15:23:57 -0800893 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore())
Yoonseon Han096cea02017-05-15 15:10:41 -0700894 .add(VirtualNetworkIntentStore.class, new SimpleVirtualIntentStore())
yoonseon86bebed2017-02-03 15:23:57 -0800895 .add(VirtualNetworkFlowObjectiveStore.class, new SimpleVirtualFlowObjectiveStore());
Claudine Chiu9a18f492017-02-27 15:57:06 -0500896
897 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
Claudine Chiu1f036b82017-03-09 16:45:56 -0500898 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowObjectiveService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500899 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
900 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
Yoonseon Han096cea02017-05-15 15:10:41 -0700901 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500902 }
903
904 /**
905 * Validates that the get() method returns saved service instances.
906 */
907 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
908 Class<T> serviceClass) {
909 T serviceInstanceFirst = manager.get(networkId, serviceClass);
910 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
911 assertSame(serviceClass.getSimpleName() +
912 ": Subsequent get should be same as the first one",
913 serviceInstanceFirst, serviceInstanceSubsequent);
914 }
915
916 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500917 * Method to validate that the actual versus expected virtual network events were
918 * received correctly.
919 *
920 * @param types expected virtual network events.
921 */
922 private void validateEvents(Enum... types) {
923 TestTools.assertAfter(100, () -> {
924 int i = 0;
925 assertEquals("wrong events received", types.length, listener.events.size());
926 for (Event event : listener.events) {
927 assertEquals("incorrect event type", types[i], event.type());
928 i++;
929 }
930 listener.events.clear();
931 });
932 }
933
934 /**
935 * Test listener class to receive virtual network events.
936 */
937 private static class TestListener implements VirtualNetworkListener {
938
Brian Stanke7a81b532016-06-14 15:43:51 -0400939 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500940
941 @Override
942 public void event(VirtualNetworkEvent event) {
943 events.add(event);
944 }
945
946 }
947
Brian Stanke5df14472016-03-11 19:34:38 -0500948 /**
949 * Core service test class.
950 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500951 private class TestCoreService extends CoreServiceAdapter {
952
953 @Override
954 public IdGenerator getIdGenerator(String topic) {
955 return new IdGenerator() {
956 private AtomicLong counter = new AtomicLong(0);
957
958 @Override
959 public long getNewId() {
960 return counter.getAndIncrement();
961 }
962 };
963 }
964 }
965}