1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
# Copyright (c) Authors of Clover
#
# 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
from concurrent import futures
from jinja2 import Template
from urlparse import urlparse
import time
import sys
import grpc
import subprocess
import pickle
import logging
import jmeter_pb2
import jmeter_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
GRPC_PORT = '[::]:50054'
class Controller(jmeter_pb2_grpc.ControllerServicer):
def __init__(self, init_jmeter):
logging.basicConfig(filename='jmeter_server.log',
level=logging.DEBUG)
self.jmeter = 0
if init_jmeter == 'init':
print('init test')
def GenTest(self, r, context):
try:
out_file = 'tests/test.jmx'
template_file = 'tests/jmx.template'
unames = pickle.loads(r.url_names)
umethods = pickle.loads(r.url_methods)
ulist = []
for url in pickle.loads(r.url_list):
u = urlparse(url)
d = {}
d['domain'] = u.hostname
if u.port:
d['port'] = u.port
else:
d['port'] = 80
if u.path == '':
d['path'] = '/'
else:
d['path'] = u.path
ulist.append(d)
with open(template_file) as f:
tmpl = Template(f.read())
output = tmpl.render(
num_threads=r.num_threads,
url_names=unames,
url_methods=umethods,
ramp_time=r.ramp_time,
loops=r.loops,
url_list=ulist
)
with open(out_file, "wb") as fh:
fh.write(output)
msg = 'Generated test plan'
except Exception as e:
logging.debug(e)
msg = "Failed to generate test plan"
return jmeter_pb2.JmeterReply(message=msg)
def StartTest(self, r, context):
try:
if r.num_slaves == '0':
self.jmeter = subprocess.Popen(
["jmeter", "-n", "-t", "tests/test.jmx", "-l",
"default.jtl"], shell=False)
else:
slave_arg = "-R" + r.slave_ips
self.jmeter = subprocess.Popen(
["jmeter", "-n", "-t", "tests/test.jmx", slave_arg, "-l",
"default.jtl"], shell=False)
msg = "Started jmeter on pid: {}".format(self.jmeter.pid)
except Exception as e:
logging.debug(e)
msg = e
return jmeter_pb2.JmeterReply(message=msg)
def GetResults(self, r, context):
try:
if r.r_file == 'log':
r_file = 'jmeter.log'
else:
r_file = 'default.jtl'
f = open(r_file, 'r')
msg = "Retrieved all results\n" + f.read()
except Exception as e:
logging.debug(e)
msg = "Failed to retrieve results"
return jmeter_pb2.JmeterReply(message=msg)
def serve(init_jmeter):
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
jmeter_pb2_grpc.add_ControllerServicer_to_server(
Controller(init_jmeter), server)
server.add_insecure_port(GRPC_PORT)
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve(sys.argv[1])
|