blob: 3a580eb3741be17b95a163204da576fd4c50ec0b [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;
yoonseon6b972c32016-12-06 16:45:03 -080041import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050042import org.onosproject.incubator.net.virtual.VirtualPort;
yoonseon214963b2016-11-21 15:41:07 -080043import org.onosproject.incubator.net.virtual.impl.provider.DefaultVirtualNetworkProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050044import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
45import org.onosproject.net.ConnectPoint;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050046import 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;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050049import org.onosproject.net.PortNumber;
Brian Stanke7a81b532016-06-14 15:43:51 -040050import org.onosproject.net.TestDeviceParams;
Brian Stanke11f6d532016-07-05 16:17:59 -040051import org.onosproject.net.intent.FakeIntentManager;
52import org.onosproject.net.intent.Intent;
53import org.onosproject.net.intent.IntentState;
54import org.onosproject.net.intent.Key;
55import org.onosproject.net.intent.MockIdGenerator;
56import org.onosproject.net.intent.TestableIntentService;
Brian Stankefb61df42016-07-25 11:47:51 -040057import org.onosproject.net.topology.Topology;
58import org.onosproject.net.topology.TopologyService;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050059import org.onosproject.store.service.TestStorageService;
60
Brian Stankefb61df42016-07-25 11:47:51 -040061import java.util.ArrayList;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050062import java.util.Collection;
63import java.util.List;
64import java.util.Set;
65import java.util.concurrent.atomic.AtomicLong;
66
67import static org.junit.Assert.*;
Brian Stanke11f6d532016-07-05 16:17:59 -040068import static org.onosproject.net.NetTestTools.APP_ID;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050069
70/**
71 * Junit tests for VirtualNetworkManager.
72 */
Brian Stanke7a81b532016-06-14 15:43:51 -040073public class VirtualNetworkManagerTest extends TestDeviceParams {
Brian Stanke86914282016-05-25 15:36:50 -040074 private final String tenantIdValue1 = "TENANT_ID1";
75 private final String tenantIdValue2 = "TENANT_ID2";
Brian Stanke0e5c94e2016-03-08 11:20:04 -050076
77 private VirtualNetworkManager manager;
yoonseon214963b2016-11-21 15:41:07 -080078 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stanke0e5c94e2016-03-08 11:20:04 -050079 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
80 private CoreService coreService;
Brian Stanke7a81b532016-06-14 15:43:51 -040081 private TestListener listener = new TestListener();
Brian Stanke11f6d532016-07-05 16:17:59 -040082 private TestableIntentService intentService = new FakeIntentManager();
Brian Stankefb61df42016-07-25 11:47:51 -040083 private TopologyService topologyService;
Brian Stanke11f6d532016-07-05 16:17:59 -040084 private IdGenerator idGenerator = new MockIdGenerator();
Brian Stanke0e5c94e2016-03-08 11:20:04 -050085
Brian Stankefb61df42016-07-25 11:47:51 -040086 private ConnectPoint cp6;
87 private ConnectPoint cp7;
88
Brian Stanke0e5c94e2016-03-08 11:20:04 -050089 @Before
90 public void setUp() throws Exception {
91 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
Brian Stanke11f6d532016-07-05 16:17:59 -040092 Intent.bindIdGenerator(idGenerator);
Brian Stanke0e5c94e2016-03-08 11:20:04 -050093
94 coreService = new TestCoreService();
95 virtualNetworkManagerStore.setCoreService(coreService);
96 TestUtils.setField(coreService, "coreService", new TestCoreService());
yoonseon214963b2016-11-21 15:41:07 -080097 TestUtils.setField(virtualNetworkManagerStore, "storageService",
98 new TestStorageService());
Brian Stanke0e5c94e2016-03-08 11:20:04 -050099 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.
yoonseon214963b2016-11-21 15:41:07 -0800143 validateEvents(VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
144 VirtualNetworkEvent.Type.TENANT_REGISTERED,
145 VirtualNetworkEvent.Type.TENANT_REGISTERED,
146 VirtualNetworkEvent.Type.TENANT_UNREGISTERED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500147 VirtualNetworkEvent.Type.TENANT_UNREGISTERED);
148 }
149
150 /**
151 * Tests adding a null virtual network.
152 */
153 @Test(expected = NullPointerException.class)
154 public void testCreateNullVirtualNetwork() {
155 manager.createVirtualNetwork(null);
156 }
157
158 /**
159 * Tests add and remove of virtual networks.
160 */
161 @Test
162 public void testAddRemoveVirtualNetwork() {
163 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
164 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
165 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
166 Set<VirtualNetwork> virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
167 assertNotNull("The virtual network set should not be null", virtualNetworks);
168 assertEquals("The virtual network set size did not match.", 2, virtualNetworks.size());
169
Brian Stanke5df14472016-03-11 19:34:38 -0500170 int remaining = virtualNetworks.size();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500171 for (VirtualNetwork virtualNetwork : virtualNetworks) {
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 // attempt to remove the same virtual network again.
176 manager.removeVirtualNetwork(virtualNetwork.id());
Brian Stanke5df14472016-03-11 19:34:38 -0500177 assertEquals("The expected virtual network size does not match",
178 remaining, manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1)).size());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500179 }
180 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
181 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
182
Brian Stanke5df14472016-03-11 19:34:38 -0500183 // Create/remove a virtual network.
184 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
185 manager.removeVirtualNetwork(virtualNetwork.id());
186
187 virtualNetworks = manager.getVirtualNetworks(TenantId.tenantId(tenantIdValue1));
188 assertTrue("The virtual network set should be empty.", virtualNetworks.isEmpty());
189
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500190 // Validate that the events were all received in the correct order.
yoonseon214963b2016-11-21 15:41:07 -0800191 validateEvents(VirtualNetworkEvent.Type.TENANT_REGISTERED,
192 VirtualNetworkEvent.Type.NETWORK_ADDED,
193 VirtualNetworkEvent.Type.NETWORK_ADDED,
194 VirtualNetworkEvent.Type.NETWORK_REMOVED,
195 VirtualNetworkEvent.Type.NETWORK_REMOVED,
196 VirtualNetworkEvent.Type.NETWORK_ADDED,
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500197 VirtualNetworkEvent.Type.NETWORK_REMOVED);
198 }
199
200 /**
201 * Tests adding a null virtual device.
202 */
203 @Test(expected = NullPointerException.class)
204 public void testCreateNullVirtualDevice() {
205 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
206 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
207
208 manager.createVirtualDevice(virtualNetwork.id(), null);
209 }
210
211 /**
212 * Tests adding a virtual device where no virtual network exists.
213 */
214 @Test(expected = IllegalStateException.class)
215 public void testCreateVirtualDeviceWithNoNetwork() {
216 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800217 VirtualNetwork virtualNetwork =
218 new DefaultVirtualNetwork(NetworkId.NONE,
219 TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500220
Brian Stanke7a81b532016-06-14 15:43:51 -0400221 manager.createVirtualDevice(virtualNetwork.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500222 }
223
224 /**
225 * Tests add and remove of virtual devices.
226 */
227 @Test
228 public void testAddRemoveVirtualDevice() {
Claudine Chiu945828d2016-11-21 12:47:07 -0500229 List<VirtualNetworkEvent.Type> expectedEventTypes = new ArrayList<>();
230
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500231 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500232 expectedEventTypes.add(VirtualNetworkEvent.Type.TENANT_REGISTERED);
yoonseon214963b2016-11-21 15:41:07 -0800233 VirtualNetwork virtualNetwork1 =
234 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500235 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
yoonseon214963b2016-11-21 15:41:07 -0800236 VirtualNetwork virtualNetwork2 =
237 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Claudine Chiu945828d2016-11-21 12:47:07 -0500238 expectedEventTypes.add(VirtualNetworkEvent.Type.NETWORK_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400239 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500240 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke7a81b532016-06-14 15:43:51 -0400241 manager.createVirtualDevice(virtualNetwork2.id(), DID2);
Claudine Chiu945828d2016-11-21 12:47:07 -0500242 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500243
244 Set<VirtualDevice> virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
245 assertNotNull("The virtual device set should not be null", virtualDevices1);
246 assertEquals("The virtual device set size did not match.", 1, virtualDevices1.size());
247
248 Set<VirtualDevice> virtualDevices2 = manager.getVirtualDevices(virtualNetwork2.id());
249 assertNotNull("The virtual device set should not be null", virtualDevices2);
250 assertEquals("The virtual device set size did not match.", 1, virtualDevices2.size());
251
252 for (VirtualDevice virtualDevice : virtualDevices1) {
253 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500254 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
255 // attempt to remove the same virtual device again - no event expected.
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500256 manager.removeVirtualDevice(virtualNetwork1.id(), virtualDevice.id());
257 }
258 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
259 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
260
Brian Stanke5df14472016-03-11 19:34:38 -0500261 // Add/remove the virtual device again.
Brian Stanke7a81b532016-06-14 15:43:51 -0400262 VirtualDevice virtualDevice = manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Claudine Chiu945828d2016-11-21 12:47:07 -0500263 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_ADDED);
Brian Stanke5df14472016-03-11 19:34:38 -0500264 manager.removeVirtualDevice(virtualDevice.networkId(), virtualDevice.id());
Claudine Chiu945828d2016-11-21 12:47:07 -0500265 expectedEventTypes.add(VirtualNetworkEvent.Type.VIRTUAL_DEVICE_REMOVED);
Brian Stanke5df14472016-03-11 19:34:38 -0500266 virtualDevices1 = manager.getVirtualDevices(virtualNetwork1.id());
267 assertTrue("The virtual device set should be empty.", virtualDevices1.isEmpty());
268
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500269 // Validate that the events were all received in the correct order.
Claudine Chiu945828d2016-11-21 12:47:07 -0500270 validateEvents((Enum[]) expectedEventTypes.toArray(
271 new VirtualNetworkEvent.Type[expectedEventTypes.size()]));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500272 }
273
274 /**
Brian Stanke7a81b532016-06-14 15:43:51 -0400275 * Tests adding a null virtual host.
276 */
277 @Test(expected = NullPointerException.class)
278 public void testCreateNullVirtualHost() {
279 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800280 VirtualNetwork virtualNetwork =
281 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400282
283 manager.createVirtualHost(virtualNetwork.id(), null, null, null, null, null);
284 }
285
286 /**
287 * Tests adding a virtual host where no virtual network exists.
288 */
289 @Test(expected = IllegalStateException.class)
290 public void testCreateVirtualHostWithNoNetwork() {
291 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800292 VirtualNetwork virtualNetwork =
293 new DefaultVirtualNetwork(NetworkId.NONE, TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400294
295 manager.createVirtualHost(virtualNetwork.id(), HID1, null, null, null, null);
296 }
297
298 /**
299 * Tests add and remove of virtual hosts.
300 */
301 @Test
302 public void testAddRemoveVirtualHost() {
303 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800304 VirtualNetwork virtualNetwork1 =
305 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
306 VirtualNetwork virtualNetwork2 =
307 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke7a81b532016-06-14 15:43:51 -0400308 manager.createVirtualHost(virtualNetwork1.id(), HID1, MAC1, VLAN1, LOC1, IPSET1);
309 manager.createVirtualHost(virtualNetwork2.id(), HID2, MAC2, VLAN2, LOC2, IPSET2);
310
311 Set<VirtualHost> virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
312 assertNotNull("The virtual host set should not be null", virtualHosts1);
313 assertEquals("The virtual host set size did not match.", 1, virtualHosts1.size());
314
315 Set<VirtualHost> virtualHosts2 = manager.getVirtualHosts(virtualNetwork2.id());
316 assertNotNull("The virtual host set should not be null", virtualHosts2);
317 assertEquals("The virtual host set size did not match.", 1, virtualHosts2.size());
318
319 for (VirtualHost virtualHost : virtualHosts1) {
320 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
321 // attempt to remove the same virtual host again.
322 manager.removeVirtualHost(virtualNetwork1.id(), virtualHost.id());
323 }
324 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
325 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
326
327 // Add/remove the virtual host again.
yoonseon214963b2016-11-21 15:41:07 -0800328 VirtualHost virtualHost =
329 manager.createVirtualHost(virtualNetwork1.id(),
330 HID1, MAC1, VLAN1, LOC1, IPSET1);
Brian Stanke7a81b532016-06-14 15:43:51 -0400331 manager.removeVirtualHost(virtualHost.networkId(), virtualHost.id());
332 virtualHosts1 = manager.getVirtualHosts(virtualNetwork1.id());
333 assertTrue("The virtual host set should be empty.", virtualHosts1.isEmpty());
334 }
335
336 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500337 * Tests add and remove of virtual links.
338 */
339 @Test
340 public void testAddRemoveVirtualLink() {
341 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800342 VirtualNetwork virtualNetwork1 =
343 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500344 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400345 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500346 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400347 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500348 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400349 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700350 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400351
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500352 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400353 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700354 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400355
Brian Stanke9a108972016-04-11 15:25:17 -0400356 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
357 manager.createVirtualLink(virtualNetwork1.id(), dst, src);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500358
359 Set<VirtualLink> virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
360 assertNotNull("The virtual link set should not be null", virtualLinks);
361 assertEquals("The virtual link set size did not match.", 2, virtualLinks.size());
362
363 for (VirtualLink virtualLink : virtualLinks) {
364 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
365 // attempt to remove the same virtual link again.
366 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
367 }
368 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
369 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke5df14472016-03-11 19:34:38 -0500370
371 // Add/remove the virtual link again.
Brian Stanke9a108972016-04-11 15:25:17 -0400372 VirtualLink virtualLink = manager.createVirtualLink(virtualNetwork1.id(), src, dst);
Brian Stanke5df14472016-03-11 19:34:38 -0500373 manager.removeVirtualLink(virtualLink.networkId(), virtualLink.src(), virtualLink.dst());
374 virtualLinks = manager.getVirtualLinks(virtualNetwork1.id());
375 assertTrue("The virtual link set should be empty.", virtualLinks.isEmpty());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500376 }
377
378 /**
Brian Stanke9a108972016-04-11 15:25:17 -0400379 * Tests adding the same virtual link twice.
380 */
381 @Test(expected = IllegalStateException.class)
382 public void testAddSameVirtualLink() {
383 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800384 VirtualNetwork virtualNetwork1 =
385 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke9a108972016-04-11 15:25:17 -0400386 VirtualDevice srcVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400387 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Brian Stanke9a108972016-04-11 15:25:17 -0400388 VirtualDevice dstVirtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400389 manager.createVirtualDevice(virtualNetwork1.id(), DID2);
Brian Stanke9a108972016-04-11 15:25:17 -0400390 ConnectPoint src = new ConnectPoint(srcVirtualDevice.id(), PortNumber.portNumber(1));
Brian Stankefb61df42016-07-25 11:47:51 -0400391 manager.createVirtualPort(virtualNetwork1.id(), src.deviceId(), src.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700392 new ConnectPoint(srcVirtualDevice.id(), src.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400393
Brian Stanke9a108972016-04-11 15:25:17 -0400394 ConnectPoint dst = new ConnectPoint(dstVirtualDevice.id(), PortNumber.portNumber(2));
Brian Stankefb61df42016-07-25 11:47:51 -0400395 manager.createVirtualPort(virtualNetwork1.id(), dst.deviceId(), dst.port(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700396 new ConnectPoint(dstVirtualDevice.id(), dst.port()));
Brian Stankefb61df42016-07-25 11:47:51 -0400397
Brian Stanke9a108972016-04-11 15:25:17 -0400398 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
399 manager.createVirtualLink(virtualNetwork1.id(), src, dst);
400 }
401
402 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500403 * Tests add and remove of virtual ports.
404 */
405 @Test
406 public void testAddRemoveVirtualPort() {
407 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800408 VirtualNetwork virtualNetwork1 =
409 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke5df14472016-03-11 19:34:38 -0500410 VirtualDevice virtualDevice =
Brian Stanke7a81b532016-06-14 15:43:51 -0400411 manager.createVirtualDevice(virtualNetwork1.id(), DID1);
Yoonseon Han6c603892016-09-01 11:52:21 -0700412 ConnectPoint cp = new ConnectPoint(virtualDevice.id(), PortNumber.portNumber(1));
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500413
yoonseon214963b2016-11-21 15:41:07 -0800414 manager.createVirtualPort(virtualNetwork1.id(),
415 virtualDevice.id(), PortNumber.portNumber(1), cp);
416 manager.createVirtualPort(virtualNetwork1.id(),
417 virtualDevice.id(), PortNumber.portNumber(2), cp);
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500418
Brian Stanke5df14472016-03-11 19:34:38 -0500419 Set<VirtualPort> virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500420 assertNotNull("The virtual port set should not be null", virtualPorts);
421 assertEquals("The virtual port set size did not match.", 2, virtualPorts.size());
422
423 for (VirtualPort virtualPort : virtualPorts) {
424 manager.removeVirtualPort(virtualNetwork1.id(),
425 (DeviceId) virtualPort.element().id(), virtualPort.number());
426 // attempt to remove the same virtual port again.
427 manager.removeVirtualPort(virtualNetwork1.id(),
428 (DeviceId) virtualPort.element().id(), virtualPort.number());
429 }
Brian Stanke5df14472016-03-11 19:34:38 -0500430 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
431 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
432
433 // Add/remove the virtual port again.
yoonseon214963b2016-11-21 15:41:07 -0800434 VirtualPort virtualPort =
435 manager.createVirtualPort(virtualNetwork1.id(), virtualDevice.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700436 PortNumber.portNumber(1), cp);
yoonseon214963b2016-11-21 15:41:07 -0800437 manager.removeVirtualPort(virtualNetwork1.id(),
438 (DeviceId) virtualPort.element().id(), virtualPort.number());
Brian Stanke5df14472016-03-11 19:34:38 -0500439 virtualPorts = manager.getVirtualPorts(virtualNetwork1.id(), virtualDevice.id());
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500440 assertTrue("The virtual port set should be empty.", virtualPorts.isEmpty());
441 }
442
443 /**
Brian Stanke11f6d532016-07-05 16:17:59 -0400444 * Tests the addOrUpdateIntent() method in the store with a null intent.
445 */
446 @Test(expected = NullPointerException.class)
447 public void testAddOrUpdateNullIntent() {
448 manager.store.addOrUpdateIntent(null, null);
449 }
450
451 /**
452 * Tests the removeIntent() method in the store with a null intent key.
453 */
454 @Test(expected = NullPointerException.class)
455 public void testRemoveNullIntentKey() {
456 manager.store.removeIntent(null);
457 }
458
459 /**
460 * Tests the addOrUpdateIntent(), getIntents(), getIntent(), removeIntent() methods with the store.
461 */
462 @Test
463 public void testAddOrUpdateIntent() {
464 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800465 VirtualNetwork virtualNetwork =
466 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stanke11f6d532016-07-05 16:17:59 -0400467 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
468 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
469
470 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
471 .networkId(virtualNetwork.id())
472 .key(Key.of("Test", APP_ID))
473 .appId(APP_ID)
474 .ingressPoint(cp1)
475 .egressPoint(cp2)
476 .build();
477
478 // Add the intent to the store.
479 manager.store.addOrUpdateIntent(virtualIntent, IntentState.INSTALL_REQ);
yoonseon214963b2016-11-21 15:41:07 -0800480 assertEquals("The intent size should match.", 1,
481 manager.store.getIntents().size());
482 assertNotNull("The intent should not be null.",
483 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400484
485 // remove the intent from the store.
486 manager.store.removeIntent(virtualIntent.key());
yoonseon214963b2016-11-21 15:41:07 -0800487 assertTrue("The intents should be empty.",
488 manager.store.getIntents().isEmpty());
489 assertNull("The intent should be null.",
490 manager.store.getIntent(virtualIntent.key()));
Brian Stanke11f6d532016-07-05 16:17:59 -0400491 }
492
493 /**
494 * Tests the addTunnelId() method in the store with a null intent.
495 */
496 @Test(expected = NullPointerException.class)
497 public void testAddTunnelIdNullIntent() {
498 manager.store.addTunnelId(null, null);
499 }
500
501 /**
502 * Tests the removeTunnelId() method in the store with a null intent.
503 */
504 @Test(expected = NullPointerException.class)
505 public void testRemoveTunnelIdNullIntent() {
506 manager.store.removeTunnelId(null, null);
507 }
508
509 /**
510 * Tests the addTunnelId, getTunnelIds(), removeTunnelId() methods with the store.
511 */
512 @Test
513 public void testAddTunnelId() {
514 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
515 VirtualNetwork virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
516 ConnectPoint cp1 = new ConnectPoint(DID1, P1);
517 ConnectPoint cp2 = new ConnectPoint(DID2, P1);
518
519 VirtualNetworkIntent virtualIntent = VirtualNetworkIntent.builder()
520 .networkId(virtualNetwork.id())
521 .key(Key.of("Test", APP_ID))
522 .appId(APP_ID)
523 .ingressPoint(cp1)
524 .egressPoint(cp2)
525 .build();
526
527 TunnelId tunnelId = TunnelId.valueOf("virtual tunnel");
528 // Add the intent to tunnelID mapping to the store.
529 manager.store.addTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800530 assertEquals("The tunnels size should match.", 1,
531 manager.store.getTunnelIds(virtualIntent).size());
Brian Stanke11f6d532016-07-05 16:17:59 -0400532
533 // Remove the intent to tunnelID mapping from the store.
534 manager.store.removeTunnelId(virtualIntent, tunnelId);
yoonseon214963b2016-11-21 15:41:07 -0800535 assertTrue("The tunnels should be empty.",
536 manager.store.getTunnelIds(virtualIntent).isEmpty());
Brian Stanke11f6d532016-07-05 16:17:59 -0400537 }
538
Brian Stankefb61df42016-07-25 11:47:51 -0400539
540 /**
541 * Method to create the virtual network for further testing.
542 **/
543 private VirtualNetwork setupVirtualNetworkTopology() {
544 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
yoonseon214963b2016-11-21 15:41:07 -0800545 VirtualNetwork virtualNetwork =
546 manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
Brian Stankefb61df42016-07-25 11:47:51 -0400547
548 VirtualDevice virtualDevice1 =
549 manager.createVirtualDevice(virtualNetwork.id(), DID1);
550 VirtualDevice virtualDevice2 =
551 manager.createVirtualDevice(virtualNetwork.id(), DID2);
552 VirtualDevice virtualDevice3 =
553 manager.createVirtualDevice(virtualNetwork.id(), DID3);
554 VirtualDevice virtualDevice4 =
555 manager.createVirtualDevice(virtualNetwork.id(), DID4);
556 VirtualDevice virtualDevice5 =
557 manager.createVirtualDevice(virtualNetwork.id(), DID5);
558
559 ConnectPoint cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
560 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700561 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400562
563 ConnectPoint cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
564 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700565 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400566
567 ConnectPoint cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
568 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700569 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400570
571 ConnectPoint cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
572 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700573 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400574
575 ConnectPoint cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
576 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700577 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400578
579 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
580 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700581 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400582
583 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
584 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700585 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400586
587 ConnectPoint cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
588 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700589 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400590
591 ConnectPoint cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
592 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700593 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400594
595 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
596 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
597 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
598 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
599 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
600 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
601 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
602 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
603 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
604 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
605 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
606 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
607
608 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800609 topologyProvider = new DefaultVirtualNetworkProvider();
610 try {
611 TestUtils.setField(topologyProvider, "topologyService", topologyService);
612 } catch (TestUtils.TestUtilsException e) {
613 e.printStackTrace();
614 }
615// topologyProvider.topologyService = topologyService;
Brian Stankefb61df42016-07-25 11:47:51 -0400616
617 return virtualNetwork;
618 }
619
620 /**
621 * Test the topologyChanged() method.
622 */
623 @Test
624 public void testTopologyChanged() {
625 VirtualNetwork virtualNetwork = setupVirtualNetworkTopology();
yoonseon214963b2016-11-21 15:41:07 -0800626 VirtualNetworkProviderService providerService =
627 manager.createProviderService(topologyProvider);
Brian Stankefb61df42016-07-25 11:47:51 -0400628
629 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800630 assertEquals("The cluster count did not match.", 2,
631 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400632
633 // Adding this link will join the two clusters together.
634 List<Event> reasons = new ArrayList<>();
635 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
636 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
637 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
638 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
639
640 Topology topology = topologyService.currentTopology();
641 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
642
643 // Validate that all links are still active.
644 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800645 assertTrue("The virtual link should be active.",
646 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400647 });
648
649 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.INACTIVE);
650 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.INACTIVE);
651 providerService.topologyChanged(topologyProvider.getConnectPoints(topology));
652
653 // Validate that all links are active again.
654 manager.getVirtualLinks(virtualNetwork.id()).forEach(virtualLink -> {
yoonseon214963b2016-11-21 15:41:07 -0800655 assertTrue("The virtual link should be active.",
656 virtualLink.state().equals(Link.State.ACTIVE));
Brian Stankefb61df42016-07-25 11:47:51 -0400657 });
658 }
659
Brian Stanke11f6d532016-07-05 16:17:59 -0400660 /**
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500661 * Method to validate that the actual versus expected virtual network events were
662 * received correctly.
663 *
664 * @param types expected virtual network events.
665 */
666 private void validateEvents(Enum... types) {
667 TestTools.assertAfter(100, () -> {
668 int i = 0;
669 assertEquals("wrong events received", types.length, listener.events.size());
670 for (Event event : listener.events) {
671 assertEquals("incorrect event type", types[i], event.type());
672 i++;
673 }
674 listener.events.clear();
675 });
676 }
677
678 /**
679 * Test listener class to receive virtual network events.
680 */
681 private static class TestListener implements VirtualNetworkListener {
682
Brian Stanke7a81b532016-06-14 15:43:51 -0400683 private List<VirtualNetworkEvent> events = Lists.newArrayList();
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500684
685 @Override
686 public void event(VirtualNetworkEvent event) {
687 events.add(event);
688 }
689
690 }
691
Brian Stanke5df14472016-03-11 19:34:38 -0500692 /**
693 * Core service test class.
694 */
Brian Stanke0e5c94e2016-03-08 11:20:04 -0500695 private class TestCoreService extends CoreServiceAdapter {
696
697 @Override
698 public IdGenerator getIdGenerator(String topic) {
699 return new IdGenerator() {
700 private AtomicLong counter = new AtomicLong(0);
701
702 @Override
703 public long getNewId() {
704 return counter.getAndIncrement();
705 }
706 };
707 }
708 }
709}