-# Copyright (c) 2018 Cisco and/or its affiliates.
+# Copyright (c) 2019 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:
@abstractmethod
def measure_loss(self, rate, frame_size, loss_acceptance,
- loss_acceptance_type, traffic_type, skip_warmup=False):
+ loss_acceptance_type, traffic_profile, skip_warmup=False):
"""Send traffic from TG and measure count of dropped frames.
:param rate: Offered traffic load.
:param frame_size: Size of frame.
:param loss_acceptance: Permitted drop ratio or frames count.
:param loss_acceptance_type: Type of permitted loss.
- :param traffic_type: Traffic profile ([2,3]-node-L[2,3], ...).
+ :param traffic_profile: Module name to use for traffic generation.
:param skip_warmup: Start TRex without warmup traffic if true.
:type rate: int
:type frame_size: str
:type loss_acceptance: float
:type loss_acceptance_type: LossAcceptanceType
- :type traffic_type: str
- :type traffic_type: bool
+ :type traffic_profile: str
+ :type skip_warmup: bool
:returns: Drop threshold exceeded? (True/False)
:rtype: bool
"""
else:
raise ValueError("Unknown search result type")
- def linear_search(self, start_rate, traffic_type):
+ def linear_search(self, start_rate, traffic_profile):
"""Linear search of rate with loss below acceptance criteria.
:param start_rate: Initial rate.
- :param traffic_type: Traffic profile.
+ :param traffic_profile: Module name to use for traffic generation.
:type start_rate: float
- :type traffic_type: str
+ :type traffic_profile: str
:returns: nothing
:raises ValueError: If start rate is not in range.
"""
for dummy in range(self._max_attempts):
res.append(self.measure_loss(
rate, self._frame_size, self._loss_acceptance,
- self._loss_acceptance_type, traffic_type))
+ self._loss_acceptance_type, traffic_profile))
res = self._get_res_based_on_search_type(res)
- if self._search_linear_direction == SearchDirection.BOTTOM_UP:
- # loss occurred and it was above acceptance criteria
- if not res:
- # if this is first run then we didn't find drop rate
- if prev_rate is None:
- self._search_result = SearchResults.FAILURE
- self._search_result_rate = None
- # else we found the rate, which is value from previous run
- else:
- self._search_result = SearchResults.SUCCESS
- self._search_result_rate = prev_rate
- return
- # there was no loss / loss below acceptance criteria
- elif res:
- prev_rate = rate
- rate += self._rate_linear_step
- if rate > self._rate_max:
- if prev_rate != self._rate_max:
- # one last step with rate set to _rate_max
- rate = self._rate_max
- continue
- else:
- self._search_result = SearchResults.SUCCESS
- self._search_result_rate = prev_rate
- return
- else:
- continue
- else:
- raise RuntimeError("Unknown search result")
-
- elif self._search_linear_direction == SearchDirection.TOP_DOWN:
+ if self._search_linear_direction == SearchDirection.TOP_DOWN:
# loss occurred, decrease rate
if not res:
prev_rate = rate
else:
raise Exception("Unknown search direction")
- raise Exception("Wrong codepath")
-
def verify_search_result(self):
"""Fail if search was not successful.
return self._search_result_rate, self.get_latency()
raise Exception('Search FAILED')
- def binary_search(self, b_min, b_max, traffic_type, skip_max_rate=False,
+ def binary_search(self, b_min, b_max, traffic_profile, skip_max_rate=False,
skip_warmup=False):
"""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.
+ :param traffic_profile: Module name to use for traffic generation.
:param skip_max_rate: Start with max rate first
:param skip_warmup: Start TRex without warmup traffic if true.
:type b_min: float
:type b_max: float
- :type traffic_type: str
+ :type traffic_profile: str
:type skip_max_rate: bool
:type skip_warmup: bool
:returns: nothing
res = []
for dummy in range(self._max_attempts):
- res.append(self.measure_loss(rate, self._frame_size,
- self._loss_acceptance,
- self._loss_acceptance_type,
- traffic_type, skip_warmup=skip_warmup))
+ res.append(self.measure_loss(
+ rate, self._frame_size, self._loss_acceptance,
+ self._loss_acceptance_type, traffic_profile,
+ skip_warmup=skip_warmup))
res = self._get_res_based_on_search_type(res)
# loss occurred and it was above acceptance criteria
if not res:
- self.binary_search(b_min, rate, traffic_type, True, True)
+ self.binary_search(b_min, rate, traffic_profile, True, True)
# there was no loss / loss below acceptance criteria
else:
self._search_result_rate = rate
- self.binary_search(rate, b_max, traffic_type, True, True)
+ self.binary_search(rate, b_max, traffic_profile, True, True)
- def combined_search(self, start_rate, traffic_type):
+ def combined_search(self, start_rate, traffic_profile):
"""Combined search of rate with loss below acceptance criteria.
:param start_rate: Initial rate.
- :param traffic_type: Traffic profile.
+ :param traffic_profile: Module name to use for traffic generation.
:type start_rate: float
- :type traffic_type: str
+ :type traffic_profile: str
:returns: nothing
:raises RuntimeError: If linear search failed.
"""
- self.linear_search(start_rate, traffic_type)
+ self.linear_search(start_rate, traffic_profile)
if self._search_result in [SearchResults.SUCCESS,
SearchResults.SUSPICIOUS]:
self._search_result_rate = None
# we will use binary search to refine search in one linear step
- self.binary_search(b_min, b_max, traffic_type, True)
+ self.binary_search(b_min, b_max, traffic_profile, True)
# linear and binary search succeed
if self._search_result == SearchResults.SUCCESS: