Update T-rex to v2.29
[csit.git] / resources / libraries / python / TrafficGenerator.py
index 47008bc..1680438 100644 (file)
@@ -103,7 +103,7 @@ class TrafficGenerator(object):
         self._received = None
         self._node = None
         # T-REX interface order mapping
-        self._ifaces_reordered = 0
+        self._ifaces_reordered = False
 
     @property
     def node(self):
@@ -184,17 +184,17 @@ class TrafficGenerator(object):
         self._node = tg_node
 
         if tg_node['subtype'] == NodeSubTypeTG.TREX:
-            trex_path = "/opt/trex-core-2.17"
+            trex_path = "/opt/trex-core-2.29"
 
             ssh = SSH()
             ssh.connect(tg_node)
 
             (ret, stdout, stderr) = ssh.exec_command(
-                "sudo -E sh -c '{}/resources/tools/t-rex/"
-                "t-rex-installer.sh'".format(Constants.REMOTE_FW_DIR),
+                "sudo -E sh -c '{}/resources/tools/trex/"
+                "trex_installer.sh'".format(Constants.REMOTE_FW_DIR),
                 timeout=1800)
             if int(ret) != 0:
-                logger.error('trex installation failed: {0}'.format(
+                logger.error('TRex installation failed: {0}'.format(
                     stdout + stderr))
                 raise RuntimeError('Installation of TG failed')
 
@@ -222,7 +222,7 @@ class TrafficGenerator(object):
                 if1_mac, if2_mac = if2_mac, if1_mac
                 if1_pci, if2_pci = if2_pci, if1_pci
                 if1_adj_mac, if2_adj_mac = if2_adj_mac, if1_adj_mac
-                self._ifaces_reordered = 1
+                self._ifaces_reordered = True
 
             if1_mac_hex = "0x"+if1_mac.replace(":", ",0x")
             if2_mac_hex = "0x"+if2_mac.replace(":", ",0x")
@@ -273,7 +273,8 @@ class TrafficGenerator(object):
 
                 # get T-rex server info
                 (ret, _, _) = ssh.exec_command(
-                    "sh -c '{0}/resources/tools/t-rex/t-rex-server-info.py'"\
+                    "sh -c 'sleep 3; "
+                    "{0}/resources/tools/trex/trex_server_info.py'"\
                     .format(Constants.REMOTE_FW_DIR),
                     timeout=120)
                 if int(ret) == 0:
@@ -282,10 +283,9 @@ class TrafficGenerator(object):
                 # try again
                 max_startup_retries -= 1
             # after max retries T-rex is still not responding to API
-            # critical error occured
+            # critical error occurred
             raise RuntimeError('t-rex-64 startup failed')
 
-
     @staticmethod
     def teardown_traffic_generator(node):
         """TG teardown.
@@ -302,7 +302,7 @@ class TrafficGenerator(object):
             ssh = SSH()
             ssh.connect(node)
             (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c 'sudo pkill t-rex'")
+                "sh -c 'sudo pkill t-rex && sleep 3'")
             if int(ret) != 0:
                 logger.error('pkill t-rex failed: {0}'.format(stdout + stderr))
                 raise RuntimeError('pkill t-rex failed')
@@ -319,12 +319,9 @@ class TrafficGenerator(object):
         ssh = SSH()
         ssh.connect(node)
 
-        (ret, stdout, stderr) = ssh.exec_command(
-            "sh -c '{}/resources/tools/t-rex/"
-            "t-rex-stateless-stop.py'".format(Constants.REMOTE_FW_DIR))
-        logger.trace(ret)
-        logger.trace(stdout)
-        logger.trace(stderr)
+        (ret, _, _) = ssh.exec_command(
+            "sh -c '{}/resources/tools/trex/"
+            "trex_stateless_stop.py'".format(Constants.REMOTE_FW_DIR))
 
         if int(ret) != 0:
             raise RuntimeError('T-rex stateless runtime error')
@@ -343,182 +340,39 @@ class TrafficGenerator(object):
         :param warmup_time: Warmup time period.
         :type duration: int
         :type rate: str
-        :type framesize: int
+        :type framesize: str
         :type traffic_type: str
         :type async_call: bool
         :type latency: bool
         :type warmup_time: int
         :returns: Nothing
-        :raises: NotImplementedError if traffic type is not supported.
         :raises: RuntimeError in case of TG driver issue.
         """
         ssh = SSH()
         ssh.connect(self._node)
 
-        _p0 = 1
-        _p1 = 2
         _async = "--async" if async_call else ""
         _latency = "--latency" if latency else ""
-
-        if self._ifaces_reordered != 0:
-            _p0, _p1 = _p1, _p0
-
-        if traffic_type in ["3-node-xconnect", "3-node-bridge"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} "
-                "--p{4}_src_start_ip 10.10.10.1 "
-                "--p{4}_src_end_ip 10.10.10.254 "
-                "--p{4}_dst_start_ip 20.20.20.1 "
-                "--p{5}_src_start_ip 20.20.20.1 "
-                "--p{5}_src_end_ip 20.20.20.254 "
-                "--p{5}_dst_start_ip 10.10.10.1 "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout=int(duration)+60)
-        elif traffic_type in ["3-node-IPv4"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} "
-                "--p{4}_src_start_ip 10.10.10.2 "
-                "--p{4}_src_end_ip 10.10.10.254 "
-                "--p{4}_dst_start_ip 20.20.20.2 "
-                "--p{5}_src_start_ip 20.20.20.2 "
-                "--p{5}_src_end_ip 20.20.20.254 "
-                "--p{5}_dst_start_ip 10.10.10.2 "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout=int(duration)+60)
-        elif traffic_type in ["3-node-IPv4-dst-10000"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} "
-                "--p{4}_src_start_ip 10.0.0.1 "
-                "--p{4}_dst_start_ip 20.0.0.0 "
-                "--p{4}_dst_end_ip 20.0.39.15 "
-                "--p{5}_src_start_ip 20.0.0.1 "
-                "--p{5}_dst_start_ip 10.0.0.0 "
-                "--p{5}_dst_end_ip 10.0.39.15 "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout=int(duration)+60)
-        elif traffic_type in ["3-node-IPv4-dst-100000"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} "
-                "--p{4}_src_start_ip 10.0.0.1 "
-                "--p{4}_dst_start_ip 20.0.0.0 "
-                "--p{4}_dst_end_ip 20.1.134.159 "
-                "--p{5}_src_start_ip 20.0.0.1 "
-                "--p{5}_dst_start_ip 10.0.0.0 "
-                "--p{5}_dst_end_ip 10.1.134.159 "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout=int(duration)+60)
-        elif traffic_type in ["3-node-IPv4-dst-1000000"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} "
-                "--p{4}_src_start_ip 10.0.0.1 "
-                "--p{4}_dst_start_ip 20.0.0.0 "
-                "--p{4}_dst_end_ip 20.15.66.63 "
-                "--p{5}_src_start_ip 20.0.0.1 "
-                "--p{5}_dst_start_ip 10.0.0.0 "
-                "--p{5}_dst_end_ip 10.15.66.63 "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout=int(duration)+60)
-        elif traffic_type in ["3-node-IPv6"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} -6 "
-                "--p{4}_src_start_ip 2001:1::2 "
-                "--p{4}_src_end_ip 2001:1::FE "
-                "--p{4}_dst_start_ip 2001:2::2 "
-                "--p{5}_src_start_ip 2001:2::2 "
-                "--p{5}_src_end_ip 2001:2::FE "
-                "--p{5}_dst_start_ip 2001:1::2 "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout=int(duration)+60)
-        elif traffic_type in ["3-node-IPv6-dst-10000"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} -6 "
-                "--p{4}_src_start_ip 2001:1::1 "
-                "--p{4}_dst_start_ip 2001:2::0 "
-                "--p{4}_dst_end_ip 2001:2::270F "
-                "--p{5}_src_start_ip 2001:2::1 "
-                "--p{5}_dst_start_ip 2001:1::0 "
-                "--p{5}_dst_end_ip 2001:1::270F "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout=int(duration)+60)
-        elif traffic_type in ["3-node-IPv6-dst-100000"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} -6 "
-                "--p{4}_src_start_ip 2001:1::1 "
-                "--p{4}_dst_start_ip 2001:2::0 "
-                "--p{4}_dst_end_ip 2001:2::1:869F "
-                "--p{5}_src_start_ip 2001:2::1 "
-                "--p{5}_dst_start_ip 2001:1::0 "
-                "--p{5}_dst_end_ip 2001:1::1:869F "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout=int(duration)+60)
-        elif traffic_type in ["3-node-IPv6-dst-1000000"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} -6 "
-                "--p{4}_src_start_ip 2001:1::1 "
-                "--p{4}_dst_start_ip 2001:2::0 "
-                "--p{4}_dst_end_ip 2001:2::F:423F "
-                "--p{5}_src_start_ip 2001:2::1 "
-                "--p{5}_dst_start_ip 2001:1::0 "
-                "--p{5}_dst_end_ip 2001:1::F:423F "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout=int(duration)+60)
-        elif traffic_type in ["2-node-bridge"]:
-            (ret, stdout, stderr) = ssh.exec_command(
-                "sh -c '{0}/resources/tools/t-rex/t-rex-stateless.py "
-                "--duration={1} -r {2} -s {3} "
-                "--p{4}_src_start_ip 10.10.10.2 "
-                "--p{4}_src_end_ip 10.10.10.254 "
-                "--p{4}_dst_start_ip 20.20.20.2 "
-                "--p{5}_src_start_ip 20.20.20.2 "
-                "--p{5}_src_end_ip 20.20.20.254 "
-                "--p{5}_dst_start_ip 10.10.10.2 "
-                "{6} {7} --warmup_time={8}'".format(Constants.REMOTE_FW_DIR,
-                                                    duration, rate, framesize,
-                                                    _p0, _p1, _async, _latency,
-                                                    warmup_time),
-                timeout = int(duration) + 60)
-        else:
-            raise NotImplementedError('Unsupported traffic type')
-
-        logger.trace(ret)
-        logger.trace(stdout)
-        logger.trace(stderr)
+        _p0, _p1 = (2, 1) if self._ifaces_reordered else (1, 2)
+
+        profile_path = ("{0}/resources/traffic_profiles/trex/"
+                        "{1}.py".format(Constants.REMOTE_FW_DIR,
+                                        traffic_type))
+        (ret, stdout, _) = ssh.exec_command(
+            "sh -c "
+            "'{0}/resources/tools/trex/trex_stateless_profile.py "
+            "--profile {1} "
+            "--duration {2} "
+            "--frame_size {3} "
+            "--rate {4} "
+            "--warmup_time {5} "
+            "--port_0 {6} "
+            "--port_1 {7} "
+            "{8} "   # --async
+            "{9}'".  # --latency
+            format(Constants.REMOTE_FW_DIR, profile_path, duration, framesize,
+                   rate, warmup_time, _p0 - 1, _p1 - 1, _async, _latency),
+            timeout=int(duration) + 60)
 
         if int(ret) != 0:
             raise RuntimeError('T-rex stateless runtime error')
@@ -590,7 +444,7 @@ class TrafficGenerator(object):
         if node['subtype'] is None:
             raise RuntimeError('TG subtype not defined')
         elif node['subtype'] == NodeSubTypeTG.TREX:
-            self.trex_stl_start_remote_exec(duration, rate, framesize,
+            self.trex_stl_start_remote_exec(int(duration), rate, framesize,
                                             traffic_type, async_call, latency,
                                             warmup_time=warmup_time)
         else: