blob: 46b717ede5121e0ce8cbb4e07adb137102f60d1c [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;
69import org.onosproject.net.group.GroupService;
70import org.onosproject.net.host.HostService;
Brian Stanke11f6d532016-07-05 16:17:59 -040071import org.onosproject.net.intent.FakeIntentManager;
72import org.onosproject.net.intent.Intent;
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
85import java.util.Collection;
86import java.util.List;
sangyun-han3c3e99e2017-02-08 15:30:53 +090087import java.util.ArrayList;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050088import java.util.Set;
sangyun-han3c3e99e2017-02-08 15:30:53 +090089import java.util.HashSet;
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 Stanke11f6d532016-07-05 16:17:59 -0400109 private IdGenerator idGenerator = new MockIdGenerator();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500110
Brian Stankefb61df42016-07-25 11:47:51 -0400111 private ConnectPoint cp6;
112 private ConnectPoint cp7;
113
yoonseonc6a69272017-01-12 18:22:20 -0800114 private TestServiceDirectory testDirectory;
115
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500116 @Before
117 public void setUp() throws Exception {
118 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Thomas Vachuska23235962017-02-03 11:44:15 -0800119 Intent.unbindIdGenerator(idGenerator);
Brian Stanke11f6d532016-07-05 16:17:59 -0400120 Intent.bindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500121
122 coreService = new TestCoreService();
yoonseonc6a69272017-01-12 18:22:20 -0800123 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon214963b2016-11-21 15:41:07 -0800124 TestUtils.setField(virtualNetworkManagerStore, "storageService",
125 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500126 virtualNetworkManagerStore.activate();
127
128 manager = new VirtualNetworkManager();
129 manager.store = virtualNetworkManagerStore;
130 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400131 manager.intentService = intentService;
yoonseon322c9c32016-12-07 16:47:02 -0800132 manager.coreService = coreService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500133 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800134
135 testDirectory = new TestServiceDirectory();
136 TestUtils.setField(manager, "serviceDirectory", testDirectory);
137
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500138 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500139 }
140
141 @After
142 public void tearDown() {
143 virtualNetworkManagerStore.deactivate();
144 manager.removeListener(listener);
145 manager.deactivate();
146 NetTestTools.injectEventDispatcher(manager, null);
Brian Stanke11f6d532016-07-05 16:17:59 -0400147 Intent.unbindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500148 }
149
150 /**
151 * Tests registering a null tenant id.
152 */
153 @Test(expected = NullPointerException.class)
154 public void testRegisterNullTenantId() {
155 manager.registerTenantId(null);
156 }
157
158 /**
159 * Tests registering/unregistering a tenant id.
160 */
161 @Test
162 public void testRegisterUnregisterTenantId() {
163 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
164 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
165 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
166 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
167 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
168
169 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
170 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
171 tenantIdCollection = manager.getTenantIds();
172 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
173
174 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800175 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
176 VirtualNetworkEvent.Type.TENANT_REGISTERED,
177 VirtualNetworkEvent.Type.TENANT_REGISTERED,
178 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500179 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
180 }
181
182 /**
183 * Tests adding a null virtual network.
184 */
185 @Test(expected = NullPointerException.class)
186 public void testCreateNullVirtualNetwork() {
187 manager.createVirtualNetwork(null);
188 }
189
190 /**
191 * Tests add and remove of virtual networks.
192 */
193 @Test
194 public void testAddRemoveVirtualNetwork() {
195 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
196 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
197 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
198 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
199 assertNotNull("The virtual network set should not be null", virtualNetworks);
200 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
201
Brian Stanke5df14472016-03-11 19:34:38 -0500202 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500203 for (VirtualNetwork virtualNetwork : virtualNetworks) {
204 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500205 assertEquals("The expected virtual network size does not match",
206 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500207 // attempt to remove the same virtual network again.
208 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500209 assertEquals("The expected virtual network size does not match",
210 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500211 }
212 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
213 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
214
Brian Stanke5df14472016-03-11 19:34:38 -0500215 // Create/remove a virtual network.
216 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
217 manager.removeVirtualNetwork(virtualNetwork.id());
218
219 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
220 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
221
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500222 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800223 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
224 VirtualNetworkEvent.Type.NETWORK_ADDED,
225 VirtualNetworkEvent.Type.NETWORK_ADDED,
226 VirtualNetworkEvent.Type.NETWORK_REMOVED,
227 VirtualNetworkEvent.Type.NETWORK_REMOVED,
228 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500229 VirtualNetworkEvent.Type.NETWORK_REMOVED);
230 }
231
232 /**
233 * Tests adding a null virtual device.
234 */
235 @Test(expected = NullPointerException.class)
236 public void testCreateNullVirtualDevice() {
237 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
238 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
239
240 manager.createVirtualDevice(virtualNetwork.id(), null);
241 }
242
243 /**
244 * Tests adding a virtual device where no virtual network exists.
245 */
246 @Test(expected = IllegalStateException.class)
247 public void testCreateVirtualDeviceWithNoNetwork() {
248 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800249 VirtualNetwork virtualNetwork =
250 new DefaultVirtualNetwork(NetworkId.NONE,
251 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500252
Brian Stanke7a81b532016-06-14 15:43:51 -0400253 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500254 }
255
256 /**
257 * Tests add and remove of virtual devices.
258 */
259 @Test
260 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500261 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
262
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500263 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500264 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800265 VirtualNetwork virtualNetwork1 =
266 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500267 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800268 VirtualNetwork virtualNetwork2 =
269 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500270 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400271 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500272 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400273 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500274 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500275
276 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
277 assertNotNull("The virtual device set should not be null", virtualDevices1);
278 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
279
280 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
281 assertNotNull("The virtual device set should not be null", virtualDevices2);
282 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
283
284 for (VirtualDevice virtualDevice : virtualDevices1) {
285 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500286 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
287 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500288 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
289 }
290 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
291 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
292
Brian Stanke5df14472016-03-11 19:34:38 -0500293 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400294 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500295 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500296 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500297 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500298 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
299 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
300
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500301 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500302 validateEvents((Enum[]) expectedEventTypes.toArray(
303 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500304 }
305
306 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900307 * Tests getting a collection of physical device identifier corresponding to
308 * the specified virtual device.
309 */
310 @Test
311 public void testGetPhysicalDevices() {
312 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
313 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
314
315 VirtualNetwork virtualNetwork1 =
316 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
317 VirtualNetwork virtualNetwork2 =
318 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
319
320 // two virtual device in first virtual network
321 VirtualDevice vDevice1InVnet1 =
322 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
323 VirtualDevice vDevice2InVnet1 =
324 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
325 // Two virtual device in second virtual network
326 VirtualDevice vDevice1InVnet2 =
327 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
328 VirtualDevice vDevice2InVnet2 =
329 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
330
331 // Connection Point from each physical device
332 // Virtual network 1
333 ConnectPoint cp1InVnet1 =
334 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
335 ConnectPoint cp2InVnet1 =
336 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
337 ConnectPoint cp3InVnet1 =
338 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
339 ConnectPoint cp4InVnet1 =
340 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
341 // Virtual network 2
342 ConnectPoint cp1InVnet2 =
343 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
344 ConnectPoint cp2InVnet2 =
345 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
346 ConnectPoint cp3InVnet2 =
347 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
348 ConnectPoint cp4InVnet2 =
349 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
350
351 // Make simple BigSwitch by mapping two phyDevice to one vDevice
352 // First vDevice in first virtual network
353 manager.createVirtualPort(virtualNetwork1.id(),
354 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
355 manager.createVirtualPort(virtualNetwork1.id(),
356 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
357 // Second vDevice in first virtual network
358 manager.createVirtualPort(virtualNetwork1.id(),
359 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
360 manager.createVirtualPort(virtualNetwork1.id(),
361 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
362 // First vDevice in second virtual network
363 manager.createVirtualPort(virtualNetwork2.id(),
364 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
365 manager.createVirtualPort(virtualNetwork2.id(),
366 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
367 // Second vDevice in second virtual network
368 manager.createVirtualPort(virtualNetwork2.id(),
369 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
370 manager.createVirtualPort(virtualNetwork2.id(),
371 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
372
373
374 Set<DeviceId> physicalDeviceSet;
375 Set<DeviceId> testSet = new HashSet<>();
376 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1);
377 testSet.add(PHYDID1);
378 testSet.add(PHYDID2);
379 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
380 physicalDeviceSet.clear();
381 testSet.clear();
382
383 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1);
384 testSet.add(PHYDID3);
385 testSet.add(PHYDID4);
386 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
387 physicalDeviceSet.clear();
388 testSet.clear();
389
390 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2);
391 testSet.add(PHYDID1);
392 testSet.add(PHYDID2);
393 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
394 physicalDeviceSet.clear();
395 testSet.clear();
396
397 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2);
398 testSet.add(PHYDID3);
399 testSet.add(PHYDID4);
400 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
401 physicalDeviceSet.clear();
402 testSet.clear();
403 }
404
405 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400406 * Tests adding a null virtual host.
407 */
408 @Test(expected = NullPointerException.class)
409 public void testCreateNullVirtualHost() {
410 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800411 VirtualNetwork virtualNetwork =
412 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400413
414 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
415 }
416
417 /**
418 * Tests adding a virtual host where no virtual network exists.
419 */
420 @Test(expected = IllegalStateException.class)
421 public void testCreateVirtualHostWithNoNetwork() {
422 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800423 VirtualNetwork virtualNetwork =
424 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400425
426 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
427 }
428
429 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800430 * Tests adding a virtual host where no virtual port exists.
431 */
432 @Test(expected = IllegalStateException.class)
433 public void testCreateVirtualHostWithNoVirtualPort() {
434 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
435 VirtualNetwork virtualNetwork1 =
436 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
437 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
438 }
439
440 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400441 * Tests add and remove of virtual hosts.
442 */
443 @Test
444 public void testAddRemoveVirtualHost() {
445 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800446 VirtualNetwork virtualNetwork1 =
447 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
448 VirtualNetwork virtualNetwork2 =
449 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800450
451 VirtualDevice virtualDevice1 =
452 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
453 VirtualDevice virtualDevice2 =
454 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
455
456 ConnectPoint hostCp1 = new ConnectPoint(DID1, P1);
457 ConnectPoint hostCp2 = new ConnectPoint(DID2, P2);
458 manager.createVirtualPort(virtualNetwork1.id(), hostCp1.deviceId(), hostCp1.port(),
459 new ConnectPoint(virtualDevice1.id(), hostCp1.port()));
460 manager.createVirtualPort(virtualNetwork2.id(), hostCp2.deviceId(), hostCp2.port(),
461 new ConnectPoint(virtualDevice2.id(), hostCp2.port()));
462
Brian Stanke7a81b532016-06-14 15:43:51 -0400463 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
464 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
465
466 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
467 assertNotNull("The virtual host set should not be null", virtualHosts1);
468 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
469
470 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
471 assertNotNull("The virtual host set should not be null", virtualHosts2);
472 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
473
474 for (VirtualHost virtualHost : virtualHosts1) {
475 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
476 // attempt to remove the same virtual host again.
477 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
478 }
479 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
480 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
481
482 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800483 VirtualHost virtualHost =
484 manager.createVirtualHost(virtualNetwork1.id(),
485 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400486 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
487 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
488 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
489 }
490
491 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500492 * Tests add and remove of virtual links.
493 */
494 @Test
495 public void testAddRemoveVirtualLink() {
496 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800497 VirtualNetwork virtualNetwork1 =
498 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500499 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400500 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500501 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400502 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500503 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400504 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700505 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400506
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500507 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400508 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700509 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400510
Brian Stanke9a108972016-04-11 15:25:17 -0400511 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
512 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500513
514 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
515 assertNotNull("The virtual link set should not be null", virtualLinks);
516 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
517
518 for (VirtualLink virtualLink : virtualLinks) {
519 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
520 // attempt to remove the same virtual link again.
521 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
522 }
523 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
524 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500525
526 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400527 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500528 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
529 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
530 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500531 }
532
533 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400534 * Tests adding the same virtual link twice.
535 */
536 @Test(expected = IllegalStateException.class)
537 public void testAddSameVirtualLink() {
538 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800539 VirtualNetwork virtualNetwork1 =
540 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400541 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400542 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400543 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400544 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400545 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400546 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700547 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400548
Brian Stanke9a108972016-04-11 15:25:17 -0400549 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400550 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700551 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400552
Brian Stanke9a108972016-04-11 15:25:17 -0400553 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
554 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
555 }
556
557 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500558 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500559 */
560 @Test
561 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500562 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
563
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500564 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500565 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800566 VirtualNetwork virtualNetwork1 =
567 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500568 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500569 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400570 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500571 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700572 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500573
yoonseon214963b2016-11-21 15:41:07 -0800574 manager.createVirtualPort(virtualNetwork1.id(),
575 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500576 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800577 manager.createVirtualPort(virtualNetwork1.id(),
578 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500579 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500580
Brian Stanke5df14472016-03-11 19:34:38 -0500581 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500582 assertNotNull("The virtual port set should not be null", virtualPorts);
583 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
584
585 for (VirtualPort virtualPort : virtualPorts) {
586 manager.removeVirtualPort(virtualNetwork1.id(),
587 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500588 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500589 // attempt to remove the same virtual port again.
590 manager.removeVirtualPort(virtualNetwork1.id(),
591 (DeviceId) virtualPort.element().id(), virtualPort.number());
592 }
Brian Stanke5df14472016-03-11 19:34:38 -0500593 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
594 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
595
596 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800597 VirtualPort virtualPort =
598 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700599 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500600 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
601
602 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
603 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
604 PortNumber.portNumber(1), newCp);
605 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
606
yoonseon214963b2016-11-21 15:41:07 -0800607 manager.removeVirtualPort(virtualNetwork1.id(),
608 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500609 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500610 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500611 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500612
613 // Validate that the events were all received in the correct order.
614 validateEvents((Enum[]) expectedEventTypes.toArray(
615 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500616 }
617
618 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800619 * Tests when a virtual element is removed, all the other elements depending on it are also removed.
620 */
621 @Test
622 public void testRemoveAllElements() {
623 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
624 VirtualNetwork virtualNetwork1 =
625 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
626 VirtualDevice virtualDevice1 =
627 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
628 VirtualDevice virtualDevice2 =
629 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
630 ConnectPoint src = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
631 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
632 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
633
634 ConnectPoint dst = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(2));
635 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
636 new ConnectPoint(PHYDID2, PortNumber.portNumber(2)));
637
638 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
639 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
640
641 ConnectPoint hostCp = new ConnectPoint(DID1, P1);
642 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
643 new ConnectPoint(PHYDID1, P1));
644 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
645
646 //When a virtual port is removed, all virtual links connected to it should also be removed.
647 manager.removeVirtualPort(virtualNetwork1.id(), DID1, PortNumber.portNumber(1));
648 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
649 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
650
651 //When a virtual port is removed, all virtual hosts located to it should also be removed.
652 manager.removeVirtualPort(virtualNetwork1.id(), DID1, P1);
653 Set<VirtualHost> virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
654 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
655
656 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
657 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
658 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
659 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
660 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
661 new ConnectPoint(PHYDID1, P1));
662 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
663
664 //When a virtual device is removed, all virtual ports, hosts and links depended on it should also be removed.
665 manager.removeVirtualDevice(virtualNetwork1.id(), DID1);
666 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), DID1);
667 assertTrue("The virtual port set of DID1 should be empty", virtualPorts.isEmpty());
668 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
669 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
670 virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
671 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
672
673 //When a tenantId is removed, all the virtual networks belonging to it should also be removed.
674 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
675 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
676 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
677 assertNotNull("The virtual network set should not be null", virtualNetworks);
678 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
679 }
680
681
682 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400683 * Tests the addOrUpdateIntent() method in the store with a null intent.
684 */
685 @Test(expected = NullPointerException.class)
686 public void testAddOrUpdateNullIntent() {
687 manager.store.addOrUpdateIntent(null, null);
688 }
689
690 /**
691 * Tests the removeIntent() method in the store with a null intent key.
692 */
693 @Test(expected = NullPointerException.class)
694 public void testRemoveNullIntentKey() {
695 manager.store.removeIntent(null);
696 }
697
698 /**
699 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
700 */
701 @Test
702 public void testAddOrUpdateIntent() {
703 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800704 VirtualNetwork virtualNetwork =
705 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke11f6d532016-07-05 16:17:59 -0400706 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
707 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
708
709 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
710 .networkId(virtualNetwork.id())
711 .key(Key.of("Test", APP_ID))
712 .appId(APP_ID)
713 .ingressPoint(cp1)
714 .egressPoint(cp2)
715 .build();
716
717 // Add the intent to the store.
718 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
yoonseon214963b2016-11-21 15:41:07 -0800719 assertEquals("The intent size should match.", 1,
720 manager.store.getIntents().size());
721 assertNotNull("The intent should not be null.",
722 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400723
724 // remove the intent from the store.
725 manager.store.removeIntent(virtualIntent.key());
yoonseon214963b2016-11-21 15:41:07 -0800726 assertTrue("The intents should be empty.",
727 manager.store.getIntents().isEmpty());
728 assertNull("The intent should be null.",
729 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400730 }
731
732 /**
733 * Tests the addTunnelId() method in the store with a null intent.
734 */
735 @Test(expected = NullPointerException.class)
736 public void testAddTunnelIdNullIntent() {
737 manager.store.addTunnelId(null, null);
738 }
739
740 /**
741 * Tests the removeTunnelId() method in the store with a null intent.
742 */
743 @Test(expected = NullPointerException.class)
744 public void testRemoveTunnelIdNullIntent() {
745 manager.store.removeTunnelId(null, null);
746 }
747
748 /**
749 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
750 */
751 @Test
752 public void testAddTunnelId() {
753 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
754 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
755 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
756 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
757
758 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
759 .networkId(virtualNetwork.id())
760 .key(Key.of("Test", APP_ID))
761 .appId(APP_ID)
762 .ingressPoint(cp1)
763 .egressPoint(cp2)
764 .build();
765
766 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
767 // Add the intent to tunnelID mapping to the store.
768 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800769 assertEquals("The tunnels size should match.", 1,
770 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400771
772 // Remove the intent to tunnelID mapping from the store.
773 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800774 assertTrue("The tunnels should be empty.",
775 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400776 }
777
Brian Stankefb61df42016-07-25 11:47:51 -0400778
779 /**
780 * Method to create the virtual network for further testing.
781 **/
782 private VirtualNetwork setupVirtualNetworkTopology() {
783 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800784 VirtualNetwork virtualNetwork =
785 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400786
787 VirtualDevice virtualDevice1 =
788 manager.createVirtualDevice(virtualNetwork.id(), DID1);
789 VirtualDevice virtualDevice2 =
790 manager.createVirtualDevice(virtualNetwork.id(), DID2);
791 VirtualDevice virtualDevice3 =
792 manager.createVirtualDevice(virtualNetwork.id(), DID3);
793 VirtualDevice virtualDevice4 =
794 manager.createVirtualDevice(virtualNetwork.id(), DID4);
795 VirtualDevice virtualDevice5 =
796 manager.createVirtualDevice(virtualNetwork.id(), DID5);
797
798 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
799 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700800 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400801
802 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
803 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700804 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400805
806 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
807 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700808 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400809
810 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
811 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700812 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400813
814 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
815 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700816 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400817
818 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
819 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700820 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400821
822 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
823 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700824 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400825
826 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
827 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700828 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400829
830 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
831 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700832 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400833
834 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
835 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
836 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
837 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
838 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
839 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
840 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
841 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
842 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
843 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
844 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
845 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
846
847 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800848 topologyProvider = new DefaultVirtualNetworkProvider();
849 try {
850 TestUtils.setField(topologyProvider, "topologyService", topologyService);
851 } catch (TestUtils.TestUtilsException e) {
852 e.printStackTrace();
853 }
854// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400855
856 return virtualNetwork;
857 }
858
859 /**
860 * Test the topologyChanged() method.
861 */
862 @Test
863 public void testTopologyChanged() {
864 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800865 VirtualNetworkProviderService providerService =
866 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400867
868 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800869 assertEquals("The cluster count did not match.", 2,
870 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400871
872 // Adding this link will join the two clusters together.
873 List<Event> reasons = new ArrayList<>();
874 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
875 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
876 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
877 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
878
879 Topology topology = topologyService.currentTopology();
880 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
881
882 // Validate that all links are still active.
883 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800884 assertTrue("The virtual link should be active.",
885 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400886 });
887
888 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
889 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
890 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
891
892 // Validate that all links are active again.
893 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800894 assertTrue("The virtual link should be active.",
895 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400896 });
897 }
898
Brian Stanke11f6d532016-07-05 16:17:59 -0400899 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500900 * Tests that the get() method returns saved service instances.
901 */
902 @Test
903 public void testServiceGetReturnsSavedInstance() {
904 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
905 VirtualNetwork virtualNetwork =
906 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
907
908 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
909 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
910 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
911 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
912 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
913 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
914
915 // extra setup needed for FlowRuleService, PacketService, GroupService
916 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
917 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
918 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
919 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
920 testDirectory.add(CoreService.class, coreService)
921 .add(VirtualProviderRegistryService.class, virtualProviderManager)
922 .add(EventDeliveryService.class, new TestEventDispatcher())
923 .add(ClusterService.class, new ClusterServiceAdapter())
924 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
925 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
yoonseon86bebed2017-02-03 15:23:57 -0800926 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore())
927 .add(VirtualNetworkFlowObjectiveStore.class, new SimpleVirtualFlowObjectiveStore());
Claudine Chiu9a18f492017-02-27 15:57:06 -0500928
929 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
930 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
931 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
932 }
933
934 /**
935 * Validates that the get() method returns saved service instances.
936 */
937 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
938 Class<T> serviceClass) {
939 T serviceInstanceFirst = manager.get(networkId, serviceClass);
940 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
941 assertSame(serviceClass.getSimpleName() +
942 ": Subsequent get should be same as the first one",
943 serviceInstanceFirst, serviceInstanceSubsequent);
944 }
945
946 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500947 * Method to validate that the actual versus expected virtual network events were
948 * received correctly.
949 *
950 * @param types expected virtual network events.
951 */
952 private void validateEvents(Enum... types) {
953 TestTools.assertAfter(100, () -> {
954 int i = 0;
955 assertEquals("wrong events received", types.length, listener.events.size());
956 for (Event event : listener.events) {
957 assertEquals("incorrect event type", types[i], event.type());
958 i++;
959 }
960 listener.events.clear();
961 });
962 }
963
964 /**
965 * Test listener class to receive virtual network events.
966 */
967 private static class TestListener implements VirtualNetworkListener {
968
Brian Stanke7a81b532016-06-14 15:43:51 -0400969 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500970
971 @Override
972 public void event(VirtualNetworkEvent event) {
973 events.add(event);
974 }
975
976 }
977
Brian Stanke5df14472016-03-11 19:34:38 -0500978 /**
979 * Core service test class.
980 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500981 private class TestCoreService extends CoreServiceAdapter {
982
983 @Override
984 public IdGenerator getIdGenerator(String topic) {
985 return new IdGenerator() {
986 private AtomicLong counter = new AtomicLong(0);
987
988 @Override
989 public long getNewId() {
990 return counter.getAndIncrement();
991 }
992 };
993 }
994 }
995}