blob: c16de45e75fcadaf51bc28bb0ce2605da934625d [file] [log] [blame]
Michele Santuari576f09c2016-09-28 14:20:00 +02001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Michele Santuari576f09c2016-09-28 14:20:00 +02003 *
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;
Michal Mach26a90fa2017-06-07 11:12:46 +020022import com.google.common.collect.Multimap;
23import com.google.common.util.concurrent.MoreExecutors;
Andrea Campanella34cf65c2017-04-12 13:51:32 +020024import org.apache.commons.lang.StringUtils;
Michele Santuari576f09c2016-09-28 14:20:00 +020025import org.junit.Before;
26import org.junit.Test;
Michele Santuari576f09c2016-09-28 14:20:00 +020027import org.onlab.packet.IpAddress;
Thomas Vachuskaf3aaa8d2017-03-31 10:43:58 -070028import org.onosproject.cfg.ComponentConfigAdapter;
Michele Santuari576f09c2016-09-28 14:20:00 +020029import org.onosproject.core.ApplicationId;
30import org.onosproject.core.CoreService;
31import org.onosproject.core.DefaultApplicationId;
Michele Santuari576f09c2016-09-28 14:20:00 +020032import org.onosproject.mastership.MastershipService;
33import org.onosproject.mastership.MastershipServiceAdapter;
34import org.onosproject.net.AbstractProjectableModel;
Michal Mach26a90fa2017-06-07 11:12:46 +020035import org.onosproject.net.DefaultAnnotations;
Michele Santuari576f09c2016-09-28 14:20:00 +020036import org.onosproject.net.DefaultDevice;
37import org.onosproject.net.Device;
38import org.onosproject.net.DeviceId;
Michal Mach26a90fa2017-06-07 11:12:46 +020039import org.onosproject.net.PortNumber;
Michele Santuari576f09c2016-09-28 14:20:00 +020040import org.onosproject.net.config.Config;
Andrea Campanella34cf65c2017-04-12 13:51:32 +020041import org.onosproject.net.config.ConfigApplyDelegate;
Michele Santuari576f09c2016-09-28 14:20:00 +020042import org.onosproject.net.config.ConfigFactory;
43import org.onosproject.net.config.NetworkConfigEvent;
44import org.onosproject.net.config.NetworkConfigListener;
45import org.onosproject.net.config.NetworkConfigRegistry;
46import org.onosproject.net.config.NetworkConfigRegistryAdapter;
47import org.onosproject.net.config.basics.BasicDeviceConfig;
Michal Mach26a90fa2017-06-07 11:12:46 +020048import org.onosproject.net.device.DefaultPortDescription;
Michele Santuari576f09c2016-09-28 14:20:00 +020049import org.onosproject.net.device.DeviceDescription;
50import org.onosproject.net.device.DeviceDescriptionDiscovery;
51import org.onosproject.net.device.DeviceEvent;
52import org.onosproject.net.device.DeviceListener;
53import org.onosproject.net.device.DeviceProvider;
54import org.onosproject.net.device.DeviceProviderRegistry;
55import org.onosproject.net.device.DeviceProviderRegistryAdapter;
56import org.onosproject.net.device.DeviceProviderService;
57import org.onosproject.net.device.DeviceProviderServiceAdapter;
Michele Santuari576f09c2016-09-28 14:20:00 +020058import org.onosproject.net.device.DeviceServiceAdapter;
59import org.onosproject.net.device.DeviceStore;
60import org.onosproject.net.device.DeviceStoreAdapter;
61import org.onosproject.net.device.PortDescription;
62import org.onosproject.net.driver.AbstractHandlerBehaviour;
63import org.onosproject.net.driver.Behaviour;
64import org.onosproject.net.driver.Driver;
65import org.onosproject.net.driver.DriverAdapter;
66import org.onosproject.net.driver.DriverHandler;
67import org.onosproject.net.driver.DriverServiceAdapter;
68import org.onosproject.net.key.DeviceKeyAdminService;
69import org.onosproject.net.key.DeviceKeyAdminServiceAdapter;
70import org.onosproject.net.provider.ProviderId;
71import org.onosproject.netconf.NetconfController;
72import org.onosproject.netconf.NetconfDeviceListener;
Yuta HIGUCHIb6e0e912017-05-18 20:13:52 -070073import org.onosproject.netconf.config.NetconfDeviceConfig;
Michele Santuari576f09c2016-09-28 14:20:00 +020074
Andrea Campanella34cf65c2017-04-12 13:51:32 +020075import java.io.IOException;
76import java.io.InputStream;
Michele Santuari576f09c2016-09-28 14:20:00 +020077import java.util.ArrayList;
78import java.util.HashMap;
79import java.util.HashSet;
80import java.util.List;
81import java.util.Set;
82import java.util.concurrent.CopyOnWriteArraySet;
Yuta HIGUCHI795dff42017-06-23 13:36:44 -070083import java.util.concurrent.CountDownLatch;
Ray Milkey02710432018-02-13 17:08:28 -080084
Michal Mach26a90fa2017-06-07 11:12:46 +020085import static org.easymock.EasyMock.createMock;
86import static org.easymock.EasyMock.expect;
87import static org.easymock.EasyMock.replay;
Andrea Campanella34cf65c2017-04-12 13:51:32 +020088import static org.hamcrest.Matchers.is;
Michal Mach26a90fa2017-06-07 11:12:46 +020089import static org.junit.Assert.assertEquals;
90import static org.junit.Assert.assertFalse;
91import static org.junit.Assert.assertNotNull;
92import static org.junit.Assert.assertNull;
93import static org.junit.Assert.assertThat;
94import static org.junit.Assert.assertTrue;
Michele Santuari576f09c2016-09-28 14:20:00 +020095import static org.onosproject.provider.netconf.device.impl.NetconfDeviceProvider.APP_NAME;
Michal Mach26a90fa2017-06-07 11:12:46 +020096import static org.onosproject.provider.netconf.device.impl.NetconfDeviceProvider.SCHEME_NAME;
Michele Santuari576f09c2016-09-28 14:20:00 +020097
98/**
99 * Netconf device provider basic test.
100 */
101public class NetconfDeviceProviderTest {
102
103 private final NetconfDeviceProvider provider = new NetconfDeviceProvider();
104 private final NetconfController controller = new MockNetconfController();
105
106 //Provider Mock
107 private final DeviceProviderRegistry deviceRegistry = new MockDeviceProviderRegistry();
Michal Mach26a90fa2017-06-07 11:12:46 +0200108 private final MockDeviceProviderService providerService = new MockDeviceProviderService();
109 private final MockDeviceService deviceService = new MockDeviceService();
Michele Santuari576f09c2016-09-28 14:20:00 +0200110 private final MastershipService mastershipService = new MockMastershipService();
111 private final Driver driver = new MockDriver();
112 private final NetworkConfigRegistry cfgService = new MockNetworkConfigRegistry();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200113 private final Set<ConfigFactory> cfgFactories = new HashSet<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200114 private final DeviceKeyAdminService deviceKeyAdminService = new DeviceKeyAdminServiceAdapter();
115 private final DeviceStore deviceStore = new MockDeviceStore();
116
117 //Class for testing
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200118 private final NetconfDeviceConfig netconfDeviceConfig = new NetconfDeviceConfig();
119 private final NetconfDeviceConfig netconfDeviceConfigSshKey = new NetconfDeviceConfig();
120 private final NetconfDeviceConfig netconfDeviceConfigEmptyIpv4 = new NetconfDeviceConfig();
121 private final NetconfDeviceConfig netconfDeviceConfigEmptyIpv6 = new NetconfDeviceConfig();
Yuta HIGUCHIb6e0e912017-05-18 20:13:52 -0700122 private final NetworkConfigEvent deviceAddedEvent =
123 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
124 DeviceId.deviceId(NETCONF_DEVICE_ID_STRING),
125 netconfDeviceConfig, null,
126 NetconfDeviceConfig.class);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200127 private final NetworkConfigEvent deviceAddedEventTranslated =
128 new NetworkConfigEvent(NetworkConfigEvent.Type.CONFIG_ADDED,
129 DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD),
130 NetconfDeviceConfig.class);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200131 private static final String NETCONF_DEVICE_ID_STRING = "netconf:1.1.1.1:830";
132 private static final String NETCONF_DEVICE_ID_STRING_OLD = "netconf:1.1.1.2:1";
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700133 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 +0200134 private static final String IP_STRING = "1.1.1.1";
135 private static final String IP_STRING_OLD = "1.1.1.2";
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700136 private static final String IP_STRING_IPV6 = "2001:0db8:0000:0000:0000:ff00:0042:8329";
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200137 private static final IpAddress IP = IpAddress.valueOf(IP_STRING);
138 private static final IpAddress IP_OLD = IpAddress.valueOf(IP_STRING_OLD);
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700139 private static final IpAddress IP_V6 = IpAddress.valueOf(IP_STRING_IPV6);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200140 private static final int PORT = 830;
Michele Santuari576f09c2016-09-28 14:20:00 +0200141 private static final String TEST = "test";
142 private static final int DELAY_DISCOVERY = 500;
Sean Condonfae8e662016-12-15 10:25:13 +0000143 private static final int DELAY_DURATION_DISCOVERY = 3000;
Michal Mach26a90fa2017-06-07 11:12:46 +0200144 private static final int PORT_COUNT = 5;
145 private final TestDescription deviceDescription = new TestDescription();
146 private final Device netconfDevice = new MockDevice(DeviceId.deviceId("netconf:127.0.0.1"));
147 private final Device notNetconfDevice = new MockDevice(DeviceId.deviceId("other:127.0.0.1"));
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200148
149 //Testing Files
Michal Mach26a90fa2017-06-07 11:12:46 +0200150 private final InputStream jsonStream = NetconfDeviceProviderTest.class
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200151 .getResourceAsStream("/device.json");
Michal Mach26a90fa2017-06-07 11:12:46 +0200152 private final InputStream jsonStreamSshKey = NetconfDeviceProviderTest.class
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200153 .getResourceAsStream("/deviceSshKey.json");
Michele Santuari576f09c2016-09-28 14:20:00 +0200154
155 //Provider related classes
156 private CoreService coreService;
Michal Mach26a90fa2017-06-07 11:12:46 +0200157 private final ApplicationId appId =
Michele Santuari576f09c2016-09-28 14:20:00 +0200158 new DefaultApplicationId(100, APP_NAME);
Michal Mach26a90fa2017-06-07 11:12:46 +0200159 private final DeviceDescriptionDiscovery descriptionDiscovery = new TestDescription();
160 private final Set<NetworkConfigListener> netCfgListeners = new HashSet<>();
161 private final HashMap<DeviceId, Device> devices = new HashMap<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200162
163 //Controller related classes
Michal Mach26a90fa2017-06-07 11:12:46 +0200164 private final Set<NetconfDeviceListener> netconfDeviceListeners = new CopyOnWriteArraySet<>();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200165 private boolean available = false;
166 private boolean firstRequest = true;
Michele Santuari576f09c2016-09-28 14:20:00 +0200167
Yuta HIGUCHI795dff42017-06-23 13:36:44 -0700168 private CountDownLatch deviceAdded;
169
Michele Santuari576f09c2016-09-28 14:20:00 +0200170 @Before
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200171 public void setUp() throws IOException {
Michele Santuari576f09c2016-09-28 14:20:00 +0200172 coreService = createMock(CoreService.class);
173 expect(coreService.registerApplication(APP_NAME))
174 .andReturn(appId).anyTimes();
175 replay(coreService);
176 provider.coreService = coreService;
177 provider.providerRegistry = deviceRegistry;
178 provider.mastershipService = mastershipService;
179 provider.deviceService = deviceService;
Michal Mach26a90fa2017-06-07 11:12:46 +0200180 provider.providerService = providerService;
Michele Santuari576f09c2016-09-28 14:20:00 +0200181 provider.cfgService = cfgService;
182 provider.controller = controller;
183 provider.deviceKeyAdminService = deviceKeyAdminService;
Thomas Vachuskaf3aaa8d2017-03-31 10:43:58 -0700184 provider.componentConfigService = new ComponentConfigAdapter();
Michele Santuari576f09c2016-09-28 14:20:00 +0200185 AbstractProjectableModel.setDriverService(null, new DriverServiceAdapter());
Thomas Vachuskaf3aaa8d2017-03-31 10:43:58 -0700186 provider.activate(null);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200187 devices.clear();
188 available = false;
189 firstRequest = true;
190 DeviceId subject = DeviceId.deviceId(NETCONF_DEVICE_ID_STRING);
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700191 DeviceId subjectIpv6 = DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_IPV6);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200192 String key = "netconf";
193 ObjectMapper mapper = new ObjectMapper();
194 JsonNode jsonNode = mapper.readTree(jsonStream);
195 ConfigApplyDelegate delegate = new MockDelegate();
196 netconfDeviceConfig.init(subject, key, jsonNode, mapper, delegate);
197 JsonNode jsonNodesshKey = mapper.readTree(jsonStreamSshKey);
198 netconfDeviceConfigSshKey.init(subject, key, jsonNodesshKey, mapper, delegate);
199 JsonNode jsonNodeEmpty = mapper.createObjectNode();
200 netconfDeviceConfigEmptyIpv4.init(subject, key, jsonNodeEmpty, mapper, delegate);
201 netconfDeviceConfigEmptyIpv6.init(subjectIpv6, key, jsonNodeEmpty, mapper, delegate);
Yuta HIGUCHI795dff42017-06-23 13:36:44 -0700202 deviceAdded = new CountDownLatch(0);
Michele Santuari576f09c2016-09-28 14:20:00 +0200203 }
204
205 @Test
206 public void activate() throws Exception {
Michele Santuari576f09c2016-09-28 14:20:00 +0200207 assertTrue("Provider should be registered", deviceRegistry.getProviders().contains(provider.id()));
208 assertEquals("Incorrect device service", deviceService, provider.deviceService);
209 assertEquals("Incorrect provider service", providerService, provider.providerService);
Ray Milkey02710432018-02-13 17:08:28 -0800210 assertTrue("Incorrect config factories", cfgFactories.contains(provider.factory));
Michal Mach26a90fa2017-06-07 11:12:46 +0200211 assertNotNull("Device listener should be added", deviceService.listener);
Michele Santuari576f09c2016-09-28 14:20:00 +0200212 assertFalse("Thread to connect device should be running",
213 provider.executor.isShutdown() || provider.executor.isTerminated());
214 assertFalse("Scheduled task to update device should be running", provider.scheduledTask.isCancelled());
215 }
216
217 @Test
218 public void deactivate() throws Exception {
219 provider.deactivate();
Michal Mach26a90fa2017-06-07 11:12:46 +0200220 assertNull("Device listener should be removed", deviceService.listener);
Yuta HIGUCHIfbd9ae92018-01-24 23:39:06 -0800221 assertFalse("Provider should not be registered", deviceRegistry.getProviders().contains(provider.id()));
Michele Santuari576f09c2016-09-28 14:20:00 +0200222 assertTrue("Thread to connect device should be shutdown", provider.executor.isShutdown());
223 assertTrue("Scheduled task to update device should be shutdown", provider.scheduledTask.isCancelled());
224 assertNull("Provider service should be null", provider.providerService);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200225 assertTrue("Network config factories not removed", cfgFactories.isEmpty());
Michele Santuari576f09c2016-09-28 14:20:00 +0200226 assertEquals("Controller listener should be removed", 0, netconfDeviceListeners.size());
227 }
228
229 @Test
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200230 public void configuration() {
231 assertTrue("Configuration should be valid", netconfDeviceConfig.isValid());
232 assertThat(netconfDeviceConfig.ip(), is(IP));
233 assertThat(netconfDeviceConfig.port(), is(PORT));
234 assertThat(netconfDeviceConfig.username(), is(TEST));
235 assertThat(netconfDeviceConfig.password(), is(TEST));
236 assertThat(netconfDeviceConfigSshKey.sshKey(), is(TEST));
237 }
238
239 @Test
240 public void configurationDeviceIdIpv4() {
241 assertTrue("Configuration should be valid", netconfDeviceConfigEmptyIpv4.isValid());
242 assertThat(netconfDeviceConfigEmptyIpv4.ip(), is(IP));
243 assertThat(netconfDeviceConfigEmptyIpv4.port(), is(PORT));
244 assertThat(netconfDeviceConfigEmptyIpv4.username(), is(StringUtils.EMPTY));
245 assertThat(netconfDeviceConfigEmptyIpv4.password(), is(StringUtils.EMPTY));
246 assertThat(netconfDeviceConfigEmptyIpv4.sshKey(), is(StringUtils.EMPTY));
247 }
248
249 @Test
250 public void configurationDeviceIdIpv6() {
251 assertTrue("Configuration should be valid", netconfDeviceConfigEmptyIpv6.isValid());
Yuta HIGUCHIed5b14d2017-04-25 15:30:23 -0700252 assertThat(netconfDeviceConfigEmptyIpv6.ip(), is(IP_V6));
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200253 assertThat(netconfDeviceConfigEmptyIpv6.port(), is(PORT));
254 assertThat(netconfDeviceConfigEmptyIpv6.username(), is(StringUtils.EMPTY));
255 assertThat(netconfDeviceConfigEmptyIpv6.password(), is(StringUtils.EMPTY));
256 assertThat(netconfDeviceConfigEmptyIpv6.sshKey(), is(StringUtils.EMPTY));
257 }
258
259 @Test
Yuta HIGUCHI795dff42017-06-23 13:36:44 -0700260 public void addDeviceNew() throws InterruptedException {
261 // expecting 1 device add
262 deviceAdded = new CountDownLatch(1);
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200263 assertNotNull(providerService);
264 assertTrue("Event should be relevant", provider.cfgListener.isRelevant(deviceAddedEvent));
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200265 available = true;
Michele Santuari576f09c2016-09-28 14:20:00 +0200266 provider.cfgListener.event(deviceAddedEvent);
267
Yuta HIGUCHI795dff42017-06-23 13:36:44 -0700268 deviceAdded.await();
269 assertEquals("Device should be added", 1, deviceStore.getDeviceCount());
270 assertTrue("Device incorrectly added" + NETCONF_DEVICE_ID_STRING,
271 devices.containsKey(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING)));
Michele Santuari576f09c2016-09-28 14:20:00 +0200272 devices.clear();
273 }
274
Michal Mach26a90fa2017-06-07 11:12:46 +0200275 @Test
276 public void testDiscoverPortsAfterDeviceAdded() {
277 provider.executor = MoreExecutors.newDirectExecutorService();
278 prepareMocks(PORT_COUNT);
279
280 deviceService.listener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, netconfDevice));
281 assertEquals("Ports should be added", PORT_COUNT, providerService.ports.get(netconfDevice.id()).size());
282
283 deviceService.listener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_REMOVED, netconfDevice));
284 assertEquals("Ports should be removed", 0, providerService.ports.get(netconfDevice.id()).size());
285 }
286
287 private void prepareMocks(int count) {
Yuta HIGUCHId66fe0c2017-06-12 14:14:27 -0700288 for (int i = 1; i <= count; i++) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200289 deviceDescription.portDescriptions.add(new DefaultPortDescription(PortNumber.portNumber(i), true));
290 }
291 }
292
293 //TODO: check updates of the device description
Michele Santuari576f09c2016-09-28 14:20:00 +0200294
295
296 //Mock classes
297 private class MockNetconfController extends NetconfControllerAdapter {
298
299 @Override
300 public void addDeviceListener(NetconfDeviceListener listener) {
301 if (!netconfDeviceListeners.contains(listener)) {
302 netconfDeviceListeners.add(listener);
303 }
304 }
305
306 @Override
307 public void removeDeviceListener(NetconfDeviceListener listener) {
308 netconfDeviceListeners.remove(listener);
309 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200310
311 @Override
312 public void disconnectDevice(DeviceId deviceId, boolean remove) {
Yuta HIGUCHId66fe0c2017-06-12 14:14:27 -0700313 netconfDeviceListeners.forEach(l -> l.deviceRemoved(deviceId));
Michal Mach26a90fa2017-06-07 11:12:46 +0200314 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200315 }
316
317 private class MockDeviceProviderRegistry extends DeviceProviderRegistryAdapter {
318
Michal Mach26a90fa2017-06-07 11:12:46 +0200319 final Set<ProviderId> providers = new HashSet<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200320
321 @Override
322 public DeviceProviderService register(DeviceProvider provider) {
323 providers.add(provider.id());
324 return providerService;
325 }
326
327 @Override
328 public void unregister(DeviceProvider provider) {
329 providers.remove(provider.id());
330 }
331
332 @Override
333 public Set<ProviderId> getProviders() {
334 return providers;
335 }
336
337 }
338
339 private class MockDeviceService extends DeviceServiceAdapter {
Michal Mach26a90fa2017-06-07 11:12:46 +0200340 DeviceListener listener = null;
341
342 @Override
343 public Device getDevice(DeviceId deviceId) {
344 if (deviceId.toString().equals(NETCONF_DEVICE_ID_STRING)) {
345 return null;
346 } else if (deviceId.uri().getScheme().equals(SCHEME_NAME)) {
347 return netconfDevice;
348 } else {
349 return notNetconfDevice;
350 }
351
352 }
353
Michele Santuari576f09c2016-09-28 14:20:00 +0200354 @Override
355 public void addListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200356 this.listener = listener;
Michele Santuari576f09c2016-09-28 14:20:00 +0200357 }
358
359 @Override
360 public void removeListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200361 this.listener = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200362 }
363 }
364
365 private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
366
Michal Mach26a90fa2017-06-07 11:12:46 +0200367 final Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
368
Michele Santuari576f09c2016-09-28 14:20:00 +0200369 @Override
370 public void deviceConnected(DeviceId deviceId, DeviceDescription desc) {
371 assertNotNull("DeviceId should be not null", deviceId);
372 assertNotNull("DeviceDescription should be not null", desc);
373 deviceStore.createOrUpdateDevice(ProviderId.NONE, deviceId, desc);
374 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200375
376 @Override
377 public void updatePorts(DeviceId deviceId,
378 List<PortDescription> portDescriptions) {
379 for (PortDescription p : portDescriptions) {
380 ports.put(deviceId, p);
381 }
382 }
383
384 @Override
385 public void deviceDisconnected(DeviceId deviceId) {
386 ports.removeAll(deviceId);
387 }
388
Michele Santuari576f09c2016-09-28 14:20:00 +0200389 }
390
391 private class MockDeviceStore extends DeviceStoreAdapter {
392
393 @Override
394 public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
395 DeviceDescription desc) {
396
397 devices.put(deviceId, new DefaultDevice(providerId, deviceId, desc.type(),
398 desc.manufacturer(), desc.hwVersion(),
399 desc.swVersion(), desc.serialNumber(),
400 desc.chassisId(), desc.annotations()));
Yuta HIGUCHI795dff42017-06-23 13:36:44 -0700401 deviceAdded.countDown();
Michele Santuari576f09c2016-09-28 14:20:00 +0200402 return null;
403 }
404
405 @Override
406 public Device getDevice(DeviceId deviceId) {
407 return devices.get(deviceId);
408 }
409
410 @Override
411 public int getDeviceCount() {
412 return devices.size();
413 }
414
415 }
416
417 private class MockMastershipService extends MastershipServiceAdapter {
418
419 @Override
420 public boolean isLocalMaster(DeviceId deviceId) {
421 return true;
422 }
423 }
424
425 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200426 NetconfDeviceConfig cfg = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200427
428 @Override
429 public void registerConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200430 cfgFactories.add(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200431 }
432
433 @Override
434 public void unregisterConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200435 cfgFactories.remove(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200436 }
437
438 @Override
439 public void addListener(NetworkConfigListener listener) {
440 netCfgListeners.add(listener);
441 }
442
443 @Override
444 public void removeListener(NetworkConfigListener listener) {
445 netCfgListeners.remove(listener);
446 }
447
448
449 @Override
450 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200451 if (available) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200452 DeviceId did = (DeviceId) subject;
453 if (configClass.equals(NetconfDeviceConfig.class)
454 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING))) {
455 return (C) netconfDeviceConfig;
456 } else if (configClass.equals(NetconfDeviceConfig.class)
457 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD))) {
458 if (firstRequest) {
459 firstRequest = false;
460 return null;
461 }
462 return (C) cfg;
463 } else {
464 return (C) new BasicDeviceConfig();
465 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200466 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200467 return null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200468 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200469
470 @Override
471 public <S, C extends Config<S>> C applyConfig(S subject, Class<C> configClass,
472 JsonNode json) {
473 cfg = new NetconfDeviceConfig();
474 ObjectMapper mapper = new ObjectMapper();
475 cfg.init((DeviceId) subject, "netconf", mapper.createObjectNode(), mapper, null);
476 cfg.setIp(json.get("ip").asText())
477 .setPort(json.get("port").asInt())
478 .setUsername(json.get("username").asText())
479 .setPassword(json.get("password").asText())
480 .setSshKey(json.get("sshkey").asText());
481 provider.cfgListener.event(deviceAddedEventTranslated);
482 return (C) cfg;
483 }
484
485 @Override
486 public <S, C extends Config<S>> Set<S> getSubjects(Class<S> subjectClass, Class<C> configClass) {
Yuta HIGUCHIb6e0e912017-05-18 20:13:52 -0700487 Set<S> subjects = new HashSet<>();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200488 if (available) {
489 if (cfg != null) {
490 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD));
491 } else {
492 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING));
493 }
494 }
495 return subjects;
496 }
497
Michele Santuari576f09c2016-09-28 14:20:00 +0200498 }
499
Michele Santuari576f09c2016-09-28 14:20:00 +0200500 private class MockDevice extends DefaultDevice {
501
Michal Mach26a90fa2017-06-07 11:12:46 +0200502 MockDevice(DeviceId id) {
503 super(null, id, null, null, null, null, null,
504 null, DefaultAnnotations.EMPTY);
Michele Santuari576f09c2016-09-28 14:20:00 +0200505 }
506
507 @Override
508 protected Driver locateDriver() {
509 return driver;
510 }
511
512 @Override
513 public Driver driver() {
514 return driver;
515 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200516
517 @Override
518 public <B extends Behaviour> B as(Class<B> projectionClass) {
519 return (B) deviceDescription;
520 }
521
522 @Override
523 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
524 return projectionClass.isAssignableFrom(DeviceDescriptionDiscovery.class);
525 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200526 }
527
528 private class MockDriver extends DriverAdapter {
529 @Override
530 public <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass) {
531
532 return (T) descriptionDiscovery;
533 }
534 }
535
536 private class TestDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
537
Michal Mach26a90fa2017-06-07 11:12:46 +0200538 final List<PortDescription> portDescriptions = new ArrayList<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200539
540 @Override
541 public DeviceDescription discoverDeviceDetails() {
542 return null;
543 }
544
545 @Override
546 public List<PortDescription> discoverPortDetails() {
547 return portDescriptions;
548 }
549
Michele Santuari576f09c2016-09-28 14:20:00 +0200550 private void addPortDesc(PortDescription portDescription) {
551 portDescriptions.add(portDescription);
552 }
553 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200554
555 private class MockDelegate implements ConfigApplyDelegate {
556 @Override
557 public void onApply(Config configFile) {
558 }
559 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200560
Michele Santuari576f09c2016-09-28 14:20:00 +0200561}