aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpmikus <pmikus@cisco.com>2016-03-18 12:44:57 +0100
committerGerrit Code Review <gerrit@fd.io>2016-03-24 11:02:31 +0000
commit96b9d2f91da4cf17a84a6fd6c46921681a5775f5 (patch)
treea64fb928b3b7c68660d1a6cf40de78e771835500
parent14594b423fcb3e4fa3906bdf4fd528998e1b6f09 (diff)
Binary DropRateSearch
- binary search - short perf bridge_domain with binary Change-Id: I50538738b356cc8fef4cfcb4974c43c5123827d1 Signed-off-by: pmikus <pmikus@cisco.com>
-rw-r--r--resources/libraries/python/DropRateSearch.py73
-rw-r--r--tests/suites/performance/short_bridge_domain_binary.robot65
2 files changed, 134 insertions, 4 deletions
diff --git a/resources/libraries/python/DropRateSearch.py b/resources/libraries/python/DropRateSearch.py
index 4bbf16c1a2..39f4655db4 100644
--- a/resources/libraries/python/DropRateSearch.py
+++ b/resources/libraries/python/DropRateSearch.py
@@ -58,6 +58,8 @@ class DropRateSearch(object):
self._rate_start = 100
#step of the linear search, unit: RateType (self._rate_type)
self._rate_linear_step = 10
+ #last rate of the binary search, unit: RateType (self._rate_type)
+ self._last_binary_rate = 0
#linear search direction, permitted values: SearchDirection
self._search_linear_direction = SearchDirection.TOP_DOWN
#upper limit of search, unit: RateType (self._rate_type)
@@ -73,7 +75,7 @@ class DropRateSearch(object):
#size of frames to send
self._frame_size = "64"
#binary convergence criterium type is self._rate_type
- self._binary_convergence_threshhold = "0.01"
+ self._binary_convergence_threshold = 100000
#numbers of traffic runs during one rate step
self._max_attempts = 1
@@ -96,7 +98,7 @@ class DropRateSearch(object):
:type loss_acceptance: float
:type loss_acceptance_type: LossAcceptanceType
:type traffic_type: str
- :return: drop threshhold exceeded? (True/False)
+ :return: drop threshold exceeded? (True/False)
:rtype bool
"""
pass
@@ -186,6 +188,23 @@ class DropRateSearch(object):
"""
return self._duration
+ def set_binary_convergence_threshold(self, convergence):
+ """Set convergence for binary search
+
+ :param convergence: treshold value number
+ :type convergence: float
+ :return: nothing
+ """
+ self._binary_convergence_threshold = float(convergence)
+
+ def get_binary_convergence_threshold(self):
+ """Get convergence for binary search
+
+ :return: treshold value number
+ :rtype: float
+ """
+ return self._binary_convergence_threshold
+
def get_rate_type_str(self):
"""Return rate type representation
@@ -294,8 +313,54 @@ class DropRateSearch(object):
elif self._search_result in [SearchResults.SUCCESS, SearchResults.SUSPICIOUS]:
return self._search_result_rate
- def binary_search(self):
- raise NotImplementedError
+ def binary_search(self, b_min, b_max, traffic_type):
+ """Binary search of rate with loss below acceptance criteria
+
+ :param b_min: min range rate
+ :param b_max: max range rate
+ :param traffic_type: traffic profile
+ :type b_min: float
+ :type b_max: float
+ :type traffic_type: str
+ :return: nothing
+ """
+
+ if not self._rate_min <= float(b_min) <= self._rate_max:
+ raise ValueError("Min rate is not in min,max range")
+ if not self._rate_min <= float(b_max) <= self._rate_max:
+ raise ValueError("Max rate is not in min,max range")
+ if float(b_max) < float(b_min):
+ raise ValueError("Min rate is greater then max rate")
+
+ #binary search
+ #rate is half of interval + start of interval
+ rate = ((float(b_max) - float(b_min)) / 2) + float(b_min)
+ #rate diff with previous run
+ rate_diff = abs(self._last_binary_rate - rate)
+
+ #convergence criterium
+ if float(rate_diff) < float(self._binary_convergence_threshold):
+ if not self._search_result_rate:
+ self._search_result = SearchResults.FAILURE
+ else:
+ self._search_result = SearchResults.SUCCESS
+ return
+
+ self._last_binary_rate = rate
+
+ res = self.measure_loss(rate, self._frame_size,
+ self._loss_acceptance,
+ self._loss_acceptance_type,
+ traffic_type)
+ #loss occured and it was above acceptance criteria
+ if res == False:
+ self.binary_search(b_min, rate, traffic_type)
+ #there was no loss / loss below acceptance criteria
+ elif res == True:
+ self._search_result_rate = rate
+ self.binary_search(rate, b_max, traffic_type)
+ else:
+ raise RuntimeError("Unknown search result")
def combined_search(self):
raise NotImplementedError
diff --git a/tests/suites/performance/short_bridge_domain_binary.robot b/tests/suites/performance/short_bridge_domain_binary.robot
new file mode 100644
index 0000000000..a83e85f5dc
--- /dev/null
+++ b/tests/suites/performance/short_bridge_domain_binary.robot
@@ -0,0 +1,65 @@
+# Copyright (c) 2016 Cisco and/or its affiliates.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+*** Settings ***
+| Resource | resources/libraries/robot/default.robot
+| Resource | resources/libraries/robot/interfaces.robot
+| Resource | resources/libraries/robot/bridge_domain.robot
+| Resource | resources/libraries/robot/performance.robot
+| Resource | resources/libraries/robot/counters.robot
+| Library | resources.libraries.python.TrafficGenerator
+| Library | resources.libraries.python.TrafficGenerator.TGDropRateSearchImpl
+| Library | resources.libraries.python.NodePath
+| Force Tags | 3_NODE_SINGLE_LINK_TOPO | PERFTEST | HW_ENV | PERFTEST_LONG
+| Suite Setup | 3-node Performance Suite Setup
+| Suite Teardown | 3-node Performance Suite Teardown
+| Test Setup | Setup all DUTs before test
+| Test Teardown | Run Keyword If Test Failed | Show statistics on all DUTs
+
+*** Test Cases ***
+| Find NDR by using binary search and 64B frames through bridge domain in 3-node topology
+| | Given L2 bridge domain initialized in a 3-node circular topology
+| | Then Find NDR using binary search and pps | 64 | 100000 | 14000000
+| | ... | 3-node-bridge | 100000 | 14000000
+
+*** Keywords ***
+
+| 3-node Performance Suite Setup
+| | 3-node circular Topology Variables Setup
+| | Initialize traffic generator | ${tg} | ${tg_if1} | ${tg_if2}
+| | ... | ${dut1} | ${dut1_if1} | ${dut1_if2}
+| | ... | ${dut2} | ${dut2_if1} | ${dut2_if2}
+| | ... | L2
+
+| 3-node Performance Suite Teardown
+| | Teardown traffic generator | ${tg}
+
+| L2 bridge domain initialized in a 3-node circular topology
+| | Vpp l2bd forwarding setup | ${dut1} | ${dut1_if1} | ${dut1_if2}
+| | Vpp l2bd forwarding setup | ${dut2} | ${dut2_if1} | ${dut2_if2}
+| | All Vpp Interfaces Ready Wait | ${nodes}
+
+| Find NDR using binary search and pps
+| | [Arguments] | ${framesize} | ${binary_min} | ${binary_max}
+| | ... | ${topology_type} | ${min_rate} | ${max_rate}
+| | Set Duration | 10
+| | Set Search Rate Boundaries | ${max_rate} | ${min_rate}
+| | Set Search Rate Type pps
+| | Set Binary Convergence Threshold | 50000
+| | Binary Search | ${binary_min} | ${binary_max} | ${topology_type}
+| | ${result_rate}= | Verify Search Result
+| | Set Test Message | FINAL_RATE: ${result_rate} pps
+
+| Show statistics on all DUTs
+| | Sleep | 10 | Waiting for statistics to be collected
+| | Vpp show stats | ${dut1}
+| | Vpp show stats | ${dut2}