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=5bc790363466de47a6b707715bb25efb5d79fb45;hb=ab3aca4b7ad97b9068a9366653da7de03405232c;hp=b0617cfca91f36a397530f602858a8334580e790;hpb=dd80556b7d2d71f32cb3eeb4ed1489b520535eaf;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 b0617cfca9..5bc7903634 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 @@ -8,21 +8,18 @@ package org.opendaylight.netconf.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; -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.Entry; +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.common.api.CommitInfo; 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; @@ -34,7 +31,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev15 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.UnavailableCapabilities; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.UnavailableCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.unavailable.capabilities.UnavailableCapability; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.unavailable.capabilities.UnavailableCapability.FailureReason; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.unavailable.capabilities.UnavailableCapabilityBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf; @@ -54,17 +50,9 @@ 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); - public static final Function, UnavailableCapability> UNAVAILABLE_CAPABILITY_TRANSFORMER = new Function, UnavailableCapability>() { - @Override - public UnavailableCapability apply(final Entry input) { - return new UnavailableCapabilityBuilder() - .setCapability(input.getKey().toString()) - .setFailureReason(input.getValue()).build(); - } - }; private final RemoteDeviceId id; private BindingTransactionChain txChain; @@ -78,7 +66,8 @@ public final class NetconfDeviceTopologyAdapter implements AutoCloseable { this.txChain = Preconditions.checkNotNull(txChain); this.networkTopologyPath = InstanceIdentifier.builder(NetworkTopology.class).build(); - this.topologyListPath = networkTopologyPath.child(Topology.class, new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName()))); + this.topologyListPath = networkTopologyPath + .child(Topology.class, new TopologyKey(new TopologyId(TopologyNetconf.QNAME.getLocalName()))); initDeviceData(); } @@ -89,7 +78,7 @@ public final class NetconfDeviceTopologyAdapter implements AutoCloseable { createNetworkTopologyIfNotPresent(writeTx); final InstanceIdentifier path = id.getTopologyBindingPath(); - NodeBuilder nodeBuilder = getNodeIdBuilder(id); + final NodeBuilder nodeBuilder = getNodeIdBuilder(id); NetconfNodeBuilder netconfNodeBuilder = new NetconfNodeBuilder(); netconfNodeBuilder.setConnectionStatus(ConnectionStatus.Connecting); netconfNodeBuilder.setHost(id.getHost()); @@ -97,64 +86,60 @@ public final class NetconfDeviceTopologyAdapter implements AutoCloseable { nodeBuilder.addAugmentation(NetconfNode.class, netconfNodeBuilder.build()); Node node = nodeBuilder.build(); - LOG.trace( - "{}: Init device state transaction {} putting if absent operational data started.", + LOG.trace("{}: Init device state transaction {} putting if absent operational data started.", id, writeTx.getIdentifier()); writeTx.put(LogicalDatastoreType.OPERATIONAL, path, node); - LOG.trace( - "{}: Init device state transaction {} putting operational data ended.", - id, writeTx.getIdentifier()); - - LOG.trace( - "{}: Init device state transaction {} putting if absent config data started.", - id, writeTx.getIdentifier()); - LOG.trace( - "{}: Init device state transaction {} putting config data ended.", + LOG.trace("{}: Init device state transaction {} putting operational data ended.", id, writeTx.getIdentifier()); + LOG.trace("{}: Init device state transaction {} putting if absent config data started.", id, writeTx.getIdentifier()); + LOG.trace("{}: Init device state transaction {} putting config data ended.", id, writeTx.getIdentifier()); commitTransaction(writeTx, "init"); } - public void updateDeviceData(boolean up, NetconfDeviceCapabilities capabilities) { + public void updateDeviceData(final boolean up, final NetconfDeviceCapabilities capabilities) { final NetconfNode data = buildDataForNetconfNode(up, capabilities); final WriteTransaction writeTx = txChain.newWriteOnlyTransaction(); - LOG.trace( - "{}: Update device state transaction {} merging operational data started.", + LOG.trace("{}: Update device state transaction {} merging operational data started.", id, writeTx.getIdentifier()); - writeTx.put(LogicalDatastoreType.OPERATIONAL, id.getTopologyBindingPath().augmentation(NetconfNode.class), data, true); - LOG.trace( - "{}: Update device state transaction {} merging operational data ended.", + writeTx.put(LogicalDatastoreType.OPERATIONAL, 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 updateClusteredDeviceData(boolean up, String masterAddress, NetconfDeviceCapabilities capabilities) { + public void updateClusteredDeviceData(final boolean up, final String masterAddress, + final NetconfDeviceCapabilities capabilities) { final NetconfNode data = buildDataForNetconfClusteredNode(up, masterAddress, capabilities); final WriteTransaction writeTx = txChain.newWriteOnlyTransaction(); - LOG.trace( - "{}: Update device state transaction {} merging operational data started.", + LOG.trace("{}: Update device state transaction {} merging operational data started.", id, writeTx.getIdentifier()); - writeTx.put(LogicalDatastoreType.OPERATIONAL, id.getTopologyBindingPath().augmentation(NetconfNode.class), data, true); - LOG.trace( - "{}: Update device state transaction {} merging operational data ended.", + writeTx.put(LogicalDatastoreType.OPERATIONAL, + 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 setDeviceAsFailed(Throwable throwable) { - String reason = (throwable != null && throwable.getMessage() != null) ? throwable.getMessage() : UNKNOWN_REASON; + public void setDeviceAsFailed(final Throwable throwable) { + String reason = throwable != null && throwable.getMessage() != null ? throwable.getMessage() : UNKNOWN_REASON; - final NetconfNode data = new NetconfNodeBuilder().setConnectionStatus(ConnectionStatus.UnableToConnect).setConnectedMessage(reason).build(); + 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(); LOG.trace( "{}: Setting device state as failed {} putting operational data started.", id, writeTx.getIdentifier()); - writeTx.put(LogicalDatastoreType.OPERATIONAL, id.getTopologyBindingPath().augmentation(NetconfNode.class), data, true); + writeTx.put(LogicalDatastoreType.OPERATIONAL, + id.getTopologyBindingPath().augmentation(NetconfNode.class), data, true); LOG.trace( "{}: Setting device state as failed {} putting operational data ended.", id, writeTx.getIdentifier()); @@ -162,7 +147,7 @@ public final class NetconfDeviceTopologyAdapter implements AutoCloseable { commitTransaction(writeTx, "update-failed-device"); } - private NetconfNode buildDataForNetconfNode(boolean up, NetconfDeviceCapabilities capabilities) { + private NetconfNode buildDataForNetconfNode(final boolean up, final NetconfDeviceCapabilities capabilities) { List capabilityList = new ArrayList<>(); capabilityList.addAll(capabilities.getNonModuleBasedCapabilities()); capabilityList.addAll(capabilities.getResolvedCapabilities()); @@ -170,44 +155,42 @@ public final class NetconfDeviceTopologyAdapter implements AutoCloseable { final AvailableCapabilitiesBuilder avCapabalitiesBuilder = new AvailableCapabilitiesBuilder(); avCapabalitiesBuilder.setAvailableCapability(capabilityList); - final UnavailableCapabilities unavailableCapabilities = - new UnavailableCapabilitiesBuilder().setUnavailableCapability(FluentIterable.from(capabilities.getUnresolvedCapabilites().entrySet()) - .transform(UNAVAILABLE_CAPABILITY_TRANSFORMER).toList()).build(); - 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); + .setUnavailableCapabilities(unavailableCapabilities(capabilities.getUnresolvedCapabilites())); return netconfNodeBuilder.build(); } - private NetconfNode buildDataForNetconfClusteredNode(boolean up, String masterNodeAddress, NetconfDeviceCapabilities capabilities) { + private NetconfNode buildDataForNetconfClusteredNode(final boolean up, final String masterNodeAddress, + final NetconfDeviceCapabilities capabilities) { List capabilityList = new ArrayList<>(); capabilityList.addAll(capabilities.getNonModuleBasedCapabilities()); capabilityList.addAll(capabilities.getResolvedCapabilities()); final AvailableCapabilitiesBuilder avCapabalitiesBuilder = new AvailableCapabilitiesBuilder(); avCapabalitiesBuilder.setAvailableCapability(capabilityList); - final UnavailableCapabilities unavailableCapabilities = - new UnavailableCapabilitiesBuilder().setUnavailableCapability(capabilities.getUnresolvedCapabilites() - .entrySet().stream().map(UNAVAILABLE_CAPABILITY_TRANSFORMER::apply) - .collect(Collectors.toList())).build(); - 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) + .setUnavailableCapabilities(unavailableCapabilities(capabilities.getUnresolvedCapabilites())) .setClusteredConnectionStatus( new ClusteredConnectionStatusBuilder().setNetconfMasterNode(masterNodeAddress).build()); return netconfNodeBuilder.build(); } + private static UnavailableCapabilities unavailableCapabilities(final Map input) { + return new UnavailableCapabilitiesBuilder().setUnavailableCapability(input.entrySet().stream().map( + e -> new UnavailableCapabilityBuilder().setCapability(e.getKey().toString()).setFailureReason( + e.getValue()).build()).collect(Collectors.toList())).build(); + } + public void removeDeviceConfiguration() { final WriteTransaction writeTx = txChain.newWriteOnlyTransaction(); @@ -220,7 +203,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); @@ -231,54 +214,49 @@ public final class NetconfDeviceTopologyAdapter implements AutoCloseable { final NetworkTopology networkTopology = new NetworkTopologyBuilder().build(); LOG.trace("{}: Merging {} container to ensure its presence", id, - networkTopology.QNAME, writeTx.getIdentifier()); + NetworkTopology.QNAME, writeTx.getIdentifier()); writeTx.merge(LogicalDatastoreType.OPERATIONAL, networkTopologyPath, networkTopology); - final Topology topology = new TopologyBuilder().setTopologyId(new TopologyId(TopologyNetconf.QNAME.getLocalName())).build(); + 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()); + Topology.QNAME, writeTx.getIdentifier()); 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()); } @Override - public void onFailure(final Throwable t) { + public void onFailure(final Throwable throwable) { LOG.error("{}: Transaction({}) {} FAILED!", id, txType, - transaction.getIdentifier(), t); - throw new IllegalStateException(id + " Transaction(" + txType + ") not committed correctly", t); + transaction.getIdentifier(), throwable); + 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(BindingTransactionChain txChain) { + public void setTxChain(final BindingTransactionChain txChain) { this.txChain = Preconditions.checkNotNull(txChain); } }