tg_rfc2544_ixia: use traffic id from JSON to update mac 65/42965/2
authorRoss Brattain <ross.b.brattain@intel.com>
Thu, 21 Sep 2017 00:33:34 +0000 (17:33 -0700)
committerRoss Brattain <ross.b.brattain@intel.com>
Mon, 25 Sep 2017 15:30:20 +0000 (08:30 -0700)
we were using raw sort index of the interfaces to
set the MAC address, but we should be using the
traffic id from the static JSON instead.

Change-Id: I13284db04abb3eaf8c9826974a9e5aa1c37b3891
Signed-off-by: Ross Brattain <ross.b.brattain@intel.com>
tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py
yardstick/network_services/traffic_profile/ixia_rfc2544.py
yardstick/network_services/vnf_generic/vnf/tg_rfc2544_ixia.py

index 0e303dc..0c3520c 100644 (file)
@@ -252,7 +252,7 @@ class TestIXIATrafficGen(unittest.TestCase):
         mock_traffic_profile = mock.Mock(autospec=TrafficProfile)
         mock_traffic_profile.get_traffic_definition.return_value = "64"
         mock_traffic_profile.params = self.TRAFFIC_PROFILE
-        mock_traffic_profile.ports = [0, 1]
+        mock_traffic_profile.ports = ["xe0", "xe1"]
 
         mock_ssh_instance = mock.Mock(autospec=mock_ssh.SSH)
         mock_ssh_instance.execute.return_value = 0, "", ""
@@ -348,6 +348,7 @@ class TestIXIATrafficGen(unittest.TestCase):
 
         with mock.patch('yardstick.benchmark.scenarios.networking.vnf_generic.open',
                         create=True) as mock_open:
-            mock_open.return_value = mock.MagicMock()
-            result = sut._traffic_runner(mock_traffic_profile)
-            self.assertIsNone(result)
+            with mock.patch('yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.open',
+                            create=True) as mock_ixia_open:
+                result = sut._traffic_runner(mock_traffic_profile)
+                self.assertIsNone(result)
index cb8a347..ee58172 100644 (file)
@@ -103,7 +103,9 @@ class IXIARFC2544Profile(TrexProfile):
 
         self.ports = [port for port in port_generator()]
 
-    def execute_traffic(self, traffic_generator, ixia_obj, mac={}, xfile=None):
+    def execute_traffic(self, traffic_generator, ixia_obj, mac=None, xfile=None):
+        if mac is None:
+            mac = {}
         if self.first_run:
             self.full_profile = {}
             self.pg_id = 0
@@ -121,15 +123,18 @@ class IXIARFC2544Profile(TrexProfile):
         return str(multiplier)
 
     def start_ixia_latency(self, traffic_generator, ixia_obj,
-                           mac={}, xfile=None):
+                           mac=None, xfile=None):
+        if mac is None:
+            mac = {}
         self.update_traffic_profile(traffic_generator)
         traffic = \
             self._get_ixia_traffic_profile(self.full_profile, mac, xfile)
-        self._ixia_traffic_generate(traffic_generator, traffic,
-                                    ixia_obj, xfile)
+        self._ixia_traffic_generate(traffic_generator, traffic, ixia_obj)
 
     def get_drop_percentage(self, traffic_generator, samples, tol_min,
-                            tolerance, ixia_obj, mac={}, xfile=None):
+                            tolerance, ixia_obj, mac=None, xfile=None):
+        if mac is None:
+            mac = {}
         status = 'Running'
         drop_percent = 100
         in_packets = sum([samples[iface]['in_packets'] for iface in samples])
index 449f222..cd9553d 100644 (file)
@@ -13,6 +13,8 @@
 # limitations under the License.
 
 from __future__ import absolute_import
+
+import json
 import time
 import os
 import logging
@@ -79,31 +81,29 @@ class IxiaResourceHelper(ClientResourceHelper):
         latency = stats[0]
 
         samples = {}
-        for interface in self.vnfd_helper.interfaces:
+        for port_name in ports:
             try:
-                name = interface["name"]
                 # this is not DPDK port num, but this is whatever number we gave
                 # when we selected ports and programmed the profile
-                port = self.vnfd_helper.port_num(name)
-                if port in ports:
-                    samples[name] = {
-                        "rx_throughput_kps": float(last_result["Rx_Rate_Kbps"][port]),
-                        "tx_throughput_kps": float(last_result["Tx_Rate_Kbps"][port]),
-                        "rx_throughput_mbps": float(last_result["Rx_Rate_Mbps"][port]),
-                        "tx_throughput_mbps": float(last_result["Tx_Rate_Mbps"][port]),
-                        "in_packets": int(last_result["Valid_Frames_Rx"][port]),
-                        "out_packets": int(last_result["Frames_Tx"][port]),
-                        "RxThroughput": int(last_result["Valid_Frames_Rx"][port]) / 30,
-                        "TxThroughput": int(last_result["Frames_Tx"][port]) / 30,
-                    }
-                    if key:
-                        avg_latency = latency["Store-Forward_Avg_latency_ns"][port]
-                        min_latency = latency["Store-Forward_Min_latency_ns"][port]
-                        max_latency = latency["Store-Forward_Max_latency_ns"][port]
-                        samples[name][key] = \
-                            {"Store-Forward_Avg_latency_ns": avg_latency,
-                             "Store-Forward_Min_latency_ns": min_latency,
-                             "Store-Forward_Max_latency_ns": max_latency}
+                port_num = self.vnfd_helper.port_num(port_name)
+                samples[port_name] = {
+                    "rx_throughput_kps": float(last_result["Rx_Rate_Kbps"][port_num]),
+                    "tx_throughput_kps": float(last_result["Tx_Rate_Kbps"][port_num]),
+                    "rx_throughput_mbps": float(last_result["Rx_Rate_Mbps"][port_num]),
+                    "tx_throughput_mbps": float(last_result["Tx_Rate_Mbps"][port_num]),
+                    "in_packets": int(last_result["Valid_Frames_Rx"][port_num]),
+                    "out_packets": int(last_result["Frames_Tx"][port_num]),
+                    "RxThroughput": int(last_result["Valid_Frames_Rx"][port_num]) / 30,
+                    "TxThroughput": int(last_result["Frames_Tx"][port_num]) / 30,
+                }
+                if key:
+                    avg_latency = latency["Store-Forward_Avg_latency_ns"][port_num]
+                    min_latency = latency["Store-Forward_Min_latency_ns"][port_num]
+                    max_latency = latency["Store-Forward_Max_latency_ns"][port_num]
+                    samples[port_name][key] = \
+                        {"Store-Forward_Avg_latency_ns": avg_latency,
+                         "Store-Forward_Min_latency_ns": min_latency,
+                         "Store-Forward_Max_latency_ns": max_latency}
             except IndexError:
                 pass
 
@@ -128,19 +128,27 @@ class IxiaResourceHelper(ClientResourceHelper):
 
         self.client.ix_assign_ports()
 
+        ixia_file = find_relative_file("ixia_traffic.cfg",
+                                       self.scenario_helper.scenario_cfg["task_path"])
+
+        static_traffic = {}
+        with open(ixia_file) as stream:
+            try:
+                static_traffic = json.load(stream)
+            except Exception:
+                LOG.exception("")
         mac = {}
-        # TODO: shouldn't this index map to port number we used to generate the profile
-        for index, interface in enumerate(self.vnfd_helper.interfaces, 1):
-            virt_intf = interface["virtual-interface"]
-            mac.update({
-                "src_mac_{}".format(index): virt_intf.get("local_mac", default),
-                "dst_mac_{}".format(index): virt_intf.get("dst_mac", default),
-            })
+        for vld_id, traffic in static_traffic.items():
+            intfs = self.vnfd_helper.port_pairs.networks.get(vld_id, [])
+            interface = next(intfs, None)
+            if interface:
+                virt_intf = interface["virtual-interface"]
+                # we only know static traffic id by reading the json
+                # this is used by _get_ixia_traffic_profile
+                mac["src_mac_{}".format(traffic["id"])] = virt_intf.get("local_mac", default)
+                mac["dst_mac_{}".format(traffic["id"])] = virt_intf.get("dst_mac", default)
 
         samples = {}
-
-        ixia_file = find_relative_file("ixia_traffic.cfg",
-                                       self.scenario_helper.scenario_cfg["task_path"])
         # Generate ixia traffic config...
         try:
             while not self._terminated.value:
@@ -162,7 +170,6 @@ class IxiaResourceHelper(ClientResourceHelper):
             self._queue.put(samples)
         except Exception:
             LOG.info("Run Traffic terminated")
-            pass
 
         if not self.rfc_helper.is_done():
             self._terminated.value = 1