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