blob: d47caedd39990ed8785c082d25a223976c2b6faa [file] [log] [blame]
Brian Stanke0e5c94e2016-03-08 11:20:04 -05001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Brian Stanke0e5c94e2016-03-08 11:20:04 -05003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.incubator.net.virtual.impl;
18
19import com.google.common.collect.Lists;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestTools;
24import org.onlab.junit.TestUtils;
yoonseonc6a69272017-01-12 18:22:20 -080025import org.onlab.osgi.TestServiceDirectory;
Claudine Chiu9a18f492017-02-27 15:57:06 -050026import org.onosproject.cluster.ClusterService;
27import org.onosproject.cluster.ClusterServiceAdapter;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050028import org.onosproject.common.event.impl.TestEventDispatcher;
29import org.onosproject.core.CoreService;
30import org.onosproject.core.CoreServiceAdapter;
31import org.onosproject.core.IdGenerator;
32import org.onosproject.event.Event;
Claudine Chiu9a18f492017-02-27 15:57:06 -050033import org.onosproject.event.EventDeliveryService;
Brian Stanke11f6d532016-07-05 16:17:59 -040034import org.onosproject.incubator.net.tunnel.TunnelId;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050035import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
36import org.onosproject.incubator.net.virtual.NetworkId;
37import org.onosproject.incubator.net.virtual.TenantId;
38import org.onosproject.incubator.net.virtual.VirtualDevice;
Brian Stanke7a81b532016-06-14 15:43:51 -040039import org.onosproject.incubator.net.virtual.VirtualHost;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050040import org.onosproject.incubator.net.virtual.VirtualLink;
41import org.onosproject.incubator.net.virtual.VirtualNetwork;
42import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
yoonseon86bebed2017-02-03 15:23:57 -080043import org.onosproject.incubator.net.virtual.VirtualNetworkFlowObjectiveStore;
Claudine Chiu9a18f492017-02-27 15:57:06 -050044import org.onosproject.incubator.net.virtual.VirtualNetworkFlowRuleStore;
45import org.onosproject.incubator.net.virtual.VirtualNetworkGroupStore;
Brian Stanke11f6d532016-07-05 16:17:59 -040046import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
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;
Claudine Chiu9a18f492017-02-27 15:57:06 -050072import org.onosproject.net.intent.IntentService;
Brian Stanke11f6d532016-07-05 16:17:59 -040073import org.onosproject.net.intent.Key;
74import org.onosproject.net.intent.MockIdGenerator;
Claudine Chiu9a18f492017-02-27 15:57:06 -050075import org.onosproject.net.link.LinkService;
76import org.onosproject.net.packet.PacketService;
77import org.onosproject.net.topology.PathService;
Brian Stankefb61df42016-07-25 11:47:51 -040078import org.onosproject.net.topology.Topology;
79import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050080import org.onosproject.store.service.TestStorageService;
81
sangyun-han3c3e99e2017-02-08 15:30:53 +090082import java.util.ArrayList;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070083import java.util.Collection;
sangyun-han3c3e99e2017-02-08 15:30:53 +090084import java.util.HashSet;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070085import java.util.List;
86import java.util.Set;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050087import java.util.concurrent.atomic.AtomicLong;
88
89import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040090import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050091
92/**
93 * Junit tests for VirtualNetworkManager.
94 */
sangyun-han3c3e99e2017-02-08 15:30:53 +090095public class VirtualNetworkManagerTest extends VirtualNetworkTestUtil {
Brian Stanke86914282016-05-25 15:36:50 -040096 private final String tenantIdValue1 = "TENANT_ID1";
97 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -050098
99 private VirtualNetworkManager manager;
yoonseon214963b2016-11-21 15:41:07 -0800100 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500101 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
102 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -0400103 private TestListener listener = new TestListener();
Brian Stankefb61df42016-07-25 11:47:51 -0400104 private TopologyService topologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500105
Brian Stankefb61df42016-07-25 11:47:51 -0400106 private ConnectPoint cp6;
107 private ConnectPoint cp7;
108
yoonseonc6a69272017-01-12 18:22:20 -0800109 private TestServiceDirectory testDirectory;
110
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500111 @Before
112 public void setUp() throws Exception {
113 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700114 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500115
116 coreService = new TestCoreService();
yoonseonc6a69272017-01-12 18:22:20 -0800117 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon214963b2016-11-21 15:41:07 -0800118 TestUtils.setField(virtualNetworkManagerStore, "storageService",
119 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500120 virtualNetworkManagerStore.activate();
121
122 manager = new VirtualNetworkManager();
123 manager.store = virtualNetworkManagerStore;
124 manager.addListener(listener);
yoonseon322c9c32016-12-07 16:47:02 -0800125 manager.coreService = coreService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500126 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800127
128 testDirectory = new TestServiceDirectory();
129 TestUtils.setField(manager, "serviceDirectory", testDirectory);
130
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500131 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500132 }
133
134 @After
135 public void tearDown() {
136 virtualNetworkManagerStore.deactivate();
137 manager.removeListener(listener);
138 manager.deactivate();
139 NetTestTools.injectEventDispatcher(manager, null);
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700140 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500141 }
142
143 /**
144 * Tests registering a null tenant id.
145 */
146 @Test(expected = NullPointerException.class)
147 public void testRegisterNullTenantId() {
148 manager.registerTenantId(null);
149 }
150
151 /**
152 * Tests registering/unregistering a tenant id.
153 */
154 @Test
155 public void testRegisterUnregisterTenantId() {
156 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
157 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
158 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
159 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
160 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
161
162 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
163 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
164 tenantIdCollection = manager.getTenantIds();
165 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
166
167 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800168 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
169 VirtualNetworkEvent.Type.TENANT_REGISTERED,
170 VirtualNetworkEvent.Type.TENANT_REGISTERED,
171 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500172 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
173 }
174
175 /**
176 * Tests adding a null virtual network.
177 */
178 @Test(expected = NullPointerException.class)
179 public void testCreateNullVirtualNetwork() {
180 manager.createVirtualNetwork(null);
181 }
182
183 /**
Claudine Chiu70e2db82017-05-04 09:53:11 -0400184 * Tests removal of a virtual network twice.
185 */
186 @Test(expected = IllegalStateException.class)
187 public void testRemoveVnetTwice() {
188 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
189 VirtualNetwork virtualNetwork =
190 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
191 manager.removeVirtualNetwork(virtualNetwork.id());
192 manager.removeVirtualNetwork(virtualNetwork.id());
193 }
194
195 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500196 * Tests add and remove of virtual networks.
197 */
198 @Test
199 public void testAddRemoveVirtualNetwork() {
200 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
201 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
202 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
203 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
204 assertNotNull("The virtual network set should not be null", virtualNetworks);
205 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
206
Brian Stanke5df14472016-03-11 19:34:38 -0500207 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500208 for (VirtualNetwork virtualNetwork : virtualNetworks) {
209 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500210 assertEquals("The expected virtual network size does not match",
211 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500212 }
213 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
214 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
215
Brian Stanke5df14472016-03-11 19:34:38 -0500216 // Create/remove a virtual network.
217 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
218 manager.removeVirtualNetwork(virtualNetwork.id());
219
220 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
221 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
222
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500223 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800224 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
225 VirtualNetworkEvent.Type.NETWORK_ADDED,
226 VirtualNetworkEvent.Type.NETWORK_ADDED,
227 VirtualNetworkEvent.Type.NETWORK_REMOVED,
228 VirtualNetworkEvent.Type.NETWORK_REMOVED,
229 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500230 VirtualNetworkEvent.Type.NETWORK_REMOVED);
231 }
232
233 /**
234 * Tests adding a null virtual device.
235 */
236 @Test(expected = NullPointerException.class)
237 public void testCreateNullVirtualDevice() {
238 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
239 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
240
241 manager.createVirtualDevice(virtualNetwork.id(), null);
242 }
243
244 /**
245 * Tests adding a virtual device where no virtual network exists.
246 */
247 @Test(expected = IllegalStateException.class)
248 public void testCreateVirtualDeviceWithNoNetwork() {
249 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800250 VirtualNetwork virtualNetwork =
251 new DefaultVirtualNetwork(NetworkId.NONE,
252 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500253
Brian Stanke7a81b532016-06-14 15:43:51 -0400254 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500255 }
256
257 /**
258 * Tests add and remove of virtual devices.
259 */
260 @Test
261 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500262 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
263
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500264 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500265 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800266 VirtualNetwork virtualNetwork1 =
267 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500268 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800269 VirtualNetwork virtualNetwork2 =
270 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500271 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400272 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500273 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400274 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500275 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500276
277 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
278 assertNotNull("The virtual device set should not be null", virtualDevices1);
279 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
280
281 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
282 assertNotNull("The virtual device set should not be null", virtualDevices2);
283 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
284
285 for (VirtualDevice virtualDevice : virtualDevices1) {
286 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500287 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
288 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500289 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
290 }
291 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
292 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
293
Brian Stanke5df14472016-03-11 19:34:38 -0500294 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400295 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500296 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500297 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500298 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500299 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
300 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
301
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500302 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500303 validateEvents((Enum[]) expectedEventTypes.toArray(
304 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500305 }
306
307 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900308 * Tests getting a collection of physical device identifier corresponding to
309 * the specified virtual device.
310 */
311 @Test
312 public void testGetPhysicalDevices() {
313 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
314 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
315
316 VirtualNetwork virtualNetwork1 =
317 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
318 VirtualNetwork virtualNetwork2 =
319 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
320
321 // two virtual device in first virtual network
322 VirtualDevice vDevice1InVnet1 =
323 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
324 VirtualDevice vDevice2InVnet1 =
325 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
326 // Two virtual device in second virtual network
327 VirtualDevice vDevice1InVnet2 =
328 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
329 VirtualDevice vDevice2InVnet2 =
330 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
331
332 // Connection Point from each physical device
333 // Virtual network 1
334 ConnectPoint cp1InVnet1 =
335 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
336 ConnectPoint cp2InVnet1 =
337 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
338 ConnectPoint cp3InVnet1 =
339 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
340 ConnectPoint cp4InVnet1 =
341 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
342 // Virtual network 2
343 ConnectPoint cp1InVnet2 =
344 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
345 ConnectPoint cp2InVnet2 =
346 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
347 ConnectPoint cp3InVnet2 =
348 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
349 ConnectPoint cp4InVnet2 =
350 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
351
352 // Make simple BigSwitch by mapping two phyDevice to one vDevice
353 // First vDevice in first virtual network
354 manager.createVirtualPort(virtualNetwork1.id(),
355 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
356 manager.createVirtualPort(virtualNetwork1.id(),
357 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
358 // Second vDevice in first virtual network
359 manager.createVirtualPort(virtualNetwork1.id(),
360 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
361 manager.createVirtualPort(virtualNetwork1.id(),
362 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
363 // First vDevice in second virtual network
364 manager.createVirtualPort(virtualNetwork2.id(),
365 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
366 manager.createVirtualPort(virtualNetwork2.id(),
367 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
368 // Second vDevice in second virtual network
369 manager.createVirtualPort(virtualNetwork2.id(),
370 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
371 manager.createVirtualPort(virtualNetwork2.id(),
372 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
373
374
375 Set<DeviceId> physicalDeviceSet;
376 Set<DeviceId> testSet = new HashSet<>();
Harold Huang3fcf7432017-05-16 16:21:08 +0800377 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900378 testSet.add(PHYDID1);
379 testSet.add(PHYDID2);
380 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900381 testSet.clear();
382
Harold Huang3fcf7432017-05-16 16:21:08 +0800383 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900384 testSet.add(PHYDID3);
385 testSet.add(PHYDID4);
386 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900387 testSet.clear();
388
Harold Huang3fcf7432017-05-16 16:21:08 +0800389 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900390 testSet.add(PHYDID1);
391 testSet.add(PHYDID2);
392 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900393 testSet.clear();
394
Harold Huang3fcf7432017-05-16 16:21:08 +0800395 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900396 testSet.add(PHYDID3);
397 testSet.add(PHYDID4);
398 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900399 testSet.clear();
400 }
401
402 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400403 * Tests adding a null virtual host.
404 */
405 @Test(expected = NullPointerException.class)
406 public void testCreateNullVirtualHost() {
407 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800408 VirtualNetwork virtualNetwork =
409 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400410
411 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
412 }
413
414 /**
415 * Tests adding a virtual host where no virtual network exists.
416 */
417 @Test(expected = IllegalStateException.class)
418 public void testCreateVirtualHostWithNoNetwork() {
419 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800420 VirtualNetwork virtualNetwork =
421 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400422
423 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
424 }
425
426 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800427 * Tests adding a virtual host where no virtual port exists.
428 */
429 @Test(expected = IllegalStateException.class)
430 public void testCreateVirtualHostWithNoVirtualPort() {
431 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
432 VirtualNetwork virtualNetwork1 =
433 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
434 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
435 }
436
437 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400438 * Tests add and remove of virtual hosts.
439 */
440 @Test
441 public void testAddRemoveVirtualHost() {
442 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800443 VirtualNetwork virtualNetwork1 =
444 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
445 VirtualNetwork virtualNetwork2 =
446 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800447
448 VirtualDevice virtualDevice1 =
449 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
450 VirtualDevice virtualDevice2 =
451 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
452
453 ConnectPoint hostCp1 = new ConnectPoint(DID1, P1);
454 ConnectPoint hostCp2 = new ConnectPoint(DID2, P2);
455 manager.createVirtualPort(virtualNetwork1.id(), hostCp1.deviceId(), hostCp1.port(),
456 new ConnectPoint(virtualDevice1.id(), hostCp1.port()));
457 manager.createVirtualPort(virtualNetwork2.id(), hostCp2.deviceId(), hostCp2.port(),
458 new ConnectPoint(virtualDevice2.id(), hostCp2.port()));
459
Brian Stanke7a81b532016-06-14 15:43:51 -0400460 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
461 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
462
463 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
464 assertNotNull("The virtual host set should not be null", virtualHosts1);
465 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
466
467 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
468 assertNotNull("The virtual host set should not be null", virtualHosts2);
469 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
470
471 for (VirtualHost virtualHost : virtualHosts1) {
472 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
473 // attempt to remove the same virtual host again.
474 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
475 }
476 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
477 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
478
479 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800480 VirtualHost virtualHost =
481 manager.createVirtualHost(virtualNetwork1.id(),
482 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400483 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
484 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
485 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
486 }
487
488 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500489 * Tests add and remove of virtual links.
490 */
491 @Test
492 public void testAddRemoveVirtualLink() {
493 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800494 VirtualNetwork virtualNetwork1 =
495 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500496 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400497 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500498 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400499 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500500 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400501 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700502 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400503
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500504 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400505 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700506 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400507
Brian Stanke9a108972016-04-11 15:25:17 -0400508 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
509 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500510
511 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
512 assertNotNull("The virtual link set should not be null", virtualLinks);
513 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
514
515 for (VirtualLink virtualLink : virtualLinks) {
516 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
517 // attempt to remove the same virtual link again.
518 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
519 }
520 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
521 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500522
523 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400524 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500525 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
526 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
527 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500528 }
529
530 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400531 * Tests adding the same virtual link twice.
532 */
533 @Test(expected = IllegalStateException.class)
534 public void testAddSameVirtualLink() {
535 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800536 VirtualNetwork virtualNetwork1 =
537 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400538 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400539 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400540 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400541 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400542 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400543 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700544 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400545
Brian Stanke9a108972016-04-11 15:25:17 -0400546 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400547 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700548 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400549
Brian Stanke9a108972016-04-11 15:25:17 -0400550 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
551 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
552 }
553
554 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500555 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500556 */
557 @Test
558 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500559 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
560
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500561 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500562 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800563 VirtualNetwork virtualNetwork1 =
564 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500565 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500566 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400567 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500568 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700569 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500570
yoonseon214963b2016-11-21 15:41:07 -0800571 manager.createVirtualPort(virtualNetwork1.id(),
572 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500573 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800574 manager.createVirtualPort(virtualNetwork1.id(),
575 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500576 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500577
Brian Stanke5df14472016-03-11 19:34:38 -0500578 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500579 assertNotNull("The virtual port set should not be null", virtualPorts);
580 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
581
582 for (VirtualPort virtualPort : virtualPorts) {
583 manager.removeVirtualPort(virtualNetwork1.id(),
584 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500585 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500586 // attempt to remove the same virtual port again.
587 manager.removeVirtualPort(virtualNetwork1.id(),
588 (DeviceId) virtualPort.element().id(), virtualPort.number());
589 }
Brian Stanke5df14472016-03-11 19:34:38 -0500590 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
591 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
592
593 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800594 VirtualPort virtualPort =
595 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700596 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500597 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
598
599 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
600 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
601 PortNumber.portNumber(1), newCp);
602 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
603
yoonseon214963b2016-11-21 15:41:07 -0800604 manager.removeVirtualPort(virtualNetwork1.id(),
605 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500606 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500607 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500608 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500609
610 // Validate that the events were all received in the correct order.
611 validateEvents((Enum[]) expectedEventTypes.toArray(
612 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500613 }
614
615 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800616 * Tests when a virtual element is removed, all the other elements depending on it are also removed.
617 */
618 @Test
619 public void testRemoveAllElements() {
620 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
621 VirtualNetwork virtualNetwork1 =
622 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
623 VirtualDevice virtualDevice1 =
624 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
625 VirtualDevice virtualDevice2 =
626 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
627 ConnectPoint src = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
628 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
629 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
630
631 ConnectPoint dst = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(2));
632 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
633 new ConnectPoint(PHYDID2, PortNumber.portNumber(2)));
634
635 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
636 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
637
638 ConnectPoint hostCp = new ConnectPoint(DID1, P1);
639 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
640 new ConnectPoint(PHYDID1, P1));
641 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
642
643 //When a virtual port is removed, all virtual links connected to it should also be removed.
644 manager.removeVirtualPort(virtualNetwork1.id(), DID1, PortNumber.portNumber(1));
645 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
646 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
647
648 //When a virtual port is removed, all virtual hosts located to it should also be removed.
649 manager.removeVirtualPort(virtualNetwork1.id(), DID1, P1);
650 Set<VirtualHost> virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
651 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
652
653 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
654 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
655 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
656 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
657 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
658 new ConnectPoint(PHYDID1, P1));
659 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
660
661 //When a virtual device is removed, all virtual ports, hosts and links depended on it should also be removed.
662 manager.removeVirtualDevice(virtualNetwork1.id(), DID1);
663 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), DID1);
664 assertTrue("The virtual port set of DID1 should be empty", virtualPorts.isEmpty());
665 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
666 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
667 virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
668 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
669
670 //When a tenantId is removed, all the virtual networks belonging to it should also be removed.
671 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
672 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
673 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
674 assertNotNull("The virtual network set should not be null", virtualNetworks);
675 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
676 }
677
Brian Stanke11f6d532016-07-05 16:17:59 -0400678 /**
679 * Tests the addTunnelId() method in the store with a null intent.
680 */
681 @Test(expected = NullPointerException.class)
682 public void testAddTunnelIdNullIntent() {
683 manager.store.addTunnelId(null, null);
684 }
685
686 /**
687 * Tests the removeTunnelId() method in the store with a null intent.
688 */
689 @Test(expected = NullPointerException.class)
690 public void testRemoveTunnelIdNullIntent() {
691 manager.store.removeTunnelId(null, null);
692 }
693
694 /**
695 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
696 */
697 @Test
698 public void testAddTunnelId() {
699 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
700 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
701 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
702 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
703
704 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
705 .networkId(virtualNetwork.id())
706 .key(Key.of("Test", APP_ID))
707 .appId(APP_ID)
708 .ingressPoint(cp1)
709 .egressPoint(cp2)
710 .build();
711
712 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
713 // Add the intent to tunnelID mapping to the store.
714 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800715 assertEquals("The tunnels size should match.", 1,
716 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400717
718 // Remove the intent to tunnelID mapping from the store.
719 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800720 assertTrue("The tunnels should be empty.",
721 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400722 }
723
Brian Stankefb61df42016-07-25 11:47:51 -0400724
725 /**
726 * Method to create the virtual network for further testing.
727 **/
728 private VirtualNetwork setupVirtualNetworkTopology() {
729 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800730 VirtualNetwork virtualNetwork =
731 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400732
733 VirtualDevice virtualDevice1 =
734 manager.createVirtualDevice(virtualNetwork.id(), DID1);
735 VirtualDevice virtualDevice2 =
736 manager.createVirtualDevice(virtualNetwork.id(), DID2);
737 VirtualDevice virtualDevice3 =
738 manager.createVirtualDevice(virtualNetwork.id(), DID3);
739 VirtualDevice virtualDevice4 =
740 manager.createVirtualDevice(virtualNetwork.id(), DID4);
741 VirtualDevice virtualDevice5 =
742 manager.createVirtualDevice(virtualNetwork.id(), DID5);
743
744 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
745 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700746 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400747
748 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
749 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700750 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400751
752 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
753 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700754 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400755
756 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
757 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700758 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400759
760 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
761 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700762 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400763
764 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
765 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700766 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400767
768 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
769 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700770 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400771
772 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
773 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700774 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400775
776 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
777 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700778 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400779
780 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
781 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
782 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
783 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
784 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
785 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
786 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
787 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
788 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
789 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
790 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
791 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
792
793 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800794 topologyProvider = new DefaultVirtualNetworkProvider();
795 try {
796 TestUtils.setField(topologyProvider, "topologyService", topologyService);
797 } catch (TestUtils.TestUtilsException e) {
798 e.printStackTrace();
799 }
800// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400801
802 return virtualNetwork;
803 }
804
805 /**
806 * Test the topologyChanged() method.
807 */
808 @Test
809 public void testTopologyChanged() {
810 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800811 VirtualNetworkProviderService providerService =
812 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400813
814 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800815 assertEquals("The cluster count did not match.", 2,
816 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400817
818 // Adding this link will join the two clusters together.
819 List<Event> reasons = new ArrayList<>();
820 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
821 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
822 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
823 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
824
825 Topology topology = topologyService.currentTopology();
826 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
827
828 // Validate that all links are still active.
829 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800830 assertTrue("The virtual link should be active.",
831 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400832 });
833
834 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
835 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
836 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
837
838 // Validate that all links are active again.
839 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800840 assertTrue("The virtual link should be active.",
841 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400842 });
843 }
844
Brian Stanke11f6d532016-07-05 16:17:59 -0400845 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500846 * Tests that the get() method returns saved service instances.
847 */
848 @Test
849 public void testServiceGetReturnsSavedInstance() {
850 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
851 VirtualNetwork virtualNetwork =
852 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
853
854 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
855 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
856 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
857 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
858 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
859 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
860
861 // extra setup needed for FlowRuleService, PacketService, GroupService
862 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
863 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
864 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
865 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
866 testDirectory.add(CoreService.class, coreService)
867 .add(VirtualProviderRegistryService.class, virtualProviderManager)
868 .add(EventDeliveryService.class, new TestEventDispatcher())
869 .add(ClusterService.class, new ClusterServiceAdapter())
870 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
871 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
yoonseon86bebed2017-02-03 15:23:57 -0800872 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore())
873 .add(VirtualNetworkFlowObjectiveStore.class, new SimpleVirtualFlowObjectiveStore());
Claudine Chiu9a18f492017-02-27 15:57:06 -0500874
875 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
Claudine Chiu1f036b82017-03-09 16:45:56 -0500876 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowObjectiveService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500877 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
878 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
879 }
880
881 /**
882 * Validates that the get() method returns saved service instances.
883 */
884 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
885 Class<T> serviceClass) {
886 T serviceInstanceFirst = manager.get(networkId, serviceClass);
887 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
888 assertSame(serviceClass.getSimpleName() +
889 ": Subsequent get should be same as the first one",
890 serviceInstanceFirst, serviceInstanceSubsequent);
891 }
892
893 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500894 * Method to validate that the actual versus expected virtual network events were
895 * received correctly.
896 *
897 * @param types expected virtual network events.
898 */
899 private void validateEvents(Enum... types) {
900 TestTools.assertAfter(100, () -> {
901 int i = 0;
902 assertEquals("wrong events received", types.length, listener.events.size());
903 for (Event event : listener.events) {
904 assertEquals("incorrect event type", types[i], event.type());
905 i++;
906 }
907 listener.events.clear();
908 });
909 }
910
911 /**
912 * Test listener class to receive virtual network events.
913 */
914 private static class TestListener implements VirtualNetworkListener {
915
Brian Stanke7a81b532016-06-14 15:43:51 -0400916 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500917
918 @Override
919 public void event(VirtualNetworkEvent event) {
920 events.add(event);
921 }
922
923 }
924
Brian Stanke5df14472016-03-11 19:34:38 -0500925 /**
926 * Core service test class.
927 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500928 private class TestCoreService extends CoreServiceAdapter {
929
930 @Override
931 public IdGenerator getIdGenerator(String topic) {
932 return new IdGenerator() {
933 private AtomicLong counter = new AtomicLong(0);
934
935 @Override
936 public long getNewId() {
937 return counter.getAndIncrement();
938 }
939 };
940 }
941 }
942}