aboutsummaryrefslogtreecommitdiffstats
path: root/nfvbench/traffic_gen
diff options
context:
space:
mode:
authorKerim Gokarslan <kgokarsl@cisco.com>2017-10-13 17:29:58 -0700
committerahothan <ahothan@cisco.com>2017-10-20 00:37:14 -0700
commit124ecd5d59869bad3a4f5f53f91f5b9c99051512 (patch)
treee798895746a4edddc083b6e618f766d7905a7fbc /nfvbench/traffic_gen
parent08c848d44a2a39828593b30c172a6e33773f4efc (diff)
NFVBENCH-40 Add pylint to tox
Change-Id: Ic55a07145f27c4cfaa6df5523df3940ca4433af1 Signed-off-by: Kerim Gokarslan <kgokarsl@cisco.com>
Diffstat (limited to 'nfvbench/traffic_gen')
-rw-r--r--nfvbench/traffic_gen/dummy.py10
-rw-r--r--nfvbench/traffic_gen/traffic_base.py44
-rw-r--r--nfvbench/traffic_gen/traffic_utils.py18
-rw-r--r--nfvbench/traffic_gen/trex.py34
4 files changed, 48 insertions, 58 deletions
diff --git a/nfvbench/traffic_gen/dummy.py b/nfvbench/traffic_gen/dummy.py
index dabdc71..d8c01e9 100644
--- a/nfvbench/traffic_gen/dummy.py
+++ b/nfvbench/traffic_gen/dummy.py
@@ -12,11 +12,7 @@
# License for the specific language governing permissions and limitations
# under the License.
-from nfvbench.log import LOG
-
from traffic_base import AbstractTrafficGenerator
-import traffic_utils as utils
-
class DummyTG(AbstractTrafficGenerator):
@@ -50,12 +46,6 @@ class DummyTG(AbstractTrafficGenerator):
def create_traffic(self, l2frame_size, rates, bidirectional, latency=True):
pass
- def modify_rate(self, rate, reverse):
- port_index = int(reverse)
- port = self.port_handle[port_index]
- self.rates[port_index] = utils.to_rate_str(rate)
- LOG.info('Modified traffic stream for %s, new rate=%s.' % (port, utils.to_rate_str(rate)))
-
def clear_streamblock(self):
pass
diff --git a/nfvbench/traffic_gen/traffic_base.py b/nfvbench/traffic_gen/traffic_base.py
index 064b2a2..568fae2 100644
--- a/nfvbench/traffic_gen/traffic_base.py
+++ b/nfvbench/traffic_gen/traffic_base.py
@@ -14,76 +14,86 @@
import abc
+from nfvbench.log import LOG
+import traffic_utils
+
+
class TrafficGeneratorException(Exception):
pass
class AbstractTrafficGenerator(object):
-
# src_mac (6) + dst_mac (6) + mac_type (2) + frame_check (4) = 18
l2_header_size = 18
imix_l2_sizes = [64, 594, 1518]
imix_l3_sizes = [size - l2_header_size for size in imix_l2_sizes]
imix_ratios = [7, 4, 1]
- imix_avg_l2_size = sum(map(
- lambda imix: 1.0 * imix[0] * imix[1],
- zip(imix_l2_sizes, imix_ratios))) / sum(imix_ratios)
+
+ imix_avg_l2_size = sum(
+ [1.0 * imix[0] * imix[1] for imix in zip(imix_l2_sizes, imix_ratios)]) / sum(imix_ratios)
+
+ traffic_utils.imix_avg_l2_sizes = imix_avg_l2_size
def __init__(self, config):
self.config = config
@abc.abstractmethod
- def get_version():
+ def get_version(self):
# Must be implemented by sub classes
return None
@abc.abstractmethod
- def init():
+ def init(self):
# Must be implemented by sub classes
return None
@abc.abstractmethod
- def connect():
+ def connect(self):
# Must be implemented by sub classes
return None
@abc.abstractmethod
- def config_interface():
+ def config_interface(self):
# Must be implemented by sub classes
return None
@abc.abstractmethod
- def create_traffic():
+ def create_traffic(self):
# Must be implemented by sub classes
return None
- @abc.abstractmethod
- def modify_traffic():
+ def modify_rate(self, rate, reverse):
+ port_index = int(reverse)
+ port = self.port_handle[port_index]
+ self.rates[port_index] = traffic_utils.to_rate_str(rate)
+ LOG.info('Modified traffic stream for %s, new rate=%s.', port,
+ traffic_utils.to_rate_str(rate))
+
+ def modify_traffic(self):
# Must be implemented by sub classes
return None
@abc.abstractmethod
- def get_stats():
+ def get_stats(self):
# Must be implemented by sub classes
return None
- @abc.abstractmethod
- def clear_traffic():
+ def clear_traffic(self):
# Must be implemented by sub classes
return None
@abc.abstractmethod
- def start_traffic():
+ def start_traffic(self):
# Must be implemented by sub classes
return None
@abc.abstractmethod
- def stop_traffic():
+ def stop_traffic(self):
# Must be implemented by sub classes
return None
@abc.abstractmethod
- def cleanup():
+ def cleanup(self):
# Must be implemented by sub classes
return None
diff --git a/nfvbench/traffic_gen/traffic_utils.py b/nfvbench/traffic_gen/traffic_utils.py
index 7cf44a8..e618c28 100644
--- a/nfvbench/traffic_gen/traffic_utils.py
+++ b/nfvbench/traffic_gen/traffic_utils.py
@@ -14,8 +14,9 @@
import bitmath
-from traffic_base import AbstractTrafficGenerator
+from nfvbench.utils import multiplier_map
+imix_avg_l2_size = None
def convert_rates(l2frame_size, rate, intf_speed):
@@ -48,9 +49,8 @@ def convert_rates(l2frame_size, rate, intf_speed):
def get_average_packet_size(l2frame_size):
if l2frame_size.upper() == 'IMIX':
- return AbstractTrafficGenerator.imix_avg_l2_size
- else:
- return float(l2frame_size)
+ return imix_avg_l2_size
+ return float(l2frame_size)
def load_to_bps(load_percentage, intf_speed):
@@ -71,15 +71,9 @@ def pps_to_bps(pps, avg_packet_size):
def weighted_avg(weight, count):
if sum(weight):
- return sum(map(lambda x: x[0] * x[1], zip(weight, count))) / sum(weight)
- else:
- return float('nan')
-multiplier_map = {
- 'K': 1000,
- 'M': 1000000,
- 'G': 1000000000
-}
+ return sum([x[0] * x[1] for x in zip(weight, count)]) / sum(weight)
+ return float('nan')
def parse_rate_str(rate_str):
if rate_str.endswith('pps'):
diff --git a/nfvbench/traffic_gen/trex.py b/nfvbench/traffic_gen/trex.py
index 498ff50..23faebc 100644
--- a/nfvbench/traffic_gen/trex.py
+++ b/nfvbench/traffic_gen/trex.py
@@ -12,6 +12,11 @@
# License for the specific language governing permissions and limitations
# under the License.
+import os
+import random
+import time
+import traceback
+
from collections import defaultdict
from itertools import count
from nfvbench.log import LOG
@@ -20,14 +25,11 @@ from nfvbench.traffic_server import TRexTrafficServer
from nfvbench.utils import cast_integer
from nfvbench.utils import timeout
from nfvbench.utils import TimeoutError
-import os
-import random
-import time
-import traceback
from traffic_base import AbstractTrafficGenerator
from traffic_base import TrafficGeneratorException
import traffic_utils as utils
+# pylint: disable=import-error
from trex_stl_lib.api import CTRexVmInsFixHwCs
from trex_stl_lib.api import Dot1Q
from trex_stl_lib.api import Ether
@@ -46,6 +48,7 @@ from trex_stl_lib.api import STLVmFlowVarRepetableRandom
from trex_stl_lib.api import STLVmWrFlowVar
from trex_stl_lib.api import UDP
from trex_stl_lib.services.trex_stl_service_arp import STLServiceARP
+# pylint: enable=import-error
class TRex(AbstractTrafficGenerator):
@@ -95,8 +98,7 @@ class TRex(AbstractTrafficGenerator):
result[ph]['rx']['min_delay_usec'] = cast_integer(
lat['total_min']) if 'total_min' in lat else float('nan')
result[ph]['rx']['avg_delay_usec'] = cast_integer(
- lat['average']) if 'average' in lat else float(
- 'nan')
+ lat['average']) if 'average' in lat else float('nan')
total_tx_pkts = result[0]['tx']['total_pkts'] + result[1]['tx']['total_pkts']
result["total_tx_rate"] = cast_integer(total_tx_pkts / self.config.duration_sec)
return result
@@ -117,7 +119,7 @@ class TRex(AbstractTrafficGenerator):
def __combine_latencies(self, in_stats, port_handle):
"""Traverses TRex result dictionary and combines chosen latency stats."""
- if not len(self.latencies[port_handle]):
+ if not self.latencies[port_handle]:
return {}
result = defaultdict(float)
@@ -268,7 +270,7 @@ class TRex(AbstractTrafficGenerator):
if os.path.isfile(logpath):
# Wait for TRex to finish writing error message
last_size = 0
- for it in xrange(self.config.generic_retry_count):
+ for _ in xrange(self.config.generic_retry_count):
size = os.path.getsize(logpath)
if size == last_size:
# probably not writing anymore
@@ -347,13 +349,13 @@ class TRex(AbstractTrafficGenerator):
if len(self.arps[port]) == self.config.service_chain_count:
resolved += 1
- LOG.info('ARP resolved successfully for port {}'.format(port))
+ LOG.info('ARP resolved successfully for port %s', port)
break
else:
failed = [arp.get_record().dst_ip for arp in arps
if arp.get_record().dst_mac is None]
- LOG.info('Retrying ARP for: {} ({} / {})'.format(
- failed, attempt, self.config.generic_retry_count))
+ LOG.info('Retrying ARP for: %d (%d / %d)',
+ failed, attempt, self.config.generic_retry_count)
time.sleep(self.config.generic_poll_sec)
self.client.set_service_mode(ports=self.port_handle, enabled=False)
@@ -396,7 +398,7 @@ class TRex(AbstractTrafficGenerator):
stream_cfgs = [d.get_stream_configs(self.config.generator_config.service_chain)
for d in self.config.generator_config.devices]
- self.rates = map(lambda rate: utils.to_rate_str(rate), rates)
+ self.rates = [utils.to_rate_str(rate) for rate in rates]
for ph in self.port_handle:
# generate one pg_id for each direction
@@ -420,13 +422,7 @@ class TRex(AbstractTrafficGenerator):
for ph in self.port_handle:
self.client.add_streams(self.streamblock[ph], ports=ph)
- LOG.info('Created traffic stream for port %s.' % ph)
-
- def modify_rate(self, rate, reverse):
- port_index = int(reverse)
- port = self.port_handle[port_index]
- self.rates[port_index] = utils.to_rate_str(rate)
- LOG.info('Modified traffic stream for %s, new rate=%s.' % (port, utils.to_rate_str(rate)))
+ LOG.info('Created traffic stream for port %s.', ph)
def clear_streamblock(self):
self.streamblock = defaultdict(list)