From c1d6fd53c49a2cc5c0a7eab82e15dcf1a08f4e32 Mon Sep 17 00:00:00 2001 From: Deepak S Date: Fri, 30 Dec 2016 09:22:51 -0800 Subject: Adding generic traffic profiles for trex traffic generator This patch defines Generic traffic profiles - rfc2544, http etc JiRA: YARDSTICK-489 Change-Id:I0d8270b4d5f5f2d3415b98182990d8649099dbe3 Signed-off-by: Deepak S --- .../scenarios/networking/test_vnf_generic.py | 4 +- .../network_services/traffic_profile/test_http.py | 45 ++++ .../traffic_profile/test_rfc2544.py | 181 ++++++++++++++ .../traffic_profile/test_traffic_profile.py | 269 +++++++++++++++++++++ 4 files changed, 497 insertions(+), 2 deletions(-) create mode 100644 tests/unit/network_services/traffic_profile/test_http.py create mode 100644 tests/unit/network_services/traffic_profile/test_rfc2544.py create mode 100644 tests/unit/network_services/traffic_profile/test_traffic_profile.py (limited to 'tests') diff --git a/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py b/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py index 7dfd9e3a1..540d7f214 100644 --- a/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py +++ b/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py @@ -395,8 +395,8 @@ class TestNetworkServiceTestCase(unittest.TestCase): self._get_file_abspath("ipv4_1flow_Packets_vpe.yaml") self.scenario_cfg["traffic_options"]["imix"] = \ self._get_file_abspath("imix_voice.yaml") - self.assertRaises(RuntimeError, self.s._fill_traffic_profile, - self.scenario_cfg, self.context_cfg) + self.assertIsNotNone(self.s._fill_traffic_profile(self.scenario_cfg, + self.context_cfg)) def test_teardown(self): vnf = mock.Mock(autospec=GenericVNF) diff --git a/tests/unit/network_services/traffic_profile/test_http.py b/tests/unit/network_services/traffic_profile/test_http.py new file mode 100644 index 000000000..e818a0528 --- /dev/null +++ b/tests/unit/network_services/traffic_profile/test_http.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. +# + +from __future__ import absolute_import +import unittest + +from yardstick.network_services.traffic_profile.base import TrafficProfile +from yardstick.network_services.traffic_profile.http import \ + TrafficProfileGenericHTTP + + +class TestTrafficProfileGenericHTTP(unittest.TestCase): + def test___init__(self): + traffic_profile_generic_htt_p = \ + TrafficProfileGenericHTTP(TrafficProfile) + self.assertIsNotNone(traffic_profile_generic_htt_p) + + def test_execute(self): + traffic_profile_generic_htt_p = \ + TrafficProfileGenericHTTP(TrafficProfile) + traffic_generator = {} + self.assertEqual(None, + traffic_profile_generic_htt_p.execute( + traffic_generator)) + + def test__send_http_request(self): + traffic_profile_generic_htt_p = \ + TrafficProfileGenericHTTP(TrafficProfile) + self.assertEqual(None, + traffic_profile_generic_htt_p._send_http_request( + "10.1.1.1", "250", "/req")) diff --git a/tests/unit/network_services/traffic_profile/test_rfc2544.py b/tests/unit/network_services/traffic_profile/test_rfc2544.py new file mode 100644 index 000000000..3e553dd0f --- /dev/null +++ b/tests/unit/network_services/traffic_profile/test_rfc2544.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. +# + +from __future__ import absolute_import +import unittest +import mock + +from yardstick.network_services.traffic_profile.traffic_profile \ + import TrexProfile +from yardstick.network_services.traffic_profile.rfc2544 import \ + RFC2544Profile + + +class TestRFC2544Profile(unittest.TestCase): + TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + PROFILE = {'description': 'Traffic profile to run RFC2544 latency', + 'name': 'rfc2544', + 'traffic_profile': {'traffic_type': 'RFC2544Profile', + 'frame_rate': 100}, + 'public': {'ipv4': + {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}}, + 'outer_l3v4': {'dstip4': '1.1.1.1-1.15.255.255', + 'proto': 'udp', + 'srcip4': '90.90.1.1-90.105.255.255', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'srcport': '2001', + 'dsrport': '1234'}}}, + 'private': {'ipv4': + {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}}, + 'outer_l3v4': {'dstip4': '9.9.1.1-90.105.255.255', + 'proto': 'udp', + 'srcip4': '1.1.1.1-1.15.255.255', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'dstport': '2001', + 'srcport': '1234'}}}, + 'schema': 'isb:traffic_profile:0.1'} + + def test___init__(self): + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + assert r_f_c2544_profile.rate + + def test_execute(self): + traffic_generator = mock.Mock(autospec=TrexProfile) + traffic_generator.my_ports = [0, 1] + traffic_generator.client = \ + mock.Mock(return_value=True) + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.params = self.PROFILE + r_f_c2544_profile.first_run = True + self.assertEqual(None, r_f_c2544_profile.execute(traffic_generator)) + + def test_get_drop_percentage(self): + traffic_generator = mock.Mock(autospec=TrexProfile) + traffic_generator.my_ports = [0, 1] + traffic_generator.client = \ + mock.Mock(return_value=True) + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.params = self.PROFILE + self.assertEqual(None, r_f_c2544_profile.execute(traffic_generator)) + samples = {} + for ifname in range(1): + name = "xe{}".format(ifname) + samples[name] = {"rx_throughput_fps": 20, + "tx_throughput_fps": 20, + "rx_throughput_mbps": 10, + "tx_throughput_mbps": 10, + "in_packets": 1000, + "out_packets": 1000} + tol_min = 100.0 + tolerance = 0.0 + expected = {'DropPercentage': 0.0, 'RxThroughput': 33, + 'TxThroughput': 33, 'CurrentDropPercentage': 0.0, + 'Throughput': 33, + 'xe0': {'tx_throughput_fps': 20, 'in_packets': 1000, + 'out_packets': 1000, 'rx_throughput_mbps': 10, + 'tx_throughput_mbps': 10, 'rx_throughput_fps': 20}} + self.assertDictEqual(expected, + r_f_c2544_profile.get_drop_percentage( + traffic_generator, samples, + tol_min, tolerance)) + + def test_get_drop_percentage_update(self): + traffic_generator = mock.Mock(autospec=TrexProfile) + traffic_generator.my_ports = [0, 1] + traffic_generator.client = \ + mock.Mock(return_value=True) + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.params = self.PROFILE + self.assertEqual(None, r_f_c2544_profile.execute(traffic_generator)) + samples = {} + for ifname in range(1): + name = "xe{}".format(ifname) + samples[name] = {"rx_throughput_fps": 20, + "tx_throughput_fps": 20, + "rx_throughput_mbps": 10, + "tx_throughput_mbps": 10, + "in_packets": 1000, + "out_packets": 1002} + tol_min = 0.0 + tolerance = 1.0 + expected = {'DropPercentage': 0.2, 'RxThroughput': 33, + 'TxThroughput': 33, 'CurrentDropPercentage': 0.2, + 'Throughput': 33, + 'xe0': {'tx_throughput_fps': 20, 'in_packets': 1000, + 'out_packets': 1002, 'rx_throughput_mbps': 10, + 'tx_throughput_mbps': 10, 'rx_throughput_fps': 20}} + self.assertDictEqual(expected, + r_f_c2544_profile.get_drop_percentage( + traffic_generator, samples, + tol_min, tolerance)) + + def test_get_drop_percentage_div_zero(self): + traffic_generator = mock.Mock(autospec=TrexProfile) + traffic_generator.my_ports = [0, 1] + traffic_generator.client = \ + mock.Mock(return_value=True) + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.params = self.PROFILE + self.assertEqual(None, r_f_c2544_profile.execute(traffic_generator)) + samples = {} + for ifname in range(1): + name = "xe{}".format(ifname) + samples[name] = {"rx_throughput_fps": 20, + "tx_throughput_fps": 20, + "rx_throughput_mbps": 10, + "tx_throughput_mbps": 10, + "in_packets": 1000, + "out_packets": 0} + tol_min = 0.0 + tolerance = 0.0 + r_f_c2544_profile.tmp_throughput = 0 + expected = {'DropPercentage': 100.0, 'RxThroughput': 33, + 'TxThroughput': 0, 'CurrentDropPercentage': 100.0, + 'Throughput': 33, + 'xe0': {'tx_throughput_fps': 20, 'in_packets': 1000, + 'out_packets': 0, 'rx_throughput_mbps': 10, + 'tx_throughput_mbps': 10, 'rx_throughput_fps': 20}} + self.assertDictEqual(expected, + r_f_c2544_profile.get_drop_percentage( + traffic_generator, samples, + tol_min, tolerance)) + + def test_get_multiplier(self): + r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) + r_f_c2544_profile.max_rate = 100 + r_f_c2544_profile.min_rate = 100 + self.assertEqual("1.0", r_f_c2544_profile.get_multiplier()) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/unit/network_services/traffic_profile/test_traffic_profile.py b/tests/unit/network_services/traffic_profile/test_traffic_profile.py new file mode 100644 index 000000000..126a4a2a4 --- /dev/null +++ b/tests/unit/network_services/traffic_profile/test_traffic_profile.py @@ -0,0 +1,269 @@ +#!/usr/bin/env python + +# Copyright (c) 2016-2017 Intel Corporation +# +# 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. +# + +from __future__ import absolute_import +import unittest + +from yardstick.network_services.traffic_profile.base import TrafficProfile +from yardstick.network_services.traffic_profile.traffic_profile import \ + TrexProfile + + +class TestTrexProfile(unittest.TestCase): + TRAFFIC_PROFILE = { + "schema": "isb:traffic_profile:0.1", + "name": "fixed", + "description": "Fixed traffic profile to run UDP traffic", + "traffic_profile": { + "traffic_type": "FixedTraffic", + "frame_rate": 100, # pps + "flow_number": 10, + "frame_size": 64}} + + PROFILE = {'description': 'Traffic profile to run RFC2544 latency', + 'name': 'rfc2544', + 'traffic_profile': {'traffic_type': 'RFC2544Profile', + 'frame_rate': 100}, + 'public': {'ipv4': {'outer_l2': {'framesize': {'64B': '100', + '1518B': '0', + '128B': '0', + '1400B': '0', + '256B': '0', + '373b': '0', + '570B': '0'}, + "srcmac": "00:00:00:00:00:02", + "dstmac": "00:00:00:00:00:01"}, + 'outer_l3v4': {'dstip4': '1.1.1.1-1.1.2.2', + 'proto': 'udp', + 'srcip4': '9.9.1.1-90.1.2.2', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'srcport': '2001', + 'dsrport': '1234'}}}, + 'private': {'ipv4': + {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}, + "srcmac": "00:00:00:00:00:01", + "dstmac": "00:00:00:00:00:02"}, + 'outer_l3v4': {'dstip4': '9.9.1.1-90.105.255.255', + 'proto': 'udp', + 'srcip4': '1.1.1.1-1.15.255.255', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'dstport': '2001', + 'srcport': '1234'}}}, + 'schema': 'isb:traffic_profile:0.1'} + PROFILE_v6 = {'description': 'Traffic profile to run RFC2544 latency', + 'name': 'rfc2544', + 'traffic_profile': {'traffic_type': 'RFC2544Profile', + 'frame_rate': 100}, + 'public': {'ipv6': {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}, + "srcmac": "00:00:00:00:00:02", + "dstmac": "00:00:00:00:00:01"}, + 'outer_l3v4': {'dstip6': '0064:ff9b:0:0:0:0:9810:6414-0064:ff9b:0:0:0:0:9810:6420', + 'proto': 'udp', + 'srcip6': '0064:ff9b:0:0:0:0:9810:2814-0064:ff9b:0:0:0:0:9810:2820', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'srcport': '2001', + 'dsrport': '1234'}}}, + 'private': + {'ipv6': {'outer_l2': {'framesize': + {'64B': '100', '1518B': '0', + '128B': '0', '1400B': '0', + '256B': '0', '373b': '0', + '570B': '0'}, + "srcmac": "00:00:00:00:00:01", + "dstmac": "00:00:00:00:00:02"}, + 'outer_l3v4': {'dstip6': '0064:ff9b:0:0:0:0:9810:2814-0064:ff9b:0:0:0:0:9810:2820', + 'proto': 'udp', + 'srcip6': '0064:ff9b:0:0:0:0:9810:6414-0064:ff9b:0:0:0:0:9810:6420', + 'dscp': 0, 'ttl': 32}, + 'outer_l4': {'dstport': '2001', + 'srcport': '1234'}}}, + 'schema': 'isb:traffic_profile:0.1'} + + def test___init__(self): + TrafficProfile.params = self.PROFILE + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(trex_profile.pps, 100) + + def test_execute(self): + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.execute({})) + + def test_set_src_mac(self): + src_mac = "00:00:00:00:00:01" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_src_mac(src_mac)) + + src_mac = "00:00:00:00:00:01-00:00:00:00:00:02" + self.assertEqual(None, trex_profile.set_src_mac(src_mac)) + + def test_set_dst_mac(self): + dst_mac = "00:00:00:00:00:03" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dst_mac(dst_mac)) + + dst_mac = "00:00:00:00:00:03-00:00:00:00:00:04" + self.assertEqual(None, trex_profile.set_dst_mac(dst_mac)) + + def test_set_src_ip4(self): + src_ipv4 = "152.16.100.20" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_src_ip4(src_ipv4)) + + src_ipv4 = "152.16.100.20-152.16.100.30" + self.assertEqual(None, trex_profile.set_src_ip4(src_ipv4)) + + def test_set_dst_ip4(self): + dst_ipv4 = "152.16.100.20" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dst_ip4(dst_ipv4)) + + dst_ipv4 = "152.16.100.20-152.16.100.30" + self.assertEqual(None, trex_profile.set_dst_ip4(dst_ipv4)) + + def test_set_src_ip6(self): + src_ipv6 = "0064:ff9b:0:0:0:0:9810:6414" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_src_ip6(src_ipv6)) + + src_ipv6 = "0064:ff9b:0:0:0:0:9810:6414-0064:ff9b:0:0:0:0:9810:6420" + self.assertEqual(None, trex_profile.set_src_ip6(src_ipv6)) + + def test_set_dst_ip6(self): + dst_ipv6 = "0064:ff9b:0:0:0:0:9810:6414" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dst_ip6(dst_ipv6)) + + dst_ipv6 = "0064:ff9b:0:0:0:0:9810:6414-0064:ff9b:0:0:0:0:9810:6420" + self.assertEqual(None, trex_profile.set_dst_ip6(dst_ipv6)) + + def test_dscp(self): + dscp = "0" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dscp(dscp)) + + dscp = "0-1" + self.assertEqual(None, trex_profile.set_dscp(dscp)) + + def test_src_port(self): + port = "1234" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_src_port(port)) + + port = "1234-5678" + self.assertEqual(None, trex_profile.set_src_port(port)) + + def test_dst_port(self): + port = "1234" + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_dst_port(port)) + + port = "1234-5678" + self.assertEqual(None, trex_profile.set_dst_port(port)) + + def test_qinq(self): + qinq = {"S-VLAN": {"id": 128, "priority": 0, "cfi": 0}, + "C-VLAN": {"id": 512, "priority": 0, "cfi": 0}} + + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual(None, trex_profile.set_qinq(qinq)) + + qinq = {"S-VLAN": {"id": "128-130", "priority": 0, "cfi": 0}, + "C-VLAN": {"id": "512-515", "priority": 0, "cfi": 0}} + self.assertEqual(None, trex_profile.set_qinq(qinq)) + + def test_set_outer_l2_fields(self): + trex_profile = \ + TrexProfile(TrafficProfile) + qinq = {"S-VLAN": {"id": 128, "priority": 0, "cfi": 0}, + "C-VLAN": {"id": 512, "priority": 0, "cfi": 0}} + outer_l2 = self.PROFILE['private']['ipv4']['outer_l2'] + outer_l2['QinQ'] = qinq + self.assertEqual(None, trex_profile.set_outer_l2_fields(outer_l2)) + + def test_set_outer_l3v4_fields(self): + trex_profile = \ + TrexProfile(TrafficProfile) + outer_l3v4 = self.PROFILE['private']['ipv4']['outer_l3v4'] + outer_l3v4['proto'] = 'tcp' + self.assertEqual(None, trex_profile.set_outer_l3v4_fields(outer_l3v4)) + + def test_set_outer_l3v6_fields(self): + trex_profile = \ + TrexProfile(TrafficProfile) + outer_l3v6 = self.PROFILE_v6['private']['ipv6']['outer_l3v4'] + outer_l3v6['proto'] = 'tcp' + outer_l3v6['tc'] = 1 + outer_l3v6['hlim'] = 10 + self.assertEqual(None, trex_profile.set_outer_l3v6_fields(outer_l3v6)) + + def test_set_outer_l4_fields(self): + trex_profile = \ + TrexProfile(TrafficProfile) + outer_l4 = self.PROFILE['private']['ipv4']['outer_l4'] + self.assertEqual(None, trex_profile.set_outer_l4_fields(outer_l4)) + + def test_get_streams(self): + trex_profile = \ + TrexProfile(TrafficProfile) + trex_profile.params = self.PROFILE + trex_profile.profile_data = self.PROFILE["private"] + self.assertIsNotNone(trex_profile.get_streams()) + trex_profile.pg_id = 1 + self.assertIsNotNone(trex_profile.get_streams()) + trex_profile.params = self.PROFILE_v6 + trex_profile.profile_data = self.PROFILE_v6["private"] + self.assertIsNotNone(trex_profile.get_streams()) + trex_profile.pg_id = 1 + self.assertIsNotNone(trex_profile.get_streams()) + + def test_generate_packets(self): + trex_profile = \ + TrexProfile(TrafficProfile) + trex_profile.fsize = 10 + trex_profile.base_pkt = [10] + self.assertIsNone(trex_profile.generate_packets()) + + def test_generate_imix_data_error(self): + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertEqual({}, trex_profile.generate_imix_data(False)) + + def test__get_start_end_ipv6(self): + trex_profile = \ + TrexProfile(TrafficProfile) + self.assertRaises(SystemExit, trex_profile._get_start_end_ipv6, + "1.1.1.3", "1.1.1.1") -- cgit 1.2.3-korg