Added Compatibility for Switch Manager and Topology Manager
[controller.git] / opendaylight / md-sal / compatibility / sal-compatibility / src / main / java / org / opendaylight / controller / sal / compatibility / FromSalConversionsUtils.java
diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FromSalConversionsUtils.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FromSalConversionsUtils.java
new file mode 100644 (file)
index 0000000..a31d8e2
--- /dev/null
@@ -0,0 +1,379 @@
+package org.opendaylight.controller.sal.compatibility;
+
+import static org.opendaylight.controller.sal.match.MatchType.DL_DST;
+import static org.opendaylight.controller.sal.match.MatchType.DL_SRC;
+import static org.opendaylight.controller.sal.match.MatchType.DL_TYPE;
+
+import java.math.BigInteger;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.opendaylight.controller.sal.compatibility.MDFlowMapping;
+import org.opendaylight.controller.sal.core.NodeConnector;
+
+
+
+import org.opendaylight.controller.sal.match.Match;
+import org.opendaylight.controller.sal.match.MatchField;
+import org.opendaylight.controller.sal.match.MatchType;
+import org.opendaylight.controller.sal.utils.NetUtils;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
+import com.google.common.net.InetAddresses;
+import static org.opendaylight.controller.sal.compatibility.NodeMapping.*;
+import static org.opendaylight.controller.sal.compatibility.ProtocolConstants.*;
+
+public class FromSalConversionsUtils {
+
+    private FromSalConversionsUtils() {
+
+    }
+
+    public static GetNodeConnectorStatisticsInput nodeConnectorStatistics(
+            NodeConnector connector) {
+        GetNodeConnectorStatisticsInputBuilder target = new GetNodeConnectorStatisticsInputBuilder();
+
+        NodeRef nodeRef = toNodeRef(connector.getNode());
+        target.setNode(nodeRef);
+
+        NodeConnectorRef nodeConnectorRef = toNodeConnectorRef(connector);
+        target.setNodeConnector(nodeConnectorRef);
+
+        return target.build();
+    }
+
+    private static Address addressFromAction(InetAddress inetAddress) {
+        String strInetAddresss = InetAddresses.toAddrString(inetAddress);
+        if (inetAddress instanceof Inet4Address) {
+            Ipv4Builder ipv4Builder = new Ipv4Builder();
+            ipv4Builder.setIpv4Address(new Ipv4Prefix(strInetAddresss));
+            return ipv4Builder.build();
+        } else if (inetAddress instanceof Inet6Address) {
+            Ipv6Builder ipv6Builder = new Ipv6Builder();
+            ipv6Builder.setIpv6Address(new Ipv6Prefix(strInetAddresss));
+            return ipv6Builder.build();
+        }
+        return null;
+    }
+
+    public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match toMatch(
+            Match sourceMatch) {
+        if (sourceMatch != null) {
+            MatchBuilder targetBuilder = new MatchBuilder();
+
+            targetBuilder.setEthernetMatch(ethernetMatch(sourceMatch));
+            targetBuilder.setIpMatch(ipMatch(sourceMatch));
+            targetBuilder.setVlanMatch(vlanMatch(sourceMatch));
+            targetBuilder.setLayer3Match(layer3Match(sourceMatch));
+            targetBuilder.setLayer4Match(layer4Match(sourceMatch));
+
+            return targetBuilder.build();
+        }
+        return null;
+
+    }
+
+    private static Layer4Match layer4Match(final Match sourceMatch) {
+        MatchField nwProto = sourceMatch.getField(MatchType.NW_PROTO);
+        Short nwProtocolSource = null;
+        if (nwProto != null && nwProto.getValue() != null) {
+            nwProtocolSource = (short) ((byte) nwProto.getValue());
+            switch (nwProtocolSource) {
+            case TCP:
+                return Layer4MatchAsTcp(sourceMatch);
+            case UDP:
+                return Layer4MatchAsUdp(sourceMatch);
+            case SCTP:
+                return Layer4MatchAsSctp(sourceMatch);
+            }
+        }
+        return null;
+    }
+
+    private static Layer4Match Layer4MatchAsSctp(final Match sourceMatch) {
+        SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
+
+        Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
+        Integer destinationPort = transportPort(sourceMatch,
+                MatchType.TP_DST);
+
+        if (sourcePort != null) {
+            sctpMatchBuilder.setSctpSourcePort(new PortNumber(sourcePort));
+        }
+        if (destinationPort != null) {
+            sctpMatchBuilder.setSctpDestinationPort(new PortNumber(
+                    destinationPort));
+        }
+
+        return sctpMatchBuilder.build();
+    }
+
+    private static Layer4Match Layer4MatchAsUdp(final Match sourceMatch) {
+        UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
+
+        Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
+        Integer destinationPort = transportPort(sourceMatch,
+                MatchType.TP_DST);
+
+        if (sourcePort != null) {
+            udpMatchBuilder.setUdpSourcePort(new PortNumber(sourcePort));
+        }
+
+        if (destinationPort != null) {
+            udpMatchBuilder.setUdpDestinationPort(new PortNumber(
+                    destinationPort));
+        }
+
+        return udpMatchBuilder.build();
+    }
+
+    private static Layer4Match Layer4MatchAsTcp(final Match sourceMatch) {
+        TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
+
+        Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
+        Integer destinationPort = transportPort(sourceMatch,
+                MatchType.TP_DST);
+
+        if (sourcePort != null) {
+            tcpMatchBuilder.setTcpSourcePort(new PortNumber(sourcePort));
+        }
+        if (destinationPort != null) {
+            tcpMatchBuilder.setTcpDestinationPort(new PortNumber(
+                    destinationPort));
+        }
+
+        return tcpMatchBuilder.build();
+    }
+
+    private static Integer transportPort(final Match sourceMatch,
+            final MatchType matchType) {
+        MatchField transportPort = sourceMatch.getField(matchType);
+        if (transportPort != null && transportPort.getValue() != null
+                && transportPort.getValue().getClass().equals(Short.class)) {
+            return new Integer(NetUtils.getUnsignedShort((short) transportPort
+                    .getValue()));
+        }
+        return null;
+    }
+
+    private static VlanMatch vlanMatch(final Match sourceMatch) {
+        VlanMatchBuilder vlanMatchBuild = new VlanMatchBuilder();
+
+        MatchField vlan = sourceMatch.getField(MatchType.DL_VLAN);
+        if (vlan != null && vlan.getValue() != null) {
+            VlanIdBuilder vlanIDBuilder = new VlanIdBuilder();
+            vlanIDBuilder.setVlanId(new VlanId((int) (NetUtils
+                    .getUnsignedShort((short) vlan.getValue()))));
+            vlanMatchBuild.setVlanId(vlanIDBuilder.build());
+        }
+
+        MatchField vlanPriority = sourceMatch.getField(MatchType.DL_VLAN_PR);
+        if (vlanPriority != null && vlanPriority.getValue() != null) {
+            vlanMatchBuild.setVlanPcp(new VlanPcp((short) ((byte) vlanPriority
+                    .getValue())));
+        }
+
+        return vlanMatchBuild.build();
+    }
+
+    private static IpMatch ipMatch(final Match sourceMatch) {
+        IpMatchBuilder targetIpMatchBuild = new IpMatchBuilder();
+        MatchField networkTos = sourceMatch.getField(MatchType.NW_TOS);
+        if (networkTos != null && networkTos.getValue() != null) {
+            Dscp dscp = new Dscp(
+                    (short) (NetUtils.getUnsignedByte((Byte) networkTos
+                            .getValue())));
+            targetIpMatchBuild.setIpDscp(dscp);
+        }
+
+        MatchField protocol = sourceMatch.getField(MatchType.NW_PROTO);
+        if (protocol != null && protocol.getValue() != null) {
+            targetIpMatchBuild.setIpProtocol((short) ((byte) protocol
+                    .getValue()));
+        }
+
+        return targetIpMatchBuild.build();
+
+    }
+
+    private static EthernetMatch ethernetMatch(final Match sourceMatch) {
+        final EthernetMatchBuilder targetEthMatchBuild = new EthernetMatchBuilder();
+
+        EthernetSourceBuilder ethSourBuild = new EthernetSourceBuilder()
+                .setAddress(ethernetSourceAddress(sourceMatch));
+        targetEthMatchBuild.setEthernetSource(ethSourBuild.build());
+
+        EthernetDestinationBuilder ethDestBuild = new EthernetDestinationBuilder()
+                .setAddress(ethernetDestAddress(sourceMatch));
+        targetEthMatchBuild.setEthernetDestination(ethDestBuild.build());
+
+        final MatchField dataLinkType = sourceMatch.getField(MatchType.DL_TYPE);
+        if (dataLinkType != null && dataLinkType.getValue() != null) {
+            EtherType etherType = new EtherType(new Long(
+                    NetUtils.getUnsignedShort((Short) dataLinkType.getValue())));
+            EthernetTypeBuilder ethType = new EthernetTypeBuilder()
+                    .setType(etherType);
+            targetEthMatchBuild.setEthernetType(ethType.build());
+        }
+        return targetEthMatchBuild.build();
+    }
+
+    private static MacAddress ethernetSourceAddress(final Match sourceMatch) {
+        final MatchField dataLinkSource = sourceMatch.getField(DL_SRC);
+        if (dataLinkSource != null && dataLinkSource.getValue() != null) {
+            return MDFlowMapping.toMacAddress((byte[])dataLinkSource.getValue());
+        }
+        return null;
+
+    }
+
+    private static Layer3Match layer3Match(final Match sourceMatch) {
+        InetAddress inetSourceAddress = null;
+        MatchField netSource = sourceMatch.getField(MatchType.NW_SRC);
+        if (netSource != null && netSource.getValue() != null) {
+            inetSourceAddress = (InetAddress) (netSource.getValue());
+        }
+
+        InetAddress inetDestAddress = null;
+        MatchField netDest = sourceMatch.getField(MatchType.NW_DST);
+        if (netSource != null && netSource.getValue() != null) {
+            inetDestAddress = (InetAddress) (netDest.getValue());
+        }
+
+        if ((inetSourceAddress instanceof Inet4Address)
+                && (inetDestAddress instanceof Inet4Address)) {
+            MatchField dataLinkType = sourceMatch.getField(DL_TYPE);
+            Short dLType = null;
+            if (dataLinkType != null && dataLinkType.getValue() != null) {
+                dLType = (Short) (dataLinkType.getValue());
+            }
+            if (dLType != null && dLType.equals(ETHERNET_ARP)) {
+                return setLayer3MatchAsArp(sourceMatch,
+                        (Inet4Address) inetSourceAddress,
+                        (Inet4Address) inetDestAddress);
+            } else {
+                return setLayer3MatchAsIpv4((Inet4Address) inetSourceAddress,
+                        (Inet4Address) inetDestAddress);
+            }
+        } else if ((inetSourceAddress instanceof Inet6Address)
+                && (inetDestAddress instanceof Inet6Address)) {
+            return setLayer3MatchAsIpv6((Inet6Address) inetSourceAddress,
+                    (Inet6Address) inetDestAddress);
+        }
+
+        return null;
+
+    }
+
+    private static Layer3Match setLayer3MatchAsArp(final Match sourceMatch,
+            final Inet4Address inetSourceAddress,
+            final Inet4Address inetDestAddress) {
+        String inetSourceAddressStr = InetAddresses
+                .toAddrString(inetSourceAddress);
+        Ipv4Prefix ipv4SourcePrefix = new Ipv4Prefix(inetSourceAddressStr);
+
+        String inetDestAddressValue = InetAddresses
+                .toAddrString(inetDestAddress);
+        Ipv4Prefix ipv4DestPrefix = new Ipv4Prefix(inetDestAddressValue);
+
+        ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
+
+        arpMatchBuilder.setArpSourceTransportAddress(ipv4SourcePrefix);
+        arpMatchBuilder.setArpTargetTransportAddress(ipv4DestPrefix);
+
+        ArpSourceHardwareAddressBuilder arpSourceHardwareAddressBuilder = new ArpSourceHardwareAddressBuilder();
+        arpSourceHardwareAddressBuilder
+                .setAddress(ethernetSourceAddress(sourceMatch));
+        arpMatchBuilder
+                .setArpSourceHardwareAddress(arpSourceHardwareAddressBuilder
+                        .build());
+
+        ArpTargetHardwareAddressBuilder arpTargetHardwareAddressBuilder = new ArpTargetHardwareAddressBuilder();
+        arpTargetHardwareAddressBuilder
+                .setAddress(ethernetDestAddress(sourceMatch));
+        arpMatchBuilder
+                .setArpTargetHardwareAddress(arpTargetHardwareAddressBuilder
+                        .build());
+
+        return arpMatchBuilder.build();
+
+    }
+
+    private static MacAddress ethernetDestAddress(final Match sourceMatch) {
+        final MatchField dataLinkDest = sourceMatch.getField(DL_DST);
+        if (dataLinkDest != null && dataLinkDest.getValue() != null) {
+            return MDFlowMapping.toMacAddress((byte[]) dataLinkDest.getValue());
+        }
+        return null;
+    }
+
+    private static Layer3Match setLayer3MatchAsIpv4(
+            final Inet4Address inetSourceAddress,
+            final Inet4Address inetDestAddress) {
+        String inetSrcAddressString = InetAddresses
+                .toAddrString(inetSourceAddress);
+        String inetDstAddressString = InetAddresses
+                .toAddrString(inetDestAddress);
+
+        Ipv4MatchBuilder layer4MatchBuild = new Ipv4MatchBuilder();
+        layer4MatchBuild.setIpv4Source(new Ipv4Prefix(inetSrcAddressString));
+        layer4MatchBuild
+                .setIpv4Destination(new Ipv4Prefix(inetDstAddressString));
+        return layer4MatchBuild.build();
+
+    }
+
+    private static Layer3Match setLayer3MatchAsIpv6(
+            final Inet6Address inetSourceAddress,
+            final Inet6Address inetDestAddress) {
+        String inetSrcAddressString = InetAddresses
+                .toAddrString(inetSourceAddress);
+        String inetDstAddressString = InetAddresses
+                .toAddrString(inetDestAddress);
+        Ipv6MatchBuilder layer6MatchBuild = new Ipv6MatchBuilder();
+
+        layer6MatchBuild.setIpv6Source(new Ipv6Prefix(inetSrcAddressString));
+        layer6MatchBuild
+                .setIpv6Destination(new Ipv6Prefix(inetDstAddressString));
+        return layer6MatchBuild.build();
+    }
+
+}