blob: 9d4086ed7f42363c77df6abd63ee2feb1a993938 [file] [log] [blame]
Brian Stanke0e5c94e2016-03-08 11:20:04 -05001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Brian Stanke0e5c94e2016-03-08 11:20:04 -05003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.incubator.net.virtual.impl;
18
19import com.google.common.collect.Lists;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestTools;
24import org.onlab.junit.TestUtils;
yoonseonc6a69272017-01-12 18:22:20 -080025import org.onlab.osgi.TestServiceDirectory;
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;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050047import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
Claudine Chiu9a18f492017-02-27 15:57:06 -050048import org.onosproject.incubator.net.virtual.VirtualNetworkPacketStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050049import org.onosproject.incubator.net.virtual.VirtualPort;
Claudine Chiu9a18f492017-02-27 15:57:06 -050050import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualFlowRuleProvider;
51import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualGroupProvider;
yoonseon214963b2016-11-21 15:41:07 -080052import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualNetworkProvider;
Claudine Chiu9a18f492017-02-27 15:57:06 -050053import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualPacketProvider;
54import org.onosproject.incubator.net.virtual.impl.provider.VirtualProviderManager;
55import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderService;
56import org.onosproject.incubator.net.virtual.provider.VirtualProviderRegistryService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050057import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
yoonseon86bebed2017-02-03 15:23:57 -080058import org.onosproject.incubator.store.virtual.impl.SimpleVirtualFlowObjectiveStore;
Claudine Chiu9a18f492017-02-27 15:57:06 -050059import org.onosproject.incubator.store.virtual.impl.SimpleVirtualFlowRuleStore;
60import org.onosproject.incubator.store.virtual.impl.SimpleVirtualGroupStore;
61import org.onosproject.incubator.store.virtual.impl.SimpleVirtualPacketStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050062import org.onosproject.net.ConnectPoint;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050063import org.onosproject.net.DeviceId;
Brian Stankefb61df42016-07-25 11:47:51 -040064import org.onosproject.net.Link;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050065import org.onosproject.net.NetTestTools;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050066import org.onosproject.net.PortNumber;
Claudine Chiu9a18f492017-02-27 15:57:06 -050067import org.onosproject.net.device.DeviceService;
68import org.onosproject.net.flow.FlowRuleService;
Claudine Chiu1f036b82017-03-09 16:45:56 -050069import org.onosproject.net.flowobjective.FlowObjectiveService;
Claudine Chiu9a18f492017-02-27 15:57:06 -050070import org.onosproject.net.group.GroupService;
71import org.onosproject.net.host.HostService;
Brian Stanke11f6d532016-07-05 16:17:59 -040072import org.onosproject.net.intent.FakeIntentManager;
Claudine Chiu9a18f492017-02-27 15:57:06 -050073import org.onosproject.net.intent.IntentService;
Brian Stanke11f6d532016-07-05 16:17:59 -040074import org.onosproject.net.intent.Key;
75import org.onosproject.net.intent.MockIdGenerator;
76import org.onosproject.net.intent.TestableIntentService;
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 Stanke11f6d532016-07-05 16:17:59 -0400106 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -0400107 private TopologyService topologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500108
Brian Stankefb61df42016-07-25 11:47:51 -0400109 private ConnectPoint cp6;
110 private ConnectPoint cp7;
111
yoonseonc6a69272017-01-12 18:22:20 -0800112 private TestServiceDirectory testDirectory;
113
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500114 @Before
115 public void setUp() throws Exception {
116 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700117 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500118
119 coreService = new TestCoreService();
yoonseonc6a69272017-01-12 18:22:20 -0800120 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon214963b2016-11-21 15:41:07 -0800121 TestUtils.setField(virtualNetworkManagerStore, "storageService",
122 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500123 virtualNetworkManagerStore.activate();
124
125 manager = new VirtualNetworkManager();
126 manager.store = virtualNetworkManagerStore;
127 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400128 manager.intentService = intentService;
yoonseon322c9c32016-12-07 16:47:02 -0800129 manager.coreService = coreService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500130 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800131
132 testDirectory = new TestServiceDirectory();
133 TestUtils.setField(manager, "serviceDirectory", testDirectory);
134
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500135 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500136 }
137
138 @After
139 public void tearDown() {
140 virtualNetworkManagerStore.deactivate();
141 manager.removeListener(listener);
142 manager.deactivate();
143 NetTestTools.injectEventDispatcher(manager, null);
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700144 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500145 }
146
147 /**
148 * Tests registering a null tenant id.
149 */
150 @Test(expected = NullPointerException.class)
151 public void testRegisterNullTenantId() {
152 manager.registerTenantId(null);
153 }
154
155 /**
156 * Tests registering/unregistering a tenant id.
157 */
158 @Test
159 public void testRegisterUnregisterTenantId() {
160 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
161 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
162 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
163 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
164 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
165
166 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
167 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
168 tenantIdCollection = manager.getTenantIds();
169 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
170
171 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800172 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
173 VirtualNetworkEvent.Type.TENANT_REGISTERED,
174 VirtualNetworkEvent.Type.TENANT_REGISTERED,
175 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500176 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
177 }
178
179 /**
180 * Tests adding a null virtual network.
181 */
182 @Test(expected = NullPointerException.class)
183 public void testCreateNullVirtualNetwork() {
184 manager.createVirtualNetwork(null);
185 }
186
187 /**
Claudine Chiu70e2db82017-05-04 09:53:11 -0400188 * Tests removal of a virtual network twice.
189 */
190 @Test(expected = IllegalStateException.class)
191 public void testRemoveVnetTwice() {
192 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
193 VirtualNetwork virtualNetwork =
194 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
195 manager.removeVirtualNetwork(virtualNetwork.id());
196 manager.removeVirtualNetwork(virtualNetwork.id());
197 }
198
199 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500200 * Tests add and remove of virtual networks.
201 */
202 @Test
203 public void testAddRemoveVirtualNetwork() {
204 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
205 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
206 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
207 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
208 assertNotNull("The virtual network set should not be null", virtualNetworks);
209 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
210
Brian Stanke5df14472016-03-11 19:34:38 -0500211 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500212 for (VirtualNetwork virtualNetwork : virtualNetworks) {
213 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500214 assertEquals("The expected virtual network size does not match",
215 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500216 }
217 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
218 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
219
Brian Stanke5df14472016-03-11 19:34:38 -0500220 // Create/remove a virtual network.
221 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
222 manager.removeVirtualNetwork(virtualNetwork.id());
223
224 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
225 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
226
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500227 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800228 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
229 VirtualNetworkEvent.Type.NETWORK_ADDED,
230 VirtualNetworkEvent.Type.NETWORK_ADDED,
231 VirtualNetworkEvent.Type.NETWORK_REMOVED,
232 VirtualNetworkEvent.Type.NETWORK_REMOVED,
233 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500234 VirtualNetworkEvent.Type.NETWORK_REMOVED);
235 }
236
237 /**
238 * Tests adding a null virtual device.
239 */
240 @Test(expected = NullPointerException.class)
241 public void testCreateNullVirtualDevice() {
242 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
243 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
244
245 manager.createVirtualDevice(virtualNetwork.id(), null);
246 }
247
248 /**
249 * Tests adding a virtual device where no virtual network exists.
250 */
251 @Test(expected = IllegalStateException.class)
252 public void testCreateVirtualDeviceWithNoNetwork() {
253 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800254 VirtualNetwork virtualNetwork =
255 new DefaultVirtualNetwork(NetworkId.NONE,
256 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500257
Brian Stanke7a81b532016-06-14 15:43:51 -0400258 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500259 }
260
261 /**
262 * Tests add and remove of virtual devices.
263 */
264 @Test
265 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500266 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
267
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500268 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500269 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800270 VirtualNetwork virtualNetwork1 =
271 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500272 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800273 VirtualNetwork virtualNetwork2 =
274 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500275 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400276 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500277 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400278 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500279 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500280
281 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
282 assertNotNull("The virtual device set should not be null", virtualDevices1);
283 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
284
285 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
286 assertNotNull("The virtual device set should not be null", virtualDevices2);
287 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
288
289 for (VirtualDevice virtualDevice : virtualDevices1) {
290 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500291 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
292 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500293 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
294 }
295 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
296 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
297
Brian Stanke5df14472016-03-11 19:34:38 -0500298 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400299 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500300 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500301 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500302 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500303 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
304 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
305
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500306 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500307 validateEvents((Enum[]) expectedEventTypes.toArray(
308 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500309 }
310
311 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900312 * Tests getting a collection of physical device identifier corresponding to
313 * the specified virtual device.
314 */
315 @Test
316 public void testGetPhysicalDevices() {
317 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
318 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
319
320 VirtualNetwork virtualNetwork1 =
321 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
322 VirtualNetwork virtualNetwork2 =
323 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
324
325 // two virtual device in first virtual network
326 VirtualDevice vDevice1InVnet1 =
327 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
328 VirtualDevice vDevice2InVnet1 =
329 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
330 // Two virtual device in second virtual network
331 VirtualDevice vDevice1InVnet2 =
332 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
333 VirtualDevice vDevice2InVnet2 =
334 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
335
336 // Connection Point from each physical device
337 // Virtual network 1
338 ConnectPoint cp1InVnet1 =
339 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
340 ConnectPoint cp2InVnet1 =
341 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
342 ConnectPoint cp3InVnet1 =
343 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
344 ConnectPoint cp4InVnet1 =
345 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
346 // Virtual network 2
347 ConnectPoint cp1InVnet2 =
348 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
349 ConnectPoint cp2InVnet2 =
350 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
351 ConnectPoint cp3InVnet2 =
352 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
353 ConnectPoint cp4InVnet2 =
354 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
355
356 // Make simple BigSwitch by mapping two phyDevice to one vDevice
357 // First vDevice in first virtual network
358 manager.createVirtualPort(virtualNetwork1.id(),
359 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
360 manager.createVirtualPort(virtualNetwork1.id(),
361 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
362 // Second vDevice in first virtual network
363 manager.createVirtualPort(virtualNetwork1.id(),
364 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
365 manager.createVirtualPort(virtualNetwork1.id(),
366 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
367 // First vDevice in second virtual network
368 manager.createVirtualPort(virtualNetwork2.id(),
369 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
370 manager.createVirtualPort(virtualNetwork2.id(),
371 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
372 // Second vDevice in second virtual network
373 manager.createVirtualPort(virtualNetwork2.id(),
374 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
375 manager.createVirtualPort(virtualNetwork2.id(),
376 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
377
378
379 Set<DeviceId> physicalDeviceSet;
380 Set<DeviceId> testSet = new HashSet<>();
381 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1);
382 testSet.add(PHYDID1);
383 testSet.add(PHYDID2);
384 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
385 physicalDeviceSet.clear();
386 testSet.clear();
387
388 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1);
389 testSet.add(PHYDID3);
390 testSet.add(PHYDID4);
391 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
392 physicalDeviceSet.clear();
393 testSet.clear();
394
395 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2);
396 testSet.add(PHYDID1);
397 testSet.add(PHYDID2);
398 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
399 physicalDeviceSet.clear();
400 testSet.clear();
401
402 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2);
403 testSet.add(PHYDID3);
404 testSet.add(PHYDID4);
405 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
406 physicalDeviceSet.clear();
407 testSet.clear();
408 }
409
410 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400411 * Tests adding a null virtual host.
412 */
413 @Test(expected = NullPointerException.class)
414 public void testCreateNullVirtualHost() {
415 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800416 VirtualNetwork virtualNetwork =
417 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400418
419 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
420 }
421
422 /**
423 * Tests adding a virtual host where no virtual network exists.
424 */
425 @Test(expected = IllegalStateException.class)
426 public void testCreateVirtualHostWithNoNetwork() {
427 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800428 VirtualNetwork virtualNetwork =
429 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400430
431 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
432 }
433
434 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800435 * Tests adding a virtual host where no virtual port exists.
436 */
437 @Test(expected = IllegalStateException.class)
438 public void testCreateVirtualHostWithNoVirtualPort() {
439 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
440 VirtualNetwork virtualNetwork1 =
441 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
442 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
443 }
444
445 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400446 * Tests add and remove of virtual hosts.
447 */
448 @Test
449 public void testAddRemoveVirtualHost() {
450 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800451 VirtualNetwork virtualNetwork1 =
452 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
453 VirtualNetwork virtualNetwork2 =
454 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800455
456 VirtualDevice virtualDevice1 =
457 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
458 VirtualDevice virtualDevice2 =
459 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
460
461 ConnectPoint hostCp1 = new ConnectPoint(DID1, P1);
462 ConnectPoint hostCp2 = new ConnectPoint(DID2, P2);
463 manager.createVirtualPort(virtualNetwork1.id(), hostCp1.deviceId(), hostCp1.port(),
464 new ConnectPoint(virtualDevice1.id(), hostCp1.port()));
465 manager.createVirtualPort(virtualNetwork2.id(), hostCp2.deviceId(), hostCp2.port(),
466 new ConnectPoint(virtualDevice2.id(), hostCp2.port()));
467
Brian Stanke7a81b532016-06-14 15:43:51 -0400468 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
469 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
470
471 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
472 assertNotNull("The virtual host set should not be null", virtualHosts1);
473 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
474
475 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
476 assertNotNull("The virtual host set should not be null", virtualHosts2);
477 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
478
479 for (VirtualHost virtualHost : virtualHosts1) {
480 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
481 // attempt to remove the same virtual host again.
482 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
483 }
484 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
485 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
486
487 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800488 VirtualHost virtualHost =
489 manager.createVirtualHost(virtualNetwork1.id(),
490 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400491 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
492 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
493 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
494 }
495
496 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500497 * Tests add and remove of virtual links.
498 */
499 @Test
500 public void testAddRemoveVirtualLink() {
501 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800502 VirtualNetwork virtualNetwork1 =
503 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500504 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400505 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500506 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400507 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500508 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400509 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700510 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400511
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500512 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400513 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700514 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400515
Brian Stanke9a108972016-04-11 15:25:17 -0400516 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
517 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500518
519 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
520 assertNotNull("The virtual link set should not be null", virtualLinks);
521 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
522
523 for (VirtualLink virtualLink : virtualLinks) {
524 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
525 // attempt to remove the same virtual link again.
526 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
527 }
528 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
529 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500530
531 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400532 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500533 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
534 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
535 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500536 }
537
538 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400539 * Tests adding the same virtual link twice.
540 */
541 @Test(expected = IllegalStateException.class)
542 public void testAddSameVirtualLink() {
543 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800544 VirtualNetwork virtualNetwork1 =
545 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400546 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400547 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400548 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400549 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400550 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400551 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700552 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400553
Brian Stanke9a108972016-04-11 15:25:17 -0400554 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400555 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700556 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400557
Brian Stanke9a108972016-04-11 15:25:17 -0400558 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
559 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
560 }
561
562 /**
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());
589
590 for (VirtualPort virtualPort : virtualPorts) {
591 manager.removeVirtualPort(virtualNetwork1.id(),
592 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500593 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500594 // attempt to remove the same virtual port again.
595 manager.removeVirtualPort(virtualNetwork1.id(),
596 (DeviceId) virtualPort.element().id(), virtualPort.number());
597 }
Brian Stanke5df14472016-03-11 19:34:38 -0500598 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
599 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
600
601 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800602 VirtualPort virtualPort =
603 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700604 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500605 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
606
607 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
608 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
609 PortNumber.portNumber(1), newCp);
610 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
611
yoonseon214963b2016-11-21 15:41:07 -0800612 manager.removeVirtualPort(virtualNetwork1.id(),
613 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500614 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500615 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500616 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500617
618 // Validate that the events were all received in the correct order.
619 validateEvents((Enum[]) expectedEventTypes.toArray(
620 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500621 }
622
623 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800624 * Tests when a virtual element is removed, all the other elements depending on it are also removed.
625 */
626 @Test
627 public void testRemoveAllElements() {
628 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
629 VirtualNetwork virtualNetwork1 =
630 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
631 VirtualDevice virtualDevice1 =
632 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
633 VirtualDevice virtualDevice2 =
634 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
635 ConnectPoint src = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
636 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
637 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
638
639 ConnectPoint dst = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(2));
640 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
641 new ConnectPoint(PHYDID2, PortNumber.portNumber(2)));
642
643 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
644 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
645
646 ConnectPoint hostCp = new ConnectPoint(DID1, P1);
647 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
648 new ConnectPoint(PHYDID1, P1));
649 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
650
651 //When a virtual port is removed, all virtual links connected to it should also be removed.
652 manager.removeVirtualPort(virtualNetwork1.id(), DID1, PortNumber.portNumber(1));
653 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
654 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
655
656 //When a virtual port is removed, all virtual hosts located to it should also be removed.
657 manager.removeVirtualPort(virtualNetwork1.id(), DID1, P1);
658 Set<VirtualHost> virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
659 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
660
661 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
662 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
663 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
664 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
665 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
666 new ConnectPoint(PHYDID1, P1));
667 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
668
669 //When a virtual device is removed, all virtual ports, hosts and links depended on it should also be removed.
670 manager.removeVirtualDevice(virtualNetwork1.id(), DID1);
671 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), DID1);
672 assertTrue("The virtual port set of DID1 should be empty", virtualPorts.isEmpty());
673 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
674 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
675 virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
676 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
677
678 //When a tenantId is removed, all the virtual networks belonging to it should also be removed.
679 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
680 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
681 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
682 assertNotNull("The virtual network set should not be null", virtualNetworks);
683 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
684 }
685
Brian Stanke11f6d532016-07-05 16:17:59 -0400686 /**
687 * Tests the addTunnelId() method in the store with a null intent.
688 */
689 @Test(expected = NullPointerException.class)
690 public void testAddTunnelIdNullIntent() {
691 manager.store.addTunnelId(null, null);
692 }
693
694 /**
695 * Tests the removeTunnelId() method in the store with a null intent.
696 */
697 @Test(expected = NullPointerException.class)
698 public void testRemoveTunnelIdNullIntent() {
699 manager.store.removeTunnelId(null, null);
700 }
701
702 /**
703 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
704 */
705 @Test
706 public void testAddTunnelId() {
707 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
708 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
709 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
710 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
711
712 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
713 .networkId(virtualNetwork.id())
714 .key(Key.of("Test", APP_ID))
715 .appId(APP_ID)
716 .ingressPoint(cp1)
717 .egressPoint(cp2)
718 .build();
719
720 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
721 // Add the intent to tunnelID mapping to the store.
722 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800723 assertEquals("The tunnels size should match.", 1,
724 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400725
726 // Remove the intent to tunnelID mapping from the store.
727 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800728 assertTrue("The tunnels should be empty.",
729 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400730 }
731
Brian Stankefb61df42016-07-25 11:47:51 -0400732
733 /**
734 * Method to create the virtual network for further testing.
735 **/
736 private VirtualNetwork setupVirtualNetworkTopology() {
737 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800738 VirtualNetwork virtualNetwork =
739 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400740
741 VirtualDevice virtualDevice1 =
742 manager.createVirtualDevice(virtualNetwork.id(), DID1);
743 VirtualDevice virtualDevice2 =
744 manager.createVirtualDevice(virtualNetwork.id(), DID2);
745 VirtualDevice virtualDevice3 =
746 manager.createVirtualDevice(virtualNetwork.id(), DID3);
747 VirtualDevice virtualDevice4 =
748 manager.createVirtualDevice(virtualNetwork.id(), DID4);
749 VirtualDevice virtualDevice5 =
750 manager.createVirtualDevice(virtualNetwork.id(), DID5);
751
752 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
753 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700754 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400755
756 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
757 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700758 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400759
760 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
761 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700762 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400763
764 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
765 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700766 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400767
768 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
769 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700770 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400771
772 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
773 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700774 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400775
776 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
777 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700778 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400779
780 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
781 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700782 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400783
784 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
785 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700786 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400787
788 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
789 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
790 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
791 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
792 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
793 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
794 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
795 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
796 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
797 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
798 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
799 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
800
801 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800802 topologyProvider = new DefaultVirtualNetworkProvider();
803 try {
804 TestUtils.setField(topologyProvider, "topologyService", topologyService);
805 } catch (TestUtils.TestUtilsException e) {
806 e.printStackTrace();
807 }
808// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400809
810 return virtualNetwork;
811 }
812
813 /**
814 * Test the topologyChanged() method.
815 */
816 @Test
817 public void testTopologyChanged() {
818 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800819 VirtualNetworkProviderService providerService =
820 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400821
822 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800823 assertEquals("The cluster count did not match.", 2,
824 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400825
826 // Adding this link will join the two clusters together.
827 List<Event> reasons = new ArrayList<>();
828 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
829 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
830 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
831 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
832
833 Topology topology = topologyService.currentTopology();
834 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
835
836 // Validate that all links are still active.
837 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800838 assertTrue("The virtual link should be active.",
839 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400840 });
841
842 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
843 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
844 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
845
846 // Validate that all links are active again.
847 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800848 assertTrue("The virtual link should be active.",
849 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400850 });
851 }
852
Brian Stanke11f6d532016-07-05 16:17:59 -0400853 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500854 * Tests that the get() method returns saved service instances.
855 */
856 @Test
857 public void testServiceGetReturnsSavedInstance() {
858 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
859 VirtualNetwork virtualNetwork =
860 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
861
862 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
863 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
864 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
865 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
866 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
867 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
868
869 // extra setup needed for FlowRuleService, PacketService, GroupService
870 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
871 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
872 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
873 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
874 testDirectory.add(CoreService.class, coreService)
875 .add(VirtualProviderRegistryService.class, virtualProviderManager)
876 .add(EventDeliveryService.class, new TestEventDispatcher())
877 .add(ClusterService.class, new ClusterServiceAdapter())
878 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
879 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
yoonseon86bebed2017-02-03 15:23:57 -0800880 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore())
881 .add(VirtualNetworkFlowObjectiveStore.class, new SimpleVirtualFlowObjectiveStore());
Claudine Chiu9a18f492017-02-27 15:57:06 -0500882
883 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
Claudine Chiu1f036b82017-03-09 16:45:56 -0500884 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowObjectiveService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500885 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
886 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
887 }
888
889 /**
890 * Validates that the get() method returns saved service instances.
891 */
892 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
893 Class<T> serviceClass) {
894 T serviceInstanceFirst = manager.get(networkId, serviceClass);
895 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
896 assertSame(serviceClass.getSimpleName() +
897 ": Subsequent get should be same as the first one",
898 serviceInstanceFirst, serviceInstanceSubsequent);
899 }
900
901 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500902 * Method to validate that the actual versus expected virtual network events were
903 * received correctly.
904 *
905 * @param types expected virtual network events.
906 */
907 private void validateEvents(Enum... types) {
908 TestTools.assertAfter(100, () -> {
909 int i = 0;
910 assertEquals("wrong events received", types.length, listener.events.size());
911 for (Event event : listener.events) {
912 assertEquals("incorrect event type", types[i], event.type());
913 i++;
914 }
915 listener.events.clear();
916 });
917 }
918
919 /**
920 * Test listener class to receive virtual network events.
921 */
922 private static class TestListener implements VirtualNetworkListener {
923
Brian Stanke7a81b532016-06-14 15:43:51 -0400924 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500925
926 @Override
927 public void event(VirtualNetworkEvent event) {
928 events.add(event);
929 }
930
931 }
932
Brian Stanke5df14472016-03-11 19:34:38 -0500933 /**
934 * Core service test class.
935 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500936 private class TestCoreService extends CoreServiceAdapter {
937
938 @Override
939 public IdGenerator getIdGenerator(String topic) {
940 return new IdGenerator() {
941 private AtomicLong counter = new AtomicLong(0);
942
943 @Override
944 public long getNewId() {
945 return counter.getAndIncrement();
946 }
947 };
948 }
949 }
950}