summaryrefslogtreecommitdiffstats
path: root/clover/controller/control/api/jmeter.py
diff options
context:
space:
mode:
Diffstat (limited to 'clover/controller/control/api/jmeter.py')
-rw-r--r--clover/controller/control/api/jmeter.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/clover/controller/control/api/jmeter.py b/clover/controller/control/api/jmeter.py
new file mode 100644
index 0000000..3e8b86a
--- /dev/null
+++ b/clover/controller/control/api/jmeter.py
@@ -0,0 +1,106 @@
+# 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 flask import Blueprint, request, Response
+import grpc
+import jmeter_pb2
+import jmeter_pb2_grpc
+import pickle
+import logging
+
+
+jmeter = Blueprint('jmeter', __name__)
+
+grpc_port = '50054'
+pod_name = 'clover-jmeter-master.default'
+jmeter_grpc = pod_name + ':' + grpc_port
+channel = grpc.insecure_channel(jmeter_grpc)
+stub = jmeter_pb2_grpc.ControllerStub(channel)
+
+
+@jmeter.route("/jmeter/gen", methods=['GET', 'POST'])
+@jmeter.route("/jmeter/create", methods=['GET', 'POST'])
+def gentest():
+ try:
+ p = request.json
+ u_list = []
+ u_names = []
+ u_methods = []
+ u_agents = []
+ try:
+ for u in p['url_list']:
+ u_list.append(u['url'])
+ u_names.append(u['name'])
+ u_methods.append(u['method'])
+ u_agents.append(u['user-agent'])
+ url_list = pickle.dumps(u_list)
+ url_names = pickle.dumps(u_names)
+ url_methods = pickle.dumps(u_methods)
+ url_agents = pickle.dumps(u_agents)
+ num_threads = p['load_spec']['num_threads']
+ ramp_time = p['load_spec']['ramp_time']
+ duration = p['load_spec']['duration']
+ loops = p['load_spec']['loops']
+ except (KeyError, ValueError) as e:
+ logging.debug(e)
+ return Response('Invalid value in test plan json/yaml', status=400)
+ response = stub.GenTest(jmeter_pb2.ConfigJmeter(
+ url_list=url_list, url_names=url_names, url_methods=url_methods,
+ num_threads=str(num_threads), ramp_time=str(ramp_time),
+ url_agents=url_agents, duration=str(duration), loops=str(loops)))
+ except Exception as e:
+ logging.debug(e)
+ if e.__class__.__name__ == "_Rendezvous":
+ return Response("Error connecting to jmeter via gRPC", status=400)
+ else:
+ return Response("Error generating test plan", status=400)
+ return response.message
+
+
+@jmeter.route("/jmeter/start", methods=['GET', 'POST'])
+def start():
+ try:
+ p = request.json
+ if not p:
+ slave_list = ''
+ num_slaves = '0'
+ else:
+ slave_list = p['slave_list']
+ num_slaves = p['num_slaves']
+ response = stub.StartTest(jmeter_pb2.TestParams(
+ num_slaves=num_slaves, test_plan='test.jmx',
+ slave_ips=slave_list))
+ except Exception as e:
+ logging.debug(e)
+ if e.__class__.__name__ == "_Rendezvous":
+ return Response("Error connecting to jmeter via gRPC", status=400)
+ else:
+ return Response("Error starting jmeter test", status=400)
+ return response.message
+
+
+@jmeter.route("/jmeter/results/<r_type>", methods=['GET'])
+def results(r_type):
+ try:
+ if not r_type:
+ r_file = 'results'
+ else:
+ r_file = r_type
+ response = stub.GetResults(jmeter_pb2.JResults(
+ r_format='csv', r_file=r_file))
+ except Exception as e:
+ logging.debug(e)
+ if e.__class__.__name__ == "_Rendezvous":
+ return Response("Error connecting to jmeter via gRPC", status=400)
+ else:
+ return Response("Error returning results", status=400)
+ return response.message
+
+
+@jmeter.route("/jmeter/test")
+def test():
+ return "<h1 style='color:blue'>Jmeter API Test Response</h1>"