X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fconnect%2Fnetconf%2Fsal%2FNetconfDeviceTopologyAdapter.java;h=055beda18493fca129c92e5f256ce9ca344e8e92;hp=24b6205cdc18a8e3fd68ea2065cd72e211ca052d;hb=de65a21905e4bed93d250007ac053bec48a5f35a;hpb=40c2487f8068ee8ba045798d3be716899c77a6e6 diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java index 24b6205cdc..055beda184 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceTopologyAdapter.java @@ -9,6 +9,7 @@ package org.opendaylight.controller.sal.connect.netconf.sal; import com.google.common.base.Function; +import com.google.common.base.Preconditions; import com.google.common.collect.FluentIterable; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.FutureCallback; @@ -16,9 +17,13 @@ import com.google.common.util.concurrent.Futures; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; +import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.TransactionChain; +import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.controller.sal.connect.netconf.listener.NetconfDeviceCapabilities; import org.opendaylight.controller.sal.connect.util.RemoteDeviceId; @@ -68,7 +73,7 @@ final class NetconfDeviceTopologyAdapter implements AutoCloseable { }; private final RemoteDeviceId id; - private final DataBroker dataService; + private final BindingTransactionChain txChain; private final InstanceIdentifier networkTopologyPath; private final KeyedInstanceIdentifier topologyListPath; @@ -76,7 +81,18 @@ final class NetconfDeviceTopologyAdapter implements AutoCloseable { NetconfDeviceTopologyAdapter(final RemoteDeviceId id, final DataBroker dataService) { this.id = id; - this.dataService = dataService; + this.txChain = Preconditions.checkNotNull(dataService).createTransactionChain(new TransactionChainListener() { + @Override + public void onTransactionChainFailed(TransactionChain chain, AsyncTransaction transaction, Throwable cause) { + logger.error("{}: TransactionChain({}) {} FAILED!", id, chain, transaction.getIdentifier(), cause); + throw new IllegalStateException(id + " TransactionChain(" + chain + ") not committed correctly", cause); + } + + @Override + public void onTransactionChainSuccessful(TransactionChain chain) { + logger.trace("{}: TransactionChain({}) {} SUCCESSFUL", id, chain); + } + }); this.networkTopologyPath = InstanceIdentifier.builder(NetworkTopology.class).build(); this.topologyListPath = networkTopologyPath.child(Topology.class, new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName()))); @@ -85,7 +101,7 @@ final class NetconfDeviceTopologyAdapter implements AutoCloseable { } private void initDeviceData() { - final WriteTransaction writeTx = dataService.newWriteOnlyTransaction(); + final WriteTransaction writeTx = txChain.newWriteOnlyTransaction(); createNetworkTopologyIfNotPresent(writeTx); @@ -112,7 +128,7 @@ final class NetconfDeviceTopologyAdapter implements AutoCloseable { public void updateDeviceData(boolean up, NetconfDeviceCapabilities capabilities) { final Node data = buildDataForNetconfNode(up, capabilities); - final WriteTransaction writeTx = dataService.newWriteOnlyTransaction(); + final WriteTransaction writeTx = txChain.newWriteOnlyTransaction(); logger.trace("{}: Update device state transaction {} merging operational data started.", id, writeTx.getIdentifier()); writeTx.put(LogicalDatastoreType.OPERATIONAL, id.getTopologyBindingPath(), data); logger.trace("{}: Update device state transaction {} merging operational data ended.", id, writeTx.getIdentifier()); @@ -126,7 +142,7 @@ final class NetconfDeviceTopologyAdapter implements AutoCloseable { final NetconfNode netconfNode = new NetconfNodeBuilder().setConnectionStatus(ConnectionStatus.UnableToConnect).setConnectedMessage(reason).build(); final Node data = getNodeIdBuilder(id).addAugmentation(NetconfNode.class, netconfNode).build(); - final WriteTransaction writeTx = dataService.newWriteOnlyTransaction(); + final WriteTransaction writeTx = txChain.newWriteOnlyTransaction(); logger.trace("{}: Setting device state as failed {} putting operational data started.", id, writeTx.getIdentifier()); writeTx.put(LogicalDatastoreType.OPERATIONAL, id.getTopologyBindingPath(), data); logger.trace("{}: Setting device state as failed {} putting operational data ended.", id, writeTx.getIdentifier()); @@ -158,7 +174,7 @@ final class NetconfDeviceTopologyAdapter implements AutoCloseable { } public void removeDeviceConfiguration() { - final WriteTransaction writeTx = dataService.newWriteOnlyTransaction(); + final WriteTransaction writeTx = txChain.newWriteOnlyTransaction(); logger.trace("{}: Close device state transaction {} removing all data started.", id, writeTx.getIdentifier()); writeTx.delete(LogicalDatastoreType.CONFIGURATION, id.getTopologyBindingPath()); @@ -214,5 +230,6 @@ final class NetconfDeviceTopologyAdapter implements AutoCloseable { @Override public void close() throws Exception { removeDeviceConfiguration(); + txChain.close(); } }