BUG-1491: handle SET_TP_SRC/SET_TP_DST actions
[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.MaxLengthAction;\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpAction;\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;\r
63 \r
64 /**\r
65  * @author michal.polkorab\r
66  *\r
67  */\r
68 public class ActionConvertorV10Test {\r
69 \r
70     /**\r
71      * Test {@link ActionConvertor#getActions(List, short, BigInteger)}\r
72      */\r
73     @Test\r
74     public void testGetActions() {\r
75         List<Action> salActions = new ArrayList<>();\r
76         ActionBuilder actionBuilder = new ActionBuilder();\r
77         SetVlanPcpActionCaseBuilder vlanPcpCaseBuilder = new SetVlanPcpActionCaseBuilder();\r
78         SetVlanPcpActionBuilder pcpBuilder = new SetVlanPcpActionBuilder();\r
79         pcpBuilder.setVlanPcp(new VlanPcp((short) 7));\r
80         vlanPcpCaseBuilder.setSetVlanPcpAction(pcpBuilder.build());\r
81         actionBuilder.setAction(vlanPcpCaseBuilder.build());\r
82         actionBuilder.setOrder(0);\r
83         salActions.add(actionBuilder.build());\r
84         actionBuilder = new ActionBuilder();\r
85         StripVlanActionCaseBuilder stripCaseBuilder = new StripVlanActionCaseBuilder();\r
86         StripVlanActionBuilder stripBuilder = new StripVlanActionBuilder();\r
87         stripCaseBuilder.setStripVlanAction(stripBuilder.build());\r
88         actionBuilder.setAction(stripCaseBuilder.build());\r
89         actionBuilder.setOrder(1);\r
90         salActions.add(actionBuilder.build());\r
91         actionBuilder = new ActionBuilder();\r
92         SetDlDstActionCaseBuilder dlDstCaseBuilder = new SetDlDstActionCaseBuilder();\r
93         SetDlDstActionBuilder dlDstBuilder = new SetDlDstActionBuilder();\r
94         dlDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
95         dlDstCaseBuilder.setSetDlDstAction(dlDstBuilder.build());\r
96         actionBuilder.setAction(dlDstCaseBuilder.build());\r
97         actionBuilder.setOrder(2);\r
98         salActions.add(actionBuilder.build());\r
99         actionBuilder = new ActionBuilder();\r
100         SetDlSrcActionCaseBuilder dlSrcCaseBuilder = new SetDlSrcActionCaseBuilder();\r
101         SetDlSrcActionBuilder dlSrcBuilder = new SetDlSrcActionBuilder();\r
102         dlSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
103         dlSrcCaseBuilder.setSetDlSrcAction(dlSrcBuilder.build());\r
104         actionBuilder.setAction(dlSrcCaseBuilder.build());\r
105         actionBuilder.setOrder(3);\r
106         salActions.add(actionBuilder.build());\r
107         actionBuilder = new ActionBuilder();\r
108         SetNwSrcActionCaseBuilder nwSrcCaseBuilder = new SetNwSrcActionCaseBuilder();\r
109         SetNwSrcActionBuilder nwSrcBuilder = new SetNwSrcActionBuilder();\r
110         Ipv4Builder ipv4Builder = new Ipv4Builder();\r
111         ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.1/24"));\r
112         nwSrcBuilder.setAddress(ipv4Builder.build());\r
113         nwSrcCaseBuilder.setSetNwSrcAction(nwSrcBuilder.build());\r
114         actionBuilder.setAction(nwSrcCaseBuilder.build());\r
115         actionBuilder.setOrder(4);\r
116         salActions.add(actionBuilder.build());\r
117         actionBuilder = new ActionBuilder();\r
118         SetNwDstActionCaseBuilder nwDstCaseBuilder = new SetNwDstActionCaseBuilder();\r
119         SetNwDstActionBuilder nwDstBuilder = new SetNwDstActionBuilder();\r
120         ipv4Builder = new Ipv4Builder();\r
121         ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.2/32"));\r
122         nwDstBuilder.setAddress(ipv4Builder.build());\r
123         nwDstCaseBuilder.setSetNwDstAction(nwDstBuilder.build());\r
124         actionBuilder.setAction(nwDstCaseBuilder.build());\r
125         actionBuilder.setOrder(5);\r
126         salActions.add(actionBuilder.build());\r
127         actionBuilder = new ActionBuilder();\r
128         SetTpSrcActionCaseBuilder tpSrcCaseBuilder = new SetTpSrcActionCaseBuilder();\r
129         SetTpSrcActionBuilder tpSrcBuilder = new SetTpSrcActionBuilder();\r
130         tpSrcBuilder.setPort(new PortNumber(54));\r
131         tpSrcCaseBuilder.setSetTpSrcAction(tpSrcBuilder.build());\r
132         actionBuilder.setAction(tpSrcCaseBuilder.build());\r
133         actionBuilder.setOrder(6);\r
134         salActions.add(actionBuilder.build());\r
135         actionBuilder = new ActionBuilder();\r
136         SetTpDstActionCaseBuilder tpDstCaseBuilder = new SetTpDstActionCaseBuilder();\r
137         SetTpDstActionBuilder tpDstBuilder = new SetTpDstActionBuilder();\r
138         tpDstBuilder.setPort(new PortNumber(45));\r
139         tpDstCaseBuilder.setSetTpDstAction(tpDstBuilder.build());\r
140         actionBuilder.setAction(tpDstCaseBuilder.build());\r
141         actionBuilder.setOrder(7);\r
142         salActions.add(actionBuilder.build());\r
143         actionBuilder = new ActionBuilder();\r
144         SetNwTosActionCaseBuilder tosCaseBuilder = new SetNwTosActionCaseBuilder();\r
145         SetNwTosActionBuilder tosBuilder = new SetNwTosActionBuilder();\r
146         tosBuilder.setTos(18);\r
147         tosCaseBuilder.setSetNwTosAction(tosBuilder.build());\r
148         actionBuilder.setAction(tosCaseBuilder.build());\r
149         actionBuilder.setOrder(8);\r
150         salActions.add(actionBuilder.build());\r
151         actionBuilder = new ActionBuilder();\r
152         SetVlanIdActionCaseBuilder vlanIdCaseBuilder = new SetVlanIdActionCaseBuilder();\r
153         SetVlanIdActionBuilder vlanIdBuilder = new SetVlanIdActionBuilder();\r
154         vlanIdBuilder.setVlanId(new VlanId(22));\r
155         vlanIdCaseBuilder.setSetVlanIdAction(vlanIdBuilder.build());\r
156         actionBuilder.setAction(vlanIdCaseBuilder.build());\r
157         actionBuilder.setOrder(9);\r
158         salActions.add(actionBuilder.build());\r
159         \r
160         IpMatchBuilder ipMatchBld = new IpMatchBuilder().setIpProto(IpVersion.Ipv4);\r
161         MatchBuilder matchBld = new MatchBuilder().setIpMatch(ipMatchBld.build());\r
162         FlowBuilder flowBld = new FlowBuilder().setMatch(matchBld.build());\r
163         List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
164         .Action> actions = ActionConvertor.getActions(salActions, EncodeConstants.OF10_VERSION_ID, new BigInteger("42"), flowBld.build());\r
165         \r
166         Assert.assertEquals("Wrong number of actions", 10, actions.size());\r
167         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
168         .Action action = actions.get(0);\r
169         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
170                 + ".action.rev130731.SetVlanPcp", action.getType().getName());\r
171         Assert.assertEquals("Wrong vlan pcp", 7, action.getAugmentation(VlanPcpAction.class).getVlanPcp().intValue());\r
172         action = actions.get(1);\r
173         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
174                 + ".action.rev130731.StripVlan", action.getType().getName());\r
175         action = actions.get(2);\r
176         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
177                 + ".action.rev130731.SetDlDst", action.getType().getName());\r
178         Assert.assertEquals("Wrong dl dst", "00:00:00:00:00:06", action.getAugmentation(DlAddressAction.class)\r
179                 .getDlAddress().getValue());\r
180         action = actions.get(3);\r
181         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
182                 + ".action.rev130731.SetDlSrc", action.getType().getName());\r
183         Assert.assertEquals("Wrong dl dst", "00:00:00:00:00:05", action.getAugmentation(DlAddressAction.class)\r
184                 .getDlAddress().getValue());\r
185         action = actions.get(4);\r
186         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
187                 + ".action.rev130731.SetNwSrc", action.getType().getName());\r
188         // FIXME - fix ipv4 address translation - cut off network mask\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         // FIXME - fix ipv4 address translation - cut off network mask\r
195 //        Assert.assertEquals("Wrong nw dst", "10.0.0.2", action.getAugmentation(IpAddressAction.class)\r
196 //                .getIpAddress().getValue());\r
197         action = actions.get(6);\r
198         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
199                 + ".action.rev130731.SetTpSrc", action.getType().getName());\r
200         Assert.assertEquals("Wrong tp src", 54, action.getAugmentation(PortAction.class)\r
201                 .getPort().getValue().intValue());\r
202         action = actions.get(7);\r
203         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
204                 + ".action.rev130731.SetTpDst", action.getType().getName());\r
205         Assert.assertEquals("Wrong tp dst", 45, action.getAugmentation(PortAction.class)\r
206                 .getPort().getValue().intValue());\r
207         action = actions.get(8);\r
208         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
209                 + ".action.rev130731.SetNwTos", action.getType().getName());\r
210         Assert.assertEquals("Wrong nw tos", 18, action.getAugmentation(NwTosAction.class)\r
211                 .getNwTos().intValue());\r
212         action = actions.get(9);\r
213         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
214                 + ".action.rev130731.SetVlanVid", action.getType().getName());\r
215         Assert.assertEquals("Wrong vlan id", 22, action.getAugmentation(VlanVidAction.class)\r
216                 .getVlanVid().intValue());\r
217     }\r
218 \r
219     /**\r
220      * Test {@link ActionConvertor#toMDSalActions(List, OpenflowVersion, ActionPath)}\r
221      */\r
222     @Test\r
223     public void testToMDSalActions() {\r
224         OpenflowPortsUtil.init();\r
225 \r
226         List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
227         .Action> actions = new ArrayList<>();\r
228         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
229         .ActionBuilder actionbuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common\r
230                                         .action.rev130731.actions.grouping.ActionBuilder();\r
231         actionbuilder.setType(Output.class);\r
232         PortActionBuilder portBuilder = new PortActionBuilder();\r
233         portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber(14L));\r
234         actionbuilder.addAugmentation(PortAction.class, portBuilder.build());\r
235         MaxLengthActionBuilder lengthBuilder = new MaxLengthActionBuilder();\r
236         lengthBuilder.setMaxLength(555);\r
237         actionbuilder.addAugmentation(MaxLengthAction.class, lengthBuilder.build());\r
238         actions.add(actionbuilder.build());\r
239 \r
240         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action\r
241         .Action> mdSalActions = ActionConvertor.toMDSalActions(actions, OpenflowVersion.OF10,\r
242                 ActionPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION);\r
243 \r
244         Assert.assertEquals("Wrong number of output actions", 1, mdSalActions.size());\r
245         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = mdSalActions.get(0);\r
246         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
247                 + ".rev131112.action.action.OutputActionCase", action.getImplementedInterface().getName());\r
248         OutputActionCase outputAction = (OutputActionCase) action;\r
249         Assert.assertEquals("Wrong output port", "14", outputAction.getOutputAction().getOutputNodeConnector().getValue());\r
250         Assert.assertEquals("Wrong max length", 555, outputAction.getOutputAction().getMaxLength().intValue());\r
251     }\r
252 }