BUG 2281 - Incorrect IP address conversion
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / ActionConvertorV10Test.java
1 /*\r
2  * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;\r
10 \r
11 import java.math.BigInteger;\r
12 import java.util.ArrayList;\r
13 import java.util.List;\r
14 \r
15 import org.junit.Assert;\r
16 import org.junit.Test;\r
17 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
18 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;\r
19 import org.opendaylight.openflowplugin.extension.api.path.ActionPath;\r
20 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpVersion;\r
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;\r
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;\r
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCaseBuilder;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCaseBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCaseBuilder;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCaseBuilder;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCaseBuilder;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCaseBuilder;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.StripVlanActionCaseBuilder;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstActionBuilder;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcActionBuilder;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.tos.action._case.SetNwTosActionBuilder;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstActionBuilder;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcActionBuilder;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpActionBuilder;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.strip.vlan.action._case.StripVlanActionBuilder;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction;\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpAction;\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;\r
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;\r
64 \r
65 /**\r
66  * @author michal.polkorab\r
67  *\r
68  */\r
69 public class ActionConvertorV10Test {\r
70 \r
71     /**\r
72      * Test {@link ActionConvertor#getActions(List, short, BigInteger)}\r
73      */\r
74     @Test\r
75     public void testGetActions() {\r
76         List<Action> salActions = new ArrayList<>();\r
77         ActionBuilder actionBuilder = new ActionBuilder();\r
78         SetVlanPcpActionCaseBuilder vlanPcpCaseBuilder = new SetVlanPcpActionCaseBuilder();\r
79         SetVlanPcpActionBuilder pcpBuilder = new SetVlanPcpActionBuilder();\r
80         pcpBuilder.setVlanPcp(new VlanPcp((short) 7));\r
81         vlanPcpCaseBuilder.setSetVlanPcpAction(pcpBuilder.build());\r
82         actionBuilder.setAction(vlanPcpCaseBuilder.build());\r
83         actionBuilder.setOrder(0);\r
84         salActions.add(actionBuilder.build());\r
85         actionBuilder = new ActionBuilder();\r
86         StripVlanActionCaseBuilder stripCaseBuilder = new StripVlanActionCaseBuilder();\r
87         StripVlanActionBuilder stripBuilder = new StripVlanActionBuilder();\r
88         stripCaseBuilder.setStripVlanAction(stripBuilder.build());\r
89         actionBuilder.setAction(stripCaseBuilder.build());\r
90         actionBuilder.setOrder(1);\r
91         salActions.add(actionBuilder.build());\r
92         actionBuilder = new ActionBuilder();\r
93         SetDlDstActionCaseBuilder dlDstCaseBuilder = new SetDlDstActionCaseBuilder();\r
94         SetDlDstActionBuilder dlDstBuilder = new SetDlDstActionBuilder();\r
95         dlDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
96         dlDstCaseBuilder.setSetDlDstAction(dlDstBuilder.build());\r
97         actionBuilder.setAction(dlDstCaseBuilder.build());\r
98         actionBuilder.setOrder(2);\r
99         salActions.add(actionBuilder.build());\r
100         actionBuilder = new ActionBuilder();\r
101         SetDlSrcActionCaseBuilder dlSrcCaseBuilder = new SetDlSrcActionCaseBuilder();\r
102         SetDlSrcActionBuilder dlSrcBuilder = new SetDlSrcActionBuilder();\r
103         dlSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
104         dlSrcCaseBuilder.setSetDlSrcAction(dlSrcBuilder.build());\r
105         actionBuilder.setAction(dlSrcCaseBuilder.build());\r
106         actionBuilder.setOrder(3);\r
107         salActions.add(actionBuilder.build());\r
108         actionBuilder = new ActionBuilder();\r
109         SetNwSrcActionCaseBuilder nwSrcCaseBuilder = new SetNwSrcActionCaseBuilder();\r
110         SetNwSrcActionBuilder nwSrcBuilder = new SetNwSrcActionBuilder();\r
111         Ipv4Builder ipv4Builder = new Ipv4Builder();\r
112         ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.1/24"));\r
113         nwSrcBuilder.setAddress(ipv4Builder.build());\r
114         nwSrcCaseBuilder.setSetNwSrcAction(nwSrcBuilder.build());\r
115         actionBuilder.setAction(nwSrcCaseBuilder.build());\r
116         actionBuilder.setOrder(4);\r
117         salActions.add(actionBuilder.build());\r
118         actionBuilder = new ActionBuilder();\r
119         SetNwDstActionCaseBuilder nwDstCaseBuilder = new SetNwDstActionCaseBuilder();\r
120         SetNwDstActionBuilder nwDstBuilder = new SetNwDstActionBuilder();\r
121         ipv4Builder = new Ipv4Builder();\r
122         ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.2/32"));\r
123         nwDstBuilder.setAddress(ipv4Builder.build());\r
124         nwDstCaseBuilder.setSetNwDstAction(nwDstBuilder.build());\r
125         actionBuilder.setAction(nwDstCaseBuilder.build());\r
126         actionBuilder.setOrder(5);\r
127         salActions.add(actionBuilder.build());\r
128         actionBuilder = new ActionBuilder();\r
129         SetTpSrcActionCaseBuilder tpSrcCaseBuilder = new SetTpSrcActionCaseBuilder();\r
130         SetTpSrcActionBuilder tpSrcBuilder = new SetTpSrcActionBuilder();\r
131         tpSrcBuilder.setPort(new PortNumber(54));\r
132         tpSrcCaseBuilder.setSetTpSrcAction(tpSrcBuilder.build());\r
133         actionBuilder.setAction(tpSrcCaseBuilder.build());\r
134         actionBuilder.setOrder(6);\r
135         salActions.add(actionBuilder.build());\r
136         actionBuilder = new ActionBuilder();\r
137         SetTpDstActionCaseBuilder tpDstCaseBuilder = new SetTpDstActionCaseBuilder();\r
138         SetTpDstActionBuilder tpDstBuilder = new SetTpDstActionBuilder();\r
139         tpDstBuilder.setPort(new PortNumber(45));\r
140         tpDstCaseBuilder.setSetTpDstAction(tpDstBuilder.build());\r
141         actionBuilder.setAction(tpDstCaseBuilder.build());\r
142         actionBuilder.setOrder(7);\r
143         salActions.add(actionBuilder.build());\r
144         actionBuilder = new ActionBuilder();\r
145         SetNwTosActionCaseBuilder tosCaseBuilder = new SetNwTosActionCaseBuilder();\r
146         SetNwTosActionBuilder tosBuilder = new SetNwTosActionBuilder();\r
147         tosBuilder.setTos(18);\r
148         tosCaseBuilder.setSetNwTosAction(tosBuilder.build());\r
149         actionBuilder.setAction(tosCaseBuilder.build());\r
150         actionBuilder.setOrder(8);\r
151         salActions.add(actionBuilder.build());\r
152         actionBuilder = new ActionBuilder();\r
153         SetVlanIdActionCaseBuilder vlanIdCaseBuilder = new SetVlanIdActionCaseBuilder();\r
154         SetVlanIdActionBuilder vlanIdBuilder = new SetVlanIdActionBuilder();\r
155         vlanIdBuilder.setVlanId(new VlanId(22));\r
156         vlanIdCaseBuilder.setSetVlanIdAction(vlanIdBuilder.build());\r
157         actionBuilder.setAction(vlanIdCaseBuilder.build());\r
158         actionBuilder.setOrder(9);\r
159         salActions.add(actionBuilder.build());\r
160         \r
161         IpMatchBuilder ipMatchBld = new IpMatchBuilder().setIpProto(IpVersion.Ipv4);\r
162         MatchBuilder matchBld = new MatchBuilder().setIpMatch(ipMatchBld.build());\r
163         FlowBuilder flowBld = new FlowBuilder().setMatch(matchBld.build());\r
164         List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
165         .Action> actions = ActionConvertor.getActions(salActions, EncodeConstants.OF10_VERSION_ID, new BigInteger("42"), flowBld.build());\r
166         \r
167         Assert.assertEquals("Wrong number of actions", 10, actions.size());\r
168         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
169         .Action action = actions.get(0);\r
170         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
171                 + ".action.rev130731.SetVlanPcp", action.getType().getName());\r
172         Assert.assertEquals("Wrong vlan pcp", 7, action.getAugmentation(VlanPcpAction.class).getVlanPcp().intValue());\r
173         action = actions.get(1);\r
174         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
175                 + ".action.rev130731.StripVlan", action.getType().getName());\r
176         action = actions.get(2);\r
177         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
178                 + ".action.rev130731.SetDlDst", action.getType().getName());\r
179         Assert.assertEquals("Wrong dl dst", "00:00:00:00:00:06", action.getAugmentation(DlAddressAction.class)\r
180                 .getDlAddress().getValue());\r
181         action = actions.get(3);\r
182         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
183                 + ".action.rev130731.SetDlSrc", action.getType().getName());\r
184         Assert.assertEquals("Wrong dl dst", "00:00:00:00:00:05", action.getAugmentation(DlAddressAction.class)\r
185                 .getDlAddress().getValue());\r
186         action = actions.get(4);\r
187         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
188                 + ".action.rev130731.SetNwSrc", action.getType().getName());\r
189         Assert.assertEquals("Wrong nw src", "10.0.0.1", action.getAugmentation(IpAddressAction.class)\r
190                 .getIpAddress().getValue());\r
191         action = actions.get(5);\r
192         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
193                 + ".action.rev130731.SetNwDst", action.getType().getName());\r
194         Assert.assertEquals("Wrong nw dst", "10.0.0.2", action.getAugmentation(IpAddressAction.class)\r
195                 .getIpAddress().getValue());\r
196         action = actions.get(6);\r
197         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
198                 + ".action.rev130731.SetTpSrc", action.getType().getName());\r
199         Assert.assertEquals("Wrong tp src", 54, action.getAugmentation(PortAction.class)\r
200                 .getPort().getValue().intValue());\r
201         action = actions.get(7);\r
202         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
203                 + ".action.rev130731.SetTpDst", action.getType().getName());\r
204         Assert.assertEquals("Wrong tp dst", 45, action.getAugmentation(PortAction.class)\r
205                 .getPort().getValue().intValue());\r
206         action = actions.get(8);\r
207         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
208                 + ".action.rev130731.SetNwTos", action.getType().getName());\r
209         Assert.assertEquals("Wrong nw tos", 18, action.getAugmentation(NwTosAction.class)\r
210                 .getNwTos().intValue());\r
211         action = actions.get(9);\r
212         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
213                 + ".action.rev130731.SetVlanVid", action.getType().getName());\r
214         Assert.assertEquals("Wrong vlan id", 22, action.getAugmentation(VlanVidAction.class)\r
215                 .getVlanVid().intValue());\r
216     }\r
217 \r
218     /**\r
219      * Test {@link ActionConvertor#toMDSalActions(List, OpenflowVersion, ActionPath)}\r
220      */\r
221     @Test\r
222     public void testToMDSalActions() {\r
223         OpenflowPortsUtil.init();\r
224 \r
225         List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
226         .Action> actions = new ArrayList<>();\r
227         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
228         .ActionBuilder actionbuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common\r
229                                         .action.rev130731.actions.grouping.ActionBuilder();\r
230         actionbuilder.setType(Output.class);\r
231         PortActionBuilder portBuilder = new PortActionBuilder();\r
232         portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber(14L));\r
233         actionbuilder.addAugmentation(PortAction.class, portBuilder.build());\r
234         MaxLengthActionBuilder lengthBuilder = new MaxLengthActionBuilder();\r
235         lengthBuilder.setMaxLength(555);\r
236         actionbuilder.addAugmentation(MaxLengthAction.class, lengthBuilder.build());\r
237         actions.add(actionbuilder.build());\r
238 \r
239         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action\r
240         .Action> mdSalActions = ActionConvertor.toMDSalActions(actions, OpenflowVersion.OF10,\r
241                 ActionPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION);\r
242 \r
243         Assert.assertEquals("Wrong number of output actions", 1, mdSalActions.size());\r
244         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = mdSalActions.get(0);\r
245         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
246                 + ".rev131112.action.action.OutputActionCase", action.getImplementedInterface().getName());\r
247         OutputActionCase outputAction = (OutputActionCase) action;\r
248         Assert.assertEquals("Wrong output port", "14", outputAction.getOutputAction().getOutputNodeConnector().getValue());\r
249         Assert.assertEquals("Wrong max length", 555, outputAction.getOutputAction().getMaxLength().intValue());\r
250     }\r
251 }