2 * Copyright © 2016 Red Hat, Inc. and others.
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.genius.mdsalutil.actions;
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.stream.Collectors;
14 import org.opendaylight.genius.mdsalutil.ActionInfo;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModAddMatchFromFieldCaseBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModAddMatchFromValueCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModCopyFieldIntoFieldCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModCopyValueIntoFieldCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModOutputToPortCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.flow.mod.add.match.from.field._case.FlowModAddMatchFromFieldBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.flow.mod.add.match.from.value._case.FlowModAddMatchFromValueBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.flow.mod.copy.field.into.field._case.FlowModCopyFieldIntoFieldBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.flow.mod.copy.value.into.field._case.FlowModCopyValueIntoFieldBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.flow.mod.output.to.port._case.FlowModOutputToPortBuilder;
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.NxActionLearnNodesNodeTableFlowApplyActionsCaseBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.learn.grouping.NxLearnBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.learn.grouping.nx.learn.FlowMods;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.learn.grouping.nx.learn.FlowModsBuilder;
36 public class ActionLearn extends ActionInfo {
37 private final int idleTimeout;
38 private final int hardTimeout;
39 private final int priority;
40 private final BigInteger cookie;
41 private final int flags;
42 private final short tableId;
43 private final int finIdleTimeout;
44 private final int finHardTimeout;
45 private final List<FlowMod> flowMods = new ArrayList<>();
47 public ActionLearn(int idleTimeout, int hardTimeout, int priority, BigInteger cookie, int flags, short tableId,
48 int finIdleTimeout, int finHardTimeout, List<FlowMod> flowMods) {
49 this(0, idleTimeout, hardTimeout, priority, cookie, flags, tableId, finIdleTimeout, finHardTimeout, flowMods);
52 public ActionLearn(int actionKey, int idleTimeout, int hardTimeout, int priority, BigInteger cookie, int flags,
53 short tableId, int finIdleTimeout, int finHardTimeout, List<FlowMod> flowMods) {
55 this.idleTimeout = idleTimeout;
56 this.hardTimeout = hardTimeout;
57 this.priority = priority;
60 this.tableId = tableId;
61 this.finIdleTimeout = finIdleTimeout;
62 this.finHardTimeout = finHardTimeout;
63 this.flowMods.addAll(flowMods);
67 public Action buildAction() {
68 return buildAction(getActionKey());
71 public Action buildAction(int newActionKey) {
72 NxLearnBuilder learnBuilder = new NxLearnBuilder();
74 .setIdleTimeout(idleTimeout)
75 .setHardTimeout(hardTimeout)
76 .setPriority(priority)
80 .setFinIdleTimeout(finIdleTimeout)
81 .setFinHardTimeout(finHardTimeout);
83 learnBuilder.setFlowMods(this.flowMods.stream().map(FlowMod::buildFlowMod).collect(Collectors.toList()));
85 return new ActionBuilder()
86 .setKey(new ActionKey(newActionKey))
87 .setAction(new NxActionLearnNodesNodeTableFlowApplyActionsCaseBuilder()
88 .setNxLearn(learnBuilder.build()).build())
92 public int getIdleTimeout() {
96 public int getHardTimeout() {
100 public int getPriority() {
104 public BigInteger getCookie() {
108 public int getFlags() {
112 public short getTableId() {
116 public int getFinIdleTimeout() {
117 return finIdleTimeout;
120 public int getFinHardTimeout() {
121 return finHardTimeout;
124 public List<FlowMod> getFlowMods() {
129 public boolean equals(Object o) {
130 if (this == o) return true;
131 if (o == null || getClass() != o.getClass()) return false;
132 if (!super.equals(o)) return false;
134 ActionLearn that = (ActionLearn) o;
136 if (idleTimeout != that.idleTimeout) return false;
137 if (hardTimeout != that.hardTimeout) return false;
138 if (priority != that.priority) return false;
139 if (flags != that.flags) return false;
140 if (tableId != that.tableId) return false;
141 if (finIdleTimeout != that.finIdleTimeout) return false;
142 if (finHardTimeout != that.finHardTimeout) return false;
143 if (cookie != null ? !cookie.equals(that.cookie) : that.cookie != null) return false;
144 return flowMods.equals(that.flowMods);
148 public int hashCode() {
149 int result = super.hashCode();
150 result = 31 * result + idleTimeout;
151 result = 31 * result + hardTimeout;
152 result = 31 * result + priority;
153 result = 31 * result + (cookie != null ? cookie.hashCode() : 0);
154 result = 31 * result + flags;
155 result = 31 * result + (int) tableId;
156 result = 31 * result + finIdleTimeout;
157 result = 31 * result + finHardTimeout;
158 result = 31 * result + flowMods.hashCode();
162 public interface FlowMod {
163 FlowMods buildFlowMod();
166 public static class MatchFromField implements FlowMod {
167 private final long sourceField;
168 private final long destField;
169 private final int bits;
171 public MatchFromField(long sourceField, long destField, int bits) {
172 this.sourceField = sourceField;
173 this.destField = destField;
178 public FlowMods buildFlowMod() {
179 FlowModAddMatchFromFieldBuilder builder = new FlowModAddMatchFromFieldBuilder();
180 builder.setSrcField(sourceField);
181 builder.setSrcOfs(0);
182 builder.setDstField(destField);
183 builder.setDstOfs(0);
184 builder.setFlowModNumBits(bits);
186 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
187 FlowModAddMatchFromFieldCaseBuilder caseBuilder = new FlowModAddMatchFromFieldCaseBuilder();
188 caseBuilder.setFlowModAddMatchFromField(builder.build());
189 flowModsBuilder.setFlowModSpec(caseBuilder.build());
190 return flowModsBuilder.build();
194 public boolean equals(Object o) {
195 if (this == o) return true;
196 if (o == null || getClass() != o.getClass()) return false;
198 MatchFromField that = (MatchFromField) o;
200 if (sourceField != that.sourceField) return false;
201 if (destField != that.destField) return false;
202 return bits == that.bits;
206 public int hashCode() {
207 int result = (int) (sourceField ^ (sourceField >>> 32));
208 result = 31 * result + (int) (destField ^ (destField >>> 32));
209 result = 31 * result + bits;
214 public static class MatchFromValue implements FlowMod {
215 private final int value;
216 private final long sourceField;
217 private final int bits;
219 public MatchFromValue(int value, long sourceField, int bits) {
221 this.sourceField = sourceField;
226 public FlowMods buildFlowMod() {
227 FlowModAddMatchFromValueBuilder builder = new FlowModAddMatchFromValueBuilder();
228 builder.setValue(value);
229 builder.setSrcField(sourceField);
230 builder.setSrcOfs(0);
231 builder.setFlowModNumBits(bits);
233 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
234 FlowModAddMatchFromValueCaseBuilder caseBuilder = new FlowModAddMatchFromValueCaseBuilder();
235 caseBuilder.setFlowModAddMatchFromValue(builder.build());
236 flowModsBuilder.setFlowModSpec(caseBuilder.build());
237 return flowModsBuilder.build();
241 public boolean equals(Object o) {
242 if (this == o) return true;
243 if (o == null || getClass() != o.getClass()) return false;
245 MatchFromValue that = (MatchFromValue) o;
247 if (value != that.value) return false;
248 if (sourceField != that.sourceField) return false;
249 return bits == that.bits;
253 public int hashCode() {
255 result = 31 * result + (int) (sourceField ^ (sourceField >>> 32));
256 result = 31 * result + bits;
261 public static class CopyFromField implements FlowMod {
262 private final long sourceField;
263 private final long destField;
264 private final int bits;
266 public CopyFromField(long sourceField, long destField, int bits) {
267 this.sourceField = sourceField;
268 this.destField = destField;
273 public FlowMods buildFlowMod() {
274 FlowModCopyFieldIntoFieldBuilder builder = new FlowModCopyFieldIntoFieldBuilder();
275 builder.setSrcField(sourceField);
276 builder.setSrcOfs(0);
277 builder.setDstField(destField);
278 builder.setDstOfs(0);
279 builder.setFlowModNumBits(bits);
281 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
282 FlowModCopyFieldIntoFieldCaseBuilder caseBuilder = new FlowModCopyFieldIntoFieldCaseBuilder();
283 caseBuilder.setFlowModCopyFieldIntoField(builder.build());
284 flowModsBuilder.setFlowModSpec(caseBuilder.build());
285 return flowModsBuilder.build();
289 public boolean equals(Object o) {
290 if (this == o) return true;
291 if (o == null || getClass() != o.getClass()) return false;
293 CopyFromField that = (CopyFromField) o;
295 if (sourceField != that.sourceField) return false;
296 if (destField != that.destField) return false;
297 return bits == that.bits;
301 public int hashCode() {
302 int result = (int) (sourceField ^ (sourceField >>> 32));
303 result = 31 * result + (int) (destField ^ (destField >>> 32));
304 result = 31 * result + bits;
309 public static class CopyFromValue implements FlowMod {
310 private final int value;
311 private final long destField;
312 private final int bits;
314 public CopyFromValue(int value, long destField, int bits) {
316 this.destField = destField;
321 public FlowMods buildFlowMod() {
322 FlowModCopyValueIntoFieldBuilder builder = new FlowModCopyValueIntoFieldBuilder();
323 builder.setValue(value);
324 builder.setDstField(destField);
325 builder.setDstOfs(0);
326 builder.setFlowModNumBits(bits);
328 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
329 FlowModCopyValueIntoFieldCaseBuilder caseBuilder = new FlowModCopyValueIntoFieldCaseBuilder();
330 caseBuilder.setFlowModCopyValueIntoField(builder.build());
331 flowModsBuilder.setFlowModSpec(caseBuilder.build());
332 return flowModsBuilder.build();
336 public boolean equals(Object o) {
337 if (this == o) return true;
338 if (o == null || getClass() != o.getClass()) return false;
340 CopyFromValue that = (CopyFromValue) o;
342 if (value != that.value) return false;
343 if (destField != that.destField) return false;
344 return bits == that.bits;
348 public int hashCode() {
350 result = 31 * result + (int) (destField ^ (destField >>> 32));
351 result = 31 * result + bits;
356 public static class OutputToPort implements FlowMod {
357 private final long sourceField;
358 private final int bits;
360 public OutputToPort(long sourceField, int bits) {
361 this.sourceField = sourceField;
366 public FlowMods buildFlowMod() {
367 FlowModOutputToPortBuilder builder = new FlowModOutputToPortBuilder();
368 builder.setSrcField(sourceField);
369 builder.setSrcOfs(0);
370 builder.setFlowModNumBits(bits);
372 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
373 FlowModOutputToPortCaseBuilder caseBuilder = new FlowModOutputToPortCaseBuilder();
374 caseBuilder.setFlowModOutputToPort(builder.build());
375 flowModsBuilder.setFlowModSpec(caseBuilder.build());
376 return flowModsBuilder.build();
380 public boolean equals(Object o) {
381 if (this == o) return true;
382 if (o == null || getClass() != o.getClass()) return false;
384 OutputToPort that = (OutputToPort) o;
386 if (sourceField != that.sourceField) return false;
387 return bits == that.bits;
391 public int hashCode() {
392 int result = (int) (sourceField ^ (sourceField >>> 32));
393 result = 31 * result + bits;