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/PortNumberCompleter.java b/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java
index 0a05d31..949f4f8 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PortNumberCompleter.java
@@ -15,15 +15,16 @@
  */
 package org.onosproject.cli.net;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static org.onlab.osgi.DefaultServiceDirectory.getService;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
 import org.apache.karaf.shell.console.completer.ArgumentCompleter.ArgumentList;
 import org.onosproject.cli.AbstractChoicesCompleter;
+import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceService;
 
@@ -37,13 +38,22 @@
     @Override
     protected List<String> choices() {
         ArgumentList args = getArgumentList();
-        checkArgument(args.getCursorArgumentIndex() >= 1,
-                     "Expects DeviceId as previous argument");
-
-        String deviceIdStr = args.getArguments()[args.getCursorArgumentIndex() - 1];
-        DeviceId deviceId = DeviceId.deviceId(deviceIdStr);
-
+        //parse argument list for deviceId
         DeviceService deviceService = getService(DeviceService.class);
+        Device dev = null;
+        for (String str : args.getArguments()) {
+            if (str.contains(":")) {
+                dev = deviceService.getDevice(DeviceId.deviceId(str));
+                if (dev != null) {
+                    break;
+                }
+            }
+        }
+        if (dev == null) {
+            return Collections.singletonList("Missing device");
+        }
+        DeviceId deviceId = dev.id();
+
         return StreamSupport.stream(deviceService.getPorts(deviceId).spliterator(), false)
             .map(port -> port.number().toString())
             .collect(Collectors.toList());