blob: 655bb40bff4b0fef6894050ffb35914d779f6759 [file] [log] [blame]
Thomas Vachuska15370d22018-01-30 13:57:38 -08001#!/bin/bash
2
3#
4# Copyright 2015-present Open Networking Foundation
5#
6# Licensed under the Apache License, Version 2.0 (the "License");
7# you may not use this file except in compliance with the License.
8# You may obtain a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS,
14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
17#
18
19# -----------------------------------------------------------------------------
20# Tool to collect cluster-wide diagnostics into a single tar stream.
21# -----------------------------------------------------------------------------
22function usage() {
Seyeon Jeong357bcec2020-02-28 01:17:34 -080023 echo "usage: $(basename $0) [-x] [-j] [-n name] [-P port] [-u user] [-p password] [ip1 ip2...]"
Thomas Vachuska15370d22018-01-30 13:57:38 -080024 echo ""
25 echo "Environment Variables:"
26 echo " ONOS_INSTANCES IPs or hostnames of ONOS cluster machines"
27 echo " ONOS_WEB_USER username for REST API"
28 echo " ONOS_WEB_PASS password for REST API"
29 echo ""
30 echo "Example Usages:"
31 echo " # Collect compressed diagnostics for the cluster."
32 echo " # REST API user and password are drawn from environment variables."
33 echo " # Collection archive will be named /tmp/onos-diags.tar.gz"
34 echo " # The cluster node IPs will be drawn from ONOS_INSTANCES variable."
35 echo " > $(basename $0) "
36 echo ""
37 echo " # Collect diagnostics for the cluster and leave them extracted. "
38 echo " # Collection directory will be named /tmp/prague-diags/"
39 echo " # Collection archive will be named /tmp/prague-diags.tar.gz."
40 echo " # REST API user name is 'onos' and password is 'rules'."
41 echo " # The cluster node IPs will be drawn from ONOS_INSTANCES variable."
42 echo " > $(basename $0) -x -n prague -u onos -p rules"
43 echo ""
Seyeon Jeong357bcec2020-02-28 01:17:34 -080044 echo " # Collect diagnostics for the cluster and store them in JSON files."
45 echo " # JSON_CLI_COMMANDS below lists JSON-supported diagnostics commands."
46 echo " # Collection archive will be named /tmp/onos-diags.tar.gz"
47 echo " > $(basename $0) -j"
48 echo ""
Thomas Vachuska15370d22018-01-30 13:57:38 -080049 echo " # Collect compressed diagnostics for a cluster."
50 echo " # REST API user name is 'onos' and password is 'rules'."
51 echo " # Collection archive will be named /tmp/onos-diags.tar.gz"
52 echo " # The cluster node IPs are listed explicitly."
53 echo " > $(basename $0) -u onos -p rules 172.17.0.11 172.17.0.12 172.17.0.13"
54
55 exit 1
56}
57
Thomas Vachuskaa7be50d2018-04-16 14:02:18 -070058ONOS_WEB_USER=${ONOS_WEB_USER:-onos} # ONOS WEB User defaults to 'onos'
59ONOS_WEB_PASS=${ONOS_WEB_PASS:-rocks} # ONOS WEB Password defaults to 'rocks'
60ONOS_WEB_PORT=${ONOS_WEB_PORT:-8181} # REST API port defaults to '8181'
61
62. $(dirname $0)/_find-node
63
Charles Chanc6576fa2018-03-08 14:59:42 -080064# TODO We should make SR commands optional
Thomas Vachuska15370d22018-01-30 13:57:38 -080065CLI_COMMANDS=(
Thomas Vachuskaa40aa0b2018-02-01 15:52:10 -080066 "feature:repo-list"
Thomas Vachuska15370d22018-01-30 13:57:38 -080067 "feature:list"
68 "bundle:list"
Charles Chandc77af52019-02-12 17:47:41 -080069 "scr-list"
Thomas Vachuska15370d22018-01-30 13:57:38 -080070
71 "summary"
72 "nodes"
73 "apps -s"
74 "netcfg"
75 "cfg get"
76
77 "devices"
Seyeon Jeong1e249102020-03-10 17:41:14 -070078 "device-drivers"
Thomas Vachuska15370d22018-01-30 13:57:38 -080079 "links"
80 "hosts"
Pier4099f052018-04-05 20:45:40 +020081 "interfaces"
Thomas Vachuska15370d22018-01-30 13:57:38 -080082
Seyeon Jeong357bcec2020-02-28 01:17:34 -080083 "ports"
Thomas Vachuska15370d22018-01-30 13:57:38 -080084 "portstats -nz"
Seyeon Jeong357bcec2020-02-28 01:17:34 -080085 "edge-ports"
Thomas Vachuska15370d22018-01-30 13:57:38 -080086
Thomas Vachuska7f2a3562018-02-28 10:02:16 -080087 "packet-processors"
88 "packet-requests"
89
Thomas Vachuska15370d22018-01-30 13:57:38 -080090 "intents"
Seyeon Jeong357bcec2020-02-28 01:17:34 -080091 "flows"
Thomas Vachuska15370d22018-01-30 13:57:38 -080092 "groups"
93
94 "roles"
95 "masters"
96
Pierb1858582018-05-02 13:31:12 +020097 "maps"
98
Charles Chanc6576fa2018-03-08 14:59:42 -080099 "fpm-connections"
Thomas Vachuska15370d22018-01-30 13:57:38 -0800100 "routes"
101 "obj-next-ids"
102 "obj-pending-nexts"
Charles Chan8b7df412018-04-24 10:23:21 -0700103 "obj-queues"
Thomas Vachuska15370d22018-01-30 13:57:38 -0800104
Charles Chanc6576fa2018-03-08 14:59:42 -0800105 "sr-device-subnets"
106 "sr-ecmp-spg"
Charles Chan8bc75ee2018-04-17 18:56:53 -0700107 "sr-should-program"
Charles Chanc6576fa2018-03-08 14:59:42 -0800108 "sr-link-state"
Charles Chanc6576fa2018-03-08 14:59:42 -0800109 "sr-mcast-tree"
Pier954b3682018-04-18 08:50:29 +0200110 "sr-mcast-leader"
Pierb1858582018-05-02 13:31:12 +0200111 "sr-mcast-role"
Andreas Pantelopoulosff691b72018-03-12 16:30:20 -0700112 "sr-pw-list"
Charles Chan3fe60be2018-10-26 15:54:32 -0700113 "sr-next-mcast"
Harshada Chaundkar72f3b9d2019-07-02 16:01:24 +0000114 "sr-filt-mcast"
Charles Chan3fe60be2018-10-26 15:54:32 -0700115 "sr-next-dst"
116 "sr-next-port"
117 "sr-next-vlan"
118 "sr-next-pw"
119 "sr-next-xconnect"
Ruchi Sahotaef0761c2019-01-28 01:08:18 +0000120 "sr-next-mac-vlan"
Charles Chan4d73add2020-02-14 13:23:57 -0800121 "sr-pr-list"
Charles Chanc6576fa2018-03-08 14:59:42 -0800122 "dhcp-relay"
Pier4099f052018-04-05 20:45:40 +0200123
124 "mcast-host-routes"
125 "mcast-host-show"
Thomas Vachuska15370d22018-01-30 13:57:38 -0800126)
127
Seyeon Jeong357bcec2020-02-28 01:17:34 -0800128JSON_CLI_COMMANDS=(
129 "netcfg -j"
130 "devices -j"
131 "device-drivers -j"
132 "links -j"
133 "hosts -j"
134 "ports -j"
135 "edge-ports -j"
136 "flows -j"
137 "groups -j"
138 "masters -j"
139 "routes -j"
140 "mcast-host-show -j"
141)
142
Thomas Vachuskaa7be50d2018-04-16 14:02:18 -0700143port=${ONOS_WEB_PORT}
144user=${ONOS_WEB_USER}
145password=${ONOS_WEB_PASS}
146
Thomas Vachuska15370d22018-01-30 13:57:38 -0800147# Scan arguments for user/password or other options...
Seyeon Jeong357bcec2020-02-28 01:17:34 -0800148while getopts n:P:u:p:x?j?h o; do
Thomas Vachuska15370d22018-01-30 13:57:38 -0800149 case "$o" in
150 n) name=$OPTARG;;
Thomas Vachuskaa7be50d2018-04-16 14:02:18 -0700151 P) port=$OPTARG;;
Thomas Vachuska15370d22018-01-30 13:57:38 -0800152 u) user=$OPTARG;;
153 p) password=$OPTARG;;
154 x) extract=true;;
Seyeon Jeong357bcec2020-02-28 01:17:34 -0800155 j) json=true;;
Thomas Vachuska15370d22018-01-30 13:57:38 -0800156 *) usage;;
157 esac
158done
Thomas Vachuska7f2a3562018-02-28 10:02:16 -0800159
Thomas Vachuska15370d22018-01-30 13:57:38 -0800160let OPC=$OPTIND-1
161shift $OPC
162
163[ $# -lt 1 -a -z "$ONOS_INSTANCES" ] && usage;
164
165diags=/tmp/${name:-onos}-diags
166rm -fr $diags $diags.tar.gz; mkdir -p $diags
167
168[ -z $1 ] && nodes=$ONOS_INSTANCES || nodes=$*
169
170# Collect diagnostics from each cluster node
171for node in $nodes; do
172 printf "Collecting diagnostics on $node..."
173
174 # Prepare a clean place for collecting the node diagnostic data
175 cd $diags; rm -fr $node; mkdir -p $node; cd $node;
176
177 # Acquire locally obtained diagnostics via REST API and extract them
178 printf "logs "
179 curl -sS --fail --user $user:$password \
Thomas Vachuskaa7be50d2018-04-16 14:02:18 -0700180 http://$node:$port/onos/v1/diagnostics > ../$node.tar.gz
Thomas Vachuska7f2a3562018-02-28 10:02:16 -0800181 tar zxf ../$node.tar.gz && rm ../$node.tar.gz
Thomas Vachuska15370d22018-01-30 13:57:38 -0800182
183 # Acquire remotely obtained diagnostics via ssh CLI
Seyeon Jeong357bcec2020-02-28 01:17:34 -0800184 [ ! -z $json ] && CLI_COMMANDS=("${JSON_CLI_COMMANDS[@]}")
Thomas Vachuska15370d22018-01-30 13:57:38 -0800185 for cmd in "${CLI_COMMANDS[@]}"; do
186 cmdLog="$(echo $cmd | cut -d\ -f1 | sed 's/:/-/g').txt"
Seyeon Jeong357bcec2020-02-28 01:17:34 -0800187 [ ! -z $json ] && cmdLog="${cmdLog%.txt}.json"
Thomas Vachuska15370d22018-01-30 13:57:38 -0800188 printf "$cmdLog "
189 onos $node $cmd 2>/dev/null >$cmdLog
190 done
191
Thomas Vachuska15370d22018-01-30 13:57:38 -0800192 printf " Done.\n"
Thomas Vachuska15370d22018-01-30 13:57:38 -0800193done
194
195# Tar-up diagnostics from all the nodes
196cd $diags
197tar zcf $diags.tar.gz *
198[ -z $extract ] && rm -fr $diags