Merge "Run testcase 074 result overridden by job status" into stable/gambia
[yardstick.git] / yardstick / network_services / traffic_profile / prox_profile.py
index 0a9de9b..be450c9 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2016-2017 Intel Corporation
+# Copyright (c) 2016-2018 Intel Corporation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 from __future__ import absolute_import
 
 import logging
+import multiprocessing
+import time
 
 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 +30,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])
@@ -41,7 +58,7 @@ class ProxProfile(TrafficProfile):
     def __init__(self, tp_config):
         super(ProxProfile, self).__init__(tp_config)
         self.queue = None
-        self.done = False
+        self.done = multiprocessing.Event()
         self.results = []
 
         # TODO: get init values from tp_config
@@ -56,10 +73,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,10 +113,13 @@ 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:
-            self.done = True
+            time.sleep(5)
+            self.done.set()
             return
 
         # Adjust packet size upwards if it's less than the minimum