ff0749399540a78a8784f3d72e9e20e4ad3aff29
[openflowplugin.git] / extension / openflowplugin-extension-nicira / src / main / java / org / opendaylight / openflowplugin / extension / vendor / nicira / convertor / action / ConntrackConvertor.java
1 /*
2  * Copyright (c) 2015, 2017 Hewlett-Packard Enterprise and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.action;
10
11 import com.google.common.base.Preconditions;
12 import java.util.ArrayList;
13 import java.util.List;
14 import org.opendaylight.openflowplugin.extension.api.ConvertorActionFromOFJava;
15 import org.opendaylight.openflowplugin.extension.api.ConvertorActionToOFJava;
16 import org.opendaylight.openflowplugin.extension.api.path.ActionPath;
17 import org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.CodecPreconditionException;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrack;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrackBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.NxActionConntrack;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.NxActionConntrackBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.NxActionConntrackGrouping;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flows.statistics.update.flow.and.statistics.map.list.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionConntrackNotifFlowsStatisticsUpdateApplyActionsCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flows.statistics.update.flow.and.statistics.map.list.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionConntrackNotifFlowsStatisticsUpdateWriteActionsCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.get.flow.statistics.output.flow.and.statistics.map.list.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionConntrackNotifDirectStatisticsUpdateApplyActionsCaseBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.get.flow.statistics.output.flow.and.statistics.map.list.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionConntrackNotifDirectStatisticsUpdateWriteActionsCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.group.desc.stats.updated.group.desc.stats.buckets.bucket.action.action.NxActionConntrackNotifGroupDescStatsUpdatedCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionConntrackNodesNodeTableFlowApplyActionsCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.write.actions._case.write.actions.action.action.NxActionConntrackNodesNodeTableFlowWriteActionsCaseBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.NxConntrack;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.NxConntrackBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.nx.conntrack.CtActions;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.nx.conntrack.CtActionsBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.OfpactActions;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.NxActionCtMarkCase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.NxActionCtMarkCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.NxActionNatCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMark;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMarkBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNat;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNatBuilder;
44
45 /**
46  * Conntrack converter implementation.
47  *
48  * @author Aswin Suryanarayanan.
49  */
50 public class ConntrackConvertor implements
51         ConvertorActionToOFJava<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
52         .Action, Action>,
53         ConvertorActionFromOFJava<Action, ActionPath> {
54
55     @Override
56     public org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
57                           .Action convert(final Action input, final ActionPath path) {
58         NxActionConntrack action = ((ActionConntrack) input.getActionChoice()).getNxActionConntrack();
59         NxConntrackBuilder builder = new NxConntrackBuilder();
60         builder.setFlags(action.getFlags());
61         builder.setZoneSrc(action.getZoneSrc());
62         builder.setRecircTable(action.getRecircTable());
63         builder.setConntrackZone(action.getConntrackZone());
64         builder.setCtActions(getCtAction(action));
65         return resolveAction(builder.build(), path);
66     }
67
68     @Override
69     public Action convert(final org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
70             .Action nxActionArg) {
71         Preconditions.checkArgument(nxActionArg instanceof NxActionConntrackGrouping);
72         NxActionConntrackGrouping nxAction = (NxActionConntrackGrouping) nxActionArg;
73
74         NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder();
75         nxActionConntrackBuilder.setFlags(nxAction.getNxConntrack().getFlags());
76         nxActionConntrackBuilder.setZoneSrc(nxAction.getNxConntrack().getZoneSrc());
77         nxActionConntrackBuilder.setRecircTable(nxAction.getNxConntrack().getRecircTable());
78         nxActionConntrackBuilder.setConntrackZone(nxAction.getNxConntrack().getConntrackZone());
79         nxActionConntrackBuilder.setCtActions(getCtAction(nxAction.getNxConntrack()));
80         ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder();
81         actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build());
82         return ActionUtil.createAction(actionConntrackBuilder.build());
83     }
84
85     private static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
86                         .Action resolveAction(final NxConntrack value, final ActionPath path) {
87         switch (path) {
88             case INVENTORY_FLOWNODE_TABLE_WRITE_ACTIONS:
89                 return new NxActionConntrackNodesNodeTableFlowWriteActionsCaseBuilder().setNxConntrack(value).build();
90             case FLOWS_STATISTICS_UPDATE_WRITE_ACTIONS:
91                 return new NxActionConntrackNotifFlowsStatisticsUpdateWriteActionsCaseBuilder()
92                         .setNxConntrack(value).build();
93             case FLOWS_STATISTICS_UPDATE_APPLY_ACTIONS:
94                 return new NxActionConntrackNotifFlowsStatisticsUpdateApplyActionsCaseBuilder()
95                         .setNxConntrack(value).build();
96             case GROUP_DESC_STATS_UPDATED_BUCKET_ACTION:
97                 return new NxActionConntrackNotifGroupDescStatsUpdatedCaseBuilder().setNxConntrack(value).build();
98             case FLOWS_STATISTICS_RPC_WRITE_ACTIONS:
99                 return new NxActionConntrackNotifDirectStatisticsUpdateWriteActionsCaseBuilder()
100                         .setNxConntrack(value).build();
101             case FLOWS_STATISTICS_RPC_APPLY_ACTIONS:
102                 return new NxActionConntrackNotifDirectStatisticsUpdateApplyActionsCaseBuilder()
103                         .setNxConntrack(value).build();
104             case INVENTORY_FLOWNODE_TABLE_APPLY_ACTIONS:
105                 return new NxActionConntrackNodesNodeTableFlowApplyActionsCaseBuilder().setNxConntrack(value).build();
106             default:
107                 throw new CodecPreconditionException(path);
108         }
109     }
110
111     private static List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action
112                         .conntrack.grouping.nx.action.conntrack.CtActions> getCtAction(final NxConntrack action) {
113         if (action.getCtActions() == null) {
114             return null;
115         }
116         List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack
117             .grouping.nx.action.conntrack.CtActions> ctActions = new ArrayList<>();
118         for (CtActions ctAction : action.getCtActions()) {
119             OfpactActions ofpactAction = ctAction.getOfpactActions();
120             if (ofpactAction instanceof NxActionNatCase) {
121                 NxActionNat nxActionNat = ((NxActionNatCase) ofpactAction).getNxActionNat();
122                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact
123                     .actions.nx.action.nat._case.NxActionNatBuilder nxActionNatBuilder = new org.opendaylight.yang.gen
124                     .v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat
125                     ._case.NxActionNatBuilder();
126                 nxActionNatBuilder.setFlags(nxActionNat.getFlags());
127                 nxActionNatBuilder.setRangePresent(nxActionNat.getRangePresent());
128                 nxActionNatBuilder.setIpAddressMin(nxActionNat.getIpAddressMin());
129                 nxActionNatBuilder.setIpAddressMax(nxActionNat.getIpAddressMax());
130                 nxActionNatBuilder.setPortMin(nxActionNat.getPortMin());
131                 nxActionNatBuilder.setPortMax(nxActionNat.getPortMax());
132                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact
133                     .actions.NxActionNatCaseBuilder caseBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight
134                     .openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder();
135                 caseBuilder.setNxActionNat(nxActionNatBuilder.build());
136                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack
137                     .grouping.nx.action.conntrack.CtActionsBuilder ctActionsBuilder = new org.opendaylight.yang.gen.v1
138                     .urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action
139                     .conntrack.CtActionsBuilder();
140                 ctActionsBuilder.setOfpactActions(caseBuilder.build());
141                 ctActions.add(ctActionsBuilder.build());
142             } else if (ofpactAction instanceof NxActionCtMarkCase) {
143                 NxActionCtMark nxActionCtMark = ((NxActionCtMarkCase) ofpactAction).getNxActionCtMark();
144                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact
145                     .actions.nx.action.ct.mark._case.NxActionCtMarkBuilder nxActionCtMarkBuilder =
146                         new org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact
147                             .actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMarkBuilder();
148                 nxActionCtMarkBuilder.setCtMark(nxActionCtMark.getCtMark());
149                 // TODO: ct_mark mask is not supported yet
150                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact
151                     .actions.NxActionCtMarkCaseBuilder caseBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight
152                     .openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionCtMarkCaseBuilder();
153                 caseBuilder.setNxActionCtMark(nxActionCtMarkBuilder.build());
154                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack
155                     .grouping.nx.action.conntrack.CtActionsBuilder ctActionsBuilder = new org.opendaylight.yang.gen.v1
156                     .urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action
157                     .conntrack.CtActionsBuilder();
158                 ctActionsBuilder.setOfpactActions(caseBuilder.build());
159                 ctActions.add(ctActionsBuilder.build());
160             }
161         }
162         return ctActions;
163     }
164
165     private static List<CtActions> getCtAction(final NxActionConntrack action) {
166         if (action.getCtActions() == null) {
167             return null;
168         }
169         List<CtActions> ctActions = new ArrayList<>();
170         for (org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack
171                 .grouping.nx.action.conntrack.CtActions ctAction : action.getCtActions()) {
172             org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions
173                 .OfpactActions ofpactAction = ctAction.getOfpactActions();
174             if (ofpactAction instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421
175                     .ofpact.actions.ofpact.actions.NxActionNatCase) {
176                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact
177                     .actions.nx.action.nat._case.NxActionNat nxActionNat = ((org.opendaylight.yang.gen.v1.urn
178                             .opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions
179                             .NxActionNatCase) ofpactAction).getNxActionNat();
180                 NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder();
181                 nxActionNatBuilder.setFlags(nxActionNat.getFlags());
182                 nxActionNatBuilder.setRangePresent(nxActionNat.getRangePresent());
183                 nxActionNatBuilder.setIpAddressMin(nxActionNat.getIpAddressMin());
184                 nxActionNatBuilder.setIpAddressMax(nxActionNat.getIpAddressMax());
185                 nxActionNatBuilder.setPortMin(nxActionNat.getPortMin());
186                 nxActionNatBuilder.setPortMax(nxActionNat.getPortMax());
187                 NxActionNatCaseBuilder caseBuilder = new NxActionNatCaseBuilder();
188                 caseBuilder.setNxActionNat(nxActionNatBuilder.build());
189                 CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
190                 ctActionsBuilder.setOfpactActions(caseBuilder.build());
191                 ctActions.add(ctActionsBuilder.build());
192             } else if (ofpactAction instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action
193                     .rev140421.ofpact.actions.ofpact.actions.NxActionCtMarkCase) {
194                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact
195                     .actions.nx.action.ct.mark._case.NxActionCtMark nxActionCtMark = ((org.opendaylight.yang.gen.v1.urn
196                             .opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions
197                             .NxActionCtMarkCase) ofpactAction).getNxActionCtMark();
198                 NxActionCtMarkBuilder nxActionCtMarkBuilder = new NxActionCtMarkBuilder();
199                 nxActionCtMarkBuilder.setCtMark(nxActionCtMark.getCtMark());
200                 // TODO: ct_mark mask is not supported yet
201                 NxActionCtMarkCaseBuilder caseBuilder = new NxActionCtMarkCaseBuilder();
202                 caseBuilder.setNxActionCtMark(nxActionCtMarkBuilder.build());
203                 CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
204                 ctActionsBuilder.setOfpactActions(caseBuilder.build());
205                 ctActions.add(ctActionsBuilder.build());
206             }
207         }
208         return ctActions;
209     }
210 }