[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);
         });
     }