From 96b9d2f91da4cf17a84a6fd6c46921681a5775f5 Mon Sep 17 00:00:00 2001 From: pmikus Date: Fri, 18 Mar 2016 12:44:57 +0100 Subject: Binary DropRateSearch - binary search - short perf bridge_domain with binary Change-Id: I50538738b356cc8fef4cfcb4974c43c5123827d1 Signed-off-by: pmikus --- resources/libraries/python/DropRateSearch.py | 73 ++++++++++++++++++++-- .../performance/short_bridge_domain_binary.robot | 65 +++++++++++++++++++ 2 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 tests/suites/performance/short_bridge_domain_binary.robot 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} -- cgit 1.2.3-korg