few python changes
authorimarom <[email protected]>
Thu, 20 Aug 2015 13:35:39 +0000 (16:35 +0300)
committerimarom <[email protected]>
Thu, 20 Aug 2015 13:35:39 +0000 (16:35 +0300)
src/console/trex_console.py
src/console/trex_rpc_client.py
src/rpc-server/src/commands/trex_rpc_cmd_general.cpp

index b4048f5..bd2af92 100755 (executable)
@@ -12,7 +12,13 @@ class TrexConsole(cmd.Cmd):
    
     def __init__(self, rpc_client):
         cmd.Cmd.__init__(self)
-        self.prompt = "TRex > "
+
+        rc, msg = rpc_client.connect()
+        if not rc:
+            print "\n*** " + msg
+            self.prompt = "Trex (offline) > "
+        else:
+            self.prompt = "TRex > "
 
         self.intro  = "\n-=TRex Console V1.0=-\n"
         self.intro += "\nType 'help' or '?' for supported actions\n" 
@@ -33,7 +39,7 @@ class TrexConsole(cmd.Cmd):
 
     # set verbose on / off
     def do_verbose (self, line):
-        '''\nshows or set verbose mode\nusage: verbose [on/off]\n'''
+        '''shows or set verbose mode\n'''
         if line == "":
             print "\nverbose is " + ("on\n" if self.verbose else "off\n")
 
@@ -52,10 +58,12 @@ class TrexConsole(cmd.Cmd):
 
     # query the server for registered commands
     def do_query_server(self, line):
-        '''\nquery the RPC server for supported remote commands\n'''
+        '''query the RPC server for supported remote commands\n'''
+
         rc, msg = self.rpc_client.query_rpc_server()
         if not rc:
-            print "\n*** Failed to query RPC server: " + str(msg)
+            print "\n*** " + msg + "\n"
+            return
 
         print "\nRPC server supports the following commands: \n\n"
         for func in msg:
@@ -64,19 +72,30 @@ class TrexConsole(cmd.Cmd):
         print "\n"
 
     def do_ping (self, line):
-        '''\npings the RPC server\n'''
+        '''Pings the RPC server\n'''
+
         print "\n-> Pinging RPC server"
 
         rc, msg = self.rpc_client.ping_rpc_server()
         if rc:
             print "[SUCCESS]\n"
         else:
-            print "[FAILED]\n"
+            print "\n*** " + msg + "\n"
+
+    def do_reconnect (self, line):
+        '''Reconnects to the server\n'''
+        rc, msg = self.rpc_client.reconnect()
+        if rc:
+            print "[SUCCESS]\n"
+        else:
+            print "\n*** " + msg + "\n"
 
     def do_rpc (self, line):
-        '''\nLaunches a RPC on the server\n'''
+        '''Launches a RPC on the server\n'''
+
         if line == "":
             print "\nUsage: [method name] [param dict as string]\n"
+            print "Example: rpc test_add {'x': 12, 'y': 17}\n"
             return
 
         sp = line.split(' ', 1)
@@ -99,41 +118,97 @@ class TrexConsole(cmd.Cmd):
         if bad_parse:
             print "\nValue should be a valid dict: '{0}'".format(sp[1])
             print "\nUsage: [method name] [param dict as string]\n"
+            print "Example: rpc test_add {'x': 12, 'y': 17}\n"
             return
 
         rc, msg = self.rpc_client.invoke_rpc_method(method, params)
         if rc:
-            print "[SUCCESS]\n"
+            print "\nServer Response:\n\n" + json.dumps(msg) + "\n"
         else:
-            print "[FAILED]\n"
+            print "\n*** " + msg + "\n"
+            #print "Please try 'reconnect' to reconnect to server"
 
 
     def complete_rpc (self, text, line, begidx, endidx):
         return [x for x in self.supported_rpc if x.startswith(text)]
 
     def do_status (self, line):
-        '''\nShows a graphical console\n'''
+        '''Shows a graphical console\n'''
 
         self.do_verbose('off')
         trex_status.show_trex_status(self.rpc_client)
 
     def do_quit(self, line):
-        '''\nexit the client\n'''
+        '''exit the client\n'''
         return True
 
+    def do_disconnect (self, line):
+        '''Disconnect from the server\n'''
+        if not self.rpc_client.is_connected():
+            print "Not connected to server\n"
+            return
+
+        rc, msg = self.rpc_client.disconnect()
+        if rc:
+            print "[SUCCESS]\n"
+        else:
+            print msg + "\n"
+
+    def postcmd(self, stop, line):
+        if self.rpc_client.is_connected():
+            self.prompt = "TRex > "
+        else:
+            self.prompt = "TRex (offline) > "
+
+        return stop
+
     def default(self, line):
         print "'{0}' is an unrecognized command. type 'help' or '?' for a list\n".format(line)
 
+    def do_help (self, line):
+        '''Shows This Help Screen\n'''
+        if line:
+            try:
+                func = getattr(self, 'help_' + line)
+            except AttributeError:
+                try:
+                    doc = getattr(self, 'do_' + line).__doc__
+                    if doc:
+                        self.stdout.write("%s\n"%str(doc))
+                        return
+                except AttributeError:
+                    pass
+                self.stdout.write("%s\n"%str(self.nohelp % (line,)))
+                return
+            func()
+            return
+
+        print "\nSupported Console Commands:"
+        print "----------------------------\n"
+
+        cmds =  [x[3:] for x in self.get_names() if x.startswith("do_")]
+        for cmd in cmds:
+            if cmd == "EOF":
+                continue
+
+            try:
+                doc = getattr(self, 'do_' + cmd).__doc__
+                if doc:
+                    help = str(doc)
+                else:
+                    help = "*** Undocumented Function ***\n"
+            except AttributeError:
+                help = "*** Undocumented Function ***\n"
+
+            print "{:<30} {:<30}".format(cmd + " - ", help)
+
+
     # aliasing
     do_exit = do_EOF = do_q = do_quit
 
 def main ():
     # RPC client
     rpc_client = RpcClient("localhost", 5050)
-    rc, msg = rpc_client.connect()
-    if not rc:
-        print "\n*** " + msg + "\n"
-        exit(-1)
 
     # console
     try:
index 3ec0e1f..2ce44af 100644 (file)
@@ -6,15 +6,13 @@ import random
 \r
 class RpcClient():\r
 \r
-    def __init__ (self, server, port):\r
-        self.context = zmq.Context()\r
-        \r
-        self.port = port\r
-        self.server = server\r
-        #  Socket to talk to server\r
-        self.transport = "tcp://{0}:{1}".format(server, port)\r
-\r
+    def __init__ (self, default_server, default_port):\r
         self.verbose = False\r
+        self.connected = False\r
+\r
+        # default values\r
+        self.port   = default_port\r
+        self.server = default_server\r
 \r
     def get_connection_details (self):\r
         rc = {}\r
@@ -44,7 +42,17 @@ class RpcClient():
 \r
         return json.dumps(msg)\r
 \r
-    def invoke_rpc_method (self, method_name, params = {}, block = True):\r
+    def invoke_rpc_method (self, method_name, params = {}, block = False):\r
+        rc, msg = self._invoke_rpc_method(method_name, params, block)\r
+        if not rc:\r
+            self.disconnect()\r
+\r
+        return rc, msg\r
+\r
+    def _invoke_rpc_method (self, method_name, params = {}, block = False):\r
+        if not self.connected:\r
+            return False, "Not connected to server"\r
+\r
         id = random.randint(1, 1000)\r
         msg = self.create_jsonrpc_v2(method_name, params, id = id)\r
 \r
@@ -56,7 +64,7 @@ class RpcClient():
             try:\r
                 self.socket.send(msg, flags = zmq.NOBLOCK)\r
             except zmq.error.ZMQError:\r
-                return False, "Failed To Get Server Response"\r
+                return False, "Failed To Get Send Message"\r
 \r
         got_response = False\r
 \r
@@ -64,13 +72,13 @@ class RpcClient():
             response = self.socket.recv()\r
             got_response = True\r
         else:\r
-            for i in xrange(0 ,5):\r
+            for i in xrange(0 ,10):\r
                 try:\r
                     response = self.socket.recv(flags = zmq.NOBLOCK)\r
                     got_response = True\r
                     break\r
                 except zmq.error.Again:\r
-                    sleep(0.1)\r
+                    sleep(0.2)\r
 \r
         if not got_response:\r
             return False, "Failed To Get Server Response"\r
@@ -88,7 +96,7 @@ class RpcClient():
 \r
         # error reported by server\r
         if ("error" in response_json):\r
-            return False, response_json["error"]["message"]\r
+            return True, response_json["error"]["message"]\r
 \r
         # if no error there should be a result\r
         if ("result" not in response_json):\r
@@ -111,23 +119,55 @@ class RpcClient():
     def set_verbose (self, mode):\r
         self.verbose = mode\r
 \r
-    def connect (self):\r
+    def disconnect (self):\r
+        if self.connected:\r
+            self.socket.close(linger = 0)\r
+            self.context.destroy(linger = 0)\r
+            self.connected = False\r
+            return True, ""\r
+        else:\r
+            return False, "Not connected to server"\r
+\r
+    def connect (self, server = None, port = None):\r
+        if self.connected:\r
+            self.disconnect()\r
+\r
+        self.context = zmq.Context()\r
+        \r
+        self.server = (server if server else self.server)\r
+        self.port = (port if port else self.port)\r
+\r
+        #  Socket to talk to server\r
+        self.transport = "tcp://{0}:{1}".format(self.server, self.port)\r
 \r
         print "\nConnecting To RPC Server On {0}".format(self.transport)\r
 \r
         self.socket = self.context.socket(zmq.REQ)\r
         self.socket.connect(self.transport)\r
 \r
+        self.connected = True\r
+\r
         # ping the server\r
         rc, err = self.ping_rpc_server()\r
         if not rc:\r
-            self.context.destroy(linger = 0)\r
-            return False, err\r
+            self.disconnect()\r
+            return rc, err\r
 \r
-        #print "Connection Established !\n"\r
-        print "[SUCCESS]\n"\r
         return True, ""\r
 \r
+    def reconnect (self):\r
+        # connect using current values\r
+        return self.connect()\r
+\r
+        if not self.connected:\r
+            return False, "Not connected to server"\r
+\r
+        # reconnect\r
+        return self.connect(self.server, self.port)\r
+\r
+    def is_connected (self):\r
+        return self.connected\r
+\r
     def __del__ (self):\r
         print "Shutting down RPC client\n"\r
         self.context.destroy(linger = 0)\r
index 581f3a0..193ce8d 100644 (file)
@@ -33,6 +33,7 @@ TrexRpcCmdGetStatus::_run(const Json::Value &params, Json::Value &result) {
 
     /* validate count */
     if (params.size() != 0) {
+        generate_err_param_count(result, 0, params.size());
         return (TrexRpcCommand::RPC_CMD_PARAM_COUNT_ERR);
     }