Separate files needing GPL license
[csit.git] / resources / libraries / python / TrafficGenerator.py
index 539ced5..c63dc2d 100644 (file)
@@ -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
@@ -406,12 +406,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 +489,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 +515,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 +540,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 +632,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.
@@ -720,7 +722,7 @@ class TrafficGenerator(AbstractMeasurer):
 
         :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
@@ -811,7 +813,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 +881,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