41af6c5e7f74bede2f36dfd7841bddccf98c5a01
[genius.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / genius / mdsalutil / actions / ActionLearn.java
1 /*
2  * Copyright © 2016 Red Hat, Inc. and others.
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.genius.mdsalutil.actions;
9
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;
32
33 /**
34  * Learn action.
35  */
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<>();
46
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);
50     }
51
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) {
54         super(actionKey);
55         this.idleTimeout = idleTimeout;
56         this.hardTimeout = hardTimeout;
57         this.priority = priority;
58         this.cookie = cookie;
59         this.flags = flags;
60         this.tableId = tableId;
61         this.finIdleTimeout = finIdleTimeout;
62         this.finHardTimeout = finHardTimeout;
63         this.flowMods.addAll(flowMods);
64     }
65
66     @Override
67     public Action buildAction() {
68         return buildAction(getActionKey());
69     }
70
71     public Action buildAction(int newActionKey) {
72         NxLearnBuilder learnBuilder = new NxLearnBuilder();
73         learnBuilder
74             .setIdleTimeout(idleTimeout)
75             .setHardTimeout(hardTimeout)
76             .setPriority(priority)
77             .setCookie(cookie)
78             .setFlags(flags)
79             .setTableId(tableId)
80             .setFinIdleTimeout(finIdleTimeout)
81             .setFinHardTimeout(finHardTimeout);
82
83         learnBuilder.setFlowMods(this.flowMods.stream().map(FlowMod::buildFlowMod).collect(Collectors.toList()));
84
85         return new ActionBuilder()
86             .setKey(new ActionKey(newActionKey))
87             .setAction(new NxActionLearnNodesNodeTableFlowApplyActionsCaseBuilder()
88                 .setNxLearn(learnBuilder.build()).build())
89             .build();
90     }
91
92     public int getIdleTimeout() {
93         return idleTimeout;
94     }
95
96     public int getHardTimeout() {
97         return hardTimeout;
98     }
99
100     public int getPriority() {
101         return priority;
102     }
103
104     public BigInteger getCookie() {
105         return cookie;
106     }
107
108     public int getFlags() {
109         return flags;
110     }
111
112     public short getTableId() {
113         return tableId;
114     }
115
116     public int getFinIdleTimeout() {
117         return finIdleTimeout;
118     }
119
120     public int getFinHardTimeout() {
121         return finHardTimeout;
122     }
123
124     public List<FlowMod> getFlowMods() {
125         return flowMods;
126     }
127
128     @Override
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;
133
134         ActionLearn that = (ActionLearn) o;
135
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);
145     }
146
147     @Override
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();
159         return result;
160     }
161
162     public interface FlowMod {
163         FlowMods buildFlowMod();
164     }
165
166     public static class MatchFromField implements FlowMod {
167         private final long sourceField;
168         private final long destField;
169         private final int bits;
170
171         public MatchFromField(long sourceField, long destField, int bits) {
172             this.sourceField = sourceField;
173             this.destField = destField;
174             this.bits = bits;
175         }
176
177         @Override
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);
185
186             FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
187             FlowModAddMatchFromFieldCaseBuilder caseBuilder = new FlowModAddMatchFromFieldCaseBuilder();
188             caseBuilder.setFlowModAddMatchFromField(builder.build());
189             flowModsBuilder.setFlowModSpec(caseBuilder.build());
190             return flowModsBuilder.build();
191         }
192
193         @Override
194         public boolean equals(Object o) {
195             if (this == o) return true;
196             if (o == null || getClass() != o.getClass()) return false;
197
198             MatchFromField that = (MatchFromField) o;
199
200             if (sourceField != that.sourceField) return false;
201             if (destField != that.destField) return false;
202             return bits == that.bits;
203         }
204
205         @Override
206         public int hashCode() {
207             int result = (int) (sourceField ^ (sourceField >>> 32));
208             result = 31 * result + (int) (destField ^ (destField >>> 32));
209             result = 31 * result + bits;
210             return result;
211         }
212     }
213
214     public static class MatchFromValue implements FlowMod {
215         private final int value;
216         private final long sourceField;
217         private final int bits;
218
219         public MatchFromValue(int value, long sourceField, int bits) {
220             this.value = value;
221             this.sourceField = sourceField;
222             this.bits = bits;
223         }
224
225         @Override
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);
232
233             FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
234             FlowModAddMatchFromValueCaseBuilder caseBuilder = new FlowModAddMatchFromValueCaseBuilder();
235             caseBuilder.setFlowModAddMatchFromValue(builder.build());
236             flowModsBuilder.setFlowModSpec(caseBuilder.build());
237             return flowModsBuilder.build();
238         }
239
240         @Override
241         public boolean equals(Object o) {
242             if (this == o) return true;
243             if (o == null || getClass() != o.getClass()) return false;
244
245             MatchFromValue that = (MatchFromValue) o;
246
247             if (value != that.value) return false;
248             if (sourceField != that.sourceField) return false;
249             return bits == that.bits;
250         }
251
252         @Override
253         public int hashCode() {
254             int result = value;
255             result = 31 * result + (int) (sourceField ^ (sourceField >>> 32));
256             result = 31 * result + bits;
257             return result;
258         }
259     }
260
261     public static class CopyFromField implements FlowMod {
262         private final long sourceField;
263         private final long destField;
264         private final int bits;
265
266         public CopyFromField(long sourceField, long destField, int bits) {
267             this.sourceField = sourceField;
268             this.destField = destField;
269             this.bits = bits;
270         }
271
272         @Override
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);
280
281             FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
282             FlowModCopyFieldIntoFieldCaseBuilder caseBuilder = new FlowModCopyFieldIntoFieldCaseBuilder();
283             caseBuilder.setFlowModCopyFieldIntoField(builder.build());
284             flowModsBuilder.setFlowModSpec(caseBuilder.build());
285             return flowModsBuilder.build();
286         }
287
288         @Override
289         public boolean equals(Object o) {
290             if (this == o) return true;
291             if (o == null || getClass() != o.getClass()) return false;
292
293             CopyFromField that = (CopyFromField) o;
294
295             if (sourceField != that.sourceField) return false;
296             if (destField != that.destField) return false;
297             return bits == that.bits;
298         }
299
300         @Override
301         public int hashCode() {
302             int result = (int) (sourceField ^ (sourceField >>> 32));
303             result = 31 * result + (int) (destField ^ (destField >>> 32));
304             result = 31 * result + bits;
305             return result;
306         }
307     }
308
309     public static class CopyFromValue implements FlowMod {
310         private final int value;
311         private final long destField;
312         private final int bits;
313
314         public CopyFromValue(int value, long destField, int bits) {
315             this.value = value;
316             this.destField = destField;
317             this.bits = bits;
318         }
319
320         @Override
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);
327
328             FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
329             FlowModCopyValueIntoFieldCaseBuilder caseBuilder = new FlowModCopyValueIntoFieldCaseBuilder();
330             caseBuilder.setFlowModCopyValueIntoField(builder.build());
331             flowModsBuilder.setFlowModSpec(caseBuilder.build());
332             return flowModsBuilder.build();
333         }
334
335         @Override
336         public boolean equals(Object o) {
337             if (this == o) return true;
338             if (o == null || getClass() != o.getClass()) return false;
339
340             CopyFromValue that = (CopyFromValue) o;
341
342             if (value != that.value) return false;
343             if (destField != that.destField) return false;
344             return bits == that.bits;
345         }
346
347         @Override
348         public int hashCode() {
349             int result = value;
350             result = 31 * result + (int) (destField ^ (destField >>> 32));
351             result = 31 * result + bits;
352             return result;
353         }
354     }
355
356     public static class OutputToPort implements FlowMod {
357         private final long sourceField;
358         private final int bits;
359
360         public OutputToPort(long sourceField, int bits) {
361             this.sourceField = sourceField;
362             this.bits = bits;
363         }
364
365         @Override
366         public FlowMods buildFlowMod() {
367             FlowModOutputToPortBuilder builder = new FlowModOutputToPortBuilder();
368             builder.setSrcField(sourceField);
369             builder.setSrcOfs(0);
370             builder.setFlowModNumBits(bits);
371
372             FlowModsBuilder flowModsBuilder = new FlowModsBuilder();
373             FlowModOutputToPortCaseBuilder caseBuilder = new FlowModOutputToPortCaseBuilder();
374             caseBuilder.setFlowModOutputToPort(builder.build());
375             flowModsBuilder.setFlowModSpec(caseBuilder.build());
376             return flowModsBuilder.build();
377         }
378
379         @Override
380         public boolean equals(Object o) {
381             if (this == o) return true;
382             if (o == null || getClass() != o.getClass()) return false;
383
384             OutputToPort that = (OutputToPort) o;
385
386             if (sourceField != that.sourceField) return false;
387             return bits == that.bits;
388         }
389
390         @Override
391         public int hashCode() {
392             int result = (int) (sourceField ^ (sourceField >>> 32));
393             result = 31 * result + bits;
394             return result;
395         }
396     }
397 }