summaryrefslogtreecommitdiffstats
path: root/src/console/trex_rpc_client.py
blob: ac4aa298b4ec0235a65a9608288fc058288eb8ea (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
import zmq
import json
from time import sleep

class RpcClient():

    def create_jsonrpc_v2 (self, method_name, params = {}, id = None):
        msg = {}
        msg["jsonrpc"] = "2.0"
        msg["method"]  = method_name

        msg["params"] = {}
        for key, value in params.iteritems():
            msg["params"][key] = value

        msg["id"] = id

        return json.dumps(msg)

    def invoke_rpc_method (self, method_name, params = {}, block = True):
        msg = self.create_jsonrpc_v2(method_name, params, id = 1)

        if self.verbose:
            print "\nSending Request To Server: " + str(msg) + "\n"

        self.socket.send(msg)

        got_response = False

        if block:
            response = self.socket.recv()
            got_response = True
        else:
            for i in xrange(0 ,5):
                try:
                    response = self.socket.recv(flags = zmq.NOBLOCK)
                    got_response = True
                    break
                except zmq.error.Again:
                    sleep(0.1)

        if not got_response:
            return False, "Failed To Get Server Response"

        if self.verbose:
            print "Server Response: " + str(response) + "\n"

        # decode
        response_json = json.loads(response)

        if (response_json.get("jsonrpc") != "2.0"):
            return False, "Malfromed Response ({0})".format(str(response))

        # error reported by server
        if ("error" in response_json):
            return False, response_json["error"]["message"]

        # if no error there should be a result
        if ("result" not in response_json):
            return False, "Malfromed Response ({0})".format(str(response))

        return True, response_json["result"]


    def ping_rpc_server (self):

        return self.invoke_rpc_method("rpc_ping", block = False)
        

    def query_rpc_server (self):
        return self.invoke_rpc_method("rpc_get_reg_cmds")

    def __init__ (self, port):
        self.context = zmq.Context()
        
        #  Socket to talk to server
        self.transport = "tcp://localhost:{0}".format(port)

        self.verbose = False

    def set_verbose (self, mode):
        self.verbose = mode

    def connect (self):

        print "\nConnecting To RPC Server On {0}".format(self.transport)

        self.socket = self.context.socket(zmq.REQ)
        self.socket.connect(self.transport)

        # ping the server
        rc, err = self.ping_rpc_server()
        if not rc:
            self.context.destroy(linger = 0)
            raise Exception(err)

        #print "Connection Established !\n"
        print "[SUCCESS]\n"


    def __del__ (self):
        print "Shutting down RPC client\n"
        self.context.destroy(linger = 0)