CORD-613 Adding ability to administratively enable or disable a port via CLI.
Currently uses the OpenFlow device provider to change portState.
Also fixes a bug in PortNumberCompleter.
Adds completion options to portstats for deviceId and portNumber.

Change-Id: Idcce775fe8bc5484fdd0e630bcb5026b85125478
diff --git a/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java b/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
index f9a8237..33ac366 100644
--- a/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
@@ -50,6 +50,10 @@
             required = false, multiValued = false)
     String uri = null;
 
+    @Argument(index = 1, name = "portNumber", description = "Port Number",
+            required = false, multiValued = false)
+    Integer portNumber = null;
+
     private static final String FORMAT =
             "   port=%s, pktRx=%s, pktTx=%s, bytesRx=%s, bytesTx=%s, pktRxDrp=%s, pktTxDrp=%s, Dur=%s";
 
@@ -94,6 +98,9 @@
     private void printPortStats(DeviceId deviceId, Iterable<PortStatistics> portStats) {
         print("deviceId=%s", deviceId);
         for (PortStatistics stat : sortByPort(portStats)) {
+            if (portNumber != null && stat.port() != portNumber) {
+                continue;
+            }
             print(FORMAT, stat.port(), stat.packetsReceived(), stat.packetsSent(), stat.bytesReceived(),
                     stat.bytesSent(), stat.packetsRxDropped(), stat.packetsTxDropped(), stat.durationSec());
         }
@@ -109,6 +116,9 @@
                 + " rateRx=%s, rateTx=%s, pktRxDrp=%s, pktTxDrp=%s, interval=%s";
         print("deviceId=%s", deviceId);
         for (PortStatistics stat : sortByPort(portStats)) {
+            if (portNumber != null && stat.port() != portNumber) {
+                continue;
+            }
             float duration = ((float) stat.durationSec()) +
                     (((float) stat.durationNano()) / TimeUnit.SECONDS.toNanos(1));
             float rateRx = stat.bytesReceived() * 8 / duration;
@@ -142,21 +152,24 @@
         print("|---------------------------------------------------------------------------------------------------|");
 
         for (PortStatistics stat : sortByPort(portStats)) {
-                float duration = ((float) stat.durationSec()) +
-                        (((float) stat.durationNano()) / TimeUnit.SECONDS.toNanos(1));
-                float rateRx = stat.bytesReceived() * 8 / duration;
-                float rateTx = stat.bytesSent() * 8 / duration;
-                print(formatDeltaTable, stat.port(),
-                        humanReadable(stat.packetsReceived()),
-                        humanReadable(stat.bytesReceived()),
-                        humanReadableBps(rateRx),
-                        humanReadable(stat.packetsRxDropped()),
-                        humanReadable(stat.packetsSent()),
-                        humanReadable(stat.bytesSent()),
-                        humanReadableBps(rateTx),
-                        humanReadable(stat.packetsTxDropped()),
-                        String.format("%.3f", duration));
+            if (portNumber != null && stat.port() != portNumber) {
+                continue;
             }
+            float duration = ((float) stat.durationSec()) +
+                    (((float) stat.durationNano()) / TimeUnit.SECONDS.toNanos(1));
+            float rateRx = stat.bytesReceived() * 8 / duration;
+            float rateTx = stat.bytesSent() * 8 / duration;
+            print(formatDeltaTable, stat.port(),
+                  humanReadable(stat.packetsReceived()),
+                  humanReadable(stat.bytesReceived()),
+                  humanReadableBps(rateRx),
+                  humanReadable(stat.packetsRxDropped()),
+                  humanReadable(stat.packetsSent()),
+                  humanReadable(stat.bytesSent()),
+                  humanReadableBps(rateTx),
+                  humanReadable(stat.packetsTxDropped()),
+                  String.format("%.3f", duration));
+        }
         print("+---------------------------------------------------------------------------------------------------+");
     }