blob: 9ea891639f0c953a3520ee8a392cfe0a1e76d4c8 [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
Claudine Chiu579969d2017-10-06 14:32:18 -0400556 private VirtualPort getPort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) {
557 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(networkId, deviceId);
558 return virtualPorts.stream().filter(virtualPort -> virtualPort.number().equals(portNumber))
559 .findFirst().orElse(null);
560 }
561
Brian Stanke9a108972016-04-11 15:25:17 -0400562 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500563 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500564 */
565 @Test
566 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500567 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
568
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500569 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500570 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800571 VirtualNetwork virtualNetwork1 =
572 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500573 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500574 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400575 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500576 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700577 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500578
yoonseon214963b2016-11-21 15:41:07 -0800579 manager.createVirtualPort(virtualNetwork1.id(),
580 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500581 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800582 manager.createVirtualPort(virtualNetwork1.id(),
583 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500584 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500585
Brian Stanke5df14472016-03-11 19:34:38 -0500586 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500587 assertNotNull("The virtual port set should not be null", virtualPorts);
588 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
Claudine Chiu579969d2017-10-06 14:32:18 -0400589 virtualPorts.forEach(vp -> assertFalse("Initial virtual port state should be disabled", vp.isEnabled()));
590
591 // verify change state of virtual port (disabled -> enabled)
592 manager.updatePortState(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), true);
593 VirtualPort changedPort = getPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1));
594 assertNotNull("The changed virtual port should not be null", changedPort);
595 assertEquals("Virtual port state should be enabled", true, changedPort.isEnabled());
596 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
597
598 // verify change state of virtual port (disabled -> disabled)
599 manager.updatePortState(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), false);
600 changedPort = getPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2));
601 assertNotNull("The changed virtual port should not be null", changedPort);
602 assertEquals("Virtual port state should be disabled", false, changedPort.isEnabled());
603 // no VIRTUAL_PORT_UPDATED event is expected - the requested state (disabled) is same as previous state.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500604
605 for (VirtualPort virtualPort : virtualPorts) {
606 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 Stanke0e5c94e2016-03-08 11:20:04 -0500609 // attempt to remove the same virtual port again.
610 manager.removeVirtualPort(virtualNetwork1.id(),
611 (DeviceId) virtualPort.element().id(), virtualPort.number());
612 }
Brian Stanke5df14472016-03-11 19:34:38 -0500613 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
614 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
615
616 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800617 VirtualPort virtualPort =
618 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700619 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500620 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
621
622 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
623 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
624 PortNumber.portNumber(1), newCp);
625 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
626
yoonseon214963b2016-11-21 15:41:07 -0800627 manager.removeVirtualPort(virtualNetwork1.id(),
628 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500629 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500630 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500631 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500632
633 // Validate that the events were all received in the correct order.
634 validateEvents((Enum[]) expectedEventTypes.toArray(
635 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500636 }
637
638 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800639 * Tests when a virtual element is removed, all the other elements depending on it are also removed.
640 */
641 @Test
642 public void testRemoveAllElements() {
643 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
644 VirtualNetwork virtualNetwork1 =
645 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
646 VirtualDevice virtualDevice1 =
647 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
648 VirtualDevice virtualDevice2 =
649 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
650 ConnectPoint src = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
651 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
652 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
653
654 ConnectPoint dst = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(2));
655 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
656 new ConnectPoint(PHYDID2, PortNumber.portNumber(2)));
657
658 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
659 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
660
661 ConnectPoint hostCp = new ConnectPoint(DID1, P1);
662 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
663 new ConnectPoint(PHYDID1, P1));
664 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
665
666 //When a virtual port is removed, all virtual links connected to it should also be removed.
667 manager.removeVirtualPort(virtualNetwork1.id(), DID1, PortNumber.portNumber(1));
668 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
669 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
670
671 //When a virtual port is removed, all virtual hosts located to it should also be removed.
672 manager.removeVirtualPort(virtualNetwork1.id(), DID1, P1);
673 Set<VirtualHost> virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
674 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
675
676 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
677 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
678 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
679 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
680 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
681 new ConnectPoint(PHYDID1, P1));
682 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
683
684 //When a virtual device is removed, all virtual ports, hosts and links depended on it should also be removed.
685 manager.removeVirtualDevice(virtualNetwork1.id(), DID1);
686 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), DID1);
687 assertTrue("The virtual port set of DID1 should be empty", virtualPorts.isEmpty());
688 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
689 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
690 virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
691 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
692
693 //When a tenantId is removed, all the virtual networks belonging to it should also be removed.
694 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
695 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
696 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
697 assertNotNull("The virtual network set should not be null", virtualNetworks);
698 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
699 }
700
Brian Stanke11f6d532016-07-05 16:17:59 -0400701 /**
702 * Tests the addTunnelId() method in the store with a null intent.
703 */
704 @Test(expected = NullPointerException.class)
705 public void testAddTunnelIdNullIntent() {
706 manager.store.addTunnelId(null, null);
707 }
708
709 /**
710 * Tests the removeTunnelId() method in the store with a null intent.
711 */
712 @Test(expected = NullPointerException.class)
713 public void testRemoveTunnelIdNullIntent() {
714 manager.store.removeTunnelId(null, null);
715 }
716
717 /**
718 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
719 */
720 @Test
721 public void testAddTunnelId() {
722 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
723 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
724 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
725 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
726
727 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
728 .networkId(virtualNetwork.id())
729 .key(Key.of("Test", APP_ID))
730 .appId(APP_ID)
731 .ingressPoint(cp1)
732 .egressPoint(cp2)
733 .build();
734
735 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
736 // Add the intent to tunnelID mapping to the store.
737 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800738 assertEquals("The tunnels size should match.", 1,
739 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400740
741 // Remove the intent to tunnelID mapping from the store.
742 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800743 assertTrue("The tunnels should be empty.",
744 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400745 }
746
Brian Stankefb61df42016-07-25 11:47:51 -0400747
748 /**
749 * Method to create the virtual network for further testing.
750 **/
751 private VirtualNetwork setupVirtualNetworkTopology() {
752 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800753 VirtualNetwork virtualNetwork =
754 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400755
756 VirtualDevice virtualDevice1 =
757 manager.createVirtualDevice(virtualNetwork.id(), DID1);
758 VirtualDevice virtualDevice2 =
759 manager.createVirtualDevice(virtualNetwork.id(), DID2);
760 VirtualDevice virtualDevice3 =
761 manager.createVirtualDevice(virtualNetwork.id(), DID3);
762 VirtualDevice virtualDevice4 =
763 manager.createVirtualDevice(virtualNetwork.id(), DID4);
764 VirtualDevice virtualDevice5 =
765 manager.createVirtualDevice(virtualNetwork.id(), DID5);
766
767 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
768 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700769 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400770
771 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
772 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700773 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400774
775 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
776 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700777 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400778
779 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
780 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700781 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400782
783 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
784 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700785 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400786
787 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
788 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700789 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400790
791 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
792 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700793 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400794
795 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
796 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700797 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400798
799 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
800 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700801 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400802
803 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
804 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
805 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
806 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
807 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
808 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
809 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
810 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
811 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
812 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
813 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
814 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
815
816 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800817 topologyProvider = new DefaultVirtualNetworkProvider();
818 try {
819 TestUtils.setField(topologyProvider, "topologyService", topologyService);
820 } catch (TestUtils.TestUtilsException e) {
821 e.printStackTrace();
822 }
823// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400824
825 return virtualNetwork;
826 }
827
828 /**
829 * Test the topologyChanged() method.
830 */
831 @Test
832 public void testTopologyChanged() {
833 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800834 VirtualNetworkProviderService providerService =
835 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400836
837 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800838 assertEquals("The cluster count did not match.", 2,
839 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400840
841 // Adding this link will join the two clusters together.
842 List<Event> reasons = new ArrayList<>();
843 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
844 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
845 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
846 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
847
848 Topology topology = topologyService.currentTopology();
849 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
850
851 // Validate that all links are still active.
852 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800853 assertTrue("The virtual link should be active.",
854 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400855 });
856
857 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
858 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
859 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
860
861 // Validate that all links are active again.
862 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800863 assertTrue("The virtual link should be active.",
864 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400865 });
866 }
867
Brian Stanke11f6d532016-07-05 16:17:59 -0400868 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500869 * Tests that the get() method returns saved service instances.
870 */
871 @Test
872 public void testServiceGetReturnsSavedInstance() {
873 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
874 VirtualNetwork virtualNetwork =
875 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
876
877 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
878 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
879 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500880 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
881 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
882
Yoonseon Han096cea02017-05-15 15:10:41 -0700883 // extra setup needed for FlowRuleService, PacketService, GroupService, and IntentService
Claudine Chiu9a18f492017-02-27 15:57:06 -0500884 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
885 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
886 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
887 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
888 testDirectory.add(CoreService.class, coreService)
889 .add(VirtualProviderRegistryService.class, virtualProviderManager)
890 .add(EventDeliveryService.class, new TestEventDispatcher())
891 .add(ClusterService.class, new ClusterServiceAdapter())
892 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
893 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
yoonseon86bebed2017-02-03 15:23:57 -0800894 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore())
Yoonseon Han096cea02017-05-15 15:10:41 -0700895 .add(VirtualNetworkIntentStore.class, new SimpleVirtualIntentStore())
yoonseon86bebed2017-02-03 15:23:57 -0800896 .add(VirtualNetworkFlowObjectiveStore.class, new SimpleVirtualFlowObjectiveStore());
Claudine Chiu9a18f492017-02-27 15:57:06 -0500897
898 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
Claudine Chiu1f036b82017-03-09 16:45:56 -0500899 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowObjectiveService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500900 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
901 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
Yoonseon Han096cea02017-05-15 15:10:41 -0700902 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500903 }
904
905 /**
906 * Validates that the get() method returns saved service instances.
907 */
908 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
909 Class<T> serviceClass) {
910 T serviceInstanceFirst = manager.get(networkId, serviceClass);
911 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
912 assertSame(serviceClass.getSimpleName() +
913 ": Subsequent get should be same as the first one",
914 serviceInstanceFirst, serviceInstanceSubsequent);
915 }
916
917 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500918 * Method to validate that the actual versus expected virtual network events were
919 * received correctly.
920 *
921 * @param types expected virtual network events.
922 */
923 private void validateEvents(Enum... types) {
924 TestTools.assertAfter(100, () -> {
925 int i = 0;
926 assertEquals("wrong events received", types.length, listener.events.size());
927 for (Event event : listener.events) {
928 assertEquals("incorrect event type", types[i], event.type());
929 i++;
930 }
931 listener.events.clear();
932 });
933 }
934
935 /**
936 * Test listener class to receive virtual network events.
937 */
938 private static class TestListener implements VirtualNetworkListener {
939
Brian Stanke7a81b532016-06-14 15:43:51 -0400940 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500941
942 @Override
943 public void event(VirtualNetworkEvent event) {
944 events.add(event);
945 }
946
947 }
948
Brian Stanke5df14472016-03-11 19:34:38 -0500949 /**
950 * Core service test class.
951 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500952 private class TestCoreService extends CoreServiceAdapter {
953
954 @Override
955 public IdGenerator getIdGenerator(String topic) {
956 return new IdGenerator() {
957 private AtomicLong counter = new AtomicLong(0);
958
959 @Override
960 public long getNewId() {
961 return counter.getAndIncrement();
962 }
963 };
964 }
965 }
966}