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