blob: 53e78381408b87d9e9ec2c9b12dd53483721b0cb [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
Thomas Vachuska5b38dc02018-05-10 15:24:40 -0700283 provider.triggerDisconnect(netconfDevice.id());
Michal Mach26a90fa2017-06-07 11:12:46 +0200284 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++) {
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800289 deviceDescription.portDescriptions.add(DefaultPortDescription.builder()
290 .withPortNumber(PortNumber.portNumber(i)).isEnabled(true).build());
Michal Mach26a90fa2017-06-07 11:12:46 +0200291 }
292 }
293
294 //TODO: check updates of the device description
Michele Santuari576f09c2016-09-28 14:20:00 +0200295
296
297 //Mock classes
298 private class MockNetconfController extends NetconfControllerAdapter {
299
300 @Override
301 public void addDeviceListener(NetconfDeviceListener listener) {
302 if (!netconfDeviceListeners.contains(listener)) {
303 netconfDeviceListeners.add(listener);
304 }
305 }
306
307 @Override
308 public void removeDeviceListener(NetconfDeviceListener listener) {
309 netconfDeviceListeners.remove(listener);
310 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200311
312 @Override
313 public void disconnectDevice(DeviceId deviceId, boolean remove) {
Yuta HIGUCHId66fe0c2017-06-12 14:14:27 -0700314 netconfDeviceListeners.forEach(l -> l.deviceRemoved(deviceId));
Michal Mach26a90fa2017-06-07 11:12:46 +0200315 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200316 }
317
318 private class MockDeviceProviderRegistry extends DeviceProviderRegistryAdapter {
319
Michal Mach26a90fa2017-06-07 11:12:46 +0200320 final Set<ProviderId> providers = new HashSet<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200321
322 @Override
323 public DeviceProviderService register(DeviceProvider provider) {
324 providers.add(provider.id());
325 return providerService;
326 }
327
328 @Override
329 public void unregister(DeviceProvider provider) {
330 providers.remove(provider.id());
331 }
332
333 @Override
334 public Set<ProviderId> getProviders() {
335 return providers;
336 }
337
338 }
339
340 private class MockDeviceService extends DeviceServiceAdapter {
Michal Mach26a90fa2017-06-07 11:12:46 +0200341 DeviceListener listener = null;
342
343 @Override
344 public Device getDevice(DeviceId deviceId) {
345 if (deviceId.toString().equals(NETCONF_DEVICE_ID_STRING)) {
346 return null;
347 } else if (deviceId.uri().getScheme().equals(SCHEME_NAME)) {
348 return netconfDevice;
349 } else {
350 return notNetconfDevice;
351 }
352
353 }
354
Michele Santuari576f09c2016-09-28 14:20:00 +0200355 @Override
356 public void addListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200357 this.listener = listener;
Michele Santuari576f09c2016-09-28 14:20:00 +0200358 }
359
360 @Override
361 public void removeListener(DeviceListener listener) {
Michal Mach26a90fa2017-06-07 11:12:46 +0200362 this.listener = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200363 }
364 }
365
366 private class MockDeviceProviderService extends DeviceProviderServiceAdapter {
367
Michal Mach26a90fa2017-06-07 11:12:46 +0200368 final Multimap<DeviceId, PortDescription> ports = HashMultimap.create();
369
Michele Santuari576f09c2016-09-28 14:20:00 +0200370 @Override
371 public void deviceConnected(DeviceId deviceId, DeviceDescription desc) {
372 assertNotNull("DeviceId should be not null", deviceId);
373 assertNotNull("DeviceDescription should be not null", desc);
374 deviceStore.createOrUpdateDevice(ProviderId.NONE, deviceId, desc);
375 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200376
377 @Override
378 public void updatePorts(DeviceId deviceId,
379 List<PortDescription> portDescriptions) {
380 for (PortDescription p : portDescriptions) {
381 ports.put(deviceId, p);
382 }
383 }
384
385 @Override
386 public void deviceDisconnected(DeviceId deviceId) {
387 ports.removeAll(deviceId);
388 }
389
Michele Santuari576f09c2016-09-28 14:20:00 +0200390 }
391
392 private class MockDeviceStore extends DeviceStoreAdapter {
393
394 @Override
395 public DeviceEvent createOrUpdateDevice(ProviderId providerId, DeviceId deviceId,
396 DeviceDescription desc) {
397
398 devices.put(deviceId, new DefaultDevice(providerId, deviceId, desc.type(),
399 desc.manufacturer(), desc.hwVersion(),
400 desc.swVersion(), desc.serialNumber(),
401 desc.chassisId(), desc.annotations()));
Yuta HIGUCHI795dff42017-06-23 13:36:44 -0700402 deviceAdded.countDown();
Michele Santuari576f09c2016-09-28 14:20:00 +0200403 return null;
404 }
405
406 @Override
407 public Device getDevice(DeviceId deviceId) {
408 return devices.get(deviceId);
409 }
410
411 @Override
412 public int getDeviceCount() {
413 return devices.size();
414 }
415
416 }
417
418 private class MockMastershipService extends MastershipServiceAdapter {
419
420 @Override
421 public boolean isLocalMaster(DeviceId deviceId) {
422 return true;
423 }
424 }
425
426 private class MockNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200427 NetconfDeviceConfig cfg = null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200428
429 @Override
430 public void registerConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200431 cfgFactories.add(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200432 }
433
434 @Override
435 public void unregisterConfigFactory(ConfigFactory configFactory) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200436 cfgFactories.remove(configFactory);
Michele Santuari576f09c2016-09-28 14:20:00 +0200437 }
438
439 @Override
440 public void addListener(NetworkConfigListener listener) {
441 netCfgListeners.add(listener);
442 }
443
444 @Override
445 public void removeListener(NetworkConfigListener listener) {
446 netCfgListeners.remove(listener);
447 }
448
449
450 @Override
451 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200452 if (available) {
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200453 DeviceId did = (DeviceId) subject;
454 if (configClass.equals(NetconfDeviceConfig.class)
455 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING))) {
456 return (C) netconfDeviceConfig;
457 } else if (configClass.equals(NetconfDeviceConfig.class)
458 && did.equals(DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD))) {
459 if (firstRequest) {
460 firstRequest = false;
461 return null;
462 }
463 return (C) cfg;
464 } else {
465 return (C) new BasicDeviceConfig();
466 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200467 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200468 return null;
Michele Santuari576f09c2016-09-28 14:20:00 +0200469 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200470
471 @Override
472 public <S, C extends Config<S>> C applyConfig(S subject, Class<C> configClass,
473 JsonNode json) {
474 cfg = new NetconfDeviceConfig();
475 ObjectMapper mapper = new ObjectMapper();
476 cfg.init((DeviceId) subject, "netconf", mapper.createObjectNode(), mapper, null);
477 cfg.setIp(json.get("ip").asText())
478 .setPort(json.get("port").asInt())
479 .setUsername(json.get("username").asText())
480 .setPassword(json.get("password").asText())
481 .setSshKey(json.get("sshkey").asText());
482 provider.cfgListener.event(deviceAddedEventTranslated);
483 return (C) cfg;
484 }
485
486 @Override
487 public <S, C extends Config<S>> Set<S> getSubjects(Class<S> subjectClass, Class<C> configClass) {
Yuta HIGUCHIb6e0e912017-05-18 20:13:52 -0700488 Set<S> subjects = new HashSet<>();
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200489 if (available) {
490 if (cfg != null) {
491 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING_OLD));
492 } else {
493 subjects.add((S) DeviceId.deviceId(NETCONF_DEVICE_ID_STRING));
494 }
495 }
496 return subjects;
497 }
498
Michele Santuari576f09c2016-09-28 14:20:00 +0200499 }
500
Michele Santuari576f09c2016-09-28 14:20:00 +0200501 private class MockDevice extends DefaultDevice {
502
Michal Mach26a90fa2017-06-07 11:12:46 +0200503 MockDevice(DeviceId id) {
504 super(null, id, null, null, null, null, null,
505 null, DefaultAnnotations.EMPTY);
Michele Santuari576f09c2016-09-28 14:20:00 +0200506 }
507
508 @Override
509 protected Driver locateDriver() {
510 return driver;
511 }
512
513 @Override
514 public Driver driver() {
515 return driver;
516 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200517
518 @Override
519 public <B extends Behaviour> B as(Class<B> projectionClass) {
520 return (B) deviceDescription;
521 }
522
523 @Override
524 public <B extends Behaviour> boolean is(Class<B> projectionClass) {
525 return projectionClass.isAssignableFrom(DeviceDescriptionDiscovery.class);
526 }
Michele Santuari576f09c2016-09-28 14:20:00 +0200527 }
528
529 private class MockDriver extends DriverAdapter {
530 @Override
531 public <T extends Behaviour> T createBehaviour(DriverHandler handler, Class<T> behaviourClass) {
532
533 return (T) descriptionDiscovery;
534 }
535 }
536
537 private class TestDescription extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
538
Michal Mach26a90fa2017-06-07 11:12:46 +0200539 final List<PortDescription> portDescriptions = new ArrayList<>();
Michele Santuari576f09c2016-09-28 14:20:00 +0200540
541 @Override
542 public DeviceDescription discoverDeviceDetails() {
543 return null;
544 }
545
546 @Override
547 public List<PortDescription> discoverPortDetails() {
548 return portDescriptions;
549 }
550
Michele Santuari576f09c2016-09-28 14:20:00 +0200551 private void addPortDesc(PortDescription portDescription) {
552 portDescriptions.add(portDescription);
553 }
554 }
Andrea Campanella34cf65c2017-04-12 13:51:32 +0200555
556 private class MockDelegate implements ConfigApplyDelegate {
557 @Override
558 public void onApply(Config configFile) {
559 }
560 }
Michal Mach26a90fa2017-06-07 11:12:46 +0200561
Michele Santuari576f09c2016-09-28 14:20:00 +0200562}