Fix ActionNxConntrack.NxNat problems with xtendbeans (with a test)
[genius.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / genius / mdsalutil / actions / ActionNxConntrack.java
index a159887d231358c90baa632ad1aa75bac9996e27..9f57b5c3ed34a040cc6e7b49144e0acfa7397fb5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016 Red Hat, Inc. and others.
+ * Copyright © 2016, 2017 Red Hat, Inc. and others.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -7,32 +7,56 @@
  */
 package org.opendaylight.genius.mdsalutil.actions;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
 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;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.NxConntrackBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.nx.conntrack.CtActions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.nx.conntrack.CtActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.NxActionCtMarkCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMarkBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNatBuilder;
 
 /**
  * NX conntrack action.
  */
 public class ActionNxConntrack extends ActionInfo {
+
     private final int flags;
     private final long zoneSrc;
     private final int conntrackZone;
     private final short recircTable;
+    private final List<NxCtAction> ctActions = new ArrayList<>();
 
     public ActionNxConntrack(int flags, long zoneSrc, int conntrackZone, short recircTable) {
-        this(0, flags, zoneSrc, conntrackZone, recircTable);
+        this(0, flags, zoneSrc, conntrackZone, recircTable, Collections.emptyList());
+    }
+
+    public ActionNxConntrack(int flags, long zoneSrc, int conntrackZone, short recircTable,
+            List<NxCtAction> ctActions) {
+        this(0, flags, zoneSrc, conntrackZone, recircTable, ctActions);
     }
 
     public ActionNxConntrack(int actionKey, int flags, long zoneSrc, int conntrackZone, short recircTable) {
+        this(actionKey, flags, zoneSrc, conntrackZone, recircTable, Collections.emptyList());
+    }
+
+    public ActionNxConntrack(int actionKey, int flags, long zoneSrc, int conntrackZone, short recircTable,
+            List<NxCtAction> ctActions) {
         super(actionKey);
         this.flags = flags;
         this.zoneSrc = zoneSrc;
         this.conntrackZone = conntrackZone;
         this.recircTable = recircTable;
+        this.ctActions.addAll(ctActions);
     }
 
     @Override
@@ -47,6 +71,7 @@ public class ActionNxConntrack extends ActionInfo {
                 .setZoneSrc(zoneSrc)
                 .setConntrackZone(conntrackZone)
                 .setRecircTable(recircTable);
+        ctb.setCtActions(this.ctActions.stream().map(NxCtAction::buildCtActions).collect(Collectors.toList()));
         ActionBuilder ab = new ActionBuilder();
         ab.setAction(new NxActionConntrackNodesNodeTableFlowApplyActionsCaseBuilder()
                 .setNxConntrack(ctb.build()).build());
@@ -70,6 +95,10 @@ public class ActionNxConntrack extends ActionInfo {
         return recircTable;
     }
 
+    public List<NxCtAction> getCtActions() {
+        return ctActions;
+    }
+
     @Override
     public boolean equals(Object other) {
         if (this == other) {
@@ -93,7 +122,10 @@ public class ActionNxConntrack extends ActionInfo {
         if (conntrackZone != that.conntrackZone) {
             return false;
         }
-        return recircTable == that.recircTable;
+        if (recircTable != that.recircTable) {
+            return false;
+        }
+        return ctActions.equals(that.ctActions);
     }
 
     @Override
@@ -103,6 +135,173 @@ public class ActionNxConntrack extends ActionInfo {
         result = 31 * result + (int) (zoneSrc ^ zoneSrc >>> 32);
         result = 31 * result + conntrackZone;
         result = 31 * result + recircTable;
+        result = 31 * result + ctActions.hashCode();
         return result;
     }
+
+    @Override
+    public String toString() {
+        return "ActionNxConntrack [flags=" + flags + ", zoneSrc=" + zoneSrc + ", conntrackZone=" + conntrackZone
+                + ", recircTable=" + recircTable + ", ctActions=" + ctActions + ", getActionKey()=" + getActionKey()
+                + "]";
+    }
+
+    public interface NxCtAction {
+        CtActions buildCtActions();
+    }
+
+    public static class NxNat implements NxCtAction {
+        private final int actionKey;
+        private final int flags;
+        private final int rangePresent;
+        private final IpAddress ipAddressMin;
+        private final IpAddress ipAddressMax;
+        private final int portMin;
+        private final int portMax;
+
+        public NxNat(int actionKey, int flags, int rangePresent, IpAddress ipAddressMin,
+                IpAddress ipAddressMax,int portMin, int portMax) {
+            this.actionKey = actionKey;
+            this.flags = flags;
+            this.rangePresent = rangePresent;
+            this.ipAddressMin = ipAddressMin;
+            this.ipAddressMax = ipAddressMax;
+            this.portMin = portMin;
+            this.portMax = portMax;
+        }
+
+        public int getActionKey() {
+            return actionKey;
+        }
+
+        public int getFlags() {
+            return flags;
+        }
+
+        public int getRangePresent() {
+            return rangePresent;
+        }
+
+        public IpAddress getIpAddressMin() {
+            return ipAddressMin;
+        }
+
+        public IpAddress getIpAddressMax() {
+            return ipAddressMax;
+        }
+
+        public int getPortMin() {
+            return portMin;
+        }
+
+        public int getPortMax() {
+            return portMax;
+        }
+
+        @Override
+        public CtActions buildCtActions() {
+            NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder()
+                    .setFlags(flags)
+                    .setRangePresent(rangePresent)
+                    .setIpAddressMin(ipAddressMin)
+                    .setIpAddressMax(ipAddressMax)
+                    .setPortMin(portMin)
+                    .setPortMax(portMax);
+
+            CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
+            NxActionNatCaseBuilder caseBuilder = new NxActionNatCaseBuilder();
+            caseBuilder.setNxActionNat(nxActionNatBuilder.build());
+            ctActionsBuilder.setOfpactActions(caseBuilder.build());
+            return ctActionsBuilder.build();
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (this == other) {
+                return true;
+            }
+            if (other == null || getClass() != other.getClass()) {
+                return false;
+            }
+
+            NxNat that = (NxNat) other;
+
+            if (flags != that.flags) {
+                return false;
+            }
+            if (rangePresent != that.rangePresent) {
+                return false;
+            }
+            if (ipAddressMin != null ? !ipAddressMin.equals(that.ipAddressMin) : that.ipAddressMin != null) {
+                return false;
+            }
+            if (ipAddressMax != null ? !ipAddressMax.equals(that.ipAddressMax) : that.ipAddressMax != null) {
+                return false;
+            }
+            if (portMin != that.portMin) {
+                return false;
+            }
+            return portMax == that.portMax;
+        }
+
+        @Override
+        public int hashCode() {
+            int result = flags;
+            result = 31 * result + rangePresent;
+            result = 31 * result + ipAddressMin.hashCode();
+            result = 31 * result + ipAddressMax.hashCode();
+            result = 31 * result + portMin;
+            result = 31 * result + portMax;
+            return result;
+        }
+
+        @Override
+        public String toString() {
+            return "NxNat [flags=" + flags + ", rangePresent=" + rangePresent + ", ipAddressMin=" + ipAddressMin
+                    + ", ipAddressMax=" + ipAddressMax + ", portMin=" + portMin + ", portMax=" + portMax + "]";
+        }
+    }
+
+    public static class NxCtMark implements NxCtAction {
+        private final long ctMark;
+
+        public NxCtMark(long ctMark) {
+            this.ctMark = ctMark;
+        }
+
+        public long getCtMark() {
+            return ctMark;
+        }
+
+        @Override
+        public CtActions buildCtActions() {
+            NxActionCtMarkBuilder nxActionCtMarkBuilder = new NxActionCtMarkBuilder()
+                    .setCtMark(ctMark);
+
+            CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
+            NxActionCtMarkCaseBuilder caseBuilder = new NxActionCtMarkCaseBuilder();
+            caseBuilder.setNxActionCtMark(nxActionCtMarkBuilder.build());
+            ctActionsBuilder.setOfpactActions(caseBuilder.build());
+            return ctActionsBuilder.build();
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            if (this == other) {
+                return true;
+            }
+            if (other == null || getClass() != other.getClass()) {
+                return false;
+            }
+
+            NxCtMark that = (NxCtMark) other;
+
+            return ctMark == that.ctMark;
+        }
+
+        @Override
+        public int hashCode() {
+            return 31 * (int) (ctMark ^ ctMark >>> 32);
+        }
+    }
 }