[ONOS-7566] Implementation of NetconfProxySession
Change-Id: I01cbe0b10ac36cb6db53127555b551f405acdeb1
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 98d135f..80b9108 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
@@ -274,6 +274,8 @@
case STANDBY:
//TODO this issue a warning on the first election/connection
controller.disconnectDevice(deviceId, false);
+ withDeviceLock(
+ () -> initiateConnection(deviceId, newRole), deviceId).run();
providerService.receivedRoleReply(deviceId, newRole, MastershipRole.STANDBY);
//else no-op
break;
@@ -531,6 +533,42 @@
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, cid, true, annotations.build());
}
+ /**
+ * Will appropriately create connections with the device.
+ * For Master role: will create secure transport and proxy sessions.
+ * For Standby role: will create only proxy session and disconnect secure transport session.
+ * For none role: will disconnect all sessions.
+ *
+ * @param deviceId device id
+ * @param newRole new role
+ */
+ private void initiateConnection(DeviceId deviceId, MastershipRole newRole) {
+ try {
+ if (isReachable(deviceId)) {
+ NetconfDevice device = null;
+ if (newRole.equals(MastershipRole.MASTER)) {
+ device = controller.connectDevice(deviceId, true);
+ } else if (newRole.equals(MastershipRole.STANDBY)) {
+ device = controller.connectDevice(deviceId, false);
+ }
+
+ if (device != null) {
+ providerService.receivedRoleReply(deviceId, newRole, newRole);
+ } else {
+ providerService.receivedRoleReply(deviceId, newRole, MastershipRole.NONE);
+ }
+
+ }
+ } catch (Exception e) {
+ if (deviceService.getDevice(deviceId) != null) {
+ providerService.deviceDisconnected(deviceId);
+ }
+ deviceKeyAdminService.removeKey(DeviceKeyId.deviceKeyId(deviceId.toString()));
+ throw new IllegalStateException(new NetconfException(
+ "Can't connect to NETCONF device " + deviceId, e));
+ }
+ }
+
private void discoverOrUpdatePorts(DeviceId deviceId) {
retriedPortDiscoveryMap.put(deviceId, new AtomicInteger(0));