blob: ec5f247705849cd07bb5cf7b555b519de1f6773e [file] [log] [blame]
Andrea Campanella945ded22016-01-07 13:17:43 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Andrea Campanella945ded22016-01-07 13:17:43 -08003 *
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.rest.device.impl;
18
Konstantinos Kanonakis3cd85552016-11-17 10:11:13 -060019import com.google.common.base.Objects;
Andrea Campanella59b549d2017-04-14 21:58:16 +020020import com.google.common.collect.ImmutableList;
Andrea Campanella945ded22016-01-07 13:17:43 -080021import org.apache.felix.scr.annotations.Activate;
22import org.apache.felix.scr.annotations.Component;
23import org.apache.felix.scr.annotations.Deactivate;
24import org.apache.felix.scr.annotations.Reference;
25import org.apache.felix.scr.annotations.ReferenceCardinality;
26import org.onlab.packet.ChassisId;
27import org.onosproject.core.ApplicationId;
28import org.onosproject.core.CoreService;
29import org.onosproject.incubator.net.config.basics.ConfigException;
Marc De Leenheerb0d131c2016-03-01 20:34:59 -080030import org.onosproject.net.AnnotationKeys;
Andrea Campanella945ded22016-01-07 13:17:43 -080031import org.onosproject.net.DefaultAnnotations;
32import org.onosproject.net.Device;
33import org.onosproject.net.DeviceId;
34import org.onosproject.net.MastershipRole;
Saurav Dasa2d37502016-03-25 17:50:40 -070035import org.onosproject.net.PortNumber;
Andrea Campanella945ded22016-01-07 13:17:43 -080036import org.onosproject.net.SparseAnnotations;
Michele Santuaric372c222017-01-12 09:41:25 +010037import org.onosproject.net.behaviour.DevicesDiscovery;
Andrea Campanellad8d92db2016-01-14 16:24:41 -080038import org.onosproject.net.behaviour.PortDiscovery;
Andrea Campanella945ded22016-01-07 13:17:43 -080039import org.onosproject.net.config.ConfigFactory;
40import org.onosproject.net.config.NetworkConfigEvent;
41import org.onosproject.net.config.NetworkConfigListener;
42import org.onosproject.net.config.NetworkConfigRegistry;
Andrea Campanella59b549d2017-04-14 21:58:16 +020043import org.onosproject.net.config.basics.SubjectFactories;
Andrea Campanella945ded22016-01-07 13:17:43 -080044import org.onosproject.net.device.DefaultDeviceDescription;
45import org.onosproject.net.device.DeviceDescription;
Andrea Campanella6c71a052016-04-22 11:56:31 -070046import org.onosproject.net.device.DeviceDescriptionDiscovery;
Andrea Campanella945ded22016-01-07 13:17:43 -080047import org.onosproject.net.device.DeviceProvider;
48import org.onosproject.net.device.DeviceProviderRegistry;
49import org.onosproject.net.device.DeviceProviderService;
Andrea Campanella6c71a052016-04-22 11:56:31 -070050import org.onosproject.net.device.DeviceService;
Michele Santuaric372c222017-01-12 09:41:25 +010051import org.onosproject.net.driver.DefaultDriverData;
52import org.onosproject.net.driver.DefaultDriverHandler;
53import org.onosproject.net.driver.Driver;
54import org.onosproject.net.driver.DriverData;
55import org.onosproject.net.driver.DriverHandler;
56import org.onosproject.net.driver.DriverService;
Andrea Campanella945ded22016-01-07 13:17:43 -080057import org.onosproject.net.provider.AbstractProvider;
58import org.onosproject.net.provider.ProviderId;
Andrea Campanella59b549d2017-04-14 21:58:16 +020059import org.onosproject.protocol.rest.DefaultRestSBDevice;
Andrea Campanella945ded22016-01-07 13:17:43 -080060import org.onosproject.protocol.rest.RestSBController;
61import org.onosproject.protocol.rest.RestSBDevice;
62import org.slf4j.Logger;
63
Andrea Campanellac6ecc632016-03-10 17:57:06 -080064import javax.ws.rs.ProcessingException;
Andrea Campanella945ded22016-01-07 13:17:43 -080065import java.util.HashSet;
Andrea Campanella59b549d2017-04-14 21:58:16 +020066import java.util.List;
Andrea Campanella945ded22016-01-07 13:17:43 -080067import java.util.Set;
Palash Kala4c71ee72017-05-24 17:43:59 +090068import java.util.concurrent.Callable;
69import java.util.concurrent.ExecutionException;
Andrea Campanella784ee0f2016-02-17 15:50:59 -080070import java.util.concurrent.ExecutorService;
71import java.util.concurrent.Executors;
Palash Kala4c71ee72017-05-24 17:43:59 +090072import java.util.concurrent.Future;
73import java.util.concurrent.TimeUnit;
74import java.util.concurrent.TimeoutException;
Andrea Campanella59b549d2017-04-14 21:58:16 +020075import java.util.stream.Collectors;
Andrea Campanella945ded22016-01-07 13:17:43 -080076
Michele Santuaric372c222017-01-12 09:41:25 +010077import static com.google.common.base.Preconditions.checkNotNull;
Andrea Campanella784ee0f2016-02-17 15:50:59 -080078import static org.onlab.util.Tools.groupedThreads;
Andrea Campanella945ded22016-01-07 13:17:43 -080079import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
80import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
81import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
82import static org.slf4j.LoggerFactory.getLogger;
83
84/**
85 * Provider for devices that use REST as means of configuration communication.
86 */
87@Component(immediate = true)
88public class RestDeviceProvider extends AbstractProvider
89 implements DeviceProvider {
90 private static final String APP_NAME = "org.onosproject.restsb";
Andrea Campanella59b549d2017-04-14 21:58:16 +020091 protected static final String REST = "rest";
Konstantinos Kanonakis3cd85552016-11-17 10:11:13 -060092 private static final String JSON = "json";
Andrea Campanella945ded22016-01-07 13:17:43 -080093 private static final String PROVIDER = "org.onosproject.provider.rest.device";
94 private static final String IPADDRESS = "ipaddress";
Andrea Campanella2947e622016-01-27 09:23:46 -080095 private static final String HTTPS = "https";
96 private static final String AUTHORIZATION_PROPERTY = "authorization";
97 private static final String BASIC_AUTH_PREFIX = "Basic ";
98 private static final String URL_SEPARATOR = "://";
Michele Santuaric372c222017-01-12 09:41:25 +010099 protected static final String ISNOTNULL = "Rest device is not null";
100 private static final String UNKNOWN = "unknown";
Palash Kala4c71ee72017-05-24 17:43:59 +0900101 private static final int REST_TIMEOUT_SEC = 5;
Andrea Campanella945ded22016-01-07 13:17:43 -0800102 private final Logger log = getLogger(getClass());
103
104 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
105 protected DeviceProviderRegistry providerRegistry;
106
107 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
108 protected RestSBController controller;
109
110 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
111 protected NetworkConfigRegistry cfgService;
112
113 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
114 protected CoreService coreService;
115
Andrea Campanellad8d92db2016-01-14 16:24:41 -0800116 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Andrea Campanella6c71a052016-04-22 11:56:31 -0700117 protected DeviceService deviceService;
Andrea Campanellad8d92db2016-01-14 16:24:41 -0800118
Michele Santuaric372c222017-01-12 09:41:25 +0100119 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
120 protected DriverService driverService;
121
Andrea Campanella945ded22016-01-07 13:17:43 -0800122
123 private DeviceProviderService providerService;
Michele Santuaric372c222017-01-12 09:41:25 +0100124 private ApplicationId appId;
Andrea Campanella945ded22016-01-07 13:17:43 -0800125
Andrea Campanella784ee0f2016-02-17 15:50:59 -0800126 private final ExecutorService executor =
Andrea Campanella90f044f2016-03-02 09:14:57 -0800127 Executors.newFixedThreadPool(5, groupedThreads("onos/restsbprovider", "device-installer-%d", log));
Andrea Campanella784ee0f2016-02-17 15:50:59 -0800128
Andrea Campanella59b549d2017-04-14 21:58:16 +0200129 protected final List<ConfigFactory> factories = ImmutableList.of(
Andrea Campanella945ded22016-01-07 13:17:43 -0800130 new ConfigFactory<ApplicationId, RestProviderConfig>(APP_SUBJECT_FACTORY,
131 RestProviderConfig.class,
Palash Kalac3ffad92017-06-09 21:18:19 +0900132 "rest_devices",
Andrea Campanella945ded22016-01-07 13:17:43 -0800133 true) {
134 @Override
135 public RestProviderConfig createConfig() {
136 return new RestProviderConfig();
137 }
Andrea Campanella59b549d2017-04-14 21:58:16 +0200138 },
139 new ConfigFactory<DeviceId, RestDeviceConfig>(SubjectFactories.DEVICE_SUBJECT_FACTORY,
140 RestDeviceConfig.class,
141 REST) {
142 @Override
143 public RestDeviceConfig createConfig() {
144 return new RestDeviceConfig();
145 }
146 });
147
Andrea Campanella945ded22016-01-07 13:17:43 -0800148 private final NetworkConfigListener cfgLister = new InternalNetworkConfigListener();
Andrea Campanella945ded22016-01-07 13:17:43 -0800149
Andrea Campanella784ee0f2016-02-17 15:50:59 -0800150 private Set<DeviceId> addedDevices = new HashSet<>();
151
Andrea Campanella945ded22016-01-07 13:17:43 -0800152
153 @Activate
154 public void activate() {
155 appId = coreService.registerApplication(APP_NAME);
156 providerService = providerRegistry.register(this);
Andrea Campanella59b549d2017-04-14 21:58:16 +0200157 factories.forEach(cfgService::registerConfigFactory);
Andrea Campanella945ded22016-01-07 13:17:43 -0800158 cfgService.addListener(cfgLister);
Andrea Campanella59b549d2017-04-14 21:58:16 +0200159 executor.execute(RestDeviceProvider.this::createAndConnectDevices);
160 executor.execute(RestDeviceProvider.this::createDevices);
Andrea Campanella945ded22016-01-07 13:17:43 -0800161 log.info("Started");
162 }
163
Andrea Campanella945ded22016-01-07 13:17:43 -0800164 @Deactivate
165 public void deactivate() {
Andrea Campanella86294db2016-03-07 11:42:49 -0800166 cfgService.removeListener(cfgLister);
167 controller.getDevices().keySet().forEach(this::deviceRemoved);
Andrea Campanella945ded22016-01-07 13:17:43 -0800168 providerRegistry.unregister(this);
169 providerService = null;
Andrea Campanella59b549d2017-04-14 21:58:16 +0200170 factories.forEach(cfgService::unregisterConfigFactory);
Andrea Campanella945ded22016-01-07 13:17:43 -0800171 log.info("Stopped");
172 }
173
174 public RestDeviceProvider() {
175 super(new ProviderId(REST, PROVIDER));
176 }
177
178 @Override
179 public void triggerProbe(DeviceId deviceId) {
180 // TODO: This will be implemented later.
181 log.info("Triggering probe on device {}", deviceId);
182 }
183
184 @Override
185 public void roleChanged(DeviceId deviceId, MastershipRole newRole) {
186 // TODO: This will be implemented later.
187 }
188
189
190 @Override
191 public boolean isReachable(DeviceId deviceId) {
192 RestSBDevice restDevice = controller.getDevice(deviceId);
193 if (restDevice == null) {
Michele Santuaric372c222017-01-12 09:41:25 +0100194 restDevice = controller.getProxySBDevice(deviceId);
195 if (restDevice == null) {
196 log.debug("the requested device id: " +
197 deviceId.toString() +
198 " is not associated to any REST or REST " +
199 "proxy Device");
200 return false;
201 }
Andrea Campanella945ded22016-01-07 13:17:43 -0800202 }
203 return restDevice.isActive();
204 }
205
Michele Santuaric372c222017-01-12 09:41:25 +0100206 private void deviceAdded(RestSBDevice restSBDev) {
207 checkNotNull(restSBDev, ISNOTNULL);
208
209 //check if the server is controlling a single or multiple devices
210 if (restSBDev.isProxy()) {
211
212 Driver driver = driverService.getDriver(restSBDev.manufacturer().get(),
213 restSBDev.hwVersion().get(),
214 restSBDev.swVersion().get());
215
216 if (driver != null && driver.hasBehaviour(DevicesDiscovery.class)) {
217
218 //Creates the driver to communicate with the server
219 DevicesDiscovery devicesDiscovery =
220 devicesDiscovery(restSBDev, driver);
221 Set<DeviceId> deviceIds = devicesDiscovery.deviceIds();
222 restSBDev.setActive(true);
223 deviceIds.stream().forEach(deviceId -> {
224 controller.addProxiedDevice(deviceId, restSBDev);
225 DeviceDescription devDesc =
226 devicesDiscovery.deviceDetails(deviceId);
227 checkNotNull(devDesc,
228 "deviceDescription cannot be null");
229 providerService.deviceConnected(
230 deviceId, mergeAnn(restSBDev.deviceId(), devDesc));
231
232 if (driver.hasBehaviour(DeviceDescriptionDiscovery.class)) {
233 DriverHandler h = driverService.createHandler(deviceId);
234 DeviceDescriptionDiscovery devDisc =
235 h.behaviour(DeviceDescriptionDiscovery.class);
236 providerService.updatePorts(deviceId,
237 devDisc.discoverPortDetails());
238 }
239
240 checkAndUpdateDevice(deviceId);
241 addedDevices.add(deviceId);
242 });
243 } else {
244 log.warn("Driver not found for {}", restSBDev);
245 }
246 } else {
247 DeviceId deviceId = restSBDev.deviceId();
248 ChassisId cid = new ChassisId();
249 String ipAddress = restSBDev.ip().toString();
250 SparseAnnotations annotations = DefaultAnnotations.builder()
251 .set(IPADDRESS, ipAddress)
252 .set(AnnotationKeys.PROTOCOL, REST.toUpperCase())
253 .build();
254 DeviceDescription deviceDescription = new DefaultDeviceDescription(
255 deviceId.uri(),
256 Device.Type.SWITCH,
257 UNKNOWN, UNKNOWN,
258 UNKNOWN, UNKNOWN,
259 cid,
260 annotations);
261 restSBDev.setActive(true);
262 providerService.deviceConnected(deviceId, deviceDescription);
263 checkAndUpdateDevice(deviceId);
264 addedDevices.add(deviceId);
265 }
266 }
267
268 private DefaultDeviceDescription mergeAnn(DeviceId devId, DeviceDescription desc) {
269 return new DefaultDeviceDescription(
270 desc,
271 DefaultAnnotations.merge(
272 DefaultAnnotations.builder()
273 .set(AnnotationKeys.PROTOCOL, REST.toUpperCase())
274 // The rest server added as annotation to the device
275 .set(AnnotationKeys.REST_SERVER, devId.toString())
276 .build(),
277 desc.annotations()));
278 }
279
280 private DevicesDiscovery devicesDiscovery(RestSBDevice restSBDevice, Driver driver) {
281 DriverData driverData = new DefaultDriverData(driver, restSBDevice.deviceId());
282 DevicesDiscovery devicesDiscovery = driver.createBehaviour(driverData,
283 DevicesDiscovery.class);
284 devicesDiscovery.setHandler(new DefaultDriverHandler(driverData));
285 return devicesDiscovery;
Andrea Campanella945ded22016-01-07 13:17:43 -0800286 }
287
Konstantinos Kanonakis3cd85552016-11-17 10:11:13 -0600288 private void checkAndUpdateDevice(DeviceId deviceId) {
289 if (deviceService.getDevice(deviceId) == null) {
290 log.warn("Device {} has not been added to store, " +
291 "maybe due to a problem in connectivity", deviceId);
292 } else {
293 boolean isReachable = isReachable(deviceId);
294 if (isReachable && deviceService.isAvailable(deviceId)) {
295 Device device = deviceService.getDevice(deviceId);
296 if (device.is(DeviceDescriptionDiscovery.class)) {
Michele Santuaric372c222017-01-12 09:41:25 +0100297 DeviceDescriptionDiscovery deviceDescriptionDiscovery =
298 device.as(DeviceDescriptionDiscovery.class);
299 DeviceDescription updatedDeviceDescription =
300 deviceDescriptionDiscovery.discoverDeviceDetails();
301 if (updatedDeviceDescription != null &&
302 !descriptionEquals(device, updatedDeviceDescription)) {
303 providerService.deviceConnected(
304 deviceId,
305 new DefaultDeviceDescription(
306 updatedDeviceDescription, true,
307 updatedDeviceDescription.annotations()));
Konstantinos Kanonakis3cd85552016-11-17 10:11:13 -0600308 //if ports are not discovered, retry the discovery
309 if (deviceService.getPorts(deviceId).isEmpty()) {
310 discoverPorts(deviceId);
311 }
312 }
313 } else {
314 log.warn("No DeviceDescriptionDiscovery behaviour for device {}", deviceId);
315 }
316 } else if (!isReachable && deviceService.isAvailable(deviceId)) {
317 providerService.deviceDisconnected(deviceId);
318 }
319 }
320 }
321
322 private boolean descriptionEquals(Device device, DeviceDescription updatedDeviceDescription) {
Michele Santuarid2c8f212017-01-09 18:23:45 +0100323 return Objects.equal(device.id().uri(), updatedDeviceDescription.deviceUri())
Konstantinos Kanonakis3cd85552016-11-17 10:11:13 -0600324 && Objects.equal(device.type(), updatedDeviceDescription.type())
325 && Objects.equal(device.manufacturer(), updatedDeviceDescription.manufacturer())
326 && Objects.equal(device.hwVersion(), updatedDeviceDescription.hwVersion())
327 && Objects.equal(device.swVersion(), updatedDeviceDescription.swVersion())
328 && Objects.equal(device.serialNumber(), updatedDeviceDescription.serialNumber())
329 && Objects.equal(device.chassisId(), updatedDeviceDescription.chassisId())
330 && Objects.equal(device.annotations(), updatedDeviceDescription.annotations());
331 }
332
Andrea Campanella86294db2016-03-07 11:42:49 -0800333 private void deviceRemoved(DeviceId deviceId) {
Michele Santuaric372c222017-01-12 09:41:25 +0100334 checkNotNull(deviceId, ISNOTNULL);
Andrea Campanella945ded22016-01-07 13:17:43 -0800335 providerService.deviceDisconnected(deviceId);
Michele Santuaric372c222017-01-12 09:41:25 +0100336 controller.getProxiedDevices(deviceId).stream().forEach(device -> {
337 controller.removeProxiedDevice(device);
338 providerService.deviceDisconnected(device);
339 });
Andrea Campanella86294db2016-03-07 11:42:49 -0800340 controller.removeDevice(deviceId);
Andrea Campanella945ded22016-01-07 13:17:43 -0800341 }
342
Andrea Campanella59b549d2017-04-14 21:58:16 +0200343 //Method to connect devices provided via net-cfg under devices/ tree
344 private void createAndConnectDevices() {
345 Set<DeviceId> deviceSubjects =
346 cfgService.getSubjects(DeviceId.class, RestDeviceConfig.class);
347 connectDevices(deviceSubjects.stream()
348 .filter(deviceId -> deviceService.getDevice(deviceId) == null)
349 .map(deviceId -> {
350 RestDeviceConfig config =
351 cfgService.getConfig(deviceId, RestDeviceConfig.class);
352 RestSBDevice device = new DefaultRestSBDevice(config.ip(),
353 config.port(),
354 config.username(),
355 config.password(),
356 config.protocol(),
357 config.url(),
358 false, config.testUrl(),
359 config.manufacturer(),
360 config.hwVersion(),
361 config.swVersion());
362 return device;
363
364 }).collect(Collectors.toSet()));
365 }
366
367 //Old method to register devices provided via net-cfg under apps/rest/ tree
368 private void createDevices() {
Andrea Campanella945ded22016-01-07 13:17:43 -0800369 RestProviderConfig cfg = cfgService.getConfig(appId, RestProviderConfig.class);
370 try {
371 if (cfg != null && cfg.getDevicesAddresses() != null) {
Andrea Campanella59b549d2017-04-14 21:58:16 +0200372 connectDevices(cfg.getDevicesAddresses());
373
Andrea Campanella945ded22016-01-07 13:17:43 -0800374 }
375 } catch (ConfigException e) {
376 log.error("Configuration error {}", e);
377 }
Andrea Campanella2947e622016-01-27 09:23:46 -0800378 log.debug("REST Devices {}", controller.getDevices());
Andrea Campanella784ee0f2016-02-17 15:50:59 -0800379 addedDevices.clear();
Andrea Campanella945ded22016-01-07 13:17:43 -0800380 }
381
Andrea Campanella59b549d2017-04-14 21:58:16 +0200382 private void connectDevices(Set<RestSBDevice> devices) {
383 //Precomputing the devices to be removed
384 Set<RestSBDevice> toBeRemoved = new HashSet<>(controller.getDevices().values());
385 toBeRemoved.removeAll(devices);
386 //Adding new devices
387 devices.stream()
388 .filter(device -> {
389 device.setActive(false);
390 controller.addDevice(device);
391 return testDeviceConnection(device);
392 })
393 .forEach(device -> {
394 deviceAdded(device);
395 });
396 //Removing devices not wanted anymore
397 toBeRemoved.forEach(device -> deviceRemoved(device.deviceId()));
398 }
399
Andrea Campanella6c71a052016-04-22 11:56:31 -0700400 private void discoverPorts(DeviceId deviceId) {
401 Device device = deviceService.getDevice(deviceId);
402 //TODO remove when PortDiscovery is removed from master
403 if (device.is(PortDiscovery.class)) {
404 PortDiscovery portConfig = device.as(PortDiscovery.class);
Konstantinos Kanonakis3cd85552016-11-17 10:11:13 -0600405 providerService.updatePorts(deviceId, portConfig.getPorts());
406 } else {
Andrea Campanella6c71a052016-04-22 11:56:31 -0700407 DeviceDescriptionDiscovery deviceDescriptionDiscovery =
408 device.as(DeviceDescriptionDiscovery.class);
409 providerService.updatePorts(deviceId, deviceDescriptionDiscovery.discoverPortDetails());
Andrea Campanella6c71a052016-04-22 11:56:31 -0700410 }
411 }
412
Michele Santuaric372c222017-01-12 09:41:25 +0100413 private boolean testDeviceConnection(RestSBDevice dev) {
Andrea Campanella945ded22016-01-07 13:17:43 -0800414 try {
Palash Kala4c71ee72017-05-24 17:43:59 +0900415 Callable<Boolean> connectionSuccess;
416
Michele Santuaric372c222017-01-12 09:41:25 +0100417 if (dev.testUrl().isPresent()) {
Palash Kala4c71ee72017-05-24 17:43:59 +0900418 connectionSuccess = new Callable<Boolean>() {
419 @Override
420 public Boolean call() throws Exception {
421 return controller
422 .get(dev.deviceId(), dev.testUrl().get(), JSON) != null;
423 }
424 };
425 } else {
426 connectionSuccess = new Callable<Boolean>() {
427 @Override
428 public Boolean call() throws Exception {
429 return controller.get(dev.deviceId(), "", JSON) != null;
430 }
431 };
Michele Santuaric372c222017-01-12 09:41:25 +0100432 }
Palash Kala4c71ee72017-05-24 17:43:59 +0900433
434 Future<Boolean> future = executor.submit(connectionSuccess);
435 try {
436 Boolean result = future.get(REST_TIMEOUT_SEC, TimeUnit.SECONDS);
437 return result;
438 } catch (TimeoutException ex) {
439 log.warn("Connection to device {} timed out", dev.deviceId());
440 return false;
441 } catch (InterruptedException ex) {
442 log.warn("Connection to device {} interrupted", dev.deviceId());
443 return false;
444 } catch (ExecutionException ex) {
445 log.warn("Connection to device {} had a execution exception", dev.deviceId());
446 return false;
447 }
Michele Santuaric372c222017-01-12 09:41:25 +0100448
Andrea Campanellac6ecc632016-03-10 17:57:06 -0800449 } catch (ProcessingException e) {
Michele Santuaric372c222017-01-12 09:41:25 +0100450 log.warn("Cannot connect to device {}", dev, e);
Andrea Campanella945ded22016-01-07 13:17:43 -0800451 }
452 return false;
453 }
454
455 private class InternalNetworkConfigListener implements NetworkConfigListener {
Andrea Campanella945ded22016-01-07 13:17:43 -0800456 @Override
457 public void event(NetworkConfigEvent event) {
Andrea Campanella59b549d2017-04-14 21:58:16 +0200458 if (event.configClass().equals(RestDeviceConfig.class)) {
459 executor.execute(RestDeviceProvider.this::createAndConnectDevices);
460 } else {
461 log.warn("Injecting device via this Json is deprecated, " +
462 "please put configuration under devices/");
463 executor.execute(RestDeviceProvider.this::createDevices);
464 }
Andrea Campanella945ded22016-01-07 13:17:43 -0800465 }
466
467 @Override
468 public boolean isRelevant(NetworkConfigEvent event) {
Andrea Campanella59b549d2017-04-14 21:58:16 +0200469 return (event.configClass().equals(RestDeviceConfig.class) ||
470 event.configClass().equals(RestProviderConfig.class)) &&
Andrea Campanella945ded22016-01-07 13:17:43 -0800471 (event.type() == CONFIG_ADDED ||
472 event.type() == CONFIG_UPDATED);
473 }
474 }
Saurav Dasa2d37502016-03-25 17:50:40 -0700475
476 @Override
477 public void changePortState(DeviceId deviceId, PortNumber portNumber,
478 boolean enable) {
479 // TODO if required
480 }
Andrea Campanella945ded22016-01-07 13:17:43 -0800481}