Add yang generated packages in .gitignore
[groupbasedpolicy.git] / renderers / ofoverlay / src / main / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / endpoint / OfOverlayAug.java
1 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint;
2
3
4 import java.util.concurrent.ExecutionException;
5
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;
27
28 import com.google.common.base.Optional;
29 import com.google.common.base.Preconditions;
30
31 public class OfOverlayAug implements EpRendererAugmentation, AutoCloseable {
32
33     private final static InstanceIdentifier<Nodes> nodesIid = InstanceIdentifier.builder(Nodes.class).build();
34
35     private static final Logger LOG = LoggerFactory.getLogger(OfOverlayAug.class);
36     private final DataBroker dataProvider;
37
38     public OfOverlayAug(DataBroker dataProvider, RpcProviderRegistry rpcRegistry) {
39         this.dataProvider = dataProvider;
40
41         EndpointRpcRegistry.register(this.dataProvider, rpcRegistry, this);
42     }
43
44     @Override
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);
49         if (ictx != null) {
50             return ictx.build();
51         }
52         return null;
53     }
54
55     @Override
56     public Augmentation<EndpointL3> buildEndpointL3Augmentation(RegisterEndpointInput input) {
57         OfOverlayContextBuilder ictx = checkAugmentation(input);
58         if (ictx != null) {
59             return new OfOverlayL3ContextBuilder(ictx.build()).build();
60         }
61         return null;
62     }
63
64     @Override
65     public void buildL3PrefixEndpointAugmentation(EndpointL3PrefixBuilder eb, RegisterL3PrefixEndpointInput input) {
66         // TODO Auto-generated method stub
67
68     }
69
70     private OfOverlayContextBuilder checkAugmentation(RegisterEndpointInput input) {
71         OfOverlayContextInput ictx = input.getAugmentation(OfOverlayContextInput.class);
72         if (ictx == null) {
73             return null;
74         }
75
76         OfOverlayContextBuilder ictxBuilder = new OfOverlayContextBuilder(ictx);
77         if (ictx.getPortName() != null && ictx.getNodeId() != null && ictx.getNodeConnectorId() != null) {
78             return ictxBuilder;
79         }
80
81             /*
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.
84              */
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());
90             }
91         }
92         return ictxBuilder;
93     }
94
95     private NodeInfo fetchAugmentation(String portName) {
96         NodeInfo nodeInfo = null;
97
98         if (dataProvider != null) {
99
100             Optional<Nodes> result;
101             try {
102                 result = dataProvider.newReadOnlyTransaction()
103                         .read(LogicalDatastoreType.OPERATIONAL, nodesIid)
104                         .get();
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);
114                                     found = true;
115                                     break;
116                                 }
117                             }
118                             if (found)
119                                 break;
120                         }
121                     }
122                 }
123             } catch (InterruptedException | ExecutionException e) {
124                 LOG.error("Caught exception in fetchAugmentation portName", e);
125             }
126
127         }
128         return nodeInfo;
129     }
130
131     @Override
132     public void close() throws Exception {
133         EndpointRpcRegistry.unregister(this);
134     }
135
136     /**
137      * A immutable wrapper class around node, nodeConnector info so we can pass a final
138      * object inside OnSuccess anonymous inner class
139      */
140     private static class NodeInfo {
141
142         private NodeConnector nodeConnector;
143         private Node node;
144
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;
149             this.node = node;
150         }
151
152         protected Node getNode() {
153             return this.node;
154         }
155
156         protected NodeConnector getNodeConnector() {
157             return this.nodeConnector;
158         }
159     }
160 }