summaryrefslogtreecommitdiffstats
path: root/clover/tools/jmeter/jmeter-master/grpc/jmeter_server.py
blob: cef180c9b418bc38f5eb9805b5668c4cbc90aafb (plain)
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])