blob: 644ba0c900a9a1ceb87965ba30e376cfadc9a8ae [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;
25import org.onosproject.common.event.impl.TestEventDispatcher;
26import org.onosproject.core.CoreService;
27import org.onosproject.core.CoreServiceAdapter;
28import org.onosproject.core.IdGenerator;
29import org.onosproject.event.Event;
Brian Stanke11f6d532016-07-05 16:17:59 -040030import org.onosproject.incubator.net.tunnel.TunnelId;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050031import org.onosproject.incubator.net.virtual.DefaultVirtualNetwork;
32import org.onosproject.incubator.net.virtual.NetworkId;
33import org.onosproject.incubator.net.virtual.TenantId;
34import org.onosproject.incubator.net.virtual.VirtualDevice;
Brian Stanke7a81b532016-06-14 15:43:51 -040035import org.onosproject.incubator.net.virtual.VirtualHost;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050036import org.onosproject.incubator.net.virtual.VirtualLink;
37import org.onosproject.incubator.net.virtual.VirtualNetwork;
38import org.onosproject.incubator.net.virtual.VirtualNetworkEvent;
Brian Stanke11f6d532016-07-05 16:17:59 -040039import org.onosproject.incubator.net.virtual.VirtualNetworkIntent;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050040import org.onosproject.incubator.net.virtual.VirtualNetworkListener;
Brian Stankefb61df42016-07-25 11:47:51 -040041import org.onosproject.incubator.net.virtual.VirtualNetworkProviderService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050042import org.onosproject.incubator.net.virtual.VirtualPort;
43import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
44import org.onosproject.net.ConnectPoint;
45import org.onosproject.net.DefaultPort;
46import org.onosproject.net.DeviceId;
Brian Stankefb61df42016-07-25 11:47:51 -040047import org.onosproject.net.Link;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050048import org.onosproject.net.NetTestTools;
49import org.onosproject.net.Port;
50import org.onosproject.net.PortNumber;
Brian Stanke7a81b532016-06-14 15:43:51 -040051import org.onosproject.net.TestDeviceParams;
Brian Stanke11f6d532016-07-05 16:17:59 -040052import org.onosproject.net.intent.FakeIntentManager;
53import org.onosproject.net.intent.Intent;
54import org.onosproject.net.intent.IntentState;
55import org.onosproject.net.intent.Key;
56import org.onosproject.net.intent.MockIdGenerator;
57import org.onosproject.net.intent.TestableIntentService;
Brian Stankefb61df42016-07-25 11:47:51 -040058import org.onosproject.net.topology.Topology;
59import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050060import org.onosproject.store.service.TestStorageService;
61
Brian Stankefb61df42016-07-25 11:47:51 -040062import java.util.ArrayList;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050063import java.util.Collection;
64import java.util.List;
65import java.util.Set;
66import java.util.concurrent.atomic.AtomicLong;
67
68import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040069import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050070
71/**
72 * Junit tests for VirtualNetworkManager.
73 */
Brian Stanke7a81b532016-06-14 15:43:51 -040074public class VirtualNetworkManagerTest extends TestDeviceParams {
Brian Stanke86914282016-05-25 15:36:50 -040075 private final String tenantIdValue1 = "TENANT_ID1";
76 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -050077
78 private VirtualNetworkManager manager;
Brian Stankefb61df42016-07-25 11:47:51 -040079 private VirtualNetworkTopologyProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050080 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
81 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -040082 private TestListener listener = new TestListener();
Brian Stanke11f6d532016-07-05 16:17:59 -040083 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -040084 private TopologyService topologyService;
Brian Stanke11f6d532016-07-05 16:17:59 -040085 private IdGenerator idGenerator = new MockIdGenerator();
Brian Stanke0e5c94e2016-03-08 11:20:04 -050086
Brian Stankefb61df42016-07-25 11:47:51 -040087 private ConnectPoint cp6;
88 private ConnectPoint cp7;
89
Brian Stanke0e5c94e2016-03-08 11:20:04 -050090 @Before
91 public void setUp() throws Exception {
92 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Brian Stanke11f6d532016-07-05 16:17:59 -040093 Intent.bindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050094
95 coreService = new TestCoreService();
96 virtualNetworkManagerStore.setCoreService(coreService);
97 TestUtils.setField(coreService, "coreService", new TestCoreService());
98 TestUtils.setField(virtualNetworkManagerStore, "storageService", new TestStorageService());
99 virtualNetworkManagerStore.activate();
100
101 manager = new VirtualNetworkManager();
102 manager.store = virtualNetworkManagerStore;
103 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400104 manager.intentService = intentService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500105 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
106 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500107 }
108
109 @After
110 public void tearDown() {
111 virtualNetworkManagerStore.deactivate();
112 manager.removeListener(listener);
113 manager.deactivate();
114 NetTestTools.injectEventDispatcher(manager, null);
Brian Stanke11f6d532016-07-05 16:17:59 -0400115 Intent.unbindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500116 }
117
118 /**
119 * Tests registering a null tenant id.
120 */
121 @Test(expected = NullPointerException.class)
122 public void testRegisterNullTenantId() {
123 manager.registerTenantId(null);
124 }
125
126 /**
127 * Tests registering/unregistering a tenant id.
128 */
129 @Test
130 public void testRegisterUnregisterTenantId() {
131 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
132 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
133 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
134 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
135 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
136
137 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
138 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
139 tenantIdCollection = manager.getTenantIds();
140 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
141
142 // Validate that the events were all received in the correct order.
143 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED, VirtualNetworkEvent.Type.TENANT_REGISTERED,
144 VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
145 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
146 }
147
148 /**
149 * Tests adding a null virtual network.
150 */
151 @Test(expected = NullPointerException.class)
152 public void testCreateNullVirtualNetwork() {
153 manager.createVirtualNetwork(null);
154 }
155
156 /**
157 * Tests add and remove of virtual networks.
158 */
159 @Test
160 public void testAddRemoveVirtualNetwork() {
161 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
162 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
163 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
164 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
165 assertNotNull("The virtual network set should not be null", virtualNetworks);
166 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
167
Brian Stanke5df14472016-03-11 19:34:38 -0500168 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500169 for (VirtualNetwork virtualNetwork : virtualNetworks) {
170 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500171 assertEquals("The expected virtual network size does not match",
172 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500173 // attempt to remove the same virtual network again.
174 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500175 assertEquals("The expected virtual network size does not match",
176 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500177 }
178 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
179 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
180
Brian Stanke5df14472016-03-11 19:34:38 -0500181 // Create/remove a virtual network.
182 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
183 manager.removeVirtualNetwork(virtualNetwork.id());
184
185 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
186 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
187
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500188 // Validate that the events were all received in the correct order.
189 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
190 VirtualNetworkEvent.Type.NETWORK_ADDED, VirtualNetworkEvent.Type.NETWORK_REMOVED,
Brian Stanke5df14472016-03-11 19:34:38 -0500191 VirtualNetworkEvent.Type.NETWORK_REMOVED, VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500192 VirtualNetworkEvent.Type.NETWORK_REMOVED);
193 }
194
195 /**
196 * Tests adding a null virtual device.
197 */
198 @Test(expected = NullPointerException.class)
199 public void testCreateNullVirtualDevice() {
200 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
201 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
202
203 manager.createVirtualDevice(virtualNetwork.id(), null);
204 }
205
206 /**
207 * Tests adding a virtual device where no virtual network exists.
208 */
209 @Test(expected = IllegalStateException.class)
210 public void testCreateVirtualDeviceWithNoNetwork() {
211 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
212 VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
213
Brian Stanke7a81b532016-06-14 15:43:51 -0400214 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500215 }
216
217 /**
218 * Tests add and remove of virtual devices.
219 */
220 @Test
221 public void testAddRemoveVirtualDevice() {
222 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
223 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
224 VirtualNetwork virtualNetwork2 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400225 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
226 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500227
228 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
229 assertNotNull("The virtual device set should not be null", virtualDevices1);
230 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
231
232 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
233 assertNotNull("The virtual device set should not be null", virtualDevices2);
234 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
235
236 for (VirtualDevice virtualDevice : virtualDevices1) {
237 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
238 // attempt to remove the same virtual device again.
239 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
240 }
241 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
242 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
243
Brian Stanke5df14472016-03-11 19:34:38 -0500244 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400245 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke5df14472016-03-11 19:34:38 -0500246 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
247 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
248 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
249
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500250 // Validate that the events were all received in the correct order.
251 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
252 VirtualNetworkEvent.Type.NETWORK_ADDED);
253 }
254
255 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400256 * Tests adding a null virtual host.
257 */
258 @Test(expected = NullPointerException.class)
259 public void testCreateNullVirtualHost() {
260 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
261 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
262
263 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
264 }
265
266 /**
267 * Tests adding a virtual host where no virtual network exists.
268 */
269 @Test(expected = IllegalStateException.class)
270 public void testCreateVirtualHostWithNoNetwork() {
271 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
272 VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
273
274 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
275 }
276
277 /**
278 * Tests add and remove of virtual hosts.
279 */
280 @Test
281 public void testAddRemoveVirtualHost() {
282 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
283 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
284 VirtualNetwork virtualNetwork2 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
285 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
286 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
287
288 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
289 assertNotNull("The virtual host set should not be null", virtualHosts1);
290 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
291
292 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
293 assertNotNull("The virtual host set should not be null", virtualHosts2);
294 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
295
296 for (VirtualHost virtualHost : virtualHosts1) {
297 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
298 // attempt to remove the same virtual host again.
299 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
300 }
301 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
302 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
303
304 // Add/remove the virtual host again.
305 VirtualHost virtualHost = manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
306 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
307 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
308 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
309 }
310
311 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500312 * Tests add and remove of virtual links.
313 */
314 @Test
315 public void testAddRemoveVirtualLink() {
316 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
317 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
318 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400319 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500320 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400321 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500322 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400323 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
324 new DefaultPort(srcVirtualDevice, src.port(), true));
325
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500326 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400327 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
328 new DefaultPort(dstVirtualDevice, dst.port(), true));
329
Brian Stanke9a108972016-04-11 15:25:17 -0400330 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
331 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500332
333 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
334 assertNotNull("The virtual link set should not be null", virtualLinks);
335 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
336
337 for (VirtualLink virtualLink : virtualLinks) {
338 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
339 // attempt to remove the same virtual link again.
340 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
341 }
342 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
343 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500344
345 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400346 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500347 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
348 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
349 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500350 }
351
352 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400353 * Tests adding the same virtual link twice.
354 */
355 @Test(expected = IllegalStateException.class)
356 public void testAddSameVirtualLink() {
357 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
358 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
359 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400360 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400361 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400362 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400363 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400364 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
365 new DefaultPort(srcVirtualDevice, src.port(), true));
366
Brian Stanke9a108972016-04-11 15:25:17 -0400367 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400368 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
369 new DefaultPort(dstVirtualDevice, dst.port(), true));
370
Brian Stanke9a108972016-04-11 15:25:17 -0400371 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
372 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
373 }
374
375 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500376 * Tests add and remove of virtual ports.
377 */
378 @Test
379 public void testAddRemoveVirtualPort() {
380 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
381 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke5df14472016-03-11 19:34:38 -0500382 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400383 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke5df14472016-03-11 19:34:38 -0500384 Port port = new DefaultPort(virtualDevice, PortNumber.portNumber(1), true);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500385
Brian Stanke5df14472016-03-11 19:34:38 -0500386 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), port);
387 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), port);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500388
Brian Stanke5df14472016-03-11 19:34:38 -0500389 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500390 assertNotNull("The virtual port set should not be null", virtualPorts);
391 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
392
Brian Stanke5df14472016-03-11 19:34:38 -0500393
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500394 for (VirtualPort virtualPort : virtualPorts) {
395 manager.removeVirtualPort(virtualNetwork1.id(),
396 (DeviceId) virtualPort.element().id(), virtualPort.number());
397 // attempt to remove the same virtual port again.
398 manager.removeVirtualPort(virtualNetwork1.id(),
399 (DeviceId) virtualPort.element().id(), virtualPort.number());
400 }
Brian Stanke5df14472016-03-11 19:34:38 -0500401 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
402 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
403
404 // Add/remove the virtual port again.
405 VirtualPort virtualPort = manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
406 PortNumber.portNumber(1), port);
407 manager.removeVirtualPort(virtualNetwork1.id(), (DeviceId) virtualPort.element().id(), virtualPort.number());
408 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500409 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
410 }
411
412 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400413 * Tests the addOrUpdateIntent() method in the store with a null intent.
414 */
415 @Test(expected = NullPointerException.class)
416 public void testAddOrUpdateNullIntent() {
417 manager.store.addOrUpdateIntent(null, null);
418 }
419
420 /**
421 * Tests the removeIntent() method in the store with a null intent key.
422 */
423 @Test(expected = NullPointerException.class)
424 public void testRemoveNullIntentKey() {
425 manager.store.removeIntent(null);
426 }
427
428 /**
429 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
430 */
431 @Test
432 public void testAddOrUpdateIntent() {
433 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
434 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
435 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
436 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
437
438 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
439 .networkId(virtualNetwork.id())
440 .key(Key.of("Test", APP_ID))
441 .appId(APP_ID)
442 .ingressPoint(cp1)
443 .egressPoint(cp2)
444 .build();
445
446 // Add the intent to the store.
447 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
448 assertEquals("The intent size should match.", 1, manager.store.getIntents().size());
449 assertNotNull("The intent should not be null.", manager.store.getIntent(virtualIntent.key()));
450
451 // remove the intent from the store.
452 manager.store.removeIntent(virtualIntent.key());
453 assertTrue("The intents should be empty.", manager.store.getIntents().isEmpty());
454 assertNull("The intent should be null.", manager.store.getIntent(virtualIntent.key()));
455 }
456
457 /**
458 * Tests the addTunnelId() method in the store with a null intent.
459 */
460 @Test(expected = NullPointerException.class)
461 public void testAddTunnelIdNullIntent() {
462 manager.store.addTunnelId(null, null);
463 }
464
465 /**
466 * Tests the removeTunnelId() method in the store with a null intent.
467 */
468 @Test(expected = NullPointerException.class)
469 public void testRemoveTunnelIdNullIntent() {
470 manager.store.removeTunnelId(null, null);
471 }
472
473 /**
474 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
475 */
476 @Test
477 public void testAddTunnelId() {
478 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
479 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
480 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
481 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
482
483 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
484 .networkId(virtualNetwork.id())
485 .key(Key.of("Test", APP_ID))
486 .appId(APP_ID)
487 .ingressPoint(cp1)
488 .egressPoint(cp2)
489 .build();
490
491 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
492 // Add the intent to tunnelID mapping to the store.
493 manager.store.addTunnelId(virtualIntent, tunnelId);
494 assertEquals("The tunnels size should match.", 1, manager.store.getTunnelIds(virtualIntent).size());
495
496 // Remove the intent to tunnelID mapping from the store.
497 manager.store.removeTunnelId(virtualIntent, tunnelId);
498 assertTrue("The tunnels should be empty.", manager.store.getTunnelIds(virtualIntent).isEmpty());
499 }
500
Brian Stankefb61df42016-07-25 11:47:51 -0400501
502 /**
503 * Method to create the virtual network for further testing.
504 **/
505 private VirtualNetwork setupVirtualNetworkTopology() {
506 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
507 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
508
509 VirtualDevice virtualDevice1 =
510 manager.createVirtualDevice(virtualNetwork.id(), DID1);
511 VirtualDevice virtualDevice2 =
512 manager.createVirtualDevice(virtualNetwork.id(), DID2);
513 VirtualDevice virtualDevice3 =
514 manager.createVirtualDevice(virtualNetwork.id(), DID3);
515 VirtualDevice virtualDevice4 =
516 manager.createVirtualDevice(virtualNetwork.id(), DID4);
517 VirtualDevice virtualDevice5 =
518 manager.createVirtualDevice(virtualNetwork.id(), DID5);
519
520 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
521 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
522 PortNumber.portNumber(1),
523 new DefaultPort(virtualDevice1, PortNumber.portNumber(1), true));
524
525 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
526 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
527 PortNumber.portNumber(2),
528 new DefaultPort(virtualDevice1, PortNumber.portNumber(2), true));
529
530 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
531 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
532 PortNumber.portNumber(3),
533 new DefaultPort(virtualDevice2, PortNumber.portNumber(3), true));
534
535 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
536 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
537 PortNumber.portNumber(4),
538 new DefaultPort(virtualDevice2, PortNumber.portNumber(4), true));
539
540 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
541 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
542 PortNumber.portNumber(5),
543 new DefaultPort(virtualDevice3, PortNumber.portNumber(5), true));
544
545 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
546 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
547 PortNumber.portNumber(6),
548 new DefaultPort(virtualDevice3, PortNumber.portNumber(6), true));
549
550 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
551 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
552 PortNumber.portNumber(7),
553 new DefaultPort(virtualDevice4, PortNumber.portNumber(7), true));
554
555 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
556 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
557 PortNumber.portNumber(8),
558 new DefaultPort(virtualDevice4, PortNumber.portNumber(8), true));
559
560 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
561 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
562 PortNumber.portNumber(9),
563 new DefaultPort(virtualDevice5, PortNumber.portNumber(9), true));
564
565 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
566 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
567 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
568 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
569 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
570 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
571 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
572 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
573 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
574 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
575 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
576 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
577
578 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
579 topologyProvider = new VirtualNetworkTopologyProvider();
580 topologyProvider.topologyService = topologyService;
581
582 return virtualNetwork;
583 }
584
585 /**
586 * Test the topologyChanged() method.
587 */
588 @Test
589 public void testTopologyChanged() {
590 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
591 VirtualNetworkProviderService providerService = manager.createProviderService(topologyProvider);
592
593 // Initial setup is two clusters of devices/links.
594 assertEquals("The cluster count did not match.", 2, topologyService.currentTopology().clusterCount());
595
596 // Adding this link will join the two clusters together.
597 List<Event> reasons = new ArrayList<>();
598 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
599 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
600 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
601 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
602
603 Topology topology = topologyService.currentTopology();
604 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
605
606 // Validate that all links are still active.
607 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
608 assertTrue("The virtual link should be active.", virtualLink.state().equals(Link.State.ACTIVE));
609 });
610
611 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
612 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
613 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
614
615 // Validate that all links are active again.
616 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
617 assertTrue("The virtual link should be active.", virtualLink.state().equals(Link.State.ACTIVE));
618 });
619 }
620
Brian Stanke11f6d532016-07-05 16:17:59 -0400621 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500622 * Method to validate that the actual versus expected virtual network events were
623 * received correctly.
624 *
625 * @param types expected virtual network events.
626 */
627 private void validateEvents(Enum... types) {
628 TestTools.assertAfter(100, () -> {
629 int i = 0;
630 assertEquals("wrong events received", types.length, listener.events.size());
631 for (Event event : listener.events) {
632 assertEquals("incorrect event type", types[i], event.type());
633 i++;
634 }
635 listener.events.clear();
636 });
637 }
638
639 /**
640 * Test listener class to receive virtual network events.
641 */
642 private static class TestListener implements VirtualNetworkListener {
643
Brian Stanke7a81b532016-06-14 15:43:51 -0400644 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500645
646 @Override
647 public void event(VirtualNetworkEvent event) {
648 events.add(event);
649 }
650
651 }
652
Brian Stanke5df14472016-03-11 19:34:38 -0500653 /**
654 * Core service test class.
655 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500656 private class TestCoreService extends CoreServiceAdapter {
657
658 @Override
659 public IdGenerator getIdGenerator(String topic) {
660 return new IdGenerator() {
661 private AtomicLong counter = new AtomicLong(0);
662
663 @Override
664 public long getNewId() {
665 return counter.getAndIncrement();
666 }
667 };
668 }
669 }
670}