From 96ad348806948805928bf60885ca8f45379736ef Mon Sep 17 00:00:00 2001 From: Louin Pierrick Date: Tue, 15 Oct 2019 15:42:14 +0200 Subject: NFVBENCH-152 Add service_mode method for debugging purpose Change-Id: I17b70a26ea0df1b5b616db6039813c83a1efe799 Signed-off-by: fmenguy --- nfvbench/cfg.default.yaml | 6 ++++++ nfvbench/nfvbench.py | 5 +++++ nfvbench/traffic_client.py | 10 ++++++++-- nfvbench/traffic_gen/dummy.py | 3 +++ nfvbench/traffic_gen/trex_gen.py | 14 ++++++++++++-- 5 files changed, 34 insertions(+), 4 deletions(-) (limited to 'nfvbench') diff --git a/nfvbench/cfg.default.yaml b/nfvbench/cfg.default.yaml index 8e94eac..9a4a815 100755 --- a/nfvbench/cfg.default.yaml +++ b/nfvbench/cfg.default.yaml @@ -687,3 +687,9 @@ user_label: # Can be overriden by --no-vswitch-access # Should be left to the default value (false) no_vswitch_access: false + + +# Enable service mode for trafic capture from TRex console (for debugging purpose) +# Can be overriden by --service-mode +# Should be left to the default value (false) +service_mode: false diff --git a/nfvbench/nfvbench.py b/nfvbench/nfvbench.py index 050017e..80b9a93 100644 --- a/nfvbench/nfvbench.py +++ b/nfvbench/nfvbench.py @@ -439,6 +439,11 @@ def _parse_opts_from_cli(): default='0', help='Specify the FE cache size (default: 0, flow-count if < 0)') + parser.add_argument('--service-mode', dest='service_mode', + action='store_true', + default=False, + help='Enable T-Rex service mode for debugging only') + opts, unknown_opts = parser.parse_known_args() return opts, unknown_opts diff --git a/nfvbench/traffic_client.py b/nfvbench/traffic_client.py index 8992d51..7591062 100755 --- a/nfvbench/traffic_client.py +++ b/nfvbench/traffic_client.py @@ -46,12 +46,13 @@ class TrafficClientException(Exception): class TrafficRunner(object): """Serialize various steps required to run traffic.""" - def __init__(self, client, duration_sec, interval_sec=0): + def __init__(self, client, duration_sec, interval_sec=0, service_mode=False): """Create a traffic runner.""" self.client = client self.start_time = None self.duration_sec = duration_sec self.interval_sec = interval_sec + self.service_mode = service_mode def run(self): """Clear stats and instruct the traffic generator to start generating traffic.""" @@ -59,6 +60,10 @@ class TrafficRunner(object): return None LOG.info('Running traffic generator') self.client.gen.clear_stats() + # Debug use only : new '--service-mode' option available for the NFVBench command line. + # A read-only mode TRex console would be able to capture the generated traffic. + self.client.gen.set_service_mode(enabled=self.service_mode) + LOG.info('Service mode is %sabled', 'en' if self.service_mode else 'dis') self.client.gen.start_traffic() self.start_time = time.time() return self.poll_stats() @@ -486,7 +491,8 @@ class TrafficClient(object): self.notifier = notifier self.interval_collector = None self.iteration_collector = None - self.runner = TrafficRunner(self, self.config.duration_sec, self.config.interval_sec) + self.runner = TrafficRunner(self, self.config.duration_sec, self.config.interval_sec, + self.config.service_mode) self.config.frame_sizes = self._get_frame_sizes() self.run_config = { 'l2frame_size': None, diff --git a/nfvbench/traffic_gen/dummy.py b/nfvbench/traffic_gen/dummy.py index 120a99b..ef7f272 100644 --- a/nfvbench/traffic_gen/dummy.py +++ b/nfvbench/traffic_gen/dummy.py @@ -201,6 +201,9 @@ class DummyTG(AbstractTrafficGenerator): def set_mode(self): pass + def set_service_mode(self, enabled=True): + pass + def resolve_arp(self): """Resolve ARP sucessfully.""" def get_macs(port, scc): diff --git a/nfvbench/traffic_gen/trex_gen.py b/nfvbench/traffic_gen/trex_gen.py index 0f51188..b8e32e3 100644 --- a/nfvbench/traffic_gen/trex_gen.py +++ b/nfvbench/traffic_gen/trex_gen.py @@ -693,7 +693,10 @@ class TRex(AbstractTrafficGenerator): chain_count) break - self.client.set_service_mode(ports=self.port_handle, enabled=False) + # if the capture from the TRex console was started before the arp request step, + # it keeps 'service_mode' enabled, otherwise, it disables the 'service_mode' + if not self.config.service_mode: + self.client.set_service_mode(ports=self.port_handle, enabled=False) if len(arp_dest_macs) == len(self.port_handle): return arp_dest_macs return None @@ -835,7 +838,10 @@ class TRex(AbstractTrafficGenerator): if self.capture_id: self.client.stop_capture(capture_id=self.capture_id['id']) self.capture_id = None - self.client.set_service_mode(ports=self.port_handle, enabled=False) + # if the capture from TRex console was started before the connectivity step, + # it keeps 'service_mode' enabled, otherwise, it disables the 'service_mode' + if not self.config.service_mode: + self.client.set_service_mode(ports=self.port_handle, enabled=False) def cleanup(self): """Cleanup Trex driver.""" @@ -846,3 +852,7 @@ class TRex(AbstractTrafficGenerator): except STLError: # TRex does not like a reset while in disconnected state pass + + def set_service_mode(self, enabled=True): + """Enable/disable the 'service_mode'.""" + self.client.set_service_mode(ports=self.port_handle, enabled=enabled) -- cgit 1.2.3-korg