diff options
author | Martin Klozik <martinx.klozik@intel.com> | 2016-02-11 14:13:59 +0000 |
---|---|---|
committer | Maryam Tahhan <maryam.tahhan@intel.com> | 2016-02-23 11:37:18 +0000 |
commit | 463a1fd56b516687dc4714ad87685530a0e9b8d1 (patch) | |
tree | 56cdd3fcbaf3dacb4631b6de31df0b78751a7105 | |
parent | 9d4b0644730076007490afe0ca7ddddc3bc6b3ef (diff) |
CI: Generate test report and push logs and report to the artifactory
Script for CI job execution automatically generates final test
report, collects log files and pushes these results into artifactory.
Support for branch specific configuration file has been added.
Change-Id: Ifdf13b1c4c389f8d20dbc8e0ed99f43273e0820b
JIRA: VSPERF-181
Signed-off-by: Martin Klozik <martinx.klozik@intel.com>
Reviewed-by: Maryam Tahhan <maryam.tahhan@intel.com>
-rwxr-xr-x | ci/build-vsperf.sh | 177 | ||||
-rw-r--r-- | tools/report/report_head.rst | 4 | ||||
-rwxr-xr-x | vsperf | 25 | ||||
-rw-r--r-- | vswitches/ovs_dpdk_vhost.py | 2 | ||||
-rw-r--r-- | vswitches/ovs_vanilla.py | 2 |
5 files changed, 176 insertions, 34 deletions
diff --git a/ci/build-vsperf.sh b/ci/build-vsperf.sh index e08dd357..d50a431d 100755 --- a/ci/build-vsperf.sh +++ b/ci/build-vsperf.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# Copyright 2015 Intel Corporation. +# Copyright 2015-2016 Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -21,15 +21,22 @@ # where job_type is one of "verify", "merge", "daily" # -# configuration +# exit codes # EXIT=0 +EXIT_TC_FAILED=1 +EXIT_NO_RESULTS=10 +EXIT_NO_TEST_REPORT_LOG_DIR=11 + +# +# configuration +# + VSPERF_BIN='./vsperf' -LOG_FILE_USER='/tmp/vsperf_user.log' -LOG_FILE_VANILLA='/tmp/vsperf_vanilla.log' -LOG_FILE_PREFIX="/tmp/vsperf_build_" -OPNFV_POD="intel-pod3" +LOG_FILE_PREFIX="/tmp/vsperf_build" +DATE=$(date -u +"%Y-%m-%d_%H-%M-%S") +BRANCH=${GIT_BRANCH##*/} # CI job specific configuration # VERIFY - run basic set of TCs with default settings @@ -42,7 +49,32 @@ TESTPARAM_MERGE="" TESTCASES_DAILY='phy2phy_tput back2back phy2phy_tput_mod_vlan phy2phy_scalability pvp_tput pvp_back2back pvvp_tput pvvp_back2back' TESTPARAM_DAILY='--test-params pkt_sizes=64,128,512,1024,1518' # check if user config file exists if not then we will use default settings -[ -f $HOME/vsperf.conf ] && CONF_FILE="--conf-file ${HOME}/vsperf.conf" || CONF_FILE="" +if [ -f $HOME/vsperf-${BRANCH}.conf ] ; then + # branch specific config was found + CONF_FILE="--conf-file ${HOME}/vsperf-${BRANCH}.conf" +else + if [ -f $HOME/vsperf.conf ] ; then + CONF_FILE="--conf-file ${HOME}/vsperf.conf" + else + CONF_FILE="" + fi +fi + +# Test report related configuration +TEST_REPORT_PARTIAL="*_test_report.rst" +TEST_REPORT_DIR="${WORKSPACE}/docs/results" +TEST_REPORT_INDEX="${TEST_REPORT_DIR}/index.rst" +TEST_REPORT_LINK_OLD="https://wiki.opnfv.org/wiki/vsperf_results" +TEST_REPORT_FILE="${WORKSPACE}/docs_output/results/results.pdf" +TEST_REPORT_TARBALL="vswitchperf_logs_${DATE}.tar.gz" + +if [[ "x${BRANCH}" == "xmaster" ]]; then + TEST_REPORT_LINK_NEW="https://artifactory.opnfv.org/logs/$PROJECT/$NODE_NAME/$DATE/${TEST_REPORT_TARBALL}" +else + TEST_REPORT_LINK_NEW="https://artifactory.opnfv.org/logs/$PROJECT/$NODE_NAME/$BRANCH/$DATE/${TEST_REPORT_TARBALL}" +fi + +TEST_REPORT_LOG_DIR="${HOME}/opnfv/$PROJECT/results/$BRANCH" # # functions @@ -90,7 +122,7 @@ function print_results() { printf " %-70s %-6s\n" $RES_FILE "OK" else printf " %-70s %-6s\n" $RES_FILE "FAILED" - EXIT=1 + EXIT=$EXIT_TC_FAILED fi done } @@ -100,9 +132,6 @@ function print_results() { # $1 - vswitch and vnf combination, one of OVS_vanilla, OVS_with_DPDK_and_vHost_Cuse, OVS_with_DPDK_and_vHost_User # $2 - CI job type, one of verify, merge, daily function execute_vsperf() { - # figure out log file name - LOG_FILE="${LOG_FILE_PREFIX}"`date "+%Y%m%d_%H%M%S%N"`".log" - # figure out list of TCs and execution parameters case $2 in "verify") @@ -122,32 +151,44 @@ function execute_vsperf() { # execute testcases echo -e "\nExecution of VSPERF for $1" - # vsperf must be executed directly from vsperf directory - cd .. + + DATE_SUFFIX=$(date -u +"%Y-%m-%d_%H-%M-%S") + case $1 in "OVS_vanilla") - echo "$VSPERF_BIN --opnfvpod="$OPNFV_POD" --vswitch OvsVanilla --vnf QemuVirtioNet $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE" - $VSPERF_BIN --opnfvpod="$OPNFV_POD" --vswitch OvsVanilla --vnf QemuVirtioNet $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE + # figure out log file name + LOG_SUBDIR="OvsVanilla" + LOG_FILE="${LOG_FILE_PREFIX}_${LOG_SUBDIR}_${DATE_SUFFIX}.log" + + echo "$VSPERF_BIN --opnfvpod="$NODE_NAME" --vswitch OvsVanilla --vnf QemuVirtioNet $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE" + $VSPERF_BIN --opnfvpod="$NODE_NAME" --vswitch OvsVanilla --vnf QemuVirtioNet $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE ;; "OVS_with_DPDK_and_vHost_Cuse") - echo "$VSPERF_BIN --opnfvpod="$OPNFV_POD" --vswitch OvsDpdkVhost --vnf QemuDpdkVhostCuse $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE" - $VSPERF_BIN --opnfvpod="$OPNFV_POD" --vswitch OvsDpdkVhost --vnf QemuDpdkVhostCuse $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE + # figure out log file name + LOG_SUBDIR="OvsDpdkVhostCuse" + LOG_FILE="${LOG_FILE_PREFIX}_${LOG_SUBDIR}_${DATE_SUFFIX}.log" + + echo "$VSPERF_BIN --opnfvpod="$NODE_NAME" --vswitch OvsDpdkVhost --vnf QemuDpdkVhostCuse $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE" + $VSPERF_BIN --opnfvpod="$NODE_NAME" --vswitch OvsDpdkVhost --vnf QemuDpdkVhostCuse $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE ;; *) - echo "$VSPERF_BIN --opnfvpod="$OPNFV_POD" --vswitch OvsDpdkVhost --vnf QemuDpdkVhostUser $CONF_FILE $TESTPARAM $TESTCASES > $LOG_FILE" - $VSPERF_BIN --opnfvpod="$OPNFV_POD" --vswitch OvsDpdkVhost --vnf QemuDpdkVhostUser $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE + # figure out log file name + LOG_SUBDIR="OvsDpdkVhost" + LOG_FILE="${LOG_FILE_PREFIX}_${LOG_SUBDIR}_${DATE_SUFFIX}.log" + + echo "$VSPERF_BIN --opnfvpod="$NODE_NAME" --vswitch OvsDpdkVhost --vnf QemuDpdkVhostUser $CONF_FILE $TESTPARAM $TESTCASES > $LOG_FILE" + $VSPERF_BIN --opnfvpod="$NODE_NAME" --vswitch OvsDpdkVhost --vnf QemuDpdkVhostUser $CONF_FILE $TESTPARAM $TESTCASES &> $LOG_FILE ;; esac - # let's go back to CI dir - cd - # evaluation of results echo -e "\nResults for $1" - RES_DIR=`grep "Creating result directory" $LOG_FILE | cut -d'/' -f2-` - if [ "x" == "x${RES_DIR}" ] ; then + RES_DIR="/$(grep "Creating result directory" $LOG_FILE | cut -d'/' -f2-)" + if [[ "/" == "${RES_DIR}" ]] ; then echo "FAILURE: Results are not available." + exit $EXIT_NO_RESULTS else - print_results "/${RES_DIR}" + print_results "${RES_DIR}" fi # show detailed result figures @@ -161,12 +202,94 @@ function execute_vsperf() { # TC results sed -n '/Results\/Metrics Collected/,/Statistics collected/{/^$/p;/^|/p}' $md_file | grep -v "Unknown" | cat -s done + + # add test results into the final doc template + for report in ${RES_DIR}/${TEST_REPORT_PARTIAL} ; do + # modify link to the artifactory with test report and logs + if [ -f $report ] ; then + sed -i -e "s,$TEST_REPORT_LINK_OLD,$TEST_REPORT_LINK_NEW," "$report" + cp $report $TEST_REPORT_DIR + echo " $(basename $report)" >> $TEST_REPORT_INDEX + fi + done + + # copy logs into dedicated directory + mkdir ${TEST_REPORT_LOG_DIR}/${LOG_SUBDIR} + [ -f "$LOG_FILE" ] && cp -a "${LOG_FILE}" "${TEST_REPORT_LOG_DIR}/${LOG_SUBDIR}" &> /dev/null + [ -d "$RES_DIR" ] && cp -ar "$RES_DIR" "${TEST_REPORT_LOG_DIR}/${LOG_SUBDIR}" &> /dev/null +} + +# generates final test_report in PDF and HTML formats +function generate_report() { + + # prepare final tarball with all logs... + tar --exclude "${TEST_REPORT_TARBALL}" -czf "${TEST_REPORT_LOG_DIR}/${TEST_REPORT_TARBALL}" $(find "${TEST_REPORT_LOG_DIR}" -mindepth 1 -maxdepth 1 -type d) + # ...and remove original log files + find "${TEST_REPORT_LOG_DIR}" -mindepth 1 -maxdepth 1 -type d -exec rm -rf \{\} \; + + # clone releng repository + echo "Cloning releng repository..." + [ -d releng ] && rm -rf releng + git clone https://gerrit.opnfv.org/gerrit/releng &> /dev/null + + # generate final docs with test results + echo "Generating test report..." + sed -ie 's,python ,python2 ,g' ./releng/utils/docs-build.sh + ./releng/utils/docs-build.sh &> /dev/null + + # store PDF with test results into dedicated directory + if [ -f $TEST_REPORT_FILE ] ; then + cp -a $TEST_REPORT_FILE $TEST_REPORT_LOG_DIR + echo "Final test report has been created." + else + echo "FAILURE: Generation of final test report has failed." + fi +} + +# pushes test report and logs collected during test execution into artifactory +function push_results_to_artifactory() { + echo "Pushing results and logs into artifactory..." + . ./releng/utils/push-test-logs.sh "$DATE" + + # enter workspace as it could be modified by 3rd party script + cd $WORKSPACE +} + +# removes any local changes of repository +function cleanup() { + echo "Cleaning up..." + git stash -u +} + +# prepares directory for logs collection and removes old logs +function initialize_logdir() { + if [[ "x$TEST_REPORT_LOG_DIR" == "x" ]] ; then + echo "FAILURE: Logging directory is not defined. Logs and report cannot be published!" + exit $EXIT_NO_TEST_REPORT_LOG_DIR + else + # remove TEST_REPORT_LOG_DIR if it exists + if [ -e $TEST_REPORT_LOG_DIR ] ; then + if [ -f $TEST_REPORT_LOG_DIR ] ; then + rm $TEST_REPORT_LOG_DIR + else + rm -rf ${TEST_REPORT_LOG_DIR} + fi + fi + # create TEST_REPORT_LOG_DIR + mkdir -p $TEST_REPORT_LOG_DIR + fi } # # main # +# enter workspace dir +cd $WORKSPACE + +# initialization +initialize_logdir + # execute job based on passed parameter case $1 in "verify") @@ -195,6 +318,12 @@ case $1 in execute_vsperf OVS_vanilla $1 terminate_vsperf + generate_report + + push_results_to_artifactory + + cleanup + exit $EXIT ;; esac diff --git a/tools/report/report_head.rst b/tools/report/report_head.rst index b3947eb7..ae95173f 100644 --- a/tools/report/report_head.rst +++ b/tools/report/report_head.rst @@ -2,10 +2,6 @@ .. http://creativecommons.org/licenses/by/4.0 .. (c) OPNFV, Intel Corporation, AT&T and others. -========================================================================== -CHARACTERIZE VSWITCH PERFORMANCE FOR TELCO NFV USE CASES LEVEL TEST REPORT -========================================================================== - Introduction ============ The objective of the OPNFV project titled **"Characterise vSwitch Performance @@ -53,7 +53,8 @@ VERBOSITY_LEVELS = { _TEMPLATE_RST = {'head' : 'tools/report/report_head.rst', 'foot' : 'tools/report/report_foot.rst', - 'final' : 'test_report.rst' + 'final' : 'test_report.rst', + 'tmp' : 'tools/report/report_tmp_caption.rst' } def parse_arguments(): @@ -279,13 +280,29 @@ def generate_final_report(path): rst_results = glob.glob(os.path.join(path, 'result*rst')) if len(rst_results): try: - test_report = os.path.join(path, _TEMPLATE_RST['final']) - retval = subprocess.call('cat {} {} {} > {}'.format(_TEMPLATE_RST['head'], ' '.join(rst_results), - _TEMPLATE_RST['foot'], test_report), shell=True) + test_report = os.path.join(path, '{}_{}'.format(settings.getValue('VSWITCH'), _TEMPLATE_RST['final'])) + # create report caption directly - it is not worth to execute jinja machinery + report_caption = '{}\n{} {}\n{}\n\n'.format( + '============================================================', + 'Performance report for', + Loader().get_vswitches()[settings.getValue('VSWITCH')].__doc__.strip().split('\n')[0], + + '============================================================') + + with open(_TEMPLATE_RST['tmp'], 'w') as file_: + file_.write(report_caption) + + retval = subprocess.call('cat {} {} {} {} > {}'.format(_TEMPLATE_RST['tmp'], _TEMPLATE_RST['head'], + ' '.join(rst_results), _TEMPLATE_RST['foot'], + test_report), shell=True) if retval == 0 and os.path.isfile(test_report): logging.info('Overall test report written to "%s"', test_report) else: logging.error('Generatrion of overall test report has failed.') + + # remove temporary file + os.remove(_TEMPLATE_RST['tmp']) + except subprocess.CalledProcessError: logging.error('Generatrion of overall test report has failed.') diff --git a/vswitches/ovs_dpdk_vhost.py b/vswitches/ovs_dpdk_vhost.py index 447ce097..2ace64a2 100644 --- a/vswitches/ovs_dpdk_vhost.py +++ b/vswitches/ovs_dpdk_vhost.py @@ -24,7 +24,7 @@ from src.dpdk import dpdk _VSWITCHD_CONST_ARGS = ['--', '--pidfile', '--log-file'] class OvsDpdkVhost(IVSwitch): - """VSwitch implementation using DPDK and vhost ports + """ Open vSwitch with DPDK support Generic OVS wrapper functionality in src.ovs is maximally used. This class wraps DPDK system configuration along with DPDK specific OVS diff --git a/vswitches/ovs_vanilla.py b/vswitches/ovs_vanilla.py index 77d3deaf..078d7006 100644 --- a/vswitches/ovs_vanilla.py +++ b/vswitches/ovs_vanilla.py @@ -26,7 +26,7 @@ _LOGGER = logging.getLogger(__name__) VSWITCHD_CONST_ARGS = ['--', '--log-file'] class OvsVanilla(IVSwitch): - """VSwitch Vanilla implementation + """ Open vSwitch This is wrapper for functionality implemented in src.ovs. |