summaryrefslogtreecommitdiffstats
path: root/test/test_nfvbench.py
diff options
context:
space:
mode:
authorJules Boudaud <jules.boudaud@orange.com>2019-12-19 11:18:41 +0100
committerfmenguy <francoisregis.menguy@orange.com>2020-02-07 10:16:50 +0100
commit057486b092e0a4bb1989121588eb5f8afdb8e1d3 (patch)
treeb421f4cbb6d45a4893877141cb6bf0b00a021123 /test/test_nfvbench.py
parent423f360415e2834dd8de065434023b822e2ca3f8 (diff)
NFVBENCH-158 Allow multiple UDP ports in traffic generation4.2.0
Change-Id: Id7c3ccad01fd9dda6c7cddb576735b429eb987a4 Signed-off-by: fmenguy <francoisregis.menguy@orange.com>
Diffstat (limited to 'test/test_nfvbench.py')
-rw-r--r--test/test_nfvbench.py148
1 files changed, 140 insertions, 8 deletions
diff --git a/test/test_nfvbench.py b/test/test_nfvbench.py
index fa0e098..5274557 100644
--- a/test/test_nfvbench.py
+++ b/test/test_nfvbench.py
@@ -13,14 +13,15 @@
# License for the specific language governing permissions and limitations
# under the License.
#
+from mock import patch
+import pytest
+
+from .mock_trex import no_op
+
import json
import logging
import sys
-
from attrdict import AttrDict
-from mock import patch
-import pytest
-
from nfvbench.config import config_loads
from nfvbench.credentials import Credentials
from nfvbench.fluentd import FluentLogHandler
@@ -32,7 +33,6 @@ from nfvbench.traffic_client import IpBlock
from nfvbench.traffic_client import TrafficClient
import nfvbench.traffic_gen.traffic_utils as traffic_utils
-from .mock_trex import no_op
# just to get rid of the unused function warning
no_op()
@@ -173,6 +173,63 @@ def test_ip_block():
with pytest.raises(IndexError):
ipb.get_ip(256)
+ ipb = IpBlock('10.0.0.0', '0.0.0.2', 128)
+ assert ipb.get_ip() == '10.0.0.0'
+ assert ipb.get_ip(1) == '10.0.0.2'
+ assert ipb.get_ip(127) == '10.0.0.254'
+ with pytest.raises(IndexError):
+ ipb.get_ip(128)
+
+ ipb = IpBlock('10.0.0.0', '0.0.0.4', 64)
+ assert ipb.get_ip() == '10.0.0.0'
+ assert ipb.get_ip(1) == '10.0.0.4'
+ assert ipb.get_ip(63) == '10.0.0.252'
+ with pytest.raises(IndexError):
+ ipb.get_ip(64)
+
+ ipb = IpBlock('10.0.0.0', '0.0.0.10', 1)
+ assert ipb.get_ip() == '10.0.0.0'
+ with pytest.raises(IndexError):
+ ipb.get_ip(1)
+
+
+def test_lcm():
+ assert Device.lcm(10, 2) == 10
+ assert Device.lcm(1, 256) == 256
+ assert Device.lcm(10, 256) == 1280
+ assert Device.lcm(Device.lcm(10, 2), Device.lcm(1, 256))
+ with pytest.raises(TypeError):
+ Device.lcm(0, 0)
+
+
+def test_check_ipsize():
+ assert Device.check_ipsize(256, 1) == 256
+ assert Device.check_ipsize(256, 3) == 86
+ assert Device.check_ipsize(256, 4) == 64
+ assert Device.check_ipsize(16, 10) == 2
+ assert Device.check_ipsize(1, 10) == 1
+ with pytest.raises(ZeroDivisionError):
+ Device.check_ipsize(256, 0)
+
+
+def test_reserve_ip_range():
+ ipb = IpBlock('10.0.0.0', '0.0.0.1', 256)
+ src_ip_first, src_ip_last = ipb.reserve_ip_range(256, False)
+ assert src_ip_first == "10.0.0.0"
+ assert src_ip_last == "10.0.0.255"
+ ipb = IpBlock('20.0.0.0', '0.0.0.1', 2)
+ src_ip_first, src_ip_last = ipb.reserve_ip_range(2, False)
+ assert src_ip_first == "20.0.0.0"
+ assert src_ip_last == "20.0.0.1"
+ ipb = IpBlock('30.0.0.0', '0.0.0.1', 2)
+ src_ip_first, src_ip_last = ipb.reserve_ip_range(256, True)
+ assert src_ip_first == "30.0.0.0"
+ assert src_ip_last == "30.0.0.1"
+ ipb = IpBlock('40.0.0.0', '0.0.0.1', 2)
+ with pytest.raises(IndexError):
+ ipb.reserve_ip_range(256, False)
+
+
def check_stream_configs(gen_config):
"""Verify that the range for each chain have adjacent IP ranges without holes between chains."""
config = gen_config.config
@@ -202,6 +259,78 @@ def test_device_flow_config():
_check_device_flow_config('0.0.0.1')
_check_device_flow_config('0.0.0.2')
+
+def check_udp_stream_configs(gen_config, expected):
+ """Verify that the range for each chain have adjacent UDP ports without holes between chains."""
+ config = gen_config.config
+ stream_configs = gen_config.devices[0].get_stream_configs()
+ for index in range(config['service_chain_count']):
+ stream_cfg = stream_configs[index]
+ assert stream_cfg['ip_src_addr'] == expected['ip_src_addr']
+ assert stream_cfg['ip_src_addr_max'] == expected['ip_src_addr_max']
+ assert stream_cfg['ip_dst_addr'] == expected['ip_dst_addr']
+ assert stream_cfg['ip_dst_addr_max'] == expected['ip_dst_addr_max']
+ assert stream_cfg['udp_src_port'] == expected['udp_src_port']
+ assert stream_cfg['udp_src_port_max'] == expected['udp_src_port_max']
+ assert stream_cfg['udp_src_count'] == expected['udp_src_count']
+ assert stream_cfg['udp_dst_port'] == expected['udp_dst_port']
+ assert stream_cfg['udp_dst_port_max'] == expected['udp_dst_port_max']
+ assert stream_cfg['udp_dst_count'] == expected['udp_dst_count']
+
+
+def _check_device_udp_flow_config(param, expected):
+ config = _get_dummy_tg_config('PVP', '1Mpps',
+ ip_src_static=param['ip_src_static'],
+ fc=param['flow_count'],
+ ip0=param['ip_src_addr'],
+ ip1=param['ip_dst_addr'],
+ src_udp=param['udp_src_port'],
+ dst_udp=param['udp_dst_port'])
+ gen_config = GeneratorConfig(config)
+ check_udp_stream_configs(gen_config, expected)
+
+
+def test_device_udp_flow_config():
+ param = {'ip_src_static': True,
+ 'ip_src_addr': '110.0.0.0/32',
+ 'ip_dst_addr': '120.0.0.0/32',
+ 'udp_src_port': 53,
+ 'udp_dst_port': 53,
+ 'flow_count': 2}
+ expected = {'ip_src_addr': '110.0.0.0',
+ 'ip_src_addr_max': '110.0.0.0',
+ 'ip_dst_addr': '120.0.0.0',
+ 'ip_dst_addr_max': '120.0.0.0',
+ 'udp_src_port': 53,
+ 'udp_src_port_max': 53,
+ 'udp_src_count': 1,
+ 'udp_dst_port': 53,
+ 'udp_dst_port_max': 53,
+ 'udp_dst_count': 1}
+ _check_device_udp_flow_config(param, expected)
+ # Overwrite the udp_src_port value to define a large range of ports
+ # instead of a single port, in order to check if the imposed
+ # flow count is respected. Notice that udp range >> flow count.
+ param['udp_src_port'] = [53, 1024]
+ param['flow_count'] = 10
+ expected['udp_src_port_max'] = 57
+ expected['udp_src_count'] = 5
+ _check_device_udp_flow_config(param, expected)
+ # Re affect the default udp_src_port values and
+ # overwrite the ip_dst_addr value to define a large range of addresses
+ # instead of a single one, in order to check if the imposed
+ # flow count is respected. Notice that the netmask allows a very larger
+ # range of possible addresses than the flow count value.
+ param['udp_src_port'] = 53
+ expected['udp_src_port_max'] = 53
+ expected['udp_src_count'] = 1
+ param['ip_src_static'] = False
+ param['ip_dst_addr'] = '120.0.0.0/24'
+ expected['ip_dst_addr'] = '120.0.0.0'
+ expected['ip_dst_addr_max'] = '120.0.0.4'
+ _check_device_udp_flow_config(param, expected)
+
+
def test_config():
refcfg = {1: 100, 2: {21: 100, 22: 200}, 3: None}
res1 = {1: 10, 2: {21: 100, 22: 200}, 3: None}
@@ -290,7 +419,8 @@ def assert_ndr_pdr(stats, ndr, ndr_dr, pdr, pdr_dr):
assert_equivalence(pdr_dr, stats['pdr']['stats']['overall']['drop_percentage'])
def _get_dummy_tg_config(chain_type, rate, scc=1, fc=10, step_ip='0.0.0.1',
- ip0='10.0.0.0/8', ip1='20.0.0.0/8'):
+ ip0='10.0.0.0/8', ip1='20.0.0.0/8',
+ step_udp=1, src_udp=None, dst_udp=None, ip_src_static=True):
return AttrDict({
'traffic_generator': {'host_name': 'nfvbench_tg',
'default_profile': 'dummy',
@@ -302,14 +432,16 @@ def _get_dummy_tg_config(chain_type, rate, scc=1, fc=10, step_ip='0.0.0.1',
{'port': 1, 'pci': '0.0'}]}],
'ip_addrs_step': step_ip,
'ip_addrs': [ip0, ip1],
+ 'ip_src_static': ip_src_static,
'tg_gateway_ip_addrs': ['1.1.0.100', '2.2.0.100'],
'tg_gateway_ip_addrs_step': step_ip,
'gateway_ip_addrs': ['1.1.0.2', '2.2.0.2'],
'gateway_ip_addrs_step': step_ip,
'mac_addrs_left': None,
'mac_addrs_right': None,
- 'udp_src_port': None,
- 'udp_dst_port': None},
+ 'udp_src_port': src_udp,
+ 'udp_dst_port': dst_udp,
+ 'udp_port_step': step_udp},
'traffic': {'profile': 'profile_64',
'bidirectional': True},
'traffic_profile': [{'name': 'profile_64', 'l2frame_size': ['64']}],