summaryrefslogtreecommitdiffstats
path: root/clover/tools/jmeter/jmeter-master/grpc/jmeter_server.py
diff options
context:
space:
mode:
authorEddie Arrage <eddie.arrage@huawei.com>2018-07-28 01:02:35 +0000
committerEddie Arrage <eddie.arrage@huawei.com>2018-07-28 01:16:26 +0000
commite904c8e2d35cb16f744a0de3b20466ad3befa36d (patch)
tree90442df97c69bbddf7125c553a777581b107afd8 /clover/tools/jmeter/jmeter-master/grpc/jmeter_server.py
parent0254cb223d2eace1eaf295eacf4cea4fc4fd9844 (diff)
Implement initial Jmeter master/slave containers
- Jmeter can be used for L4-7 functional and performance testing - Jmeter master has gRPC server for management - Generates Jmeter test plans from minimal yaml params file (sample to be added with cloverctl) using template - Optionally span tests across slave containers to allow greater loads to be generated - Specify loop/thread/slave count and URL list, which dictates target and number of connections that will be attempted - clover-controller will interface to gRPC interface on Jmeter master - Start tests on master and retrieve log/result files - Render master and slave k8s manifests files Change-Id: Id144c8f551b7d375ff252c8de0611f895b50387c Signed-off-by: Eddie Arrage <eddie.arrage@huawei.com>
Diffstat (limited to 'clover/tools/jmeter/jmeter-master/grpc/jmeter_server.py')
-rw-r--r--clover/tools/jmeter/jmeter-master/grpc/jmeter_server.py118
1 files changed, 118 insertions, 0 deletions
diff --git a/clover/tools/jmeter/jmeter-master/grpc/jmeter_server.py b/clover/tools/jmeter/jmeter-master/grpc/jmeter_server.py
new file mode 100644
index 0000000..cef180c
--- /dev/null
+++ b/clover/tools/jmeter/jmeter-master/grpc/jmeter_server.py
@@ -0,0 +1,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])