4ad91c26779dcdfdb451200636c958ca3d4ae027
[controller.git] / opendaylight / md-sal / compatibility / sal-compatibility / src / main / java / org / opendaylight / controller / sal / compatibility / NodeMapping.xtend
1 package org.opendaylight.controller.sal.compatibility
2
3 import org.opendaylight.controller.sal.core.Node
4 import org.opendaylight.controller.sal.core.NodeConnector
5 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey
6 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem
7
8 import static com.google.common.base.Preconditions.*;
9 import static extension org.opendaylight.controller.sal.common.util.Arguments.*;
10 import static extension org.opendaylight.controller.sal.compatibility.ToSalConversionsUtils.*;
11
12 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey
16 import org.opendaylight.controller.sal.core.ConstructionException
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures
23 import org.opendaylight.controller.sal.core.Bandwidth
24 import org.opendaylight.controller.sal.core.AdvertisedBandwidth
25 import org.opendaylight.controller.sal.core.SupportedBandwidth
26 import org.opendaylight.controller.sal.core.PeerBandwidth
27 import org.opendaylight.controller.sal.core.Name
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig
29 import org.opendaylight.controller.sal.core.Config
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.State
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated
32 import java.util.HashSet
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated
34 import org.opendaylight.controller.sal.core.Tables
35 import java.util.List
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FeatureCapability
37 import org.opendaylight.controller.sal.core.Buffers
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowFeatureCapabilityFlowStats
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowFeatureCapabilityTableStats
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowFeatureCapabilityIpReasm
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowFeatureCapabilityPortStats
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowFeatureCapabilityStp
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowFeatureCapabilityQueueStats
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowFeatureCapabilityArpMatchIp
45 import org.opendaylight.controller.sal.core.Capabilities
46 import org.opendaylight.controller.sal.core.MacAddress
47 import java.util.Date
48 import org.opendaylight.controller.sal.core.TimeStamp
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowNodeConnector
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowNode
51
52 public class NodeMapping {
53
54     public static val MD_SAL_TYPE = "MD_SAL";
55     private static val NODE_CLASS = org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
56     private static val NODECONNECTOR_CLASS = org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.
57         NodeConnector;
58
59     private new() {
60         throw new UnsupportedOperationException("Utility class. Instantiation is not allowed.");
61     }
62
63     public static def toADNode(InstanceIdentifier<?> node) throws ConstructionException {
64         return node.toNodeId.toADNode
65     }
66
67     public static def toADNode(NodeId id) {
68         return new Node(MD_SAL_TYPE, id.toADNodeId);
69     }
70
71     public static def toNodeId(InstanceIdentifier<?> node) {
72         checkNotNull(node);
73         checkNotNull(node.getPath());
74         checkArgument(node.getPath().size() >= 2);
75         val arg = node.getPath().get(1);
76         val item = arg.checkInstanceOf(IdentifiableItem);
77         val nodeKey = item.getKey().checkInstanceOf(NodeKey);
78         return nodeKey.id
79     }
80
81     public static def toADNodeId(NodeId nodeId) {
82         checkNotNull(nodeId);
83         return nodeId.value
84     }
85
86     public static def toADNodeConnector(NodeConnectorRef source) throws ConstructionException {
87         checkNotNull(source);
88         val InstanceIdentifier<?> path = checkNotNull(source.getValue());
89         checkArgument(path.path.size() >= 3);
90         val arg = path.getPath().get(2);
91         val item = arg.checkInstanceOf(IdentifiableItem);
92         val connectorKey = item.getKey().checkInstanceOf(NodeConnectorKey);
93         return connectorKey.id.toADNodeConnector(path.toNodeId)
94     }
95     
96     public static def toADNodeConnector(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId ncid,
97         org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId nid) {
98             return new NodeConnector(ncid.toNodeConnectorType(nid),
99             ncid.toADNodeConnectorId(nid), nid.toADNode);
100      }
101
102     public static def toNodeConnectorType(NodeConnectorId ncId, NodeId nodeId) {
103         if (ncId.equals(nodeId.toLocalNodeConnectorId)) {
104             return NodeConnector.NodeConnectorIDType.SWSTACK
105         } else if (ncId.equals(nodeId.toNormalNodeConnectorId)) {
106             return NodeConnector.NodeConnectorIDType.HWPATH
107         } else if (ncId.equals(nodeId.toControllerNodeConnectorId)) {
108             return NodeConnector.NodeConnectorIDType.CONTROLLER
109         }
110         return MD_SAL_TYPE
111     }
112
113     public static def toADNodeConnectorId(NodeConnectorId nodeConnectorId, NodeId nodeId) {
114         if (nodeConnectorId.equals(nodeId.toLocalNodeConnectorId) ||
115             nodeConnectorId.equals(nodeId.toNormalNodeConnectorId) ||
116             nodeConnectorId.equals(nodeId.toControllerNodeConnectorId)) {
117             return NodeConnector.SPECIALNODECONNECTORID
118         }
119         return nodeConnectorId.value
120     }
121
122     public static def toControllerNodeConnectorId(NodeId node) {
123         return new NodeConnectorId(node.value + ":" + 4294967293L)
124     }
125
126     public static def toLocalNodeConnectorId(NodeId node) {
127         return new NodeConnectorId(node.value + ":" + 4294967294L)
128     }
129
130     public static def toNormalNodeConnectorId(NodeId node) {
131         return new NodeConnectorId(node.value + ":" + 4294967290L)
132     }
133
134     public static def toNodeRef(Node node) {
135         checkArgument(MD_SAL_TYPE.equals(node.getType()));
136         var nodeId = node.ID.checkInstanceOf(String)
137         val nodeKey = new NodeKey(new NodeId(nodeId));
138         val nodePath = InstanceIdentifier.builder().node(Nodes).child(NODE_CLASS, nodeKey).toInstance();
139         return new NodeRef(nodePath);
140     }
141
142     public static def toNodeConnectorRef(NodeConnector nodeConnector) {
143         val node = nodeConnector.node.toNodeRef();
144         val nodePath = node.getValue() as InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node>
145         var NodeConnectorId nodeConnectorId
146         if (nodeConnector.ID.equals(NodeConnector.SPECIALNODECONNECTORID)) {
147             if (nodeConnector.type.equals(NodeConnector.NodeConnectorIDType.SWSTACK)) {
148                 nodeConnectorId = nodePath.toNodeId.toLocalNodeConnectorId
149             } else if (nodeConnector.type.equals(NodeConnector.NodeConnectorIDType.HWPATH)) {
150                 nodeConnectorId = nodePath.toNodeId.toNormalNodeConnectorId
151             } else if (nodeConnector.type.equals(NodeConnector.NodeConnectorIDType.CONTROLLER)) {
152                 nodeConnectorId = nodePath.toNodeId.toControllerNodeConnectorId
153             }
154         } else {
155             nodeConnectorId = new NodeConnectorId(nodeConnector.ID.checkInstanceOf(String))
156         }
157         val connectorKey = new NodeConnectorKey(nodeConnectorId);
158         val path = InstanceIdentifier.builder(nodePath).child(NODECONNECTOR_CLASS, connectorKey).toInstance();
159         return new NodeConnectorRef(path);
160     }
161
162     public static def toADNode(NodeRef node) throws ConstructionException {
163         return toADNode(node.getValue());
164     }
165
166     public static def toADNodeConnectorProperties(NodeConnectorUpdated nc) {
167         val fcncu = nc.getAugmentation(FlowCapableNodeConnectorUpdated)
168         if (fcncu != null) {
169             return fcncu.toADNodeConnectorProperties
170         }
171         return new HashSet<org.opendaylight.controller.sal.core.Property>();
172     }
173
174     public static def toADNodeConnectorProperties(FlowNodeConnector fcncu) {
175         val props = new HashSet<org.opendaylight.controller.sal.core.Property>();
176         if (fcncu != null) {
177             if (fcncu.currentFeature != null && fcncu.currentFeature.toAdBandwidth != null) {
178                 props.add(fcncu.currentFeature.toAdBandwidth)
179             }
180             if (fcncu.advertisedFeatures != null && fcncu.advertisedFeatures.toAdAdvertizedBandwidth != null) {
181                 props.add(fcncu.advertisedFeatures.toAdAdvertizedBandwidth)
182             }
183             if (fcncu.supported != null && fcncu.supported.toAdSupportedBandwidth != null) {
184                 props.add(fcncu.supported.toAdSupportedBandwidth)
185             }
186             if (fcncu.peerFeatures != null && fcncu.peerFeatures.toAdPeerBandwidth != null) {
187                 props.add(fcncu.peerFeatures.toAdPeerBandwidth)
188             }
189             if (fcncu.name != null && fcncu.name.toAdName != null) {
190                 props.add(fcncu.name.toAdName)
191             }
192             if (fcncu.configuration != null && fcncu.configuration.toAdConfig != null) {
193                 props.add(fcncu.configuration.toAdConfig)
194             }
195             if (fcncu.state != null && fcncu.state.toAdState != null) {
196                 props.add(fcncu.state.toAdState)
197             }
198         }
199         return props
200     }
201
202     public static def toAdName(String name) {
203         return new Name(name)
204     }
205
206     public static def toAdConfig(PortConfig pc) {
207         var Config config;
208         if (pc.PORTDOWN) {
209             config = new Config(Config.ADMIN_DOWN)
210         } else {
211             config = new Config(Config.ADMIN_UP)
212         }
213         return config
214     }
215
216     public static def toAdState(State s) {
217         var org.opendaylight.controller.sal.core.State state
218         if (s.linkDown) {
219             state = new org.opendaylight.controller.sal.core.State(org.opendaylight.controller.sal.core.State.EDGE_DOWN)
220         } else {
221             state = new org.opendaylight.controller.sal.core.State(org.opendaylight.controller.sal.core.State.EDGE_UP)
222         }
223         return state
224     }
225
226     public static def toAdBandwidth(PortFeatures pf) {
227         var Bandwidth bw = null
228         if (pf.is_10mbHd || pf.is_10mbFd) {
229             bw = new Bandwidth(Bandwidth.BW10Mbps)
230         } else if (pf.is_100mbHd || pf.is_100mbFd) {
231             bw = new Bandwidth(Bandwidth.BW100Mbps)
232         } else if (pf.is_1gbHd || pf.is_1gbFd) {
233             bw = new Bandwidth(Bandwidth.BW1Gbps)
234         } else if (pf.is_1gbFd) {
235             bw = new Bandwidth(Bandwidth.BW10Gbps)
236         } else if (pf.is_10gbFd) {
237             bw = new Bandwidth(Bandwidth.BW10Gbps)
238         } else if (pf.is_40gbFd) {
239             bw = new Bandwidth(Bandwidth.BW40Gbps)
240         } else if (pf.is_100gbFd) {
241             bw = new Bandwidth(Bandwidth.BW100Gbps)
242         } else if (pf.is_1tbFd) {
243             bw = new Bandwidth(Bandwidth.BW1Tbps)
244         }
245         return bw;
246     }
247
248     public static def toAdAdvertizedBandwidth(PortFeatures pf) {
249         var AdvertisedBandwidth abw
250         val bw = pf.toAdBandwidth
251         if (bw != null) {
252             abw = new AdvertisedBandwidth(bw.value)
253         }
254         return abw
255     }
256
257     public static def toAdSupportedBandwidth(PortFeatures pf) {
258         var SupportedBandwidth sbw
259         val bw = pf.toAdBandwidth
260         if (bw != null) {
261             sbw = new SupportedBandwidth(bw.value)
262         }
263         return sbw
264     }
265
266     public static def toAdPeerBandwidth(PortFeatures pf) {
267         var PeerBandwidth pbw
268         val bw = pf.toAdBandwidth
269         if (bw != null) {
270             pbw = new PeerBandwidth(bw.value)
271         }
272         return pbw
273     }
274
275     public static def toADNodeProperties(NodeUpdated nu) {
276         val fcnu = nu.getAugmentation(FlowCapableNodeUpdated)
277         if (fcnu != null) {
278             return fcnu.toADNodeProperties(nu.id)
279         }
280         return new HashSet<org.opendaylight.controller.sal.core.Property>();
281
282     }
283
284     public static def toADNodeProperties(FlowNode fcnu, NodeId id) {
285         val props = new HashSet<org.opendaylight.controller.sal.core.Property>();
286         if (fcnu != null) {
287             props.add(toADTimestamp)
288
289             // props.add(fcnu.supportedActions.toADActions) - TODO
290             if (id != null) {
291                 props.add(id.toADMacAddress)
292             }
293             if (fcnu.switchFeatures != null) {
294                 if (fcnu.switchFeatures.maxTables != null) {
295                     props.add(fcnu.switchFeatures.maxTables.toADTables)
296                 }
297                 if (fcnu.switchFeatures.capabilities != null) {
298                     props.add(fcnu.switchFeatures.capabilities.toADCapabiliities)
299                 }
300                 if (fcnu.switchFeatures.maxBuffers != null) {
301                     props.add(fcnu.switchFeatures.maxBuffers.toADBuffers)
302                 }
303             }
304         }
305         return props;
306     }
307
308     public static def toADTimestamp() {
309         val date = new Date();
310         val timestamp = new TimeStamp(date.time, "connectedSince")
311         return timestamp;
312     }
313
314     public static def toADMacAddress(NodeId id) {
315         return new MacAddress(Long.parseLong(id.value.replaceAll("openflow:", "")).longValue.bytesFromDpid)
316     }
317
318     public static def toADTables(Short tables) {
319         return new Tables(tables.byteValue)
320     }
321
322     public static def toADCapabiliities(List<Class<? extends FeatureCapability>> capabilities) {
323         var int b
324         for (capability : capabilities) {
325             if (capability.equals(FlowFeatureCapabilityFlowStats)) {
326                 b = Capabilities.CapabilitiesType.FLOW_STATS_CAPABILITY.value.bitwiseOr(b)
327             } else if (capability.equals(FlowFeatureCapabilityTableStats)) {
328                 b = Capabilities.CapabilitiesType.TABLE_STATS_CAPABILITY.value.bitwiseOr(b)
329             } else if (capability.equals(FlowFeatureCapabilityPortStats)) {
330                 b = Capabilities.CapabilitiesType.PORT_STATS_CAPABILITY.value.bitwiseOr(b)
331             } else if (capability.equals(FlowFeatureCapabilityStp)) {
332                 b = Capabilities.CapabilitiesType.STP_CAPABILITY.value.bitwiseOr(b)
333             } else if (capability.equals(FlowFeatureCapabilityIpReasm)) {
334                 b = Capabilities.CapabilitiesType.IP_REASSEM_CAPABILITY.value.bitwiseOr(b)
335             } else if (capability.equals(FlowFeatureCapabilityQueueStats)) {
336                 b = Capabilities.CapabilitiesType.QUEUE_STATS_CAPABILITY.value.bitwiseOr(b)
337             } else if (capability.equals(FlowFeatureCapabilityArpMatchIp)) {
338                 b = Capabilities.CapabilitiesType.ARP_MATCH_IP_CAPABILITY.value.bitwiseOr(b)
339             }
340         }
341         return new Capabilities(b)
342     }
343
344     public static def toADBuffers(Long buffers) {
345         return new Buffers(buffers.intValue)
346     }
347
348 }