blob: 202046ef66f02e1d23306b27579f3df154264f7a [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;
73import org.onosproject.net.intent.Intent;
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.IntentState;
76import org.onosproject.net.intent.Key;
77import org.onosproject.net.intent.MockIdGenerator;
78import org.onosproject.net.intent.TestableIntentService;
Claudine Chiu9a18f492017-02-27 15:57:06 -050079import org.onosproject.net.link.LinkService;
80import org.onosproject.net.packet.PacketService;
81import org.onosproject.net.topology.PathService;
Brian Stankefb61df42016-07-25 11:47:51 -040082import org.onosproject.net.topology.Topology;
83import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050084import org.onosproject.store.service.TestStorageService;
85
86import java.util.Collection;
87import java.util.List;
sangyun-han3c3e99e2017-02-08 15:30:53 +090088import java.util.ArrayList;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050089import java.util.Set;
sangyun-han3c3e99e2017-02-08 15:30:53 +090090import java.util.HashSet;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050091import java.util.concurrent.atomic.AtomicLong;
92
93import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040094import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050095
96/**
97 * Junit tests for VirtualNetworkManager.
98 */
sangyun-han3c3e99e2017-02-08 15:30:53 +090099public class VirtualNetworkManagerTest extends VirtualNetworkTestUtil {
Brian Stanke86914282016-05-25 15:36:50 -0400100 private final String tenantIdValue1 = "TENANT_ID1";
101 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500102
103 private VirtualNetworkManager manager;
yoonseon214963b2016-11-21 15:41:07 -0800104 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500105 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
106 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -0400107 private TestListener listener = new TestListener();
Brian Stanke11f6d532016-07-05 16:17:59 -0400108 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -0400109 private TopologyService topologyService;
Brian Stanke11f6d532016-07-05 16:17:59 -0400110 private IdGenerator idGenerator = new MockIdGenerator();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500111
Brian Stankefb61df42016-07-25 11:47:51 -0400112 private ConnectPoint cp6;
113 private ConnectPoint cp7;
114
yoonseonc6a69272017-01-12 18:22:20 -0800115 private TestServiceDirectory testDirectory;
116
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500117 @Before
118 public void setUp() throws Exception {
119 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Thomas Vachuska23235962017-02-03 11:44:15 -0800120 Intent.unbindIdGenerator(idGenerator);
Brian Stanke11f6d532016-07-05 16:17:59 -0400121 Intent.bindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500122
123 coreService = new TestCoreService();
yoonseonc6a69272017-01-12 18:22:20 -0800124 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon214963b2016-11-21 15:41:07 -0800125 TestUtils.setField(virtualNetworkManagerStore, "storageService",
126 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500127 virtualNetworkManagerStore.activate();
128
129 manager = new VirtualNetworkManager();
130 manager.store = virtualNetworkManagerStore;
131 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400132 manager.intentService = intentService;
yoonseon322c9c32016-12-07 16:47:02 -0800133 manager.coreService = coreService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500134 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800135
136 testDirectory = new TestServiceDirectory();
137 TestUtils.setField(manager, "serviceDirectory", testDirectory);
138
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500139 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500140 }
141
142 @After
143 public void tearDown() {
144 virtualNetworkManagerStore.deactivate();
145 manager.removeListener(listener);
146 manager.deactivate();
147 NetTestTools.injectEventDispatcher(manager, null);
Brian Stanke11f6d532016-07-05 16:17:59 -0400148 Intent.unbindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500149 }
150
151 /**
152 * Tests registering a null tenant id.
153 */
154 @Test(expected = NullPointerException.class)
155 public void testRegisterNullTenantId() {
156 manager.registerTenantId(null);
157 }
158
159 /**
160 * Tests registering/unregistering a tenant id.
161 */
162 @Test
163 public void testRegisterUnregisterTenantId() {
164 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
165 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
166 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
167 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
168 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
169
170 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
171 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
172 tenantIdCollection = manager.getTenantIds();
173 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
174
175 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800176 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
177 VirtualNetworkEvent.Type.TENANT_REGISTERED,
178 VirtualNetworkEvent.Type.TENANT_REGISTERED,
179 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500180 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
181 }
182
183 /**
184 * Tests adding a null virtual network.
185 */
186 @Test(expected = NullPointerException.class)
187 public void testCreateNullVirtualNetwork() {
188 manager.createVirtualNetwork(null);
189 }
190
191 /**
Claudine Chiu70e2db82017-05-04 09:53:11 -0400192 * Tests removal of a virtual network twice.
193 */
194 @Test(expected = IllegalStateException.class)
195 public void testRemoveVnetTwice() {
196 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
197 VirtualNetwork virtualNetwork =
198 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
199 manager.removeVirtualNetwork(virtualNetwork.id());
200 manager.removeVirtualNetwork(virtualNetwork.id());
201 }
202
203 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500204 * Tests add and remove of virtual networks.
205 */
206 @Test
207 public void testAddRemoveVirtualNetwork() {
208 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
209 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
210 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
211 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
212 assertNotNull("The virtual network set should not be null", virtualNetworks);
213 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
214
Brian Stanke5df14472016-03-11 19:34:38 -0500215 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500216 for (VirtualNetwork virtualNetwork : virtualNetworks) {
217 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500218 assertEquals("The expected virtual network size does not match",
219 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500220 }
221 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
222 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
223
Brian Stanke5df14472016-03-11 19:34:38 -0500224 // Create/remove a virtual network.
225 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
226 manager.removeVirtualNetwork(virtualNetwork.id());
227
228 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
229 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
230
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500231 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800232 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
233 VirtualNetworkEvent.Type.NETWORK_ADDED,
234 VirtualNetworkEvent.Type.NETWORK_ADDED,
235 VirtualNetworkEvent.Type.NETWORK_REMOVED,
236 VirtualNetworkEvent.Type.NETWORK_REMOVED,
237 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500238 VirtualNetworkEvent.Type.NETWORK_REMOVED);
239 }
240
241 /**
242 * Tests adding a null virtual device.
243 */
244 @Test(expected = NullPointerException.class)
245 public void testCreateNullVirtualDevice() {
246 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
247 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
248
249 manager.createVirtualDevice(virtualNetwork.id(), null);
250 }
251
252 /**
253 * Tests adding a virtual device where no virtual network exists.
254 */
255 @Test(expected = IllegalStateException.class)
256 public void testCreateVirtualDeviceWithNoNetwork() {
257 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800258 VirtualNetwork virtualNetwork =
259 new DefaultVirtualNetwork(NetworkId.NONE,
260 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500261
Brian Stanke7a81b532016-06-14 15:43:51 -0400262 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500263 }
264
265 /**
266 * Tests add and remove of virtual devices.
267 */
268 @Test
269 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500270 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
271
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500272 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500273 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800274 VirtualNetwork virtualNetwork1 =
275 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500276 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800277 VirtualNetwork virtualNetwork2 =
278 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500279 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400280 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500281 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400282 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500283 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500284
285 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
286 assertNotNull("The virtual device set should not be null", virtualDevices1);
287 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
288
289 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
290 assertNotNull("The virtual device set should not be null", virtualDevices2);
291 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
292
293 for (VirtualDevice virtualDevice : virtualDevices1) {
294 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500295 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
296 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500297 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
298 }
299 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
300 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
301
Brian Stanke5df14472016-03-11 19:34:38 -0500302 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400303 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500304 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500305 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500306 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500307 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
308 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
309
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500310 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500311 validateEvents((Enum[]) expectedEventTypes.toArray(
312 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500313 }
314
315 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900316 * Tests getting a collection of physical device identifier corresponding to
317 * the specified virtual device.
318 */
319 @Test
320 public void testGetPhysicalDevices() {
321 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
322 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
323
324 VirtualNetwork virtualNetwork1 =
325 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
326 VirtualNetwork virtualNetwork2 =
327 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
328
329 // two virtual device in first virtual network
330 VirtualDevice vDevice1InVnet1 =
331 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
332 VirtualDevice vDevice2InVnet1 =
333 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
334 // Two virtual device in second virtual network
335 VirtualDevice vDevice1InVnet2 =
336 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
337 VirtualDevice vDevice2InVnet2 =
338 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
339
340 // Connection Point from each physical device
341 // Virtual network 1
342 ConnectPoint cp1InVnet1 =
343 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
344 ConnectPoint cp2InVnet1 =
345 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
346 ConnectPoint cp3InVnet1 =
347 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
348 ConnectPoint cp4InVnet1 =
349 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
350 // Virtual network 2
351 ConnectPoint cp1InVnet2 =
352 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
353 ConnectPoint cp2InVnet2 =
354 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
355 ConnectPoint cp3InVnet2 =
356 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
357 ConnectPoint cp4InVnet2 =
358 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
359
360 // Make simple BigSwitch by mapping two phyDevice to one vDevice
361 // First vDevice in first virtual network
362 manager.createVirtualPort(virtualNetwork1.id(),
363 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
364 manager.createVirtualPort(virtualNetwork1.id(),
365 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
366 // Second vDevice in first virtual network
367 manager.createVirtualPort(virtualNetwork1.id(),
368 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
369 manager.createVirtualPort(virtualNetwork1.id(),
370 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
371 // First vDevice in second virtual network
372 manager.createVirtualPort(virtualNetwork2.id(),
373 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
374 manager.createVirtualPort(virtualNetwork2.id(),
375 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
376 // Second vDevice in second virtual network
377 manager.createVirtualPort(virtualNetwork2.id(),
378 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
379 manager.createVirtualPort(virtualNetwork2.id(),
380 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
381
382
383 Set<DeviceId> physicalDeviceSet;
384 Set<DeviceId> testSet = new HashSet<>();
385 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1);
386 testSet.add(PHYDID1);
387 testSet.add(PHYDID2);
388 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
389 physicalDeviceSet.clear();
390 testSet.clear();
391
392 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1);
393 testSet.add(PHYDID3);
394 testSet.add(PHYDID4);
395 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
396 physicalDeviceSet.clear();
397 testSet.clear();
398
399 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2);
400 testSet.add(PHYDID1);
401 testSet.add(PHYDID2);
402 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
403 physicalDeviceSet.clear();
404 testSet.clear();
405
406 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2);
407 testSet.add(PHYDID3);
408 testSet.add(PHYDID4);
409 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
410 physicalDeviceSet.clear();
411 testSet.clear();
412 }
413
414 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400415 * Tests adding a null virtual host.
416 */
417 @Test(expected = NullPointerException.class)
418 public void testCreateNullVirtualHost() {
419 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800420 VirtualNetwork virtualNetwork =
421 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400422
423 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
424 }
425
426 /**
427 * Tests adding a virtual host where no virtual network exists.
428 */
429 @Test(expected = IllegalStateException.class)
430 public void testCreateVirtualHostWithNoNetwork() {
431 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800432 VirtualNetwork virtualNetwork =
433 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400434
435 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
436 }
437
438 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800439 * Tests adding a virtual host where no virtual port exists.
440 */
441 @Test(expected = IllegalStateException.class)
442 public void testCreateVirtualHostWithNoVirtualPort() {
443 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
444 VirtualNetwork virtualNetwork1 =
445 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
446 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
447 }
448
449 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400450 * Tests add and remove of virtual hosts.
451 */
452 @Test
453 public void testAddRemoveVirtualHost() {
454 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800455 VirtualNetwork virtualNetwork1 =
456 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
457 VirtualNetwork virtualNetwork2 =
458 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800459
460 VirtualDevice virtualDevice1 =
461 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
462 VirtualDevice virtualDevice2 =
463 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
464
465 ConnectPoint hostCp1 = new ConnectPoint(DID1, P1);
466 ConnectPoint hostCp2 = new ConnectPoint(DID2, P2);
467 manager.createVirtualPort(virtualNetwork1.id(), hostCp1.deviceId(), hostCp1.port(),
468 new ConnectPoint(virtualDevice1.id(), hostCp1.port()));
469 manager.createVirtualPort(virtualNetwork2.id(), hostCp2.deviceId(), hostCp2.port(),
470 new ConnectPoint(virtualDevice2.id(), hostCp2.port()));
471
Brian Stanke7a81b532016-06-14 15:43:51 -0400472 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
473 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
474
475 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
476 assertNotNull("The virtual host set should not be null", virtualHosts1);
477 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
478
479 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
480 assertNotNull("The virtual host set should not be null", virtualHosts2);
481 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
482
483 for (VirtualHost virtualHost : virtualHosts1) {
484 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
485 // attempt to remove the same virtual host again.
486 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
487 }
488 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
489 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
490
491 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800492 VirtualHost virtualHost =
493 manager.createVirtualHost(virtualNetwork1.id(),
494 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400495 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
496 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
497 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
498 }
499
500 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500501 * Tests add and remove of virtual links.
502 */
503 @Test
504 public void testAddRemoveVirtualLink() {
505 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800506 VirtualNetwork virtualNetwork1 =
507 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500508 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400509 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500510 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400511 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500512 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400513 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700514 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400515
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500516 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400517 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700518 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400519
Brian Stanke9a108972016-04-11 15:25:17 -0400520 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
521 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500522
523 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
524 assertNotNull("The virtual link set should not be null", virtualLinks);
525 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
526
527 for (VirtualLink virtualLink : virtualLinks) {
528 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
529 // attempt to remove the same virtual link again.
530 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
531 }
532 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
533 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500534
535 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400536 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500537 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
538 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
539 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500540 }
541
542 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400543 * Tests adding the same virtual link twice.
544 */
545 @Test(expected = IllegalStateException.class)
546 public void testAddSameVirtualLink() {
547 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800548 VirtualNetwork virtualNetwork1 =
549 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400550 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400551 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400552 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400553 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400554 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400555 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700556 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400557
Brian Stanke9a108972016-04-11 15:25:17 -0400558 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400559 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700560 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400561
Brian Stanke9a108972016-04-11 15:25:17 -0400562 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
563 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
564 }
565
566 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500567 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500568 */
569 @Test
570 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500571 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
572
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500573 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500574 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800575 VirtualNetwork virtualNetwork1 =
576 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500577 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500578 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400579 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500580 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700581 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500582
yoonseon214963b2016-11-21 15:41:07 -0800583 manager.createVirtualPort(virtualNetwork1.id(),
584 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500585 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800586 manager.createVirtualPort(virtualNetwork1.id(),
587 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500588 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500589
Brian Stanke5df14472016-03-11 19:34:38 -0500590 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500591 assertNotNull("The virtual port set should not be null", virtualPorts);
592 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
593
594 for (VirtualPort virtualPort : virtualPorts) {
595 manager.removeVirtualPort(virtualNetwork1.id(),
596 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500597 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500598 // attempt to remove the same virtual port again.
599 manager.removeVirtualPort(virtualNetwork1.id(),
600 (DeviceId) virtualPort.element().id(), virtualPort.number());
601 }
Brian Stanke5df14472016-03-11 19:34:38 -0500602 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
603 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
604
605 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800606 VirtualPort virtualPort =
607 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700608 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500609 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
610
611 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
612 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
613 PortNumber.portNumber(1), newCp);
614 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
615
yoonseon214963b2016-11-21 15:41:07 -0800616 manager.removeVirtualPort(virtualNetwork1.id(),
617 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500618 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500619 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500620 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500621
622 // Validate that the events were all received in the correct order.
623 validateEvents((Enum[]) expectedEventTypes.toArray(
624 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500625 }
626
627 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800628 * Tests when a virtual element is removed, all the other elements depending on it are also removed.
629 */
630 @Test
631 public void testRemoveAllElements() {
632 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
633 VirtualNetwork virtualNetwork1 =
634 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
635 VirtualDevice virtualDevice1 =
636 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
637 VirtualDevice virtualDevice2 =
638 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
639 ConnectPoint src = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
640 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
641 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
642
643 ConnectPoint dst = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(2));
644 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
645 new ConnectPoint(PHYDID2, PortNumber.portNumber(2)));
646
647 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
648 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
649
650 ConnectPoint hostCp = new ConnectPoint(DID1, P1);
651 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
652 new ConnectPoint(PHYDID1, P1));
653 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
654
655 //When a virtual port is removed, all virtual links connected to it should also be removed.
656 manager.removeVirtualPort(virtualNetwork1.id(), DID1, PortNumber.portNumber(1));
657 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
658 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
659
660 //When a virtual port is removed, all virtual hosts located to it should also be removed.
661 manager.removeVirtualPort(virtualNetwork1.id(), DID1, P1);
662 Set<VirtualHost> virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
663 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
664
665 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
666 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
667 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
668 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
669 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
670 new ConnectPoint(PHYDID1, P1));
671 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
672
673 //When a virtual device is removed, all virtual ports, hosts and links depended on it should also be removed.
674 manager.removeVirtualDevice(virtualNetwork1.id(), DID1);
675 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), DID1);
676 assertTrue("The virtual port set of DID1 should be empty", virtualPorts.isEmpty());
677 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
678 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
679 virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
680 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
681
682 //When a tenantId is removed, all the virtual networks belonging to it should also be removed.
683 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
684 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
685 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
686 assertNotNull("The virtual network set should not be null", virtualNetworks);
687 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
688 }
689
690
691 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400692 * Tests the addOrUpdateIntent() method in the store with a null intent.
693 */
694 @Test(expected = NullPointerException.class)
695 public void testAddOrUpdateNullIntent() {
696 manager.store.addOrUpdateIntent(null, null);
697 }
698
699 /**
700 * Tests the removeIntent() method in the store with a null intent key.
701 */
702 @Test(expected = NullPointerException.class)
703 public void testRemoveNullIntentKey() {
704 manager.store.removeIntent(null);
705 }
706
707 /**
708 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
709 */
710 @Test
711 public void testAddOrUpdateIntent() {
712 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800713 VirtualNetwork virtualNetwork =
714 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke11f6d532016-07-05 16:17:59 -0400715 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
716 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
717
718 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
719 .networkId(virtualNetwork.id())
720 .key(Key.of("Test", APP_ID))
721 .appId(APP_ID)
722 .ingressPoint(cp1)
723 .egressPoint(cp2)
724 .build();
725
726 // Add the intent to the store.
727 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
yoonseon214963b2016-11-21 15:41:07 -0800728 assertEquals("The intent size should match.", 1,
729 manager.store.getIntents().size());
730 assertNotNull("The intent should not be null.",
731 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400732
733 // remove the intent from the store.
734 manager.store.removeIntent(virtualIntent.key());
yoonseon214963b2016-11-21 15:41:07 -0800735 assertTrue("The intents should be empty.",
736 manager.store.getIntents().isEmpty());
737 assertNull("The intent should be null.",
738 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400739 }
740
741 /**
742 * Tests the addTunnelId() method in the store with a null intent.
743 */
744 @Test(expected = NullPointerException.class)
745 public void testAddTunnelIdNullIntent() {
746 manager.store.addTunnelId(null, null);
747 }
748
749 /**
750 * Tests the removeTunnelId() method in the store with a null intent.
751 */
752 @Test(expected = NullPointerException.class)
753 public void testRemoveTunnelIdNullIntent() {
754 manager.store.removeTunnelId(null, null);
755 }
756
757 /**
758 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
759 */
760 @Test
761 public void testAddTunnelId() {
762 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
763 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
764 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
765 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
766
767 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
768 .networkId(virtualNetwork.id())
769 .key(Key.of("Test", APP_ID))
770 .appId(APP_ID)
771 .ingressPoint(cp1)
772 .egressPoint(cp2)
773 .build();
774
775 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
776 // Add the intent to tunnelID mapping to the store.
777 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800778 assertEquals("The tunnels size should match.", 1,
779 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400780
781 // Remove the intent to tunnelID mapping from the store.
782 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800783 assertTrue("The tunnels should be empty.",
784 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400785 }
786
Brian Stankefb61df42016-07-25 11:47:51 -0400787
788 /**
789 * Method to create the virtual network for further testing.
790 **/
791 private VirtualNetwork setupVirtualNetworkTopology() {
792 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800793 VirtualNetwork virtualNetwork =
794 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400795
796 VirtualDevice virtualDevice1 =
797 manager.createVirtualDevice(virtualNetwork.id(), DID1);
798 VirtualDevice virtualDevice2 =
799 manager.createVirtualDevice(virtualNetwork.id(), DID2);
800 VirtualDevice virtualDevice3 =
801 manager.createVirtualDevice(virtualNetwork.id(), DID3);
802 VirtualDevice virtualDevice4 =
803 manager.createVirtualDevice(virtualNetwork.id(), DID4);
804 VirtualDevice virtualDevice5 =
805 manager.createVirtualDevice(virtualNetwork.id(), DID5);
806
807 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
808 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700809 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400810
811 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
812 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700813 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400814
815 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
816 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700817 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400818
819 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
820 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700821 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400822
823 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
824 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700825 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400826
827 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
828 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700829 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400830
831 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
832 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700833 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400834
835 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
836 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700837 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400838
839 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
840 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700841 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400842
843 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
844 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
845 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
846 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
847 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
848 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
849 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
850 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
851 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
852 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
853 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
854 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
855
856 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800857 topologyProvider = new DefaultVirtualNetworkProvider();
858 try {
859 TestUtils.setField(topologyProvider, "topologyService", topologyService);
860 } catch (TestUtils.TestUtilsException e) {
861 e.printStackTrace();
862 }
863// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400864
865 return virtualNetwork;
866 }
867
868 /**
869 * Test the topologyChanged() method.
870 */
871 @Test
872 public void testTopologyChanged() {
873 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800874 VirtualNetworkProviderService providerService =
875 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400876
877 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800878 assertEquals("The cluster count did not match.", 2,
879 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400880
881 // Adding this link will join the two clusters together.
882 List<Event> reasons = new ArrayList<>();
883 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
884 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
885 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
886 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
887
888 Topology topology = topologyService.currentTopology();
889 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
890
891 // Validate that all links are still active.
892 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800893 assertTrue("The virtual link should be active.",
894 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400895 });
896
897 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
898 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
899 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
900
901 // Validate that all links are active again.
902 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800903 assertTrue("The virtual link should be active.",
904 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400905 });
906 }
907
Brian Stanke11f6d532016-07-05 16:17:59 -0400908 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500909 * Tests that the get() method returns saved service instances.
910 */
911 @Test
912 public void testServiceGetReturnsSavedInstance() {
913 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
914 VirtualNetwork virtualNetwork =
915 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
916
917 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
918 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
919 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
920 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
921 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
922 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
923
924 // extra setup needed for FlowRuleService, PacketService, GroupService
925 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
926 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
927 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
928 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
929 testDirectory.add(CoreService.class, coreService)
930 .add(VirtualProviderRegistryService.class, virtualProviderManager)
931 .add(EventDeliveryService.class, new TestEventDispatcher())
932 .add(ClusterService.class, new ClusterServiceAdapter())
933 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
934 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
yoonseon86bebed2017-02-03 15:23:57 -0800935 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore())
936 .add(VirtualNetworkFlowObjectiveStore.class, new SimpleVirtualFlowObjectiveStore());
Claudine Chiu9a18f492017-02-27 15:57:06 -0500937
938 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
Claudine Chiu1f036b82017-03-09 16:45:56 -0500939 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowObjectiveService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500940 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
941 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
942 }
943
944 /**
945 * Validates that the get() method returns saved service instances.
946 */
947 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
948 Class<T> serviceClass) {
949 T serviceInstanceFirst = manager.get(networkId, serviceClass);
950 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
951 assertSame(serviceClass.getSimpleName() +
952 ": Subsequent get should be same as the first one",
953 serviceInstanceFirst, serviceInstanceSubsequent);
954 }
955
956 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500957 * Method to validate that the actual versus expected virtual network events were
958 * received correctly.
959 *
960 * @param types expected virtual network events.
961 */
962 private void validateEvents(Enum... types) {
963 TestTools.assertAfter(100, () -> {
964 int i = 0;
965 assertEquals("wrong events received", types.length, listener.events.size());
966 for (Event event : listener.events) {
967 assertEquals("incorrect event type", types[i], event.type());
968 i++;
969 }
970 listener.events.clear();
971 });
972 }
973
974 /**
975 * Test listener class to receive virtual network events.
976 */
977 private static class TestListener implements VirtualNetworkListener {
978
Brian Stanke7a81b532016-06-14 15:43:51 -0400979 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500980
981 @Override
982 public void event(VirtualNetworkEvent event) {
983 events.add(event);
984 }
985
986 }
987
Brian Stanke5df14472016-03-11 19:34:38 -0500988 /**
989 * Core service test class.
990 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500991 private class TestCoreService extends CoreServiceAdapter {
992
993 @Override
994 public IdGenerator getIdGenerator(String topic) {
995 return new IdGenerator() {
996 private AtomicLong counter = new AtomicLong(0);
997
998 @Override
999 public long getNewId() {
1000 return counter.getAndIncrement();
1001 }
1002 };
1003 }
1004 }
1005}