blob: 765b4cb71ab2ca0db9e3ac5e0dc120b4f8d78d70 [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.IntentState;
75import org.onosproject.net.intent.Key;
76import org.onosproject.net.intent.MockIdGenerator;
77import org.onosproject.net.intent.TestableIntentService;
Claudine Chiu9a18f492017-02-27 15:57:06 -050078import org.onosproject.net.link.LinkService;
79import org.onosproject.net.packet.PacketService;
80import org.onosproject.net.topology.PathService;
Brian Stankefb61df42016-07-25 11:47:51 -040081import org.onosproject.net.topology.Topology;
82import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050083import org.onosproject.store.service.TestStorageService;
84
sangyun-han3c3e99e2017-02-08 15:30:53 +090085import java.util.ArrayList;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070086import java.util.Collection;
sangyun-han3c3e99e2017-02-08 15:30:53 +090087import java.util.HashSet;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070088import java.util.List;
89import java.util.Set;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050090import java.util.concurrent.atomic.AtomicLong;
91
92import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040093import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050094
95/**
96 * Junit tests for VirtualNetworkManager.
97 */
sangyun-han3c3e99e2017-02-08 15:30:53 +090098public class VirtualNetworkManagerTest extends VirtualNetworkTestUtil {
Brian Stanke86914282016-05-25 15:36:50 -040099 private final String tenantIdValue1 = "TENANT_ID1";
100 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500101
102 private VirtualNetworkManager manager;
yoonseon214963b2016-11-21 15:41:07 -0800103 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500104 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
105 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -0400106 private TestListener listener = new TestListener();
Brian Stanke11f6d532016-07-05 16:17:59 -0400107 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -0400108 private TopologyService topologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500109
Brian Stankefb61df42016-07-25 11:47:51 -0400110 private ConnectPoint cp6;
111 private ConnectPoint cp7;
112
yoonseonc6a69272017-01-12 18:22:20 -0800113 private TestServiceDirectory testDirectory;
114
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500115 @Before
116 public void setUp() throws Exception {
117 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700118 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500119
120 coreService = new TestCoreService();
yoonseonc6a69272017-01-12 18:22:20 -0800121 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon214963b2016-11-21 15:41:07 -0800122 TestUtils.setField(virtualNetworkManagerStore, "storageService",
123 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500124 virtualNetworkManagerStore.activate();
125
126 manager = new VirtualNetworkManager();
127 manager.store = virtualNetworkManagerStore;
128 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400129 manager.intentService = intentService;
yoonseon322c9c32016-12-07 16:47:02 -0800130 manager.coreService = coreService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500131 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800132
133 testDirectory = new TestServiceDirectory();
134 TestUtils.setField(manager, "serviceDirectory", testDirectory);
135
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500136 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500137 }
138
139 @After
140 public void tearDown() {
141 virtualNetworkManagerStore.deactivate();
142 manager.removeListener(listener);
143 manager.deactivate();
144 NetTestTools.injectEventDispatcher(manager, null);
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700145 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500146 }
147
148 /**
149 * Tests registering a null tenant id.
150 */
151 @Test(expected = NullPointerException.class)
152 public void testRegisterNullTenantId() {
153 manager.registerTenantId(null);
154 }
155
156 /**
157 * Tests registering/unregistering a tenant id.
158 */
159 @Test
160 public void testRegisterUnregisterTenantId() {
161 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
162 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
163 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
164 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
165 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
166
167 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
168 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
169 tenantIdCollection = manager.getTenantIds();
170 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
171
172 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800173 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
174 VirtualNetworkEvent.Type.TENANT_REGISTERED,
175 VirtualNetworkEvent.Type.TENANT_REGISTERED,
176 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500177 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
178 }
179
180 /**
181 * Tests adding a null virtual network.
182 */
183 @Test(expected = NullPointerException.class)
184 public void testCreateNullVirtualNetwork() {
185 manager.createVirtualNetwork(null);
186 }
187
188 /**
Claudine Chiu70e2db82017-05-04 09:53:11 -0400189 * Tests removal of a virtual network twice.
190 */
191 @Test(expected = IllegalStateException.class)
192 public void testRemoveVnetTwice() {
193 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
194 VirtualNetwork virtualNetwork =
195 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
196 manager.removeVirtualNetwork(virtualNetwork.id());
197 manager.removeVirtualNetwork(virtualNetwork.id());
198 }
199
200 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500201 * Tests add and remove of virtual networks.
202 */
203 @Test
204 public void testAddRemoveVirtualNetwork() {
205 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
206 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
207 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
208 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
209 assertNotNull("The virtual network set should not be null", virtualNetworks);
210 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
211
Brian Stanke5df14472016-03-11 19:34:38 -0500212 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500213 for (VirtualNetwork virtualNetwork : virtualNetworks) {
214 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500215 assertEquals("The expected virtual network size does not match",
216 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500217 }
218 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
219 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
220
Brian Stanke5df14472016-03-11 19:34:38 -0500221 // Create/remove a virtual network.
222 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
223 manager.removeVirtualNetwork(virtualNetwork.id());
224
225 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
226 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
227
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500228 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800229 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
230 VirtualNetworkEvent.Type.NETWORK_ADDED,
231 VirtualNetworkEvent.Type.NETWORK_ADDED,
232 VirtualNetworkEvent.Type.NETWORK_REMOVED,
233 VirtualNetworkEvent.Type.NETWORK_REMOVED,
234 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500235 VirtualNetworkEvent.Type.NETWORK_REMOVED);
236 }
237
238 /**
239 * Tests adding a null virtual device.
240 */
241 @Test(expected = NullPointerException.class)
242 public void testCreateNullVirtualDevice() {
243 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
244 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
245
246 manager.createVirtualDevice(virtualNetwork.id(), null);
247 }
248
249 /**
250 * Tests adding a virtual device where no virtual network exists.
251 */
252 @Test(expected = IllegalStateException.class)
253 public void testCreateVirtualDeviceWithNoNetwork() {
254 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800255 VirtualNetwork virtualNetwork =
256 new DefaultVirtualNetwork(NetworkId.NONE,
257 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500258
Brian Stanke7a81b532016-06-14 15:43:51 -0400259 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500260 }
261
262 /**
263 * Tests add and remove of virtual devices.
264 */
265 @Test
266 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500267 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
268
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500269 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500270 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800271 VirtualNetwork virtualNetwork1 =
272 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500273 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800274 VirtualNetwork virtualNetwork2 =
275 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500276 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400277 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500278 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400279 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500280 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500281
282 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
283 assertNotNull("The virtual device set should not be null", virtualDevices1);
284 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
285
286 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
287 assertNotNull("The virtual device set should not be null", virtualDevices2);
288 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
289
290 for (VirtualDevice virtualDevice : virtualDevices1) {
291 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500292 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
293 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500294 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
295 }
296 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
297 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
298
Brian Stanke5df14472016-03-11 19:34:38 -0500299 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400300 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500301 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500302 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500303 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500304 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
305 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
306
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500307 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500308 validateEvents((Enum[]) expectedEventTypes.toArray(
309 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500310 }
311
312 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900313 * Tests getting a collection of physical device identifier corresponding to
314 * the specified virtual device.
315 */
316 @Test
317 public void testGetPhysicalDevices() {
318 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
319 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
320
321 VirtualNetwork virtualNetwork1 =
322 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
323 VirtualNetwork virtualNetwork2 =
324 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
325
326 // two virtual device in first virtual network
327 VirtualDevice vDevice1InVnet1 =
328 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
329 VirtualDevice vDevice2InVnet1 =
330 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
331 // Two virtual device in second virtual network
332 VirtualDevice vDevice1InVnet2 =
333 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
334 VirtualDevice vDevice2InVnet2 =
335 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
336
337 // Connection Point from each physical device
338 // Virtual network 1
339 ConnectPoint cp1InVnet1 =
340 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
341 ConnectPoint cp2InVnet1 =
342 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
343 ConnectPoint cp3InVnet1 =
344 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
345 ConnectPoint cp4InVnet1 =
346 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
347 // Virtual network 2
348 ConnectPoint cp1InVnet2 =
349 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
350 ConnectPoint cp2InVnet2 =
351 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
352 ConnectPoint cp3InVnet2 =
353 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
354 ConnectPoint cp4InVnet2 =
355 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
356
357 // Make simple BigSwitch by mapping two phyDevice to one vDevice
358 // First vDevice in first virtual network
359 manager.createVirtualPort(virtualNetwork1.id(),
360 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
361 manager.createVirtualPort(virtualNetwork1.id(),
362 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
363 // Second vDevice in first virtual network
364 manager.createVirtualPort(virtualNetwork1.id(),
365 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
366 manager.createVirtualPort(virtualNetwork1.id(),
367 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
368 // First vDevice in second virtual network
369 manager.createVirtualPort(virtualNetwork2.id(),
370 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
371 manager.createVirtualPort(virtualNetwork2.id(),
372 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
373 // Second vDevice in second virtual network
374 manager.createVirtualPort(virtualNetwork2.id(),
375 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
376 manager.createVirtualPort(virtualNetwork2.id(),
377 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
378
379
380 Set<DeviceId> physicalDeviceSet;
381 Set<DeviceId> testSet = new HashSet<>();
382 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1);
383 testSet.add(PHYDID1);
384 testSet.add(PHYDID2);
385 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
386 physicalDeviceSet.clear();
387 testSet.clear();
388
389 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1);
390 testSet.add(PHYDID3);
391 testSet.add(PHYDID4);
392 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
393 physicalDeviceSet.clear();
394 testSet.clear();
395
396 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2);
397 testSet.add(PHYDID1);
398 testSet.add(PHYDID2);
399 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
400 physicalDeviceSet.clear();
401 testSet.clear();
402
403 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2);
404 testSet.add(PHYDID3);
405 testSet.add(PHYDID4);
406 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
407 physicalDeviceSet.clear();
408 testSet.clear();
409 }
410
411 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400412 * Tests adding a null virtual host.
413 */
414 @Test(expected = NullPointerException.class)
415 public void testCreateNullVirtualHost() {
416 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800417 VirtualNetwork virtualNetwork =
418 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400419
420 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
421 }
422
423 /**
424 * Tests adding a virtual host where no virtual network exists.
425 */
426 @Test(expected = IllegalStateException.class)
427 public void testCreateVirtualHostWithNoNetwork() {
428 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800429 VirtualNetwork virtualNetwork =
430 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400431
432 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
433 }
434
435 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800436 * Tests adding a virtual host where no virtual port exists.
437 */
438 @Test(expected = IllegalStateException.class)
439 public void testCreateVirtualHostWithNoVirtualPort() {
440 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
441 VirtualNetwork virtualNetwork1 =
442 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
443 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
444 }
445
446 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400447 * Tests add and remove of virtual hosts.
448 */
449 @Test
450 public void testAddRemoveVirtualHost() {
451 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800452 VirtualNetwork virtualNetwork1 =
453 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
454 VirtualNetwork virtualNetwork2 =
455 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800456
457 VirtualDevice virtualDevice1 =
458 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
459 VirtualDevice virtualDevice2 =
460 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
461
462 ConnectPoint hostCp1 = new ConnectPoint(DID1, P1);
463 ConnectPoint hostCp2 = new ConnectPoint(DID2, P2);
464 manager.createVirtualPort(virtualNetwork1.id(), hostCp1.deviceId(), hostCp1.port(),
465 new ConnectPoint(virtualDevice1.id(), hostCp1.port()));
466 manager.createVirtualPort(virtualNetwork2.id(), hostCp2.deviceId(), hostCp2.port(),
467 new ConnectPoint(virtualDevice2.id(), hostCp2.port()));
468
Brian Stanke7a81b532016-06-14 15:43:51 -0400469 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
470 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
471
472 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
473 assertNotNull("The virtual host set should not be null", virtualHosts1);
474 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
475
476 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
477 assertNotNull("The virtual host set should not be null", virtualHosts2);
478 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
479
480 for (VirtualHost virtualHost : virtualHosts1) {
481 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
482 // attempt to remove the same virtual host again.
483 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
484 }
485 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
486 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
487
488 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800489 VirtualHost virtualHost =
490 manager.createVirtualHost(virtualNetwork1.id(),
491 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400492 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
493 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
494 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
495 }
496
497 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500498 * Tests add and remove of virtual links.
499 */
500 @Test
501 public void testAddRemoveVirtualLink() {
502 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800503 VirtualNetwork virtualNetwork1 =
504 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500505 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400506 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500507 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400508 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500509 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400510 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700511 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400512
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500513 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400514 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700515 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400516
Brian Stanke9a108972016-04-11 15:25:17 -0400517 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
518 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500519
520 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
521 assertNotNull("The virtual link set should not be null", virtualLinks);
522 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
523
524 for (VirtualLink virtualLink : virtualLinks) {
525 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
526 // attempt to remove the same virtual link again.
527 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
528 }
529 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
530 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500531
532 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400533 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500534 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
535 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
536 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500537 }
538
539 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400540 * Tests adding the same virtual link twice.
541 */
542 @Test(expected = IllegalStateException.class)
543 public void testAddSameVirtualLink() {
544 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800545 VirtualNetwork virtualNetwork1 =
546 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400547 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400548 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400549 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400550 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400551 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400552 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700553 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400554
Brian Stanke9a108972016-04-11 15:25:17 -0400555 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400556 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700557 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400558
Brian Stanke9a108972016-04-11 15:25:17 -0400559 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
560 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
561 }
562
563 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500564 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500565 */
566 @Test
567 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500568 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
569
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500570 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500571 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800572 VirtualNetwork virtualNetwork1 =
573 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500574 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500575 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400576 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500577 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700578 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500579
yoonseon214963b2016-11-21 15:41:07 -0800580 manager.createVirtualPort(virtualNetwork1.id(),
581 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500582 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800583 manager.createVirtualPort(virtualNetwork1.id(),
584 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500585 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500586
Brian Stanke5df14472016-03-11 19:34:38 -0500587 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500588 assertNotNull("The virtual port set should not be null", virtualPorts);
589 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
590
591 for (VirtualPort virtualPort : virtualPorts) {
592 manager.removeVirtualPort(virtualNetwork1.id(),
593 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500594 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500595 // attempt to remove the same virtual port again.
596 manager.removeVirtualPort(virtualNetwork1.id(),
597 (DeviceId) virtualPort.element().id(), virtualPort.number());
598 }
Brian Stanke5df14472016-03-11 19:34:38 -0500599 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
600 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
601
602 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800603 VirtualPort virtualPort =
604 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700605 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500606 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
607
608 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
609 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
610 PortNumber.portNumber(1), newCp);
611 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
612
yoonseon214963b2016-11-21 15:41:07 -0800613 manager.removeVirtualPort(virtualNetwork1.id(),
614 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500615 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500616 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500617 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500618
619 // Validate that the events were all received in the correct order.
620 validateEvents((Enum[]) expectedEventTypes.toArray(
621 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500622 }
623
624 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800625 * Tests when a virtual element is removed, all the other elements depending on it are also removed.
626 */
627 @Test
628 public void testRemoveAllElements() {
629 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
630 VirtualNetwork virtualNetwork1 =
631 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
632 VirtualDevice virtualDevice1 =
633 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
634 VirtualDevice virtualDevice2 =
635 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
636 ConnectPoint src = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
637 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
638 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
639
640 ConnectPoint dst = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(2));
641 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
642 new ConnectPoint(PHYDID2, PortNumber.portNumber(2)));
643
644 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
645 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
646
647 ConnectPoint hostCp = new ConnectPoint(DID1, P1);
648 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
649 new ConnectPoint(PHYDID1, P1));
650 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
651
652 //When a virtual port is removed, all virtual links connected to it should also be removed.
653 manager.removeVirtualPort(virtualNetwork1.id(), DID1, PortNumber.portNumber(1));
654 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
655 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
656
657 //When a virtual port is removed, all virtual hosts located to it should also be removed.
658 manager.removeVirtualPort(virtualNetwork1.id(), DID1, P1);
659 Set<VirtualHost> virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
660 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
661
662 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
663 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
664 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
665 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
666 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
667 new ConnectPoint(PHYDID1, P1));
668 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
669
670 //When a virtual device is removed, all virtual ports, hosts and links depended on it should also be removed.
671 manager.removeVirtualDevice(virtualNetwork1.id(), DID1);
672 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), DID1);
673 assertTrue("The virtual port set of DID1 should be empty", virtualPorts.isEmpty());
674 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
675 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
676 virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
677 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
678
679 //When a tenantId is removed, all the virtual networks belonging to it should also be removed.
680 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
681 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
682 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
683 assertNotNull("The virtual network set should not be null", virtualNetworks);
684 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
685 }
686
687
688 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400689 * Tests the addOrUpdateIntent() method in the store with a null intent.
690 */
691 @Test(expected = NullPointerException.class)
692 public void testAddOrUpdateNullIntent() {
693 manager.store.addOrUpdateIntent(null, null);
694 }
695
696 /**
697 * Tests the removeIntent() method in the store with a null intent key.
698 */
699 @Test(expected = NullPointerException.class)
700 public void testRemoveNullIntentKey() {
701 manager.store.removeIntent(null);
702 }
703
704 /**
705 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
706 */
707 @Test
708 public void testAddOrUpdateIntent() {
709 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800710 VirtualNetwork virtualNetwork =
711 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke11f6d532016-07-05 16:17:59 -0400712 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
713 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
714
715 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
716 .networkId(virtualNetwork.id())
717 .key(Key.of("Test", APP_ID))
718 .appId(APP_ID)
719 .ingressPoint(cp1)
720 .egressPoint(cp2)
721 .build();
722
723 // Add the intent to the store.
724 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
yoonseon214963b2016-11-21 15:41:07 -0800725 assertEquals("The intent size should match.", 1,
726 manager.store.getIntents().size());
727 assertNotNull("The intent should not be null.",
728 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400729
730 // remove the intent from the store.
731 manager.store.removeIntent(virtualIntent.key());
yoonseon214963b2016-11-21 15:41:07 -0800732 assertTrue("The intents should be empty.",
733 manager.store.getIntents().isEmpty());
734 assertNull("The intent should be null.",
735 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400736 }
737
738 /**
739 * Tests the addTunnelId() method in the store with a null intent.
740 */
741 @Test(expected = NullPointerException.class)
742 public void testAddTunnelIdNullIntent() {
743 manager.store.addTunnelId(null, null);
744 }
745
746 /**
747 * Tests the removeTunnelId() method in the store with a null intent.
748 */
749 @Test(expected = NullPointerException.class)
750 public void testRemoveTunnelIdNullIntent() {
751 manager.store.removeTunnelId(null, null);
752 }
753
754 /**
755 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
756 */
757 @Test
758 public void testAddTunnelId() {
759 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
760 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
761 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
762 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
763
764 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
765 .networkId(virtualNetwork.id())
766 .key(Key.of("Test", APP_ID))
767 .appId(APP_ID)
768 .ingressPoint(cp1)
769 .egressPoint(cp2)
770 .build();
771
772 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
773 // Add the intent to tunnelID mapping to the store.
774 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800775 assertEquals("The tunnels size should match.", 1,
776 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400777
778 // Remove the intent to tunnelID mapping from the store.
779 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800780 assertTrue("The tunnels should be empty.",
781 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400782 }
783
Brian Stankefb61df42016-07-25 11:47:51 -0400784
785 /**
786 * Method to create the virtual network for further testing.
787 **/
788 private VirtualNetwork setupVirtualNetworkTopology() {
789 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800790 VirtualNetwork virtualNetwork =
791 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400792
793 VirtualDevice virtualDevice1 =
794 manager.createVirtualDevice(virtualNetwork.id(), DID1);
795 VirtualDevice virtualDevice2 =
796 manager.createVirtualDevice(virtualNetwork.id(), DID2);
797 VirtualDevice virtualDevice3 =
798 manager.createVirtualDevice(virtualNetwork.id(), DID3);
799 VirtualDevice virtualDevice4 =
800 manager.createVirtualDevice(virtualNetwork.id(), DID4);
801 VirtualDevice virtualDevice5 =
802 manager.createVirtualDevice(virtualNetwork.id(), DID5);
803
804 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
805 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700806 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400807
808 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
809 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700810 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400811
812 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
813 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700814 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400815
816 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
817 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700818 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400819
820 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
821 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700822 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400823
824 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
825 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700826 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400827
828 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
829 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700830 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400831
832 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
833 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700834 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400835
836 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
837 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700838 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400839
840 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
841 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
842 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
843 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
844 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
845 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
846 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
847 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
848 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
849 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
850 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
851 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
852
853 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800854 topologyProvider = new DefaultVirtualNetworkProvider();
855 try {
856 TestUtils.setField(topologyProvider, "topologyService", topologyService);
857 } catch (TestUtils.TestUtilsException e) {
858 e.printStackTrace();
859 }
860// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400861
862 return virtualNetwork;
863 }
864
865 /**
866 * Test the topologyChanged() method.
867 */
868 @Test
869 public void testTopologyChanged() {
870 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800871 VirtualNetworkProviderService providerService =
872 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400873
874 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800875 assertEquals("The cluster count did not match.", 2,
876 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400877
878 // Adding this link will join the two clusters together.
879 List<Event> reasons = new ArrayList<>();
880 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
881 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
882 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
883 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
884
885 Topology topology = topologyService.currentTopology();
886 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
887
888 // Validate that all links are still active.
889 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800890 assertTrue("The virtual link should be active.",
891 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400892 });
893
894 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
895 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
896 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
897
898 // Validate that all links are active again.
899 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800900 assertTrue("The virtual link should be active.",
901 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400902 });
903 }
904
Brian Stanke11f6d532016-07-05 16:17:59 -0400905 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500906 * Tests that the get() method returns saved service instances.
907 */
908 @Test
909 public void testServiceGetReturnsSavedInstance() {
910 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
911 VirtualNetwork virtualNetwork =
912 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
913
914 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
915 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
916 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
917 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
918 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
919 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
920
921 // extra setup needed for FlowRuleService, PacketService, GroupService
922 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
923 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
924 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
925 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
926 testDirectory.add(CoreService.class, coreService)
927 .add(VirtualProviderRegistryService.class, virtualProviderManager)
928 .add(EventDeliveryService.class, new TestEventDispatcher())
929 .add(ClusterService.class, new ClusterServiceAdapter())
930 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
931 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
yoonseon86bebed2017-02-03 15:23:57 -0800932 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore())
933 .add(VirtualNetworkFlowObjectiveStore.class, new SimpleVirtualFlowObjectiveStore());
Claudine Chiu9a18f492017-02-27 15:57:06 -0500934
935 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
Claudine Chiu1f036b82017-03-09 16:45:56 -0500936 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowObjectiveService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500937 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
938 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
939 }
940
941 /**
942 * Validates that the get() method returns saved service instances.
943 */
944 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
945 Class<T> serviceClass) {
946 T serviceInstanceFirst = manager.get(networkId, serviceClass);
947 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
948 assertSame(serviceClass.getSimpleName() +
949 ": Subsequent get should be same as the first one",
950 serviceInstanceFirst, serviceInstanceSubsequent);
951 }
952
953 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500954 * Method to validate that the actual versus expected virtual network events were
955 * received correctly.
956 *
957 * @param types expected virtual network events.
958 */
959 private void validateEvents(Enum... types) {
960 TestTools.assertAfter(100, () -> {
961 int i = 0;
962 assertEquals("wrong events received", types.length, listener.events.size());
963 for (Event event : listener.events) {
964 assertEquals("incorrect event type", types[i], event.type());
965 i++;
966 }
967 listener.events.clear();
968 });
969 }
970
971 /**
972 * Test listener class to receive virtual network events.
973 */
974 private static class TestListener implements VirtualNetworkListener {
975
Brian Stanke7a81b532016-06-14 15:43:51 -0400976 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500977
978 @Override
979 public void event(VirtualNetworkEvent event) {
980 events.add(event);
981 }
982
983 }
984
Brian Stanke5df14472016-03-11 19:34:38 -0500985 /**
986 * Core service test class.
987 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500988 private class TestCoreService extends CoreServiceAdapter {
989
990 @Override
991 public IdGenerator getIdGenerator(String topic) {
992 return new IdGenerator() {
993 private AtomicLong counter = new AtomicLong(0);
994
995 @Override
996 public long getNewId() {
997 return counter.getAndIncrement();
998 }
999 };
1000 }
1001 }
1002}