scapy_server_test:
authoritraviv <[email protected]>
Thu, 18 Aug 2016 12:23:01 +0000 (15:23 +0300)
committeritraviv <[email protected]>
Thu, 18 Aug 2016 12:23:01 +0000 (15:23 +0300)
skiping python3 tests

scapy_service.py:
minor changes to protocol_struct function

zmq_client:
added

zmq_server:
minor changes in exception handling

scripts/automation/regression/functional_tests/scapy_server_test.py
scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_service.py
scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_zmq_client.py [new file with mode: 0644]
scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_zmq_server.py

index c0651f6..ea3ec0d 100755 (executable)
@@ -1,13 +1,15 @@
 # scapy server unit test\r
 \r
 import sys,os\r
+from nose.plugins.skip import SkipTest\r
+if sys.version_info.major == 3:\r
+    raise SkipTest("Python3 currently not supported")\r
 scapy_server_path = os.path.abspath(os.path.join(os.pardir, 'trex_control_plane', 'stl', 'services','scapy_server'))\r
 stl_pathname = os.path.abspath(os.path.join(os.pardir, os.pardir, 'trex_control_plane','stl'))\r
 sys.path.append(scapy_server_path)\r
 sys.path.append(stl_pathname)\r
 \r
 \r
-#import stl_path\r
 import trex_stl_lib\r
 from trex_stl_lib.api import *\r
 from copy import deepcopy\r
index 3519bb5..311dc8b 100755 (executable)
@@ -134,26 +134,32 @@ class Scapy_service(Scapy_service_api):
         self.all_protocols = self._build_lib()
         self.protocol_tree = {'ALL':{'Ether':{'ARP':{},'IP':{'TCP':{'RAW':'payload'},'UDP':{'RAW':'payload'}}}}}
     
-    def _protocol_struct(self,protocol=''):
+
+    def _all_protocol_structs(self):
+        old_stdout = sys.stdout
+        sys.stdout = mystdout = StringIO()
+        ls()
+        sys.stdout = old_stdout
+        all_protocol_data= mystdout.getvalue()
+        return all_protocol_data
+
+    def _protocol_struct(self,protocol):
         if '_' in protocol:
             return []
         if not protocol=='':
             if protocol not in self.all_protocols:
                 return 'protocol not supported'
-            protocol = eval(protocol)
+        protocol = eval(protocol)
         old_stdout = sys.stdout
         sys.stdout = mystdout = StringIO()
-        if not protocol=='':
-            ls(protocol)
-        else:
-            ls()
+        ls(protocol)
         sys.stdout = old_stdout
         protocol_data= mystdout.getvalue()
         return protocol_data
 
     def _build_lib(self):
-        lib = self._protocol_struct()
-        lib = lib.split('\n')
+        lib = self._all_protocol_structs()
+        lib = lib.splitlines()
         all_protocols=[]
         for entry in lib:
             entry = entry.split(':')
@@ -195,11 +201,11 @@ class Scapy_service(Scapy_service_api):
         for pro in self.all_protocols:
             details = self._get_protocol_details(pro)
             for i in range(0,len(details),1):
-                if len(details[i]) is 3:
+                if len(details[i]) == 3:
                     fields.append(details[i][1])
-        uniqeFields = list(set(fields))
+        uniqueFields = list(set(fields))
         fieldDict = {}
-        for f in uniqeFields:
+        for f in uniqueFields:
             if f in self.regexDB:
                 fieldDict[f] = self.regexDB[f].stringRegex()
             else:
@@ -261,14 +267,18 @@ class Scapy_service(Scapy_service_api):
         return res_md5
 
     def get_version(self):
-        return {'built_by':'itraviv','version':'v1.0'}
+        return {'built_by':'itraviv','version':'v1.01'}
 
     def supported_methods(self,method_name=''):
         if method_name=='':
             methods = {}
             for f in dir(Scapy_service):
                 if inspect.ismethod(eval('Scapy_service.'+f)):
-                    methods[f] = inspect.getargspec(eval('Scapy_service.'+f))[0]
+                    param_list = inspect.getargspec(eval('Scapy_service.'+f))[0]
+                    del param_list[0] #deleting the parameter "self" that appears in every method 
+                                      #because the server automatically operates on an instance,
+                                      #and this can cause confusion
+                    methods[f] = (len(param_list), param_list)
             return methods
         if method_name in dir(Scapy_service):
             return True
diff --git a/scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_zmq_client.py b/scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_zmq_client.py
new file mode 100644 (file)
index 0000000..24e1593
--- /dev/null
@@ -0,0 +1,44 @@
+\r
+\r
+import zmq\r
+import json\r
+\r
+\r
+class Scapy_server_wrapper():\r
+    def __init__(self,dest_scapy_port=5555,server_ip_address='localhost'):\r
+        self.context = zmq.Context()\r
+        self.socket = self.context.socket(zmq.REQ)\r
+        self.dest_scapy_port =dest_scapy_port\r
+        self.socket.connect("tcp://"+str(server_ip_address)+":"+str(self.dest_scapy_port)) #ip address of csi-trex-11\r
+\r
+    def call_method(self,method_name,method_params):\r
+        json_rpc_req = { "jsonrpc":"2.0","method": method_name ,"params": method_params, "id":"1"}\r
+        request = json.dumps(json_rpc_req)\r
+        self.socket.send_string(request)\r
+        #  Get the reply.\r
+        message = self.socket.recv_string()\r
+        message_parsed = json.loads(message)\r
+        if 'result' in message_parsed.keys():\r
+            result = message_parsed['result']\r
+        else:\r
+            result = {'error':message_parsed['error']}\r
+        return result\r
+\r
+    def get_all(self):\r
+        return self.call_method('get_all',[])\r
+\r
+    def check_update(self,db_md5,field_md5):\r
+        result = self.call_method('check_update',[db_md5,field_md5])\r
+        if result!=True:\r
+            if 'error' in result.keys():\r
+                if "Fields DB is not up to date" in result['error']['message:']:\r
+                    raise Exception("Fields DB is not up to date")\r
+                if "Protocol DB is not up to date" in result['error']['message:']:\r
+                    raise Exception("Protocol DB is not up to date")\r
+        return result\r
+\r
+    def build_pkt(self,pkt_descriptor):\r
+        return self.call_method('build_pkt',[pkt_descriptor])\r
+        \r
+    def _get_all_pkt_offsets(self,pkt_desc):\r
+        return self.call_method('_get_all_pkt_offsets',[pkt_desc])\r
index 295315e..0b88668 100755 (executable)
@@ -27,7 +27,7 @@ class Scapy_wrapper:
     def parse_req_msg(self,JSON_req):\r
         try:\r
             req = json.loads(JSON_req)\r
-            req_id='null'\r
+            req_id=b'null'\r
             if (type(req)!= type({})):\r
                 raise ParseException(req_id)\r
             json_rpc_keys = ['jsonrpc','id','method']\r
@@ -57,7 +57,7 @@ class Scapy_wrapper:
     def create_error_response(self,error_code,error_msg,req_id='null'):\r
         return {"jsonrpc": "2.0", "error": {"code": error_code, "message:": error_msg}, "id": req_id}\r
         \r
-    def create_success_response(self,result,req_id='null'):\r
+    def create_success_response(self,result,req_id=b'null'):\r
         return {"jsonrpc": "2.0", "result": result, "id": req_id }\r
     \r
     def get_exception(self):\r
@@ -73,8 +73,6 @@ class Scapy_wrapper:
 \r
 \r
     def error_handler(self,e,req_id):\r
-        print('exception message is %s' % e.message)\r
-        print('exception type is: %s' % type(e))\r
         try:\r
             raise e\r
         except ParseException as e:\r
@@ -87,12 +85,12 @@ class Scapy_wrapper:
             response = self.create_error_response(-32603,'Invalid params',req_id)\r
         except SyntaxError as e:\r
             response = self.create_error_response(-32097,'SyntaxError',req_id)\r
-        except BaseException as e:\r
-            response = self.create_error_response(-32098,'Scapy Server: '+str(e.message),req_id)\r
-        except:\r
-            response = self.create_error_response(-32096,'Scapy Server: Unknown Error',req_id)\r
+        except Exception as e:\r
+            if hasattr(e,'message'):\r
+                response = self.create_error_response(-32098,'Scapy Server: '+str(e.message),req_id)\r
+            else:\r
+                response = self.create_error_response(-32096,'Scapy Server: Unknown Error',req_id)            \r
         finally:\r
-            print(response)\r
             return response\r
 \r
 class Scapy_server():\r
@@ -109,7 +107,7 @@ class Scapy_server():
         print ('Server IP address: %s' % self.IP_address)\r
         try:\r
             while True:\r
-                message = self.socket.recv()\r
+                message = self.socket.recv_string()\r
                 try:\r
                     req_id = 'null'\r
                     method,params,req_id = self.scapy_wrapper.parse_req_msg(message)\r
@@ -124,12 +122,12 @@ class Scapy_server():
                 finally:\r
                     json_response = json.dumps(response)\r
                 #  Send reply back to client\r
-                    self.socket.send(json_response)\r
-                    if (method =='shut_down'):\r
+                    self.socket.send_string(json_response)\r
+                    if (method == 'shut_down'):\r
                         break\r
 \r
         except KeyboardInterrupt:\r
-                print('Terminated By Ctrl+C')\r
+                print(b'Terminated By Ctrl+C')\r
 \r
         finally:\r
             self.socket.close()\r