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
8 package org.opendaylight.openflowplugin.extension.vendor.nicira.convertor.action;
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;
45 * Conntrack converter implementation.
47 * @author Aswin Suryanarayanan.
49 public class ConntrackConvertor implements
50 ConvertorActionToOFJava<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
52 ConvertorActionFromOFJava<Action, ActionPath> {
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);
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;
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());
84 private static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
85 .Action resolveAction(final NxConntrack value, final ActionPath 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();
106 throw new CodecPreconditionException(path);
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) {
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());
164 private static List<CtActions> getCtAction(final NxActionConntrack action) {
165 if (action.getCtActions() == null) {
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());