blob: 39498f3860a04f6879cc26409d1c7c38ffe06c8d [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 Campanella42e7b862018-09-21 11:56:48 +0200266 assertFalse("Device should not be reachable" + NETCONF_DEVICE_ID_STRING,
267 provider.isReachable(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING)));
Michele Santuari576f09c2016-09-28 14:20:00 +0200268 devices.clear();
269 }
270
Michal Mach26a90fa2017-06-07 11:12:46 +0200271 @Test
272 public void testDiscoverPortsAfterDeviceAdded() {
273 provider.executor = MoreExecutors.newDirectExecutorService();
274 prepareMocks(PORT_COUNT);
275
276 deviceService.listener.event(new DeviceEvent(DeviceEvent.Type.DEVICE_ADDED, netconfDevice));
277 assertEquals("Ports should be added", PORT_COUNT, providerService.ports.get(netconfDevice.id()).size());
278
Thomas Vachuska5b38dc02018-05-10 15:24:40 -0700279 provider.triggerDisconnect(netconfDevice.id());
Michal Mach26a90fa2017-06-07 11:12:46 +0200280 assertEquals("Ports should be removed", 0, providerService.ports.get(netconfDevice.id()).size());
281 }
282
283 private void prepareMocks(int count) {
Yuta HIGUCHId66fe0c2017-06-12 14:14:27 -0700284 for (int i = 1; i <= count; i++) {
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800285 deviceDescription.portDescriptions.add(DefaultPortDescription.builder()
286 .withPortNumber(PortNumber.portNumber(i)).isEnabled(true).build());
Michal Mach26a90fa2017-06-07 11:12:46 +0200287 }
288 }
289
290 //TODO: check updates of the device description
Michele Santuari576f09c2016-09-28 14:20:00 +0200291
292
293 //Mock classes
294 private class MockNetconfController extends NetconfControllerAdapter {
295
296 @Override
297 public void addDeviceListener(NetconfDeviceListener listener) {
298 if (!netconfDeviceListeners.contains(listener)) {
299 netconfDeviceListeners.add(listener);
300 }
301 }
302
303 @Override
304 public void removeDeviceListener(NetconfDeviceListener listener) {
305 netconfDeviceListeners.remove(listener);
306 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200307
308 @Override
309 public void disconnectDevice(DeviceId deviceId, boolean remove) {
Yuta HIGUCHId66fe0c2017-06-12 14:14:27 -0700310 netconfDeviceListeners.forEach(l -> l.deviceRemoved(deviceId));
Michal Mach26a90fa2017-06-07 11:12:46 +0200311 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200312 }
313
314 private class MockDeviceProviderRegistry extends DeviceProviderRegistryAdapter {
315
Michal Mach26a90fa2017-06-07 11:12:46 +0200316 final Set<ProviderId> providers = new HashSet<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200317
318 @Override
319 public DeviceProviderService register(DeviceProvider provider) {
320 providers.add(provider.id());
321 return providerService;
322 }
323
324 @Override
325 public void unregister(DeviceProvider provider) {
326 providers.remove(provider.id());
327 }
328
329 @Override
330 public Set<ProviderId> getProviders() {
331 return providers;
332 }
333
334 }
335
336 private class MockDeviceService extends DeviceServiceAdapter {
Michal Mach26a90fa2017-06-07 11:12:46 +0200337 DeviceListener listener = null;
338
339 @Override
Andrea Campanella42e7b862018-09-21 11:56:48 +0200340 public boolean isAvailable(DeviceId deviceId) {
341 return true;
342 }
343
344 @Override
Michal Mach26a90fa2017-06-07 11:12:46 +0200345 public Device getDevice(DeviceId deviceId) {
346 if (deviceId.toString().equals(NETCONF_DEVICE_ID_STRING)) {
347 return null;
348 } else if (deviceId.uri().getScheme().equals(SCHEME_NAME)) {
349 return netconfDevice;
350 } else {
351 return notNetconfDevice;
352 }
353
354 }
355
Michele Santuari576f09c2016-09-28 14:20:00 +0200356 @Override
357 public void addListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200358 this.listener = listener;
Michele Santuari576f09c2016-09-28 14:20:00 +0200359 }
360
361 @Override
362 public void removeListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200363 this.listener = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200364 }
365 }
366
367 private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
368
Michal Mach26a90fa2017-06-07 11:12:46 +0200369 final Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
370
Michele Santuari576f09c2016-09-28 14:20:00 +0200371 @Override
372 public void deviceConnected(DeviceId deviceId, DeviceDescription desc) {
373 assertNotNull("DeviceId should be not null", deviceId);
374 assertNotNull("DeviceDescription should be not null", desc);
375 deviceStore.createOrUpdateDevice(ProviderId.NONE, deviceId, desc);
376 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200377
378 @Override
379 public void updatePorts(DeviceId deviceId,
380 List<PortDescription> portDescriptions) {
381 for (PortDescription p : portDescriptions) {
382 ports.put(deviceId, p);
383 }
384 }
385
386 @Override
387 public void deviceDisconnected(DeviceId deviceId) {
388 ports.removeAll(deviceId);
389 }
390
Michele Santuari576f09c2016-09-28 14:20:00 +0200391 }
392
393 private class MockDeviceStore extends DeviceStoreAdapter {
394
395 @Override
396 public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
397 DeviceDescription desc) {
398
399 devices.put(deviceId, new DefaultDevice(providerId, deviceId, desc.type(),
400 desc.manufacturer(), desc.hwVersion(),
401 desc.swVersion(), desc.serialNumber(),
402 desc.chassisId(), desc.annotations()));
Yuta HIGUCHI795dff42017-06-23 13:36:44 -0700403 deviceAdded.countDown();
Michele Santuari576f09c2016-09-28 14:20:00 +0200404 return null;
405 }
406
407 @Override
408 public Device getDevice(DeviceId deviceId) {
409 return devices.get(deviceId);
410 }
411
412 @Override
413 public int getDeviceCount() {
414 return devices.size();
415 }
416
417 }
418
419 private class MockMastershipService extends MastershipServiceAdapter {
420
421 @Override
422 public boolean isLocalMaster(DeviceId deviceId) {
423 return true;
424 }
425 }
426
427 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200428 NetconfDeviceConfig cfg = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200429
430 @Override
431 public void registerConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200432 cfgFactories.add(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200433 }
434
435 @Override
436 public void unregisterConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200437 cfgFactories.remove(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200438 }
439
440 @Override
441 public void addListener(NetworkConfigListener listener) {
442 netCfgListeners.add(listener);
443 }
444
445 @Override
446 public void removeListener(NetworkConfigListener listener) {
447 netCfgListeners.remove(listener);
448 }
449
450
451 @Override
452 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200453 if (available) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200454 DeviceId did = (DeviceId) subject;
455 if (configClass.equals(NetconfDeviceConfig.class)
456 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING))) {
457 return (C) netconfDeviceConfig;
458 } else if (configClass.equals(NetconfDeviceConfig.class)
459 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD))) {
460 if (firstRequest) {
461 firstRequest = false;
462 return null;
463 }
464 return (C) cfg;
465 } else {
466 return (C) new BasicDeviceConfig();
467 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200468 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200469 return null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200470 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200471
472 @Override
473 public <S, C extends Config<S>> C applyConfig(S subject, Class<C> configClass,
474 JsonNode json) {
475 cfg = new NetconfDeviceConfig();
476 ObjectMapper mapper = new ObjectMapper();
477 cfg.init((DeviceId) subject, "netconf", mapper.createObjectNode(), mapper, null);
478 cfg.setIp(json.get("ip").asText())
479 .setPort(json.get("port").asInt())
480 .setUsername(json.get("username").asText())
481 .setPassword(json.get("password").asText())
482 .setSshKey(json.get("sshkey").asText());
483 provider.cfgListener.event(deviceAddedEventTranslated);
484 return (C) cfg;
485 }
486
487 @Override
488 public <S, C extends Config<S>> Set<S> getSubjects(Class<S> subjectClass, Class<C> configClass) {
Yuta HIGUCHIb6e0e912017-05-18 20:13:52 -0700489 Set<S> subjects = new HashSet<>();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200490 if (available) {
491 if (cfg != null) {
492 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD));
493 } else {
494 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING));
495 }
496 }
497 return subjects;
498 }
499
Michele Santuari576f09c2016-09-28 14:20:00 +0200500 }
501
Michele Santuari576f09c2016-09-28 14:20:00 +0200502 private class MockDevice extends DefaultDevice {
503
Michal Mach26a90fa2017-06-07 11:12:46 +0200504 MockDevice(DeviceId id) {
505 super(null, id, null, null, null, null, null,
506 null, DefaultAnnotations.EMPTY);
Michele Santuari576f09c2016-09-28 14:20:00 +0200507 }
508
509 @Override
510 protected Driver locateDriver() {
511 return driver;
512 }
513
514 @Override
515 public Driver driver() {
516 return driver;
517 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200518
519 @Override
520 public <B extends Behaviour> B as(Class<B> projectionClass) {
521 return (B) deviceDescription;
522 }
523
524 @Override
525 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
526 return projectionClass.isAssignableFrom(DeviceDescriptionDiscovery.class);
527 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200528 }
529
530 private class MockDriver extends DriverAdapter {
531 @Override
532 public <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass) {
533
534 return (T) descriptionDiscovery;
535 }
536 }
537
538 private class TestDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
539
Michal Mach26a90fa2017-06-07 11:12:46 +0200540 final List<PortDescription> portDescriptions = new ArrayList<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200541
542 @Override
543 public DeviceDescription discoverDeviceDetails() {
544 return null;
545 }
546
547 @Override
548 public List<PortDescription> discoverPortDetails() {
549 return portDescriptions;
550 }
551
Michele Santuari576f09c2016-09-28 14:20:00 +0200552 private void addPortDesc(PortDescription portDescription) {
553 portDescriptions.add(portDescription);
554 }
555 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200556
557 private class MockDelegate implements ConfigApplyDelegate {
558 @Override
559 public void onApply(Config configFile) {
560 }
561 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200562
Michele Santuari576f09c2016-09-28 14:20:00 +0200563}