blob: ce33f220336b6c64a003d756cdcb95f730553dfb [file] [log] [blame]
Ray Milkeycd6ab182016-02-03 11:13:09 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Ray Milkeycd6ab182016-02-03 11:13:09 -08003 *
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 */
16package org.onosproject.provider.netcfglinks;
17
Jonathan Hart7838c512016-06-07 15:18:22 -070018import com.google.common.collect.ImmutableList;
Ray Milkeycd6ab182016-02-03 11:13:09 -080019import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
22import org.onlab.packet.ChassisId;
23import org.onlab.packet.Ethernet;
24import org.onlab.packet.ONOSLLDP;
Ayaka Koshibe48229222016-05-16 18:04:26 -070025import org.onosproject.cluster.ClusterMetadataServiceAdapter;
Ray Milkeycd6ab182016-02-03 11:13:09 -080026import org.onosproject.core.CoreServiceAdapter;
27import org.onosproject.mastership.MastershipServiceAdapter;
28import org.onosproject.net.ConnectPoint;
29import org.onosproject.net.DefaultPort;
30import org.onosproject.net.Device;
31import org.onosproject.net.DeviceId;
32import org.onosproject.net.LinkKey;
33import org.onosproject.net.NetTestTools;
34import org.onosproject.net.Port;
35import org.onosproject.net.PortNumber;
36import org.onosproject.net.config.NetworkConfigEvent;
37import org.onosproject.net.config.NetworkConfigListener;
38import org.onosproject.net.config.NetworkConfigRegistryAdapter;
39import org.onosproject.net.config.basics.BasicLinkConfig;
40import org.onosproject.net.device.DeviceEvent;
41import org.onosproject.net.device.DeviceListener;
42import org.onosproject.net.device.DeviceServiceAdapter;
43import org.onosproject.net.flow.TrafficTreatment;
44import org.onosproject.net.link.LinkDescription;
45import org.onosproject.net.link.LinkProviderRegistryAdapter;
46import org.onosproject.net.link.LinkProviderServiceAdapter;
47import org.onosproject.net.packet.DefaultInboundPacket;
48import org.onosproject.net.packet.InboundPacket;
49import org.onosproject.net.packet.OutboundPacket;
50import org.onosproject.net.packet.PacketContext;
51import org.onosproject.net.packet.PacketProcessor;
52import org.onosproject.net.packet.PacketServiceAdapter;
53
Jonathan Hart7838c512016-06-07 15:18:22 -070054import java.nio.ByteBuffer;
55import java.util.List;
Ray Milkeycd6ab182016-02-03 11:13:09 -080056
57import static org.hamcrest.MatcherAssert.assertThat;
58import static org.hamcrest.Matchers.empty;
59import static org.hamcrest.Matchers.hasSize;
60import static org.hamcrest.Matchers.is;
61import static org.hamcrest.Matchers.notNullValue;
62
63/**
64 * Unit tests for the network config links provider.
65 */
66public class NetworkConfigLinksProviderTest {
67
68 private NetworkConfigLinksProvider provider;
69
70 private PacketProcessor testProcessor;
71 private LinkProviderServiceAdapter providerService;
72 private NetworkConfigListener configListener;
73 private final TestNetworkConfigRegistry configRegistry =
74 new TestNetworkConfigRegistry();
75
76 static Device dev1 = NetTestTools.device("sw1");
77 static Device dev2 = NetTestTools.device("sw2");
78 static Device dev3 = NetTestTools.device("sw3");
79 static PortNumber portNumber1 = PortNumber.portNumber(1);
80 static PortNumber portNumber2 = PortNumber.portNumber(2);
81 static PortNumber portNumber3 = PortNumber.portNumber(3);
82 static ConnectPoint src = new ConnectPoint(dev1.id(), portNumber2);
83 static ConnectPoint dst = new ConnectPoint(dev2.id(), portNumber2);
84
85 static DeviceListener deviceListener;
86
87 /**
88 * Test device manager. Returns a known set of devices and ports.
89 */
90 static class TestDeviceManager extends DeviceServiceAdapter {
91
92 @Override
93 public Iterable<Device> getAvailableDevices() {
94 return ImmutableList.of(dev1, dev2);
95 }
96
97 @Override
98 public List<Port> getPorts(DeviceId deviceId) {
99 return ImmutableList.of(new DefaultPort(dev1, portNumber1, true),
100 new DefaultPort(dev2, portNumber2, true));
101 }
102
103 @Override
104 public void addListener(DeviceListener listener) {
105 deviceListener = listener;
106 }
Ray Milkey957390e2016-02-09 10:02:46 -0800107
108 @Override
109 public Device getDevice(DeviceId deviceId) {
110 if (deviceId.equals(dev1.id())) {
111 return dev1;
112 } else {
113 return dev2;
114 }
115 }
Ray Milkeycd6ab182016-02-03 11:13:09 -0800116 }
117
118 /**
119 * Test mastership service. All devices owned by the local node for testing.
120 */
121 static class TestMastershipService extends MastershipServiceAdapter {
122 @Override
123 public boolean isLocalMaster(DeviceId deviceId) {
124 return true;
125 }
126 }
127
128 /**
129 * Test packet context for generation of LLDP packets.
130 */
131 private class TestPacketContext implements PacketContext {
132
133 protected ConnectPoint src;
134 protected ConnectPoint dst;
135 protected boolean blocked = false;
136
137 public TestPacketContext(ConnectPoint src, ConnectPoint dst) {
138 this.src = src;
139 this.dst = dst;
140 }
141
142 @Override
143 public long time() {
144 return 0;
145 }
146
147 @Override
148 public InboundPacket inPacket() {
149 ONOSLLDP lldp = ONOSLLDP.onosLLDP(src.deviceId().toString(),
150 new ChassisId(),
151 (int) src.port().toLong());
152
153 Ethernet ethPacket = new Ethernet();
154 ethPacket.setEtherType(Ethernet.TYPE_LLDP);
Jonathan Hart7838c512016-06-07 15:18:22 -0700155 ethPacket.setDestinationMACAddress(ONOSLLDP.LLDP_ONLAB);
Ray Milkeycd6ab182016-02-03 11:13:09 -0800156 ethPacket.setPayload(lldp);
157 ethPacket.setPad(true);
158
159 ethPacket.setSourceMACAddress("DE:AD:BE:EF:BA:11");
160
161 return new DefaultInboundPacket(dst, ethPacket,
162 ByteBuffer.wrap(ethPacket.serialize()));
163
164 }
165
166 @Override
167 public OutboundPacket outPacket() {
168 return null;
169 }
170
171 @Override
172 public TrafficTreatment.Builder treatmentBuilder() {
173 return null;
174 }
175
176 @Override
177 public void send() {
178
179 }
180
181 @Override
182 public boolean block() {
183 blocked = true;
184 return true;
185 }
186
187 @Override
188 public boolean isHandled() {
189 return blocked;
190 }
191
192 }
193
194 /**
195 * Test packet service for capturing the packet processor from the service
196 * under test.
197 */
198 private class TestPacketService extends PacketServiceAdapter {
199 @Override
200 public void addProcessor(PacketProcessor processor, int priority) {
201 testProcessor = processor;
202 }
203 }
204
205 /**
206 * Test network config registry. Captures the network config listener from
207 * the service under test.
208 */
209 private final class TestNetworkConfigRegistry
210 extends NetworkConfigRegistryAdapter {
211
212
213 @Override
214 public void addListener(NetworkConfigListener listener) {
215 configListener = listener;
216 }
217 }
218
219 /**
220 * Sets up a network config links provider under test and the services
221 * required to run it.
222 */
223 @Before
224 public void setUp() {
225 provider = new NetworkConfigLinksProvider();
226
227 provider.coreService = new CoreServiceAdapter();
228 provider.packetService = new PacketServiceAdapter();
229 LinkProviderRegistryAdapter linkRegistry =
230 new LinkProviderRegistryAdapter();
231 provider.providerRegistry = linkRegistry;
232 provider.deviceService = new TestDeviceManager();
233 provider.masterService = new TestMastershipService();
234 provider.packetService = new TestPacketService();
Ayaka Koshibe48229222016-05-16 18:04:26 -0700235 provider.metadataService = new ClusterMetadataServiceAdapter();
Ray Milkeycd6ab182016-02-03 11:13:09 -0800236 provider.netCfgService = configRegistry;
237
238 provider.activate();
239
240 providerService = linkRegistry.registeredProvider();
241 }
242
243 /**
244 * Tears down the provider under test.
245 */
246 @After
247 public void tearDown() {
248 provider.deactivate();
249 }
250
251 /**
252 * Tests that a network config links provider object can be created.
253 * The actual creation is done in the setUp() method.
254 */
255 @Test
256 public void testCreation() {
257 assertThat(provider, notNullValue());
258 assertThat(provider.configuredLinks, empty());
259 }
260
261 /**
262 * Tests loading of devices from the device manager.
263 */
264 @Test
265 public void testDeviceLoad() {
266 assertThat(provider, notNullValue());
267 assertThat(provider.discoverers.entrySet(), hasSize(2));
268 }
269
270 /**
271 * Tests discovery of a link that is not expected in the configuration.
272 */
273 @Test
274 public void testNotConfiguredLink() {
275 PacketContext pktCtx = new TestPacketContext(src, dst);
276
277 testProcessor.process(pktCtx);
278
279 assertThat(providerService.discoveredLinks().entrySet(), hasSize(1));
280 DeviceId destination = providerService.discoveredLinks().get(dev1.id());
281 assertThat(destination, notNullValue());
282 LinkKey key = LinkKey.linkKey(src, dst);
283 LinkDescription linkDescription = providerService
284 .discoveredLinkDescriptions().get(key);
285 assertThat(linkDescription, notNullValue());
286 assertThat(linkDescription.isExpected(), is(false));
287 }
288
289 /**
290 * Tests discovery of an expected link.
291 */
292 @Test
293 public void testConfiguredLink() {
294 LinkKey key = LinkKey.linkKey(src, dst);
295 configListener.event(new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
296 key,
297 BasicLinkConfig.class));
298
299 PacketContext pktCtx = new TestPacketContext(src, dst);
300
301 testProcessor.process(pktCtx);
302
303 assertThat(providerService.discoveredLinks().entrySet(), hasSize(1));
304 DeviceId destination = providerService.discoveredLinks().get(dev1.id());
305 assertThat(destination, notNullValue());
306 LinkDescription linkDescription = providerService
307 .discoveredLinkDescriptions().get(key);
308 assertThat(linkDescription, notNullValue());
309 assertThat(linkDescription.isExpected(), is(true));
310 }
311
312 /**
313 * Tests removal of a link from the configuration.
314 */
315 @Test
316 public void testRemoveLink() {
317 LinkKey key = LinkKey.linkKey(src, dst);
318 configListener.event(new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
319 key,
320 BasicLinkConfig.class));
321
322 assertThat(provider.configuredLinks, hasSize(1));
323
324 configListener.event(new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_REMOVED,
325 key,
326 BasicLinkConfig.class));
327 assertThat(provider.configuredLinks, hasSize(0));
328 }
329
330 /**
331 * Tests adding a new device via an event.
332 */
333 @Test
334 public void testAddDevice() {
335 deviceListener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, dev3));
336 assertThat(provider.discoverers.entrySet(), hasSize(3));
337 }
338
339 /**
340 * Tests adding a new port via an event.
341 */
342 @Test
343 public void testAddPort() {
344 deviceListener.event(new DeviceEvent(DeviceEvent.Type.PORT_ADDED, dev3,
345 new DefaultPort(dev3, portNumber3, true)));
346 assertThat(provider.discoverers.entrySet(), hasSize(3));
347 }
348
349 /**
350 * Tests removing a device via an event.
351 */
352 @Test
353 public void testRemoveDevice() {
354 assertThat(provider.discoverers.entrySet(), hasSize(2));
355 deviceListener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, dev3));
356 assertThat(provider.discoverers.entrySet(), hasSize(3));
357 deviceListener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_REMOVED, dev3));
358 assertThat(provider.discoverers.entrySet(), hasSize(2));
359 }
360
361 /**
362 * Tests removing a port via an event.
363 */
364 @Test
365 public void testRemovePort() {
366 assertThat(provider.discoverers.entrySet(), hasSize(2));
367 deviceListener.event(new DeviceEvent(DeviceEvent.Type.PORT_ADDED, dev3,
368 new DefaultPort(dev3, portNumber3, true)));
369 assertThat(provider.discoverers.entrySet(), hasSize(3));
370 deviceListener.event(new DeviceEvent(DeviceEvent.Type.PORT_REMOVED, dev3,
371 new DefaultPort(dev3, portNumber3, true)));
372 assertThat(provider.discoverers.entrySet(), hasSize(3));
373 }
374
375 /**
376 * Tests changing device availability via an event.
377 */
378 @Test
379 public void testDeviceAvailabilityChanged() {
380 assertThat(providerService.vanishedDpid(), hasSize(0));
381
382 deviceListener.event(
383 new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, dev3));
384 assertThat(providerService.vanishedDpid(), hasSize(0));
385
386 deviceListener.event(
387 new DeviceEvent(DeviceEvent.Type.DEVICE_AVAILABILITY_CHANGED, dev3));
388 assertThat(providerService.vanishedDpid(), hasSize(1));
389 }
390}