blob: 81fbdf5c6124e46dc28330b160bbe19eba42fe35 [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;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050045import org.onosproject.net.DeviceId;
Brian Stankefb61df42016-07-25 11:47:51 -040046import org.onosproject.net.Link;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050047import org.onosproject.net.NetTestTools;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050048import org.onosproject.net.PortNumber;
Brian Stanke7a81b532016-06-14 15:43:51 -040049import org.onosproject.net.TestDeviceParams;
Brian Stanke11f6d532016-07-05 16:17:59 -040050import org.onosproject.net.intent.FakeIntentManager;
51import org.onosproject.net.intent.Intent;
52import org.onosproject.net.intent.IntentState;
53import org.onosproject.net.intent.Key;
54import org.onosproject.net.intent.MockIdGenerator;
55import org.onosproject.net.intent.TestableIntentService;
Brian Stankefb61df42016-07-25 11:47:51 -040056import org.onosproject.net.topology.Topology;
57import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050058import org.onosproject.store.service.TestStorageService;
59
Brian Stankefb61df42016-07-25 11:47:51 -040060import java.util.ArrayList;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050061import java.util.Collection;
62import java.util.List;
63import java.util.Set;
64import java.util.concurrent.atomic.AtomicLong;
65
66import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040067import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050068
69/**
70 * Junit tests for VirtualNetworkManager.
71 */
Brian Stanke7a81b532016-06-14 15:43:51 -040072public class VirtualNetworkManagerTest extends TestDeviceParams {
Brian Stanke86914282016-05-25 15:36:50 -040073 private final String tenantIdValue1 = "TENANT_ID1";
74 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -050075
76 private VirtualNetworkManager manager;
Brian Stankefb61df42016-07-25 11:47:51 -040077 private VirtualNetworkTopologyProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050078 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
79 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -040080 private TestListener listener = new TestListener();
Brian Stanke11f6d532016-07-05 16:17:59 -040081 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -040082 private TopologyService topologyService;
Brian Stanke11f6d532016-07-05 16:17:59 -040083 private IdGenerator idGenerator = new MockIdGenerator();
Brian Stanke0e5c94e2016-03-08 11:20:04 -050084
Brian Stankefb61df42016-07-25 11:47:51 -040085 private ConnectPoint cp6;
86 private ConnectPoint cp7;
87
Brian Stanke0e5c94e2016-03-08 11:20:04 -050088 @Before
89 public void setUp() throws Exception {
90 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Brian Stanke11f6d532016-07-05 16:17:59 -040091 Intent.bindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050092
93 coreService = new TestCoreService();
94 virtualNetworkManagerStore.setCoreService(coreService);
95 TestUtils.setField(coreService, "coreService", new TestCoreService());
96 TestUtils.setField(virtualNetworkManagerStore, "storageService", new TestStorageService());
97 virtualNetworkManagerStore.activate();
98
99 manager = new VirtualNetworkManager();
100 manager.store = virtualNetworkManagerStore;
101 manager.addListener(listener);
Brian Stanke11f6d532016-07-05 16:17:59 -0400102 manager.intentService = intentService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500103 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
104 manager.activate();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500105 }
106
107 @After
108 public void tearDown() {
109 virtualNetworkManagerStore.deactivate();
110 manager.removeListener(listener);
111 manager.deactivate();
112 NetTestTools.injectEventDispatcher(manager, null);
Brian Stanke11f6d532016-07-05 16:17:59 -0400113 Intent.unbindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500114 }
115
116 /**
117 * Tests registering a null tenant id.
118 */
119 @Test(expected = NullPointerException.class)
120 public void testRegisterNullTenantId() {
121 manager.registerTenantId(null);
122 }
123
124 /**
125 * Tests registering/unregistering a tenant id.
126 */
127 @Test
128 public void testRegisterUnregisterTenantId() {
129 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
130 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
131 manager.registerTenantId(TenantId.tenantId(tenantIdValue2));
132 Collection<TenantId> tenantIdCollection = manager.getTenantIds();
133 assertEquals("The tenantId set size did not match.", 2, tenantIdCollection.size());
134
135 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue1));
136 manager.unregisterTenantId(TenantId.tenantId(tenantIdValue2));
137 tenantIdCollection = manager.getTenantIds();
138 assertTrue("The tenantId set should be empty.", tenantIdCollection.isEmpty());
139
140 // Validate that the events were all received in the correct order.
141 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED, VirtualNetworkEvent.Type.TENANT_REGISTERED,
142 VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
143 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
144 }
145
146 /**
147 * Tests adding a null virtual network.
148 */
149 @Test(expected = NullPointerException.class)
150 public void testCreateNullVirtualNetwork() {
151 manager.createVirtualNetwork(null);
152 }
153
154 /**
155 * Tests add and remove of virtual networks.
156 */
157 @Test
158 public void testAddRemoveVirtualNetwork() {
159 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
160 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
161 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
162 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
163 assertNotNull("The virtual network set should not be null", virtualNetworks);
164 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
165
Brian Stanke5df14472016-03-11 19:34:38 -0500166 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500167 for (VirtualNetwork virtualNetwork : virtualNetworks) {
168 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500169 assertEquals("The expected virtual network size does not match",
170 --remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500171 // attempt to remove the same virtual network again.
172 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500173 assertEquals("The expected virtual network size does not match",
174 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500175 }
176 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
177 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
178
Brian Stanke5df14472016-03-11 19:34:38 -0500179 // Create/remove a virtual network.
180 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
181 manager.removeVirtualNetwork(virtualNetwork.id());
182
183 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
184 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
185
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500186 // Validate that the events were all received in the correct order.
187 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
188 VirtualNetworkEvent.Type.NETWORK_ADDED, VirtualNetworkEvent.Type.NETWORK_REMOVED,
Brian Stanke5df14472016-03-11 19:34:38 -0500189 VirtualNetworkEvent.Type.NETWORK_REMOVED, VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500190 VirtualNetworkEvent.Type.NETWORK_REMOVED);
191 }
192
193 /**
194 * Tests adding a null virtual device.
195 */
196 @Test(expected = NullPointerException.class)
197 public void testCreateNullVirtualDevice() {
198 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
199 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
200
201 manager.createVirtualDevice(virtualNetwork.id(), null);
202 }
203
204 /**
205 * Tests adding a virtual device where no virtual network exists.
206 */
207 @Test(expected = IllegalStateException.class)
208 public void testCreateVirtualDeviceWithNoNetwork() {
209 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
210 VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
211
Brian Stanke7a81b532016-06-14 15:43:51 -0400212 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500213 }
214
215 /**
216 * Tests add and remove of virtual devices.
217 */
218 @Test
219 public void testAddRemoveVirtualDevice() {
220 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
221 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
222 VirtualNetwork virtualNetwork2 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400223 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
224 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500225
226 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
227 assertNotNull("The virtual device set should not be null", virtualDevices1);
228 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
229
230 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
231 assertNotNull("The virtual device set should not be null", virtualDevices2);
232 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
233
234 for (VirtualDevice virtualDevice : virtualDevices1) {
235 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
236 // attempt to remove the same virtual device again.
237 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
238 }
239 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
240 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
241
Brian Stanke5df14472016-03-11 19:34:38 -0500242 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400243 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke5df14472016-03-11 19:34:38 -0500244 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
245 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
246 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
247
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500248 // Validate that the events were all received in the correct order.
249 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED, VirtualNetworkEvent.Type.NETWORK_ADDED,
250 VirtualNetworkEvent.Type.NETWORK_ADDED);
251 }
252
253 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400254 * Tests adding a null virtual host.
255 */
256 @Test(expected = NullPointerException.class)
257 public void testCreateNullVirtualHost() {
258 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
259 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
260
261 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
262 }
263
264 /**
265 * Tests adding a virtual host where no virtual network exists.
266 */
267 @Test(expected = IllegalStateException.class)
268 public void testCreateVirtualHostWithNoNetwork() {
269 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
270 VirtualNetwork virtualNetwork = new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
271
272 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
273 }
274
275 /**
276 * Tests add and remove of virtual hosts.
277 */
278 @Test
279 public void testAddRemoveVirtualHost() {
280 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
281 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
282 VirtualNetwork virtualNetwork2 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
283 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
284 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
285
286 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
287 assertNotNull("The virtual host set should not be null", virtualHosts1);
288 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
289
290 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
291 assertNotNull("The virtual host set should not be null", virtualHosts2);
292 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
293
294 for (VirtualHost virtualHost : virtualHosts1) {
295 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
296 // attempt to remove the same virtual host again.
297 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
298 }
299 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
300 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
301
302 // Add/remove the virtual host again.
303 VirtualHost virtualHost = manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
304 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
305 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
306 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
307 }
308
309 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500310 * Tests add and remove of virtual links.
311 */
312 @Test
313 public void testAddRemoveVirtualLink() {
314 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
315 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
316 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400317 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500318 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400319 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500320 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400321 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700322 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400323
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500324 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400325 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700326 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400327
Brian Stanke9a108972016-04-11 15:25:17 -0400328 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
329 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500330
331 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
332 assertNotNull("The virtual link set should not be null", virtualLinks);
333 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
334
335 for (VirtualLink virtualLink : virtualLinks) {
336 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
337 // attempt to remove the same virtual link again.
338 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
339 }
340 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
341 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500342
343 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400344 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500345 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
346 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
347 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500348 }
349
350 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400351 * Tests adding the same virtual link twice.
352 */
353 @Test(expected = IllegalStateException.class)
354 public void testAddSameVirtualLink() {
355 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
356 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
357 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400358 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400359 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400360 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400361 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400362 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700363 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400364
Brian Stanke9a108972016-04-11 15:25:17 -0400365 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400366 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700367 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400368
Brian Stanke9a108972016-04-11 15:25:17 -0400369 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
370 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
371 }
372
373 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500374 * Tests add and remove of virtual ports.
375 */
376 @Test
377 public void testAddRemoveVirtualPort() {
378 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
379 VirtualNetwork virtualNetwork1 = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke5df14472016-03-11 19:34:38 -0500380 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400381 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Yoonseon Han6c603892016-09-01 11:52:21 -0700382 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500383
Yoonseon Han6c603892016-09-01 11:52:21 -0700384 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(1), cp);
385 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(), PortNumber.portNumber(2), cp);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500386
Brian Stanke5df14472016-03-11 19:34:38 -0500387 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500388 assertNotNull("The virtual port set should not be null", virtualPorts);
389 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
390
391 for (VirtualPort virtualPort : virtualPorts) {
392 manager.removeVirtualPort(virtualNetwork1.id(),
393 (DeviceId) virtualPort.element().id(), virtualPort.number());
394 // attempt to remove the same virtual port again.
395 manager.removeVirtualPort(virtualNetwork1.id(),
396 (DeviceId) virtualPort.element().id(), virtualPort.number());
397 }
Brian Stanke5df14472016-03-11 19:34:38 -0500398 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
399 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
400
401 // Add/remove the virtual port again.
402 VirtualPort virtualPort = manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700403 PortNumber.portNumber(1), cp);
Brian Stanke5df14472016-03-11 19:34:38 -0500404 manager.removeVirtualPort(virtualNetwork1.id(), (DeviceId) virtualPort.element().id(), virtualPort.number());
405 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500406 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
407 }
408
409 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400410 * Tests the addOrUpdateIntent() method in the store with a null intent.
411 */
412 @Test(expected = NullPointerException.class)
413 public void testAddOrUpdateNullIntent() {
414 manager.store.addOrUpdateIntent(null, null);
415 }
416
417 /**
418 * Tests the removeIntent() method in the store with a null intent key.
419 */
420 @Test(expected = NullPointerException.class)
421 public void testRemoveNullIntentKey() {
422 manager.store.removeIntent(null);
423 }
424
425 /**
426 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
427 */
428 @Test
429 public void testAddOrUpdateIntent() {
430 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
431 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
432 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
433 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
434
435 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
436 .networkId(virtualNetwork.id())
437 .key(Key.of("Test", APP_ID))
438 .appId(APP_ID)
439 .ingressPoint(cp1)
440 .egressPoint(cp2)
441 .build();
442
443 // Add the intent to the store.
444 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
445 assertEquals("The intent size should match.", 1, manager.store.getIntents().size());
446 assertNotNull("The intent should not be null.", manager.store.getIntent(virtualIntent.key()));
447
448 // remove the intent from the store.
449 manager.store.removeIntent(virtualIntent.key());
450 assertTrue("The intents should be empty.", manager.store.getIntents().isEmpty());
451 assertNull("The intent should be null.", manager.store.getIntent(virtualIntent.key()));
452 }
453
454 /**
455 * Tests the addTunnelId() method in the store with a null intent.
456 */
457 @Test(expected = NullPointerException.class)
458 public void testAddTunnelIdNullIntent() {
459 manager.store.addTunnelId(null, null);
460 }
461
462 /**
463 * Tests the removeTunnelId() method in the store with a null intent.
464 */
465 @Test(expected = NullPointerException.class)
466 public void testRemoveTunnelIdNullIntent() {
467 manager.store.removeTunnelId(null, null);
468 }
469
470 /**
471 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
472 */
473 @Test
474 public void testAddTunnelId() {
475 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
476 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
477 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
478 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
479
480 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
481 .networkId(virtualNetwork.id())
482 .key(Key.of("Test", APP_ID))
483 .appId(APP_ID)
484 .ingressPoint(cp1)
485 .egressPoint(cp2)
486 .build();
487
488 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
489 // Add the intent to tunnelID mapping to the store.
490 manager.store.addTunnelId(virtualIntent, tunnelId);
491 assertEquals("The tunnels size should match.", 1, manager.store.getTunnelIds(virtualIntent).size());
492
493 // Remove the intent to tunnelID mapping from the store.
494 manager.store.removeTunnelId(virtualIntent, tunnelId);
495 assertTrue("The tunnels should be empty.", manager.store.getTunnelIds(virtualIntent).isEmpty());
496 }
497
Brian Stankefb61df42016-07-25 11:47:51 -0400498
499 /**
500 * Method to create the virtual network for further testing.
501 **/
502 private VirtualNetwork setupVirtualNetworkTopology() {
503 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
504 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
505
506 VirtualDevice virtualDevice1 =
507 manager.createVirtualDevice(virtualNetwork.id(), DID1);
508 VirtualDevice virtualDevice2 =
509 manager.createVirtualDevice(virtualNetwork.id(), DID2);
510 VirtualDevice virtualDevice3 =
511 manager.createVirtualDevice(virtualNetwork.id(), DID3);
512 VirtualDevice virtualDevice4 =
513 manager.createVirtualDevice(virtualNetwork.id(), DID4);
514 VirtualDevice virtualDevice5 =
515 manager.createVirtualDevice(virtualNetwork.id(), DID5);
516
517 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
518 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700519 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400520
521 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
522 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700523 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400524
525 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
526 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700527 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400528
529 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
530 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700531 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400532
533 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
534 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700535 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400536
537 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
538 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700539 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400540
541 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
542 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700543 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400544
545 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
546 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700547 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400548
549 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
550 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700551 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400552
553 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
554 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
555 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
556 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
557 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
558 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
559 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
560 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
561 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
562 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
563 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
564 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
565
566 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
567 topologyProvider = new VirtualNetworkTopologyProvider();
568 topologyProvider.topologyService = topologyService;
569
570 return virtualNetwork;
571 }
572
573 /**
574 * Test the topologyChanged() method.
575 */
576 @Test
577 public void testTopologyChanged() {
578 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
579 VirtualNetworkProviderService providerService = manager.createProviderService(topologyProvider);
580
581 // Initial setup is two clusters of devices/links.
582 assertEquals("The cluster count did not match.", 2, topologyService.currentTopology().clusterCount());
583
584 // Adding this link will join the two clusters together.
585 List<Event> reasons = new ArrayList<>();
586 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
587 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
588 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
589 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
590
591 Topology topology = topologyService.currentTopology();
592 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
593
594 // Validate that all links are still active.
595 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
596 assertTrue("The virtual link should be active.", virtualLink.state().equals(Link.State.ACTIVE));
597 });
598
599 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
600 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
601 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
602
603 // Validate that all links are active again.
604 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
605 assertTrue("The virtual link should be active.", virtualLink.state().equals(Link.State.ACTIVE));
606 });
607 }
608
Brian Stanke11f6d532016-07-05 16:17:59 -0400609 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500610 * Method to validate that the actual versus expected virtual network events were
611 * received correctly.
612 *
613 * @param types expected virtual network events.
614 */
615 private void validateEvents(Enum... types) {
616 TestTools.assertAfter(100, () -> {
617 int i = 0;
618 assertEquals("wrong events received", types.length, listener.events.size());
619 for (Event event : listener.events) {
620 assertEquals("incorrect event type", types[i], event.type());
621 i++;
622 }
623 listener.events.clear();
624 });
625 }
626
627 /**
628 * Test listener class to receive virtual network events.
629 */
630 private static class TestListener implements VirtualNetworkListener {
631
Brian Stanke7a81b532016-06-14 15:43:51 -0400632 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500633
634 @Override
635 public void event(VirtualNetworkEvent event) {
636 events.add(event);
637 }
638
639 }
640
Brian Stanke5df14472016-03-11 19:34:38 -0500641 /**
642 * Core service test class.
643 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500644 private class TestCoreService extends CoreServiceAdapter {
645
646 @Override
647 public IdGenerator getIdGenerator(String topic) {
648 return new IdGenerator() {
649 private AtomicLong counter = new AtomicLong(0);
650
651 @Override
652 public long getNewId() {
653 return counter.getAndIncrement();
654 }
655 };
656 }
657 }
658}