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
50 public class NodeMapping {
52 public static val MD_SAL_TYPE = "MD_SAL";
53 private static val NODE_CLASS = org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
54 private static val NODECONNECTOR_CLASS = org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
58 throw new UnsupportedOperationException("Utility class. Instantiation is not allowed.");
61 public static def toADNode(InstanceIdentifier<?> node) throws ConstructionException {
62 return new Node(MD_SAL_TYPE, node.toNodeId.toADNodeId);
65 public static def toNodeId(InstanceIdentifier<?> node) {
67 checkNotNull(node.getPath());
68 checkArgument(node.getPath().size() >= 2);
69 val arg = node.getPath().get(1);
70 val item = arg.checkInstanceOf(IdentifiableItem);
71 val nodeKey = item.getKey().checkInstanceOf(NodeKey);
75 public static def toADNodeId(NodeId nodeId) {
81 public static def toADNodeConnector(NodeConnectorRef source) throws ConstructionException {
83 val InstanceIdentifier<?> path = checkNotNull(source.getValue());
84 val node = path.toADNode();
85 checkArgument(path.path.size() >= 3);
86 val arg = path.getPath().get(2);
87 val item = arg.checkInstanceOf(IdentifiableItem);
88 val connectorKey = item.getKey().checkInstanceOf(NodeConnectorKey);
89 return new NodeConnector(connectorKey.id.toNodeConnectorType(path.toNodeId), connectorKey.id.toADNodeConnectorId(path.toNodeId), node);
92 public static def toNodeConnectorType(NodeConnectorId ncId,NodeId nodeId) {
93 if (ncId.equals(nodeId.toLocalNodeConnectorId)) {
94 return NodeConnector.NodeConnectorIDType.SWSTACK
95 } else if (ncId.equals(nodeId.toNormalNodeConnectorId)) {
96 return NodeConnector.NodeConnectorIDType.HWPATH
97 } else if (ncId.equals(nodeId.toControllerNodeConnectorId)){
98 return NodeConnector.NodeConnectorIDType.CONTROLLER
103 public static def toADNodeConnectorId(NodeConnectorId nodeConnectorId,NodeId nodeId) {
104 if(nodeConnectorId.equals(nodeId.toLocalNodeConnectorId) ||
105 nodeConnectorId.equals(nodeId.toNormalNodeConnectorId) ||
106 nodeConnectorId.equals(nodeId.toControllerNodeConnectorId)
108 return NodeConnector.SPECIALNODECONNECTORID
110 return nodeConnectorId.value
113 public static def toControllerNodeConnectorId(NodeId node) {
114 return new NodeConnectorId(node.value + ":" + 4294967293L)
116 public static def toLocalNodeConnectorId(NodeId node) {
117 return new NodeConnectorId(node.value + ":" + 4294967294L)
119 public static def toNormalNodeConnectorId(NodeId node) {
120 return new NodeConnectorId(node.value + ":" + 4294967290L)
123 public static def toNodeRef(Node node) {
124 checkArgument(MD_SAL_TYPE.equals(node.getType()));
125 var nodeId = node.ID.checkInstanceOf(String)
126 val nodeKey = new NodeKey(new NodeId(nodeId));
127 val nodePath = InstanceIdentifier.builder().node(Nodes).child(NODE_CLASS, nodeKey).toInstance();
128 return new NodeRef(nodePath);
131 public static def toNodeConnectorRef(NodeConnector nodeConnector) {
132 val node = nodeConnector.node.toNodeRef();
133 val nodePath = node.getValue() as InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node>
134 var NodeConnectorId nodeConnectorId
135 if(nodeConnector.ID.equals(NodeConnector.SPECIALNODECONNECTORID)){
136 if(nodeConnector.type.equals(NodeConnector.NodeConnectorIDType.SWSTACK)) {
137 nodeConnectorId = nodePath.toNodeId.toLocalNodeConnectorId
138 } else if (nodeConnector.type.equals(NodeConnector.NodeConnectorIDType.HWPATH)) {
139 nodeConnectorId = nodePath.toNodeId.toNormalNodeConnectorId
140 } else if (nodeConnector.type.equals(NodeConnector.NodeConnectorIDType.CONTROLLER)) {
141 nodeConnectorId = nodePath.toNodeId.toControllerNodeConnectorId
144 nodeConnectorId = new NodeConnectorId(nodeConnector.ID.checkInstanceOf(String))
146 val connectorKey = new NodeConnectorKey(nodeConnectorId);
147 val path = InstanceIdentifier.builder(nodePath).child(NODECONNECTOR_CLASS, connectorKey).toInstance();
148 return new NodeConnectorRef(path);
151 public static def toADNode(NodeRef node) throws ConstructionException {
152 return toADNode(node.getValue());
155 public static def toADNodeConnectorProperties(NodeConnectorUpdated nc) {
156 val props = new HashSet<org.opendaylight.controller.sal.core.Property>();
157 val fcncu = nc.getAugmentation(FlowCapableNodeConnectorUpdated)
159 if(fcncu.currentFeature != null && fcncu.currentFeature.toAdBandwidth != null) {
160 props.add(fcncu.currentFeature.toAdBandwidth)
162 if(fcncu.advertisedFeatures != null && fcncu.advertisedFeatures.toAdAdvertizedBandwidth != null) {
163 props.add(fcncu.advertisedFeatures.toAdAdvertizedBandwidth)
165 if(fcncu.supported != null && fcncu.supported.toAdSupportedBandwidth != null) {
166 props.add(fcncu.supported.toAdSupportedBandwidth)
168 if(fcncu.peerFeatures != null && fcncu.peerFeatures.toAdPeerBandwidth != null) {
169 props.add(fcncu.peerFeatures.toAdPeerBandwidth)
171 if(fcncu.name != null && fcncu.name.toAdName != null) {
172 props.add(fcncu.name.toAdName)
174 if(fcncu.configuration != null && fcncu.configuration.toAdConfig != null) {
175 props.add(fcncu.configuration.toAdConfig)
177 if(fcncu.state != null && fcncu.state.toAdState != null) {
178 props.add(fcncu.state.toAdState)
184 public static def toAdName(String name) {
185 return new Name(name)
188 public static def toAdConfig(PortConfig pc) {
191 config = new Config(Config.ADMIN_DOWN)
193 config = new Config(Config.ADMIN_UP)
198 public static def toAdState(State s) {
199 var org.opendaylight.controller.sal.core.State state
201 state = new org.opendaylight.controller.sal.core.State(org.opendaylight.controller.sal.core.State.EDGE_DOWN)
203 state = new org.opendaylight.controller.sal.core.State(org.opendaylight.controller.sal.core.State.EDGE_UP)
208 public static def toAdBandwidth(PortFeatures pf) {
209 var Bandwidth bw = null
210 if (pf.is_10mbHd || pf.is_10mbFd ) {
211 bw= new Bandwidth(Bandwidth.BW10Mbps)
212 } else if (pf.is_100mbHd || pf.is_100mbFd ) {
213 bw= new Bandwidth(Bandwidth.BW100Mbps)
214 } else if (pf.is_1gbHd || pf.is_1gbFd ) {
215 bw= new Bandwidth(Bandwidth.BW1Gbps)
216 } else if (pf.is_1gbFd ) {
217 bw= new Bandwidth(Bandwidth.BW10Gbps)
218 } else if ( pf.is_10gbFd ) {
219 bw= new Bandwidth(Bandwidth.BW10Gbps)
220 } else if ( pf.is_40gbFd ) {
221 bw= new Bandwidth(Bandwidth.BW40Gbps)
222 } else if ( pf.is_100gbFd ) {
223 bw= new Bandwidth(Bandwidth.BW100Gbps)
224 } else if ( pf.is_1tbFd ) {
225 bw= new Bandwidth(Bandwidth.BW1Tbps)
230 public static def toAdAdvertizedBandwidth(PortFeatures pf) {
231 var AdvertisedBandwidth abw
232 val bw = pf.toAdBandwidth
234 abw = new AdvertisedBandwidth(bw.value)
239 public static def toAdSupportedBandwidth(PortFeatures pf) {
240 var SupportedBandwidth sbw
241 val bw = pf.toAdBandwidth
243 sbw = new SupportedBandwidth(bw.value)
248 public static def toAdPeerBandwidth(PortFeatures pf) {
249 var PeerBandwidth pbw
250 val bw = pf.toAdBandwidth
252 pbw = new PeerBandwidth(bw.value)
257 public static def toADNodeProperties(NodeUpdated nu) {
258 val props = new HashSet<org.opendaylight.controller.sal.core.Property>();
259 val fcnu = nu.getAugmentation(FlowCapableNodeUpdated)
261 props.add(toADTimestamp)
262 // props.add(fcnu.supportedActions.toADActions) - TODO
264 props.add(nu.id.toADMacAddress)
266 if(fcnu.switchFeatures != null) {
267 if(fcnu.switchFeatures.maxTables != null) {
268 props.add(fcnu.switchFeatures.maxTables.toADTables)
270 if(fcnu.switchFeatures.capabilities != null) {
271 props.add(fcnu.switchFeatures.capabilities.toADCapabiliities)
273 if(fcnu.switchFeatures.maxBuffers != null) {
274 props.add(fcnu.switchFeatures.maxBuffers.toADBuffers)
282 public static def toADTimestamp() {
283 val date = new Date();
284 val timestamp = new TimeStamp(date.time,"connectedSince")
288 public static def toADMacAddress(NodeId id) {
289 return new MacAddress(Long.parseLong(id.value.replaceAll("openflow:","")).longValue.bytesFromDpid)
292 public static def toADTables(Short tables) {
293 return new Tables(tables.byteValue)
296 public static def toADCapabiliities(List<Class<? extends FeatureCapability>> capabilities) {
298 for(capability : capabilities) {
299 if(capability.equals(FlowFeatureCapabilityFlowStats)) {
300 b = Capabilities.CapabilitiesType.FLOW_STATS_CAPABILITY.value.bitwiseOr(b)
301 } else if (capability.equals(FlowFeatureCapabilityTableStats)) {
302 b = Capabilities.CapabilitiesType.TABLE_STATS_CAPABILITY.value.bitwiseOr(b)
303 } else if (capability.equals(FlowFeatureCapabilityPortStats)) {
304 b = Capabilities.CapabilitiesType.PORT_STATS_CAPABILITY.value.bitwiseOr(b)
305 } else if (capability.equals(FlowFeatureCapabilityStp)) {
306 b = Capabilities.CapabilitiesType.STP_CAPABILITY.value.bitwiseOr(b)
307 } else if (capability.equals(FlowFeatureCapabilityIpReasm)) {
308 b = Capabilities.CapabilitiesType.IP_REASSEM_CAPABILITY.value.bitwiseOr(b)
309 } else if (capability.equals(FlowFeatureCapabilityQueueStats)) {
310 b = Capabilities.CapabilitiesType.QUEUE_STATS_CAPABILITY.value.bitwiseOr(b)
311 } else if (capability.equals(FlowFeatureCapabilityArpMatchIp)) {
312 b = Capabilities.CapabilitiesType.ARP_MATCH_IP_CAPABILITY.value.bitwiseOr(b)
315 return new Capabilities(b)
318 public static def toADBuffers(Long buffers) {
319 return new Buffers(buffers.intValue)