1 package org.opendaylight.controller.sal.compatibility
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
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.*;
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
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
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
52 public class NodeMapping {
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.
60 throw new UnsupportedOperationException("Utility class. Instantiation is not allowed.");
63 public static def toADNode(InstanceIdentifier<?> node) throws ConstructionException {
64 return node.toNodeId.toADNode
67 public static def toADNode(NodeId id) {
68 return new Node(MD_SAL_TYPE, id.toADNodeId);
71 public static def toNodeId(InstanceIdentifier<?> 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);
81 public static def toADNodeId(NodeId nodeId) {
86 public static def toADNodeConnector(NodeConnectorRef source) throws ConstructionException {
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)
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);
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
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
119 return nodeConnectorId.value
122 public static def toControllerNodeConnectorId(NodeId node) {
123 return new NodeConnectorId(node.value + ":" + 4294967293L)
126 public static def toLocalNodeConnectorId(NodeId node) {
127 return new NodeConnectorId(node.value + ":" + 4294967294L)
130 public static def toNormalNodeConnectorId(NodeId node) {
131 return new NodeConnectorId(node.value + ":" + 4294967290L)
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);
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
155 nodeConnectorId = new NodeConnectorId(nodeConnector.ID.checkInstanceOf(String))
157 val connectorKey = new NodeConnectorKey(nodeConnectorId);
158 val path = InstanceIdentifier.builder(nodePath).child(NODECONNECTOR_CLASS, connectorKey).toInstance();
159 return new NodeConnectorRef(path);
162 public static def toADNode(NodeRef node) throws ConstructionException {
163 return toADNode(node.getValue());
166 public static def toADNodeConnectorProperties(NodeConnectorUpdated nc) {
167 val fcncu = nc.getAugmentation(FlowCapableNodeConnectorUpdated)
169 return fcncu.toADNodeConnectorProperties
171 return new HashSet<org.opendaylight.controller.sal.core.Property>();
174 public static def toADNodeConnectorProperties(FlowNodeConnector fcncu) {
175 val props = new HashSet<org.opendaylight.controller.sal.core.Property>();
177 if (fcncu.currentFeature != null && fcncu.currentFeature.toAdBandwidth != null) {
178 props.add(fcncu.currentFeature.toAdBandwidth)
180 if (fcncu.advertisedFeatures != null && fcncu.advertisedFeatures.toAdAdvertizedBandwidth != null) {
181 props.add(fcncu.advertisedFeatures.toAdAdvertizedBandwidth)
183 if (fcncu.supported != null && fcncu.supported.toAdSupportedBandwidth != null) {
184 props.add(fcncu.supported.toAdSupportedBandwidth)
186 if (fcncu.peerFeatures != null && fcncu.peerFeatures.toAdPeerBandwidth != null) {
187 props.add(fcncu.peerFeatures.toAdPeerBandwidth)
189 if (fcncu.name != null && fcncu.name.toAdName != null) {
190 props.add(fcncu.name.toAdName)
192 if (fcncu.configuration != null && fcncu.configuration.toAdConfig != null) {
193 props.add(fcncu.configuration.toAdConfig)
195 if (fcncu.state != null && fcncu.state.toAdState != null) {
196 props.add(fcncu.state.toAdState)
202 public static def toAdName(String name) {
203 return new Name(name)
206 public static def toAdConfig(PortConfig pc) {
209 config = new Config(Config.ADMIN_DOWN)
211 config = new Config(Config.ADMIN_UP)
216 public static def toAdState(State s) {
217 var org.opendaylight.controller.sal.core.State state
219 state = new org.opendaylight.controller.sal.core.State(org.opendaylight.controller.sal.core.State.EDGE_DOWN)
221 state = new org.opendaylight.controller.sal.core.State(org.opendaylight.controller.sal.core.State.EDGE_UP)
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)
248 public static def toAdAdvertizedBandwidth(PortFeatures pf) {
249 var AdvertisedBandwidth abw
250 val bw = pf.toAdBandwidth
252 abw = new AdvertisedBandwidth(bw.value)
257 public static def toAdSupportedBandwidth(PortFeatures pf) {
258 var SupportedBandwidth sbw
259 val bw = pf.toAdBandwidth
261 sbw = new SupportedBandwidth(bw.value)
266 public static def toAdPeerBandwidth(PortFeatures pf) {
267 var PeerBandwidth pbw
268 val bw = pf.toAdBandwidth
270 pbw = new PeerBandwidth(bw.value)
275 public static def toADNodeProperties(NodeUpdated nu) {
276 val fcnu = nu.getAugmentation(FlowCapableNodeUpdated)
278 return fcnu.toADNodeProperties(nu.id)
280 return new HashSet<org.opendaylight.controller.sal.core.Property>();
284 public static def toADNodeProperties(FlowNode fcnu, NodeId id) {
285 val props = new HashSet<org.opendaylight.controller.sal.core.Property>();
287 props.add(toADTimestamp)
289 // props.add(fcnu.supportedActions.toADActions) - TODO
291 props.add(id.toADMacAddress)
293 if (fcnu.switchFeatures != null) {
294 if (fcnu.switchFeatures.maxTables != null) {
295 props.add(fcnu.switchFeatures.maxTables.toADTables)
297 if (fcnu.switchFeatures.capabilities != null) {
298 props.add(fcnu.switchFeatures.capabilities.toADCapabiliities)
300 if (fcnu.switchFeatures.maxBuffers != null) {
301 props.add(fcnu.switchFeatures.maxBuffers.toADBuffers)
308 public static def toADTimestamp() {
309 val date = new Date();
310 val timestamp = new TimeStamp(date.time, "connectedSince")
314 public static def toADMacAddress(NodeId id) {
315 return new MacAddress(Long.parseLong(id.value.replaceAll("openflow:", "")).longValue.bytesFromDpid)
318 public static def toADTables(Short tables) {
319 return new Tables(tables.byteValue)
322 public static def toADCapabiliities(List<Class<? extends FeatureCapability>> capabilities) {
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)
341 return new Capabilities(b)
344 public static def toADBuffers(Long buffers) {
345 return new Buffers(buffers.intValue)