blob: 2571b88dc4da502d9b494f7516942480aeb325e5 [file] [log] [blame]
Michele Santuari576f09c2016-09-28 14:20:00 +02001/*
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
17package org.onosproject.provider.netconf.device.impl;
18
Andrea Campanella34cf65c2017-04-12 13:51:32 +020019import com.fasterxml.jackson.databind.JsonNode;
20import com.fasterxml.jackson.databind.ObjectMapper;
Michal Mach26a90fa2017-06-07 11:12:46 +020021import com.google.common.collect.HashMultimap;
Michele Santuari576f09c2016-09-28 14:20:00 +020022import com.google.common.collect.ImmutableSet;
Michal Mach26a90fa2017-06-07 11:12:46 +020023import com.google.common.collect.Multimap;
24import com.google.common.util.concurrent.MoreExecutors;
Andrea Campanella34cf65c2017-04-12 13:51:32 +020025import org.apache.commons.lang.StringUtils;
Michele Santuari576f09c2016-09-28 14:20:00 +020026import org.junit.Before;
Andrea Campanella59ca8312017-04-27 09:31:32 +020027import org.junit.Ignore;
Michele Santuari576f09c2016-09-28 14:20:00 +020028import org.junit.Test;
Michele Santuari576f09c2016-09-28 14:20:00 +020029import org.onlab.packet.IpAddress;
Thomas Vachuskaf3aaa8d2017-03-31 10:43:58 -070030import org.onosproject.cfg.ComponentConfigAdapter;
Michele Santuari576f09c2016-09-28 14:20:00 +020031import org.onosproject.core.ApplicationId;
32import org.onosproject.core.CoreService;
33import org.onosproject.core.DefaultApplicationId;
34import org.onosproject.incubator.net.config.basics.ConfigException;
35import org.onosproject.mastership.MastershipService;
36import org.onosproject.mastership.MastershipServiceAdapter;
37import org.onosproject.net.AbstractProjectableModel;
Michal Mach26a90fa2017-06-07 11:12:46 +020038import org.onosproject.net.DefaultAnnotations;
Michele Santuari576f09c2016-09-28 14:20:00 +020039import org.onosproject.net.DefaultDevice;
40import org.onosproject.net.Device;
41import org.onosproject.net.DeviceId;
Michal Mach26a90fa2017-06-07 11:12:46 +020042import org.onosproject.net.PortNumber;
Michele Santuari576f09c2016-09-28 14:20:00 +020043import org.onosproject.net.config.Config;
Andrea Campanella34cf65c2017-04-12 13:51:32 +020044import org.onosproject.net.config.ConfigApplyDelegate;
Michele Santuari576f09c2016-09-28 14:20:00 +020045import org.onosproject.net.config.ConfigFactory;
46import org.onosproject.net.config.NetworkConfigEvent;
47import org.onosproject.net.config.NetworkConfigListener;
48import org.onosproject.net.config.NetworkConfigRegistry;
49import org.onosproject.net.config.NetworkConfigRegistryAdapter;
50import org.onosproject.net.config.basics.BasicDeviceConfig;
Michal Mach26a90fa2017-06-07 11:12:46 +020051import org.onosproject.net.device.DefaultPortDescription;
Michele Santuari576f09c2016-09-28 14:20:00 +020052import org.onosproject.net.device.DeviceDescription;
53import org.onosproject.net.device.DeviceDescriptionDiscovery;
54import org.onosproject.net.device.DeviceEvent;
55import org.onosproject.net.device.DeviceListener;
56import org.onosproject.net.device.DeviceProvider;
57import org.onosproject.net.device.DeviceProviderRegistry;
58import org.onosproject.net.device.DeviceProviderRegistryAdapter;
59import org.onosproject.net.device.DeviceProviderService;
60import org.onosproject.net.device.DeviceProviderServiceAdapter;
Michele Santuari576f09c2016-09-28 14:20:00 +020061import org.onosproject.net.device.DeviceServiceAdapter;
62import org.onosproject.net.device.DeviceStore;
63import org.onosproject.net.device.DeviceStoreAdapter;
64import org.onosproject.net.device.PortDescription;
65import org.onosproject.net.driver.AbstractHandlerBehaviour;
66import org.onosproject.net.driver.Behaviour;
67import org.onosproject.net.driver.Driver;
68import org.onosproject.net.driver.DriverAdapter;
69import org.onosproject.net.driver.DriverHandler;
70import org.onosproject.net.driver.DriverServiceAdapter;
71import org.onosproject.net.key.DeviceKeyAdminService;
72import org.onosproject.net.key.DeviceKeyAdminServiceAdapter;
73import org.onosproject.net.provider.ProviderId;
74import org.onosproject.netconf.NetconfController;
75import org.onosproject.netconf.NetconfDeviceListener;
Yuta HIGUCHIb6e0e912017-05-18 20:13:52 -070076import org.onosproject.netconf.config.NetconfDeviceConfig;
Michele Santuari576f09c2016-09-28 14:20:00 +020077
Andrea Campanella34cf65c2017-04-12 13:51:32 +020078import java.io.IOException;
79import java.io.InputStream;
Michele Santuari576f09c2016-09-28 14:20:00 +020080import java.util.ArrayList;
81import java.util.HashMap;
82import java.util.HashSet;
83import java.util.List;
84import java.util.Set;
85import java.util.concurrent.CopyOnWriteArraySet;
86
Michal Mach26a90fa2017-06-07 11:12:46 +020087import static org.easymock.EasyMock.createMock;
88import static org.easymock.EasyMock.expect;
89import static org.easymock.EasyMock.replay;
Andrea Campanella34cf65c2017-04-12 13:51:32 +020090import static org.hamcrest.Matchers.is;
Michal Mach26a90fa2017-06-07 11:12:46 +020091import static org.junit.Assert.assertEquals;
92import static org.junit.Assert.assertFalse;
93import static org.junit.Assert.assertNotNull;
94import static org.junit.Assert.assertNull;
95import static org.junit.Assert.assertThat;
96import static org.junit.Assert.assertTrue;
Michele Santuari576f09c2016-09-28 14:20:00 +020097import static org.onlab.junit.TestTools.assertAfter;
98import static org.onosproject.provider.netconf.device.impl.NetconfDeviceProvider.APP_NAME;
Michal Mach26a90fa2017-06-07 11:12:46 +020099import static org.onosproject.provider.netconf.device.impl.NetconfDeviceProvider.SCHEME_NAME;
Michele Santuari576f09c2016-09-28 14:20:00 +0200100
101/**
102 * Netconf device provider basic test.
103 */
104public class NetconfDeviceProviderTest {
105
106 private final NetconfDeviceProvider provider = new NetconfDeviceProvider();
107 private final NetconfController controller = new MockNetconfController();
108
109 //Provider Mock
110 private final DeviceProviderRegistry deviceRegistry = new MockDeviceProviderRegistry();
Michal Mach26a90fa2017-06-07 11:12:46 +0200111 private final MockDeviceProviderService providerService = new MockDeviceProviderService();
112 private final MockDeviceService deviceService = new MockDeviceService();
Michele Santuari576f09c2016-09-28 14:20:00 +0200113 private final MastershipService mastershipService = new MockMastershipService();
114 private final Driver driver = new MockDriver();
115 private final NetworkConfigRegistry cfgService = new MockNetworkConfigRegistry();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200116 private final Set<ConfigFactory> cfgFactories = new HashSet<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200117 private final DeviceKeyAdminService deviceKeyAdminService = new DeviceKeyAdminServiceAdapter();
118 private final DeviceStore deviceStore = new MockDeviceStore();
119
120 //Class for testing
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200121 private final NetconfDeviceConfig netconfDeviceConfig = new NetconfDeviceConfig();
122 private final NetconfDeviceConfig netconfDeviceConfigSshKey = new NetconfDeviceConfig();
123 private final NetconfDeviceConfig netconfDeviceConfigEmptyIpv4 = new NetconfDeviceConfig();
124 private final NetconfDeviceConfig netconfDeviceConfigEmptyIpv6 = new NetconfDeviceConfig();
Yuta HIGUCHIb6e0e912017-05-18 20:13:52 -0700125 private final NetworkConfigEvent deviceAddedEvent =
126 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
127 DeviceId.deviceId(NETCONF_DEVICE_ID_STRING),
128 netconfDeviceConfig, null,
129 NetconfDeviceConfig.class);
130
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200131 private final NetworkConfigEvent deviceAddedEventOld =
132 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
Michele Santuari576f09c2016-09-28 14:20:00 +0200133 null, NetconfProviderConfig.class);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200134 private final NetworkConfigEvent deviceAddedEventTranslated =
135 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
136 DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD),
137 NetconfDeviceConfig.class);
Michele Santuari576f09c2016-09-28 14:20:00 +0200138 private final NetconfProviderConfig netconfProviderConfig = new MockNetconfProviderConfig();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200139 private static final String NETCONF_DEVICE_ID_STRING = "netconf:1.1.1.1:830";
140 private static final String NETCONF_DEVICE_ID_STRING_OLD = "netconf:1.1.1.2:1";
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700141 private static final String NETCONF_DEVICE_ID_STRING_IPV6 = "netconf:2001:0db8:0000:0000:0000:ff00:0042:8329:830";
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200142 private static final String IP_STRING = "1.1.1.1";
143 private static final String IP_STRING_OLD = "1.1.1.2";
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700144 private static final String IP_STRING_IPV6 = "2001:0db8:0000:0000:0000:ff00:0042:8329";
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200145 private static final IpAddress IP = IpAddress.valueOf(IP_STRING);
146 private static final IpAddress IP_OLD = IpAddress.valueOf(IP_STRING_OLD);
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700147 private static final IpAddress IP_V6 = IpAddress.valueOf(IP_STRING_IPV6);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200148 private static final int PORT = 830;
Michele Santuari576f09c2016-09-28 14:20:00 +0200149 private static final String TEST = "test";
150 private static final int DELAY_DISCOVERY = 500;
Sean Condonfae8e662016-12-15 10:25:13 +0000151 private static final int DELAY_DURATION_DISCOVERY = 3000;
Michal Mach26a90fa2017-06-07 11:12:46 +0200152 private static final int PORT_COUNT = 5;
153 private final TestDescription deviceDescription = new TestDescription();
154 private final Device netconfDevice = new MockDevice(DeviceId.deviceId("netconf:127.0.0.1"));
155 private final Device notNetconfDevice = new MockDevice(DeviceId.deviceId("other:127.0.0.1"));
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200156
157 //Testing Files
Michal Mach26a90fa2017-06-07 11:12:46 +0200158 private final InputStream jsonStream = NetconfDeviceProviderTest.class
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200159 .getResourceAsStream("/device.json");
Michal Mach26a90fa2017-06-07 11:12:46 +0200160 private final InputStream jsonStreamSshKey = NetconfDeviceProviderTest.class
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200161 .getResourceAsStream("/deviceSshKey.json");
Michele Santuari576f09c2016-09-28 14:20:00 +0200162
163 //Provider related classes
164 private CoreService coreService;
Michal Mach26a90fa2017-06-07 11:12:46 +0200165 private final ApplicationId appId =
Michele Santuari576f09c2016-09-28 14:20:00 +0200166 new DefaultApplicationId(100, APP_NAME);
Michal Mach26a90fa2017-06-07 11:12:46 +0200167 private final DeviceDescriptionDiscovery descriptionDiscovery = new TestDescription();
168 private final Set<NetworkConfigListener> netCfgListeners = new HashSet<>();
169 private final HashMap<DeviceId, Device> devices = new HashMap<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200170
171 //Controller related classes
Michal Mach26a90fa2017-06-07 11:12:46 +0200172 private final Set<NetconfDeviceListener> netconfDeviceListeners = new CopyOnWriteArraySet<>();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200173 private boolean available = false;
174 private boolean firstRequest = true;
Michele Santuari576f09c2016-09-28 14:20:00 +0200175
176 @Before
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200177 public void setUp() throws IOException {
Michele Santuari576f09c2016-09-28 14:20:00 +0200178 coreService = createMock(CoreService.class);
179 expect(coreService.registerApplication(APP_NAME))
180 .andReturn(appId).anyTimes();
181 replay(coreService);
182 provider.coreService = coreService;
183 provider.providerRegistry = deviceRegistry;
184 provider.mastershipService = mastershipService;
185 provider.deviceService = deviceService;
Michal Mach26a90fa2017-06-07 11:12:46 +0200186 provider.providerService = providerService;
Michele Santuari576f09c2016-09-28 14:20:00 +0200187 provider.cfgService = cfgService;
188 provider.controller = controller;
189 provider.deviceKeyAdminService = deviceKeyAdminService;
Thomas Vachuskaf3aaa8d2017-03-31 10:43:58 -0700190 provider.componentConfigService = new ComponentConfigAdapter();
Michele Santuari576f09c2016-09-28 14:20:00 +0200191 AbstractProjectableModel.setDriverService(null, new DriverServiceAdapter());
Thomas Vachuskaf3aaa8d2017-03-31 10:43:58 -0700192 provider.activate(null);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200193 devices.clear();
194 available = false;
195 firstRequest = true;
196 DeviceId subject = DeviceId.deviceId(NETCONF_DEVICE_ID_STRING);
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700197 DeviceId subjectIpv6 = DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_IPV6);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200198 String key = "netconf";
199 ObjectMapper mapper = new ObjectMapper();
200 JsonNode jsonNode = mapper.readTree(jsonStream);
201 ConfigApplyDelegate delegate = new MockDelegate();
202 netconfDeviceConfig.init(subject, key, jsonNode, mapper, delegate);
203 JsonNode jsonNodesshKey = mapper.readTree(jsonStreamSshKey);
204 netconfDeviceConfigSshKey.init(subject, key, jsonNodesshKey, mapper, delegate);
205 JsonNode jsonNodeEmpty = mapper.createObjectNode();
206 netconfDeviceConfigEmptyIpv4.init(subject, key, jsonNodeEmpty, mapper, delegate);
207 netconfDeviceConfigEmptyIpv6.init(subjectIpv6, key, jsonNodeEmpty, mapper, delegate);
Michele Santuari576f09c2016-09-28 14:20:00 +0200208 }
209
210 @Test
211 public void activate() throws Exception {
Michele Santuari576f09c2016-09-28 14:20:00 +0200212 assertTrue("Provider should be registered", deviceRegistry.getProviders().contains(provider.id()));
213 assertEquals("Incorrect device service", deviceService, provider.deviceService);
214 assertEquals("Incorrect provider service", providerService, provider.providerService);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200215 assertTrue("Incorrect config factories", cfgFactories.containsAll(provider.factories));
Michal Mach26a90fa2017-06-07 11:12:46 +0200216 assertNotNull("Device listener should be added", deviceService.listener);
Michele Santuari576f09c2016-09-28 14:20:00 +0200217 assertFalse("Thread to connect device should be running",
218 provider.executor.isShutdown() || provider.executor.isTerminated());
219 assertFalse("Scheduled task to update device should be running", provider.scheduledTask.isCancelled());
220 }
221
222 @Test
223 public void deactivate() throws Exception {
224 provider.deactivate();
Michal Mach26a90fa2017-06-07 11:12:46 +0200225 assertNull("Device listener should be removed", deviceService.listener);
Michele Santuari576f09c2016-09-28 14:20:00 +0200226 assertFalse("Provider should not be registered", deviceRegistry.getProviders().contains(provider));
227 assertTrue("Thread to connect device should be shutdown", provider.executor.isShutdown());
228 assertTrue("Scheduled task to update device should be shutdown", provider.scheduledTask.isCancelled());
229 assertNull("Provider service should be null", provider.providerService);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200230 assertTrue("Network config factories not removed", cfgFactories.isEmpty());
Michele Santuari576f09c2016-09-28 14:20:00 +0200231 assertEquals("Controller listener should be removed", 0, netconfDeviceListeners.size());
232 }
233
234 @Test
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200235 public void configuration() {
236 assertTrue("Configuration should be valid", netconfDeviceConfig.isValid());
237 assertThat(netconfDeviceConfig.ip(), is(IP));
238 assertThat(netconfDeviceConfig.port(), is(PORT));
239 assertThat(netconfDeviceConfig.username(), is(TEST));
240 assertThat(netconfDeviceConfig.password(), is(TEST));
241 assertThat(netconfDeviceConfigSshKey.sshKey(), is(TEST));
242 }
243
244 @Test
245 public void configurationDeviceIdIpv4() {
246 assertTrue("Configuration should be valid", netconfDeviceConfigEmptyIpv4.isValid());
247 assertThat(netconfDeviceConfigEmptyIpv4.ip(), is(IP));
248 assertThat(netconfDeviceConfigEmptyIpv4.port(), is(PORT));
249 assertThat(netconfDeviceConfigEmptyIpv4.username(), is(StringUtils.EMPTY));
250 assertThat(netconfDeviceConfigEmptyIpv4.password(), is(StringUtils.EMPTY));
251 assertThat(netconfDeviceConfigEmptyIpv4.sshKey(), is(StringUtils.EMPTY));
252 }
253
254 @Test
255 public void configurationDeviceIdIpv6() {
256 assertTrue("Configuration should be valid", netconfDeviceConfigEmptyIpv6.isValid());
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700257 assertThat(netconfDeviceConfigEmptyIpv6.ip(), is(IP_V6));
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200258 assertThat(netconfDeviceConfigEmptyIpv6.port(), is(PORT));
259 assertThat(netconfDeviceConfigEmptyIpv6.username(), is(StringUtils.EMPTY));
260 assertThat(netconfDeviceConfigEmptyIpv6.password(), is(StringUtils.EMPTY));
261 assertThat(netconfDeviceConfigEmptyIpv6.sshKey(), is(StringUtils.EMPTY));
262 }
263
264 @Test
Andrea Campanella59ca8312017-04-27 09:31:32 +0200265 @Ignore("Test is brittle")
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200266 public void addDeviceOld() {
Michele Santuari576f09c2016-09-28 14:20:00 +0200267 assertNotNull(providerService);
268 assertTrue("Event should be relevant", provider.cfgListener.isRelevant(deviceAddedEvent));
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200269 assertTrue("Event should be relevant", provider.cfgListener.isRelevant(deviceAddedEventOld));
270 available = true;
271 provider.cfgListener.event(deviceAddedEventOld);
272
273 assertAfter(DELAY_DISCOVERY, DELAY_DURATION_DISCOVERY, () -> {
274 assertEquals("Device should be added", 1, deviceStore.getDeviceCount());
275 assertTrue("Device incorrectly added" + NETCONF_DEVICE_ID_STRING_OLD,
276 devices.containsKey(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD)));
277 });
278 devices.clear();
279 }
280
281 @Test
282 public void addDeviceNew() {
283 assertNotNull(providerService);
284 assertTrue("Event should be relevant", provider.cfgListener.isRelevant(deviceAddedEvent));
285 assertTrue("Event should be relevant", provider.cfgListener.isRelevant(deviceAddedEventOld));
286 available = true;
Michele Santuari576f09c2016-09-28 14:20:00 +0200287 provider.cfgListener.event(deviceAddedEvent);
288
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200289 assertAfter(DELAY_DISCOVERY, DELAY_DURATION_DISCOVERY, () -> {
290 assertEquals("Device should be added", 1, deviceStore.getDeviceCount());
291 assertTrue("Device incorrectly added" + NETCONF_DEVICE_ID_STRING,
292 devices.containsKey(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING)));
293 });
Michele Santuari576f09c2016-09-28 14:20:00 +0200294 devices.clear();
295 }
296
Michal Mach26a90fa2017-06-07 11:12:46 +0200297 @Test
298 public void testDiscoverPortsAfterDeviceAdded() {
299 provider.executor = MoreExecutors.newDirectExecutorService();
300 prepareMocks(PORT_COUNT);
301
302 deviceService.listener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, netconfDevice));
303 assertEquals("Ports should be added", PORT_COUNT, providerService.ports.get(netconfDevice.id()).size());
304
305 deviceService.listener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_REMOVED, netconfDevice));
306 assertEquals("Ports should be removed", 0, providerService.ports.get(netconfDevice.id()).size());
307 }
308
309 private void prepareMocks(int count) {
310 for(int i = 1; i <= count; i++) {
311 deviceDescription.portDescriptions.add(new DefaultPortDescription(PortNumber.portNumber(i), true));
312 }
313 }
314
315 //TODO: check updates of the device description
Michele Santuari576f09c2016-09-28 14:20:00 +0200316
317
318 //Mock classes
319 private class MockNetconfController extends NetconfControllerAdapter {
320
321 @Override
322 public void addDeviceListener(NetconfDeviceListener listener) {
323 if (!netconfDeviceListeners.contains(listener)) {
324 netconfDeviceListeners.add(listener);
325 }
326 }
327
328 @Override
329 public void removeDeviceListener(NetconfDeviceListener listener) {
330 netconfDeviceListeners.remove(listener);
331 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200332
333 @Override
334 public void disconnectDevice(DeviceId deviceId, boolean remove) {
335 netconfDeviceListeners.forEach( l -> l.deviceRemoved(deviceId));
336 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200337 }
338
339 private class MockDeviceProviderRegistry extends DeviceProviderRegistryAdapter {
340
Michal Mach26a90fa2017-06-07 11:12:46 +0200341 final Set<ProviderId> providers = new HashSet<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200342
343 @Override
344 public DeviceProviderService register(DeviceProvider provider) {
345 providers.add(provider.id());
346 return providerService;
347 }
348
349 @Override
350 public void unregister(DeviceProvider provider) {
351 providers.remove(provider.id());
352 }
353
354 @Override
355 public Set<ProviderId> getProviders() {
356 return providers;
357 }
358
359 }
360
361 private class MockDeviceService extends DeviceServiceAdapter {
Michal Mach26a90fa2017-06-07 11:12:46 +0200362 DeviceListener listener = null;
363
364 @Override
365 public Device getDevice(DeviceId deviceId) {
366 if (deviceId.toString().equals(NETCONF_DEVICE_ID_STRING)) {
367 return null;
368 } else if (deviceId.uri().getScheme().equals(SCHEME_NAME)) {
369 return netconfDevice;
370 } else {
371 return notNetconfDevice;
372 }
373
374 }
375
Michele Santuari576f09c2016-09-28 14:20:00 +0200376 @Override
377 public void addListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200378 this.listener = listener;
Michele Santuari576f09c2016-09-28 14:20:00 +0200379 }
380
381 @Override
382 public void removeListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200383 this.listener = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200384 }
385 }
386
387 private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
388
Michal Mach26a90fa2017-06-07 11:12:46 +0200389 final Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
390
Michele Santuari576f09c2016-09-28 14:20:00 +0200391 @Override
392 public void deviceConnected(DeviceId deviceId, DeviceDescription desc) {
393 assertNotNull("DeviceId should be not null", deviceId);
394 assertNotNull("DeviceDescription should be not null", desc);
395 deviceStore.createOrUpdateDevice(ProviderId.NONE, deviceId, desc);
396 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200397
398 @Override
399 public void updatePorts(DeviceId deviceId,
400 List<PortDescription> portDescriptions) {
401 for (PortDescription p : portDescriptions) {
402 ports.put(deviceId, p);
403 }
404 }
405
406 @Override
407 public void deviceDisconnected(DeviceId deviceId) {
408 ports.removeAll(deviceId);
409 }
410
Michele Santuari576f09c2016-09-28 14:20:00 +0200411 }
412
413 private class MockDeviceStore extends DeviceStoreAdapter {
414
415 @Override
416 public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
417 DeviceDescription desc) {
418
419 devices.put(deviceId, new DefaultDevice(providerId, deviceId, desc.type(),
420 desc.manufacturer(), desc.hwVersion(),
421 desc.swVersion(), desc.serialNumber(),
422 desc.chassisId(), desc.annotations()));
Michele Santuari576f09c2016-09-28 14:20:00 +0200423 return null;
424 }
425
426 @Override
427 public Device getDevice(DeviceId deviceId) {
428 return devices.get(deviceId);
429 }
430
431 @Override
432 public int getDeviceCount() {
433 return devices.size();
434 }
435
436 }
437
438 private class MockMastershipService extends MastershipServiceAdapter {
439
440 @Override
441 public boolean isLocalMaster(DeviceId deviceId) {
442 return true;
443 }
444 }
445
446 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200447 NetconfDeviceConfig cfg = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200448
449 @Override
450 public void registerConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200451 cfgFactories.add(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200452 }
453
454 @Override
455 public void unregisterConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200456 cfgFactories.remove(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200457 }
458
459 @Override
460 public void addListener(NetworkConfigListener listener) {
461 netCfgListeners.add(listener);
462 }
463
464 @Override
465 public void removeListener(NetworkConfigListener listener) {
466 netCfgListeners.remove(listener);
467 }
468
469
470 @Override
471 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200472 if (available) {
473 if (configClass.equals(NetconfProviderConfig.class)) {
474 return (C) netconfProviderConfig;
475 }
476 DeviceId did = (DeviceId) subject;
477 if (configClass.equals(NetconfDeviceConfig.class)
478 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING))) {
479 return (C) netconfDeviceConfig;
480 } else if (configClass.equals(NetconfDeviceConfig.class)
481 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD))) {
482 if (firstRequest) {
483 firstRequest = false;
484 return null;
485 }
486 return (C) cfg;
487 } else {
488 return (C) new BasicDeviceConfig();
489 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200490 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200491 return null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200492 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200493
494 @Override
495 public <S, C extends Config<S>> C applyConfig(S subject, Class<C> configClass,
496 JsonNode json) {
497 cfg = new NetconfDeviceConfig();
498 ObjectMapper mapper = new ObjectMapper();
499 cfg.init((DeviceId) subject, "netconf", mapper.createObjectNode(), mapper, null);
500 cfg.setIp(json.get("ip").asText())
501 .setPort(json.get("port").asInt())
502 .setUsername(json.get("username").asText())
503 .setPassword(json.get("password").asText())
504 .setSshKey(json.get("sshkey").asText());
505 provider.cfgListener.event(deviceAddedEventTranslated);
506 return (C) cfg;
507 }
508
509 @Override
510 public <S, C extends Config<S>> Set<S> getSubjects(Class<S> subjectClass, Class<C> configClass) {
Yuta HIGUCHIb6e0e912017-05-18 20:13:52 -0700511 Set<S> subjects = new HashSet<>();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200512 if (available) {
513 if (cfg != null) {
514 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD));
515 } else {
516 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING));
517 }
518 }
519 return subjects;
520 }
521
Michele Santuari576f09c2016-09-28 14:20:00 +0200522 }
523
524 private class MockNetconfProviderConfig extends NetconfProviderConfig {
Michal Mach26a90fa2017-06-07 11:12:46 +0200525 final NetconfDeviceAddress deviceInfo = new NetconfDeviceAddress(IP_OLD, 1, TEST, TEST);
Michele Santuari576f09c2016-09-28 14:20:00 +0200526
527 @Override
528 public Set<NetconfProviderConfig.NetconfDeviceAddress> getDevicesAddresses() throws ConfigException {
529 return ImmutableSet.of(deviceInfo);
530 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200531 }
532
533 private class MockDevice extends DefaultDevice {
534
Michal Mach26a90fa2017-06-07 11:12:46 +0200535 MockDevice(DeviceId id) {
536 super(null, id, null, null, null, null, null,
537 null, DefaultAnnotations.EMPTY);
Michele Santuari576f09c2016-09-28 14:20:00 +0200538 }
539
540 @Override
541 protected Driver locateDriver() {
542 return driver;
543 }
544
545 @Override
546 public Driver driver() {
547 return driver;
548 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200549
550 @Override
551 public <B extends Behaviour> B as(Class<B> projectionClass) {
552 return (B) deviceDescription;
553 }
554
555 @Override
556 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
557 return projectionClass.isAssignableFrom(DeviceDescriptionDiscovery.class);
558 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200559 }
560
561 private class MockDriver extends DriverAdapter {
562 @Override
563 public <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass) {
564
565 return (T) descriptionDiscovery;
566 }
567 }
568
569 private class TestDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
570
Michal Mach26a90fa2017-06-07 11:12:46 +0200571 final List<PortDescription> portDescriptions = new ArrayList<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200572
573 @Override
574 public DeviceDescription discoverDeviceDetails() {
575 return null;
576 }
577
578 @Override
579 public List<PortDescription> discoverPortDetails() {
580 return portDescriptions;
581 }
582
Michele Santuari576f09c2016-09-28 14:20:00 +0200583 private void addPortDesc(PortDescription portDescription) {
584 portDescriptions.add(portDescription);
585 }
586 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200587
588 private class MockDelegate implements ConfigApplyDelegate {
589 @Override
590 public void onApply(Config configFile) {
591 }
592 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200593
Michele Santuari576f09c2016-09-28 14:20:00 +0200594}