Committed by
Gerrit Code Review
Removing Rest and Netconf devices when the providers are disabled
Change-Id: Icac7146fea1295c11972ae4cbf87f8ef9689c671
Showing
9 changed files
with
75 additions
and
21 deletions
| ... | @@ -20,6 +20,7 @@ import org.onlab.packet.IpAddress; | ... | @@ -20,6 +20,7 @@ import org.onlab.packet.IpAddress; |
| 20 | import org.onosproject.net.DeviceId; | 20 | import org.onosproject.net.DeviceId; |
| 21 | 21 | ||
| 22 | import java.util.Map; | 22 | import java.util.Map; |
| 23 | +import java.util.Set; | ||
| 23 | 24 | ||
| 24 | /** | 25 | /** |
| 25 | * Abstraction of an NETCONF controller. Serves as a one stop shop for obtaining | 26 | * Abstraction of an NETCONF controller. Serves as a one stop shop for obtaining |
| ... | @@ -52,7 +53,14 @@ public interface NetconfController { | ... | @@ -52,7 +53,14 @@ public interface NetconfController { |
| 52 | NetconfDevice connectDevice(NetconfDeviceInfo deviceInfo) throws NetconfException; | 53 | NetconfDevice connectDevice(NetconfDeviceInfo deviceInfo) throws NetconfException; |
| 53 | 54 | ||
| 54 | /** | 55 | /** |
| 55 | - * Removes a Netconf device. | 56 | + * Disconnects a Netconf device and removes it from the core. |
| 57 | + * | ||
| 58 | + * @param deviceInfo info about the device to remove | ||
| 59 | + */ | ||
| 60 | + void disconnectDevice(NetconfDeviceInfo deviceInfo); | ||
| 61 | + | ||
| 62 | + /** | ||
| 63 | + * Removes a Netconf device from the core. | ||
| 56 | * | 64 | * |
| 57 | * @param deviceInfo info about the device to remove | 65 | * @param deviceInfo info about the device to remove |
| 58 | */ | 66 | */ |
| ... | @@ -62,10 +70,18 @@ public interface NetconfController { | ... | @@ -62,10 +70,18 @@ public interface NetconfController { |
| 62 | * Gets all the nodes information. | 70 | * Gets all the nodes information. |
| 63 | * | 71 | * |
| 64 | * @return map of devices | 72 | * @return map of devices |
| 73 | + * | ||
| 65 | */ | 74 | */ |
| 66 | Map<DeviceId, NetconfDevice> getDevicesMap(); | 75 | Map<DeviceId, NetconfDevice> getDevicesMap(); |
| 67 | 76 | ||
| 68 | /** | 77 | /** |
| 78 | + * Gets all Netconf Devices. | ||
| 79 | + * | ||
| 80 | + * @return List of all the NetconfDevices Ids | ||
| 81 | + */ | ||
| 82 | + Set<DeviceId> getNetconfDevices(); | ||
| 83 | + | ||
| 84 | + /** | ||
| 69 | * Gets a Netconf Device by node identifier. | 85 | * Gets a Netconf Device by node identifier. |
| 70 | * | 86 | * |
| 71 | * @param deviceInfo node identifier | 87 | * @param deviceInfo node identifier | ... | ... |
| ... | @@ -108,7 +108,7 @@ public class NetconfControllerImpl implements NetconfController { | ... | @@ -108,7 +108,7 @@ public class NetconfControllerImpl implements NetconfController { |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | @Override | 110 | @Override |
| 111 | - public void removeDevice(NetconfDeviceInfo deviceInfo) { | 111 | + public void disconnectDevice(NetconfDeviceInfo deviceInfo) { |
| 112 | if (!netconfDeviceMap.containsKey(deviceInfo.getDeviceId())) { | 112 | if (!netconfDeviceMap.containsKey(deviceInfo.getDeviceId())) { |
| 113 | log.warn("Device {} is not present", deviceInfo); | 113 | log.warn("Device {} is not present", deviceInfo); |
| 114 | } else { | 114 | } else { |
| ... | @@ -116,6 +116,18 @@ public class NetconfControllerImpl implements NetconfController { | ... | @@ -116,6 +116,18 @@ public class NetconfControllerImpl implements NetconfController { |
| 116 | } | 116 | } |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | + @Override | ||
| 120 | + public void removeDevice(NetconfDeviceInfo deviceInfo) { | ||
| 121 | + if (!netconfDeviceMap.containsKey(deviceInfo.getDeviceId())) { | ||
| 122 | + log.warn("Device {} is not present", deviceInfo); | ||
| 123 | + } else { | ||
| 124 | + netconfDeviceMap.remove(deviceInfo.getDeviceId()); | ||
| 125 | + for (NetconfDeviceListener l : netconfDeviceListeners) { | ||
| 126 | + l.deviceRemoved(deviceInfo); | ||
| 127 | + } | ||
| 128 | + } | ||
| 129 | + } | ||
| 130 | + | ||
| 119 | private NetconfDevice createDevice(NetconfDeviceInfo deviceInfo) throws NetconfException { | 131 | private NetconfDevice createDevice(NetconfDeviceInfo deviceInfo) throws NetconfException { |
| 120 | NetconfDevice netconfDevice = deviceFactory.createNetconfDevice(deviceInfo); | 132 | NetconfDevice netconfDevice = deviceFactory.createNetconfDevice(deviceInfo); |
| 121 | for (NetconfDeviceListener l : netconfDeviceListeners) { | 133 | for (NetconfDeviceListener l : netconfDeviceListeners) { |
| ... | @@ -138,6 +150,11 @@ public class NetconfControllerImpl implements NetconfController { | ... | @@ -138,6 +150,11 @@ public class NetconfControllerImpl implements NetconfController { |
| 138 | return netconfDeviceMap; | 150 | return netconfDeviceMap; |
| 139 | } | 151 | } |
| 140 | 152 | ||
| 153 | + @Override | ||
| 154 | + public Set<DeviceId> getNetconfDevices() { | ||
| 155 | + return netconfDeviceMap.keySet(); | ||
| 156 | + } | ||
| 157 | + | ||
| 141 | //Device factory for the specific NetconfDeviceImpl | 158 | //Device factory for the specific NetconfDeviceImpl |
| 142 | private class DefaultNetconfDeviceFactory implements NetconfDeviceFactory { | 159 | private class DefaultNetconfDeviceFactory implements NetconfDeviceFactory { |
| 143 | 160 | ... | ... |
| ... | @@ -182,6 +182,7 @@ public class NetconfStreamThread extends Thread implements NetconfStreamHandler | ... | @@ -182,6 +182,7 @@ public class NetconfStreamThread extends Thread implements NetconfStreamHandler |
| 182 | null, null, Optional.of(-1), netconfDeviceInfo); | 182 | null, null, Optional.of(-1), netconfDeviceInfo); |
| 183 | netconfDeviceEventListeners.forEach( | 183 | netconfDeviceEventListeners.forEach( |
| 184 | listener -> listener.event(event)); | 184 | listener -> listener.event(event)); |
| 185 | + this.interrupt(); | ||
| 185 | } else { | 186 | } else { |
| 186 | deviceReply = deviceReply.replace(END_PATTERN, ""); | 187 | deviceReply = deviceReply.replace(END_PATTERN, ""); |
| 187 | if (deviceReply.contains(RPC_REPLY) || | 188 | if (deviceReply.contains(RPC_REPLY) || | ... | ... |
| ... | @@ -32,8 +32,10 @@ import org.onosproject.netconf.NetconfException; | ... | @@ -32,8 +32,10 @@ import org.onosproject.netconf.NetconfException; |
| 32 | import org.onosproject.netconf.NetconfSession; | 32 | import org.onosproject.netconf.NetconfSession; |
| 33 | 33 | ||
| 34 | import java.lang.reflect.Field; | 34 | import java.lang.reflect.Field; |
| 35 | +import java.util.HashSet; | ||
| 35 | import java.util.Map; | 36 | import java.util.Map; |
| 36 | import java.util.Optional; | 37 | import java.util.Optional; |
| 38 | +import java.util.Set; | ||
| 37 | 39 | ||
| 38 | import static org.hamcrest.Matchers.*; | 40 | import static org.hamcrest.Matchers.*; |
| 39 | import static org.junit.Assert.*; | 41 | import static org.junit.Assert.*; |
| ... | @@ -134,6 +136,14 @@ public class NetconfControllerImplTest { | ... | @@ -134,6 +136,14 @@ public class NetconfControllerImplTest { |
| 134 | } | 136 | } |
| 135 | 137 | ||
| 136 | @Test | 138 | @Test |
| 139 | + public void testGetNetconfDevices() { | ||
| 140 | + Set<DeviceId> devices = new HashSet<>(); | ||
| 141 | + devices.add(deviceId1); | ||
| 142 | + devices.add(deviceId2); | ||
| 143 | + assertTrue("Incorrect devices", ctrl.getNetconfDevices().containsAll(devices)); | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + @Test | ||
| 137 | public void testGetNetconfDevice() { | 147 | public void testGetNetconfDevice() { |
| 138 | NetconfDevice fetchedDevice1 = ctrl.getNetconfDevice(deviceId1); | 148 | NetconfDevice fetchedDevice1 = ctrl.getNetconfDevice(deviceId1); |
| 139 | assertThat("Incorrect device fetched", fetchedDevice1, is(device1)); | 149 | assertThat("Incorrect device fetched", fetchedDevice1, is(device1)); |
| ... | @@ -192,7 +202,16 @@ public class NetconfControllerImplTest { | ... | @@ -192,7 +202,16 @@ public class NetconfControllerImplTest { |
| 192 | } | 202 | } |
| 193 | 203 | ||
| 194 | /** | 204 | /** |
| 195 | - * Check for removeDevice exception. | 205 | + * Check that disconnectDevice actually disconnects the device and removes it. |
| 206 | + */ | ||
| 207 | + @Test | ||
| 208 | + public void testDisconnectDevice() throws Exception { | ||
| 209 | + ctrl.disconnectDevice(deviceInfo1); | ||
| 210 | + assertFalse("Incorrect device removal", ctrl.getDevicesMap().containsKey(deviceId1)); | ||
| 211 | + } | ||
| 212 | + | ||
| 213 | + /** | ||
| 214 | + * Checks that disconnectDevice actually disconnects the device and removes it. | ||
| 196 | */ | 215 | */ |
| 197 | @Test | 216 | @Test |
| 198 | public void testRemoveDevice() throws Exception { | 217 | public void testRemoveDevice() throws Exception { | ... | ... |
| ... | @@ -62,9 +62,9 @@ public interface RestSBController { | ... | @@ -62,9 +62,9 @@ public interface RestSBController { |
| 62 | /** | 62 | /** |
| 63 | * Removes the device from the devices map. | 63 | * Removes the device from the devices map. |
| 64 | * | 64 | * |
| 65 | - * @param device to be removed | 65 | + * @param deviceId to be removed |
| 66 | */ | 66 | */ |
| 67 | - void removeDevice(RestSBDevice device); | 67 | + void removeDevice(DeviceId deviceId); |
| 68 | 68 | ||
| 69 | /** | 69 | /** |
| 70 | * Does a REST POST request with specified parameters to the device. | 70 | * Does a REST POST request with specified parameters to the device. |
| ... | @@ -91,8 +91,8 @@ public interface RestSBController { | ... | @@ -91,8 +91,8 @@ public interface RestSBController { |
| 91 | /** | 91 | /** |
| 92 | * Does a REST GET request with specified parameters to the device. | 92 | * Does a REST GET request with specified parameters to the device. |
| 93 | * | 93 | * |
| 94 | - * @param device device to make the request to | 94 | + * @param device device to make the request to |
| 95 | - * @param request url of the request | 95 | + * @param request url of the request |
| 96 | * @param mediaType format to retrieve the content in | 96 | * @param mediaType format to retrieve the content in |
| 97 | * @return an inputstream of data from the reply. | 97 | * @return an inputstream of data from the reply. |
| 98 | */ | 98 | */ |
| ... | @@ -101,8 +101,8 @@ public interface RestSBController { | ... | @@ -101,8 +101,8 @@ public interface RestSBController { |
| 101 | /** | 101 | /** |
| 102 | * Does a REST PATCH request with specified parameters to the device. | 102 | * Does a REST PATCH request with specified parameters to the device. |
| 103 | * | 103 | * |
| 104 | - * @param device device to make the request to | 104 | + * @param device device to make the request to |
| 105 | - * @param request url of the request | 105 | + * @param request url of the request |
| 106 | * @param payload payload of the request as an InputStream | 106 | * @param payload payload of the request as an InputStream |
| 107 | * @param mediaType format to retrieve the content in | 107 | * @param mediaType format to retrieve the content in |
| 108 | * @return true if operation returned 200, 201, 202, false otherwise | 108 | * @return true if operation returned 200, 201, 202, false otherwise | ... | ... |
| ... | @@ -109,8 +109,8 @@ public class RestSBControllerImpl implements RestSBController { | ... | @@ -109,8 +109,8 @@ public class RestSBControllerImpl implements RestSBController { |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | @Override | 111 | @Override |
| 112 | - public void removeDevice(RestSBDevice device) { | 112 | + public void removeDevice(DeviceId deviceId) { |
| 113 | - deviceMap.remove(device.deviceId()); | 113 | + deviceMap.remove(deviceId); |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | @Override | 116 | @Override | ... | ... |
| ... | @@ -53,7 +53,7 @@ public class RestSBControllerImplTest { | ... | @@ -53,7 +53,7 @@ public class RestSBControllerImplTest { |
| 53 | assertEquals("Incorrect Get Device by IP, Port", controller.getDevice(device1.ip(), device1.port()), device1); | 53 | assertEquals("Incorrect Get Device by IP, Port", controller.getDevice(device1.ip(), device1.port()), device1); |
| 54 | controller.addDevice(device2); | 54 | controller.addDevice(device2); |
| 55 | assertTrue("Device2 non added", controller.getDevices().containsValue(device2)); | 55 | assertTrue("Device2 non added", controller.getDevices().containsValue(device2)); |
| 56 | - controller.removeDevice(device2); | 56 | + controller.removeDevice(device2.deviceId()); |
| 57 | assertFalse("Device2 not removed", controller.getDevices().containsValue(device2)); | 57 | assertFalse("Device2 not removed", controller.getDevices().containsValue(device2)); |
| 58 | } | 58 | } |
| 59 | } | 59 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -126,10 +126,13 @@ public class NetconfDeviceProvider extends AbstractProvider | ... | @@ -126,10 +126,13 @@ public class NetconfDeviceProvider extends AbstractProvider |
| 126 | 126 | ||
| 127 | @Deactivate | 127 | @Deactivate |
| 128 | public void deactivate() { | 128 | public void deactivate() { |
| 129 | + controller.removeDeviceListener(innerNodeListener); | ||
| 130 | + controller.getNetconfDevices().forEach(id -> | ||
| 131 | + controller.removeDevice(controller.getDevicesMap().get(id) | ||
| 132 | + .getDeviceInfo())); | ||
| 129 | providerRegistry.unregister(this); | 133 | providerRegistry.unregister(this); |
| 130 | providerService = null; | 134 | providerService = null; |
| 131 | cfgService.unregisterConfigFactory(factory); | 135 | cfgService.unregisterConfigFactory(factory); |
| 132 | - controller.removeDeviceListener(innerNodeListener); | ||
| 133 | log.info("Stopped"); | 136 | log.info("Stopped"); |
| 134 | } | 137 | } |
| 135 | 138 | ... | ... |
| ... | @@ -135,13 +135,13 @@ public class RestDeviceProvider extends AbstractProvider | ... | @@ -135,13 +135,13 @@ public class RestDeviceProvider extends AbstractProvider |
| 135 | log.info("Started"); | 135 | log.info("Started"); |
| 136 | } | 136 | } |
| 137 | 137 | ||
| 138 | - | ||
| 139 | @Deactivate | 138 | @Deactivate |
| 140 | public void deactivate() { | 139 | public void deactivate() { |
| 140 | + cfgService.removeListener(cfgLister); | ||
| 141 | + controller.getDevices().keySet().forEach(this::deviceRemoved); | ||
| 141 | providerRegistry.unregister(this); | 142 | providerRegistry.unregister(this); |
| 142 | providerService = null; | 143 | providerService = null; |
| 143 | cfgService.unregisterConfigFactory(factory); | 144 | cfgService.unregisterConfigFactory(factory); |
| 144 | - cfgService.removeListener(cfgLister); | ||
| 145 | log.info("Stopped"); | 145 | log.info("Stopped"); |
| 146 | } | 146 | } |
| 147 | 147 | ||
| ... | @@ -195,12 +195,10 @@ public class RestDeviceProvider extends AbstractProvider | ... | @@ -195,12 +195,10 @@ public class RestDeviceProvider extends AbstractProvider |
| 195 | addedDevices.add(deviceId); | 195 | addedDevices.add(deviceId); |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | - //when do I call it ? | 198 | + private void deviceRemoved(DeviceId deviceId) { |
| 199 | - public void deviceRemoved(RestSBDevice nodeId) { | 199 | + Preconditions.checkNotNull(deviceId, ISNOTNULL); |
| 200 | - Preconditions.checkNotNull(nodeId, ISNOTNULL); | ||
| 201 | - DeviceId deviceId = nodeId.deviceId(); | ||
| 202 | providerService.deviceDisconnected(deviceId); | 200 | providerService.deviceDisconnected(deviceId); |
| 203 | - controller.removeDevice(nodeId); | 201 | + controller.removeDevice(deviceId); |
| 204 | } | 202 | } |
| 205 | 203 | ||
| 206 | private void connectDevices() { | 204 | private void connectDevices() { |
| ... | @@ -217,7 +215,7 @@ public class RestDeviceProvider extends AbstractProvider | ... | @@ -217,7 +215,7 @@ public class RestDeviceProvider extends AbstractProvider |
| 217 | deviceAdded(device); | 215 | deviceAdded(device); |
| 218 | }); | 216 | }); |
| 219 | //Removing devices not wanted anymore | 217 | //Removing devices not wanted anymore |
| 220 | - toBeRemoved.stream().forEach(device -> deviceRemoved(device)); | 218 | + toBeRemoved.stream().forEach(device -> deviceRemoved(device.deviceId())); |
| 221 | 219 | ||
| 222 | } | 220 | } |
| 223 | } catch (ConfigException e) { | 221 | } catch (ConfigException e) { | ... | ... |
-
Please register or login to post a comment