ONOS-3578 Removing netconf device from ONOS core

Change-Id: Ib3165ec26d598ce2f10216a2982dae2cebd539e9
diff --git a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfControllerImpl.java b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfControllerImpl.java
index 988bce4..cebe012 100644
--- a/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfControllerImpl.java
+++ b/protocols/netconf/ctl/src/main/java/org/onosproject/netconf/ctl/NetconfControllerImpl.java
@@ -27,6 +27,8 @@
 import org.onosproject.netconf.NetconfDeviceFactory;
 import org.onosproject.netconf.NetconfDeviceInfo;
 import org.onosproject.netconf.NetconfDeviceListener;
+import org.onosproject.netconf.NetconfDeviceOutputEvent;
+import org.onosproject.netconf.NetconfDeviceOutputEventListener;
 import org.onosproject.netconf.NetconfException;
 import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
@@ -49,6 +51,8 @@
 
     private Map<DeviceId, NetconfDevice> netconfDeviceMap = new ConcurrentHashMap<>();
 
+    private final NetconfDeviceOutputEventListener downListener = new DeviceDownEventListener();
+
     protected Set<NetconfDeviceListener> netconfDeviceListeners = new CopyOnWriteArraySet<>();
     protected NetconfDeviceFactory deviceFactory = new DefaultNetconfDeviceFactory();
 
@@ -97,7 +101,9 @@
             return netconfDeviceMap.get(deviceInfo.getDeviceId());
         } else {
             log.info("Creating NETCONF device {}", deviceInfo);
-            return createDevice(deviceInfo);
+            NetconfDevice device = createDevice(deviceInfo);
+            device.getSession().addDeviceOutputListener(downListener);
+            return device;
         }
     }
 
@@ -140,4 +146,21 @@
             return new DefaultNetconfDevice(netconfDeviceInfo);
         }
     }
+
+    //Listener for closed session with devices, gets triggered whe devices goes down
+    // or sends the endpattern ]]>]]>
+    private class DeviceDownEventListener implements NetconfDeviceOutputEventListener {
+
+        @Override
+        public void event(NetconfDeviceOutputEvent event) {
+            if (event.type().equals(NetconfDeviceOutputEvent.Type.DEVICE_UNREGISTERED)) {
+                removeDevice(event.getDeviceInfo());
+            }
+        }
+
+        @Override
+        public boolean isRelevant(NetconfDeviceOutputEvent event) {
+            return getDevicesMap().containsKey(event.getDeviceInfo().getDeviceId());
+        }
+    }
 }
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 4901c13..f7415ef 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
@@ -136,7 +136,7 @@
     public boolean isReachable(DeviceId deviceId) {
         NetconfDevice netconfDevice = controller.getNetconfDevice(deviceId);
         if (netconfDevice == null) {
-            log.warn("BAD REQUEST: the requested device id: "
+            log.debug("Requested device id: "
                              + deviceId.toString()
                              + "  is not associated to any NETCONF Device");
             return false;