2 * Copyright (c) 2016 Cisco Systems Inc and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.unimgr.utils;
11 import com.google.common.base.Optional;
12 import com.google.common.util.concurrent.CheckedFuture;
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
17 import org.opendaylight.yang.gen.v1.urn.onf.core.network.module.rev160630.g_forwardingconstruct.FcPort;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
29 import java.util.function.BiFunction;
32 public class CapabilitiesService {
34 public interface Capability<T> {
40 BiFunction<DataBroker, T, Boolean> getCondition();
43 public interface Context<T> {
44 boolean isSupporting(Capability<T> capability);
47 public static class NodeContext implements Context<Node> {
48 public enum NodeCapability implements Capability<Node> {
49 NETCONF((dbBroker, node) -> node.getAugmentation(NetconfNode.class) != null),
50 NETCONF_CISCO_IOX_L2VPN((dbBroker, node) ->
51 checkForNetconfCapability(node,NetconfConstants.CAPABILITY_IOX_L2VPN)),
52 NETCONF_CISCO_IOX_IFMGR((dbBroker, node) ->
53 checkForNetconfCapability(node,NetconfConstants.CAPABILITY_IOX_IFMGR)),
54 NETCONF_CISCO_IOX_POLICYMGR((dbBroker, node) ->
55 checkForNetconfCapability(node,NetconfConstants.CAPABILITY_IOX_ASR9K_POLICYMGR)),
56 OVSDB((dbBroker,node) -> node.getAugmentation(OvsdbBridgeAugmentation.class) != null);
58 private BiFunction<DataBroker, Node, Boolean> condition;
60 NodeCapability(BiFunction<DataBroker, Node, Boolean> condition) {
61 this.condition = condition;
65 public BiFunction<DataBroker, Node, Boolean> getCondition() {
69 private static boolean checkForNetconfCapability(Node node, String netconf_capability){
70 return node.getAugmentation(NetconfNode.class)
71 .getAvailableCapabilities()
72 .getAvailableCapability()
74 .anyMatch(capability -> capability.getCapability().equals(netconf_capability));
78 private CapabilitiesService service;
80 private Optional<Node> nodeOpt;
82 NodeContext(CapabilitiesService service, Optional<Node> nodeOpt) {
83 this.service = service;
84 this.nodeOpt = nodeOpt;
87 public Optional<Node> getNode() {
91 public boolean isSupporting(Capability<Node> capability) {
92 if (!nodeOpt.isPresent()) {
96 return service.checkCondition(capability, nodeOpt.get());
99 public boolean isSupporting(Capability.Mode mode, Capability<Node>... capabilities) {
100 boolean result = (mode == Capability.Mode.AND);
102 for (Capability capability : capabilities) {
103 boolean isSupporting = isSupporting(capability);
104 result = (mode == Capability.Mode.AND ? result && isSupporting: result || isSupporting);
106 if(result ^ (mode == Capability.Mode.AND)) {
115 private static final Logger LOG = LoggerFactory.getLogger(CapabilitiesService.class);
117 private DataBroker dataBroker;
119 public CapabilitiesService(DataBroker dataBroker) {
120 this.dataBroker = dataBroker;
123 public NodeContext node(Node node) {
124 return new NodeContext(this, Optional.of(node));
127 public NodeContext nodeByPort(FcPort port) {
128 return new NodeContext(this, readNode(port));
131 private Optional<Node> readNode(FcPort port) {
132 InstanceIdentifier<Node> nodeIid = InstanceIdentifier.builder(NetworkTopology.class)
133 .child(Topology.class, new TopologyKey(port.getTopology()))
134 .child(Node.class, new NodeKey(port.getNode()))
137 final ReadTransaction tx = dataBroker.newReadOnlyTransaction();
138 final CheckedFuture<Optional<Node>, ReadFailedException> nodeFuture = tx.read(LogicalDatastoreType.OPERATIONAL, nodeIid);
139 Optional<Node> result = Optional.absent();
142 result = nodeFuture.checkedGet();
143 } catch (final ReadFailedException e) {
144 LOG.error("Unable to read node with Iid {}", nodeIid, e);
150 private <T> boolean checkCondition(Capability<T> capability, T data) {
151 return capability.getCondition().apply(dataBroker, data);