NFVBENCH-192: Complete/fix hdrh related processings to consider all cases
[nfvbench.git] / nfvbench / nfvbench.py
index 9b8b3d1..a178d24 100644 (file)
@@ -88,8 +88,7 @@ class NFVBench(object):
         try:
             # recalc the running config based on the base config and options for this run
             self._update_config(opts)
-            if int(self.config.cache_size) < 0:
-                self.config.cache_size = self.config.flow_count
+
             # check that an empty openrc file (no OpenStack) is only allowed
             # with EXT chain
             if not self.config.openrc_file and self.config.service_chain != ChainType.EXT:
@@ -166,7 +165,9 @@ class NFVBench(object):
                                self.config.service_chain,
                                self.config.service_chain_count,
                                self.config.flow_count,
-                               self.config.frame_sizes)
+                               self.config.frame_sizes,
+                               self.config.user_id,
+                               self.config.group_id)
 
     def _update_config(self, opts):
         """Recalculate the running config based on the base config and opts.
@@ -223,6 +224,14 @@ class NFVBench(object):
         if config.flow_count % 2:
             config.flow_count += 1
 
+        # Possibly adjust the cache size
+        if config.cache_size < 0:
+            config.cache_size = config.flow_count
+
+        # The size must be capped to 10000 (where does this limit come from?)
+        if config.cache_size > 10000:
+            config.cache_size = 10000
+
         config.duration_sec = float(config.duration_sec)
         config.interval_sec = float(config.interval_sec)
         config.pause_sec = float(config.pause_sec)
@@ -235,7 +244,6 @@ class NFVBench(object):
             if config.flavor.vcpus < 2:
                 raise Exception("Flavor vcpus must be >= 2")
 
-
         config.ndr_run = (not config.no_traffic and
                           'ndr' in config.rate.strip().lower().split('_'))
         config.pdr_run = (not config.no_traffic and
@@ -493,16 +501,16 @@ def _parse_opts_from_cli():
                         metavar='<vlan>',
                         help='Port to port or port to switch to port L2 loopback with VLAN id')
 
-    """Option to allow for passing custom information to results post-processing"""
     parser.add_argument('--user-info', dest='user_info',
                         action='store',
                         metavar='<data>',
-                        help='Custom data to be included as is in the json report config branch - '
-                                + ' example, pay attention! no space: '
-                                + '--user-info=\'{"status":"explore","description":{"target":"lab"'
-                                + ',"ok":true,"version":2020}\'')
+                        help='Custom data to be included as is '
+                             'in the json report config branch - '
+                             ' example, pay attention! no space: '
+                             '--user-info=\'{"status":"explore","description":'
+                             '{"target":"lab","ok":true,"version":2020}}\' - '
+                             'this option may be repeated; given data will be merged.')
 
-    """Option to allow for overriding the NFVbench 'vlan_tagging' option"""
     parser.add_argument('--vlan-tagging', dest='vlan_tagging',
                         type=bool_arg,
                         metavar='<boolean>',
@@ -510,15 +518,13 @@ def _parse_opts_from_cli():
                         default=None,
                         help='Override the NFVbench \'vlan_tagging\' parameter')
 
-    """Option to allow for overriding the T-Rex 'intf_speed' parameter"""
     parser.add_argument('--intf-speed', dest='intf_speed',
                         metavar='<speed>',
                         action='store',
                         default=None,
-                        help='Override the NFVbench \'intf_speed\' parameter '
-                                + '(e.g. 10Gbps, auto, 16.72Gbps)')
+                        help='Override the NFVbench \'intf_speed\' '
+                             'parameter (e.g. 10Gbps, auto, 16.72Gbps)')
 
-    """Option to allow for overriding the T-Rex 'cores' parameter"""
     parser.add_argument('--cores', dest='cores',
                         type=int_arg,
                         metavar='<number>',
@@ -527,6 +533,8 @@ def _parse_opts_from_cli():
                         help='Override the T-Rex \'cores\' parameter')
 
     parser.add_argument('--cache-size', dest='cache_size',
+                        type=int_arg,
+                        metavar='<size>',
                         action='store',
                         default='0',
                         help='Specify the FE cache size (default: 0, flow-count if < 0)')
@@ -534,12 +542,17 @@ def _parse_opts_from_cli():
     parser.add_argument('--service-mode', dest='service_mode',
                         action='store_true',
                         default=False,
-                        help='Enable T-Rex service mode for debugging only')
+                        help='Enable T-Rex service mode (for debugging purpose)')
+
+    parser.add_argument('--no-e2e-check', dest='no_e2e_check',
+                        action='store_true',
+                        default=False,
+                        help='Skip "end to end" connectivity check (on test purpose)')
 
     parser.add_argument('--no-flow-stats', dest='no_flow_stats',
                         action='store_true',
                         default=False,
-                        help='Disable extra flow stats (on high load traffic)')
+                        help='Disable additional flow stats (on high load traffic)')
 
     parser.add_argument('--no-latency-stats', dest='no_latency_stats',
                         action='store_true',
@@ -551,6 +564,35 @@ def _parse_opts_from_cli():
                         default=False,
                         help='Disable latency measurements (no streams)')
 
+    parser.add_argument('--user-id', dest='user_id',
+                        type=int_arg,
+                        metavar='<uid>',
+                        action='store',
+                        default=None,
+                        help='Change json/log files ownership with this user (int)')
+
+    parser.add_argument('--group-id', dest='group_id',
+                        type=int_arg,
+                        metavar='<gid>',
+                        action='store',
+                        default=None,
+                        help='Change json/log files ownership with this group (int)')
+
+    parser.add_argument('--show-trex-log', dest='show_trex_log',
+                        default=None,
+                        action='store_true',
+                        help='Show the current TRex local server log file contents'
+                             ' => diagnostic/help in case of configuration problems')
+
+    parser.add_argument('--debug-mask', dest='debug_mask',
+                        type=int_arg,
+                        metavar='<mask>',
+                        action='store',
+                        default=None,
+                        help='General purpose register (debugging flags), '
+                             'the hexadecimal notation (0x...) is accepted.'
+                             'Designed for development needs (default: 0).')
+
     opts, unknown_opts = parser.parse_known_args()
     return opts, unknown_opts
 
@@ -615,6 +657,12 @@ def main():
         log.setup()
         # load default config file
         config, default_cfg = load_default_config()
+        # possibly override the default user_id & group_id values
+        if 'USER_ID' in os.environ:
+            config.user_id = int(os.environ['USER_ID'])
+        if 'GROUP_ID' in os.environ:
+            config.group_id = int(os.environ['GROUP_ID'])
+
         # create factory for platform specific classes
         try:
             factory_module = importlib.import_module(config['factory_module'])
@@ -647,6 +695,14 @@ def main():
             print((default_cfg.decode("utf-8")))
             sys.exit(0)
 
+        # dump the contents of the trex log file
+        if opts.show_trex_log:
+            try:
+                print(open('/tmp/trex.log').read(), end="")
+            except FileNotFoundError:
+                print("No TRex log file found!")
+            sys.exit(0)
+
         config.name = ''
         if opts.config:
             # do not check extra_specs in flavor as it can contain any key/value pairs
@@ -753,6 +809,13 @@ def main():
         # add file log if requested
         if config.log_file:
             log.add_file_logger(config.log_file)
+            # possibly change file ownership
+            uid = config.user_id
+            gid = config.group_id
+            if gid is None:
+                gid = uid
+            if uid is not None:
+                os.chown(config.log_file, uid, gid)
 
         openstack_spec = config_plugin.get_openstack_spec() if config.openrc_file \
             else None