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());
+ }
+ }
}