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 --- testsuites/posca/testcase_script/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 testsuites/posca/testcase_script/__init__.py (limited to 'testsuites/posca/testcase_script') 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 +############################################################################## -- 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 (limited to 'testsuites/posca/testcase_script') 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