1 # Copyright (c) 2016-2017 Intel Corporation
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 """ Fixed traffic profile definitions """
16 from __future__ import absolute_import
20 from yardstick.network_services.traffic_profile.prox_profile import ProxProfile
22 LOG = logging.getLogger(__name__)
25 class ProxBinSearchProfile(ProxProfile):
27 This profile adds a single stream at the beginning of the traffic session
30 def __init__(self, tp_config):
31 super(ProxBinSearchProfile, self).__init__(tp_config)
32 self.current_lower = self.lower_bound
33 self.current_upper = self.upper_bound
37 return self.current_upper - self.current_lower
41 return (self.current_lower + self.current_upper) / 2
43 def bounds_iterator(self, logger=None):
44 self.current_lower = self.lower_bound
45 self.current_upper = self.upper_bound
47 test_value = self.current_upper
48 while abs(self.delta) >= self.precision:
50 logger.debug("New interval [%s, %s), precision: %d", self.current_lower,
51 self.current_upper, self.step_value)
52 logger.info("Testing with value %s", test_value)
55 test_value = self.mid_point
57 def run_test_with_pkt_size(self, traffic_gen, pkt_size, duration):
58 """Run the test for a single packet size.
60 :param queue: queue object we put samples into
62 :param traffic_gen: traffic generator instance
63 :type traffic_gen: TrafficGen
64 :param pkt_size: The packet size to test with.
66 :param duration: The duration for each try.
71 LOG.info("Testing with packet size %d", pkt_size)
73 # Binary search assumes the lower value of the interval is
74 # successful and the upper value is a failure.
75 # The first value that is tested, is the maximum value. If that
76 # succeeds, no more searching is needed. If it fails, a regular
77 # binary search is performed.
79 # The test_value used for the first iteration of binary search
80 # is adjusted so that the delta between this test_value and the
81 # upper bound is a power-of-2 multiple of precision. In the
82 # optimistic situation where this first test_value results in a
83 # success, the binary search will complete on an integer multiple
84 # of the precision, rather than on a fraction of it.
86 # throughput and packet loss from the most recent successful test
87 successful_pkt_loss = 0.0
88 for test_value in self.bounds_iterator(LOG):
89 result = traffic_gen.resource_helper.run_test(pkt_size, duration,
90 test_value, self.tolerated_loss)
93 LOG.debug("Success! Increasing lower bound")
94 self.current_lower = test_value
95 successful_pkt_loss = result.pkt_loss
97 LOG.debug("Failure... Decreasing upper bound")
98 self.current_upper = test_value
100 samples = result.get_samples(pkt_size, successful_pkt_loss)
101 self.queue.put(samples)