Implement OFActionEnqueue (OpenFlow 1.0 only)

Realize the QUEUE Treatment using OpenFlow 1.0 Enqueue action.

The ConnectivityIntentCommand's --setQueue parameter is extended by a notion of
<port>/<queue> to support the difference from OpenFlow 1.3 Set-Queue, which is
not bound to a port.

Change-Id: I28cf70a7c004a1a3a14361e5186cfe42f09f1356
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
index aad407c..bcc8bd8 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.net.flow.instructions;
 
+import com.google.common.base.MoreObjects;
 import org.onlab.packet.EthType;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
@@ -99,11 +100,12 @@
      * Creates a set-queue instruction.
      *
      * @param queueId Queue Id
+     * @param port Port number
      * @return set-queue instruction
      */
-    public static SetQueueInstruction setQueue(final long queueId) {
+    public static SetQueueInstruction setQueue(final long queueId, final PortNumber port) {
         checkNotNull(queueId, "queue ID cannot be null");
-        return new SetQueueInstruction(queueId);
+        return new SetQueueInstruction(queueId, port);
     }
 
     public static MeterInstruction meterTraffic(final MeterId meterId) {
@@ -655,15 +657,26 @@
      */
     public static final class SetQueueInstruction implements Instruction {
         private final long queueId;
+        private final PortNumber port;
 
         private SetQueueInstruction(long queueId) {
             this.queueId = queueId;
+            this.port = null;
+        }
+
+        private SetQueueInstruction(long queueId, PortNumber port) {
+            this.queueId = queueId;
+            this.port = port;
         }
 
         public long queueId() {
             return queueId;
         }
 
+        public PortNumber port() {
+            return port;
+        }
+
         @Override
         public Type type() {
             return Type.QUEUE;
@@ -671,13 +684,18 @@
 
         @Override
         public String toString() {
-            return toStringHelper(type().toString())
-                    .add("queueId", queueId).toString();
+            MoreObjects.ToStringHelper toStringHelper = toStringHelper(type().toString());
+            toStringHelper.add("queueId", queueId);
+
+            if (port() != null) {
+                toStringHelper.add("port", port);
+            }
+            return toStringHelper.toString();
         }
 
         @Override
         public int hashCode() {
-            return Objects.hash(type().ordinal(), queueId);
+            return Objects.hash(type().ordinal(), queueId, port);
         }
 
         @Override
@@ -687,7 +705,7 @@
             }
             if (obj instanceof SetQueueInstruction) {
                 SetQueueInstruction that = (SetQueueInstruction) obj;
-                return Objects.equals(queueId, that.queueId);
+                return Objects.equals(queueId, that.queueId) && Objects.equals(port, that.port);
 
             }
             return false;