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.util.ArrayList;
11 import java.util.List;
12 import java.util.stream.Collectors;
13 import org.opendaylight.genius.mdsalutil.ActionInfo;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModAddMatchFromFieldCaseBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModAddMatchFromValueCaseBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModCopyFieldIntoFieldCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModCopyValueIntoFieldCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.flow.mod.spec.flow.mod.spec.FlowModOutputToPortCaseBuilder;
22 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;
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.value._case.FlowModAddMatchFromValueBuilder;
24 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;
25 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;
26 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;
27 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;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.learn.grouping.NxLearnBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.learn.grouping.nx.learn.FlowMods;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.learn.grouping.nx.learn.FlowModsBuilder;
31 import org.opendaylight.yangtools.yang.common.Uint64;
36 public class ActionLearn extends ActionInfo {
38 private final int idleTimeout;
39 private final int hardTimeout;
40 private final int priority;
41 private final Uint64 cookie;
42 private final int flags;
43 private final short tableId;
44 private final int finIdleTimeout;
45 private final int finHardTimeout;
46 private final List<FlowMod> flowMods = new ArrayList<>();
48 public ActionLearn(int idleTimeout, int hardTimeout, int priority, Uint64 cookie, int flags, short tableId,
49 int finIdleTimeout, int finHardTimeout, List<FlowMod> flowMods) {
50 this(0, idleTimeout, hardTimeout, priority, cookie, flags, tableId, finIdleTimeout, finHardTimeout, flowMods);
53 public ActionLearn(int actionKey, int idleTimeout, int hardTimeout, int priority, Uint64 cookie, int flags,
54 short tableId, int finIdleTimeout, int finHardTimeout, List<FlowMod> flowMods) {
56 this.idleTimeout = idleTimeout;
57 this.hardTimeout = hardTimeout;
58 this.priority = priority;
61 this.tableId = tableId;
62 this.finIdleTimeout = finIdleTimeout;
63 this.finHardTimeout = finHardTimeout;
64 this.flowMods.addAll(flowMods);
68 public Action buildAction() {
69 return buildAction(getActionKey());
73 public Action buildAction(int newActionKey) {
74 NxLearnBuilder learnBuilder = new NxLearnBuilder();
76 .setIdleTimeout(idleTimeout)
77 .setHardTimeout(hardTimeout)
78 .setPriority(priority)
82 .setFinIdleTimeout(finIdleTimeout)
83 .setFinHardTimeout(finHardTimeout);
85 learnBuilder.setFlowMods(this.flowMods.stream().map(FlowMod::buildFlowMod).collect(Collectors.toList()));
87 return new ActionBuilder()
88 .withKey(new ActionKey(newActionKey))
89 .setAction(new NxActionLearnNodesNodeTableFlowApplyActionsCaseBuilder()
90 .setNxLearn(learnBuilder.build()).build())
94 public int getIdleTimeout() {
98 public int getHardTimeout() {
102 public int getPriority() {
106 public Uint64 getCookie() {
110 public int getFlags() {
114 public short getTableId() {
118 public int getFinIdleTimeout() {
119 return finIdleTimeout;
122 public int getFinHardTimeout() {
123 return finHardTimeout;
126 public List<FlowMod> getFlowMods() {
131 public boolean equals(Object other) {
135 if (other == null || getClass() != other.getClass()) {
138 if (!super.equals(other)) {
142 ActionLearn that = (ActionLearn) other;
144 if (idleTimeout != that.idleTimeout) {
147 if (hardTimeout != that.hardTimeout) {
150 if (priority != that.priority) {
153 if (flags != that.flags) {
156 if (tableId != that.tableId) {
159 if (finIdleTimeout != that.finIdleTimeout) {
162 if (finHardTimeout != that.finHardTimeout) {
165 if (cookie != null ? !cookie.equals(that.cookie) : that.cookie != null) {
168 return flowMods.equals(that.flowMods);
172 public int hashCode() {
173 int result = super.hashCode();
174 result = 31 * result + idleTimeout;
175 result = 31 * result + hardTimeout;
176 result = 31 * result + priority;
177 result = 31 * result + (cookie != null ? cookie.hashCode() : 0);
178 result = 31 * result + flags;
179 result = 31 * result + tableId;
180 result = 31 * result + finIdleTimeout;
181 result = 31 * result + finHardTimeout;
182 result = 31 * result + flowMods.hashCode();
187 public String toString() {
188 return "ActionLearn [actionKey=" + getActionKey() + ", idleTimeout=" + idleTimeout + ", hardTimeout="
189 + hardTimeout + ", priority=" + priority + ", cookie=" + cookie + ", flags=" + flags + ", tableId="
190 + tableId + ", finIdleTimeout=" + finIdleTimeout + ", finHardTimeout=" + finHardTimeout + ", flowMods="
194 public interface FlowMod {
195 FlowMods buildFlowMod();
198 public static class MatchFromField implements FlowMod {
199 private final long sourceField;
200 private final int srcOffset;
201 private final long destField;
202 private final int dstOffset;
203 private final int bits;
205 public MatchFromField(long sourceField, int srcOffset, long destField, int dstOffset, int bits) {
206 this.sourceField = sourceField;
207 this.srcOffset = srcOffset;
208 this.destField = destField;
209 this.dstOffset = dstOffset;
213 public MatchFromField(long sourceField, long destField, int bits) {
214 this(sourceField, 0, destField, 0, bits);
217 public long getSourceField() {
221 public long getDestField() {
225 public int getBits() {
229 public int getSrcOffset() {
233 public int getDstOffset() {
238 public FlowMods buildFlowMod() {
239 FlowModAddMatchFromFieldBuilder builder = new FlowModAddMatchFromFieldBuilder();
240 builder.setSrcField(sourceField);
241 builder.setSrcOfs(srcOffset);
242 builder.setDstField(destField);
243 builder.setDstOfs(dstOffset);
244 builder.setFlowModNumBits(bits);
246 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
247 FlowModAddMatchFromFieldCaseBuilder caseBuilder = new FlowModAddMatchFromFieldCaseBuilder();
248 caseBuilder.setFlowModAddMatchFromField(builder.build());
249 flowModsBuilder.setFlowModSpec(caseBuilder.build());
250 return flowModsBuilder.build();
254 public boolean equals(Object other) {
258 if (other == null || getClass() != other.getClass()) {
262 MatchFromField that = (MatchFromField) other;
264 if (sourceField != that.sourceField) {
267 if (destField != that.destField) {
270 if (srcOffset != that.srcOffset) {
273 if (dstOffset != that.dstOffset) {
276 return bits == that.bits;
280 public int hashCode() {
281 int result = (int) (sourceField ^ sourceField >>> 32);
282 result = 31 * result + (int) (destField ^ destField >>> 32);
283 result = 31 * result + srcOffset;
284 result = 31 * result + dstOffset;
285 result = 31 * result + bits;
290 public String toString() {
291 return "MatchFromField [sourceField=" + sourceField + ", srcOffset=" + srcOffset + ", destField="
292 + destField + ", dstOffset=" + dstOffset + ", bits=" + bits + "]";
296 public static class MatchFromValue implements FlowMod {
297 private final int value;
298 private final long sourceField;
299 private final int srcOffset;
300 private final int bits;
302 public MatchFromValue(int value, long sourceField, int srcOffset, int bits) {
304 this.sourceField = sourceField;
305 this.srcOffset = srcOffset;
309 public MatchFromValue(int value, long sourceField, int bits) {
310 this(value, sourceField, 0, bits);
313 public int getValue() {
317 public long getSourceField() {
321 public int getBits() {
325 public int getSrcOffset() {
330 public FlowMods buildFlowMod() {
331 FlowModAddMatchFromValueBuilder builder = new FlowModAddMatchFromValueBuilder();
332 builder.setValue(value);
333 builder.setSrcField(sourceField);
334 builder.setSrcOfs(srcOffset);
335 builder.setFlowModNumBits(bits);
337 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
338 FlowModAddMatchFromValueCaseBuilder caseBuilder = new FlowModAddMatchFromValueCaseBuilder();
339 caseBuilder.setFlowModAddMatchFromValue(builder.build());
340 flowModsBuilder.setFlowModSpec(caseBuilder.build());
341 return flowModsBuilder.build();
345 public boolean equals(Object other) {
349 if (other == null || getClass() != other.getClass()) {
353 MatchFromValue that = (MatchFromValue) other;
355 if (value != that.value) {
358 if (sourceField != that.sourceField) {
361 if (srcOffset != that.srcOffset) {
364 return bits == that.bits;
368 public int hashCode() {
370 result = 31 * result + (int) (sourceField ^ sourceField >>> 32);
371 result = 31 * result + srcOffset;
372 result = 31 * result + bits;
377 public String toString() {
378 return "MatchFromValue [value=" + value + ", sourceField=" + sourceField + ", srcOffset="
379 + srcOffset + ", bits=" + bits + "]";
383 public static class CopyFromField implements FlowMod {
384 private final long sourceField;
385 private final int srcOffset;
386 private final long destField;
387 private final int dstOffset;
388 private final int bits;
390 public CopyFromField(long sourceField, int srcOffset, long destField, int dstOffset, int bits) {
391 this.sourceField = sourceField;
392 this.srcOffset = srcOffset;
393 this.destField = destField;
394 this.dstOffset = dstOffset;
398 public CopyFromField(long sourceField, long destField, int bits) {
399 this(sourceField, 0, destField, 0, bits);
402 public long getSourceField() {
406 public long getDestField() {
410 public int getBits() {
414 public int getSrcOffset() {
418 public int getDstOffset() {
423 public FlowMods buildFlowMod() {
424 FlowModCopyFieldIntoFieldBuilder builder = new FlowModCopyFieldIntoFieldBuilder();
425 builder.setSrcField(sourceField);
426 builder.setSrcOfs(srcOffset);
427 builder.setDstField(destField);
428 builder.setDstOfs(dstOffset);
429 builder.setFlowModNumBits(bits);
431 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
432 FlowModCopyFieldIntoFieldCaseBuilder caseBuilder = new FlowModCopyFieldIntoFieldCaseBuilder();
433 caseBuilder.setFlowModCopyFieldIntoField(builder.build());
434 flowModsBuilder.setFlowModSpec(caseBuilder.build());
435 return flowModsBuilder.build();
439 public boolean equals(Object other) {
443 if (other == null || getClass() != other.getClass()) {
447 CopyFromField that = (CopyFromField) other;
449 if (sourceField != that.sourceField) {
452 if (destField != that.destField) {
455 if (srcOffset != that.srcOffset) {
458 if (dstOffset != that.dstOffset) {
461 return bits == that.bits;
465 public int hashCode() {
466 int result = (int) (sourceField ^ sourceField >>> 32);
467 result = 31 * result + (int) (destField ^ destField >>> 32);
468 result = 31 * result + srcOffset;
469 result = 31 * result + dstOffset;
470 result = 31 * result + bits;
475 public String toString() {
476 return "CopyFromField [sourceField=" + sourceField + ", srcOffset=" + srcOffset + ", destField="
477 + destField + ", dstOffset=" + dstOffset + ", bits=" + bits + "]";
481 public static class CopyFromValue implements FlowMod {
482 private final int value;
483 private final long destField;
484 private final int dstOffset;
485 private final int bits;
487 public CopyFromValue(int value, long destField, int bits) {
488 this(value, destField, 0, bits);
491 public CopyFromValue(int value, long destField, int dstOffset, int bits) {
493 this.destField = destField;
494 this.dstOffset = dstOffset;
498 public int getValue() {
502 public long getDestField() {
506 public int getBits() {
510 public int getDstOffset() {
515 public FlowMods buildFlowMod() {
516 FlowModCopyValueIntoFieldBuilder builder = new FlowModCopyValueIntoFieldBuilder();
517 builder.setValue(value);
518 builder.setDstField(destField);
519 builder.setDstOfs(dstOffset);
520 builder.setFlowModNumBits(bits);
522 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
523 FlowModCopyValueIntoFieldCaseBuilder caseBuilder = new FlowModCopyValueIntoFieldCaseBuilder();
524 caseBuilder.setFlowModCopyValueIntoField(builder.build());
525 flowModsBuilder.setFlowModSpec(caseBuilder.build());
526 return flowModsBuilder.build();
530 public boolean equals(Object other) {
534 if (other == null || getClass() != other.getClass()) {
538 CopyFromValue that = (CopyFromValue) other;
540 if (value != that.value) {
543 if (destField != that.destField) {
546 if (dstOffset != that.dstOffset) {
549 return bits == that.bits;
553 public int hashCode() {
555 result = 31 * result + (int) (destField ^ destField >>> 32);
556 result = 31 * result + dstOffset;
557 result = 31 * result + bits;
562 public String toString() {
563 return "CopyFromValue [value=" + value + ", destField=" + destField + ", dstOffset=" + dstOffset
564 + ", bits=" + bits + "]";
568 public static class OutputToPort implements FlowMod {
569 private final long sourceField;
570 private final int bits;
572 public OutputToPort(long sourceField, int bits) {
573 this.sourceField = sourceField;
577 public long getSourceField() {
581 public int getBits() {
586 public FlowMods buildFlowMod() {
587 FlowModOutputToPortBuilder builder = new FlowModOutputToPortBuilder();
588 builder.setSrcField(sourceField);
589 builder.setSrcOfs(0);
590 builder.setFlowModNumBits(bits);
592 FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
593 FlowModOutputToPortCaseBuilder caseBuilder = new FlowModOutputToPortCaseBuilder();
594 caseBuilder.setFlowModOutputToPort(builder.build());
595 flowModsBuilder.setFlowModSpec(caseBuilder.build());
596 return flowModsBuilder.build();
600 public boolean equals(Object other) {
604 if (other == null || getClass() != other.getClass()) {
608 OutputToPort that = (OutputToPort) other;
610 if (sourceField != that.sourceField) {
613 return bits == that.bits;
617 public int hashCode() {
618 int result = (int) (sourceField ^ sourceField >>> 32);
619 result = 31 * result + bits;
624 public String toString() {
625 return "OutputToPort [sourceField=" + sourceField + ", bits=" + bits + "]";