import static org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus.Connecting;
import static org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus.UnableToConnect;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
-import com.google.common.base.Optional;
-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.ListenableFuture;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.MountPoint;
import org.opendaylight.controller.md.sal.binding.api.MountPointService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionParameters;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilities;
+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.available.capabilities.AvailableCapabilityBuilder;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.base.Optional;
+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.ListenableFuture;
+
public class NodeManager {
private static final TopologyId TOPOLOGY_ID = new TopologyId("topology-netconf");
private static final Logger LOG = LoggerFactory.getLogger(NodeManager.class);
private final DataBroker dataBroker;
private final MountPointService mountService;
- private final List<String> requiredCapabilities;
+ private final List<AvailableCapability> requiredCapabilities;
public NodeManager(final DataBroker dataBroker, final BindingAwareBroker.ProviderContext session) {
this.dataBroker = Preconditions.checkNotNull(dataBroker);
return true;
}
- private boolean capabilityCheck(final List<String> capabilities) {
- for (String requiredCapability : requiredCapabilities) {
+ private boolean capabilityCheck(final List<AvailableCapability> capabilities) {
+ for (AvailableCapability requiredCapability : requiredCapabilities) {
if (!capabilities.contains(requiredCapability)) {
return false;
}
return netconfNode;
}
- private class RequiredCapabilities {
+ private static class RequiredCapabilities {
- private static final String NED = "(urn:ios?revision=2016-03-08)ned";
- private static final String TAILF_COMMON = "(http://tail-f.com/yang/common?revision=2015-05-22)tailf-common";
- private static final String TAILF_CLI_EXTENSION = "(http://tail-f.com/yang/common?revision=2015-03-19)tailf-cli-extensions";
- private static final String TAILF_META_EXTENSION = "(http://tail-f.com/yang/common?revision=2013-11-07)tailf-meta-extensions";
- private static final String IETF_YANG_TYPES = "(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types";
- private static final String IETF_INET_TYPES = "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types";
+ private static final AvailableCapability NED =
+ new AvailableCapabilityBuilder().setCapability("(urn:ios?revision=2016-03-08)ned").build();
+ private static final AvailableCapability TAILF_COMMON = new AvailableCapabilityBuilder()
+ .setCapability("(http://tail-f.com/yang/common?revision=2015-05-22)tailf-common").build();
+ private static final AvailableCapability TAILF_CLI_EXTENSION = new AvailableCapabilityBuilder()
+ .setCapability("(http://tail-f.com/yang/common?revision=2015-03-19)tailf-cli-extensions").build();
+ private static final AvailableCapability TAILF_META_EXTENSION = new AvailableCapabilityBuilder()
+ .setCapability("(http://tail-f.com/yang/common?revision=2013-11-07)tailf-meta-extensions").build();
+ private static final AvailableCapability IETF_YANG_TYPES = new AvailableCapabilityBuilder()
+ .setCapability("(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types").build();
+ private static final AvailableCapability IETF_INET_TYPES = new AvailableCapabilityBuilder()
+ .setCapability("(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types").build();
/**
* Initialize all common capabilities required by IOS-XE renderer. Any connected node is examined whether it's
*
* @return list of string representations of required capabilities
*/
- List<String> initializeRequiredCapabilities() {
- final String capabilityEntries[] = {NED, TAILF_COMMON, TAILF_CLI_EXTENSION, TAILF_META_EXTENSION,
+ List<AvailableCapability> initializeRequiredCapabilities() {
+ final AvailableCapability capabilityEntries[] = {NED, TAILF_COMMON, TAILF_CLI_EXTENSION, TAILF_META_EXTENSION,
IETF_YANG_TYPES, IETF_INET_TYPES};
return Arrays.asList(capabilityEntries);
}
import static org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus.Connecting;
import static org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus.UnableToConnect;
-import javax.annotation.Nonnull;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import com.google.common.base.Optional;
-import com.google.common.util.concurrent.CheckedFuture;
+
+import javax.annotation.Nonnull;
+
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilities;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilitiesBuilder;
+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.available.capabilities.AvailableCapabilityBuilder;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+
public class NodeManagerTest extends CustomDataBrokerTest {
}
private AvailableCapabilities partialCapabilities() {
- final String c1 = "(urn:ios?revision=2016-03-08)ned";
- final String c2 = "(http://tail-f.com/yang/common?revision=2015-05-22)tailf-common";
- final String c3 = "(http://tail-f.com/yang/common?revision=2015-03-19)tailf-cli-extensions";
- String[] capabilityList = {c1, c2, c3};
+ final AvailableCapability c1 = new AvailableCapabilityBuilder()
+ .setCapability("(urn:ios?revision=2016-03-08)ned")
+ .build();
+ final AvailableCapability c2 = new AvailableCapabilityBuilder()
+ .setCapability("(http://tail-f.com/yang/common?revision=2015-05-22)tailf-common")
+ .build();
+ final AvailableCapability c3 = new AvailableCapabilityBuilder()
+ .setCapability("(http://tail-f.com/yang/common?revision=2015-03-19)tailf-cli-extensions")
+ .build();
+ AvailableCapability[] capabilityList = {c1, c2, c3};
AvailableCapabilitiesBuilder availableCapabilitiesBuilder = new AvailableCapabilitiesBuilder();
availableCapabilitiesBuilder.setAvailableCapability(Arrays.asList(capabilityList));
return availableCapabilitiesBuilder.build();
}
private AvailableCapabilities fullCapabilities() {
- final String c1 = "(urn:ios?revision=2016-03-08)ned";
- final String c2 = "(http://tail-f.com/yang/common?revision=2015-05-22)tailf-common";
- final String c3 = "(http://tail-f.com/yang/common?revision=2015-03-19)tailf-cli-extensions";
- final String c4 = "(http://tail-f.com/yang/common?revision=2013-11-07)tailf-meta-extensions";
- final String c5 = "(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types";
- final String c6 = "(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types";
- String[] capabilityList = {c1, c2, c3, c4, c5, c6};
+ final AvailableCapability c1 = new AvailableCapabilityBuilder()
+ .setCapability("(urn:ios?revision=2016-03-08)ned")
+ .build();
+ final AvailableCapability c2 = new AvailableCapabilityBuilder()
+ .setCapability("(http://tail-f.com/yang/common?revision=2015-05-22)tailf-common")
+ .build();
+ final AvailableCapability c3 = new AvailableCapabilityBuilder()
+ .setCapability("(http://tail-f.com/yang/common?revision=2015-03-19)tailf-cli-extensions")
+ .build();
+ final AvailableCapability c4 = new AvailableCapabilityBuilder()
+ .setCapability("(http://tail-f.com/yang/common?revision=2013-11-07)tailf-meta-extensions")
+ .build();
+ final AvailableCapability c5 = new AvailableCapabilityBuilder()
+ .setCapability("(urn:ietf:params:xml:ns:yang:ietf-yang-types?revision=2013-07-15)ietf-yang-types")
+ .build();
+ final AvailableCapability c6 = new AvailableCapabilityBuilder()
+ .setCapability("(urn:ietf:params:xml:ns:yang:ietf-inet-types?revision=2013-07-15)ietf-inet-types")
+ .build();
+ AvailableCapability[] capabilityList = {c1, c2, c3, c4, c5, c6};
AvailableCapabilitiesBuilder availableCapabilitiesBuilder = new AvailableCapabilitiesBuilder();
availableCapabilitiesBuilder.setAvailableCapability(Arrays.asList(capabilityList));
return availableCapabilitiesBuilder.build();
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNodeKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
+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.available.capabilities.AvailableCapabilityBuilder;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
private static final TopologyId TOPOLOGY_ID = new TopologyId("topology-netconf");
private static final Logger LOG = LoggerFactory.getLogger(VppNodeManager.class);
private static final Map<InstanceIdentifier<Node>, DataBroker> netconfNodeCache = new HashMap<>();
- private static final String V3PO_CAPABILITY = "(urn:opendaylight:params:xml:ns:yang:v3po?revision=2016-12-14)v3po";
- private static final String INTERFACES_CAPABILITY =
- "(urn:ietf:params:xml:ns:yang:ietf-interfaces?revision=2014-05-08)ietf-interfaces";
+ private static final AvailableCapability V3PO_CAPABILITY = new AvailableCapabilityBuilder()
+ .setCapability("(urn:opendaylight:params:xml:ns:yang:v3po?revision=2016-12-14)v3po").build();
+ private static final AvailableCapability INTERFACES_CAPABILITY = new AvailableCapabilityBuilder()
+ .setCapability("(urn:ietf:params:xml:ns:yang:ietf-interfaces?revision=2014-05-08)ietf-interfaces").build();
private static final NodeId CONTROLLER_CONFIG_NODE = new NodeId("controller-config");
private final DataBroker dataBroker;
private final MountPointService mountService;
- private final List<String> requiredCapabilities;
+ private final List<AvailableCapability> requiredCapabilities;
public VppNodeManager(DataBroker dataBroker, BindingAwareBroker.ProviderContext session) {
this.dataBroker = Preconditions.checkNotNull(dataBroker);
return true;
}
- private boolean capabilityCheck(final List<String> capabilities) {
- for (String requiredCapability : requiredCapabilities) {
+ private boolean capabilityCheck(final List<AvailableCapability> capabilities) {
+ for (AvailableCapability requiredCapability : requiredCapabilities) {
if (!capabilities.contains(requiredCapability)) {
return false;
}
*
* @return list of string representations of required capabilities
*/
- private List<String> initializeRequiredCapabilities() {
+ private List<AvailableCapability> initializeRequiredCapabilities() {
// Required device capabilities
- String[] capabilityEntries = {V3PO_CAPABILITY, INTERFACES_CAPABILITY};
+ AvailableCapability[] capabilityEntries = {V3PO_CAPABILITY, INTERFACES_CAPABILITY};
return Arrays.asList(capabilityEntries);
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilitiesBuilder;
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.available.capabilities.AvailableCapabilityBuilder;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
Host host = new Host(new IpAddress(new Ipv4Address("192.168.255.101")));
PortNumber portNumber = new PortNumber(2830);
- List<String> avaibleCapabilitiesList = new ArrayList<>();
- avaibleCapabilitiesList.add(V3PO_CAPABILITY);
- avaibleCapabilitiesList.add(INTERFACES_CAPABILITY);
+ List<AvailableCapability> avaibleCapabilitiesList = new ArrayList<>();
+ avaibleCapabilitiesList.add(new AvailableCapabilityBuilder().setCapability(V3PO_CAPABILITY).build());
+ avaibleCapabilitiesList.add(new AvailableCapabilityBuilder().setCapability(INTERFACES_CAPABILITY).build());
NetconfNode netconfNode = new NetconfNodeBuilder().setHost(host)
.setPort(portNumber)
}
@Test
- public void connectNode() throws ReadFailedException {
+ public void connectNode() throws Exception {
WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
Node testVppNode = createNode(NODE_NAME, NetconfNodeConnectionStatus.ConnectionStatus.Connected);
writeTransaction.put(LogicalDatastoreType.OPERATIONAL, NODE_IID, testVppNode, true);
- writeTransaction.submit();
+ writeTransaction.submit().get();
ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
CheckedFuture<Optional<Renderer>, ReadFailedException> future =
}
@Test
- public void disconnectNode() throws ReadFailedException, InterruptedException {
+ public void disconnectNode() throws Exception {
WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
Node testVppNode = createNode(NODE_NAME, NetconfNodeConnectionStatus.ConnectionStatus.Connected);
writeTransaction.put(LogicalDatastoreType.OPERATIONAL, NODE_IID, testVppNode, true);
- writeTransaction.submit();
+ writeTransaction.submit().get();
ReadOnlyTransaction readOnlyTransaction = dataBroker.newReadOnlyTransaction();
CheckedFuture<Optional<Renderer>, ReadFailedException> future =