port statistics defect fix

Change-Id: I4fc97388af17ad2e83d02bbd3fb350a021e34455
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
index d7b8e40..edeffef 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
@@ -110,7 +110,9 @@
     /**
      * RPC interfaces message.
      */
-    static final String RPC_IFS = "<interfaces/>";
+    static final String RPC_IFS =
+            "<interfaces><interface><ifPhyType>Ethernet</ifPhyType" +
+                    "></interface></interfaces>";
 
     /**
      * RPC ifm message.
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java
index c6909e4..bcb7f4c 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java
@@ -184,11 +184,12 @@
         NetconfSession session = getNetconfSession();
         String interfaces;
         try {
-            return session.get(getInterfacesReq());
+            interfaces = session.get(getInterfacesReq());
         } catch (IOException e) {
             throw new IllegalArgumentException(
-                    new NetconfException(INT_INFO_FAILURE));
+                    new NetconfException(INT_INFO_FAILURE, e.getCause()));
         }
+        return interfaces;
     }
 
     private Collection<PortStatistics> getPortStatistics(String ifs) {
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java
index 29b617f..5d56ddc 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java
@@ -79,7 +79,7 @@
 
     //TODO: All type of interfaces has to be added.
     private static final List INTERFACES = Arrays.asList(
-            "MEth", "LoopBack", "Ethernet", "POS", "GigabitEthernet");
+            "MEth", "Ethernet", "POS", "GigabitEthernet");
 
     private List<PortDescription> ports = new ArrayList<>();
     private String xml;
@@ -259,6 +259,7 @@
                                                           .getText());
 
             return builder.setDeviceId(id)
+                    .setPort(port)
                     .setPacketsReceived(packetReceived)
                     .setPacketsSent(packetSent)
                     .setBytesReceived(bytesReceived)
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 1720e2e..7e513e0 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
@@ -306,7 +306,7 @@
                 log.debug("Netconf device {} removed from Netconf subController", deviceId);
             } else {
                 log.warn("Netconf device {} does not exist in the store, " +
-                         "it may already have been removed", deviceId);
+                                 "it may already have been removed", deviceId);
             }
         }
     }
@@ -351,13 +351,13 @@
     }
 
     private void checkAndUpdateDevice(DeviceId deviceId, DeviceDescription deviceDescription) {
-        if (deviceService.getDevice(deviceId) == null) {
+        Device device = deviceService.getDevice(deviceId);
+        if (device == null) {
             log.warn("Device {} has not been added to store, " +
                              "maybe due to a problem in connectivity", deviceId);
         } else {
             boolean isReachable = isReachable(deviceId);
             if (isReachable && !deviceService.isAvailable(deviceId)) {
-                Device device = deviceService.getDevice(deviceId);
                 if (device.is(DeviceDescriptionDiscovery.class)) {
                     if (mastershipService.isLocalMaster(deviceId)) {
                         DeviceDescriptionDiscovery deviceDescriptionDiscovery =
@@ -381,16 +381,29 @@
                 } else {
                     log.warn("No DeviceDescriptionDiscovery behaviour for device {} " +
                                      "using DefaultDeviceDescription", deviceId);
-                            providerService.deviceConnected(
-                                    deviceId, new DefaultDeviceDescription(
+                    providerService.deviceConnected(
+                            deviceId, new DefaultDeviceDescription(
                                     deviceDescription, true, deviceDescription.annotations()));
                 }
             } else if (!isReachable && deviceService.isAvailable(deviceId)) {
                 providerService.deviceDisconnected(deviceId);
+            } else if (isReachable && deviceService.isAvailable(deviceId)) {
+                updatePortStatistics(device);
             }
         }
     }
 
+    private void updatePortStatistics(Device device) {
+        if (device.is(PortStatisticsDiscovery.class)) {
+            PortStatisticsDiscovery d = device.as(PortStatisticsDiscovery.class);
+            providerService.updatePortStatistics(device.id(),
+                                                 d.discoverPortStatistics());
+        } else {
+            log.warn("No port statistics getter behaviour for device {}",
+                     device.id());
+        }
+    }
+
     private boolean descriptionEquals(Device device, DeviceDescription updatedDeviceDescription) {
         return Objects.equal(device.id().uri(), updatedDeviceDescription.deviceUri())
                 && Objects.equal(device.type(), updatedDeviceDescription.type())
@@ -482,15 +495,7 @@
         }
 
         // Port statistics discovery
-        if (device.is(PortStatisticsDiscovery.class)) {
-            PortStatisticsDiscovery d =
-                    device.as(PortStatisticsDiscovery.class);
-            providerService.updatePortStatistics(deviceId,
-                                                 d.discoverPortStatistics());
-        } else {
-            log.warn("No port statistics getter behaviour for device {}",
-                     deviceId);
-        }
+        updatePortStatistics(device);
     }
 
     /**