blob: 7f5a5fe4b5b0f8c7edd8893a48e9e060870267bd [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.
yoonseon214963b2016-11-21 15:41:07 -0800170 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
171 VirtualNetworkEvent.Type.TENANT_REGISTERED,
172 VirtualNetworkEvent.Type.TENANT_REGISTERED,
173 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500174 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
175 }
176
177 /**
178 * Tests adding a null virtual network.
179 */
180 @Test(expected = NullPointerException.class)
181 public void testCreateNullVirtualNetwork() {
182 manager.createVirtualNetwork(null);
183 }
184
185 /**
Claudine Chiu70e2db82017-05-04 09:53:11 -0400186 * Tests removal of a virtual network twice.
187 */
188 @Test(expected = IllegalStateException.class)
189 public void testRemoveVnetTwice() {
190 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
191 VirtualNetwork virtualNetwork =
192 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
193 manager.removeVirtualNetwork(virtualNetwork.id());
194 manager.removeVirtualNetwork(virtualNetwork.id());
195 }
196
197 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500198 * Tests add and remove of virtual networks.
199 */
200 @Test
201 public void testAddRemoveVirtualNetwork() {
202 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
203 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
204 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
205 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
206 assertNotNull("The virtual network set should not be null", virtualNetworks);
207 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
208
Brian Stanke5df14472016-03-11 19:34:38 -0500209 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500210 for (VirtualNetwork virtualNetwork : virtualNetworks) {
211 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500212 assertEquals("The expected virtual network size does not match",
213 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500214 }
215 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
216 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
217
Brian Stanke5df14472016-03-11 19:34:38 -0500218 // Create/remove a virtual network.
219 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
220 manager.removeVirtualNetwork(virtualNetwork.id());
221
222 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
223 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
224
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500225 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800226 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
227 VirtualNetworkEvent.Type.NETWORK_ADDED,
228 VirtualNetworkEvent.Type.NETWORK_ADDED,
229 VirtualNetworkEvent.Type.NETWORK_REMOVED,
230 VirtualNetworkEvent.Type.NETWORK_REMOVED,
231 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500232 VirtualNetworkEvent.Type.NETWORK_REMOVED);
233 }
234
235 /**
236 * Tests adding a null virtual device.
237 */
238 @Test(expected = NullPointerException.class)
239 public void testCreateNullVirtualDevice() {
240 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
241 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
242
243 manager.createVirtualDevice(virtualNetwork.id(), null);
244 }
245
246 /**
247 * Tests adding a virtual device where no virtual network exists.
248 */
249 @Test(expected = IllegalStateException.class)
250 public void testCreateVirtualDeviceWithNoNetwork() {
251 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800252 VirtualNetwork virtualNetwork =
253 new DefaultVirtualNetwork(NetworkId.NONE,
254 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500255
Brian Stanke7a81b532016-06-14 15:43:51 -0400256 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500257 }
258
259 /**
260 * Tests add and remove of virtual devices.
261 */
262 @Test
263 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500264 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
265
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500266 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500267 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800268 VirtualNetwork virtualNetwork1 =
269 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500270 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800271 VirtualNetwork virtualNetwork2 =
272 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500273 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400274 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500275 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400276 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500277 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500278
279 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
280 assertNotNull("The virtual device set should not be null", virtualDevices1);
281 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
282
283 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
284 assertNotNull("The virtual device set should not be null", virtualDevices2);
285 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
286
287 for (VirtualDevice virtualDevice : virtualDevices1) {
288 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500289 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
290 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500291 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
292 }
293 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
294 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
295
Brian Stanke5df14472016-03-11 19:34:38 -0500296 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400297 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500298 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500299 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500300 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500301 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
302 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
303
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500304 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500305 validateEvents((Enum[]) expectedEventTypes.toArray(
306 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500307 }
308
309 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900310 * Tests getting a collection of physical device identifier corresponding to
311 * the specified virtual device.
312 */
313 @Test
314 public void testGetPhysicalDevices() {
315 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
316 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
317
318 VirtualNetwork virtualNetwork1 =
319 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
320 VirtualNetwork virtualNetwork2 =
321 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
322
323 // two virtual device in first virtual network
324 VirtualDevice vDevice1InVnet1 =
325 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
326 VirtualDevice vDevice2InVnet1 =
327 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
328 // Two virtual device in second virtual network
329 VirtualDevice vDevice1InVnet2 =
330 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
331 VirtualDevice vDevice2InVnet2 =
332 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
333
334 // Connection Point from each physical device
335 // Virtual network 1
336 ConnectPoint cp1InVnet1 =
337 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
338 ConnectPoint cp2InVnet1 =
339 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
340 ConnectPoint cp3InVnet1 =
341 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
342 ConnectPoint cp4InVnet1 =
343 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
344 // Virtual network 2
345 ConnectPoint cp1InVnet2 =
346 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
347 ConnectPoint cp2InVnet2 =
348 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
349 ConnectPoint cp3InVnet2 =
350 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
351 ConnectPoint cp4InVnet2 =
352 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
353
354 // Make simple BigSwitch by mapping two phyDevice to one vDevice
355 // First vDevice in first virtual network
356 manager.createVirtualPort(virtualNetwork1.id(),
357 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
358 manager.createVirtualPort(virtualNetwork1.id(),
359 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
360 // Second vDevice in first virtual network
361 manager.createVirtualPort(virtualNetwork1.id(),
362 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
363 manager.createVirtualPort(virtualNetwork1.id(),
364 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
365 // First vDevice in second virtual network
366 manager.createVirtualPort(virtualNetwork2.id(),
367 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
368 manager.createVirtualPort(virtualNetwork2.id(),
369 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
370 // Second vDevice in second virtual network
371 manager.createVirtualPort(virtualNetwork2.id(),
372 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
373 manager.createVirtualPort(virtualNetwork2.id(),
374 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
375
376
377 Set<DeviceId> physicalDeviceSet;
378 Set<DeviceId> testSet = new HashSet<>();
Harold Huang3fcf7432017-05-16 16:21:08 +0800379 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900380 testSet.add(PHYDID1);
381 testSet.add(PHYDID2);
382 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900383 testSet.clear();
384
Harold Huang3fcf7432017-05-16 16:21:08 +0800385 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900386 testSet.add(PHYDID3);
387 testSet.add(PHYDID4);
388 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900389 testSet.clear();
390
Harold Huang3fcf7432017-05-16 16:21:08 +0800391 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900392 testSet.add(PHYDID1);
393 testSet.add(PHYDID2);
394 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900395 testSet.clear();
396
Harold Huang3fcf7432017-05-16 16:21:08 +0800397 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900398 testSet.add(PHYDID3);
399 testSet.add(PHYDID4);
400 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900401 testSet.clear();
402 }
403
404 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400405 * Tests adding a null virtual host.
406 */
407 @Test(expected = NullPointerException.class)
408 public void testCreateNullVirtualHost() {
409 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800410 VirtualNetwork virtualNetwork =
411 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400412
413 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
414 }
415
416 /**
417 * Tests adding a virtual host where no virtual network exists.
418 */
419 @Test(expected = IllegalStateException.class)
420 public void testCreateVirtualHostWithNoNetwork() {
421 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800422 VirtualNetwork virtualNetwork =
423 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400424
425 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
426 }
427
428 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800429 * Tests adding a virtual host where no virtual port exists.
430 */
431 @Test(expected = IllegalStateException.class)
432 public void testCreateVirtualHostWithNoVirtualPort() {
433 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
434 VirtualNetwork virtualNetwork1 =
435 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
436 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
437 }
438
439 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400440 * Tests add and remove of virtual hosts.
441 */
442 @Test
443 public void testAddRemoveVirtualHost() {
444 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800445 VirtualNetwork virtualNetwork1 =
446 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
447 VirtualNetwork virtualNetwork2 =
448 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800449
450 VirtualDevice virtualDevice1 =
451 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
452 VirtualDevice virtualDevice2 =
453 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
454
455 ConnectPoint hostCp1 = new ConnectPoint(DID1, P1);
456 ConnectPoint hostCp2 = new ConnectPoint(DID2, P2);
457 manager.createVirtualPort(virtualNetwork1.id(), hostCp1.deviceId(), hostCp1.port(),
458 new ConnectPoint(virtualDevice1.id(), hostCp1.port()));
459 manager.createVirtualPort(virtualNetwork2.id(), hostCp2.deviceId(), hostCp2.port(),
460 new ConnectPoint(virtualDevice2.id(), hostCp2.port()));
461
Brian Stanke7a81b532016-06-14 15:43:51 -0400462 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
463 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
464
465 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
466 assertNotNull("The virtual host set should not be null", virtualHosts1);
467 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
468
469 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
470 assertNotNull("The virtual host set should not be null", virtualHosts2);
471 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
472
473 for (VirtualHost virtualHost : virtualHosts1) {
474 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
475 // attempt to remove the same virtual host again.
476 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
477 }
478 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
479 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
480
481 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800482 VirtualHost virtualHost =
483 manager.createVirtualHost(virtualNetwork1.id(),
484 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400485 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
486 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
487 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
488 }
489
490 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500491 * Tests add and remove of virtual links.
492 */
493 @Test
494 public void testAddRemoveVirtualLink() {
495 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800496 VirtualNetwork virtualNetwork1 =
497 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500498 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400499 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500500 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400501 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500502 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400503 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700504 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400505
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500506 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400507 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700508 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400509
Brian Stanke9a108972016-04-11 15:25:17 -0400510 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
511 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500512
513 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
514 assertNotNull("The virtual link set should not be null", virtualLinks);
515 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
516
517 for (VirtualLink virtualLink : virtualLinks) {
518 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
519 // attempt to remove the same virtual link again.
520 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
521 }
522 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
523 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500524
525 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400526 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500527 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
528 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
529 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500530 }
531
532 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400533 * Tests adding the same virtual link twice.
534 */
535 @Test(expected = IllegalStateException.class)
536 public void testAddSameVirtualLink() {
537 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800538 VirtualNetwork virtualNetwork1 =
539 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400540 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400541 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400542 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400543 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400544 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400545 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700546 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400547
Brian Stanke9a108972016-04-11 15:25:17 -0400548 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400549 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700550 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400551
Brian Stanke9a108972016-04-11 15:25:17 -0400552 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
553 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
554 }
555
556 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500557 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500558 */
559 @Test
560 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500561 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
562
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500563 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500564 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800565 VirtualNetwork virtualNetwork1 =
566 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500567 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500568 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400569 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500570 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700571 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500572
yoonseon214963b2016-11-21 15:41:07 -0800573 manager.createVirtualPort(virtualNetwork1.id(),
574 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500575 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800576 manager.createVirtualPort(virtualNetwork1.id(),
577 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500578 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500579
Brian Stanke5df14472016-03-11 19:34:38 -0500580 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500581 assertNotNull("The virtual port set should not be null", virtualPorts);
582 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
583
584 for (VirtualPort virtualPort : virtualPorts) {
585 manager.removeVirtualPort(virtualNetwork1.id(),
586 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500587 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500588 // attempt to remove the same virtual port again.
589 manager.removeVirtualPort(virtualNetwork1.id(),
590 (DeviceId) virtualPort.element().id(), virtualPort.number());
591 }
Brian Stanke5df14472016-03-11 19:34:38 -0500592 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
593 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
594
595 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800596 VirtualPort virtualPort =
597 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700598 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500599 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
600
601 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
602 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
603 PortNumber.portNumber(1), newCp);
604 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
605
yoonseon214963b2016-11-21 15:41:07 -0800606 manager.removeVirtualPort(virtualNetwork1.id(),
607 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500608 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500609 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500610 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500611
612 // Validate that the events were all received in the correct order.
613 validateEvents((Enum[]) expectedEventTypes.toArray(
614 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500615 }
616
617 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800618 * Tests when a virtual element is removed, all the other elements depending on it are also removed.
619 */
620 @Test
621 public void testRemoveAllElements() {
622 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
623 VirtualNetwork virtualNetwork1 =
624 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
625 VirtualDevice virtualDevice1 =
626 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
627 VirtualDevice virtualDevice2 =
628 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
629 ConnectPoint src = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
630 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
631 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
632
633 ConnectPoint dst = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(2));
634 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
635 new ConnectPoint(PHYDID2, PortNumber.portNumber(2)));
636
637 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
638 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
639
640 ConnectPoint hostCp = new ConnectPoint(DID1, P1);
641 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
642 new ConnectPoint(PHYDID1, P1));
643 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
644
645 //When a virtual port is removed, all virtual links connected to it should also be removed.
646 manager.removeVirtualPort(virtualNetwork1.id(), DID1, PortNumber.portNumber(1));
647 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
648 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
649
650 //When a virtual port is removed, all virtual hosts located to it should also be removed.
651 manager.removeVirtualPort(virtualNetwork1.id(), DID1, P1);
652 Set<VirtualHost> virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
653 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
654
655 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
656 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
657 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
658 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
659 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
660 new ConnectPoint(PHYDID1, P1));
661 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
662
663 //When a virtual device is removed, all virtual ports, hosts and links depended on it should also be removed.
664 manager.removeVirtualDevice(virtualNetwork1.id(), DID1);
665 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), DID1);
666 assertTrue("The virtual port set of DID1 should be empty", virtualPorts.isEmpty());
667 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
668 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
669 virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
670 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
671
672 //When a tenantId is removed, all the virtual networks belonging to it should also be removed.
673 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
674 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
675 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
676 assertNotNull("The virtual network set should not be null", virtualNetworks);
677 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
678 }
679
Brian Stanke11f6d532016-07-05 16:17:59 -0400680 /**
681 * Tests the addTunnelId() method in the store with a null intent.
682 */
683 @Test(expected = NullPointerException.class)
684 public void testAddTunnelIdNullIntent() {
685 manager.store.addTunnelId(null, null);
686 }
687
688 /**
689 * Tests the removeTunnelId() method in the store with a null intent.
690 */
691 @Test(expected = NullPointerException.class)
692 public void testRemoveTunnelIdNullIntent() {
693 manager.store.removeTunnelId(null, null);
694 }
695
696 /**
697 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
698 */
699 @Test
700 public void testAddTunnelId() {
701 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
702 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
703 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
704 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
705
706 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
707 .networkId(virtualNetwork.id())
708 .key(Key.of("Test", APP_ID))
709 .appId(APP_ID)
710 .ingressPoint(cp1)
711 .egressPoint(cp2)
712 .build();
713
714 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
715 // Add the intent to tunnelID mapping to the store.
716 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800717 assertEquals("The tunnels size should match.", 1,
718 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400719
720 // Remove the intent to tunnelID mapping from the store.
721 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800722 assertTrue("The tunnels should be empty.",
723 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400724 }
725
Brian Stankefb61df42016-07-25 11:47:51 -0400726
727 /**
728 * Method to create the virtual network for further testing.
729 **/
730 private VirtualNetwork setupVirtualNetworkTopology() {
731 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800732 VirtualNetwork virtualNetwork =
733 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400734
735 VirtualDevice virtualDevice1 =
736 manager.createVirtualDevice(virtualNetwork.id(), DID1);
737 VirtualDevice virtualDevice2 =
738 manager.createVirtualDevice(virtualNetwork.id(), DID2);
739 VirtualDevice virtualDevice3 =
740 manager.createVirtualDevice(virtualNetwork.id(), DID3);
741 VirtualDevice virtualDevice4 =
742 manager.createVirtualDevice(virtualNetwork.id(), DID4);
743 VirtualDevice virtualDevice5 =
744 manager.createVirtualDevice(virtualNetwork.id(), DID5);
745
746 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
747 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700748 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400749
750 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
751 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700752 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400753
754 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
755 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700756 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400757
758 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
759 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700760 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400761
762 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
763 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700764 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400765
766 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
767 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700768 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400769
770 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
771 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700772 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400773
774 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
775 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700776 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400777
778 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
779 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700780 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400781
782 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
783 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
784 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
785 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
786 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
787 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
788 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
789 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
790 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
791 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
792 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
793 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
794
795 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800796 topologyProvider = new DefaultVirtualNetworkProvider();
797 try {
798 TestUtils.setField(topologyProvider, "topologyService", topologyService);
799 } catch (TestUtils.TestUtilsException e) {
800 e.printStackTrace();
801 }
802// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400803
804 return virtualNetwork;
805 }
806
807 /**
808 * Test the topologyChanged() method.
809 */
810 @Test
811 public void testTopologyChanged() {
812 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800813 VirtualNetworkProviderService providerService =
814 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400815
816 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800817 assertEquals("The cluster count did not match.", 2,
818 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400819
820 // Adding this link will join the two clusters together.
821 List<Event> reasons = new ArrayList<>();
822 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
823 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
824 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
825 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
826
827 Topology topology = topologyService.currentTopology();
828 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
829
830 // Validate that all links are still active.
831 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800832 assertTrue("The virtual link should be active.",
833 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400834 });
835
836 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
837 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
838 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
839
840 // Validate that all links are active again.
841 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800842 assertTrue("The virtual link should be active.",
843 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400844 });
845 }
846
Brian Stanke11f6d532016-07-05 16:17:59 -0400847 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500848 * Tests that the get() method returns saved service instances.
849 */
850 @Test
851 public void testServiceGetReturnsSavedInstance() {
852 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
853 VirtualNetwork virtualNetwork =
854 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
855
856 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
857 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
858 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500859 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
860 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
861
Yoonseon Han096cea02017-05-15 15:10:41 -0700862 // extra setup needed for FlowRuleService, PacketService, GroupService, and IntentService
Claudine Chiu9a18f492017-02-27 15:57:06 -0500863 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
864 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
865 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
866 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
867 testDirectory.add(CoreService.class, coreService)
868 .add(VirtualProviderRegistryService.class, virtualProviderManager)
869 .add(EventDeliveryService.class, new TestEventDispatcher())
870 .add(ClusterService.class, new ClusterServiceAdapter())
871 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
872 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
yoonseon86bebed2017-02-03 15:23:57 -0800873 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore())
Yoonseon Han096cea02017-05-15 15:10:41 -0700874 .add(VirtualNetworkIntentStore.class, new SimpleVirtualIntentStore())
yoonseon86bebed2017-02-03 15:23:57 -0800875 .add(VirtualNetworkFlowObjectiveStore.class, new SimpleVirtualFlowObjectiveStore());
Claudine Chiu9a18f492017-02-27 15:57:06 -0500876
877 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
Claudine Chiu1f036b82017-03-09 16:45:56 -0500878 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowObjectiveService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500879 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
880 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
Yoonseon Han096cea02017-05-15 15:10:41 -0700881 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500882 }
883
884 /**
885 * Validates that the get() method returns saved service instances.
886 */
887 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
888 Class<T> serviceClass) {
889 T serviceInstanceFirst = manager.get(networkId, serviceClass);
890 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
891 assertSame(serviceClass.getSimpleName() +
892 ": Subsequent get should be same as the first one",
893 serviceInstanceFirst, serviceInstanceSubsequent);
894 }
895
896 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500897 * Method to validate that the actual versus expected virtual network events were
898 * received correctly.
899 *
900 * @param types expected virtual network events.
901 */
902 private void validateEvents(Enum... types) {
903 TestTools.assertAfter(100, () -> {
904 int i = 0;
905 assertEquals("wrong events received", types.length, listener.events.size());
906 for (Event event : listener.events) {
907 assertEquals("incorrect event type", types[i], event.type());
908 i++;
909 }
910 listener.events.clear();
911 });
912 }
913
914 /**
915 * Test listener class to receive virtual network events.
916 */
917 private static class TestListener implements VirtualNetworkListener {
918
Brian Stanke7a81b532016-06-14 15:43:51 -0400919 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500920
921 @Override
922 public void event(VirtualNetworkEvent event) {
923 events.add(event);
924 }
925
926 }
927
Brian Stanke5df14472016-03-11 19:34:38 -0500928 /**
929 * Core service test class.
930 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500931 private class TestCoreService extends CoreServiceAdapter {
932
933 @Override
934 public IdGenerator getIdGenerator(String topic) {
935 return new IdGenerator() {
936 private AtomicLong counter = new AtomicLong(0);
937
938 @Override
939 public long getNewId() {
940 return counter.getAndIncrement();
941 }
942 };
943 }
944 }
945}