Add yardstick danube3.1 support.
[bottlenecks.git] / testsuites / posca / testcase_script / posca_factor_ping.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 ping stress test script
11 This file contain several part:
12 Frist 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 sys
19 import time
20 import threading
21 import datetime
22 import Queue
23 from utils.parser import Parser as conf_parser
24 import utils.env_prepare.quota_prepare as quota_prepare
25 import utils.env_prepare.stack_prepare as stack_prepare
26
27 import testsuites.posca.testcase_dashboard.posca_stress_ping as DashBoard
28 import utils.infra_setup.runner.docker_env as docker_env
29 # --------------------------------------------------
30 # logging configuration
31 # --------------------------------------------------
32 LOG = log.Logger(__name__).getLogger()
33
34 test_dict = {
35     "action": "runTestCase",
36     "args": {
37         "opts": {
38             "task-args": {}
39         },
40         "testcase": "ping_bottlenecks"
41     }
42 }
43 testfile = os.path.basename(__file__)
44 testcase, file_format = os.path.splitext(testfile)
45
46 q = Queue.Queue()
47
48
49 def env_pre(test_config):
50     test_yardstick = False
51     if "yardstick" in test_config["contexts"].keys():
52         test_yardstick = True
53     stack_prepare._prepare_env_daemon(test_yardstick)
54     quota_prepare.quota_env_prepare()
55     cmd = ('yardstick env prepare')
56     LOG.info("yardstick envrionment prepare!")
57     if(test_config["contexts"]['yardstick_envpre']):
58         yardstick_container = docker_env.yardstick_info['container']
59         stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
60         LOG.debug(stdout)
61
62
63 def do_test():
64     func_name = sys._getframe().f_code.co_name
65     out_file = ("/tmp/yardstick_" + str(uuid.uuid4()) + ".out")
66     yardstick_container = docker_env.yardstick_info['container']
67     cmd = ('yardstick task start /home/opnfv/repos/yardstick/'
68            'samples/ping_bottlenecks.yaml --output-file ' + out_file)
69     stdout = docker_env.docker_exec_cmd(yardstick_container, cmd)
70     LOG.info(stdout)
71     out_value = 0
72     loop_walue = 0
73     while loop_walue < 60:
74         time.sleep(2)
75         loop_walue = loop_walue + 1
76         with open(out_file) as f:
77             data = json.load(f)
78             if data["status"] == 1:
79                 LOG.info("yardstick run success")
80                 out_value = 1
81                 break
82             elif data["status"] == 2:
83                 LOG.error("yardstick error exit")
84                 out_value = 0
85                 break
86     q.put((out_value, func_name))
87     return out_value
88
89
90 def config_to_result(num, out_num, during_date):
91     testdata = {}
92     test_result = {}
93     test_result["number_of_users"] = float(num)
94     test_result["success_times"] = out_num
95     test_result["success_rate"] = out_num / num
96     test_result["duration_time"] = during_date
97     testdata["data_body"] = test_result
98     testdata["testcase"] = testcase
99     return testdata
100
101
102 def func_run(condic):
103     test_date = do_test()
104     return test_date
105
106
107 def run(test_config):
108     con_dic = test_config["load_manager"]
109     test_num = con_dic['scenarios']['num_stack'].split(',')
110     if test_config["contexts"]["yardstick_ip"] is None:
111         con_dic["contexts"]["yardstick_ip"] =\
112             conf_parser.ip_parser("yardstick_test_ip")
113
114     if "dashboard" in test_config["contexts"].keys():
115         if test_config["contexts"]["dashboard_ip"] is None:
116             test_config["contexts"]["dashboard_ip"] =\
117                 conf_parser.ip_parser("dashboard")
118         LOG.info("Create Dashboard data")
119         DashBoard.posca_stress_ping(test_config["contexts"])
120
121     LOG.info("bottlenecks envrionment prepare!")
122     env_pre(test_config)
123     LOG.info("yardstick envrionment prepare done!")
124
125     for value in test_num:
126         result = []
127         out_num = 0
128         num = int(value)
129         # pool = multiprocessing.Pool(processes=num)
130         threadings = []
131         LOG.info("begin to run %s thread" % num)
132
133         starttime = datetime.datetime.now()
134
135         for i in xrange(0, num):
136             temp_thread = threading.Thread(target=func_run, args=(str(i),))
137             threadings.append(temp_thread)
138             temp_thread.start()
139         for one_thread in threadings:
140             one_thread.join()
141         while not q.empty():
142             result.append(q.get())
143         for item in result:
144             out_num = out_num + float(item[0])
145
146         endtime = datetime.datetime.now()
147         LOG.info("%s thread success %d times" % (num, out_num))
148         during_date = (endtime - starttime).seconds
149
150         data_reply = config_to_result(num, out_num, during_date)
151         if "dashboard" in test_config["contexts"].keys():
152             DashBoard.dashboard_send_data(test_config['contexts'], data_reply)
153         conf_parser.result_to_file(data_reply, test_config["out_file"])
154
155         if out_num < num:
156             success_rate = ('%d/%d' % (out_num, num))
157             LOG.error('error thread: %d '
158                       'the successful rate is %s'
159                       % (num - out_num, success_rate))
160             break
161     LOG.info('END POSCA stress ping test')