Merge "Add ODL noHA testcase"
[yardstick.git] / yardstick / network_services / traffic_profile / prox_profile.py
index 0a9de9b..343ef1d 100644 (file)
@@ -18,6 +18,7 @@ from __future__ import absolute_import
 import logging
 
 from yardstick.network_services.traffic_profile.base import TrafficProfile
+from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxProfileHelper
 
 LOG = logging.getLogger(__name__)
 
@@ -27,9 +28,23 @@ class ProxProfile(TrafficProfile):
     This profile adds a single stream at the beginning of the traffic session
     """
 
+    @staticmethod
+    def sort_vpci(traffic_gen):
+        """Return the list of external interfaces ordered by vpci and name
+
+        :param traffic_gen: (ProxTrafficGen) traffic generator
+        :return: list of ordered interfaces
+        """
+        def key_func(interface):
+            return interface['virtual-interface']['vpci'], interface['name']
+
+        return sorted(traffic_gen.vnfd_helper['vdu'][0]['external-interface'],
+                      key=key_func)
+
     @staticmethod
     def fill_samples(samples, traffic_gen):
-        for vpci_idx, intf in enumerate(traffic_gen.vpci_if_name_ascending):
+        vpci_if_name_ascending = ProxProfile.sort_vpci(traffic_gen)
+        for vpci_idx, intf in enumerate(vpci_if_name_ascending):
             name = intf[1]
             # TODO: VNFDs KPIs values needs to be mapped to TRex structure
             xe_port = traffic_gen.resource_helper.sut.port_stats([vpci_idx])
@@ -56,10 +71,17 @@ class ProxProfile(TrafficProfile):
         self.lower_bound = float(self.prox_config.get('lower_bound', 10.0))
         self.upper_bound = float(self.prox_config.get('upper_bound', 100.0))
         self.step_value = float(self.prox_config.get('step_value', 10.0))
+        self._profile_helper = None
+
+    def make_profile_helper(self, traffic_gen):
+        if self._profile_helper is None:
+            self._profile_helper = ProxProfileHelper.make_profile_helper(traffic_gen)
+        return self._profile_helper
 
     def init(self, queue):
         self.pkt_size_iterator = iter(self.pkt_sizes)
         self.queue = queue
+        self.queue.cancel_join_thread()
 
     def bounds_iterator(self, logger=None):
         if logger:
@@ -89,6 +111,8 @@ class ProxProfile(TrafficProfile):
         raise NotImplementedError
 
     def execute_traffic(self, traffic_generator):
+        self.make_profile_helper(traffic_generator)
+
         try:
             pkt_size = next(self.pkt_size_iterator)
         except StopIteration: