Merge "Initial implementation of the ClusteredDataStore"
[controller.git] / opendaylight / md-sal / compatibility / sal-compatibility / src / main / java / org / opendaylight / controller / sal / compatibility / FromSalConversionsUtils.java
1 package org.opendaylight.controller.sal.compatibility;
2
3 import static org.opendaylight.controller.sal.match.MatchType.DL_DST;
4 import static org.opendaylight.controller.sal.match.MatchType.DL_SRC;
5 import static org.opendaylight.controller.sal.match.MatchType.DL_TYPE;
6
7 import java.math.BigInteger;
8 import java.net.Inet4Address;
9 import java.net.Inet6Address;
10 import java.net.InetAddress;
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.List;
14
15 import org.opendaylight.controller.sal.compatibility.MDFlowMapping;
16 import org.opendaylight.controller.sal.core.NodeConnector;
17
18
19
20 import org.opendaylight.controller.sal.match.Match;
21 import org.opendaylight.controller.sal.match.MatchField;
22 import org.opendaylight.controller.sal.match.MatchType;
23 import org.opendaylight.controller.sal.utils.NetUtils;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
60 import com.google.common.net.InetAddresses;
61 import static org.opendaylight.controller.sal.compatibility.NodeMapping.*;
62 import static org.opendaylight.controller.sal.compatibility.ProtocolConstants.*;
63
64 public class FromSalConversionsUtils {
65
66     private FromSalConversionsUtils() {
67
68     }
69
70     public static GetNodeConnectorStatisticsInput nodeConnectorStatistics(
71             NodeConnector connector) {
72         GetNodeConnectorStatisticsInputBuilder target = new GetNodeConnectorStatisticsInputBuilder();
73
74         NodeRef nodeRef = toNodeRef(connector.getNode());
75         target.setNode(nodeRef);
76
77         NodeConnectorRef nodeConnectorRef = toNodeConnectorRef(connector);
78         target.setNodeConnector(nodeConnectorRef);
79
80         return target.build();
81     }
82
83     private static Address addressFromAction(InetAddress inetAddress) {
84         String strInetAddresss = InetAddresses.toAddrString(inetAddress);
85         if (inetAddress instanceof Inet4Address) {
86             Ipv4Builder ipv4Builder = new Ipv4Builder();
87             ipv4Builder.setIpv4Address(new Ipv4Prefix(strInetAddresss));
88             return ipv4Builder.build();
89         } else if (inetAddress instanceof Inet6Address) {
90             Ipv6Builder ipv6Builder = new Ipv6Builder();
91             ipv6Builder.setIpv6Address(new Ipv6Prefix(strInetAddresss));
92             return ipv6Builder.build();
93         }
94         return null;
95     }
96
97     public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match toMatch(
98             Match sourceMatch) {
99         if (sourceMatch != null) {
100             MatchBuilder targetBuilder = new MatchBuilder();
101
102             targetBuilder.setEthernetMatch(ethernetMatch(sourceMatch));
103             targetBuilder.setIpMatch(ipMatch(sourceMatch));
104             targetBuilder.setVlanMatch(vlanMatch(sourceMatch));
105             targetBuilder.setLayer3Match(layer3Match(sourceMatch));
106             targetBuilder.setLayer4Match(layer4Match(sourceMatch));
107
108             return targetBuilder.build();
109         }
110         return null;
111
112     }
113
114     private static Layer4Match layer4Match(final Match sourceMatch) {
115         MatchField nwProto = sourceMatch.getField(MatchType.NW_PROTO);
116         Short nwProtocolSource = null;
117         if (nwProto != null && nwProto.getValue() != null) {
118             nwProtocolSource = (short) ((byte) nwProto.getValue());
119             switch (nwProtocolSource) {
120             case TCP:
121                 return Layer4MatchAsTcp(sourceMatch);
122             case UDP:
123                 return Layer4MatchAsUdp(sourceMatch);
124             case SCTP:
125                 return Layer4MatchAsSctp(sourceMatch);
126             }
127         }
128         return null;
129     }
130
131     private static Layer4Match Layer4MatchAsSctp(final Match sourceMatch) {
132         SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
133
134         Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
135         Integer destinationPort = transportPort(sourceMatch,
136                 MatchType.TP_DST);
137
138         if (sourcePort != null) {
139             sctpMatchBuilder.setSctpSourcePort(new PortNumber(sourcePort));
140         }
141         if (destinationPort != null) {
142             sctpMatchBuilder.setSctpDestinationPort(new PortNumber(
143                     destinationPort));
144         }
145
146         return sctpMatchBuilder.build();
147     }
148
149     private static Layer4Match Layer4MatchAsUdp(final Match sourceMatch) {
150         UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
151
152         Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
153         Integer destinationPort = transportPort(sourceMatch,
154                 MatchType.TP_DST);
155
156         if (sourcePort != null) {
157             udpMatchBuilder.setUdpSourcePort(new PortNumber(sourcePort));
158         }
159
160         if (destinationPort != null) {
161             udpMatchBuilder.setUdpDestinationPort(new PortNumber(
162                     destinationPort));
163         }
164
165         return udpMatchBuilder.build();
166     }
167
168     private static Layer4Match Layer4MatchAsTcp(final Match sourceMatch) {
169         TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
170
171         Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
172         Integer destinationPort = transportPort(sourceMatch,
173                 MatchType.TP_DST);
174
175         if (sourcePort != null) {
176             tcpMatchBuilder.setTcpSourcePort(new PortNumber(sourcePort));
177         }
178         if (destinationPort != null) {
179             tcpMatchBuilder.setTcpDestinationPort(new PortNumber(
180                     destinationPort));
181         }
182
183         return tcpMatchBuilder.build();
184     }
185
186     private static Integer transportPort(final Match sourceMatch,
187             final MatchType matchType) {
188         MatchField transportPort = sourceMatch.getField(matchType);
189         if (transportPort != null && transportPort.getValue() != null
190                 && transportPort.getValue().getClass().equals(Short.class)) {
191             return new Integer(NetUtils.getUnsignedShort((short) transportPort
192                     .getValue()));
193         }
194         return null;
195     }
196
197     private static VlanMatch vlanMatch(final Match sourceMatch) {
198         VlanMatchBuilder vlanMatchBuild = new VlanMatchBuilder();
199
200         MatchField vlan = sourceMatch.getField(MatchType.DL_VLAN);
201         if (vlan != null && vlan.getValue() != null) {
202             VlanIdBuilder vlanIDBuilder = new VlanIdBuilder();
203             vlanIDBuilder.setVlanId(new VlanId((int) (NetUtils
204                     .getUnsignedShort((short) vlan.getValue()))));
205             vlanMatchBuild.setVlanId(vlanIDBuilder.build());
206         }
207
208         MatchField vlanPriority = sourceMatch.getField(MatchType.DL_VLAN_PR);
209         if (vlanPriority != null && vlanPriority.getValue() != null) {
210             vlanMatchBuild.setVlanPcp(new VlanPcp((short) ((byte) vlanPriority
211                     .getValue())));
212         }
213
214         return vlanMatchBuild.build();
215     }
216
217     private static IpMatch ipMatch(final Match sourceMatch) {
218         IpMatchBuilder targetIpMatchBuild = new IpMatchBuilder();
219         MatchField networkTos = sourceMatch.getField(MatchType.NW_TOS);
220         if (networkTos != null && networkTos.getValue() != null) {
221             Dscp dscp = new Dscp(
222                     (short) (NetUtils.getUnsignedByte((Byte) networkTos
223                             .getValue())));
224             targetIpMatchBuild.setIpDscp(dscp);
225         }
226
227         MatchField protocol = sourceMatch.getField(MatchType.NW_PROTO);
228         if (protocol != null && protocol.getValue() != null) {
229             targetIpMatchBuild.setIpProtocol((short) ((byte) protocol
230                     .getValue()));
231         }
232
233         return targetIpMatchBuild.build();
234
235     }
236
237     private static EthernetMatch ethernetMatch(final Match sourceMatch) {
238         final EthernetMatchBuilder targetEthMatchBuild = new EthernetMatchBuilder();
239
240         EthernetSourceBuilder ethSourBuild = new EthernetSourceBuilder()
241                 .setAddress(ethernetSourceAddress(sourceMatch));
242         targetEthMatchBuild.setEthernetSource(ethSourBuild.build());
243
244         EthernetDestinationBuilder ethDestBuild = new EthernetDestinationBuilder()
245                 .setAddress(ethernetDestAddress(sourceMatch));
246         targetEthMatchBuild.setEthernetDestination(ethDestBuild.build());
247
248         final MatchField dataLinkType = sourceMatch.getField(MatchType.DL_TYPE);
249         if (dataLinkType != null && dataLinkType.getValue() != null) {
250             EtherType etherType = new EtherType(new Long(
251                     NetUtils.getUnsignedShort((Short) dataLinkType.getValue())));
252             EthernetTypeBuilder ethType = new EthernetTypeBuilder()
253                     .setType(etherType);
254             targetEthMatchBuild.setEthernetType(ethType.build());
255         }
256         return targetEthMatchBuild.build();
257     }
258
259     private static MacAddress ethernetSourceAddress(final Match sourceMatch) {
260         final MatchField dataLinkSource = sourceMatch.getField(DL_SRC);
261         if (dataLinkSource != null && dataLinkSource.getValue() != null) {
262             return MDFlowMapping.toMacAddress((byte[])dataLinkSource.getValue());
263         }
264         return null;
265
266     }
267
268     private static Layer3Match layer3Match(final Match sourceMatch) {
269         InetAddress inetSourceAddress = null;
270         MatchField netSource = sourceMatch.getField(MatchType.NW_SRC);
271         if (netSource != null && netSource.getValue() != null) {
272             inetSourceAddress = (InetAddress) (netSource.getValue());
273         }
274
275         InetAddress inetDestAddress = null;
276         MatchField netDest = sourceMatch.getField(MatchType.NW_DST);
277         if (netSource != null && netSource.getValue() != null) {
278             inetDestAddress = (InetAddress) (netDest.getValue());
279         }
280
281         if ((inetSourceAddress instanceof Inet4Address)
282                 && (inetDestAddress instanceof Inet4Address)) {
283             MatchField dataLinkType = sourceMatch.getField(DL_TYPE);
284             Short dLType = null;
285             if (dataLinkType != null && dataLinkType.getValue() != null) {
286                 dLType = (Short) (dataLinkType.getValue());
287             }
288             if (dLType != null && dLType.equals(ETHERNET_ARP)) {
289                 return setLayer3MatchAsArp(sourceMatch,
290                         (Inet4Address) inetSourceAddress,
291                         (Inet4Address) inetDestAddress);
292             } else {
293                 return setLayer3MatchAsIpv4((Inet4Address) inetSourceAddress,
294                         (Inet4Address) inetDestAddress);
295             }
296         } else if ((inetSourceAddress instanceof Inet6Address)
297                 && (inetDestAddress instanceof Inet6Address)) {
298             return setLayer3MatchAsIpv6((Inet6Address) inetSourceAddress,
299                     (Inet6Address) inetDestAddress);
300         }
301
302         return null;
303
304     }
305
306     private static Layer3Match setLayer3MatchAsArp(final Match sourceMatch,
307             final Inet4Address inetSourceAddress,
308             final Inet4Address inetDestAddress) {
309         String inetSourceAddressStr = InetAddresses
310                 .toAddrString(inetSourceAddress);
311         Ipv4Prefix ipv4SourcePrefix = new Ipv4Prefix(inetSourceAddressStr);
312
313         String inetDestAddressValue = InetAddresses
314                 .toAddrString(inetDestAddress);
315         Ipv4Prefix ipv4DestPrefix = new Ipv4Prefix(inetDestAddressValue);
316
317         ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
318
319         arpMatchBuilder.setArpSourceTransportAddress(ipv4SourcePrefix);
320         arpMatchBuilder.setArpTargetTransportAddress(ipv4DestPrefix);
321
322         ArpSourceHardwareAddressBuilder arpSourceHardwareAddressBuilder = new ArpSourceHardwareAddressBuilder();
323         arpSourceHardwareAddressBuilder
324                 .setAddress(ethernetSourceAddress(sourceMatch));
325         arpMatchBuilder
326                 .setArpSourceHardwareAddress(arpSourceHardwareAddressBuilder
327                         .build());
328
329         ArpTargetHardwareAddressBuilder arpTargetHardwareAddressBuilder = new ArpTargetHardwareAddressBuilder();
330         arpTargetHardwareAddressBuilder
331                 .setAddress(ethernetDestAddress(sourceMatch));
332         arpMatchBuilder
333                 .setArpTargetHardwareAddress(arpTargetHardwareAddressBuilder
334                         .build());
335
336         return arpMatchBuilder.build();
337
338     }
339
340     private static MacAddress ethernetDestAddress(final Match sourceMatch) {
341         final MatchField dataLinkDest = sourceMatch.getField(DL_DST);
342         if (dataLinkDest != null && dataLinkDest.getValue() != null) {
343             return MDFlowMapping.toMacAddress((byte[]) dataLinkDest.getValue());
344         }
345         return null;
346     }
347
348     private static Layer3Match setLayer3MatchAsIpv4(
349             final Inet4Address inetSourceAddress,
350             final Inet4Address inetDestAddress) {
351         String inetSrcAddressString = InetAddresses
352                 .toAddrString(inetSourceAddress);
353         String inetDstAddressString = InetAddresses
354                 .toAddrString(inetDestAddress);
355
356         Ipv4MatchBuilder layer4MatchBuild = new Ipv4MatchBuilder();
357         layer4MatchBuild.setIpv4Source(new Ipv4Prefix(inetSrcAddressString));
358         layer4MatchBuild
359                 .setIpv4Destination(new Ipv4Prefix(inetDstAddressString));
360         return layer4MatchBuild.build();
361
362     }
363
364     private static Layer3Match setLayer3MatchAsIpv6(
365             final Inet6Address inetSourceAddress,
366             final Inet6Address inetDestAddress) {
367         String inetSrcAddressString = InetAddresses
368                 .toAddrString(inetSourceAddress);
369         String inetDstAddressString = InetAddresses
370                 .toAddrString(inetDestAddress);
371         Ipv6MatchBuilder layer6MatchBuild = new Ipv6MatchBuilder();
372
373         layer6MatchBuild.setIpv6Source(new Ipv6Prefix(inetSrcAddressString));
374         layer6MatchBuild
375                 .setIpv6Destination(new Ipv6Prefix(inetDstAddressString));
376         return layer6MatchBuild.build();
377     }
378
379 }