2 * Copyright (c) 2015, 2017 Hewlett-Packard Enterprise and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.action;
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;
46 * Conntrack converter implementation.
48 * @author Aswin Suryanarayanan.
50 public class ConntrackConvertor implements
51 ConvertorActionToOFJava<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
53 ConvertorActionFromOFJava<Action, ActionPath> {
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);
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;
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());
85 private static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
86 .Action resolveAction(final NxConntrack value, final ActionPath 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();
107 throw new CodecPreconditionException(path);
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) {
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());
165 private static List<CtActions> getCtAction(final NxActionConntrack action) {
166 if (action.getCtActions() == null) {
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());