[ONOS-7149] Re-query DeviceDescription when Netconf device connects again
Change-Id: I4f22dc3e8a8a2eb0202925afb2ad7e4151ee6e46
diff --git a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
index 24e1d89..c35682c 100644
--- a/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
+++ b/providers/netconf/device/src/main/java/org/onosproject/provider/netconf/device/impl/NetconfDeviceProvider.java
@@ -436,63 +436,67 @@
log.debug("Connecting NETCONF device {}, on {}:{} with username {}",
deviceId, config.ip(), config.port(), config.username());
storeDeviceKey(config.sshKey(), config.username(), config.password(), deviceId);
- retriedPortDiscoveryMap.putIfAbsent(deviceId, new AtomicInteger(0));
+ retriedPortDiscoveryMap.put(deviceId, new AtomicInteger(0));
if (deviceService.getDevice(deviceId) == null) {
providerService.deviceConnected(deviceId, deviceDescription);
}
try {
- checkAndUpdateDevice(deviceId, deviceDescription);
+ checkAndUpdateDevice(deviceId, deviceDescription, true);
} catch (Exception e) {
log.error("Unhandled exception checking {}", deviceId, e);
}
}
- private void checkAndUpdateDevice(DeviceId deviceId, DeviceDescription deviceDescription) {
+ private void checkAndUpdateDevice(DeviceId deviceId, DeviceDescription deviceDescription, boolean newlyConnected) {
Device device = deviceService.getDevice(deviceId);
if (device == null) {
- log.debug("Device {} has not been added to store, " +
- "since it's not reachable", deviceId);
- } else {
- boolean isReachable = isReachable(deviceId);
- if (isReachable && !deviceService.isAvailable(deviceId)) {
- if (device.is(DeviceDescriptionDiscovery.class)) {
- if (mastershipService.isLocalMaster(deviceId)) {
- DeviceDescriptionDiscovery deviceDescriptionDiscovery =
- device.as(DeviceDescriptionDiscovery.class);
- DeviceDescription updatedDeviceDescription =
- deviceDescriptionDiscovery.discoverDeviceDetails();
- if (updatedDeviceDescription != null &&
- !descriptionEquals(device, updatedDeviceDescription)) {
- providerService.deviceConnected(
- deviceId, new DefaultDeviceDescription(
- updatedDeviceDescription, true,
- updatedDeviceDescription.annotations()));
- } else if (updatedDeviceDescription == null) {
- providerService.deviceConnected(
- deviceId, new DefaultDeviceDescription(
- deviceDescription, true,
- deviceDescription.annotations()));
- }
- }
- } else {
- log.warn("No DeviceDescriptionDiscovery behaviour for device {} " +
- "using DefaultDeviceDescription", deviceId);
+ log.debug("Device {} has not been added to store, since it's not reachable", deviceId);
+ return;
+ }
+ boolean isReachable = isReachable(deviceId);
+ if (!isReachable && deviceService.isAvailable(deviceId)) {
+ providerService.deviceDisconnected(deviceId);
+ return;
+ } else if (newlyConnected) {
+ updateDeviceDescription(deviceId, deviceDescription, device);
+ }
+ if (isReachable && deviceService.isAvailable(deviceId) &&
+ mastershipService.isLocalMaster(deviceId)) {
+ //if ports are not discovered, retry the discovery
+ if (deviceService.getPorts(deviceId).isEmpty() &&
+ retriedPortDiscoveryMap.get(deviceId).getAndIncrement() < maxRetries) {
+ discoverPorts(deviceId);
+ }
+ updatePortStatistics(device);
+ }
+ }
+
+ private void updateDeviceDescription(DeviceId deviceId, DeviceDescription deviceDescription, Device device) {
+ if (device.is(DeviceDescriptionDiscovery.class)) {
+ if (mastershipService.isLocalMaster(deviceId)) {
+ DeviceDescriptionDiscovery deviceDescriptionDiscovery =
+ device.as(DeviceDescriptionDiscovery.class);
+ DeviceDescription updatedDeviceDescription =
+ deviceDescriptionDiscovery.discoverDeviceDetails();
+ if (updatedDeviceDescription != null &&
+ !descriptionEquals(device, updatedDeviceDescription)) {
providerService.deviceConnected(
deviceId, new DefaultDeviceDescription(
- deviceDescription, true, deviceDescription.annotations()));
+ updatedDeviceDescription, true,
+ updatedDeviceDescription.annotations()));
+ } else if (updatedDeviceDescription == null) {
+ providerService.deviceConnected(
+ deviceId, new DefaultDeviceDescription(
+ deviceDescription, true,
+ deviceDescription.annotations()));
}
- } else if (!isReachable && deviceService.isAvailable(deviceId)) {
- providerService.deviceDisconnected(deviceId);
- } else if (isReachable && deviceService.isAvailable(deviceId) &&
- mastershipService.isLocalMaster(deviceId)) {
-
- //if ports are not discovered, retry the discovery
- if (deviceService.getPorts(deviceId).isEmpty() &&
- retriedPortDiscoveryMap.get(deviceId).getAndIncrement() < maxRetries) {
- discoverPorts(deviceId);
- }
- updatePortStatistics(device);
}
+ } else {
+ log.warn("No DeviceDescriptionDiscovery behaviour for device {} " +
+ "using DefaultDeviceDescription", deviceId);
+ providerService.deviceConnected(
+ deviceId, new DefaultDeviceDescription(
+ deviceDescription, true, deviceDescription.annotations()));
}
}
@@ -529,7 +533,7 @@
cfgService.getConfig(deviceId, NetconfDeviceConfig.class);
DeviceDescription deviceDescription = createDeviceRepresentation(deviceId, config);
storeDeviceKey(config.sshKey(), config.username(), config.password(), deviceId);
- checkAndUpdateDevice(deviceId, deviceDescription);
+ checkAndUpdateDevice(deviceId, deviceDescription, false);
});
}