blob: 90763ec9d3f416f02ec4ce7f183d9dbb17494ac5 [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;
Andrea Campanella82e21892018-09-10 14:08:16 +0200266
267 assertFalse("Device should not be reachable" + NETCONF_DEVICE_ID_STRING,
268 provider.isReachable(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING)));
Michele Santuari576f09c2016-09-28 14:20:00 +0200269 provider.cfgListener.event(deviceAddedEvent);
270
Michele Santuari576f09c2016-09-28 14:20:00 +0200271 devices.clear();
272 }
273
Michal Mach26a90fa2017-06-07 11:12:46 +0200274 @Test
275 public void testDiscoverPortsAfterDeviceAdded() {
276 provider.executor = MoreExecutors.newDirectExecutorService();
277 prepareMocks(PORT_COUNT);
278
279 deviceService.listener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, netconfDevice));
280 assertEquals("Ports should be added", PORT_COUNT, providerService.ports.get(netconfDevice.id()).size());
281
Thomas Vachuska5b38dc02018-05-10 15:24:40 -0700282 provider.triggerDisconnect(netconfDevice.id());
Michal Mach26a90fa2017-06-07 11:12:46 +0200283 assertEquals("Ports should be removed", 0, providerService.ports.get(netconfDevice.id()).size());
284 }
285
286 private void prepareMocks(int count) {
Yuta HIGUCHId66fe0c2017-06-12 14:14:27 -0700287 for (int i = 1; i <= count; i++) {
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800288 deviceDescription.portDescriptions.add(DefaultPortDescription.builder()
289 .withPortNumber(PortNumber.portNumber(i)).isEnabled(true).build());
Michal Mach26a90fa2017-06-07 11:12:46 +0200290 }
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
Andrea Campanella82e21892018-09-10 14:08:16 +0200343 public boolean isAvailable(DeviceId deviceId) {
344 return true;
345 }
346
347 @Override
Michal Mach26a90fa2017-06-07 11:12:46 +0200348 public Device getDevice(DeviceId deviceId) {
349 if (deviceId.toString().equals(NETCONF_DEVICE_ID_STRING)) {
350 return null;
351 } else if (deviceId.uri().getScheme().equals(SCHEME_NAME)) {
352 return netconfDevice;
353 } else {
354 return notNetconfDevice;
355 }
356
357 }
358
Michele Santuari576f09c2016-09-28 14:20:00 +0200359 @Override
360 public void addListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200361 this.listener = listener;
Michele Santuari576f09c2016-09-28 14:20:00 +0200362 }
363
364 @Override
365 public void removeListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200366 this.listener = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200367 }
368 }
369
370 private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
371
Michal Mach26a90fa2017-06-07 11:12:46 +0200372 final Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
373
Michele Santuari576f09c2016-09-28 14:20:00 +0200374 @Override
375 public void deviceConnected(DeviceId deviceId, DeviceDescription desc) {
376 assertNotNull("DeviceId should be not null", deviceId);
377 assertNotNull("DeviceDescription should be not null", desc);
378 deviceStore.createOrUpdateDevice(ProviderId.NONE, deviceId, desc);
379 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200380
381 @Override
382 public void updatePorts(DeviceId deviceId,
383 List<PortDescription> portDescriptions) {
384 for (PortDescription p : portDescriptions) {
385 ports.put(deviceId, p);
386 }
387 }
388
389 @Override
390 public void deviceDisconnected(DeviceId deviceId) {
391 ports.removeAll(deviceId);
392 }
393
Michele Santuari576f09c2016-09-28 14:20:00 +0200394 }
395
396 private class MockDeviceStore extends DeviceStoreAdapter {
397
398 @Override
399 public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
400 DeviceDescription desc) {
401
402 devices.put(deviceId, new DefaultDevice(providerId, deviceId, desc.type(),
403 desc.manufacturer(), desc.hwVersion(),
404 desc.swVersion(), desc.serialNumber(),
405 desc.chassisId(), desc.annotations()));
Yuta HIGUCHI795dff42017-06-23 13:36:44 -0700406 deviceAdded.countDown();
Michele Santuari576f09c2016-09-28 14:20:00 +0200407 return null;
408 }
409
410 @Override
411 public Device getDevice(DeviceId deviceId) {
412 return devices.get(deviceId);
413 }
414
415 @Override
416 public int getDeviceCount() {
417 return devices.size();
418 }
419
420 }
421
422 private class MockMastershipService extends MastershipServiceAdapter {
423
424 @Override
425 public boolean isLocalMaster(DeviceId deviceId) {
426 return true;
427 }
428 }
429
430 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200431 NetconfDeviceConfig cfg = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200432
433 @Override
434 public void registerConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200435 cfgFactories.add(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200436 }
437
438 @Override
439 public void unregisterConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200440 cfgFactories.remove(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200441 }
442
443 @Override
444 public void addListener(NetworkConfigListener listener) {
445 netCfgListeners.add(listener);
446 }
447
448 @Override
449 public void removeListener(NetworkConfigListener listener) {
450 netCfgListeners.remove(listener);
451 }
452
453
454 @Override
455 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200456 if (available) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200457 DeviceId did = (DeviceId) subject;
458 if (configClass.equals(NetconfDeviceConfig.class)
459 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING))) {
460 return (C) netconfDeviceConfig;
461 } else if (configClass.equals(NetconfDeviceConfig.class)
462 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD))) {
463 if (firstRequest) {
464 firstRequest = false;
465 return null;
466 }
467 return (C) cfg;
468 } else {
469 return (C) new BasicDeviceConfig();
470 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200471 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200472 return null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200473 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200474
475 @Override
476 public <S, C extends Config<S>> C applyConfig(S subject, Class<C> configClass,
477 JsonNode json) {
478 cfg = new NetconfDeviceConfig();
479 ObjectMapper mapper = new ObjectMapper();
480 cfg.init((DeviceId) subject, "netconf", mapper.createObjectNode(), mapper, null);
481 cfg.setIp(json.get("ip").asText())
482 .setPort(json.get("port").asInt())
483 .setUsername(json.get("username").asText())
484 .setPassword(json.get("password").asText())
485 .setSshKey(json.get("sshkey").asText());
486 provider.cfgListener.event(deviceAddedEventTranslated);
487 return (C) cfg;
488 }
489
490 @Override
491 public <S, C extends Config<S>> Set<S> getSubjects(Class<S> subjectClass, Class<C> configClass) {
Yuta HIGUCHIb6e0e912017-05-18 20:13:52 -0700492 Set<S> subjects = new HashSet<>();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200493 if (available) {
494 if (cfg != null) {
495 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD));
496 } else {
497 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING));
498 }
499 }
500 return subjects;
501 }
502
Michele Santuari576f09c2016-09-28 14:20:00 +0200503 }
504
Michele Santuari576f09c2016-09-28 14:20:00 +0200505 private class MockDevice extends DefaultDevice {
506
Michal Mach26a90fa2017-06-07 11:12:46 +0200507 MockDevice(DeviceId id) {
508 super(null, id, null, null, null, null, null,
509 null, DefaultAnnotations.EMPTY);
Michele Santuari576f09c2016-09-28 14:20:00 +0200510 }
511
512 @Override
513 protected Driver locateDriver() {
514 return driver;
515 }
516
517 @Override
518 public Driver driver() {
519 return driver;
520 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200521
522 @Override
523 public <B extends Behaviour> B as(Class<B> projectionClass) {
524 return (B) deviceDescription;
525 }
526
527 @Override
528 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
529 return projectionClass.isAssignableFrom(DeviceDescriptionDiscovery.class);
530 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200531 }
532
533 private class MockDriver extends DriverAdapter {
534 @Override
535 public <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass) {
536
537 return (T) descriptionDiscovery;
538 }
539 }
540
541 private class TestDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
542
Michal Mach26a90fa2017-06-07 11:12:46 +0200543 final List<PortDescription> portDescriptions = new ArrayList<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200544
545 @Override
546 public DeviceDescription discoverDeviceDetails() {
547 return null;
548 }
549
550 @Override
551 public List<PortDescription> discoverPortDetails() {
552 return portDescriptions;
553 }
554
Michele Santuari576f09c2016-09-28 14:20:00 +0200555 private void addPortDesc(PortDescription portDescription) {
556 portDescriptions.add(portDescription);
557 }
558 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200559
560 private class MockDelegate implements ConfigApplyDelegate {
561 @Override
562 public void onApply(Config configFile) {
563 }
564 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200565
Michele Santuari576f09c2016-09-28 14:20:00 +0200566}