From 73bdcde8cd1278884f45d2cbe47b5243d3162c12 Mon Sep 17 00:00:00 2001 From: Dmitry Sutyagin Date: Fri, 24 Feb 2017 14:41:01 -0800 Subject: [PATCH] Fix: exec_pair trace; SPT bugs; print non-0 exit - Fix crash when hitting logger.warning in exec_pair - Fix SPT bugs: - iperf sometimes not installed for HW to HW test - iperf_server_stop broken in several ways - glance download script has wrong filename - SPT_parser traces on empty glance output - Print to stdout on non-0 exit to tell about unclean exit to user - Reorder SPT copy-paste line once more Change-Id: I7a37b5fce5bc620cc9e2db8d232180c215cd3782 (cherry picked from commit 0f7a39be83d90a802315e0e1349ec8f8bbe62045) (cherry picked from commit 46ae4f44e7e7416f31f75d4b479671bb83639be8) --- specs/python-timmy.spec | 5 +- timmy/cli.py | 6 +-- timmy/env.py | 2 +- timmy/nodes.py | 17 +++---- timmy/tools.py | 30 +++++++---- .../SPT_parser.sh | 51 ++++++++++--------- ...download.sh => glance-2-image-download.sh} | 0 .../scripts/iperf-server-start.sh | 2 +- .../scripts/iperf-server-stop.sh | 6 +-- 9 files changed, 64 insertions(+), 55 deletions(-) rename timmy_data/simplified-performance-testing/scripts/{glance-1-image-download.sh => glance-2-image-download.sh} (100%) diff --git a/specs/python-timmy.spec b/specs/python-timmy.spec index c92b073..b59a907 100644 --- a/specs/python-timmy.spec +++ b/specs/python-timmy.spec @@ -4,7 +4,7 @@ %global pypi_name timmy Name: python-%{pypi_name} -Version: 1.26.7 +Version: 1.26.8 Release: 1%{?dist}~mos0 Summary: Log collector tool for OpenStack Fuel @@ -107,6 +107,9 @@ popd %changelog +* Fri Feb 24 2017 Dmitry Sutyagin - 1.26.8 +- Fix: exec_pair trace; SPT bugs; print non-0 exit + * Thu Feb 23 2017 Dmitry Sutyagin - 1.26.7 - Fix: UnicodeDecodeError, broken spec; add SPT - Update documentation to match timmy 1.26.6 code diff --git a/timmy/cli.py b/timmy/cli.py index c711324..f197282 100755 --- a/timmy/cli.py +++ b/timmy/cli.py @@ -18,7 +18,7 @@ from timmy.analyze import analyze, analyze_print_results from timmy.env import project_name, version from timmy.nodes import Node -from timmy.tools import signal_wrapper +from timmy.tools import signal_wrapper, print_and_exit import argparse import logging import logging.handlers @@ -340,7 +340,7 @@ def main(argv=None): if not enough_space: logger.error('Not enough space for logs in "%s", exiting.' % nm.conf['archive_dir']) - sys.exit(100) + print_and_exit(100) if not conf['offline'] and not args.only_logs: if nm.has(Node.pkey): pretty_run(args.quiet, 'Uploading files', nm.put_files) @@ -395,4 +395,4 @@ def main(argv=None): if __name__ == '__main__': - sys.exit(main(sys.argv)) + main(sys.argv) diff --git a/timmy/env.py b/timmy/env.py index d53da5b..1c90fac 100644 --- a/timmy/env.py +++ b/timmy/env.py @@ -16,7 +16,7 @@ # under the License. project_name = 'timmy' -version = '1.26.7' +version = '1.26.8' if __name__ == '__main__': import sys diff --git a/timmy/nodes.py b/timmy/nodes.py index 73c867a..89f3338 100644 --- a/timmy/nodes.py +++ b/timmy/nodes.py @@ -24,12 +24,11 @@ from datetime import datetime, date, timedelta from timmy import conf from timmy.env import project_name, version from timmy import tools -from tools import w_list, run_with_lock +from tools import w_list, run_with_lock, print_and_exit import logging import os import re import shutil -import sys class Node(object): @@ -65,7 +64,7 @@ class Node(object): self.status = status if ip is None: self.logger.critical('Node: ip address must be defined') - sys.exit(111) + print_and_exit(111) self.ip = ip self.network_data = network_data self.release = None @@ -337,7 +336,9 @@ class Node(object): nd = sn.network_data net_dict = dict((v['name'], v) for v in nd) if i['network'] not in net_dict: - self.logger.warning(nonet_msg % (self.repr, sn.repr)) + self.logger.warning(nonet_msg % (self.repr, + i['network'], + sn.repr)) return self.scripts_all_pairs if 'ip' not in net_dict[i['network']]: self.logger.warning(noip_msg % (self.repr, sn.repr, @@ -587,7 +588,7 @@ class NodeManager(object): if (not os.path.exists(self.rqdir)): self.logger.critical(('NodeManager: directory %s does not' ' exist') % self.rqdir) - sys.exit(101) + print_and_exit(101) if self.conf['rqfile']: self.import_rq() self.nodes = {} @@ -980,9 +981,5 @@ class NodeManager(object): return dict([(ip, n) for ip, n in self.nodes.items() if not n.skipped]) -def main(argv=None): - return 0 - - if __name__ == '__main__': - sys.exit(main(sys.argv)) + pass diff --git a/timmy/tools.py b/timmy/tools.py index c14c7f1..b4533a6 100644 --- a/timmy/tools.py +++ b/timmy/tools.py @@ -49,6 +49,14 @@ while 1: ''' +def print_and_exit(code): + msg = ('An error occured, exiting with code %s. See log or documentation' + ' for details.') + logger.error(msg % code) + print(msg % code) + sys.exit(code) + + def signal_wrapper(f): def wrapper(*args, **kwargs): setup_handle_sig() @@ -64,7 +72,7 @@ def signal_wrapper(f): if not k.startswith('__') and k != 'message': v = getattr(e, k) logger.debug('Error details: %s = %s' % (k, v)) - sys.exit(113) + print_and_exit(113) return wrapper @@ -86,7 +94,7 @@ def main_handle_sig(sig, frame): os.kill(int(pid), sig) except OSError: pass - sys.exit(sig) + print_and_exit(sig) def sub_handle_sig(sig, frame): @@ -97,7 +105,7 @@ def sub_handle_sig(sig, frame): os.killpg(os.getpid(), sig) except OSError: pass - sys.exit(sig) + print_and_exit(sig) def setup_handle_sig(subprocess=False): @@ -196,7 +204,7 @@ def run_batch(item_list, maxthreads, dict_result=False): for line in exc_text.splitlines(): logger.critical('____%s' % line) cleanup(l) - sys.exit(109) + print_and_exit(109) remove_procs.append(key) for key in remove_procs: logger.debug(rem_msg % key) @@ -243,10 +251,10 @@ def load_json_file(filename): except IOError as e: logger.critical("I/O error(%s): file: %s; msg: %s" % (e.errno, e.filename, e.strerror)) - sys.exit(107) + print_and_exit(107) except ValueError: logger.critical("Could not convert data", exc_info=True) - sys.exit(108) + print_and_exit(108) def load_yaml_file(filename): @@ -259,14 +267,14 @@ def load_yaml_file(filename): except IOError as e: logger.critical("I/O error(%s): file: %s; msg: %s" % (e.errno, e.filename, e.strerror)) - sys.exit(102) + print_and_exit(102) except ValueError: logger.critical("Could not convert data", exc_info=True) - sys.exit(103) + print_and_exit(103) except yaml.parser.ParserError as e: logger.critical("Could not parse %s:\n%s" % (filename, str(e))) - sys.exit(105) + print_and_exit(104) def mdir(directory): @@ -279,7 +287,7 @@ def mdir(directory): os.makedirs(directory) except OSError: logger.critical("Can't create a directory: %s" % directory) - sys.exit(110) + print_and_exit(110) def launch_cmd(cmd, timeout, input=None, ok_codes=None): @@ -439,4 +447,4 @@ def all_pairs(items, one_way=False, max_pairs=0): if __name__ == '__main__': - sys.exit(0) + pass diff --git a/timmy_data/simplified-performance-testing/SPT_parser.sh b/timmy_data/simplified-performance-testing/SPT_parser.sh index 93d264b..4f4ef57 100755 --- a/timmy_data/simplified-performance-testing/SPT_parser.sh +++ b/timmy_data/simplified-performance-testing/SPT_parser.sh @@ -63,15 +63,15 @@ elif word == "kB/s": if [ -n "$res_glance_create" ] then - res_gc=`head -n 4 $res_glance_create | grep '^[0-9.]\+$' | python -c 'import sys; print("%.2f" % (4000/float(sys.stdin.read(),)))'` - res_gc=${res_gc}'MB/s' + res_gc=`head -n 4 $res_glance_create | grep '^[0-9.]\+$' | \ + python -c 'import sys; print("%.2fMB/s" % (4000/float(sys.stdin.read(),)))' 2> /dev/null` fi print_result "Glance upload" $res_gc if [ -n "$res_glance_download" ] then - res_gd=`head -n 1 $res_glance_download | grep '^[0-9.]\+$' | python -c 'import sys; print("%.2f" % (4000/float(sys.stdin.read(),)))'` - res_gd=${res_gd}'MB/s' + res_gd=`head -n 1 $res_glance_download | grep '^[0-9.]\+$' | \ + python -c 'import sys; print("%.2fMB/s" % (4000/float(sys.stdin.read(),)))' 2> /dev/null` fi print_result "Glance download" $res_gd @@ -85,6 +85,8 @@ print_result "Block Storage Write 4k" $res_4k print_result "Block Storage Write 1M" $res_1m print_result "Block Storage Write 1G" $res_1g +[ -n "$res_iperf_node" ] && nnum="$(wc -l <<< "$res_iperf_node")" && print_result "Number of nodes (during iperf HW to HW tests)" $nnum + if [ -n "$res_iperf_host" ] then res_t1="" @@ -102,22 +104,6 @@ res_t10=`echo "$res_t10" | python -c 'import sys; print(float(sys.stdin.read())/ print_result "HW to HW (best)" $res_t1 print_result "HW to HW (best) - 10 Threads" $res_t10 -if [ -n "$res_iperf_vm" ] -then - res1=`head -n 8 $res_iperf_vm | tail -n 1 | grep '^\[.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` - res2=`head -n 17 $res_iperf_vm | tail -n 1 | grep '^\[.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` - res3=`head -n 44 $res_iperf_vm | tail -n 1 | grep '^\[SUM.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` - res4=`head -n 52 $res_iperf_vm | tail -n 1 | grep '^\[.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` - res5=`head -n 61 $res_iperf_vm | tail -n 1 | grep '^\[.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` -fi -print_result "VM to VM - VMs on same node - via Private IP - 1 thread" $res1 -print_result "VM to VM - VMs on different HW nodes - via Private IP - 1 thread" $res2 -print_result "VM to VM - VMs on different HW nodes - via Private IP - MILTI 10 thread" $res3 -print_result "VM to VM - via Floating IP and VMs are on different nodes - 1 thread" $res4 -print_result "VM to VM - diff nodes, VMs connected to separate networks connected by vRouter - via Private IP - 1 thread" $res5 - -[ -n "$res_iperf_node" ] && nnum="$(wc -l <<< "$res_iperf_node")" && print_result "Number of nodes (during iperf HW to HW tests)" $nnum - if [ -n "$res_iperf_host" ] then res_mt1="" @@ -135,20 +121,35 @@ res_mt10=`echo "$res_mt10" | python -c 'import sys; print(float(sys.stdin.read() print_result "HW to HW (worst)" $res_mt1 print_result "HW to HW (worst) - 10 Threads" $res_mt10 +if [ -n "$res_iperf_vm" ] +then + res1=`head -n 8 $res_iperf_vm | tail -n 1 | grep '^\[.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` + res2=`head -n 17 $res_iperf_vm | tail -n 1 | grep '^\[.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` + res3=`head -n 44 $res_iperf_vm | tail -n 1 | grep '^\[SUM.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` + res4=`head -n 52 $res_iperf_vm | tail -n 1 | grep '^\[.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` + res5=`head -n 61 $res_iperf_vm | tail -n 1 | grep '^\[.*sec' | rev | awk '{print $1$2}' | rev | sed 's/ //g'` +fi +print_result "VM to VM - VMs on same node - via Private IP - 1 thread" $res1 +print_result "VM to VM - VMs on different HW nodes - via Private IP - 1 thread" $res2 +print_result "VM to VM - VMs on different HW nodes - via Private IP - MILTI 10 thread" $res3 +print_result "VM to VM - via Floating IP and VMs are on different nodes - 1 thread" $res4 +print_result "VM to VM - diff nodes, VMs connected to separate networks connected by vRouter - via Private IP - 1 thread" $res5 + + echo "--------------------------" a `d $res_gc` a `d $res_gd` a `d $res_4k` a `d $res_1m` a `d $res_1g` -a $res_t1 # HW to HW -a $res_t10 # HW to HW +a $nnum +a $res_t1 +a $res_t10 +a $res_mt1 +a $res_mt10 a $(c `b $res1`) a $(c `b $res2`) a $(c `b $res3`) a $(c `b $res4`) a $(c `b $res5`) -a $nnum -a $res_mt1 # HW to HW max concurrency -a $res_mt10 # HW to HW max concurrency echo diff --git a/timmy_data/simplified-performance-testing/scripts/glance-1-image-download.sh b/timmy_data/simplified-performance-testing/scripts/glance-2-image-download.sh similarity index 100% rename from timmy_data/simplified-performance-testing/scripts/glance-1-image-download.sh rename to timmy_data/simplified-performance-testing/scripts/glance-2-image-download.sh diff --git a/timmy_data/simplified-performance-testing/scripts/iperf-server-start.sh b/timmy_data/simplified-performance-testing/scripts/iperf-server-start.sh index 6c70130..8099150 100644 --- a/timmy_data/simplified-performance-testing/scripts/iperf-server-start.sh +++ b/timmy_data/simplified-performance-testing/scripts/iperf-server-start.sh @@ -6,7 +6,7 @@ SPT_IPERF_PORT=${SPT_IPERF_PORT:-"65432"} which iperf &>/dev/null if [ "$?" -ne "0" ] then - result="$(DEBIAN_FRONTEND=noninteractive apt-get -y install iperf 2>&1)" + result="$(DEBIAN_FRONTEND=noninteractive apt-get -y --force-yes install iperf 2>&1)" [ "$?" -ne "0" ] && echo -e "failed to install iperf:\n$result" && exit 1 fi diff --git a/timmy_data/simplified-performance-testing/scripts/iperf-server-stop.sh b/timmy_data/simplified-performance-testing/scripts/iperf-server-stop.sh index b03d0dc..2c0f0ed 100644 --- a/timmy_data/simplified-performance-testing/scripts/iperf-server-stop.sh +++ b/timmy_data/simplified-performance-testing/scripts/iperf-server-stop.sh @@ -2,11 +2,11 @@ SPT_IPERF_PORT=${SPT_IPERF_PORT:-"65432"} -killall iperf -while ["$(iptables -L --line-numbers | grep -c 'spt-temporary-rule')" -ge 0 ] +killall -9 iperf +while [ "$(iptables -L --line-numbers | grep -c 'spt-temporary-rule')" -gt 0 ] do rulenum=`iptables -L --line-numbers | grep 'spt-temporary-rule' | head -n 1 | awk '{print $1}'` - [ -n "$sulenum" ] && [ "$rulenum" -ge 0 ] && iptables -D INPUT $rulenum + [ -n "$rulenum" ] && [ "$rulenum" -ge 0 ] && iptables -D INPUT $rulenum done if [ -n $SERVER_OUTPUT ] then