summaryrefslogtreecommitdiffstats
path: root/src/console/trex_rpc_client.py
blob: 4562cf23912a76a3f4b980e7eb9feb7bec8e937e (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
119
120
121
122
123
124
125
import zmq
import json
from time import sleep

class RpcClient():

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

        self.verbose = False

    def get_connection_details (self):
        rc = {}
        rc['server'] = self.server
        rc['port']   = self.port

        return rc

    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"

        if block:
            self.socket.send(msg)
        else:
            try:
                self.socket.send(msg, flags = zmq.NOBLOCK)
            except zmq.error.ZMQError:
                return False, "Failed To Get Server Response"

        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 get_rpc_server_status (self):
        return self.invoke_rpc_method("rpc_get_status")

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


    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)