X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FTrafficGenerator.py;h=c5192e263db32759e5c792767aeea0e9c05571f7;hb=9378751a08ca5660886927f5502dcef19bc7f51c;hp=539ced584a9f8bbc1008afc53bfc76ec76db35de;hpb=fcce2ca13e7dacebf719fd9f7a6dcc8fb24f56ef;p=csit.git diff --git a/resources/libraries/python/TrafficGenerator.py b/resources/libraries/python/TrafficGenerator.py index 539ced584a..c5192e263d 100644 --- a/resources/libraries/python/TrafficGenerator.py +++ b/resources/libraries/python/TrafficGenerator.py @@ -75,7 +75,7 @@ class TGDropRateSearchImpl(DropRateSearch): :param loss_acceptance: Permitted drop ratio or frames count. :param loss_acceptance_type: Type of permitted loss. :param traffic_profile: Module name as a traffic profile identifier. - See resources/traffic_profiles/trex for implemented modules. + See GPL/traffic_profiles/trex for implemented modules. :param skip_warmup: Start TRex without warmup traffic if true. :type rate: float :type frame_size: str @@ -161,6 +161,7 @@ class TrafficGenerator(AbstractMeasurer): self.traffic_profile = None self.warmup_time = None self.traffic_directions = None + self.negative_loss = None # Transient data needed for async measurements. self._xstats = (None, None) # TODO: Rename "xstats" to something opaque, so TRex is not privileged? @@ -406,12 +407,13 @@ class TrafficGenerator(AbstractMeasurer): ) raise RuntimeError(u"Start TRex failed!") - # Test if TRex starts successfully. - cmd = f"sh -c \"{Constants.REMOTE_FW_DIR}/resources/tools/" \ - f"trex/trex_server_info.py\"" + # Test if TRex starts successfuly. + command_line = OptionString().add(u"python3") + dirname = f"{Constants.REMOTE_FW_DIR}/GPL/tools/trex" + command_line.add(f"'{dirname}/trex_server_info.py'") try: exec_cmd_no_error( - tg_node, cmd, sudo=True, + tg_node, command_line, sudo=True, message=u"Test TRex failed!", retries=20 ) except RuntimeError: @@ -488,16 +490,16 @@ class TrafficGenerator(AbstractMeasurer): :raises RuntimeError: If stop traffic script fails. """ # No need to check subtype, we know it is TREX. - x_args = u"" + command_line = OptionString().add(u"python3") + dirname = f"{Constants.REMOTE_FW_DIR}/GPL/tools/trex" + command_line.add(f"'{dirname}/trex_stateless_stop.py'") + command_line.change_prefix(u"--") for index, value in enumerate(self._xstats): if value is not None: - # Nested quoting is fun. value = value.replace(u"'", u"\"") - x_args += f" --xstat{index}='\"'\"'{value}'\"'\"'" + command_line.add_equals(f"xstat{index}", f"'{value}'") stdout, _ = exec_cmd_no_error( - node, f"sh -c '{Constants.REMOTE_FW_DIR}/resources/tools/trex/" - f"trex_stateless_stop.py{x_args}'", - message=u"TRex stateless runtime error" + node, command_line, message=u"TRex stateless runtime error" ) self._parse_traffic_results(stdout) @@ -514,7 +516,7 @@ class TrafficGenerator(AbstractMeasurer): :param rate: Traffic rate expressed with units (pps, %) :param frame_size: L2 frame size to send (without padding and IPG). :param traffic_profile: Module name as a traffic profile identifier. - See resources/traffic_profiles/trex for implemented modules. + See GPL/traffic_profiles/trex for implemented modules. :param async_call: If enabled then don't wait for all incomming trafic. :param latency: With latency measurement. :param warmup_time: Warmup time period. @@ -539,30 +541,31 @@ class TrafficGenerator(AbstractMeasurer): # No need to check subtype, we know it is TREX. reorder = self._ifaces_reordered # Just to make the next line fit. p_0, p_1 = (rx_port, tx_port) if reorder else (tx_port, rx_port) - if not isinstance(duration, (float, int)): duration = float(duration) if not isinstance(warmup_time, (float, int)): warmup_time = float(warmup_time) - command = f"sh -c \"" \ - f"{Constants.REMOTE_FW_DIR}/resources/tools/trex/" \ - f"trex_stateless_profile.py " \ - f"--profile {Constants.REMOTE_FW_DIR}/resources/" \ - f"traffic_profiles/trex/{traffic_profile}.py " \ - f"--duration {duration!r} --frame_size {frame_size} " \ - f"--rate {rate!r} --warmup_time {warmup_time!r} " \ - f"--port_0 {p_0} --port_1 {p_1} " \ - f"--traffic_directions {traffic_directions}" - if async_call: - command += u" --async_start" - if latency: - command += u" --latency" - if Constants.TREX_SEND_FORCE: - command += u" --force" - command += u"\"" + + command_line = OptionString().add(u"python3") + dirname = f"{Constants.REMOTE_FW_DIR}/GPL/tools/trex" + command_line.add(f"'{dirname}/trex_stateless_profile.py'") + command_line.change_prefix(u"--") + dirname = f"{Constants.REMOTE_FW_DIR}/GPL/traffic_profiles/trex" + quoted_path = f"'{dirname}/{traffic_profile}.py'" + command_line.add_with_value(u"profile", quoted_path) + command_line.add_with_value(u"duration", f"{duration!r}") + command_line.add_with_value(u"frame_size", frame_size) + command_line.add_with_value(u"rate", f"{rate!r}") + command_line.add_with_value(u"warmup_time", f"{warmup_time!r}") + command_line.add_with_value(u"port_0", p_0) + command_line.add_with_value(u"port_1", p_1) + command_line.add_with_value(u"traffic_directions", traffic_directions) + command_line.add_if(u"async_start", async_call) + command_line.add_if(u"latency", latency) + command_line.add_if(u"force", Constants.TREX_SEND_FORCE) stdout, _ = exec_cmd_no_error( - self._node, command, timeout=float(duration) + 60, + self._node, command_line, timeout=float(duration) + 60, message=u"TRex stateless runtime error" ) @@ -630,7 +633,7 @@ class TrafficGenerator(AbstractMeasurer): :param rate: Offered load per interface (e.g. 1%, 3gbps, 4mpps, ...). :param frame_size: Frame size (L2) in Bytes. :param traffic_profile: Module name as a traffic profile identifier. - See resources/traffic_profiles/trex for implemented modules. + See GPL/traffic_profiles/trex for implemented modules. :param warmup_time: Warmup phase in seconds. :param async_call: Async mode. :param latency: With latency measurement. @@ -715,24 +718,27 @@ class TrafficGenerator(AbstractMeasurer): def set_rate_provider_defaults( self, frame_size, traffic_profile, warmup_time=0.0, - traffic_directions=2): + traffic_directions=2, negative_loss=True): """Store values accessed by measure(). :param frame_size: Frame size identifier or value [B]. :param traffic_profile: Module name as a traffic profile identifier. - See resources/traffic_profiles/trex for implemented modules. + See GPL/traffic_profiles/trex for implemented modules. :param warmup_time: Traffic duration before measurement starts [s]. :param traffic_directions: Traffic is bi- (2) or uni- (1) directional. Default: 2 + :param negative_loss: If false, negative loss is reported as zero loss. :type frame_size: str or int :type traffic_profile: str :type warmup_time: float :type traffic_directions: int + :type negative_loss: bool """ self.frame_size = frame_size self.traffic_profile = str(traffic_profile) self.warmup_time = float(warmup_time) self.traffic_directions = traffic_directions + self.negative_loss = negative_loss def get_measurement_result(self, duration=None, transmit_rate=None): """Return the result of last measurement as ReceiveRateMeasurement. @@ -758,6 +764,8 @@ class TrafficGenerator(AbstractMeasurer): transmit_rate = self._rate * self.traffic_directions transmit_count = int(self.get_sent()) loss_count = int(self.get_loss()) + if loss_count < 0 and not self.negative_loss: + loss_count = 0 measurement = ReceiveRateMeasurement( duration, transmit_rate, transmit_count, loss_count ) @@ -811,7 +819,7 @@ class OptimizedSearch: :param frame_size: Frame size identifier or value [B]. :param traffic_profile: Module name as a traffic profile identifier. - See resources/traffic_profiles/trex for implemented modules. + See GPL/traffic_profiles/trex for implemented modules. :param minimum_transmit_rate: Minimal uni-directional target transmit rate [pps]. :param maximum_transmit_rate: Maximal uni-directional @@ -879,7 +887,7 @@ class OptimizedSearch: :param frame_size: Frame size identifier or value [B]. :param traffic_profile: Module name as a traffic profile identifier. - See resources/traffic_profiles/trex for implemented modules. + See GPL/traffic_profiles/trex for implemented modules. :param minimum_transmit_rate: Minimal uni-directional target transmit rate [pps]. :param maximum_transmit_rate: Maximal uni-directional @@ -914,7 +922,8 @@ class OptimizedSearch: u"resources.libraries.python.TrafficGenerator" ) tg_instance.set_rate_provider_defaults( - frame_size, traffic_profile, traffic_directions=traffic_directions) + frame_size, traffic_profile, traffic_directions=traffic_directions, + negative_loss=False) algorithm = PLRsearch( measurer=tg_instance, trial_duration_per_trial=tdpt, packet_loss_ratio_target=plr_target,