blob: 9156c38f86cde2a89b9b7e5e23ac8123711d1a7d [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;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080037import org.onosproject.net.TenantId;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050038import 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;
Yoonseon Han096cea02017-05-15 15:10:41 -070047import org.onosproject.incubator.net.virtual.VirtualNetworkIntentStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050048import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
Claudine Chiu9a18f492017-02-27 15:57:06 -050049import org.onosproject.incubator.net.virtual.VirtualNetworkPacketStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050050import org.onosproject.incubator.net.virtual.VirtualPort;
Claudine Chiu9a18f492017-02-27 15:57:06 -050051import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualFlowRuleProvider;
52import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualGroupProvider;
yoonseon214963b2016-11-21 15:41:07 -080053import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualNetworkProvider;
Claudine Chiu9a18f492017-02-27 15:57:06 -050054import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualPacketProvider;
55import org.onosproject.incubator.net.virtual.impl.provider.VirtualProviderManager;
56import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderService;
57import org.onosproject.incubator.net.virtual.provider.VirtualProviderRegistryService;
Thomas Vachuska52f2cd12018-11-08 21:20:04 -080058import org.onosproject.incubator.net.virtual.store.impl.DistributedVirtualNetworkStore;
59import org.onosproject.incubator.net.virtual.store.impl.SimpleVirtualFlowObjectiveStore;
60import org.onosproject.incubator.net.virtual.store.impl.SimpleVirtualFlowRuleStore;
61import org.onosproject.incubator.net.virtual.store.impl.SimpleVirtualGroupStore;
62import org.onosproject.incubator.net.virtual.store.impl.SimpleVirtualIntentStore;
63import org.onosproject.incubator.net.virtual.store.impl.SimpleVirtualPacketStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050064import org.onosproject.net.ConnectPoint;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050065import org.onosproject.net.DeviceId;
Brian Stankefb61df42016-07-25 11:47:51 -040066import org.onosproject.net.Link;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050067import org.onosproject.net.NetTestTools;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050068import org.onosproject.net.PortNumber;
Claudine Chiu9a18f492017-02-27 15:57:06 -050069import org.onosproject.net.device.DeviceService;
70import org.onosproject.net.flow.FlowRuleService;
Claudine Chiu1f036b82017-03-09 16:45:56 -050071import org.onosproject.net.flowobjective.FlowObjectiveService;
Claudine Chiu9a18f492017-02-27 15:57:06 -050072import org.onosproject.net.group.GroupService;
73import org.onosproject.net.host.HostService;
Claudine Chiu9a18f492017-02-27 15:57:06 -050074import org.onosproject.net.intent.IntentService;
Brian Stanke11f6d532016-07-05 16:17:59 -040075import org.onosproject.net.intent.Key;
76import org.onosproject.net.intent.MockIdGenerator;
Claudine Chiu9a18f492017-02-27 15:57:06 -050077import org.onosproject.net.link.LinkService;
78import org.onosproject.net.packet.PacketService;
79import org.onosproject.net.topology.PathService;
Brian Stankefb61df42016-07-25 11:47:51 -040080import org.onosproject.net.topology.Topology;
81import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050082import org.onosproject.store.service.TestStorageService;
83
sangyun-han3c3e99e2017-02-08 15:30:53 +090084import java.util.ArrayList;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070085import java.util.Collection;
sangyun-han3c3e99e2017-02-08 15:30:53 +090086import java.util.HashSet;
Thomas Vachuska2048c1f2017-05-10 19:32:22 -070087import java.util.List;
88import java.util.Set;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050089import java.util.concurrent.atomic.AtomicLong;
90
Jovana Vuletac884b692017-11-28 16:52:35 +010091import static org.hamcrest.Matchers.is;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050092import 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 Stankefb61df42016-07-25 11:47:51 -0400107 private TopologyService topologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500108
Brian Stankefb61df42016-07-25 11:47:51 -0400109 private ConnectPoint cp6;
110 private ConnectPoint cp7;
111
yoonseonc6a69272017-01-12 18:22:20 -0800112 private TestServiceDirectory testDirectory;
113
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500114 @Before
115 public void setUp() throws Exception {
116 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700117 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500118
119 coreService = new TestCoreService();
yoonseonc6a69272017-01-12 18:22:20 -0800120 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon214963b2016-11-21 15:41:07 -0800121 TestUtils.setField(virtualNetworkManagerStore, "storageService",
122 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500123 virtualNetworkManagerStore.activate();
124
125 manager = new VirtualNetworkManager();
126 manager.store = virtualNetworkManagerStore;
127 manager.addListener(listener);
yoonseon322c9c32016-12-07 16:47:02 -0800128 manager.coreService = coreService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500129 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800130
131 testDirectory = new TestServiceDirectory();
132 TestUtils.setField(manager, "serviceDirectory", testDirectory);
133
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500134 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500135 }
136
137 @After
138 public void tearDown() {
139 virtualNetworkManagerStore.deactivate();
140 manager.removeListener(listener);
141 manager.deactivate();
142 NetTestTools.injectEventDispatcher(manager, null);
Thomas Vachuska2048c1f2017-05-10 19:32:22 -0700143 MockIdGenerator.cleanBind();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500144 }
145
146 /**
147 * Tests registering a null tenant id.
148 */
149 @Test(expected = NullPointerException.class)
150 public void testRegisterNullTenantId() {
151 manager.registerTenantId(null);
152 }
153
154 /**
155 * Tests registering/unregistering a tenant id.
156 */
157 @Test
158 public void testRegisterUnregisterTenantId() {
159 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
160 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
161 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
162 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
163 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
164
165 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
166 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
167 tenantIdCollection = manager.getTenantIds();
168 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
169
170 // Validate that the events were all received in the correct order.
Yuta HIGUCHI86ac40b2017-11-16 12:25:39 -0800171 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
yoonseon214963b2016-11-21 15:41:07 -0800172 VirtualNetworkEvent.Type.TENANT_REGISTERED,
173 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500174 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
175 }
176
177 /**
Jovana Vuletac884b692017-11-28 16:52:35 +0100178 * Test method {@code getTenantId()} for registered virtual network.
179 */
180 @Test
181 public void testGetTenantIdForRegisteredVirtualNetwork() {
182 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology(tenantIdValue1);
183 TenantId tenantId = manager.getTenantId(virtualNetwork.id());
184
185 assertThat(tenantId.toString(), is(tenantIdValue1));
186 }
187
188 /**
189 * Test method {@code getTenantId()} for null virtual network id.
190 */
191 @Test(expected = NullPointerException.class)
192 public void testGetTenantIdForNullVirtualNetwork() {
193 manager.getTenantId(null);
194 }
195
196 /**
197 * Test method {@code getVirtualNetwork()} for registered virtual network.
198 */
199 @Test
200 public void testGetVirtualNetworkForRegisteredNetwork() {
201 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology(tenantIdValue1);
202
203 assertNotNull("Registered virtual network is null", manager.getVirtualNetwork(virtualNetwork.id()));
204 }
205
206 /**
207 * Test method {@code getVirtualNetwork()} for null virtual network id.
208 */
209 @Test(expected = NullPointerException.class)
210 public void testGetVirtualForNullVirtualNetworkId() {
211 manager.getVirtualNetwork(null);
212 }
213
214 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500215 * Tests adding a null virtual network.
216 */
217 @Test(expected = NullPointerException.class)
218 public void testCreateNullVirtualNetwork() {
219 manager.createVirtualNetwork(null);
220 }
221
222 /**
Claudine Chiu70e2db82017-05-04 09:53:11 -0400223 * Tests removal of a virtual network twice.
224 */
225 @Test(expected = IllegalStateException.class)
226 public void testRemoveVnetTwice() {
227 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
228 VirtualNetwork virtualNetwork =
229 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
230 manager.removeVirtualNetwork(virtualNetwork.id());
231 manager.removeVirtualNetwork(virtualNetwork.id());
232 }
233
234 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500235 * Tests add and remove of virtual networks.
236 */
237 @Test
238 public void testAddRemoveVirtualNetwork() {
239 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
240 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
241 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
242 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
243 assertNotNull("The virtual network set should not be null", virtualNetworks);
244 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
245
Brian Stanke5df14472016-03-11 19:34:38 -0500246 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500247 for (VirtualNetwork virtualNetwork : virtualNetworks) {
248 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500249 assertEquals("The expected virtual network size does not match",
250 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500251 }
252 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
253 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
254
Brian Stanke5df14472016-03-11 19:34:38 -0500255 // Create/remove a virtual network.
256 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
257 manager.removeVirtualNetwork(virtualNetwork.id());
258
259 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
260 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
261
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500262 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800263 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
264 VirtualNetworkEvent.Type.NETWORK_ADDED,
265 VirtualNetworkEvent.Type.NETWORK_ADDED,
266 VirtualNetworkEvent.Type.NETWORK_REMOVED,
267 VirtualNetworkEvent.Type.NETWORK_REMOVED,
268 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500269 VirtualNetworkEvent.Type.NETWORK_REMOVED);
270 }
271
272 /**
273 * Tests adding a null virtual device.
274 */
275 @Test(expected = NullPointerException.class)
276 public void testCreateNullVirtualDevice() {
277 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
278 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
279
280 manager.createVirtualDevice(virtualNetwork.id(), null);
281 }
282
283 /**
284 * Tests adding a virtual device where no virtual network exists.
285 */
286 @Test(expected = IllegalStateException.class)
287 public void testCreateVirtualDeviceWithNoNetwork() {
288 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800289 VirtualNetwork virtualNetwork =
290 new DefaultVirtualNetwork(NetworkId.NONE,
291 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500292
Brian Stanke7a81b532016-06-14 15:43:51 -0400293 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500294 }
295
296 /**
297 * Tests add and remove of virtual devices.
298 */
299 @Test
300 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500301 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
302
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500303 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500304 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800305 VirtualNetwork virtualNetwork1 =
306 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500307 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800308 VirtualNetwork virtualNetwork2 =
309 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500310 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400311 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500312 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400313 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500314 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500315
316 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
317 assertNotNull("The virtual device set should not be null", virtualDevices1);
318 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
319
320 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
321 assertNotNull("The virtual device set should not be null", virtualDevices2);
322 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
323
324 for (VirtualDevice virtualDevice : virtualDevices1) {
325 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500326 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
327 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500328 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
329 }
330 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
331 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
332
Brian Stanke5df14472016-03-11 19:34:38 -0500333 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400334 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500335 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500336 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500337 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500338 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
339 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
340
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500341 // Validate that the events were all received in the correct order.
Yuta HIGUCHI86ac40b2017-11-16 12:25:39 -0800342 validateEvents(expectedEventTypes.toArray(
Claudine Chiu945828d2016-11-21 12:47:07 -0500343 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500344 }
345
346 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900347 * Tests getting a collection of physical device identifier corresponding to
348 * the specified virtual device.
349 */
350 @Test
351 public void testGetPhysicalDevices() {
352 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
353 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
354
355 VirtualNetwork virtualNetwork1 =
356 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
357 VirtualNetwork virtualNetwork2 =
358 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
359
360 // two virtual device in first virtual network
361 VirtualDevice vDevice1InVnet1 =
362 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
363 VirtualDevice vDevice2InVnet1 =
364 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
365 // Two virtual device in second virtual network
366 VirtualDevice vDevice1InVnet2 =
367 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
368 VirtualDevice vDevice2InVnet2 =
369 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
370
371 // Connection Point from each physical device
372 // Virtual network 1
373 ConnectPoint cp1InVnet1 =
374 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
375 ConnectPoint cp2InVnet1 =
376 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
377 ConnectPoint cp3InVnet1 =
378 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
379 ConnectPoint cp4InVnet1 =
380 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
381 // Virtual network 2
382 ConnectPoint cp1InVnet2 =
383 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
384 ConnectPoint cp2InVnet2 =
385 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
386 ConnectPoint cp3InVnet2 =
387 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
388 ConnectPoint cp4InVnet2 =
389 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
390
391 // Make simple BigSwitch by mapping two phyDevice to one vDevice
392 // First vDevice in first virtual network
393 manager.createVirtualPort(virtualNetwork1.id(),
394 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
395 manager.createVirtualPort(virtualNetwork1.id(),
396 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
397 // Second vDevice in first virtual network
398 manager.createVirtualPort(virtualNetwork1.id(),
399 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
400 manager.createVirtualPort(virtualNetwork1.id(),
401 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
402 // First vDevice in second virtual network
403 manager.createVirtualPort(virtualNetwork2.id(),
404 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
405 manager.createVirtualPort(virtualNetwork2.id(),
406 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
407 // Second vDevice in second virtual network
408 manager.createVirtualPort(virtualNetwork2.id(),
409 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
410 manager.createVirtualPort(virtualNetwork2.id(),
411 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
412
413
414 Set<DeviceId> physicalDeviceSet;
415 Set<DeviceId> testSet = new HashSet<>();
Harold Huang3fcf7432017-05-16 16:21:08 +0800416 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900417 testSet.add(PHYDID1);
418 testSet.add(PHYDID2);
419 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900420 testSet.clear();
421
Harold Huang3fcf7432017-05-16 16:21:08 +0800422 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900423 testSet.add(PHYDID3);
424 testSet.add(PHYDID4);
425 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900426 testSet.clear();
427
Harold Huang3fcf7432017-05-16 16:21:08 +0800428 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900429 testSet.add(PHYDID1);
430 testSet.add(PHYDID2);
431 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900432 testSet.clear();
433
Harold Huang3fcf7432017-05-16 16:21:08 +0800434 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2.id());
sangyun-han3c3e99e2017-02-08 15:30:53 +0900435 testSet.add(PHYDID3);
436 testSet.add(PHYDID4);
437 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
sangyun-han3c3e99e2017-02-08 15:30:53 +0900438 testSet.clear();
439 }
440
441 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400442 * Tests adding a null virtual host.
443 */
444 @Test(expected = NullPointerException.class)
445 public void testCreateNullVirtualHost() {
446 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800447 VirtualNetwork virtualNetwork =
448 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400449
450 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
451 }
452
453 /**
454 * Tests adding a virtual host where no virtual network exists.
455 */
456 @Test(expected = IllegalStateException.class)
457 public void testCreateVirtualHostWithNoNetwork() {
458 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800459 VirtualNetwork virtualNetwork =
460 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400461
462 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
463 }
464
465 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800466 * Tests adding a virtual host where no virtual port exists.
467 */
468 @Test(expected = IllegalStateException.class)
469 public void testCreateVirtualHostWithNoVirtualPort() {
470 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
471 VirtualNetwork virtualNetwork1 =
472 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
473 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
474 }
475
476 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400477 * Tests add and remove of virtual hosts.
478 */
479 @Test
480 public void testAddRemoveVirtualHost() {
481 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800482 VirtualNetwork virtualNetwork1 =
483 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
484 VirtualNetwork virtualNetwork2 =
485 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800486
487 VirtualDevice virtualDevice1 =
488 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
489 VirtualDevice virtualDevice2 =
490 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
491
492 ConnectPoint hostCp1 = new ConnectPoint(DID1, P1);
493 ConnectPoint hostCp2 = new ConnectPoint(DID2, P2);
494 manager.createVirtualPort(virtualNetwork1.id(), hostCp1.deviceId(), hostCp1.port(),
495 new ConnectPoint(virtualDevice1.id(), hostCp1.port()));
496 manager.createVirtualPort(virtualNetwork2.id(), hostCp2.deviceId(), hostCp2.port(),
497 new ConnectPoint(virtualDevice2.id(), hostCp2.port()));
498
Brian Stanke7a81b532016-06-14 15:43:51 -0400499 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
500 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
501
502 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
503 assertNotNull("The virtual host set should not be null", virtualHosts1);
504 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
505
506 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
507 assertNotNull("The virtual host set should not be null", virtualHosts2);
508 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
509
510 for (VirtualHost virtualHost : virtualHosts1) {
511 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
512 // attempt to remove the same virtual host again.
513 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
514 }
515 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
516 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
517
518 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800519 VirtualHost virtualHost =
520 manager.createVirtualHost(virtualNetwork1.id(),
521 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400522 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
523 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
524 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
525 }
526
527 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500528 * Tests add and remove of virtual links.
529 */
530 @Test
531 public void testAddRemoveVirtualLink() {
532 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800533 VirtualNetwork virtualNetwork1 =
534 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500535 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400536 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500537 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400538 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500539 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400540 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700541 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400542
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500543 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400544 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700545 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400546
Brian Stanke9a108972016-04-11 15:25:17 -0400547 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
548 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500549
550 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
551 assertNotNull("The virtual link set should not be null", virtualLinks);
552 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
553
554 for (VirtualLink virtualLink : virtualLinks) {
555 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
556 // attempt to remove the same virtual link again.
557 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
558 }
559 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
560 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500561
562 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400563 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500564 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
565 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
566 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500567 }
568
569 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400570 * Tests adding the same virtual link twice.
571 */
572 @Test(expected = IllegalStateException.class)
573 public void testAddSameVirtualLink() {
574 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800575 VirtualNetwork virtualNetwork1 =
576 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400577 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400578 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400579 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400580 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400581 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400582 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700583 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400584
Brian Stanke9a108972016-04-11 15:25:17 -0400585 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400586 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700587 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400588
Brian Stanke9a108972016-04-11 15:25:17 -0400589 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
590 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
591 }
592
Claudine Chiu579969d2017-10-06 14:32:18 -0400593 private VirtualPort getPort(NetworkId networkId, DeviceId deviceId, PortNumber portNumber) {
594 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(networkId, deviceId);
595 return virtualPorts.stream().filter(virtualPort -> virtualPort.number().equals(portNumber))
596 .findFirst().orElse(null);
597 }
598
Brian Stanke9a108972016-04-11 15:25:17 -0400599 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500600 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500601 */
602 @Test
603 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500604 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
605
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500606 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500607 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800608 VirtualNetwork virtualNetwork1 =
609 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500610 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500611 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400612 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500613 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700614 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500615
yoonseon214963b2016-11-21 15:41:07 -0800616 manager.createVirtualPort(virtualNetwork1.id(),
617 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500618 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800619 manager.createVirtualPort(virtualNetwork1.id(),
620 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500621 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500622
Brian Stanke5df14472016-03-11 19:34:38 -0500623 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500624 assertNotNull("The virtual port set should not be null", virtualPorts);
625 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
Claudine Chiu579969d2017-10-06 14:32:18 -0400626 virtualPorts.forEach(vp -> assertFalse("Initial virtual port state should be disabled", vp.isEnabled()));
627
628 // verify change state of virtual port (disabled -> enabled)
629 manager.updatePortState(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), true);
630 VirtualPort changedPort = getPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1));
631 assertNotNull("The changed virtual port should not be null", changedPort);
632 assertEquals("Virtual port state should be enabled", true, changedPort.isEnabled());
633 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
634
635 // verify change state of virtual port (disabled -> disabled)
636 manager.updatePortState(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), false);
637 changedPort = getPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2));
638 assertNotNull("The changed virtual port should not be null", changedPort);
639 assertEquals("Virtual port state should be disabled", false, changedPort.isEnabled());
640 // no VIRTUAL_PORT_UPDATED event is expected - the requested state (disabled) is same as previous state.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500641
642 for (VirtualPort virtualPort : virtualPorts) {
643 manager.removeVirtualPort(virtualNetwork1.id(),
644 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500645 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500646 // attempt to remove the same virtual port again.
647 manager.removeVirtualPort(virtualNetwork1.id(),
648 (DeviceId) virtualPort.element().id(), virtualPort.number());
649 }
Brian Stanke5df14472016-03-11 19:34:38 -0500650 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
651 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
652
653 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800654 VirtualPort virtualPort =
655 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700656 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500657 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
658
659 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
660 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
661 PortNumber.portNumber(1), newCp);
662 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
663
yoonseon214963b2016-11-21 15:41:07 -0800664 manager.removeVirtualPort(virtualNetwork1.id(),
665 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500666 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500667 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500668 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500669
670 // Validate that the events were all received in the correct order.
Yuta HIGUCHI86ac40b2017-11-16 12:25:39 -0800671 validateEvents(expectedEventTypes.toArray(
Claudine Chiu7f872a72016-12-16 13:51:39 -0500672 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500673 }
674
675 /**
Harold Huangb7d6b8e2017-04-03 17:13:33 +0800676 * Tests when a virtual element is removed, all the other elements depending on it are also removed.
677 */
678 @Test
679 public void testRemoveAllElements() {
680 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
681 VirtualNetwork virtualNetwork1 =
682 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
683 VirtualDevice virtualDevice1 =
684 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
685 VirtualDevice virtualDevice2 =
686 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
687 ConnectPoint src = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
688 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
689 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
690
691 ConnectPoint dst = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(2));
692 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
693 new ConnectPoint(PHYDID2, PortNumber.portNumber(2)));
694
695 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
696 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
697
698 ConnectPoint hostCp = new ConnectPoint(DID1, P1);
699 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
700 new ConnectPoint(PHYDID1, P1));
701 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
702
703 //When a virtual port is removed, all virtual links connected to it should also be removed.
704 manager.removeVirtualPort(virtualNetwork1.id(), DID1, PortNumber.portNumber(1));
705 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
706 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
707
708 //When a virtual port is removed, all virtual hosts located to it should also be removed.
709 manager.removeVirtualPort(virtualNetwork1.id(), DID1, P1);
710 Set<VirtualHost> virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
711 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
712
713 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
714 new ConnectPoint(PHYDID1, PortNumber.portNumber(1)));
715 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
716 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
717 manager.createVirtualPort(virtualNetwork1.id(), hostCp.deviceId(), hostCp.port(),
718 new ConnectPoint(PHYDID1, P1));
719 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
720
721 //When a virtual device is removed, all virtual ports, hosts and links depended on it should also be removed.
722 manager.removeVirtualDevice(virtualNetwork1.id(), DID1);
723 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), DID1);
724 assertTrue("The virtual port set of DID1 should be empty", virtualPorts.isEmpty());
725 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
726 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
727 virtualHosts = manager.getVirtualHosts(virtualNetwork1.id());
728 assertTrue("The virtual host set should be empty.", virtualHosts.isEmpty());
729
730 //When a tenantId is removed, all the virtual networks belonging to it should also be removed.
731 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
732 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
733 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
734 assertNotNull("The virtual network set should not be null", virtualNetworks);
735 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
736 }
737
Brian Stanke11f6d532016-07-05 16:17:59 -0400738 /**
739 * Tests the addTunnelId() method in the store with a null intent.
740 */
741 @Test(expected = NullPointerException.class)
742 public void testAddTunnelIdNullIntent() {
743 manager.store.addTunnelId(null, null);
744 }
745
746 /**
747 * Tests the removeTunnelId() method in the store with a null intent.
748 */
749 @Test(expected = NullPointerException.class)
750 public void testRemoveTunnelIdNullIntent() {
751 manager.store.removeTunnelId(null, null);
752 }
753
754 /**
755 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
756 */
757 @Test
758 public void testAddTunnelId() {
759 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
760 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
761 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
762 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
763
764 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
765 .networkId(virtualNetwork.id())
766 .key(Key.of("Test", APP_ID))
767 .appId(APP_ID)
768 .ingressPoint(cp1)
769 .egressPoint(cp2)
770 .build();
771
772 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
773 // Add the intent to tunnelID mapping to the store.
774 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800775 assertEquals("The tunnels size should match.", 1,
776 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400777
778 // Remove the intent to tunnelID mapping from the store.
779 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800780 assertTrue("The tunnels should be empty.",
781 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400782 }
783
Brian Stankefb61df42016-07-25 11:47:51 -0400784
785 /**
Jovana Vuletac884b692017-11-28 16:52:35 +0100786 * Method to create the virtual network for {@code tenantIdValue} for further testing.
Brian Stankefb61df42016-07-25 11:47:51 -0400787 **/
Jovana Vuletac884b692017-11-28 16:52:35 +0100788 private VirtualNetwork setupVirtualNetworkTopology(String tenantIdValue) {
789 manager.registerTenantId(TenantId.tenantId(tenantIdValue));
yoonseon214963b2016-11-21 15:41:07 -0800790 VirtualNetwork virtualNetwork =
Jovana Vuletac884b692017-11-28 16:52:35 +0100791 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue));
Brian Stankefb61df42016-07-25 11:47:51 -0400792
793 VirtualDevice virtualDevice1 =
794 manager.createVirtualDevice(virtualNetwork.id(), DID1);
795 VirtualDevice virtualDevice2 =
796 manager.createVirtualDevice(virtualNetwork.id(), DID2);
797 VirtualDevice virtualDevice3 =
798 manager.createVirtualDevice(virtualNetwork.id(), DID3);
799 VirtualDevice virtualDevice4 =
800 manager.createVirtualDevice(virtualNetwork.id(), DID4);
801 VirtualDevice virtualDevice5 =
802 manager.createVirtualDevice(virtualNetwork.id(), DID5);
803
804 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
805 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700806 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400807
808 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
809 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700810 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400811
812 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
813 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700814 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400815
816 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
817 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700818 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400819
820 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
821 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700822 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400823
824 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
825 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700826 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400827
828 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
829 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700830 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400831
832 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
833 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700834 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400835
836 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
837 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700838 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400839
840 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
841 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
842 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
843 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
844 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
845 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
846 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
847 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
848 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
849 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
850 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
851 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
852
853 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800854 topologyProvider = new DefaultVirtualNetworkProvider();
855 try {
856 TestUtils.setField(topologyProvider, "topologyService", topologyService);
857 } catch (TestUtils.TestUtilsException e) {
858 e.printStackTrace();
859 }
860// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400861
862 return virtualNetwork;
863 }
864
865 /**
866 * Test the topologyChanged() method.
867 */
868 @Test
869 public void testTopologyChanged() {
Jovana Vuletac884b692017-11-28 16:52:35 +0100870 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology(tenantIdValue1);
yoonseon214963b2016-11-21 15:41:07 -0800871 VirtualNetworkProviderService providerService =
872 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400873
874 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800875 assertEquals("The cluster count did not match.", 2,
876 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400877
878 // Adding this link will join the two clusters together.
879 List<Event> reasons = new ArrayList<>();
880 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
881 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
882 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
883 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
884
885 Topology topology = topologyService.currentTopology();
886 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
887
888 // Validate that all links are still active.
889 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800890 assertTrue("The virtual link should be active.",
891 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400892 });
893
894 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
895 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
896 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
897
898 // Validate that all links are active again.
899 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800900 assertTrue("The virtual link should be active.",
901 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400902 });
903 }
904
Brian Stanke11f6d532016-07-05 16:17:59 -0400905 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500906 * Tests that the get() method returns saved service instances.
907 */
908 @Test
909 public void testServiceGetReturnsSavedInstance() {
910 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
911 VirtualNetwork virtualNetwork =
912 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
913
914 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
915 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
916 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500917 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
918 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
919
Yoonseon Han096cea02017-05-15 15:10:41 -0700920 // extra setup needed for FlowRuleService, PacketService, GroupService, and IntentService
Claudine Chiu9a18f492017-02-27 15:57:06 -0500921 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
922 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
923 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
924 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
925 testDirectory.add(CoreService.class, coreService)
926 .add(VirtualProviderRegistryService.class, virtualProviderManager)
927 .add(EventDeliveryService.class, new TestEventDispatcher())
928 .add(ClusterService.class, new ClusterServiceAdapter())
929 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
930 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
yoonseon86bebed2017-02-03 15:23:57 -0800931 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore())
Yoonseon Han096cea02017-05-15 15:10:41 -0700932 .add(VirtualNetworkIntentStore.class, new SimpleVirtualIntentStore())
yoonseon86bebed2017-02-03 15:23:57 -0800933 .add(VirtualNetworkFlowObjectiveStore.class, new SimpleVirtualFlowObjectiveStore());
Claudine Chiu9a18f492017-02-27 15:57:06 -0500934
935 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
Claudine Chiu1f036b82017-03-09 16:45:56 -0500936 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowObjectiveService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500937 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
938 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
Yoonseon Han096cea02017-05-15 15:10:41 -0700939 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
Claudine Chiu9a18f492017-02-27 15:57:06 -0500940 }
941
942 /**
943 * Validates that the get() method returns saved service instances.
944 */
945 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
946 Class<T> serviceClass) {
947 T serviceInstanceFirst = manager.get(networkId, serviceClass);
948 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
949 assertSame(serviceClass.getSimpleName() +
950 ": Subsequent get should be same as the first one",
951 serviceInstanceFirst, serviceInstanceSubsequent);
952 }
953
954 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500955 * Method to validate that the actual versus expected virtual network events were
956 * received correctly.
957 *
958 * @param types expected virtual network events.
959 */
960 private void validateEvents(Enum... types) {
961 TestTools.assertAfter(100, () -> {
962 int i = 0;
963 assertEquals("wrong events received", types.length, listener.events.size());
964 for (Event event : listener.events) {
965 assertEquals("incorrect event type", types[i], event.type());
966 i++;
967 }
968 listener.events.clear();
969 });
970 }
971
972 /**
973 * Test listener class to receive virtual network events.
974 */
975 private static class TestListener implements VirtualNetworkListener {
976
Brian Stanke7a81b532016-06-14 15:43:51 -0400977 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500978
979 @Override
980 public void event(VirtualNetworkEvent event) {
981 events.add(event);
982 }
983
984 }
985
Brian Stanke5df14472016-03-11 19:34:38 -0500986 /**
987 * Core service test class.
988 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500989 private class TestCoreService extends CoreServiceAdapter {
990
991 @Override
992 public IdGenerator getIdGenerator(String topic) {
993 return new IdGenerator() {
994 private AtomicLong counter = new AtomicLong(0);
995
996 @Override
997 public long getNewId() {
998 return counter.getAndIncrement();
999 }
1000 };
1001 }
1002 }
1003}