bottlenecks offiline support
[bottlenecks.git] / testsuites / posca / testcase_script / posca_factor_multistack_storage_parallel.py
1 #!/usr/bin/env python
2 ##############################################################################
3 # Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
4 #
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10 '''This file realize the function of run posca multistack storage stress test
11 This file contain several part:
12 First is create a script to realize several threading run'''
13
14 import utils.logger as log
15 import uuid
16 import json
17 import os
18 import time
19 from utils.parser import Parser as conf_parser
20 import utils.env_prepare.quota_prepare as quota_prepare
21 import utils.env_prepare.stack_prepare as stack_prepare
22 import utils.infra_setup.runner.yardstick as yardstick_task
23
24 import utils.infra_setup.runner.docker_env as docker_env
25
26 # --------------------------------------------------
27 # logging configuration
28 # --------------------------------------------------
29 LOG = log.Logger(__name__).getLogger()
30
31 test_dict = {
32     "action": "runTestCase",
33     "args": {
34         "opts": {
35             "task-args": {}
36         },
37         "testcase": "multistack_storage_bottlenecks_parallel"
38     }
39 }
40 testfile = os.path.basename(__file__)
41 testcase, file_format = os.path.splitext(testfile)
42 cidr = "/home/opnfv/repos/yardstick/samples/storage_bottlenecks.yaml"
43 runner_DEBUG = True
44
45
46 def env_pre(test_config):
47     test_yardstick = False
48     if "yardstick" in test_config["contexts"].keys():
49         test_yardstick = True
50     stack_prepare._prepare_env_daemon(test_yardstick)
51     quota_prepare.quota_env_prepare()
52     if(test_config["contexts"]['yardstick_envpre']):
53         LOG.info("yardstick environment prepare!")
54         stdout = yardstick_task.yardstick_image_prepare()
55         LOG.debug(stdout)
56
57
58 def testcase_parser(out_file="yardstick.out", **parameter_info):
59     cmd = yardstick_task.yardstick_command_parser(debug=runner_DEBUG,
60                                                   cidr=cidr,
61                                                   outfile=out_file,
62                                                   parameter=parameter_info)
63     return cmd
64
65
66 def do_test(test_config):
67     out_file = ("/tmp/yardstick_" + str(uuid.uuid4()) + ".out")
68     yardstick_container = docker_env.yardstick_info['container']
69     cmd = testcase_parser(out_file=out_file, **test_config)
70     print(cmd)
71     stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
72     LOG.info(stdout)
73     loop_value = 0
74     while loop_value < 60:
75         time.sleep(2)
76         loop_value = loop_value + 1
77         with open(out_file) as f:
78             data = json.load(f)
79             if data["result"]["criteria"] == "PASS":
80                 LOG.info("yardstick run success")
81                 LOG.info("%s" % data["result"]["testcases"])
82                 break
83             else:
84                 LOG.error("yardstick error exit")
85                 break
86
87     save_data = config_to_result(test_config, data)
88     LOG.info(save_data)
89     return save_data
90
91
92 def config_to_result(test_config, test_result):
93     print(test_result)
94     out_data = test_result["result"]["testcases"]
95     test_data = out_data["storage_bottlenecks"]["tc_data"]
96     testdata = {}
97     testdata["read_iops"] = 0
98     testdata["read_bw"] = 0
99     testdata["read_lat"] = 0
100     testdata["write_iops"] = 0
101     testdata["write_bw"] = 0
102     testdata["write_lat"] = 0
103     print(testdata["read_iops"])
104     for result in test_data:
105         testdata["read_iops"] += result["data"]["read_iops"]
106         testdata["read_bw"] += result["data"]["read_bw"]
107         if testdata["read_lat"] is 0:
108             testdata["read_lat"] = result["data"]["read_lat"]
109         else:
110             testdata["read_lat"] += result["data"]["read_lat"]
111             testdata["read_lat"] = testdata["read_lat"]/2
112         testdata["write_iops"] += result["data"]["write_iops"]
113         testdata["write_bw"] += result["data"]["write_bw"]
114         if testdata["write_lat"] is 0:
115             testdata["write_lat"] = result["data"]["write_lat"]
116         else:
117             testdata["write_lat"] += result["data"]["write_lat"]
118             testdata["write_lat"] = testdata["write_lat"]/2
119     return testdata
120
121
122 def run(test_config):
123     con_dic = test_config["load_manager"]
124     scenarios_conf = con_dic["scenarios"]
125
126     if test_config["contexts"]["yardstick_ip"] is None:
127         con_dic["contexts"]["yardstick_ip"] =\
128             conf_parser.ip_parser("yardstick_test_ip")
129
130     env_pre(test_config)
131     LOG.info("yardstick environment prepare done!")
132
133     test_num = conf_parser.str_to_list(scenarios_conf["num_stack"])
134     rw = scenarios_conf["rw"]
135     bs = scenarios_conf["bs"]
136     size = scenarios_conf["size"]
137     rwmixwrite = scenarios_conf["rwmixwrite"]
138     numjobs = scenarios_conf["num_jobs"]
139     direct = scenarios_conf["direct"]
140     volume_num = scenarios_conf["volume_num"]
141     volume_size = scenarios_conf["volume_size"]
142
143     result = []
144
145     for value in test_num:
146         case_config = {"stack_num": int(value),
147                        "volume_num": volume_num,
148                        "rw": rw,
149                        "bs": bs,
150                        "size": size,
151                        "rwmixwrite": rwmixwrite,
152                        "numjobs": numjobs,
153                        "direct": direct,
154                        "volume_size": int(volume_size)}
155         data_reply = do_test(case_config)
156         result.append(data_reply)
157
158         LOG.info("%s stack successful run" % (value))
159
160         conf_parser.result_to_file(data_reply, test_config["out_file"])
161
162     LOG.info('END POSCA stress multistack storage parallel testcase')
163     LOG.info("The result data is %s", result)
164     return result