NFVBENCH-79 TRex latency stats requires at least 18B payload size
[nfvbench.git] / nfvbench / nfvbench.py
index 7d2e037..5e2de76 100644 (file)
@@ -68,7 +68,7 @@ class NFVBench(object):
         sys.stdout.flush()
 
     def setup(self):
-        self.specs.set_run_spec(self.config_plugin.get_run_spec(self.specs.openstack))
+        self.specs.set_run_spec(self.config_plugin.get_run_spec(self.config, self.specs.openstack))
         self.chain_runner = ChainRunner(self.config,
                                         self.clients,
                                         self.cred,
@@ -91,7 +91,19 @@ class NFVBench(object):
         try:
             self.update_config(opts)
             self.setup()
-
+            new_frame_sizes = []
+            min_packet_size = "68" if self.config.vlan_tagging else "64"
+            for frame_size in self.config.frame_sizes:
+                try:
+                    if int(frame_size) < int(min_packet_size):
+                        new_frame_sizes.append(min_packet_size)
+                        LOG.info("Adjusting frame size %s Bytes to minimum size %s Bytes due to "
+                                 + "traffic generator restriction", frame_size, min_packet_size)
+                    else:
+                        new_frame_sizes.append(frame_size)
+                except ValueError:
+                    new_frame_sizes.append(frame_size)
+            self.config.frame_sizes = tuple(new_frame_sizes)
             result = {
                 "date": datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                 "nfvbench_version": __version__,
@@ -164,6 +176,14 @@ class NFVBench(object):
         self.config.duration_sec = float(self.config.duration_sec)
         self.config.interval_sec = float(self.config.interval_sec)
 
+        # Get traffic generator profile config
+        if not self.config.generator_profile:
+            self.config.generator_profile = self.config.traffic_generator.default_profile
+
+        generator_factory = TrafficGeneratorFactory(self.config)
+        self.config.generator_config = \
+            generator_factory.get_generator_config(self.config.generator_profile)
+
         # Check length of mac_addrs_left/right for serivce_chain EXT with no_arp
         if self.config.service_chain == ChainType.EXT and self.config.no_arp:
             if not (self.config.generator_config.mac_addrs_left is None and
@@ -183,14 +203,6 @@ class NFVBench(object):
                                             b=len(self.config.generator_config.mac_addrs_right),
                                             c=self.config.service_chain_count))
 
-        # Get traffic generator profile config
-        if not self.config.generator_profile:
-            self.config.generator_profile = self.config.traffic_generator.default_profile
-
-        generator_factory = TrafficGeneratorFactory(self.config)
-        self.config.generator_config = \
-            generator_factory.get_generator_config(self.config.generator_profile)
-
         if not any(self.config.generator_config.pcis):
             raise Exception("PCI addresses configuration for selected traffic generator profile "
                             "({tg_profile}) are missing. Please specify them in configuration file."
@@ -467,14 +479,6 @@ def main():
         opts, unknown_opts = parse_opts_from_cli()
         log.set_level(debug=opts.debug)
 
-        # setup the fluent logger as soon as possible right after the config plugin is called,
-        # if there is any logging or result tag is set then initialize the fluent logger
-        for fluentd in config.fluentd:
-            if fluentd.logging_tag or fluentd.result_tag:
-                fluent_logger = FluentLogHandler(config.fluentd)
-                LOG.addHandler(fluent_logger)
-                break
-
         if opts.version:
             print pbr.version.VersionInfo('nfvbench').version_string_with_vcs()
             sys.exit(0)
@@ -506,6 +510,14 @@ def main():
                 LOG.info('Loading configuration string: %s', opts.config)
                 config = config_loads(opts.config, config, whitelist_keys)
 
+        # setup the fluent logger as soon as possible right after the config plugin is called,
+        # if there is any logging or result tag is set then initialize the fluent logger
+        for fluentd in config.fluentd:
+            if fluentd.logging_tag or fluentd.result_tag:
+                fluent_logger = FluentLogHandler(config.fluentd)
+                LOG.addHandler(fluent_logger)
+                break
+
         # traffic profile override options
         override_custom_traffic(config, opts.frame_sizes, opts.unidir)