Merge "Refactor userguide "Yardstick Installation""
[yardstick.git] / yardstick / network_services / vnf_generic / vnf / tg_trex.py
index 458f1b8..4250cb7 100644 (file)
@@ -14,8 +14,6 @@
 """ Trex acts as traffic generation and vnf definitions based on IETS Spec """
 
 from __future__ import absolute_import
-from __future__ import print_function
-
 import logging
 import os
 
@@ -48,27 +46,38 @@ class TrexResourceHelper(ClientResourceHelper):
     ASYNC_PORT = 4500
     SYNC_PORT = 4501
 
+    def __init__(self, setup_helper):
+        super(TrexResourceHelper, self).__init__(setup_helper)
+        self.port_map = {}
+        self.dpdk_to_trex_port_map = {}
+
     def generate_cfg(self):
         port_names = self.vnfd_helper.port_pairs.all_ports
         vpci_list = []
         port_list = []
+        self.port_map = {}
+        self.dpdk_to_trex_port_map = {}
 
-        port_nums = sorted(self.vnfd_helper.port_nums(port_names))
-        for port_num in port_nums:
-            interface = self.vnfd_helper.find_interface_by_port(port_num)
+        sorted_ports = sorted((self.vnfd_helper.port_num(port_name), port_name) for port_name in
+                              port_names)
+        for index, (port_num, port_name) in enumerate(sorted_ports):
+            interface = self.vnfd_helper.find_interface(name=port_name)
             virtual_interface = interface['virtual-interface']
             dst_mac = virtual_interface["dst_mac"]
 
-            # why skip?, ordering is based on DPDK port number so we can't skip
+            # this is to check for unused ports, all ports in the topology
+            # will always have dst_mac
             if not dst_mac:
                 continue
-            # TRex ports must be in DPDK port number, so order of append matters
+            # TRex ports are in logical order roughly based on DPDK port number sorting
             vpci_list.append(virtual_interface["vpci"])
             local_mac = virtual_interface["local_mac"]
             port_list.append({
                 "src_mac": mac_address_to_hex_list(local_mac),
                 "dest_mac": mac_address_to_hex_list(dst_mac),
             })
+            self.port_map[port_name] = index
+            self.dpdk_to_trex_port_map[port_num] = index
         trex_cfg = {
             'interfaces': vpci_list,
             'port_info': port_list,
@@ -80,6 +89,17 @@ class TrexResourceHelper(ClientResourceHelper):
         cfg_str = yaml.safe_dump(cfg_file, default_flow_style=False, explicit_start=True)
         self.ssh_helper.upload_config_file(os.path.basename(self.CONF_FILE), cfg_str)
 
+    def _build_ports(self):
+        super(TrexResourceHelper, self)._build_ports()
+        # override with TRex logic port number
+        self.uplink_ports = [self.dpdk_to_trex_port_map[p] for p in self.uplink_ports]
+        self.downlink_ports = [self.dpdk_to_trex_port_map[p] for p in self.downlink_ports]
+        self.all_ports = [self.dpdk_to_trex_port_map[p] for p in self.all_ports]
+
+    def port_num(self, intf):
+        # return logical TRex port
+        return self.port_map[intf]
+
     def check_status(self):
         status, _, _ = self.ssh_helper.execute("sudo lsof -i:%s" % self.SYNC_PORT)
         return status
@@ -169,8 +189,8 @@ class TrexTrafficGen(SampleVNFTrafficGen):
     def scale(self, flavor=""):
         pass
 
-    def listen_traffic(self, traffic_profile):
-        pass
-
     def terminate(self):
         self.resource_helper.terminate()
+
+    def wait_for_instantiate(self):
+        return self._wait_for_process()