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