X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Fconnect%2Fnetconf%2Fsal%2FNetconfDeviceTopologyAdapter.java;h=202517fb14d5c98b9950f016dacac6d6190ab494;hb=33d6351332b51e2cfd454daf673c7663b03f096c;hp=7667ba28bcb924a904175e9e32fd3e7dbebead17;hpb=96583b31d8ce418f8209a308fc6d94f606795ed3;p=netconf.git diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java index 7667ba28bc..202517fb14 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java @@ -5,22 +5,20 @@ * 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; -import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.MoreExecutors; import java.util.ArrayList; 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.controller.md.sal.common.api.data.TransactionCommitFailedException; +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; @@ -51,18 +49,18 @@ import org.opendaylight.yangtools.yang.common.QName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public final class NetconfDeviceTopologyAdapter implements AutoCloseable { +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 networkTopologyPath; private final KeyedInstanceIdentifier 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); @@ -98,20 +96,30 @@ public final 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); @@ -131,6 +139,8 @@ public final class NetconfDeviceTopologyAdapter implements AutoCloseable { String reason = throwable != null && throwable.getMessage() != null ? throwable.getMessage() : UNKNOWN_REASON; final NetconfNode data = new NetconfNodeBuilder() + .setHost(id.getHost()) + .setPort(new PortNumber(id.getAddress().getPort())) .setConnectionStatus(ConnectionStatus.UnableToConnect).setConnectedMessage(reason).build(); final WriteTransaction writeTx = txChain.newWriteOnlyTransaction(); @@ -146,7 +156,8 @@ public final 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 capabilityList = new ArrayList<>(); capabilityList.addAll(capabilities.getNonModuleBasedCapabilities()); capabilityList.addAll(capabilities.getResolvedCapabilities()); @@ -154,14 +165,13 @@ public final 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, @@ -202,7 +212,7 @@ public final class NetconfDeviceTopologyAdapter implements AutoCloseable { id, writeTx.getIdentifier()); try { - writeTx.submit().get(); + writeTx.commit().get(); } catch (InterruptedException | ExecutionException e) { LOG.error("{}: Transaction(close) {} FAILED!", id, writeTx.getIdentifier(), e); throw new IllegalStateException(id + " Transaction(close) not committed correctly", e); @@ -212,25 +222,24 @@ public final 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); } private void commitTransaction(final WriteTransaction transaction, final String txType) { LOG.trace("{}: Committing Transaction {}:{}", id, txType, transaction.getIdentifier()); - final CheckedFuture result = transaction.submit(); - Futures.addCallback(result, new FutureCallback() { + transaction.commit().addCallback(new FutureCallback() { @Override - public void onSuccess(final Void result) { + public void onSuccess(final CommitInfo result) { LOG.trace("{}: Transaction({}) {} SUCCESSFUL", id, txType, transaction.getIdentifier()); } @@ -242,27 +251,21 @@ public final class NetconfDeviceTopologyAdapter implements AutoCloseable { throw new IllegalStateException( id + " Transaction(" + txType + ") not committed correctly", throwable); } - }); - - } - - private static Node getNodeWithId(final RemoteDeviceId id) { - final NodeBuilder builder = getNodeIdBuilder(id); - return builder.build(); + }, MoreExecutors.directExecutor()); } private static NodeBuilder getNodeIdBuilder(final RemoteDeviceId id) { final NodeBuilder nodeBuilder = new NodeBuilder(); - nodeBuilder.setKey(new NodeKey(new NodeId(id.getName()))); + nodeBuilder.withKey(new NodeKey(new NodeId(id.getName()))); return nodeBuilder; } @Override - public void close() throws Exception { + public void close() { removeDeviceConfiguration(); } - public void setTxChain(final BindingTransactionChain txChain) { + public void setTxChain(final TransactionChain txChain) { this.txChain = Preconditions.checkNotNull(txChain); } }