Attempt netconf remount regardless of error-type
[netconf.git] / netconf / sal-netconf-connector / src / main / java / org / opendaylight / netconf / sal / connect / netconf / sal / NetconfDeviceTopologyAdapter.java
index 5bc790363466de47a6b707715bb25efb5d79fb45..202517fb14d5c98b9950f016dacac6d6190ab494 100644 (file)
@@ -5,7 +5,6 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netconf.sal.connect.netconf.sal;
 
 import com.google.common.base.Preconditions;
@@ -16,10 +15,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
-import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.mdsal.binding.api.TransactionChain;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCapabilities;
 import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
@@ -55,13 +54,13 @@ public class NetconfDeviceTopologyAdapter implements AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(NetconfDeviceTopologyAdapter.class);
 
     private final RemoteDeviceId id;
-    private BindingTransactionChain txChain;
+    private TransactionChain txChain;
 
     private final InstanceIdentifier<NetworkTopology> networkTopologyPath;
     private final KeyedInstanceIdentifier<Topology, TopologyKey> topologyListPath;
     private static final String UNKNOWN_REASON = "Unknown reason";
 
-    NetconfDeviceTopologyAdapter(final RemoteDeviceId id, final BindingTransactionChain txChain) {
+    NetconfDeviceTopologyAdapter(final RemoteDeviceId id, final TransactionChain txChain) {
         this.id = id;
         this.txChain = Preconditions.checkNotNull(txChain);
 
@@ -97,20 +96,30 @@ public class NetconfDeviceTopologyAdapter implements AutoCloseable {
         commitTransaction(writeTx, "init");
     }
 
-    public void updateDeviceData(final boolean up, final NetconfDeviceCapabilities capabilities) {
-        final NetconfNode data = buildDataForNetconfNode(up, capabilities);
+    public void updateDeviceData(final ConnectionStatus connectionStatus,
+            final NetconfDeviceCapabilities capabilities, final LogicalDatastoreType dsType, final NetconfNode node) {
+        NetconfNode data;
+        if (node != null && dsType == LogicalDatastoreType.CONFIGURATION) {
+            data = node;
+        } else {
+            data = buildDataForNetconfNode(connectionStatus, capabilities, dsType, node);
+        }
 
         final WriteTransaction writeTx = txChain.newWriteOnlyTransaction();
         LOG.trace("{}: Update device state transaction {} merging operational data started.",
                 id, writeTx.getIdentifier());
-        writeTx.put(LogicalDatastoreType.OPERATIONAL, id.getTopologyBindingPath().augmentation(NetconfNode.class),
-            data, true);
+        writeTx.put(dsType, id.getTopologyBindingPath().augmentation(NetconfNode.class), data, true);
         LOG.trace("{}: Update device state transaction {} merging operational data ended.",
                 id, writeTx.getIdentifier());
 
         commitTransaction(writeTx, "update");
     }
 
+    public void updateDeviceData(final boolean up, final NetconfDeviceCapabilities capabilities) {
+        updateDeviceData(up ? ConnectionStatus.Connected : ConnectionStatus.Connecting, capabilities,
+                LogicalDatastoreType.OPERATIONAL, null);
+    }
+
     public void updateClusteredDeviceData(final boolean up, final String masterAddress,
                                           final NetconfDeviceCapabilities capabilities) {
         final NetconfNode data = buildDataForNetconfClusteredNode(up, masterAddress, capabilities);
@@ -147,7 +156,8 @@ public class NetconfDeviceTopologyAdapter implements AutoCloseable {
         commitTransaction(writeTx, "update-failed-device");
     }
 
-    private NetconfNode buildDataForNetconfNode(final boolean up, final NetconfDeviceCapabilities capabilities) {
+    private NetconfNode buildDataForNetconfNode(final ConnectionStatus connectionStatus,
+            final NetconfDeviceCapabilities capabilities, final LogicalDatastoreType dsType, final NetconfNode node) {
         List<AvailableCapability> capabilityList = new ArrayList<>();
         capabilityList.addAll(capabilities.getNonModuleBasedCapabilities());
         capabilityList.addAll(capabilities.getResolvedCapabilities());
@@ -155,14 +165,13 @@ public class NetconfDeviceTopologyAdapter implements AutoCloseable {
         final AvailableCapabilitiesBuilder avCapabalitiesBuilder = new AvailableCapabilitiesBuilder();
         avCapabalitiesBuilder.setAvailableCapability(capabilityList);
 
-        final NetconfNodeBuilder netconfNodeBuilder = new NetconfNodeBuilder()
-                .setHost(id.getHost())
-                .setPort(new PortNumber(id.getAddress().getPort()))
-                .setConnectionStatus(up ? ConnectionStatus.Connected : ConnectionStatus.Connecting)
-                .setAvailableCapabilities(avCapabalitiesBuilder.build())
-                .setUnavailableCapabilities(unavailableCapabilities(capabilities.getUnresolvedCapabilites()));
-
-        return netconfNodeBuilder.build();
+        return new NetconfNodeBuilder()
+            .setHost(id.getHost())
+            .setPort(new PortNumber(id.getAddress().getPort()))
+            .setConnectionStatus(connectionStatus)
+            .setAvailableCapabilities(avCapabalitiesBuilder.build())
+            .setUnavailableCapabilities(unavailableCapabilities(capabilities.getUnresolvedCapabilites()))
+            .build();
     }
 
     private NetconfNode buildDataForNetconfClusteredNode(final boolean up, final String masterNodeAddress,
@@ -213,14 +222,14 @@ public class NetconfDeviceTopologyAdapter implements AutoCloseable {
     private void createNetworkTopologyIfNotPresent(final WriteTransaction writeTx) {
 
         final NetworkTopology networkTopology = new NetworkTopologyBuilder().build();
-        LOG.trace("{}: Merging {} container to ensure its presence", id,
-                NetworkTopology.QNAME, writeTx.getIdentifier());
+        LOG.trace("{}: Transaction {} merging {} container to ensure its presence", id, writeTx.getIdentifier(),
+            NetworkTopology.QNAME);
         writeTx.merge(LogicalDatastoreType.OPERATIONAL, networkTopologyPath, networkTopology);
 
         final Topology topology =
                 new TopologyBuilder().setTopologyId(new TopologyId(TopologyNetconf.QNAME.getLocalName())).build();
-        LOG.trace("{}: Merging {} container to ensure its presence", id,
-                Topology.QNAME, writeTx.getIdentifier());
+        LOG.trace("{}: Transaction {} merging {} container to ensure its presence", id, writeTx.getIdentifier(),
+                Topology.QNAME);
         writeTx.merge(LogicalDatastoreType.OPERATIONAL, topologyListPath, topology);
     }
 
@@ -256,7 +265,7 @@ public class NetconfDeviceTopologyAdapter implements AutoCloseable {
         removeDeviceConfiguration();
     }
 
-    public void setTxChain(final BindingTransactionChain txChain) {
+    public void setTxChain(final TransactionChain txChain) {
         this.txChain = Preconditions.checkNotNull(txChain);
     }
 }