Add instrucitons meta. Delete split_by_field field engine global parameter. 76/5176/1
authorVyacheslav Ogai <[email protected]>
Wed, 5 Oct 2016 13:03:37 +0000 (16:03 +0300)
committerHanoh Haim <[email protected]>
Mon, 19 Dec 2016 14:04:07 +0000 (16:04 +0200)
Signed-off-by: Vyacheslav Ogai <[email protected]>
scripts/automation/trex_control_plane/stl/services/scapy_server/field_engine.json
scripts/automation/trex_control_plane/stl/services/scapy_server/scapy_service.py
scripts/automation/trex_control_plane/stl/services/scapy_server/unit_tests/test_scapy_service.py

index 082a6f3..9214f4c 100644 (file)
@@ -1,4 +1,23 @@
 {
+  "instructions": [
+    {
+      "id": "STLVmFlowVar",
+      "parameters": ["max_value","min_value","step","op"]
+    },
+    {
+      "id": "STLVmWrFlowVar",
+      "parameters": ["fv_name", "pkt_offset"]
+    },
+    {
+      "id": "STLVmFixIpv4",
+      "parameters": ["offset"]
+    },
+    {
+      "id": "STLVmFixChecksumHw",
+      "parameters": ["l3_offset","l4_offset","l4_type"]
+    }
+  ],
+
   "instruction_params_meta": [
     {
       "id": "max_value",
         "inc": "Increment",
         "random": "Random"
       }
+    },
+    {
+      "id": "fv_name",
+      "name": "Variable name",
+      "type": "STRING"
+    },
+    {
+      "id": "pkt_offset",
+      "name": "Offset",
+      "type": "STRING"
+    },
+    {
+      "id": "offset",
+      "name": "Offset",
+      "type": "STRING"
+    },
+    {
+      "id": "l3_offset",
+      "name": "L3 offset",
+      "type": "STRING"
+    },
+    {
+      "id": "l4_offset",
+      "name": "L4 offset",
+      "type": "STRING"
+    },
+    {
+      "id": "l4_type",
+      "name": "L4 type",
+      "type": "STRING"
     }
   ],
   "protocol_fields": {
     ]
   },
   "global_params_meta":[
-    {
-      "id": "split_by_field",
-      "name": "Split by",
-      "type": "ENUM"
-    },
     {
       "id": "cache_size",
       "name": "Cache size",
index aa5053d..93ca750 100755 (executable)
@@ -11,7 +11,7 @@ import hashlib
 import base64
 import numbers
 import random
-import inspect
+from inspect import getdoc
 import json
 from pprint import pprint
 
@@ -397,9 +397,10 @@ class Scapy_service(Scapy_service_api):
         self.protocol_fields_fe_aware = {}
         self.instruction_parameter_meta_definitions = []
         self.field_engine_parameter_meta_definitions = []
+        self.field_engine_instructions_meta = []
         self.field_engine_instruction_expressions = []
         self._load_definitions_from_json()
-        self._load_instruction_parameter_definitions_from_json()
+        self._load_field_engine_meta_from_json()
 
     def _load_definitions_from_json(self):
         # load protocol definitions from a json file
@@ -409,19 +410,25 @@ class Scapy_service(Scapy_service_api):
             for protocol in protocols:
                 self.protocol_definitions[ protocol['id'] ] = protocol
 
-    def _load_instruction_parameter_definitions_from_json(self):
+    def _load_field_engine_meta_from_json(self):
         # load protocol definitions from a json file
         self.instruction_parameter_meta_definitions = []
         self.protocol_fields_fe_aware = {}
         self.field_engine_parameter_meta_definitions = []
         with open('field_engine.json', 'r') as f:
             metas = json.load(f)
-            for meta in metas["instruction_params_meta"]:
-               self.instruction_parameter_meta_definitions.append(meta)
+            self.instruction_parameter_meta_definitions = metas["instruction_params_meta"]
+            self.field_engine_instructions_meta = metas["instructions"]
+            self._append_intructions_help()
             self.protocol_fields_fe_aware = metas["protocol_fields"]
             self.field_engine_parameter_meta_definitions = metas["global_params_meta"]
 
 
+    def _append_intructions_help(self):
+        for instruction_meta in self.field_engine_instructions_meta:
+            clazz = eval(instruction_meta['id'])
+            instruction_meta['help'] = base64.b64encode(getdoc(clazz.__init__)).decode('ascii')
+
     def _all_protocol_structs(self):
         old_stdout = sys.stdout
         sys.stdout = mystdout = StringIO()
@@ -800,28 +807,23 @@ class Scapy_service(Scapy_service_api):
             self.field_engine_instruction_expressions.append(expression)
 
         fe_parameters = field_engine_model_descriptor['global_parameters']
-        split_by_field = None
-        if "split_by_field" in fe_parameters:
-            split_by_field = str(fe_parameters['split_by_field'])
 
         cache_size = None
         if "cache_size" in fe_parameters:
             cache_size = int(fe_parameters['cache_size'])
 
-        self.field_engine_instruction_expressions += self._get_instruction_expressions_footer(split_by_field, cache_size)
+        self.field_engine_instruction_expressions += self._get_instruction_expressions_footer(cache_size)
 
-        pkt_builder = STLPktBuilder(pkt=pkt, vm=STLScVmRaw(instructions, split_by_field=split_by_field, cache_size=cache_size))
+        pkt_builder = STLPktBuilder(pkt=pkt, vm=STLScVmRaw(instructions, cache_size=cache_size))
         pkt_builder.compile()
         return pkt_builder.get_vm_data()
 
     def _get_instruction_expressions_header(self):
         return {'free_form': "vm = STLScVmRaw(["}
 
-    def _get_instruction_expressions_footer(self, split_by_field, cache_size):
+    def _get_instruction_expressions_footer(self, cache_size):
         instructions = []
         footer = ']'
-        if split_by_field != None and split_by_field != "":
-            footer += ',{0}="{1}"'.format("split_by_field", split_by_field)
 
         if cache_size != None and cache_size > 0:
             footer += ',{0}={1}'.format("cache_size", cache_size)
@@ -965,6 +967,7 @@ class Scapy_service(Scapy_service_api):
                     })
         res = {"protocols": protocols,
                "feInstructionParameters": self.instruction_parameter_meta_definitions,
+               "feInstructions": self.field_engine_instructions_meta,
                "feParameters": self.field_engine_parameter_meta_definitions}
         return res
 
index ffc3b2b..af3bfb4 100644 (file)
@@ -112,11 +112,30 @@ def test_get_all():
 
 def test_get_definitions_all():
     get_definitions(None)
-    def_classnames = [pdef['id'] for pdef in get_definitions(None)['protocols']]
+    defs = get_definitions(None)
+    def_classnames = [pdef['id'] for pdef in defs['protocols']]
     assert("IP" in def_classnames)
     assert("Dot1Q" in def_classnames)
     assert("TCP" in def_classnames)
 
+    fe_parameter_metas = defs['feInstructionParameters']
+    assert(fe_parameter_metas[0]['id'] == "max_value")
+    assert(fe_parameter_metas[1]['id'] == "min_value")
+    assert(fe_parameter_metas[2]['id'] == "step")
+    assert(fe_parameter_metas[3]['id'] == "op")
+    assert(fe_parameter_metas[4]['id'] == "fv_name")
+    assert(fe_parameter_metas[5]['id'] == "pkt_offset")
+    assert(fe_parameter_metas[6]['id'] == "offset")
+    assert(fe_parameter_metas[7]['id'] == "l3_offset")
+    assert(fe_parameter_metas[8]['id'] == "l4_offset")
+    assert(fe_parameter_metas[9]['id'] == "l4_type")
+
+    # All instructions should have a help description.
+    fe_instructions = defs['feInstructions']
+    for instruction in fe_instructions:
+        print(instruction['help'])
+        assert("help" in instruction)
+
 def test_get_definitions_ether():
     res = get_definitions(["Ether"])
     protocols = res['protocols']
@@ -255,8 +274,9 @@ def test_generate_vm_instructions():
         layer_def("Ether"),
         layer_def("IP", src="16.0.0.1", dst="48.0.0.1")
     ]
-    ip_instructions_model = {"field_engine":{'global_parameters': {}, 'instructions': [{'id': "IP", 'fields': [{"fieldId": "src", 'parameters': {'min_value': "0", 'max_value': "16.0.0.255", 'step': "1", 'op': "inc"}},
-                                                                      {"fieldId": "ttl", 'parameters': {'min_value': "1", 'max_value': "17", 'step': "1", 'op': "inc"}}]}]}}
+    ip_instructions_model = {"field_engine": {'global_parameters': {}, 'instructions': [{'id': "IP", 'fields': [
+        {"fieldId": "src", 'parameters': {'min_value': "0", 'max_value': "16.0.0.255", 'step': "1", 'op': "inc"}},
+        {"fieldId": "ttl", 'parameters': {'min_value': "1", 'max_value': "17", 'step': "1", 'op': "inc"}}]}]}}
     res = build_pkt_ex(ip_pkt_model, ip_instructions_model)
     src_instruction = res['vm_instructions']['instructions'][0]
     assert(src_instruction['min_value'] == 0)