From 37e67f46e74137f55ffc0d698d335b25cb24ec21 Mon Sep 17 00:00:00 2001 From: yuyang Date: Mon, 12 Sep 2016 07:33:12 +0800 Subject: Adding Posca Testsuite in Bottlenecks JIRA: BOTTLENECK-92 The POSCA (Parametric Bottlenecks Testing Catalogue) testsuite classifies the bottlenecks test cases and results into 5 categories. Then the results will be analyzed and decoupled bottlenecks will be searched among these categories. The POSCA testsuite aims to locate the bottlenecks in parmetric manner and to decouple the bottlenecks regarding the deployment requirements. The POSCA testsuite provides an user friendly way to profile and understand the E2E system behavior and deployment requirements. Goals of the POSCA testsuite: a) Automatically locate the bottlenecks in a iterative manner. b) Automatically generate the testing report for bottlenecks in different categories. c) Implementing Automated Staging. Scopes of the POSCA testsuite: a) Modeling, Testing and Test Result analysis. b) Parameters choosing and Algorithms Test stories of the POSCA testsuite: a) Factor test: base test cases that Feature test and Optimization will be dependant on b) Feature test: test cases for features/scenarios c) Optimization test: test to tune the system parameter For more details of the proposal, please refer to https://jira.opnfv.org/secure/attachment/11479/ POSCA%20Testsuite%20Proposal%20in%20Bottlenecks.pdf Changes: 1. Add Posca testsuite directories and files to Bottleneks, leaving adding test cases for latter commits. 2. Fix file appd issue. 3. Delete the un-used packages in testsuites/posca/run_posca.py 4. Add testcase processing logic to run_posca.py 5. Add config dimensions 6. Add scripts directory Change-Id: I54d9b51381a804b76a83680912227e058da3165e Signed-off-by: yuyang --- run_tests.sh | 22 +++++++++++- testsuites/posca/run_posca.py | 39 ++++++++++++++++++++++ .../posca_factor_system_bandwidth.yaml | 11 ++++++ testsuites/posca/testcase_script/__init__.py | 8 +++++ testsuites/posca/testsuite_story/posca_factor_test | 1 + 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100755 testsuites/posca/run_posca.py create mode 100755 testsuites/posca/testcase_cfg/posca_factor_system_bandwidth.yaml create mode 100644 testsuites/posca/testcase_script/__init__.py create mode 100644 testsuites/posca/testsuite_story/posca_factor_test diff --git a/run_tests.sh b/run_tests.sh index d5c30592..ad0b31c5 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -26,7 +26,7 @@ examples: report=true -arr_test_suite=(rubbos vstf) +arr_test_suite=(rubbos vstf posca) function check_testcase(){ @@ -38,6 +38,9 @@ function check_testcase(){ "-vstf") SUITE_PREFIX=$SUITE_PREFIX_CONFIG/vstf/testcase_cfg ;; + "-posca") + SUITE_PREFIX=$SUITE_PREFIX_CONFIG/posca/testcase_cfg + ;; esac TEST_CASE=$2 @@ -99,6 +102,23 @@ function run_test(){ python /home/opnfv/bottlenecks/testsuites/vstf/run_vstf.py -c $file done ;; + "posca") + info "Running posca test suite" + test_file="/home/opnfv/bottlenecks/testsuites/posca/testsuite_story/posca_factor_test" + if [[ -f $test_file ]]; then + testcases=($(cat $test_file)) + else + error "no posca test suite file " + fi + for i in "${testcases[@]}"; do + #check if the testcase is legal or not + check_testcase -posca $i + #adjust config parameters + #run test case + file=${BASEDIR}/testsuites/posca/testcase_cfg/${i}.yaml + python /home/opnfv/bottlenecks/testsuites/posca/run_posca.py -c $file + done + ;; esac } diff --git a/testsuites/posca/run_posca.py b/testsuites/posca/run_posca.py new file mode 100755 index 00000000..9f90b3c7 --- /dev/null +++ b/testsuites/posca/run_posca.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +import os +import sys +import subprocess + +INTERPRETER = "/usr/bin/python" +#------------------------------------------------------ +# run posca testcase +# ------------------------------------------------------ +def posca_run(arg): + print "========== run posca ===========" + if(arg == "factor_system_bandwidth"): + print "========== run posca_system_bandwidth ===========" + cmd = '/home/opnfv/bottlenecks/testsuites/posca/testcase_script/posca_factor_system_bandwidth.py' + pargs = [INTERPRETER,cmd] + sub_result = subprocess.Popen(pargs) + sub_result.wait() + +def posca_env_check(): + print "========== posca env check ===========" + +def main(): + para_testname = sys.argv[0] + para_test_arg = sys.argv[1] + posca_env_check() + posca_run(para_test_arg) + sys.exit(0) + +if __name__=='__main__': + main() diff --git a/testsuites/posca/testcase_cfg/posca_factor_system_bandwidth.yaml b/testsuites/posca/testcase_cfg/posca_factor_system_bandwidth.yaml new file mode 100755 index 00000000..113997cd --- /dev/null +++ b/testsuites/posca/testcase_cfg/posca_factor_system_bandwidth.yaml @@ -0,0 +1,11 @@ +[config] +test_ip: 192.168.23.2:8888 +tool: netperf +protocol: tcp +test_time: 30 +tx pkt sizes: 8, 16, 32, 64, 128, 256, 512, 1024 +rx pkt sizes: 8, 16, 32, 64, 128, 256, 512, 1024 +tx cache sizes: 2304, 4608, 9216, 18432, 32768, 65536 +rx cache sizes: 1152, 2304, 4608, 9216, 18432, 32768, 65536, 131072 +cpu load: 0.9 +latency: 100000 diff --git a/testsuites/posca/testcase_script/__init__.py b/testsuites/posca/testcase_script/__init__.py new file mode 100644 index 00000000..83b8d15d --- /dev/null +++ b/testsuites/posca/testcase_script/__init__.py @@ -0,0 +1,8 @@ +############################################################################## +# Copyright (c) 2015 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## diff --git a/testsuites/posca/testsuite_story/posca_factor_test b/testsuites/posca/testsuite_story/posca_factor_test new file mode 100644 index 00000000..a19fce59 --- /dev/null +++ b/testsuites/posca/testsuite_story/posca_factor_test @@ -0,0 +1 @@ +posca_factor_system_bandwidth \ No newline at end of file -- cgit 1.2.3-korg From b9850595c9b27752fe48ce874f8dc90d473d9e60 Mon Sep 17 00:00:00 2001 From: yuyang Date: Sun, 18 Sep 2016 05:38:13 +0800 Subject: Add Factor Testcase TX PKT Size JIRA: BOTTLENECK-99 Add factor testcase to locate the bottleneck of tx pkt size. A separated logic for determine if the tx pkt size is the system bottleneck is provided. Change-Id: I9ccbe19c88a72170b66fffd7f1bd7e5a45dbdc27 Signed-off-by: yuyang --- .../testcase_cfg/posca_factor_tx_pkt_size.yaml | 12 ++ .../testcase_script/posca_factor_tx_pkt_size.py | 122 +++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 testsuites/posca/testcase_cfg/posca_factor_tx_pkt_size.yaml create mode 100644 testsuites/posca/testcase_script/posca_factor_tx_pkt_size.py diff --git a/testsuites/posca/testcase_cfg/posca_factor_tx_pkt_size.yaml b/testsuites/posca/testcase_cfg/posca_factor_tx_pkt_size.yaml new file mode 100644 index 00000000..dcceee02 --- /dev/null +++ b/testsuites/posca/testcase_cfg/posca_factor_tx_pkt_size.yaml @@ -0,0 +1,12 @@ +[config] +test_ip: 192.168.23.2:8888 +throughput: 1000 +tool: netperf +protocol: tcp +test_time: 30 +tx pkt sizes: 8 +rx pkt sizes: 8,16,32,64,128,256,512,1024,2048 +tx cache sizes: 2304,4608,9216,18432,32768,65536 +rx cache sizes: 1152,2304,4608,9216,18432,32768,65536,131072 +cpu load: 0.9 +latency: 100000 diff --git a/testsuites/posca/testcase_script/posca_factor_tx_pkt_size.py b/testsuites/posca/testcase_script/posca_factor_tx_pkt_size.py new file mode 100644 index 00000000..4b44c853 --- /dev/null +++ b/testsuites/posca/testcase_script/posca_factor_tx_pkt_size.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +import os +import argparse +import time +import logging +import ConfigParser +import json + +#------------------------------------------------------ +# parser for configuration files in each test case +# ------------------------------------------------------ +parser = argparse.ArgumentParser() +parser.add_argument("-c", "--conf", + help="configuration files for the testcase, in yaml format", + default="/home/opnfv/bottlenecks/testsuites/posca/testcase_cfg/posca_factor_tx_pkt_size.yaml") +args = parser.parse_args() + +cmd="curl -i" +order_arg="-H \"Content-Type: application/json\" -X POST -d \'{\"cmd\": \"start\", \"opts\":{\"output-file\": \"/tem/yardstick.out\"}, \"args\": \"../samples/netperf.yaml\"}'" + +#-------------------------------------------------- +# logging configuration +#-------------------------------------------------- +logger = logging.getLogger(__name__) + +def posca_env_check(): + print "========== posca system bandwidth env check ===========" + if os.path.exists(r'/home/opnfv/bottlenecks/testsuites/posca/test_result/'): + return True + else: + os.mkdirs(r'/home/opnfv/bottlenecks/testsuites/posca/test_result/') + +def posca_output_result(time_new,input_1,input_2,input_3,input_4,input_5,input_6): + save_dic={} + save_dic['rx_pkt_size']=input_1 + save_dic['tx_cache_size']=input_2 + save_dic['tx_cache_size']=input_3 + save_dic['throughput']=input_4 + save_dic['latency']=input_5 + save_dic['cpu_load']=input_6 + with open("/home/opnfv/bottlenecks/testsuites/posca/test_result/factor_tx_pkt_size_%s.json"%(time_new),"a") as f: + f.write(json.dumps(save_dic,f)) + f.write("\n") + +def posca_config_read(config_str): + print "========== posca system bandwidth config read ===========" + + con_dic = {} + config = ConfigParser.ConfigParser() + with open(config_str,"rd") as cfgfile: + config.readfp(cfgfile) + con_dic['test_ip']=config.get("config","test_ip") + con_dic['test_tool']=config.get("config","tool") + con_dic['test_time']=config.get("config","test_time") + con_dic['test_protocol']=config.get("config","protocol") + con_dic['test_tx_pkt_s']=config.get("config","tx pkt sizes") + con_dic['test_rx_pkt_s']=config.get("config","rx pkt sizes") + con_dic['test_tx_cache_s']=config.get("config","tx cache sizes") + con_dic['test_rx_cache_s']=config.get("config","rx cache sizes") + con_dic['test_cpu_load']=config.get("config","cpu load") + con_dic['test_latency']=config.get("config","latency") + + return con_dic + +def posca_run(con_dic): + print "========== run posca system bandwidth ===========" + + test_rx_pkt_s_a = con_dic['test_rx_pkt_s'].split(',') + test_tx_cache_s_a = con_dic['test_tx_cache_s'].split(',') + test_rx_cache_s_a = con_dic['test_rx_cache_s'].split(',') + time_new = time.strftime('%H_%M',time.localtime(time.time())) + bandwidth_tmp = 1 + + for test_rx_cache_s_e in test_rx_cache_s_a: + for test_tx_cache_s_e in test_tx_cache_s_a: + for test_rx_pkt_s_e in test_rx_pkt_s_a: + print "%s,%s,%s"%(test_rx_pkt_s_e,test_tx_cache_s_e,test_rx_cache_s_e) + order_excute = os.popen("%s %s http://%s/api/v3/yardstick/tasks/task %s %s %s"%(cmd,order_arg,con_dic['test_ip'],test_rx_pkt_s_e,test_rx_cache_s_e,test_tx_cache_s_e)) + order_result = order_excute.read() + task_id = order_result.find("task_id") + time.sleep(con_dic['test_time']) + cmd_excute = os.popen( "%s http://%s/api/v3/yardstick/testresults?task_id=%s"%(cmd,con_dic['test_ip'],task_id)) + test_result = cmd_excute.read() + bandwidth = test_result.find("bandwidth") + cpu_load = test_result.find("cpu_load") + latency = test_result.find("latency") + posca_output_result(time_new,test_rx_pkt_s_e,test_rx_cache_s_e,test_tx_cache_s_e,bandwidth,latency,cpu_load) + if (abs(bandwidth-con_dic['test_throughput'])/con_dic['test_throughput'] >0.05) and (latency < con_dic['test_latency']) and (cpu_load < con_dic['test_cpu_load']): + if (abs(bandwidth_tmp-bandwidth)/bandwidth <0.05): + print "%s,%s,%s,%s,%s,%s"%(test_rx_pkt_s_e,test_rx_cache_s_e,test_tx_cache_s_e,bandwidth,latency,cpu_load) + return True + else: + bandwidth_tmp = bandwidth + else: + print "%s,%s,%s,%s,%s,%s"%(test_rx_pkt_s_e,test_rx_cache_s_e,test_tx_cache_s_e,bandwidth,latency,cpu_load) + return False + + +def main(): + if not (args.conf): + logger.error("Configuration files do not exist for the specified testcases") + exit(-1) + else: + testcase_cfg = args.conf + + con_dic=posca_config_read(testcase_cfg) + posca_env_check() + posca_run(con_dic) + + time.sleep(5) + +if __name__=='__main__': + main() -- cgit 1.2.3-korg