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