Added --all option for openstack-node-init command

Also show gateway group status to openstack-node-check result

Change-Id: Ifea3bb6af3b4f8d1ea63b2a1670497955cef85ec
diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
index 85da391..34f4a99 100644
--- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
+++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
@@ -18,12 +18,16 @@
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.Option;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeAdminService;
 import org.onosproject.openstacknode.api.OpenstackNodeService;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * Initializes nodes for OpenStack node service.
  */
@@ -31,8 +35,17 @@
         description = "Initializes nodes for OpenStack node service")
 public class OpenstackNodeInitCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "hostnames", description = "Hostname(s)",
-            required = true, multiValued = true)
+    @Option(name = "-a", aliases = "--all", description = "Apply this command to all nodes",
+            required = false, multiValued = false)
+    private boolean isAll = false;
+
+    @Option(name = "-i", aliases = "--incomplete",
+            description = "Apply this command to incomplete nodes",
+            required = false, multiValued = false)
+    private boolean isIncomplete = false;
+
+    @Argument(index = 0, name = "hostnames", description = "Hostname(s) to apply this command",
+            required = false, multiValued = true)
     private String[] hostnames = null;
 
     @Override
@@ -42,14 +55,37 @@
         OpenstackNodeAdminService osNodeAdminService =
                 AbstractShellCommand.get(OpenstackNodeAdminService.class);
 
+        if ((!isAll && !isIncomplete && hostnames == null) ||
+                (isAll && isIncomplete) ||
+                (isIncomplete && hostnames != null) ||
+                (hostnames != null && isAll)) {
+            print("Please specify one of hostname, --all, and --incomplete options.");
+            return;
+        }
+
+        if (isAll) {
+            List<String> osNodes = osNodeService.nodes().stream()
+                    .map(OpenstackNode::hostname)
+                    .collect(Collectors.toList());
+            hostnames = osNodes.toArray(new String[osNodes.size()]);
+        } else if (isIncomplete) {
+            List<String> osNodes = osNodeService.nodes().stream()
+                    .filter(osNode -> osNode.state() != NodeState.COMPLETE)
+                    .map(OpenstackNode::hostname)
+                    .collect(Collectors.toList());
+            hostnames = osNodes.toArray(new String[osNodes.size()]);
+        }
+
         for (String hostname : hostnames) {
             OpenstackNode osNode = osNodeService.node(hostname);
             if (osNode == null) {
                 print("Unable to find %s", hostname);
                 continue;
             }
+            print("Initializing %s", hostname);
             OpenstackNode updated = osNode.updateState(NodeState.INIT);
             osNodeAdminService.updateNode(updated);
         }
+        print("Done.");
     }
 }