blob: 3cf045727c22e5c7e3e2c9ac15c8573839cab4b9 [file] [log] [blame]
Brian Stanke0e5c94e2016-03-08 11:20:04 -05001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Brian Stanke0e5c94e2016-03-08 11:20:04 -05003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.incubator.net.virtual.impl;
18
19import com.google.common.collect.Lists;
20import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onlab.junit.TestTools;
24import org.onlab.junit.TestUtils;
yoonseonc6a69272017-01-12 18:22:20 -080025import org.onlab.osgi.TestServiceDirectory;
Claudine Chiu9a18f492017-02-27 15:57:06 -050026import org.onosproject.cluster.ClusterService;
27import org.onosproject.cluster.ClusterServiceAdapter;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050028import org.onosproject.common.event.impl.TestEventDispatcher;
29import org.onosproject.core.CoreService;
30import org.onosproject.core.CoreServiceAdapter;
31import org.onosproject.core.IdGenerator;
32import org.onosproject.event.Event;
Claudine Chiu9a18f492017-02-27 15:57:06 -050033import org.onosproject.event.EventDeliveryService;
Brian Stanke11f6d532016-07-05 16:17:59 -040034import org.onosproject.incubator.net.tunnel.TunnelId;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050035import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
36import org.onosproject.incubator.net.virtual.NetworkId;
37import org.onosproject.incubator.net.virtual.TenantId;
38import org.onosproject.incubator.net.virtual.VirtualDevice;
Brian Stanke7a81b532016-06-14 15:43:51 -040039import org.onosproject.incubator.net.virtual.VirtualHost;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050040import org.onosproject.incubator.net.virtual.VirtualLink;
41import org.onosproject.incubator.net.virtual.VirtualNetwork;
42import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
Claudine Chiu9a18f492017-02-27 15:57:06 -050043import org.onosproject.incubator.net.virtual.VirtualNetworkFlowRuleStore;
44import org.onosproject.incubator.net.virtual.VirtualNetworkGroupStore;
Brian Stanke11f6d532016-07-05 16:17:59 -040045import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050046import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
Claudine Chiu9a18f492017-02-27 15:57:06 -050047import org.onosproject.incubator.net.virtual.VirtualNetworkPacketStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050048import org.onosproject.incubator.net.virtual.VirtualPort;
Claudine Chiu9a18f492017-02-27 15:57:06 -050049import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualFlowRuleProvider;
50import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualGroupProvider;
yoonseon214963b2016-11-21 15:41:07 -080051import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualNetworkProvider;
Claudine Chiu9a18f492017-02-27 15:57:06 -050052import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualPacketProvider;
53import org.onosproject.incubator.net.virtual.impl.provider.VirtualProviderManager;
54import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderService;
55import org.onosproject.incubator.net.virtual.provider.VirtualProviderRegistryService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050056import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
Claudine Chiu9a18f492017-02-27 15:57:06 -050057import org.onosproject.incubator.store.virtual.impl.SimpleVirtualFlowRuleStore;
58import org.onosproject.incubator.store.virtual.impl.SimpleVirtualGroupStore;
59import org.onosproject.incubator.store.virtual.impl.SimpleVirtualPacketStore;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050060import org.onosproject.net.ConnectPoint;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050061import org.onosproject.net.DeviceId;
Brian Stankefb61df42016-07-25 11:47:51 -040062import org.onosproject.net.Link;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050063import org.onosproject.net.NetTestTools;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050064import org.onosproject.net.PortNumber;
Claudine Chiu9a18f492017-02-27 15:57:06 -050065import org.onosproject.net.device.DeviceService;
66import org.onosproject.net.flow.FlowRuleService;
67import org.onosproject.net.group.GroupService;
68import org.onosproject.net.host.HostService;
Brian Stanke11f6d532016-07-05 16:17:59 -040069import org.onosproject.net.intent.FakeIntentManager;
70import org.onosproject.net.intent.Intent;
Claudine Chiu9a18f492017-02-27 15:57:06 -050071import org.onosproject.net.intent.IntentService;
Brian Stanke11f6d532016-07-05 16:17:59 -040072import org.onosproject.net.intent.IntentState;
73import org.onosproject.net.intent.Key;
74import org.onosproject.net.intent.MockIdGenerator;
75import org.onosproject.net.intent.TestableIntentService;
Claudine Chiu9a18f492017-02-27 15:57:06 -050076import org.onosproject.net.link.LinkService;
77import org.onosproject.net.packet.PacketService;
78import org.onosproject.net.topology.PathService;
Brian Stankefb61df42016-07-25 11:47:51 -040079import org.onosproject.net.topology.Topology;
80import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050081import org.onosproject.store.service.TestStorageService;
82
83import java.util.Collection;
84import java.util.List;
sangyun-han3c3e99e2017-02-08 15:30:53 +090085import java.util.ArrayList;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050086import java.util.Set;
sangyun-han3c3e99e2017-02-08 15:30:53 +090087import java.util.HashSet;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050088import java.util.concurrent.atomic.AtomicLong;
89
90import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040091import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050092
93/**
94 * Junit tests for VirtualNetworkManager.
95 */
sangyun-han3c3e99e2017-02-08 15:30:53 +090096public class VirtualNetworkManagerTest extends VirtualNetworkTestUtil {
Brian Stanke86914282016-05-25 15:36:50 -040097 private final String tenantIdValue1 = "TENANT_ID1";
98 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -050099
100 private VirtualNetworkManager manager;
yoonseon214963b2016-11-21 15:41:07 -0800101 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500102 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
103 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -0400104 private TestListener listener = new TestListener();
Brian Stanke11f6d532016-07-05 16:17:59 -0400105 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -0400106 private TopologyService topologyService;
Brian Stanke11f6d532016-07-05 16:17:59 -0400107 private IdGenerator idGenerator = new MockIdGenerator();
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 Vachuska23235962017-02-03 11:44:15 -0800117 Intent.unbindIdGenerator(idGenerator);
Brian Stanke11f6d532016-07-05 16:17:59 -0400118 Intent.bindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500119
120 coreService = new TestCoreService();
yoonseonc6a69272017-01-12 18:22:20 -0800121 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
yoonseon214963b2016-11-21 15:41:07 -0800122 TestUtils.setField(virtualNetworkManagerStore, "storageService",
123 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500124 virtualNetworkManagerStore.activate();
125
126 manager = new VirtualNetworkManager();
127 manager.store = virtualNetworkManagerStore;
128 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400129 manager.intentService = intentService;
yoonseon322c9c32016-12-07 16:47:02 -0800130 manager.coreService = coreService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500131 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800132
133 testDirectory = new TestServiceDirectory();
134 TestUtils.setField(manager, "serviceDirectory", testDirectory);
135
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500136 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500137 }
138
139 @After
140 public void tearDown() {
141 virtualNetworkManagerStore.deactivate();
142 manager.removeListener(listener);
143 manager.deactivate();
144 NetTestTools.injectEventDispatcher(manager, null);
Brian Stanke11f6d532016-07-05 16:17:59 -0400145 Intent.unbindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500146 }
147
148 /**
149 * Tests registering a null tenant id.
150 */
151 @Test(expected = NullPointerException.class)
152 public void testRegisterNullTenantId() {
153 manager.registerTenantId(null);
154 }
155
156 /**
157 * Tests registering/unregistering a tenant id.
158 */
159 @Test
160 public void testRegisterUnregisterTenantId() {
161 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
162 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
163 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
164 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
165 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
166
167 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
168 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
169 tenantIdCollection = manager.getTenantIds();
170 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
171
172 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800173 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
174 VirtualNetworkEvent.Type.TENANT_REGISTERED,
175 VirtualNetworkEvent.Type.TENANT_REGISTERED,
176 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500177 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
178 }
179
180 /**
181 * Tests adding a null virtual network.
182 */
183 @Test(expected = NullPointerException.class)
184 public void testCreateNullVirtualNetwork() {
185 manager.createVirtualNetwork(null);
186 }
187
188 /**
189 * Tests add and remove of virtual networks.
190 */
191 @Test
192 public void testAddRemoveVirtualNetwork() {
193 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
194 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
195 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
196 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
197 assertNotNull("The virtual network set should not be null", virtualNetworks);
198 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
199
Brian Stanke5df14472016-03-11 19:34:38 -0500200 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500201 for (VirtualNetwork virtualNetwork : virtualNetworks) {
202 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500203 assertEquals("The expected virtual network size does not match",
204 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500205 // attempt to remove the same virtual network again.
206 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500207 assertEquals("The expected virtual network size does not match",
208 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500209 }
210 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
211 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
212
Brian Stanke5df14472016-03-11 19:34:38 -0500213 // Create/remove a virtual network.
214 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
215 manager.removeVirtualNetwork(virtualNetwork.id());
216
217 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
218 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
219
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500220 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800221 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
222 VirtualNetworkEvent.Type.NETWORK_ADDED,
223 VirtualNetworkEvent.Type.NETWORK_ADDED,
224 VirtualNetworkEvent.Type.NETWORK_REMOVED,
225 VirtualNetworkEvent.Type.NETWORK_REMOVED,
226 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500227 VirtualNetworkEvent.Type.NETWORK_REMOVED);
228 }
229
230 /**
231 * Tests adding a null virtual device.
232 */
233 @Test(expected = NullPointerException.class)
234 public void testCreateNullVirtualDevice() {
235 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
236 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
237
238 manager.createVirtualDevice(virtualNetwork.id(), null);
239 }
240
241 /**
242 * Tests adding a virtual device where no virtual network exists.
243 */
244 @Test(expected = IllegalStateException.class)
245 public void testCreateVirtualDeviceWithNoNetwork() {
246 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800247 VirtualNetwork virtualNetwork =
248 new DefaultVirtualNetwork(NetworkId.NONE,
249 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500250
Brian Stanke7a81b532016-06-14 15:43:51 -0400251 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500252 }
253
254 /**
255 * Tests add and remove of virtual devices.
256 */
257 @Test
258 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500259 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
260
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500261 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500262 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800263 VirtualNetwork virtualNetwork1 =
264 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500265 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800266 VirtualNetwork virtualNetwork2 =
267 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500268 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400269 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500270 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400271 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500272 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500273
274 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
275 assertNotNull("The virtual device set should not be null", virtualDevices1);
276 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
277
278 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
279 assertNotNull("The virtual device set should not be null", virtualDevices2);
280 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
281
282 for (VirtualDevice virtualDevice : virtualDevices1) {
283 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500284 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
285 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500286 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
287 }
288 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
289 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
290
Brian Stanke5df14472016-03-11 19:34:38 -0500291 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400292 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500293 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500294 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500295 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500296 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
297 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
298
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500299 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500300 validateEvents((Enum[]) expectedEventTypes.toArray(
301 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500302 }
303
304 /**
sangyun-han3c3e99e2017-02-08 15:30:53 +0900305 * Tests getting a collection of physical device identifier corresponding to
306 * the specified virtual device.
307 */
308 @Test
309 public void testGetPhysicalDevices() {
310 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
311 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
312
313 VirtualNetwork virtualNetwork1 =
314 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
315 VirtualNetwork virtualNetwork2 =
316 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue2));
317
318 // two virtual device in first virtual network
319 VirtualDevice vDevice1InVnet1 =
320 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
321 VirtualDevice vDevice2InVnet1 =
322 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
323 // Two virtual device in second virtual network
324 VirtualDevice vDevice1InVnet2 =
325 manager.createVirtualDevice(virtualNetwork2.id(), DID1);
326 VirtualDevice vDevice2InVnet2 =
327 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
328
329 // Connection Point from each physical device
330 // Virtual network 1
331 ConnectPoint cp1InVnet1 =
332 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
333 ConnectPoint cp2InVnet1 =
334 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
335 ConnectPoint cp3InVnet1 =
336 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
337 ConnectPoint cp4InVnet1 =
338 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
339 // Virtual network 2
340 ConnectPoint cp1InVnet2 =
341 new ConnectPoint(PHYDID1, PortNumber.portNumber(10));
342 ConnectPoint cp2InVnet2 =
343 new ConnectPoint(PHYDID2, PortNumber.portNumber(20));
344 ConnectPoint cp3InVnet2 =
345 new ConnectPoint(PHYDID3, PortNumber.portNumber(30));
346 ConnectPoint cp4InVnet2 =
347 new ConnectPoint(PHYDID4, PortNumber.portNumber(40));
348
349 // Make simple BigSwitch by mapping two phyDevice to one vDevice
350 // First vDevice in first virtual network
351 manager.createVirtualPort(virtualNetwork1.id(),
352 vDevice1InVnet1.id(), PortNumber.portNumber(1), cp1InVnet1);
353 manager.createVirtualPort(virtualNetwork1.id(),
354 vDevice1InVnet1.id(), PortNumber.portNumber(2), cp2InVnet1);
355 // Second vDevice in first virtual network
356 manager.createVirtualPort(virtualNetwork1.id(),
357 vDevice2InVnet1.id(), PortNumber.portNumber(1), cp3InVnet1);
358 manager.createVirtualPort(virtualNetwork1.id(),
359 vDevice2InVnet1.id(), PortNumber.portNumber(2), cp4InVnet1);
360 // First vDevice in second virtual network
361 manager.createVirtualPort(virtualNetwork2.id(),
362 vDevice1InVnet2.id(), PortNumber.portNumber(1), cp1InVnet2);
363 manager.createVirtualPort(virtualNetwork2.id(),
364 vDevice1InVnet2.id(), PortNumber.portNumber(2), cp2InVnet2);
365 // Second vDevice in second virtual network
366 manager.createVirtualPort(virtualNetwork2.id(),
367 vDevice2InVnet2.id(), PortNumber.portNumber(1), cp3InVnet2);
368 manager.createVirtualPort(virtualNetwork2.id(),
369 vDevice2InVnet2.id(), PortNumber.portNumber(2), cp4InVnet2);
370
371
372 Set<DeviceId> physicalDeviceSet;
373 Set<DeviceId> testSet = new HashSet<>();
374 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice1InVnet1);
375 testSet.add(PHYDID1);
376 testSet.add(PHYDID2);
377 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
378 physicalDeviceSet.clear();
379 testSet.clear();
380
381 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork1.id(), vDevice2InVnet1);
382 testSet.add(PHYDID3);
383 testSet.add(PHYDID4);
384 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
385 physicalDeviceSet.clear();
386 testSet.clear();
387
388 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice1InVnet2);
389 testSet.add(PHYDID1);
390 testSet.add(PHYDID2);
391 assertEquals("The physical devices 1 did not match", testSet, physicalDeviceSet);
392 physicalDeviceSet.clear();
393 testSet.clear();
394
395 physicalDeviceSet = manager.getPhysicalDevices(virtualNetwork2.id(), vDevice2InVnet2);
396 testSet.add(PHYDID3);
397 testSet.add(PHYDID4);
398 assertEquals("The physical devices 2 did not match", testSet, physicalDeviceSet);
399 physicalDeviceSet.clear();
400 testSet.clear();
401 }
402
403 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400404 * Tests adding a null virtual host.
405 */
406 @Test(expected = NullPointerException.class)
407 public void testCreateNullVirtualHost() {
408 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800409 VirtualNetwork virtualNetwork =
410 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400411
412 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
413 }
414
415 /**
416 * Tests adding a virtual host where no virtual network exists.
417 */
418 @Test(expected = IllegalStateException.class)
419 public void testCreateVirtualHostWithNoNetwork() {
420 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800421 VirtualNetwork virtualNetwork =
422 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400423
424 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
425 }
426
427 /**
428 * Tests add and remove of virtual hosts.
429 */
430 @Test
431 public void testAddRemoveVirtualHost() {
432 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800433 VirtualNetwork virtualNetwork1 =
434 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
435 VirtualNetwork virtualNetwork2 =
436 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400437 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
438 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
439
440 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
441 assertNotNull("The virtual host set should not be null", virtualHosts1);
442 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
443
444 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
445 assertNotNull("The virtual host set should not be null", virtualHosts2);
446 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
447
448 for (VirtualHost virtualHost : virtualHosts1) {
449 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
450 // attempt to remove the same virtual host again.
451 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
452 }
453 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
454 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
455
456 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800457 VirtualHost virtualHost =
458 manager.createVirtualHost(virtualNetwork1.id(),
459 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400460 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
461 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
462 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
463 }
464
465 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500466 * Tests add and remove of virtual links.
467 */
468 @Test
469 public void testAddRemoveVirtualLink() {
470 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800471 VirtualNetwork virtualNetwork1 =
472 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500473 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400474 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500475 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400476 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500477 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400478 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700479 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400480
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500481 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400482 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700483 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400484
Brian Stanke9a108972016-04-11 15:25:17 -0400485 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
486 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500487
488 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
489 assertNotNull("The virtual link set should not be null", virtualLinks);
490 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
491
492 for (VirtualLink virtualLink : virtualLinks) {
493 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
494 // attempt to remove the same virtual link again.
495 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
496 }
497 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
498 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500499
500 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400501 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500502 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
503 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
504 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500505 }
506
507 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400508 * Tests adding the same virtual link twice.
509 */
510 @Test(expected = IllegalStateException.class)
511 public void testAddSameVirtualLink() {
512 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800513 VirtualNetwork virtualNetwork1 =
514 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400515 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400516 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400517 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400518 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400519 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400520 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700521 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400522
Brian Stanke9a108972016-04-11 15:25:17 -0400523 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400524 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700525 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400526
Brian Stanke9a108972016-04-11 15:25:17 -0400527 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
528 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
529 }
530
531 /**
Claudine Chiu7f872a72016-12-16 13:51:39 -0500532 * Tests add, bind and remove of virtual ports.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500533 */
534 @Test
535 public void testAddRemoveVirtualPort() {
Claudine Chiu7f872a72016-12-16 13:51:39 -0500536 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
537
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500538 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500539 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800540 VirtualNetwork virtualNetwork1 =
541 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu7f872a72016-12-16 13:51:39 -0500542 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500543 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400544 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500545 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Yoonseon Han6c603892016-09-01 11:52:21 -0700546 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500547
yoonseon214963b2016-11-21 15:41:07 -0800548 manager.createVirtualPort(virtualNetwork1.id(),
549 virtualDevice.id(), PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500550 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800551 manager.createVirtualPort(virtualNetwork1.id(),
552 virtualDevice.id(), PortNumber.portNumber(2), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500553 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500554
Brian Stanke5df14472016-03-11 19:34:38 -0500555 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500556 assertNotNull("The virtual port set should not be null", virtualPorts);
557 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
558
559 for (VirtualPort virtualPort : virtualPorts) {
560 manager.removeVirtualPort(virtualNetwork1.id(),
561 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500562 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500563 // attempt to remove the same virtual port again.
564 manager.removeVirtualPort(virtualNetwork1.id(),
565 (DeviceId) virtualPort.element().id(), virtualPort.number());
566 }
Brian Stanke5df14472016-03-11 19:34:38 -0500567 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
568 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
569
570 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800571 VirtualPort virtualPort =
572 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700573 PortNumber.portNumber(1), cp);
Claudine Chiu7f872a72016-12-16 13:51:39 -0500574 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_ADDED);
575
576 ConnectPoint newCp = new ConnectPoint(DID2, PortNumber.portNumber(2));
577 manager.bindVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
578 PortNumber.portNumber(1), newCp);
579 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_UPDATED);
580
yoonseon214963b2016-11-21 15:41:07 -0800581 manager.removeVirtualPort(virtualNetwork1.id(),
582 (DeviceId) virtualPort.element().id(), virtualPort.number());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500583 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_PORT_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500584 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500585 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
Claudine Chiu7f872a72016-12-16 13:51:39 -0500586
587 // Validate that the events were all received in the correct order.
588 validateEvents((Enum[]) expectedEventTypes.toArray(
589 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500590 }
591
592 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400593 * Tests the addOrUpdateIntent() method in the store with a null intent.
594 */
595 @Test(expected = NullPointerException.class)
596 public void testAddOrUpdateNullIntent() {
597 manager.store.addOrUpdateIntent(null, null);
598 }
599
600 /**
601 * Tests the removeIntent() method in the store with a null intent key.
602 */
603 @Test(expected = NullPointerException.class)
604 public void testRemoveNullIntentKey() {
605 manager.store.removeIntent(null);
606 }
607
608 /**
609 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
610 */
611 @Test
612 public void testAddOrUpdateIntent() {
613 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800614 VirtualNetwork virtualNetwork =
615 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke11f6d532016-07-05 16:17:59 -0400616 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
617 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
618
619 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
620 .networkId(virtualNetwork.id())
621 .key(Key.of("Test", APP_ID))
622 .appId(APP_ID)
623 .ingressPoint(cp1)
624 .egressPoint(cp2)
625 .build();
626
627 // Add the intent to the store.
628 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
yoonseon214963b2016-11-21 15:41:07 -0800629 assertEquals("The intent size should match.", 1,
630 manager.store.getIntents().size());
631 assertNotNull("The intent should not be null.",
632 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400633
634 // remove the intent from the store.
635 manager.store.removeIntent(virtualIntent.key());
yoonseon214963b2016-11-21 15:41:07 -0800636 assertTrue("The intents should be empty.",
637 manager.store.getIntents().isEmpty());
638 assertNull("The intent should be null.",
639 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400640 }
641
642 /**
643 * Tests the addTunnelId() method in the store with a null intent.
644 */
645 @Test(expected = NullPointerException.class)
646 public void testAddTunnelIdNullIntent() {
647 manager.store.addTunnelId(null, null);
648 }
649
650 /**
651 * Tests the removeTunnelId() method in the store with a null intent.
652 */
653 @Test(expected = NullPointerException.class)
654 public void testRemoveTunnelIdNullIntent() {
655 manager.store.removeTunnelId(null, null);
656 }
657
658 /**
659 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
660 */
661 @Test
662 public void testAddTunnelId() {
663 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
664 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
665 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
666 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
667
668 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
669 .networkId(virtualNetwork.id())
670 .key(Key.of("Test", APP_ID))
671 .appId(APP_ID)
672 .ingressPoint(cp1)
673 .egressPoint(cp2)
674 .build();
675
676 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
677 // Add the intent to tunnelID mapping to the store.
678 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800679 assertEquals("The tunnels size should match.", 1,
680 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400681
682 // Remove the intent to tunnelID mapping from the store.
683 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800684 assertTrue("The tunnels should be empty.",
685 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400686 }
687
Brian Stankefb61df42016-07-25 11:47:51 -0400688
689 /**
690 * Method to create the virtual network for further testing.
691 **/
692 private VirtualNetwork setupVirtualNetworkTopology() {
693 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800694 VirtualNetwork virtualNetwork =
695 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400696
697 VirtualDevice virtualDevice1 =
698 manager.createVirtualDevice(virtualNetwork.id(), DID1);
699 VirtualDevice virtualDevice2 =
700 manager.createVirtualDevice(virtualNetwork.id(), DID2);
701 VirtualDevice virtualDevice3 =
702 manager.createVirtualDevice(virtualNetwork.id(), DID3);
703 VirtualDevice virtualDevice4 =
704 manager.createVirtualDevice(virtualNetwork.id(), DID4);
705 VirtualDevice virtualDevice5 =
706 manager.createVirtualDevice(virtualNetwork.id(), DID5);
707
708 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
709 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700710 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400711
712 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
713 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700714 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400715
716 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
717 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700718 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400719
720 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
721 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700722 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400723
724 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
725 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700726 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400727
728 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
729 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700730 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400731
732 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
733 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700734 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400735
736 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
737 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700738 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400739
740 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
741 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700742 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400743
744 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
745 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
746 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
747 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
748 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
749 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
750 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
751 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
752 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
753 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
754 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
755 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
756
757 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800758 topologyProvider = new DefaultVirtualNetworkProvider();
759 try {
760 TestUtils.setField(topologyProvider, "topologyService", topologyService);
761 } catch (TestUtils.TestUtilsException e) {
762 e.printStackTrace();
763 }
764// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400765
766 return virtualNetwork;
767 }
768
769 /**
770 * Test the topologyChanged() method.
771 */
772 @Test
773 public void testTopologyChanged() {
774 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800775 VirtualNetworkProviderService providerService =
776 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400777
778 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800779 assertEquals("The cluster count did not match.", 2,
780 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400781
782 // Adding this link will join the two clusters together.
783 List<Event> reasons = new ArrayList<>();
784 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
785 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
786 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
787 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
788
789 Topology topology = topologyService.currentTopology();
790 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
791
792 // Validate that all links are still active.
793 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800794 assertTrue("The virtual link should be active.",
795 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400796 });
797
798 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
799 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
800 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
801
802 // Validate that all links are active again.
803 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800804 assertTrue("The virtual link should be active.",
805 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400806 });
807 }
808
Brian Stanke11f6d532016-07-05 16:17:59 -0400809 /**
Claudine Chiu9a18f492017-02-27 15:57:06 -0500810 * Tests that the get() method returns saved service instances.
811 */
812 @Test
813 public void testServiceGetReturnsSavedInstance() {
814 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
815 VirtualNetwork virtualNetwork =
816 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
817
818 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), DeviceService.class);
819 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), LinkService.class);
820 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), TopologyService.class);
821 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), IntentService.class);
822 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), HostService.class);
823 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PathService.class);
824
825 // extra setup needed for FlowRuleService, PacketService, GroupService
826 VirtualProviderManager virtualProviderManager = new VirtualProviderManager();
827 virtualProviderManager.registerProvider(new DefaultVirtualFlowRuleProvider());
828 virtualProviderManager.registerProvider(new DefaultVirtualPacketProvider());
829 virtualProviderManager.registerProvider(new DefaultVirtualGroupProvider());
830 testDirectory.add(CoreService.class, coreService)
831 .add(VirtualProviderRegistryService.class, virtualProviderManager)
832 .add(EventDeliveryService.class, new TestEventDispatcher())
833 .add(ClusterService.class, new ClusterServiceAdapter())
834 .add(VirtualNetworkFlowRuleStore.class, new SimpleVirtualFlowRuleStore())
835 .add(VirtualNetworkPacketStore.class, new SimpleVirtualPacketStore())
836 .add(VirtualNetworkGroupStore.class, new SimpleVirtualGroupStore());
837
838 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), FlowRuleService.class);
839 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), PacketService.class);
840 validateServiceGetReturnsSavedInstance(virtualNetwork.id(), GroupService.class);
841 }
842
843 /**
844 * Validates that the get() method returns saved service instances.
845 */
846 private <T> void validateServiceGetReturnsSavedInstance(NetworkId networkId,
847 Class<T> serviceClass) {
848 T serviceInstanceFirst = manager.get(networkId, serviceClass);
849 T serviceInstanceSubsequent = manager.get(networkId, serviceClass);
850 assertSame(serviceClass.getSimpleName() +
851 ": Subsequent get should be same as the first one",
852 serviceInstanceFirst, serviceInstanceSubsequent);
853 }
854
855 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500856 * Method to validate that the actual versus expected virtual network events were
857 * received correctly.
858 *
859 * @param types expected virtual network events.
860 */
861 private void validateEvents(Enum... types) {
862 TestTools.assertAfter(100, () -> {
863 int i = 0;
864 assertEquals("wrong events received", types.length, listener.events.size());
865 for (Event event : listener.events) {
866 assertEquals("incorrect event type", types[i], event.type());
867 i++;
868 }
869 listener.events.clear();
870 });
871 }
872
873 /**
874 * Test listener class to receive virtual network events.
875 */
876 private static class TestListener implements VirtualNetworkListener {
877
Brian Stanke7a81b532016-06-14 15:43:51 -0400878 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500879
880 @Override
881 public void event(VirtualNetworkEvent event) {
882 events.add(event);
883 }
884
885 }
886
Brian Stanke5df14472016-03-11 19:34:38 -0500887 /**
888 * Core service test class.
889 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500890 private class TestCoreService extends CoreServiceAdapter {
891
892 @Override
893 public IdGenerator getIdGenerator(String topic) {
894 return new IdGenerator() {
895 private AtomicLong counter = new AtomicLong(0);
896
897 @Override
898 public long getNewId() {
899 return counter.getAndIncrement();
900 }
901 };
902 }
903 }
904}