1 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint;
4 import java.util.concurrent.ExecutionException;
6 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
7 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
8 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
9 import org.opendaylight.groupbasedpolicy.endpoint.EndpointRpcRegistry;
10 import org.opendaylight.groupbasedpolicy.endpoint.EpRendererAugmentation;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterL3PrefixEndpointInput;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3PrefixBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextInput;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayL3ContextBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
23 import org.opendaylight.yangtools.yang.binding.Augmentation;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
28 import com.google.common.base.Optional;
29 import com.google.common.base.Preconditions;
31 public class OfOverlayAug implements EpRendererAugmentation, AutoCloseable {
33 private final static InstanceIdentifier<Nodes> nodesIid = InstanceIdentifier.builder(Nodes.class).build();
35 private static final Logger LOG = LoggerFactory.getLogger(OfOverlayAug.class);
36 private final DataBroker dataProvider;
38 public OfOverlayAug(DataBroker dataProvider, RpcProviderRegistry rpcRegistry) {
39 this.dataProvider = dataProvider;
41 EndpointRpcRegistry.register(this.dataProvider, rpcRegistry, this);
45 public Augmentation<Endpoint> buildEndpointAugmentation(RegisterEndpointInput input) {
46 // In order to support both the port-name and the data-path information, allow
47 // an EP to register without the augmentations, and resolve later.
48 OfOverlayContextBuilder ictx = checkAugmentation(input);
56 public Augmentation<EndpointL3> buildEndpointL3Augmentation(RegisterEndpointInput input) {
57 OfOverlayContextBuilder ictx = checkAugmentation(input);
59 return new OfOverlayL3ContextBuilder(ictx.build()).build();
65 public void buildL3PrefixEndpointAugmentation(EndpointL3PrefixBuilder eb, RegisterL3PrefixEndpointInput input) {
66 // TODO Auto-generated method stub
70 private OfOverlayContextBuilder checkAugmentation(RegisterEndpointInput input) {
71 OfOverlayContextInput ictx = input.getAugmentation(OfOverlayContextInput.class);
76 OfOverlayContextBuilder ictxBuilder = new OfOverlayContextBuilder(ictx);
77 if (ictx.getPortName() != null && ictx.getNodeId() != null && ictx.getNodeConnectorId() != null) {
82 * In the case where they've provided just the port name, go see if
83 * we can find the NodeId and NodeConnectorId from inventory.
85 if (ictx.getPortName() != null) {
86 NodeInfo augmentation = fetchAugmentation(ictx.getPortName().getValue());
87 if (augmentation != null) {
88 ictxBuilder.setNodeId(augmentation.getNode().getId());
89 ictxBuilder.setNodeConnectorId(augmentation.getNodeConnector().getId());
95 private NodeInfo fetchAugmentation(String portName) {
96 NodeInfo nodeInfo = null;
98 if (dataProvider != null) {
100 Optional<Nodes> result;
102 result = dataProvider.newReadOnlyTransaction()
103 .read(LogicalDatastoreType.OPERATIONAL, nodesIid)
105 if (result.isPresent()) {
106 Nodes nodes = result.get();
107 for (Node node : nodes.getNode()) {
108 if (node.getNodeConnector() != null) {
109 boolean found = false;
110 for (NodeConnector nc : node.getNodeConnector()) {
111 FlowCapableNodeConnector fcnc = nc.getAugmentation(FlowCapableNodeConnector.class);
112 if (fcnc.getName().equals(portName)) {
113 nodeInfo = new NodeInfo(nc, node);
123 } catch (InterruptedException | ExecutionException e) {
124 LOG.error("Caught exception in fetchAugmentation portName", e);
132 public void close() throws Exception {
133 EndpointRpcRegistry.unregister(this);
137 * A immutable wrapper class around node, nodeConnector info so we can pass a final
138 * object inside OnSuccess anonymous inner class
140 private static class NodeInfo {
142 private NodeConnector nodeConnector;
145 protected NodeInfo(NodeConnector nc, Node node) {
146 Preconditions.checkNotNull(nc, "Node connector cannot be null");
147 Preconditions.checkNotNull(node, "Node cannot be null");
148 this.nodeConnector = nc;
152 protected Node getNode() {
156 protected NodeConnector getNodeConnector() {
157 return this.nodeConnector;