blob: 13915066dbac8f42142bd7d9d7b2dbfc877c460b [file] [log] [blame]
Brian Stankefb61df42016-07-25 11:47:51 -04001/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
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
yoonseon214963b2016-11-21 15:41:07 -080017package org.onosproject.incubator.net.virtual.impl.provider;
Brian Stankefb61df42016-07-25 11:47:51 -040018
19import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
22import org.onlab.junit.TestUtils;
yoonseonc6a69272017-01-12 18:22:20 -080023import org.onlab.osgi.TestServiceDirectory;
Brian Stankefb61df42016-07-25 11:47:51 -040024import org.onosproject.common.event.impl.TestEventDispatcher;
25import org.onosproject.core.CoreService;
26import org.onosproject.core.CoreServiceAdapter;
27import org.onosproject.core.IdGenerator;
28import org.onosproject.event.Event;
29import org.onosproject.incubator.net.tunnel.TunnelId;
30import org.onosproject.incubator.net.virtual.NetworkId;
31import org.onosproject.incubator.net.virtual.TenantId;
32import org.onosproject.incubator.net.virtual.VirtualDevice;
33import org.onosproject.incubator.net.virtual.VirtualLink;
34import org.onosproject.incubator.net.virtual.VirtualNetwork;
yoonseon6b972c32016-12-06 16:45:03 -080035import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProvider;
36import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderRegistry;
37import org.onosproject.incubator.net.virtual.provider.VirtualNetworkProviderService;
yoonseon214963b2016-11-21 15:41:07 -080038import org.onosproject.incubator.net.virtual.impl.VirtualNetworkManager;
Brian Stankefb61df42016-07-25 11:47:51 -040039import org.onosproject.incubator.store.virtual.impl.DistributedVirtualNetworkStore;
40import org.onosproject.net.ConnectPoint;
Brian Stankefb61df42016-07-25 11:47:51 -040041import org.onosproject.net.Link;
42import org.onosproject.net.NetTestTools;
43import org.onosproject.net.PortNumber;
44import org.onosproject.net.TestDeviceParams;
45import org.onosproject.net.intent.FakeIntentManager;
46import org.onosproject.net.intent.TestableIntentService;
47import org.onosproject.net.link.LinkEvent;
48import org.onosproject.net.provider.AbstractProviderService;
49import org.onosproject.net.provider.ProviderId;
50import org.onosproject.net.topology.TopologyEvent;
51import org.onosproject.net.topology.TopologyService;
52import org.onosproject.store.service.TestStorageService;
53
54import java.util.ArrayList;
55import java.util.List;
56import java.util.Set;
57import java.util.concurrent.Semaphore;
58import java.util.concurrent.TimeUnit;
59import java.util.concurrent.atomic.AtomicLong;
60
61import static org.junit.Assert.*;
62
63/**
64 * Junit tests for VirtualNetworkTopologyProvider.
65 */
66public class VirtualNetworkTopologyProviderTest extends TestDeviceParams {
67
68 private final String tenantIdValue1 = "TENANT_ID1";
69
70 private VirtualNetwork virtualNetwork;
71 private VirtualDevice virtualDevice1;
72 private VirtualDevice virtualDevice2;
73 private VirtualDevice virtualDevice3;
74 private VirtualDevice virtualDevice4;
75 private VirtualDevice virtualDevice5;
76 private ConnectPoint cp1;
77 private ConnectPoint cp2;
78 private ConnectPoint cp3;
79 private ConnectPoint cp4;
80 private ConnectPoint cp5;
81 private ConnectPoint cp6;
82 private ConnectPoint cp7;
83 private ConnectPoint cp8;
84 private ConnectPoint cp9;
85
86 private VirtualNetworkManager manager;
87 private DistributedVirtualNetworkStore virtualNetworkManagerStore;
88 private CoreService coreService;
yoonseon214963b2016-11-21 15:41:07 -080089 private DefaultVirtualNetworkProvider topologyProvider;
Brian Stankefb61df42016-07-25 11:47:51 -040090 private TopologyService topologyService;
91 private TestableIntentService intentService = new FakeIntentManager();
yoonseonc6a69272017-01-12 18:22:20 -080092 private TestServiceDirectory testDirectory;
Brian Stankefb61df42016-07-25 11:47:51 -040093 private final VirtualNetworkRegistryAdapter virtualNetworkRegistry = new VirtualNetworkRegistryAdapter();
94
95 private static final int MAX_WAIT_TIME = 5;
96 private static final int MAX_PERMITS = 1;
97 private static Semaphore changed;
98
99 private Set<Set<ConnectPoint>> clusters;
100
101 @Before
102 public void setUp() throws Exception {
103
104 virtualNetworkManagerStore = new DistributedVirtualNetworkStore();
105
106 coreService = new VirtualNetworkTopologyProviderTest.TestCoreService();
107
yoonseon214963b2016-11-21 15:41:07 -0800108 TestUtils.setField(virtualNetworkManagerStore, "coreService", coreService);
109 TestUtils.setField(virtualNetworkManagerStore, "storageService",
110 new TestStorageService());
Brian Stankefb61df42016-07-25 11:47:51 -0400111 virtualNetworkManagerStore.activate();
112
113 manager = new VirtualNetworkManager();
yoonseon214963b2016-11-21 15:41:07 -0800114 TestUtils.setField(manager, "store", virtualNetworkManagerStore);
115 TestUtils.setField(manager, "intentService", intentService);
Brian Stankefb61df42016-07-25 11:47:51 -0400116 NetTestTools.injectEventDispatcher(manager, new TestEventDispatcher());
yoonseonc6a69272017-01-12 18:22:20 -0800117
118 testDirectory = new TestServiceDirectory();
119 TestUtils.setField(manager, "serviceDirectory", testDirectory);
120
Brian Stankefb61df42016-07-25 11:47:51 -0400121 manager.activate();
122
123 manager.registerTenantId(TenantId.tenantId(tenantIdValue1));
124 virtualNetwork = manager.createVirtualNetwork(TenantId.tenantId(tenantIdValue1));
125
126 topologyService = manager.get(virtualNetwork.id(), TopologyService.class);
yoonseon214963b2016-11-21 15:41:07 -0800127 topologyProvider = new DefaultVirtualNetworkProvider();
Brian Stankefb61df42016-07-25 11:47:51 -0400128 topologyProvider.topologyService = topologyService;
129 topologyProvider.providerRegistry = virtualNetworkRegistry;
130 topologyProvider.activate();
131
132 setupVirtualNetworkTopology();
133 changed = new Semaphore(0, true);
134 }
135
136 @After
137 public void tearDown() {
138 topologyProvider.deactivate();
139 virtualNetworkManagerStore.deactivate();
140 manager.deactivate();
141 NetTestTools.injectEventDispatcher(manager, null);
142 }
143
144 /**
145 * Method to create the virtual network for further testing.
146 **/
147 private void setupVirtualNetworkTopology() {
148 virtualDevice1 =
149 manager.createVirtualDevice(virtualNetwork.id(), DID1);
150 virtualDevice2 =
151 manager.createVirtualDevice(virtualNetwork.id(), DID2);
152 virtualDevice3 =
153 manager.createVirtualDevice(virtualNetwork.id(), DID3);
154 virtualDevice4 =
155 manager.createVirtualDevice(virtualNetwork.id(), DID4);
156 virtualDevice5 =
157 manager.createVirtualDevice(virtualNetwork.id(), DID5);
158
159 cp1 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1));
160 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700161 PortNumber.portNumber(1), cp1);
Brian Stankefb61df42016-07-25 11:47:51 -0400162
163 cp2 = new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(2));
164 manager.createVirtualPort(virtualNetwork.id(), virtualDevice1.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700165 PortNumber.portNumber(2), cp2);
Brian Stankefb61df42016-07-25 11:47:51 -0400166
167 cp3 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(3));
168 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700169 PortNumber.portNumber(3), cp3);
Brian Stankefb61df42016-07-25 11:47:51 -0400170
171 cp4 = new ConnectPoint(virtualDevice2.id(), PortNumber.portNumber(4));
172 manager.createVirtualPort(virtualNetwork.id(), virtualDevice2.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700173 PortNumber.portNumber(4), cp4);
Brian Stankefb61df42016-07-25 11:47:51 -0400174
175 cp5 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(5));
176 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700177 PortNumber.portNumber(5), cp5);
Brian Stankefb61df42016-07-25 11:47:51 -0400178
179 cp6 = new ConnectPoint(virtualDevice3.id(), PortNumber.portNumber(6));
180 manager.createVirtualPort(virtualNetwork.id(), virtualDevice3.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700181 PortNumber.portNumber(6), cp6);
Brian Stankefb61df42016-07-25 11:47:51 -0400182
183 cp7 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(7));
184 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700185 PortNumber.portNumber(7), cp7);
Brian Stankefb61df42016-07-25 11:47:51 -0400186
187 cp8 = new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(8));
188 manager.createVirtualPort(virtualNetwork.id(), virtualDevice4.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700189 PortNumber.portNumber(8), cp8);
Brian Stankefb61df42016-07-25 11:47:51 -0400190
191 cp9 = new ConnectPoint(virtualDevice5.id(), PortNumber.portNumber(9));
192 manager.createVirtualPort(virtualNetwork.id(), virtualDevice5.id(),
Yoonseon Han6c603892016-09-01 11:52:21 -0700193 PortNumber.portNumber(9), cp9);
Brian Stankefb61df42016-07-25 11:47:51 -0400194
195 VirtualLink link1 = manager.createVirtualLink(virtualNetwork.id(), cp1, cp3);
196 virtualNetworkManagerStore.updateLink(link1, link1.tunnelId(), Link.State.ACTIVE);
197 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp3, cp1);
198 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
199 VirtualLink link3 = manager.createVirtualLink(virtualNetwork.id(), cp4, cp5);
200 virtualNetworkManagerStore.updateLink(link3, link3.tunnelId(), Link.State.ACTIVE);
201 VirtualLink link4 = manager.createVirtualLink(virtualNetwork.id(), cp5, cp4);
202 virtualNetworkManagerStore.updateLink(link4, link4.tunnelId(), Link.State.ACTIVE);
203 VirtualLink link5 = manager.createVirtualLink(virtualNetwork.id(), cp8, cp9);
204 virtualNetworkManagerStore.updateLink(link5, link5.tunnelId(), Link.State.ACTIVE);
205 VirtualLink link6 = manager.createVirtualLink(virtualNetwork.id(), cp9, cp8);
206 virtualNetworkManagerStore.updateLink(link6, link6.tunnelId(), Link.State.ACTIVE);
207
208 clusters = null;
209 }
210
211 /**
212 * Test isTraversable() method using a null source connect point.
213 */
214 @Test(expected = NullPointerException.class)
215 public void testIsTraversableNullSrc() {
216 // test the isTraversable() method with a null source connect point.
217 topologyProvider.isTraversable(null, cp3);
218 }
219
220 /**
221 * Test isTraversable() method using a null destination connect point.
222 */
223 @Test(expected = NullPointerException.class)
224 public void testIsTraversableNullDst() {
225 // test the isTraversable() method with a null destination connect point.
226 topologyProvider.isTraversable(cp1, null);
227 }
228
229 /**
230 * Test isTraversable() method.
231 */
232 @Test
233 public void testIsTraversable() {
234 // test the isTraversable() method.
235 assertTrue("These two connect points should be traversable.",
236 topologyProvider.isTraversable(new ConnectPoint(cp1.elementId(), cp1.port()),
237 new ConnectPoint(cp3.elementId(), cp3.port())));
238 assertTrue("These two connect points should be traversable.",
239 topologyProvider.isTraversable(new ConnectPoint(cp1.elementId(), cp1.port()),
240 new ConnectPoint(cp5.elementId(), cp5.port())));
241 assertFalse("These two connect points should not be traversable.",
yoonseon214963b2016-11-21 15:41:07 -0800242 topologyProvider.isTraversable(
243 new ConnectPoint(virtualDevice1.id(), PortNumber.portNumber(1)),
244 new ConnectPoint(virtualDevice4.id(), PortNumber.portNumber(6))));
Brian Stankefb61df42016-07-25 11:47:51 -0400245 }
246
247 /**
248 * Test the topologyChanged() method.
249 */
250 @Test
251 public void testTopologyChanged() {
252 // Initial setup is two clusters of devices/links.
yoonseon214963b2016-11-21 15:41:07 -0800253 assertEquals("The cluster count did not match.", 2,
254 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400255
256 // Adding this link will join the two clusters together.
257 List<Event> reasons = new ArrayList<>();
258 VirtualLink link = manager.createVirtualLink(virtualNetwork.id(), cp6, cp7);
259 virtualNetworkManagerStore.updateLink(link, link.tunnelId(), Link.State.ACTIVE);
260 VirtualLink link2 = manager.createVirtualLink(virtualNetwork.id(), cp7, cp6);
261 virtualNetworkManagerStore.updateLink(link2, link2.tunnelId(), Link.State.ACTIVE);
262
263 reasons.add(new LinkEvent(LinkEvent.Type.LINK_ADDED, link));
264 reasons.add(new LinkEvent(LinkEvent.Type.LINK_ADDED, link2));
265 TopologyEvent event = new TopologyEvent(
266 TopologyEvent.Type.TOPOLOGY_CHANGED,
267 topologyService.currentTopology(),
268 reasons);
269
270 topologyProvider.topologyListener.event(event);
271
272 // Wait for the topology changed event, and that the topologyChanged method was called.
273 try {
274 if (!changed.tryAcquire(MAX_PERMITS, MAX_WAIT_TIME, TimeUnit.SECONDS)) {
275 fail("Failed to wait for topology changed event.");
276 }
277 } catch (InterruptedException e) {
278 fail("Semaphore exception." + e.getMessage());
279 }
280
281 // Validate that the topology changed method received a single cluster of connect points.
282 // This means that the two previous clusters have now joined into a single cluster.
283 assertEquals("The cluster count did not match.", 1, this.clusters.size());
yoonseon214963b2016-11-21 15:41:07 -0800284 assertEquals("The cluster count did not match.", 1,
285 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400286
287 // Now remove the virtual link to split it back into two clusters.
288 manager.removeVirtualLink(virtualNetwork.id(), link.src(), link.dst());
289 manager.removeVirtualLink(virtualNetwork.id(), link2.src(), link2.dst());
yoonseon214963b2016-11-21 15:41:07 -0800290 assertEquals("The cluster count did not match.", 2,
291 topologyService.currentTopology().clusterCount());
Brian Stankefb61df42016-07-25 11:47:51 -0400292
293 reasons = new ArrayList<>();
294 reasons.add(new LinkEvent(LinkEvent.Type.LINK_REMOVED, link));
295 reasons.add(new LinkEvent(LinkEvent.Type.LINK_REMOVED, link2));
296 event = new TopologyEvent(
297 TopologyEvent.Type.TOPOLOGY_CHANGED,
298 topologyService.currentTopology(),
299 reasons);
300
301 topologyProvider.topologyListener.event(event);
302
303 // Wait for the topology changed event, and that the topologyChanged method was called.
304 try {
305 if (!changed.tryAcquire(MAX_PERMITS, MAX_WAIT_TIME, TimeUnit.SECONDS)) {
306 fail("Failed to wait for topology changed event.");
307 }
308 } catch (InterruptedException e) {
309 fail("Semaphore exception." + e.getMessage());
310 }
311
312 // Validate that the topology changed method received two clusters of connect points.
313 // This means that the single previous clusters has now split into two clusters.
314 assertEquals("The cluster count did not match.", 2, this.clusters.size());
315 }
316
317 /**
318 * Virtual network registry implementation for this test class.
319 */
320 private class VirtualNetworkRegistryAdapter implements VirtualNetworkProviderRegistry {
321 private VirtualNetworkProvider provider;
322
323 @Override
324 public VirtualNetworkProviderService register(VirtualNetworkProvider theProvider) {
325 this.provider = theProvider;
326 return new TestVirtualNetworkProviderService(theProvider);
327 }
328
329 @Override
330 public void unregister(VirtualNetworkProvider theProvider) {
331 this.provider = null;
332 }
333
334 @Override
335 public Set<ProviderId> getProviders() {
336 return null;
337 }
338 }
339
340
341 /**
342 * Virtual network provider service implementation for this test class.
343 */
344 private class TestVirtualNetworkProviderService
345 extends AbstractProviderService<VirtualNetworkProvider>
346 implements VirtualNetworkProviderService {
347
348 /**
349 * Constructor.
350 *
351 * @param provider virtual network test provider
352 */
353 protected TestVirtualNetworkProviderService(VirtualNetworkProvider provider) {
354 super(provider);
355 }
356
357 @Override
358 public void topologyChanged(Set<Set<ConnectPoint>> theClusters) {
359 clusters = theClusters;
360 changed.release();
361 }
362
363 @Override
yoonseon214963b2016-11-21 15:41:07 -0800364 public void tunnelUp(NetworkId networkId, ConnectPoint src,
365 ConnectPoint dst, TunnelId tunnelId) {
Brian Stankefb61df42016-07-25 11:47:51 -0400366 }
367
368 @Override
yoonseon214963b2016-11-21 15:41:07 -0800369 public void tunnelDown(NetworkId networkId, ConnectPoint src,
370 ConnectPoint dst, TunnelId tunnelId) {
Brian Stankefb61df42016-07-25 11:47:51 -0400371 }
372 }
373
374 /**
375 * Core service test class.
376 */
377 private class TestCoreService extends CoreServiceAdapter {
378
379 @Override
380 public IdGenerator getIdGenerator(String topic) {
381 return new IdGenerator() {
382 private AtomicLong counter = new AtomicLong(0);
383
384 @Override
385 public long getNewId() {
386 return counter.getAndIncrement();
387 }
388 };
389 }
390 }
391}