Adding a tool for remote collection of node and cluster diagnostics.

- Includes 'onos-diagnostics', 'onos-node-diagnostics'
- Includes REST API /onos/v1/diagnostics

Change-Id: Ife0a15627b14238d0fce52b01b72d56e6a1fe40f
diff --git a/tools/package/runtime/bin/onos-diagnostics b/tools/package/runtime/bin/onos-diagnostics
new file mode 100755
index 0000000..51b3f8c
--- /dev/null
+++ b/tools/package/runtime/bin/onos-diagnostics
@@ -0,0 +1,137 @@
+#!/bin/bash
+
+#
+# Copyright 2015-present Open Networking Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# -----------------------------------------------------------------------------
+# Tool to collect cluster-wide diagnostics into a single tar stream.
+# -----------------------------------------------------------------------------
+function usage() {
+    echo "usage: $(basename $0) [-x] [-n name] [-u user] [-p password] [ip1 ip2...]"
+    echo ""
+    echo "Environment Variables:"
+    echo "    ONOS_INSTANCES    IPs or hostnames of ONOS cluster machines"
+    echo "    ONOS_WEB_USER     username for REST API"
+    echo "    ONOS_WEB_PASS     password for REST API"
+    echo ""
+    echo "Example Usages:"
+    echo "    # Collect compressed diagnostics for the cluster."
+    echo "    # REST API user and password are drawn from environment variables."
+    echo "    # Collection archive will be named /tmp/onos-diags.tar.gz"
+    echo "    # The cluster node IPs will be drawn from ONOS_INSTANCES variable."
+    echo "    > $(basename $0) "
+    echo ""
+    echo "    # Collect diagnostics for the cluster and leave them extracted. "
+    echo "    # Collection directory will be named /tmp/prague-diags/"
+    echo "    # Collection archive will be named /tmp/prague-diags.tar.gz."
+    echo "    # REST API user name is 'onos' and password is 'rules'."
+    echo "    # The cluster node IPs will be drawn from ONOS_INSTANCES variable."
+    echo "    > $(basename $0) -x -n prague -u onos -p rules"
+    echo ""
+    echo "    # Collect compressed diagnostics for a cluster."
+    echo "    # REST API user name is 'onos' and password is 'rules'."
+    echo "    # Collection archive will be named /tmp/onos-diags.tar.gz"
+    echo "    # The cluster node IPs are listed explicitly."
+    echo "    > $(basename $0) -u onos -p rules 172.17.0.11 172.17.0.12 172.17.0.13"
+
+    exit 1
+}
+
+CLI_COMMANDS=(
+    "feature:list"
+    "bundle:list"
+    "scr:list"
+
+    "summary"
+    "nodes"
+    "apps -s"
+    "netcfg"
+    "cfg get"
+
+    "devices"
+    "links"
+    "hosts"
+
+    "ports -e"
+    "portstats -nz"
+
+    "intents"
+    "flows -s"
+    "groups"
+
+    "roles"
+    "masters"
+
+    "routes"
+    "obj-next-ids"
+    "obj-pending-nexts"
+
+    "log:display -l WARN"
+)
+
+# Scan arguments for user/password or other options...
+while getopts n:u:p:x?h o; do
+    case "$o" in
+        n) name=$OPTARG;;
+        u) user=$OPTARG;;
+        p) password=$OPTARG;;
+        x) extract=true;;
+        *) usage;;
+    esac
+done
+ONOS_WEB_USER=${ONOS_WEB_USER:-onos} # ONOS WEB User defaults to 'onos'
+ONOS_WEB_PASS=${ONOS_WEB_PASS:-rocks} # ONOS WEB Password defaults to 'rocks'
+user=${user:-$ONOS_WEB_USER}
+password=${password:-$ONOS_WEB_PASS}
+let OPC=$OPTIND-1
+shift $OPC
+
+[ $# -lt 1 -a -z "$ONOS_INSTANCES" ] && usage;
+
+diags=/tmp/${name:-onos}-diags
+rm -fr $diags $diags.tar.gz; mkdir -p $diags
+
+[ -z $1 ] && nodes=$ONOS_INSTANCES || nodes=$*
+
+# Collect diagnostics from each cluster node
+for node in $nodes; do
+    printf "Collecting diagnostics on $node..."
+
+    # Prepare a clean place for collecting the node diagnostic data
+    cd $diags; rm -fr $node; mkdir -p $node; cd $node;
+
+    # Acquire locally obtained diagnostics via REST API and extract them
+    printf "logs "
+    curl -sS --fail --user $user:$password  \
+        http://$node:8181/onos/v1/diagnostics > ../$node.tar.gz
+    tar zxf ../$node.tar.gz
+
+    # Acquire remotely obtained diagnostics via ssh CLI
+    for cmd in "${CLI_COMMANDS[@]}"; do
+        cmdLog="$(echo $cmd | cut -d\  -f1 | sed 's/:/-/g').txt"
+        printf "$cmdLog "
+        onos $node $cmd 2>/dev/null >$cmdLog
+    done
+
+    # Tar-up local and remote diagnostics together
+    printf " Done.\n"
+    tar zcf ../$node.tar.gz *
+done
+
+# Tar-up diagnostics from all the nodes
+cd $diags
+tar zcf $diags.tar.gz *
+[ -z $extract ] && rm -fr $diags