diff options
Diffstat (limited to 'tests')
48 files changed, 169 insertions, 15105 deletions
diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc080.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc080.yaml index 0da296297..5fe902419 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc080.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc080.yaml @@ -40,8 +40,12 @@ context: host: image: openretriever/yardstick command: /bin/bash - args: ['-c', 'chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; service ssh restart;while true ; do sleep 10000; done'] + args: ['-c', 'mkdir /root/.ssh; cp /tmp/.ssh/authorized_keys ~/.ssh/.; + chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; service ssh restart; + while true ; do sleep 10000; done'] target: image: openretriever/yardstick command: /bin/bash - args: ['-c', 'chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; service ssh restart;while true ; do sleep 10000; done'] + args: ['-c', 'mkdir /root/.ssh; cp /tmp/.ssh/authorized_keys ~/.ssh/.; + chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; service ssh restart; + while true ; do sleep 10000; done'] diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc081.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc081.yaml index fc7eb006c..fc6496bad 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc081.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc081.yaml @@ -42,7 +42,9 @@ contexts: host: image: openretriever/yardstick command: /bin/bash - args: ['-c', 'chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; service ssh restart;while true ; do sleep 10000; done'] + args: ['-c', 'mkdir /root/.ssh; cp /tmp/.ssh/authorized_keys ~/.ssh/.; + chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; service ssh restart; + while true ; do sleep 10000; done'] - type: Heat name: openstack diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc088.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc088.yaml new file mode 100644 index 000000000..c2f1cbe33 --- /dev/null +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc088.yaml @@ -0,0 +1,80 @@ +############################################################################## +# Copyright (c) 2017 14_ykl@tongji.edu.cn and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- + +schema: "yardstick:task:0.1" +description: > + Yardstick TC088 config file; + HA test case: Control node Openstack service down - nova scheduler + +{% set file = file or '/etc/yardstick/pod.yaml' %} +{% set attack_host = attack_host or "node1" %} +{% set attack_process = attack_process or "nova-scheduler" %} +{% set inst_param = inst_param or "tc088 yardstick-image yardstick-flavor internal-network" %} +{% set inst_name = inst_name or "tc088" %} + +scenarios: + - + type: "GeneralHA" + options: + attackers: + - + fault_type: "kill-process" + host: {{attack_host}} + key: "kill-process" + process_name: "{{ attack_process }}" + + monitors: + - + monitor_type: "process" + key: "service-status" + process_name: "{{ attack_process }}" + host: {{attack_host}} + monitor_time: 30 + monitor_number: 3 + sla: + max_recover_time: 30 + + operations: + - + operation_type: "general-operation" + key: "nova-create-instance" + operation_key: "nova-create-instance" + action_parameter: + serverconfig: {{inst_param}} + rollback_parameter: + serverconfig: {{inst_name}} + + steps: + - + actionKey: "kill-process" + actionType: "attacker" + index: 1 + - + actionKey: "service-status" + actionType: "monitor" + index: 2 + - + actionKey: "nova-create-instance" + actionType: "operation" + index: 3 + + nodes: + {{attack_host}}: {{attack_host}}.LF + runner: + type: Duration + duration: 1 + sla: + outage_time: 5 + action: monitor + +context: + type: Node + name: LF + file: {{file}} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc089.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc089.yaml new file mode 100644 index 000000000..d10650e03 --- /dev/null +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc089.yaml @@ -0,0 +1,80 @@ +############################################################################## +# Copyright (c) 2017 14_ykl@tongji.edu.cn and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +--- + +schema: "yardstick:task:0.1" +description: > + Yardstick TC089 config file; + HA test case: Control node Openstack service down - nova conductor + +{% set file = file or '/etc/yardstick/pod.yaml' %} +{% set attack_host = attack_host or "node1" %} +{% set attack_process = attack_process or "nova-conductor" %} +{% set inst_param = inst_param or "tc089 yardstick-image yardstick-flavor internal-network" %} +{% set inst_name = inst_name or "tc089" %} + +scenarios: + - + type: "GeneralHA" + options: + attackers: + - + fault_type: "kill-process" + host: {{attack_host}} + key: "kill-process" + process_name: "{{ attack_process }}" + + monitors: + - + monitor_type: "process" + key: "service-status" + process_name: "{{ attack_process }}" + host: {{attack_host}} + monitor_time: 30 + monitor_number: 3 + sla: + max_recover_time: 30 + + operations: + - + operation_type: "general-operation" + key: "nova-create-instance" + operation_key: "nova-create-instance" + action_parameter: + serverconfig: {{inst_param}} + rollback_parameter: + serverconfig: {{inst_name}} + + steps: + - + actionKey: "kill-process" + actionType: "attacker" + index: 1 + - + actionKey: "service-status" + actionType: "monitor" + index: 2 + - + actionKey: "nova-create-instance" + actionType: "operation" + index: 3 + + nodes: + {{attack_host}}: {{attack_host}}.LF + runner: + type: Duration + duration: 1 + sla: + outage_time: 5 + action: monitor + +context: + type: Node + name: LF + file: {{file}} diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py deleted file mode 100644 index 5935abbac..000000000 --- a/tests/unit/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 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 yardstick import tests
-
-
-# NOTE(ralonsoh): to be removed. Replace all occurrences of
-# tests.unit.STL_MOCKS with yardstick.tests.STL_MOCKS
-STL_MOCKS = tests.STL_MOCKS
diff --git a/tests/unit/network_services/__init__.py b/tests/unit/network_services/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/network_services/__init__.py +++ /dev/null diff --git a/tests/unit/network_services/helpers/__init__.py b/tests/unit/network_services/helpers/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/network_services/helpers/__init__.py +++ /dev/null diff --git a/tests/unit/network_services/helpers/acl_vnf_topology_ixia.yaml b/tests/unit/network_services/helpers/acl_vnf_topology_ixia.yaml deleted file mode 100644 index f60834fbd..000000000 --- a/tests/unit/network_services/helpers/acl_vnf_topology_ixia.yaml +++ /dev/null @@ -1,50 +0,0 @@ -# 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. - -nsd:nsd-catalog: - nsd: - - id: VACL - name: VACL - short-name: VACL - description: scenario with VACL,L3fwd and VNF - constituent-vnfd: - - member-vnf-index: '1' - vnfd-id-ref: tg__1 - VNF model: ../../vnf_descriptors/ixia_rfc2544_tpl.yaml - - member-vnf-index: '2' - vnfd-id-ref: vnf__1 - VNF model: ../../vnf_descriptors/acl_vnf.yaml - - vld: - - id: uplink_1 - name: tg__1 to vnf__1 link 1 - type: ELAN - vnfd-connection-point-ref: - - member-vnf-index-ref: '1' - vnfd-connection-point-ref: xe0 - vnfd-id-ref: tg__1 #TREX - - member-vnf-index-ref: '2' - vnfd-connection-point-ref: xe0 - vnfd-id-ref: vnf__1 #VNF - - - id: downlink_1 - name: vnf__1 to tg__1 link 2 - type: ELAN - vnfd-connection-point-ref: - - member-vnf-index-ref: '2' - vnfd-connection-point-ref: xe1 - vnfd-id-ref: vnf__1 #L3fwd - - member-vnf-index-ref: '1' - vnfd-connection-point-ref: xe1 - vnfd-id-ref: tg__1 #VACL VNF diff --git a/tests/unit/network_services/helpers/test_cpu.py b/tests/unit/network_services/helpers/test_cpu.py deleted file mode 100644 index 1f9d3f219..000000000 --- a/tests/unit/network_services/helpers/test_cpu.py +++ /dev/null @@ -1,117 +0,0 @@ -# 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 -from __future__ import division -import unittest -import mock -import subprocess - -from yardstick.network_services.helpers.cpu import \ - CpuSysCores - - -class TestCpuSysCores(unittest.TestCase): - - def test___init__(self): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(1, "", "")) - ssh_mock.put = \ - mock.Mock(return_value=(1, "", "")) - cpu_topo = CpuSysCores(ssh_mock) - self.assertIsNotNone(cpu_topo.connection) - - def test__get_core_details(self): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(1, "", "")) - ssh_mock.put = \ - mock.Mock(return_value=(1, "", "")) - cpu_topo = CpuSysCores(ssh_mock) - subprocess.check_output = mock.Mock(return_value=0) - lines = ["cpu:1", "topo:2", ""] - self.assertEqual([{'topo': '2', 'cpu': '1'}], - cpu_topo._get_core_details(lines)) - - def test_get_core_socket(self): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(1, "cpu:1\ntest:2\n \n", "")) - ssh_mock.put = \ - mock.Mock(return_value=(1, "", "")) - cpu_topo = CpuSysCores(ssh_mock) - subprocess.check_output = mock.Mock(return_value=0) - cpu_topo._get_core_details = \ - mock.Mock(side_effect=[[{'Core(s) per socket': '2', 'Thread(s) per core': '1'}], - [{'physical id': '2', 'processor': '1'}]]) - self.assertEqual({'thread_per_core': '1', '2': ['1'], - 'cores_per_socket': '2'}, - cpu_topo.get_core_socket()) - - def test_validate_cpu_cfg(self): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(1, "cpu:1\ntest:2\n \n", "")) - ssh_mock.put = \ - mock.Mock(return_value=(1, "", "")) - cpu_topo = CpuSysCores(ssh_mock) - subprocess.check_output = mock.Mock(return_value=0) - cpu_topo._get_core_details = \ - mock.Mock(side_effect=[[{'Core(s) per socket': '2', 'Thread(s) per core': '1'}], - [{'physical id': '2', 'processor': '1'}]]) - cpu_topo.core_map = \ - {'thread_per_core': '1', '2':['1'], 'cores_per_socket': '2'} - self.assertEqual(-1, cpu_topo.validate_cpu_cfg()) - - def test_validate_cpu_cfg_2t(self): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(1, "cpu:1\ntest:2\n \n", "")) - ssh_mock.put = \ - mock.Mock(return_value=(1, "", "")) - cpu_topo = CpuSysCores(ssh_mock) - subprocess.check_output = mock.Mock(return_value=0) - cpu_topo._get_core_details = \ - mock.Mock(side_effect=[[{'Core(s) per socket': '2', 'Thread(s) per core': '1'}], - [{'physical id': '2', 'processor': '1'}]]) - cpu_topo.core_map = \ - {'thread_per_core': 1, '2':['1'], 'cores_per_socket': '2'} - vnf_cfg = {'lb_config': 'SW', 'lb_count': 1, 'worker_config': - '1C/2T', 'worker_threads': 1} - self.assertEqual(-1, cpu_topo.validate_cpu_cfg(vnf_cfg)) - - def test_validate_cpu_cfg_fail(self): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(1, "cpu:1\ntest:2\n \n", "")) - ssh_mock.put = \ - mock.Mock(return_value=(1, "", "")) - cpu_topo = CpuSysCores(ssh_mock) - subprocess.check_output = mock.Mock(return_value=0) - cpu_topo._get_core_details = \ - mock.Mock(side_effect=[[{'Core(s) per socket': '2', 'Thread(s) per core': '1'}], - [{'physical id': '2', 'processor': '1'}]]) - cpu_topo.core_map = \ - {'thread_per_core': 1, '2':[1], 'cores_per_socket': 2} - vnf_cfg = {'lb_config': 'SW', 'lb_count': 1, 'worker_config': - '1C/1T', 'worker_threads': 1} - self.assertEqual(-1, cpu_topo.validate_cpu_cfg(vnf_cfg)) diff --git a/tests/unit/network_services/helpers/test_dpdkbindnic_helper.py b/tests/unit/network_services/helpers/test_dpdkbindnic_helper.py deleted file mode 100644 index 367072e84..000000000 --- a/tests/unit/network_services/helpers/test_dpdkbindnic_helper.py +++ /dev/null @@ -1,633 +0,0 @@ -# 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. - -import mock -import unittest - -import os - -from yardstick.error import IncorrectConfig, SSHError -from yardstick.error import IncorrectNodeSetup -from yardstick.error import IncorrectSetup -from yardstick.network_services.helpers.dpdkbindnic_helper import DpdkInterface -from yardstick.network_services.helpers.dpdkbindnic_helper import DpdkNode -from yardstick.network_services.helpers.dpdkbindnic_helper import DpdkBindHelper -from yardstick.network_services.helpers.dpdkbindnic_helper import DpdkBindHelperException -from yardstick.network_services.helpers.dpdkbindnic_helper import NETWORK_KERNEL -from yardstick.network_services.helpers.dpdkbindnic_helper import NETWORK_DPDK -from yardstick.network_services.helpers.dpdkbindnic_helper import CRYPTO_KERNEL -from yardstick.network_services.helpers.dpdkbindnic_helper import CRYPTO_DPDK -from yardstick.network_services.helpers.dpdkbindnic_helper import NETWORK_OTHER -from yardstick.network_services.helpers.dpdkbindnic_helper import CRYPTO_OTHER - - -NAME = "tg_0" - - -class TestDpdkInterface(unittest.TestCase): - - SAMPLE_NETDEVS = { - 'enp11s0': { - 'address': '0a:de:ad:be:ef:f5', - 'device': '0x1533', - 'driver': 'igb', - 'ifindex': '2', - 'interface_name': 'enp11s0', - 'operstate': 'down', - 'pci_bus_id': '0000:0b:00.0', - 'subsystem_device': '0x1533', - 'subsystem_vendor': '0x15d9', - 'vendor': '0x8086' - }, - 'lan': { - 'address': '0a:de:ad:be:ef:f4', - 'device': '0x153a', - 'driver': 'e1000e', - 'ifindex': '3', - 'interface_name': 'lan', - 'operstate': 'up', - 'pci_bus_id': '0000:00:19.0', - 'subsystem_device': '0x153a', - 'subsystem_vendor': '0x15d9', - 'vendor': '0x8086' - } - } - - SAMPLE_VM_NETDEVS = { - 'eth1': { - 'address': 'fa:de:ad:be:ef:5b', - 'device': '0x0001', - 'driver': 'virtio_net', - 'ifindex': '3', - 'interface_name': 'eth1', - 'operstate': 'down', - 'pci_bus_id': '0000:00:04.0', - 'vendor': '0x1af4' - } - } - - def test_parse_netdev_info(self): - output = """\ -/sys/devices/pci0000:00/0000:00:1c.3/0000:0b:00.0/net/enp11s0/ifindex:2 -/sys/devices/pci0000:00/0000:00:1c.3/0000:0b:00.0/net/enp11s0/address:0a:de:ad:be:ef:f5 -/sys/devices/pci0000:00/0000:00:1c.3/0000:0b:00.0/net/enp11s0/operstate:down -/sys/devices/pci0000:00/0000:00:1c.3/0000:0b:00.0/net/enp11s0/device/vendor:0x8086 -/sys/devices/pci0000:00/0000:00:1c.3/0000:0b:00.0/net/enp11s0/device/device:0x1533 -/sys/devices/pci0000:00/0000:00:1c.3/0000:0b:00.0/net/enp11s0/device/subsystem_vendor:0x15d9 -/sys/devices/pci0000:00/0000:00:1c.3/0000:0b:00.0/net/enp11s0/device/subsystem_device:0x1533 -/sys/devices/pci0000:00/0000:00:1c.3/0000:0b:00.0/net/enp11s0/driver:igb -/sys/devices/pci0000:00/0000:00:1c.3/0000:0b:00.0/net/enp11s0/pci_bus_id:0000:0b:00.0 -/sys/devices/pci0000:00/0000:00:19.0/net/lan/ifindex:3 -/sys/devices/pci0000:00/0000:00:19.0/net/lan/address:0a:de:ad:be:ef:f4 -/sys/devices/pci0000:00/0000:00:19.0/net/lan/operstate:up -/sys/devices/pci0000:00/0000:00:19.0/net/lan/device/vendor:0x8086 -/sys/devices/pci0000:00/0000:00:19.0/net/lan/device/device:0x153a -/sys/devices/pci0000:00/0000:00:19.0/net/lan/device/subsystem_vendor:0x15d9 -/sys/devices/pci0000:00/0000:00:19.0/net/lan/device/subsystem_device:0x153a -/sys/devices/pci0000:00/0000:00:19.0/net/lan/driver:e1000e -/sys/devices/pci0000:00/0000:00:19.0/net/lan/pci_bus_id:0000:00:19.0 -""" - res = DpdkBindHelper.parse_netdev_info(output) - self.assertDictEqual(res, self.SAMPLE_NETDEVS) - - def test_parse_netdev_info_virtio(self): - output = """\ -/sys/devices/pci0000:00/0000:00:04.0/virtio1/net/eth1/ifindex:3 -/sys/devices/pci0000:00/0000:00:04.0/virtio1/net/eth1/address:fa:de:ad:be:ef:5b -/sys/devices/pci0000:00/0000:00:04.0/virtio1/net/eth1/operstate:down -/sys/devices/pci0000:00/0000:00:04.0/virtio1/net/eth1/device/vendor:0x1af4 -/sys/devices/pci0000:00/0000:00:04.0/virtio1/net/eth1/device/device:0x0001 -/sys/devices/pci0000:00/0000:00:04.0/virtio1/net/eth1/driver:virtio_net -""" - res = DpdkBindHelper.parse_netdev_info(output) - self.assertDictEqual(res, self.SAMPLE_VM_NETDEVS) - - def test_probe_missing_values(self): - mock_dpdk_node = mock.Mock() - mock_dpdk_node.netdevs = self.SAMPLE_NETDEVS.copy() - - interface = {'local_mac': '0a:de:ad:be:ef:f5'} - dpdk_intf = DpdkInterface(mock_dpdk_node, interface) - - dpdk_intf.probe_missing_values() - self.assertEqual(interface['vpci'], '0000:0b:00.0') - - interface['local_mac'] = '0a:de:ad:be:ef:f4' - dpdk_intf.probe_missing_values() - self.assertEqual(interface['vpci'], '0000:00:19.0') - - def test_probe_missing_values_no_update(self): - mock_dpdk_node = mock.Mock() - mock_dpdk_node.netdevs = self.SAMPLE_NETDEVS.copy() - del mock_dpdk_node.netdevs['enp11s0']['driver'] - del mock_dpdk_node.netdevs['lan']['driver'] - - interface = {'local_mac': '0a:de:ad:be:ef:f5'} - dpdk_intf = DpdkInterface(mock_dpdk_node, interface) - - dpdk_intf.probe_missing_values() - self.assertNotIn('vpci', interface) - self.assertNotIn('driver', interface) - - def test_probe_missing_values_negative(self): - mock_dpdk_node = mock.Mock() - mock_dpdk_node.netdevs.values.side_effect = IncorrectNodeSetup - - interface = {'local_mac': '0a:de:ad:be:ef:f5'} - dpdk_intf = DpdkInterface(mock_dpdk_node, interface) - - with self.assertRaises(IncorrectConfig): - dpdk_intf.probe_missing_values() - - -class TestDpdkNode(unittest.TestCase): - - INTERFACES = [ - {'name': 'name1', - 'virtual-interface': { - 'local_mac': 404, - 'vpci': 'pci10', - }}, - {'name': 'name2', - 'virtual-interface': { - 'local_mac': 404, - 'vpci': 'pci2', - }}, - {'name': 'name3', - 'virtual-interface': { - 'local_mac': 404, - 'vpci': 'some-pci1', - }}, - ] - - def test_probe_dpdk_drivers(self): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 0, '', '' - - interfaces = [ - {'name': 'name1', - 'virtual-interface': { - 'local_mac': 404, - 'vpci': 'pci10', - }}, - {'name': 'name2', - 'virtual-interface': { - 'local_mac': 404, - 'vpci': 'pci2', - }}, - {'name': 'name3', - 'virtual-interface': { - 'local_mac': 404, - 'vpci': 'some-pci1', - }}, - ] - - dpdk_node = DpdkNode(NAME, interfaces, mock_ssh_helper) - dpdk_helper = dpdk_node.dpdk_helper - - dpdk_helper.probe_real_kernel_drivers = mock.Mock() - dpdk_helper.real_kernel_interface_driver_map = { - 'pci1': 'driver1', - 'pci2': 'driver2', - 'pci3': 'driver3', - 'pci4': 'driver1', - 'pci6': 'driver3', - } - - dpdk_node._probe_dpdk_drivers() - self.assertNotIn('driver', interfaces[0]['virtual-interface']) - self.assertEqual(interfaces[1]['virtual-interface']['driver'], 'driver2') - self.assertEqual(interfaces[2]['virtual-interface']['driver'], 'driver1') - - def test_check(self): - def update(): - if not mock_force_rebind.called: - raise IncorrectConfig - - interfaces[0]['virtual-interface'].update({ - 'vpci': '0000:01:02.1', - 'local_ip': '10.20.30.40', - 'netmask': '255.255.0.0', - 'driver': 'ixgbe', - }) - - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 0, '', '' - - interfaces = [ - {'name': 'name1', - 'virtual-interface': { - 'local_mac': 404, - }}, - ] - - dpdk_node = DpdkNode(NAME, interfaces, mock_ssh_helper) - dpdk_node._probe_missing_values = mock_probe_missing = mock.Mock(side_effect=update) - dpdk_node._force_rebind = mock_force_rebind = mock.Mock() - - self.assertIsNone(dpdk_node.check()) - self.assertEqual(mock_probe_missing.call_count, 2) - - @mock.patch('yardstick.network_services.helpers.dpdkbindnic_helper.DpdkInterface') - def test_check_negative(self, mock_intf_type): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 0, '', '' - - mock_intf_type().check.side_effect = SSHError - - dpdk_node = DpdkNode(NAME, self.INTERFACES, mock_ssh_helper) - - with self.assertRaises(IncorrectSetup): - dpdk_node.check() - - def test_probe_netdevs(self): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 0, '', '' - - expected = {'key1': 500, 'key2': 'hello world'} - update = {'key1': 1000, 'key3': []} - - dpdk_node = DpdkNode(NAME, self.INTERFACES, mock_ssh_helper) - dpdk_helper = dpdk_node.dpdk_helper - dpdk_helper.find_net_devices = mock.Mock(side_effect=[expected, update]) - - self.assertDictEqual(dpdk_node.netdevs, {}) - dpdk_node._probe_netdevs() - self.assertDictEqual(dpdk_node.netdevs, expected) - - expected = {'key1': 1000, 'key2': 'hello world', 'key3': []} - dpdk_node._probe_netdevs() - self.assertDictEqual(dpdk_node.netdevs, expected) - - def test_probe_netdevs_setup_negative(self): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 0, '', '' - - dpdk_node = DpdkNode(NAME, self.INTERFACES, mock_ssh_helper) - dpdk_helper = dpdk_node.dpdk_helper - dpdk_helper.find_net_devices = mock.Mock(side_effect=DpdkBindHelperException) - - with self.assertRaises(DpdkBindHelperException): - dpdk_node._probe_netdevs() - - def test_force_rebind(self): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 0, '', '' - - dpdk_node = DpdkNode(NAME, self.INTERFACES, mock_ssh_helper) - dpdk_helper = dpdk_node.dpdk_helper - dpdk_helper.force_dpdk_rebind = mock_helper_func = mock.Mock() - - dpdk_node._force_rebind() - self.assertEqual(mock_helper_func.call_count, 1) - - -class TestDpdkBindHelper(unittest.TestCase): - bin_path = "/opt/nsb_bin" - EXAMPLE_OUTPUT = """ - -Network devices using DPDK-compatible driver -============================================ -0000:00:04.0 'Virtio network device' drv=igb_uio unused= -0000:00:05.0 'Virtio network device' drv=igb_uio unused= - -Network devices using kernel driver -=================================== -0000:00:03.0 'Virtio network device' if=ens3 drv=virtio-pci unused=igb_uio *Active* - -Other network devices -===================== -<none> - -Crypto devices using DPDK-compatible driver -=========================================== -<none> - -Crypto devices using kernel driver -================================== -<none> - -Other crypto devices -==================== -<none> -""" - - PARSED_EXAMPLE = { - NETWORK_DPDK: [ - {'active': False, - 'dev_type': 'Virtio network device', - 'driver': 'igb_uio', - 'iface': None, - 'unused': '', - 'vpci': '0000:00:04.0', - }, - {'active': False, - 'dev_type': 'Virtio network device', - 'driver': 'igb_uio', - 'iface': None, - 'unused': '', - 'vpci': '0000:00:05.0', - } - ], - NETWORK_KERNEL: [ - {'active': True, - 'dev_type': 'Virtio network device', - 'driver': 'virtio-pci', - 'iface': 'ens3', - 'unused': 'igb_uio', - 'vpci': '0000:00:03.0', - } - ], - CRYPTO_KERNEL: [], - CRYPTO_DPDK: [], - NETWORK_OTHER: [], - CRYPTO_OTHER: [], - } - - CLEAN_STATUS = { - NETWORK_KERNEL: [], - NETWORK_DPDK: [], - CRYPTO_KERNEL: [], - CRYPTO_DPDK: [], - NETWORK_OTHER: [], - CRYPTO_OTHER: [], - } - - ONE_INPUT_LINE = ("0000:00:03.0 'Virtio network device' if=ens3 " - "drv=virtio-pci unused=igb_uio *Active*") - - ONE_INPUT_LINE_PARSED = [{ - 'vpci': '0000:00:03.0', - 'dev_type': 'Virtio network device', - 'iface': 'ens3', - 'driver': 'virtio-pci', - 'unused': 'igb_uio', - 'active': True, - }] - - def test___init__(self): - conn = mock.Mock() - conn.provision_tool = mock.Mock(return_value='path_to_tool') - conn.join_bin_path.return_value = os.path.join(self.bin_path, DpdkBindHelper.DPDK_DEVBIND) - - dpdk_bind_helper = DpdkBindHelper(conn) - - self.assertEqual(conn, dpdk_bind_helper.ssh_helper) - self.assertEqual(self.CLEAN_STATUS, dpdk_bind_helper.dpdk_status) - self.assertIsNone(dpdk_bind_helper.status_nic_row_re) - self.assertEqual(dpdk_bind_helper.dpdk_devbind, - os.path.join(self.bin_path, dpdk_bind_helper.DPDK_DEVBIND)) - self.assertIsNone(dpdk_bind_helper._status_cmd_attr) - - def test__dpdk_execute(self): - conn = mock.Mock() - conn.execute = mock.Mock(return_value=(0, 'output', 'error')) - conn.provision_tool = mock.Mock(return_value='tool_path') - dpdk_bind_helper = DpdkBindHelper(conn) - self.assertEqual((0, 'output', 'error'), dpdk_bind_helper._dpdk_execute('command')) - - def test__dpdk_execute_failure(self): - conn = mock.Mock() - conn.execute = mock.Mock(return_value=(1, 'output', 'error')) - conn.provision_tool = mock.Mock(return_value='tool_path') - dpdk_bind_helper = DpdkBindHelper(conn) - with self.assertRaises(DpdkBindHelperException): - dpdk_bind_helper._dpdk_execute('command') - - def test__addline(self): - conn = mock.Mock() - - dpdk_bind_helper = DpdkBindHelper(conn) - - dpdk_bind_helper._add_line(NETWORK_KERNEL, self.ONE_INPUT_LINE) - - self.assertIsNotNone(dpdk_bind_helper.dpdk_status) - self.assertEqual(self.ONE_INPUT_LINE_PARSED, dpdk_bind_helper.dpdk_status[NETWORK_KERNEL]) - - def test__switch_active_dict_by_header(self): - line = "Crypto devices using DPDK-compatible driver" - olddict = 'olddict' - self.assertEqual(CRYPTO_DPDK, DpdkBindHelper._switch_active_dict(line, olddict)) - - def test__switch_active_dict_by_header_empty(self): - line = "<none>" - olddict = 'olddict' - self.assertEqual(olddict, DpdkBindHelper._switch_active_dict(line, olddict)) - - def test_parse_dpdk_status_output(self): - conn = mock.Mock() - - dpdk_bind_helper = DpdkBindHelper(conn) - - dpdk_bind_helper._parse_dpdk_status_output(self.EXAMPLE_OUTPUT) - - self.maxDiff = None - self.assertEqual(self.PARSED_EXAMPLE, dpdk_bind_helper.dpdk_status) - - def test_kernel_bound_pci_addresses(self): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 0, '', '' - - expected = ['a', 'b', 3] - - dpdk_helper = DpdkBindHelper(mock_ssh_helper) - dpdk_helper.dpdk_status = { - NETWORK_DPDK: [{'vpci': 4}, {'vpci': 5}, {'vpci': 'g'}], - NETWORK_KERNEL: [{'vpci': 'a'}, {'vpci': 'b'}, {'vpci': 3}], - CRYPTO_DPDK: [], - } - - result = dpdk_helper.kernel_bound_pci_addresses - self.assertEqual(result, expected) - - def test_find_net_devices_negative(self): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 1, 'error', 'debug' - - dpdk_helper = DpdkBindHelper(mock_ssh_helper) - - self.assertDictEqual(dpdk_helper.find_net_devices(), {}) - - def test_read_status(self): - conn = mock.Mock() - conn.execute = mock.Mock(return_value=(0, self.EXAMPLE_OUTPUT, '')) - conn.provision_tool = mock.Mock(return_value='path_to_tool') - - dpdk_bind_helper = DpdkBindHelper(conn) - - self.assertEqual(self.PARSED_EXAMPLE, dpdk_bind_helper.read_status()) - - def test__get_bound_pci_addresses(self): - conn = mock.Mock() - - dpdk_bind_helper = DpdkBindHelper(conn) - - dpdk_bind_helper._parse_dpdk_status_output(self.EXAMPLE_OUTPUT) - - self.assertEqual(['0000:00:04.0', '0000:00:05.0'], - dpdk_bind_helper._get_bound_pci_addresses(NETWORK_DPDK)) - self.assertEqual(['0000:00:03.0'], - dpdk_bind_helper._get_bound_pci_addresses(NETWORK_KERNEL)) - - def test_interface_driver_map(self): - conn = mock.Mock() - - dpdk_bind_helper = DpdkBindHelper(conn) - - dpdk_bind_helper._parse_dpdk_status_output(self.EXAMPLE_OUTPUT) - - self.assertEqual({'0000:00:04.0': 'igb_uio', - '0000:00:03.0': 'virtio-pci', - '0000:00:05.0': 'igb_uio', - }, - dpdk_bind_helper.interface_driver_map) - - def test_bind(self): - conn = mock.Mock() - conn.execute = mock.Mock(return_value=(0, '', '')) - conn.join_bin_path.return_value = os.path.join(self.bin_path, DpdkBindHelper.DPDK_DEVBIND) - - dpdk_bind_helper = DpdkBindHelper(conn) - dpdk_bind_helper.read_status = mock.Mock() - - dpdk_bind_helper.bind(['0000:00:03.0', '0000:00:04.0'], 'my_driver') - - conn.execute.assert_called_with('sudo /opt/nsb_bin/dpdk-devbind.py --force ' - '-b my_driver 0000:00:03.0 0000:00:04.0') - dpdk_bind_helper.read_status.assert_called_once() - - def test_bind_single_pci(self): - conn = mock.Mock() - conn.execute = mock.Mock(return_value=(0, '', '')) - conn.join_bin_path.return_value = os.path.join(self.bin_path, DpdkBindHelper.DPDK_DEVBIND) - - dpdk_bind_helper = DpdkBindHelper(conn) - dpdk_bind_helper.read_status = mock.Mock() - - dpdk_bind_helper.bind('0000:00:03.0', 'my_driver') - - conn.execute.assert_called_with('sudo /opt/nsb_bin/dpdk-devbind.py --force ' - '-b my_driver 0000:00:03.0') - dpdk_bind_helper.read_status.assert_called_once() - - def test_rebind_drivers(self): - conn = mock.Mock() - - dpdk_bind_helper = DpdkBindHelper(conn) - - dpdk_bind_helper.bind = mock.Mock() - dpdk_bind_helper.used_drivers = { - 'd1': ['0000:05:00.0'], - 'd3': ['0000:05:01.0', '0000:05:02.0'], - } - - dpdk_bind_helper.rebind_drivers() - - dpdk_bind_helper.bind.assert_any_call(['0000:05:00.0'], 'd1', True) - dpdk_bind_helper.bind.assert_any_call(['0000:05:01.0', '0000:05:02.0'], 'd3', True) - - def test_save_used_drivers(self): - conn = mock.Mock() - dpdk_bind_helper = DpdkBindHelper(conn) - dpdk_bind_helper.dpdk_status = self.PARSED_EXAMPLE - - dpdk_bind_helper.save_used_drivers() - - expected = { - 'igb_uio': ['0000:00:04.0', '0000:00:05.0'], - 'virtio-pci': ['0000:00:03.0'], - } - - self.assertDictEqual(expected, dpdk_bind_helper.used_drivers) - - def test_force_dpdk_rebind(self): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 0, '', '' - - dpdk_helper = DpdkBindHelper(mock_ssh_helper, 'driver2') - dpdk_helper.dpdk_status = { - NETWORK_DPDK: [ - { - 'vpci': 'pci1', - }, - { - 'vpci': 'pci3', - }, - { - 'vpci': 'pci6', - }, - { - 'vpci': 'pci3', - }, - ] - } - dpdk_helper.real_kernel_interface_driver_map = { - 'pci1': 'real_driver1', - 'pci2': 'real_driver2', - 'pci3': 'real_driver1', - 'pci4': 'real_driver4', - 'pci6': 'real_driver6', - } - dpdk_helper.load_dpdk_driver = mock.Mock() - dpdk_helper.read_status = mock.Mock() - dpdk_helper.save_real_kernel_interface_driver_map = mock.Mock() - dpdk_helper.save_used_drivers = mock.Mock() - dpdk_helper.bind = mock_bind = mock.Mock() - - dpdk_helper.force_dpdk_rebind() - self.assertEqual(mock_bind.call_count, 2) - - def test_save_real_kernel_drivers(self): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.return_value = 0, '', '' - - dpdk_helper = DpdkBindHelper(mock_ssh_helper) - dpdk_helper.real_kernel_drivers = { - 'abc': '123', - } - dpdk_helper.real_kernel_interface_driver_map = { - 'abc': 'AAA', - 'def': 'DDD', - 'abs': 'AAA', - 'ghi': 'GGG', - } - - # save_used_drivers must be called before save_real_kernel_drivers can be - with self.assertRaises(AttributeError): - dpdk_helper.save_real_kernel_drivers() - - dpdk_helper.save_used_drivers() - - expected_used_drivers = { - 'AAA': ['abc', 'abs'], - 'DDD': ['def'], - 'GGG': ['ghi'], - } - dpdk_helper.save_real_kernel_drivers() - self.assertDictEqual(dpdk_helper.used_drivers, expected_used_drivers) - self.assertDictEqual(dpdk_helper.real_kernel_drivers, {}) - - def test_get_real_kernel_driver(self): - mock_ssh_helper = mock.Mock() - mock_ssh_helper.execute.side_effect = [ - (0, 'non-matching text', ''), - (0, 'pre Kernel modules: real_driver1', ''), - (0, 'before Ethernet middle Virtio network device after', ''), - ] - - dpdk_helper = DpdkBindHelper(mock_ssh_helper) - - self.assertIsNone(dpdk_helper.get_real_kernel_driver('abc')) - self.assertEqual(dpdk_helper.get_real_kernel_driver('abc'), 'real_driver1') - self.assertEqual(dpdk_helper.get_real_kernel_driver('abc'), DpdkBindHelper.VIRTIO_DRIVER) diff --git a/tests/unit/network_services/helpers/test_iniparser.py b/tests/unit/network_services/helpers/test_iniparser.py deleted file mode 100644 index bd27b497e..000000000 --- a/tests/unit/network_services/helpers/test_iniparser.py +++ /dev/null @@ -1,225 +0,0 @@ -# Copyright (c) 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 contextlib import contextmanager -import mock - -from tests.unit import STL_MOCKS - - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.helpers.iniparser import ParseError - from yardstick.network_services.helpers.iniparser import LineParser - from yardstick.network_services.helpers.iniparser import BaseParser - from yardstick.network_services.helpers.iniparser import ConfigParser - -PARSE_TEXT_1 = """\ - -[section1] -key1=value1 -list1: value2 - value3 - value4 -key3='single quote value' ; comment here -key4= - -[section2] ; comment with #2 other symbol -# here is a comment line -list2: value5 -key with no value # mixed comment ; symbols -; another comment line -key5= - -[section1] ; reopen a section! -key2="double quote value" -""" - -PARSE_TEXT_2 = """\ -[section1] -list1 = item1 - item2 - ended by eof""" - -PARSE_TEXT_BAD_1 = """\ -key1=value1 -""" - -PARSE_TEXT_BAD_2 = """\ -[section1 -""" - -PARSE_TEXT_BAD_3 = """\ -[] -""" - -PARSE_TEXT_BAD_4 = """\ -[section1] - bad continuation -""" - -PARSE_TEXT_BAD_5 = """\ -[section1] -=value with no key -""" - - -class TestParseError(unittest.TestCase): - - def test___str__(self): - error = ParseError('a', 2, 'c') - self.assertEqual(str(error), "at line 2, a: 'c'") - - -class TestLineParser(unittest.TestCase): - - def test___repr__(self): - line_parser = LineParser('', 101) - self.assertIsNotNone(repr(line_parser)) - - def test_error_invalid_assignment(self): - line_parser = LineParser('', 101) - self.assertIsNotNone(line_parser.error_invalid_assignment()) - - -class TestBaseParser(unittest.TestCase): - - @staticmethod - def make_open(text_blob): - @contextmanager - def internal_open(*args, **kwargs): - yield text_blob.split('\n') - - return internal_open - - def test_parse(self): - parser = BaseParser() - parser.parse() - - def test_parse_empty_string(self): - parser = BaseParser() - self.assertIsNone(parser.parse('')) - - def test_not_implemented_methods(self): - parser = BaseParser() - - with self.assertRaises(NotImplementedError): - parser.assignment('key', 'value', LineParser('', 100)) - - with self.assertRaises(NotImplementedError): - parser.new_section('section') - - with self.assertRaises(NotImplementedError): - parser.comment('comment') - - -class TestConfigParser(unittest.TestCase): - - @staticmethod - def make_open(text_blob): - @contextmanager - def internal_open(*args, **kwargs): - yield text_blob.split('\n') - - return internal_open - - @mock.patch('yardstick.network_services.helpers.iniparser.open') - def test_parse(self, mock_open): - mock_open.side_effect = self.make_open(PARSE_TEXT_1) - - existing_data = [['section0', [['key0', 'value0']]]] - config_parser = ConfigParser('my_file', existing_data) - config_parser.parse() - - expected = [ - [ - 'section0', - [ - ['key0', 'value0'], - ], - ], - [ - 'section1', - [ - ['key1', 'value1'], - ['list1', 'value2\nvalue3\nvalue4'], - ['key3', 'single quote value'], - ['key4', ''], - ['key2', 'double quote value'], - ], - ], - [ - 'section2', - [ - ['list2', 'value5'], - ['key with no value', '@'], - ['key5', ''], - ], - ], - ] - - self.assertEqual(config_parser.sections, expected) - self.assertIsNotNone(config_parser.find_section('section1')) - self.assertIsNone(config_parser.find_section('section3')) - self.assertEqual(config_parser.find_section_index('section1'), 1) - self.assertEqual(config_parser.find_section_index('section3'), -1) - - @mock.patch('yardstick.network_services.helpers.iniparser.open') - def test_parse_2(self, mock_open): - mock_open.side_effect = self.make_open(PARSE_TEXT_2) - - config_parser = ConfigParser('my_file') - config_parser.parse() - - expected = [ - [ - 'section1', - [ - ['list1', 'item1\nitem2\nended by eof'], - ], - ], - ] - - self.assertEqual(config_parser.sections, expected) - - @mock.patch('yardstick.network_services.helpers.iniparser.open') - def test_parse_negative(self, mock_open): - bad_text_dict = { - 'no section': PARSE_TEXT_BAD_1, - 'incomplete section': PARSE_TEXT_BAD_2, - 'empty section name': PARSE_TEXT_BAD_3, - 'bad_continuation': PARSE_TEXT_BAD_4, - 'value with no key': PARSE_TEXT_BAD_5, - } - - for bad_reason, bad_text in bad_text_dict.items(): - mock_open.side_effect = self.make_open(bad_text) - - config_parser = ConfigParser('my_file', []) - - try: - # TODO: replace with assertRaises, when the UT framework supports - # advanced messages when exceptions fail to occur - config_parser.parse() - except ParseError: - pass - else: - self.fail('\n'.join([bad_reason, bad_text, str(config_parser.sections)])) diff --git a/tests/unit/network_services/helpers/test_samplevnf_helper.py b/tests/unit/network_services/helpers/test_samplevnf_helper.py deleted file mode 100644 index dc74b1859..000000000 --- a/tests/unit/network_services/helpers/test_samplevnf_helper.py +++ /dev/null @@ -1,1105 +0,0 @@ -# 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. -# - -import mock -import os -import six -import unittest - -from yardstick.network_services.helpers import samplevnf_helper -from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper - - -class TestPortPairs(unittest.TestCase): - def test_port_pairs_list(self): - vnfd = TestMultiPortConfig.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - interfaces = vnfd['vdu'][0]['external-interface'] - port_pairs = samplevnf_helper.PortPairs(interfaces) - self.assertEqual(port_pairs.port_pair_list, [("xe0", "xe1")]) - - def test_valid_networks(self): - vnfd = TestMultiPortConfig.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - interfaces = vnfd['vdu'][0]['external-interface'] - port_pairs = samplevnf_helper.PortPairs(interfaces) - self.assertEqual(port_pairs.valid_networks, [ - ("uplink_0", "downlink_0")]) - - def test_all_ports(self): - vnfd = TestMultiPortConfig.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - interfaces = vnfd['vdu'][0]['external-interface'] - port_pairs = samplevnf_helper.PortPairs(interfaces) - self.assertEqual(set(port_pairs.all_ports), {"xe0", "xe1"}) - - def test_uplink_ports(self): - vnfd = TestMultiPortConfig.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - interfaces = vnfd['vdu'][0]['external-interface'] - port_pairs = samplevnf_helper.PortPairs(interfaces) - self.assertEqual(port_pairs.uplink_ports, ["xe0"]) - - def test_downlink_ports(self): - vnfd = TestMultiPortConfig.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - interfaces = vnfd['vdu'][0]['external-interface'] - port_pairs = samplevnf_helper.PortPairs(interfaces) - self.assertEqual(port_pairs.downlink_ports, ["xe1"]) - - -class TestMultiPortConfig(unittest.TestCase): - - VNFD_0 = {'short-name': 'VpeVnf', - 'vdu': - [{'routing_table': - [{'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0'}, - {'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1'}], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': - [{'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'id': 'vpevnf-baremetal', - 'external-interface': - [ - {'virtual-interface': - { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'ifname': 'xe0', - 'local_iface_name': 'eth0', - 'local_mac': '00:00:00:00:00:02', - 'vld_id': 'uplink_0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'ifname': 'xe1', - 'local_iface_name': 'eth1', - 'local_mac': '00:00:00:00:00:01', - 'vld_id': 'downlink_0', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'} - ]}], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': - {'vdu-id': 'vpevnf-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'AclApproxVnf', 'name': 'VPEVnfSsh'} - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ] - } - } - - def setUp(self): - self._mock_open = mock.patch.object(six.moves.builtins, 'open') - self.mock_open = self._mock_open.start() - self._mock_config_parser = mock.patch.object( - samplevnf_helper, 'ConfigParser') - self.mock_config_parser = self._mock_config_parser.start() - - self.addCleanup(self._cleanup) - - def _cleanup(self): - self._mock_open.stop() - self._mock_config_parser.stop() - - def test_validate_ip_and_prefixlen(self): - ip_addr, prefix_len = ( - samplevnf_helper.MultiPortConfig.validate_ip_and_prefixlen( - '10.20.30.40', '16')) - self.assertEqual(ip_addr, '10.20.30.40') - self.assertEqual(prefix_len, 16) - - ip_addr, prefix_len = ( - samplevnf_helper.MultiPortConfig.validate_ip_and_prefixlen( - '::1', '40')) - self.assertEqual(ip_addr, '0000:0000:0000:0000:0000:0000:0000:0001') - self.assertEqual(prefix_len, 40) - - def test_validate_ip_and_prefixlen_negative(self): - with self.assertRaises(AttributeError): - samplevnf_helper.MultiPortConfig.validate_ip_and_prefixlen('', '') - - with self.assertRaises(AttributeError): - samplevnf_helper.MultiPortConfig.validate_ip_and_prefixlen( - '10.20.30.400', '16') - - with self.assertRaises(AttributeError): - samplevnf_helper.MultiPortConfig.validate_ip_and_prefixlen( - '10.20.30.40', '33') - - with self.assertRaises(AttributeError): - samplevnf_helper.MultiPortConfig.validate_ip_and_prefixlen( - '::1', '129') - - @mock.patch.object(os.path, 'isfile', return_value=False) - def test___init__(self, *args): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - self.assertEqual(0, opnfv_vnf.swq) - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - self.assertEqual(0, opnfv_vnf.swq) - - def test_update_timer(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - self.assertIsNone(opnfv_vnf.update_timer()) - - def test_generate_script(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = VnfdHelper(self.VNFD_0) - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'arp_route_tbl': '', 'arp_route_tbl6': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - self.assertIsNotNone(opnfv_vnf.generate_script(self.VNFD)) - opnfv_vnf.lb_config = 'HW' - self.assertIsNotNone(opnfv_vnf.generate_script(self.VNFD)) - - def test_generate_script_data(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.vnf_type = 'ACL' - opnfv_vnf.generate_link_config = mock.Mock() - opnfv_vnf.generate_arp_config = mock.Mock() - opnfv_vnf.generate_arp_config6 = mock.Mock() - opnfv_vnf.generate_action_config = mock.Mock() - opnfv_vnf.generate_rule_config = mock.Mock() - self.assertIsNotNone(opnfv_vnf.generate_script_data()) - - def test_generate_rule_config(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.get_port_pairs = mock.Mock() - opnfv_vnf.vnf_type = 'ACL' - opnfv_vnf.get_ports_gateway = mock.Mock(return_value=u'1.1.1.1') - opnfv_vnf.get_netmask_gateway = mock.Mock( - return_value=u'255.255.255.0') - opnfv_vnf.get_ports_gateway6 = mock.Mock(return_value=u'1.1.1.1') - opnfv_vnf.get_netmask_gateway6 = mock.Mock( - return_value=u'255.255.255.0') - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - opnfv_vnf.rules = '' - self.assertIsNotNone(opnfv_vnf.generate_rule_config()) - opnfv_vnf.rules = 'new' - self.assertIsNotNone(opnfv_vnf.generate_rule_config()) - - def test_generate_action_config(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.get_port_pairs = mock.Mock() - opnfv_vnf.vnf_type = 'VFW' - opnfv_vnf.get_ports_gateway = mock.Mock(return_value=u'1.1.1.1') - opnfv_vnf.get_netmask_gateway = mock.Mock( - return_value=u'255.255.255.0') - opnfv_vnf.get_ports_gateway6 = mock.Mock(return_value=u'1.1.1.1') - opnfv_vnf.get_netmask_gateway6 = mock.Mock( - return_value=u'255.255.255.0') - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - self.assertIsNotNone(opnfv_vnf.generate_action_config()) - - def test_generate_arp_config6(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.get_port_pairs = mock.Mock() - opnfv_vnf.vnf_type = 'VFW' - opnfv_vnf.get_ports_gateway = mock.Mock(return_value=u'1.1.1.1') - opnfv_vnf.get_netmask_gateway = mock.Mock( - return_value=u'255.255.255.0') - opnfv_vnf.get_ports_gateway6 = mock.Mock(return_value=u'1.1.1.1') - opnfv_vnf.get_netmask_gateway6 = mock.Mock( - return_value=u'255.255.255.0') - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.interfaces = mock.MagicMock() - opnfv_vnf.get_ports_gateway6 = mock.Mock() - self.assertIsNotNone(opnfv_vnf.generate_arp_config6()) - - def test_generate_arp_config(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.get_port_pairs = mock.Mock() - opnfv_vnf.vnf_type = 'VFW' - opnfv_vnf.get_ports_gateway = mock.Mock(return_value=u'1.1.1.1') - opnfv_vnf.get_netmask_gateway = mock.Mock( - return_value=u'255.255.255.0') - opnfv_vnf.get_ports_gateway6 = mock.Mock(return_value=u'1.1.1.1') - opnfv_vnf.get_netmask_gateway6 = mock.Mock( - return_value=u'255.255.255.0') - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.interfaces = mock.MagicMock() - opnfv_vnf.get_ports_gateway6 = mock.Mock() - self.assertIsNotNone(opnfv_vnf.generate_arp_config()) - - def test_get_ports_gateway(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.get_port_pairs = mock.Mock() - opnfv_vnf.vnf_type = 'VFW' - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.interfaces = mock.MagicMock() - opnfv_vnf.get_ports_gateway6 = mock.Mock() - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - self.assertIsNotNone(opnfv_vnf.get_ports_gateway('xe0')) - - def test_get_ports_gateway6(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.get_port_pairs = mock.Mock() - opnfv_vnf.vnf_type = 'VFW' - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.interfaces = mock.MagicMock() - opnfv_vnf.get_ports_gateway6 = mock.Mock() - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - self.assertIsNotNone(opnfv_vnf.get_ports_gateway6('xe0')) - - def test_get_netmask_gateway(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.get_port_pairs = mock.Mock() - opnfv_vnf.vnf_type = 'VFW' - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.interfaces = mock.MagicMock() - opnfv_vnf.get_ports_gateway6 = mock.Mock() - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - self.assertIsNotNone(opnfv_vnf.get_netmask_gateway('xe0')) - - def test_get_netmask_gateway6(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.get_port_pairs = mock.Mock() - opnfv_vnf.vnf_type = 'VFW' - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.interfaces = mock.MagicMock() - opnfv_vnf.get_ports_gateway6 = mock.Mock() - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - self.assertIsNotNone(opnfv_vnf.get_netmask_gateway6('xe0')) - - def test_generate_link_config(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.get_port_pairs = mock.Mock() - opnfv_vnf.vnf_type = 'VFW' - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.get_ports_gateway6 = mock.Mock() - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - opnfv_vnf.all_ports = ['32', '1', '987'] - opnfv_vnf.validate_ip_and_prefixlen = mock.Mock( - return_value=('10.20.30.40', 16)) - - result = opnfv_vnf.generate_link_config() - self.assertEqual(len(result.splitlines()), 9) - - def test_generate_config(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.get_config_tpl_data = mock.MagicMock() - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.update_write_parser = mock.MagicMock() - opnfv_vnf.generate_script_data = \ - mock.Mock(return_value={'link_config': 0, 'arp_config': '', - 'arp_config6': '', 'actions': '', - 'rules': ''}) - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.get_ports_gateway6 = mock.Mock() - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - opnfv_vnf.generate_lb_to_port_pair_mapping = mock.Mock() - opnfv_vnf.generate_config_data = mock.Mock() - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.is_openstack = True - self.assertIsNone(opnfv_vnf.generate_config()) - opnfv_vnf.is_openstack = False - self.assertIsNone(opnfv_vnf.generate_config()) - - def test_get_config_tpl_data(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=True) - opnfv_vnf.read_parser.get = mock.Mock(return_value='filename') - - self.assertIsNotNone(opnfv_vnf.get_config_tpl_data('filename')) - - def test_get_txrx_tpl_data(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=True) - opnfv_vnf.read_parser.get = mock.Mock(return_value='filename') - - self.assertIsNotNone(opnfv_vnf.get_txrx_tpl_data('filename')) - - def test_init_write_parser_template(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=True) - opnfv_vnf.read_parser.get = mock.Mock(return_value='filename') - - self.assertIsNone(opnfv_vnf.init_write_parser_template('filename')) - opnfv_vnf.write_parser.add_section = mock.MagicMock() - opnfv_vnf.read_parser.item = mock.Mock(return_value=[1, 2, 3]) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=False) - opnfv_vnf.write_parser.set = mock.Mock() - self.assertIsNone(opnfv_vnf.init_write_parser_template('filename')) - - def test_init_write_parser_template_2(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - self.assertIsNone(opnfv_vnf.init_write_parser_template('filename')) - - def test_update_write_parser(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - self.assertIsNone(opnfv_vnf.update_write_parser({'filename': 1})) - - def test_get_worker_threads(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - result = opnfv_vnf.get_worker_threads(1) - self.assertEqual(1, result) - opnfv_vnf.worker_config = '2t' - result = opnfv_vnf.get_worker_threads(2) - self.assertEqual(2, result) - opnfv_vnf.worker_config = '2t' - result = opnfv_vnf.get_worker_threads(3) - self.assertEqual(2, result) - - # TODO(elfoley): Split this test into smaller tests - def test_generate_next_core_id(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - result = opnfv_vnf.generate_next_core_id() - self.assertIsNone(result) - opnfv_vnf.worker_config = '2t' - opnfv_vnf.start_core = 'a' - self.assertRaises(ValueError, opnfv_vnf.generate_next_core_id) - opnfv_vnf.worker_config = '2t' - opnfv_vnf.start_core = 1 - result = opnfv_vnf.generate_next_core_id() - self.assertIsNone(result) - - def test_generate_lb_to_port_pair_mapping(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = VnfdHelper(self.VNFD_0) - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - opnfv_vnf.lb_count = 1 - opnfv_vnf._port_pairs = samplevnf_helper.PortPairs(vnfd_mock.interfaces) - opnfv_vnf.port_pair_list = opnfv_vnf._port_pairs.port_pair_list - result = opnfv_vnf.generate_lb_to_port_pair_mapping() - self.assertIsNone(result) - result = opnfv_vnf.set_priv_to_pub_mapping() - self.assertEqual('(0,1)', result) - - def test_set_priv_que_handler(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = VnfdHelper(self.VNFD_0) - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.port_pairs = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - opnfv_vnf.lb_count = 1 - result = opnfv_vnf.set_priv_que_handler() - self.assertIsNone(result) - - def test_generate_arp_route_tbl(self): - # ELF: could n=do this in setup - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = "" - vnfd_mock = mock.MagicMock() - vnfd_mock.port_num.side_effect = ['32', '1', '987'] - vnfd_mock.find_interface.side_effect = [ - { - 'virtual-interface': { - 'dst_ip': '10.20.30.40', - 'netmask': '20', - }, - }, - { - 'virtual-interface': { - 'dst_ip': '10.200.30.40', - 'netmask': '24', - }, - }, - { - 'virtual-interface': { - 'dst_ip': '10.20.3.40', - 'netmask': '8', - }, - }, - ] - - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.all_ports = [3, 2, 5] - - expected = 'routeadd net 32 10.20.30.40 0xfffff000\n' \ - 'routeadd net 1 10.200.30.40 0xffffff00\n' \ - 'routeadd net 987 10.20.3.40 0xff000000' - result = opnfv_vnf.generate_arp_route_tbl() - self.assertEqual(result, expected) - - def test_generate_arpicmp_data(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.port_pairs = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - opnfv_vnf.lb_count = 1 - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - result = opnfv_vnf.generate_arpicmp_data() - self.assertIsNotNone(result) - opnfv_vnf.nfv_type = 'ovs' - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - result = opnfv_vnf.generate_arpicmp_data() - self.assertIsNotNone(result) - opnfv_vnf.nfv_type = 'openstack' - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - result = opnfv_vnf.generate_arpicmp_data() - self.assertIsNotNone(result) - opnfv_vnf.lb_config = 'HW' - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - result = opnfv_vnf.generate_arpicmp_data() - self.assertIsNotNone(result) - - def test_generate_final_txrx_data(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.port_pairs = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - opnfv_vnf.lb_count = 1 - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - opnfv_vnf.ports_len = 2 - opnfv_vnf.lb_index = 1 - opnfv_vnf.pktq_out_os = [1, 2] - result = opnfv_vnf.generate_final_txrx_data() - self.assertIsNotNone(result) - opnfv_vnf.nfv_type = 'openstack' - opnfv_vnf.pktq_out_os = [1, 2] - opnfv_vnf.lb_index = 1 - result = opnfv_vnf.generate_final_txrx_data() - self.assertIsNotNone(result) - - def test_generate_initial_txrx_data(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.port_pairs = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - opnfv_vnf.lb_count = 1 - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - opnfv_vnf.lb_index = 1 - opnfv_vnf.ports_len = 2 - result = opnfv_vnf.generate_initial_txrx_data() - self.assertIsNotNone(result) - opnfv_vnf.nfv_type = 'openstack' - opnfv_vnf.pktq_out_os = [1, 2] - result = opnfv_vnf.generate_initial_txrx_data() - self.assertIsNotNone(result) - opnfv_vnf.nfv_type = 'ovs' - opnfv_vnf.init_ovs = False - opnfv_vnf.ovs_pktq_out = '' - opnfv_vnf.pktq_out_os = [1, 2] - opnfv_vnf.lb_index = 1 - result = opnfv_vnf.generate_initial_txrx_data() - self.assertIsNotNone(result) - opnfv_vnf.nfv_type = 'ovs' - opnfv_vnf.init_ovs = True - opnfv_vnf.pktq_out_os = [1, 2] - opnfv_vnf.ovs_pktq_out = '' - opnfv_vnf.lb_index = 1 - result = opnfv_vnf.generate_initial_txrx_data() - self.assertIsNotNone(result) - - def test_generate_lb_data(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.port_pairs = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - opnfv_vnf.lb_count = 1 - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - opnfv_vnf.lb_index = 1 - opnfv_vnf.ports_len = 2 - opnfv_vnf.prv_que_handler = 0 - result = opnfv_vnf.generate_lb_data() - self.assertIsNotNone(result) - - def test_generate_vnf_data(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.port_pairs = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - opnfv_vnf.lb_count = 1 - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - opnfv_vnf.lb_index = 1 - opnfv_vnf.ports_len = 1 - opnfv_vnf.pktq_out = ['1', '2'] - opnfv_vnf.vnf_tpl = {'public_ip_port_range': '98164810', - 'vnf_set': '(2,4,5)'} - opnfv_vnf.prv_que_handler = 0 - result = opnfv_vnf.generate_vnf_data() - self.assertIsNotNone(result) - opnfv_vnf.lb_config = 'HW' - opnfv_vnf.mul = 0.1 - result = opnfv_vnf.generate_vnf_data() - self.assertIsNotNone(result) - opnfv_vnf.lb_config = 'HW' - opnfv_vnf.mul = 0.1 - opnfv_vnf.vnf_type = 'ACL' - result = opnfv_vnf.generate_vnf_data() - self.assertIsNotNone(result) - - def test_generate_config_data(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = VnfdHelper(self.VNFD_0) - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.port_pairs = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - opnfv_vnf.lb_count = 1 - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - opnfv_vnf.lb_index = 1 - opnfv_vnf.ports_len = 1 - opnfv_vnf.pktq_out = ['1', '2'] - opnfv_vnf.prv_que_handler = 0 - opnfv_vnf.init_write_parser_template = mock.Mock() - opnfv_vnf.arpicmp_tpl = mock.MagicMock() - opnfv_vnf.txrx_tpl = mock.MagicMock() - opnfv_vnf.loadb_tpl = mock.MagicMock() - opnfv_vnf.vnf_tpl = {'public_ip_port_range': '98164810 (1,65535)', - 'vnf_set': "(2,4,5)"} - opnfv_vnf.generate_vnf_data = mock.Mock(return_value={}) - opnfv_vnf.update_write_parser = mock.Mock() - result = opnfv_vnf.generate_config_data() - self.assertIsNone(result) - opnfv_vnf.generate_final_txrx_data = mock.Mock() - opnfv_vnf.update_write_parser = mock.Mock() - result = opnfv_vnf.generate_config_data() - self.assertIsNone(result) - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - opnfv_vnf.lb_index = 1 - opnfv_vnf.ports_len = 1 - opnfv_vnf.pktq_out = ['1', '2'] - opnfv_vnf.prv_que_handler = 0 - opnfv_vnf.init_write_parser_template = mock.Mock() - opnfv_vnf.arpicmp_tpl = mock.MagicMock() - opnfv_vnf.txrx_tpl = mock.MagicMock() - opnfv_vnf.loadb_tpl = mock.MagicMock() - opnfv_vnf.vnf_type = 'CGNAPT' - opnfv_vnf.update_timer = mock.Mock() - opnfv_vnf.port_pair_list = [("xe0", "xe1"), ("xe0", "xe2")] - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - opnfv_vnf.generate_arpicmp_data = mock.Mock() - result = opnfv_vnf.generate_config_data() - self.assertIsNone(result) - - def test_init_eal(self): - topology_file = mock.Mock() - config_tpl = mock.Mock() - tmp_file = mock.Mock() - vnfd_mock = mock.MagicMock() - opnfv_vnf = samplevnf_helper.MultiPortConfig( - topology_file, config_tpl, tmp_file, vnfd_mock) - opnfv_vnf.socket = 0 - opnfv_vnf.start_core = 0 - opnfv_vnf.port_pair_list = [("xe0", "xe1")] - opnfv_vnf.port_pairs = [("xe0", "xe1")] - opnfv_vnf.txrx_pipeline = '' - opnfv_vnf.rules = '' - opnfv_vnf.write_parser = mock.MagicMock() - opnfv_vnf.read_parser = mock.MagicMock() - opnfv_vnf.read_parser.sections = mock.Mock(return_value=['MASTER']) - opnfv_vnf.read_parser.has_option = mock.Mock(return_value=[]) - opnfv_vnf.write_parser.set = mock.Mock() - opnfv_vnf.write_parser.add_section = mock.Mock() - opnfv_vnf.read_parser.items = mock.MagicMock() - opnfv_vnf.pipeline_counter = 0 - opnfv_vnf.worker_config = '1t' - opnfv_vnf.start_core = 0 - opnfv_vnf.lb_count = 1 - opnfv_vnf.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - opnfv_vnf.interfaces = opnfv_vnf.vnfd['vdu'][0]['external-interface'] - opnfv_vnf.lb_to_port_pair_mapping = [0, 1] - opnfv_vnf.lb_index = 1 - opnfv_vnf.ports_len = 1 - opnfv_vnf.pktq_out = ['1', '2'] - opnfv_vnf.prv_que_handler = 0 - opnfv_vnf.init_write_parser_template = mock.Mock() - opnfv_vnf.arpicmp_tpl = mock.MagicMock() - opnfv_vnf.txrx_tpl = mock.MagicMock() - opnfv_vnf.loadb_tpl = mock.MagicMock() - opnfv_vnf.vnf_tpl = {'public_ip_port_range': '98164810 (1,65535)'} - opnfv_vnf.generate_vnf_data = mock.Mock(return_value={}) - opnfv_vnf.update_write_parser = mock.Mock() - opnfv_vnf.tmp_file = "/tmp/config" - result = opnfv_vnf.init_eal() - self.assertIsNone(result) diff --git a/tests/unit/network_services/nfvi/__init__.py b/tests/unit/network_services/nfvi/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/network_services/nfvi/__init__.py +++ /dev/null diff --git a/tests/unit/network_services/nfvi/test_collectd.py b/tests/unit/network_services/nfvi/test_collectd.py deleted file mode 100644 index 0ae175624..000000000 --- a/tests/unit/network_services/nfvi/test_collectd.py +++ /dev/null @@ -1,151 +0,0 @@ -# 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 multiprocessing -import mock - -from yardstick.network_services.nfvi.collectd import AmqpConsumer - - -class TestAmqpConsumer(unittest.TestCase): - def setUp(self): - self.queue = multiprocessing.Queue() - self.url = 'amqp://admin:admin@127.0.0.1:5672/%2F' - self.amqp_consumer = AmqpConsumer(self.url, self.queue) - - def test___init__(self): - self.assertEqual(self.url, self.amqp_consumer._url) - - def test_on_connection_open(self): - self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) - self.amqp_consumer._connection.add_on_close_callback = \ - mock.Mock(return_value=0) - self.amqp_consumer._connection.channel = mock.Mock(return_value=0) - self.assertIsNone(self.amqp_consumer.on_connection_open(10)) - - def test_on_connection_closed(self): - self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) - self.amqp_consumer._connection.ioloop = mock.Mock() - self.amqp_consumer._connection.ioloop.stop = mock.Mock(return_value=0) - self.amqp_consumer._connection.add_timeout = mock.Mock(return_value=0) - self.amqp_consumer._closing = True - self.assertIsNone( - self.amqp_consumer.on_connection_closed("", 404, "Not Found")) - self.amqp_consumer._closing = False - self.assertIsNone( - self.amqp_consumer.on_connection_closed("", 404, "Not Found")) - - def test_reconnect(self): - self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) - self.amqp_consumer._connection.ioloop = mock.Mock() - self.amqp_consumer._connection.ioloop.stop = mock.Mock(return_value=0) - self.amqp_consumer.connect = mock.Mock(return_value=0) - self.amqp_consumer._closing = True - self.assertIsNone(self.amqp_consumer.reconnect()) - - def test_on_channel_open(self): - self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) - self.amqp_consumer._connection.add_on_close_callback = \ - mock.Mock(return_value=0) - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer.add_on_channel_close_callback = mock.Mock() - self.amqp_consumer._channel.exchange_declare = \ - mock.Mock(return_value=0) - self.assertIsNone( - self.amqp_consumer.on_channel_open(self.amqp_consumer._channel)) - - def test_add_on_channel_close_callback(self): - self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) - self.amqp_consumer._connection.add_on_close_callback = \ - mock.Mock(return_value=0) - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer._channel.add_on_close_callback = mock.Mock() - self.assertIsNone(self.amqp_consumer.add_on_channel_close_callback()) - - def test_on_channel_closed(self): - self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) - self.amqp_consumer._connection.close = mock.Mock(return_value=0) - _channel = mock.Mock() - self.assertIsNone( - self.amqp_consumer.on_channel_closed(_channel, "", "")) - - def test_ion_exchange_declareok(self): - self.amqp_consumer.setup_queue = mock.Mock(return_value=0) - self.assertIsNone(self.amqp_consumer.on_exchange_declareok(10)) - - def test_setup_queue(self): - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer._channel.add_on_close_callback = mock.Mock() - self.assertIsNone(self.amqp_consumer.setup_queue("collectd")) - - def test_on_queue_declareok(self): - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer._channel.queue_bind = mock.Mock() - self.assertIsNone(self.amqp_consumer.on_queue_declareok(10)) - - def test__on_bindok(self): - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer._channel.basic_consume = mock.Mock() - self.amqp_consumer.add_on_cancel_callback = mock.Mock() - self.assertIsNone(self.amqp_consumer._on_bindok(10)) - - def test_add_on_cancel_callback(self): - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer._channel.add_on_cancel_callback = mock.Mock() - self.assertIsNone(self.amqp_consumer.add_on_cancel_callback()) - - def test_on_consumer_cancelled(self): - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer._channel.close = mock.Mock() - self.assertIsNone(self.amqp_consumer.on_consumer_cancelled(10)) - - def test_on_message(self): - body = "msg {} cpu/cpu-0/ipc 101010:10" - properties = "" - basic_deliver = mock.Mock() - basic_deliver.delivery_tag = mock.Mock(return_value=0) - self.amqp_consumer.ack_message = mock.Mock() - self.assertIsNone( - self.amqp_consumer.on_message(10, basic_deliver, properties, body)) - - def test_ack_message(self): - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer._channel.basic_ack = mock.Mock() - self.assertIsNone(self.amqp_consumer.ack_message(10)) - - def test_on_cancelok(self): - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer._channel.close = mock.Mock() - self.assertIsNone(self.amqp_consumer.on_cancelok(10)) - - def test_run(self): - self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) - self.amqp_consumer.connect = mock.Mock() - self.amqp_consumer._connection.ioloop.start = mock.Mock() - self.assertIsNone(self.amqp_consumer.run()) - - def test_stop(self): - self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) - self.amqp_consumer.connect = mock.Mock() - self.amqp_consumer._connection.ioloop.start = mock.Mock() - self.amqp_consumer._channel = mock.Mock() - self.amqp_consumer._channel.basic_cancel = mock.Mock() - self.assertIsNone(self.amqp_consumer.stop()) - - def test_close_connection(self): - self.amqp_consumer._connection = mock.Mock(autospec=AmqpConsumer) - self.amqp_consumer._connection.close = mock.Mock() - self.assertIsNone(self.amqp_consumer.close_connection()) diff --git a/tests/unit/network_services/nfvi/test_resource.py b/tests/unit/network_services/nfvi/test_resource.py deleted file mode 100644 index 9f337c673..000000000 --- a/tests/unit/network_services/nfvi/test_resource.py +++ /dev/null @@ -1,298 +0,0 @@ -# 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. - -import errno - -import mock -import unittest - -from yardstick.network_services.nfvi.resource import ResourceProfile -from yardstick.network_services.nfvi import resource, collectd -from yardstick.common.exceptions import ResourceCommandError -from yardstick import ssh - -class TestResourceProfile(unittest.TestCase): - VNFD = {'vnfd:vnfd-catalog': - {'vnfd': - [{'short-name': 'VpeVnf', - 'vdu': - [{'routing_table': - [{'network': '172.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '172.16.100.20', - 'if': 'xe0'}, - {'network': '172.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '172.16.40.20', - 'if': 'xe1'}], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': - [{'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'id': 'vpevnf-baremetal', - 'external-interface': - [{'virtual-interface': - {'dst_mac': '3c:fd:fe:9e:64:38', - 'vpci': '0000:05:00.0', - 'local_ip': '172.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '172.16.100.20', - 'local_mac': '3c:fd:fe:a1:2b:80'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:1e:67:d0:60:5c', - 'vpci': '0000:05:00.1', - 'local_ip': '172.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '172.16.40.20', - 'local_mac': '3c:fd:fe:a1:2b:81'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}]}], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': - {'vdu-id': 'vpevnf-baremetal', - 'host': '127.0.0.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '127.0.0.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} - - def setUp(self): - with mock.patch("yardstick.ssh.AutoConnectSSH") as ssh: - self.ssh_mock = mock.Mock(autospec=ssh.SSH) - self.ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = self.ssh_mock - - mgmt = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['mgmt-interface'] - # interfaces = \ - # self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface'] - port_names = \ - self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]['vdu'][0]['external-interface'] - self.resource_profile = \ - ResourceProfile(mgmt, port_names) - self.resource_profile.connection = self.ssh_mock - - def test___init__(self): - self.assertTrue(self.resource_profile.enable) - - def test_check_if_system_agent_running(self): - self.assertEqual(self.resource_profile.check_if_system_agent_running("collectd"), - (0, "")) - - def test_check_if_system_agent_running_excetion(self): - with mock.patch.object(self.resource_profile.connection, "execute") as mock_execute: - mock_execute.side_effect = OSError(errno.ECONNRESET, "error") - self.assertEqual( - self.resource_profile.check_if_system_agent_running("collectd"), - (1, None)) - - def test_get_cpu_data(self): - reskey = ["", "cpufreq", "cpufreq-0"] - value = "metric:10" - val = self.resource_profile.get_cpu_data(reskey[1], reskey[2], value) - self.assertIsNotNone(val) - - def test_get_cpu_data_error(self): - reskey = ["", "", ""] - value = "metric:10" - val = self.resource_profile.get_cpu_data(reskey[0], reskey[1], value) - self.assertEqual(val, ('error', 'Invalid', '', '')) - - def test__start_collectd(self): - ssh_mock = mock.Mock() - ssh_mock.execute = mock.Mock(return_value=(0, "", "")) - self.assertIsNone(self.resource_profile._start_collectd(ssh_mock, - "/opt/nsb_bin")) - - ssh_mock.execute = mock.Mock(side_effect=ssh.SSHError) - with self.assertRaises(ssh.SSHError): - self.resource_profile._start_collectd(ssh_mock, "/opt/nsb_bin") - - ssh_mock.execute = mock.Mock(return_value=(1, "", "")) - self.assertIsNone(self.resource_profile._start_collectd(ssh_mock, - "/opt/nsb_bin")) - - def test__start_rabbitmq(self): - ssh_mock = mock.Mock() - ssh_mock.execute = mock.Mock(return_value=(0, "RabbitMQ", "")) - self.assertIsNone(self.resource_profile._start_rabbitmq(ssh_mock)) - - ssh_mock.execute = mock.Mock(return_value=(0, "", "")) - with self.assertRaises(ResourceCommandError): - self.resource_profile._start_rabbitmq(ssh_mock) - - ssh_mock.execute = mock.Mock(return_value=(1, "", "")) - with self.assertRaises(ResourceCommandError): - self.resource_profile._start_rabbitmq(ssh_mock) - - def test__prepare_collectd_conf(self): - self.assertIsNone( - self.resource_profile._prepare_collectd_conf("/opt/nsb_bin")) - - def test__setup_ovs_stats(self): - # TODO(elfoley): This method doesn't actually return anything, the side - # effects should be checked - self.assertIsNone( - self.resource_profile._setup_ovs_stats(self.ssh_mock)) - - def test__provide_config_file(self,): - loadplugin = range(5) - port_names = range(5) - kwargs = { - "interval": '25', - "loadplugin": loadplugin, - "port_names": port_names, - } - self.resource_profile._provide_config_file("/opt/nsb_bin", "collectd.conf", kwargs) - self.ssh_mock.execute.assert_called_once() - - def test_initiate_systemagent(self): - self.resource_profile._start_collectd = mock.Mock() - self.resource_profile._start_rabbitmq = mock.Mock() - self.assertIsNone( - self.resource_profile.initiate_systemagent("/opt/nsb_bin")) - - def test_initiate_systemagent_raise(self): - self.resource_profile._start_rabbitmq = mock.Mock(side_effect=RuntimeError) - with self.assertRaises(RuntimeError): - self.resource_profile.initiate_systemagent("/opt/nsb_bin") - - def test__parse_hugepages(self): - reskey = ["cpu", "cpuFreq"] - value = "timestamp:12345" - res = self.resource_profile.parse_hugepages(reskey, value) - self.assertEqual({'cpu/cpuFreq': '12345'}, res) - - def test__parse_dpdkstat(self): - reskey = ["dpdk0", "0"] - value = "tx:12345" - res = self.resource_profile.parse_dpdkstat(reskey, value) - self.assertEqual({'dpdk0/0': '12345'}, res) - - def test__parse_virt(self): - reskey = ["vm0", "cpu"] - value = "load:45" - res = self.resource_profile.parse_virt(reskey, value) - self.assertEqual({'vm0/cpu': '45'}, res) - - def test__parse_ovs_stats(self): - reskey = ["ovs", "stats"] - value = "tx:45" - res = self.resource_profile.parse_ovs_stats(reskey, value) - self.assertEqual({'ovs/stats': '45'}, res) - - def test_parse_collectd_result(self): - res = self.resource_profile.parse_collectd_result({}) - expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {}, - 'memory': {}, 'ovs_stats': {}, 'timestamp': '', - 'virt': {}} - self.assertDictEqual(res, expected_result) - - def test_parse_collectd_result_cpu(self): - metric = {"nsb_stats/cpu/0/ipc": "101"} - self.resource_profile.get_cpu_data = mock.Mock(return_value=[1, - "ipc", - "1234", - ""]) - res = self.resource_profile.parse_collectd_result(metric) - expected_result = {'cpu': {1: {'ipc': '1234'}}, 'dpdkstat': {}, 'hugepages': {}, - 'memory': {}, 'ovs_stats': {}, 'timestamp': '', - 'virt': {}} - self.assertDictEqual(res, expected_result) - - def test_parse_collectd_result_memory(self): - metric = {"nsb_stats/memory/bw": "101"} - res = self.resource_profile.parse_collectd_result(metric) - expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {}, - 'memory': {'bw': '101'}, 'ovs_stats': {}, 'timestamp': '', - 'virt': {}} - self.assertDictEqual(res, expected_result) - - def test_parse_collectd_result_hugepage(self): - # amqp returns bytes - metric = {b"nsb_stats/hugepages/free": b"101"} - self.resource_profile.parse_hugepages = mock.Mock(return_value={"free": "101"}) - res = self.resource_profile.parse_collectd_result(metric) - expected_result = {'cpu': {}, 'dpdkstat': {}, 'hugepages': {'free': '101'}, - 'memory': {}, 'ovs_stats': {}, 'timestamp': '', - 'virt': {}} - self.assertDictEqual(res, expected_result) - - def test_parse_collectd_result_dpdk_virt_ovs(self): - metric = {b"nsb_stats/dpdkstat/tx": b"101", - b"nsb_stats/ovs_stats/tx": b"101", - b"nsb_stats/virt/virt/memory": b"101"} - self.resource_profile.parse_dpdkstat = \ - mock.Mock(return_value={"tx": "101"}) - self.resource_profile.parse_virt = \ - mock.Mock(return_value={"memory": "101"}) - self.resource_profile.parse_ovs_stats = \ - mock.Mock(return_value={"tx": "101"}) - res = self.resource_profile.parse_collectd_result(metric) - expected_result = {'cpu': {}, 'dpdkstat': {'tx': '101'}, 'hugepages': {}, - 'memory': {}, 'ovs_stats': {'tx': '101'}, 'timestamp': '', - 'virt': {'memory': '101'}} - self.assertDictEqual(res, expected_result) - - def test_amqp_process_for_nfvi_kpi(self): - self.resource_profile.amqp_client = \ - mock.MagicMock(side_effect=[None, mock.MagicMock()]) - self.resource_profile.run_collectd_amqp = \ - mock.Mock(return_value=0) - res = self.resource_profile.amqp_process_for_nfvi_kpi() - self.assertIsNone(res) - - def test_amqp_collect_nfvi_kpi(self): - self.resource_profile.amqp_client = \ - mock.MagicMock(side_effect=[None, mock.MagicMock()]) - self.resource_profile.run_collectd_amqp = \ - mock.Mock(return_value=0) - self.resource_profile.parse_collectd_result = mock.Mock() - res = self.resource_profile.amqp_collect_nfvi_kpi() - self.assertIsNotNone(res) - - def test_run_collectd_amqp(self): - resource.AmqpConsumer = mock.Mock(autospec=collectd) - self.assertIsNone(self.resource_profile.run_collectd_amqp()) - - def test_start(self): - self.assertIsNone(self.resource_profile.start()) - - def test_stop(self): - self.assertIsNone(self.resource_profile.stop()) - - def test_stop_amqp_not_running(self): - self.resource_profile.amqp_client = mock.MagicMock() - # TODO(efoley): Fix this incorrect test. - # Should check that we don't try to stop amqp when it's not running - self.assertIsNone(self.resource_profile.stop()) diff --git a/tests/unit/network_services/traffic_profile/__init__.py b/tests/unit/network_services/traffic_profile/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/network_services/traffic_profile/__init__.py +++ /dev/null diff --git a/tests/unit/network_services/traffic_profile/test_base.py b/tests/unit/network_services/traffic_profile/test_base.py deleted file mode 100644 index 3b8804976..000000000 --- a/tests/unit/network_services/traffic_profile/test_base.py +++ /dev/null @@ -1,73 +0,0 @@ -# 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. - -import sys - -import mock -import unittest - -from yardstick.common import exceptions -from yardstick.network_services import traffic_profile as tprofile_package -from yardstick.network_services.traffic_profile import base -from yardstick import tests as y_tests - - -class TestTrafficProfile(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}} - - def _get_res_mock(self, **kw): - _mock = mock.MagicMock() - for k, v in kw.items(): - setattr(_mock, k, v) - return _mock - - def test___init__(self): - traffic_profile = base.TrafficProfile(self.TRAFFIC_PROFILE) - self.assertEqual(self.TRAFFIC_PROFILE, traffic_profile.params) - - def test_execute(self): - traffic_profile = base.TrafficProfile(self.TRAFFIC_PROFILE) - self.assertRaises(NotImplementedError, - traffic_profile.execute_traffic, {}) - - def test_get_existing_traffic_profile(self): - traffic_profile_list = [ - 'RFC2544Profile', 'FixedProfile', 'TrafficProfileGenericHTTP', - 'IXIARFC2544Profile', 'ProxACLProfile', 'ProxBinSearchProfile', - 'ProxProfile', 'ProxRampProfile'] - with mock.patch.dict(sys.modules, y_tests.STL_MOCKS): - tprofile_package.register_modules() - - for tp in traffic_profile_list: - traffic_profile = base.TrafficProfile.get( - {'traffic_profile': {'traffic_type': tp}}) - self.assertEqual(tp, traffic_profile.__class__.__name__) - - def test_get_non_existing_traffic_profile(self): - self.assertRaises(exceptions.TrafficProfileNotImplemented, - base.TrafficProfile.get, self.TRAFFIC_PROFILE) - - -class TestDummyProfile(unittest.TestCase): - def test_execute(self): - dummy_profile = base.DummyProfile(base.TrafficProfile) - self.assertIsNone(dummy_profile.execute({})) diff --git a/tests/unit/network_services/traffic_profile/test_fixed.py b/tests/unit/network_services/traffic_profile/test_fixed.py deleted file mode 100644 index dec94964b..000000000 --- a/tests/unit/network_services/traffic_profile/test_fixed.py +++ /dev/null @@ -1,120 +0,0 @@ -# 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 tests.unit import STL_MOCKS - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.traffic_profile.base import TrafficProfile - from yardstick.network_services.traffic_profile.fixed import FixedProfile - - -class TestFixedProfile(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}} - - VNFD = {'vnfd:vnfd-catalog': - {'vnfd': - [{'short-name': 'VpeVnf', - 'vdu': - [{'routing_table': - [{'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0'}, - {'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1'}], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': - [{'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'id': 'vpevnf-baremetal', - 'external-interface': - [{'virtual-interface': - {'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}]}], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': - {'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} - - def test___init__(self): - fixed_profile = \ - FixedProfile(TrafficProfile) - self.assertIsNotNone(fixed_profile) - - def test_execute(self): - traffic_generator = mock.Mock(autospec=TrafficProfile) - traffic_generator.my_ports = [0, 1] - traffic_generator.vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - traffic_generator.client = \ - mock.Mock(return_value=True) - fixed_profile = FixedProfile(self.TRAFFIC_PROFILE) - fixed_profile.params = self.TRAFFIC_PROFILE - fixed_profile.first_run = True - self.assertIsNone(fixed_profile.execute(traffic_generator)) diff --git a/tests/unit/network_services/traffic_profile/test_http.py b/tests/unit/network_services/traffic_profile/test_http.py deleted file mode 100644 index 5d8029ea0..000000000 --- a/tests/unit/network_services/traffic_profile/test_http.py +++ /dev/null @@ -1,41 +0,0 @@ -# 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.assertIsNone( - traffic_profile_generic_htt_p.execute(traffic_generator)) - - def test__send_http_request(self): - traffic_profile_generic_htt_p = \ - TrafficProfileGenericHTTP(TrafficProfile) - self.assertIsNone(traffic_profile_generic_htt_p._send_http_request( - "10.1.1.1", "250", "/req")) diff --git a/tests/unit/network_services/traffic_profile/test_http_ixload.py b/tests/unit/network_services/traffic_profile/test_http_ixload.py deleted file mode 100644 index 5110439fd..000000000 --- a/tests/unit/network_services/traffic_profile/test_http_ixload.py +++ /dev/null @@ -1,272 +0,0 @@ -# Copyright (c) 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 oslo_serialization import jsonutils - -from yardstick.network_services.traffic_profile import http_ixload -from yardstick.network_services.traffic_profile.http_ixload import \ - join_non_strings, validate_non_string_sequence - - -class TestJoinNonStrings(unittest.TestCase): - - def test_validate_non_string_sequence(self): - self.assertEqual(validate_non_string_sequence([1, 2, 3]), [1, 2, 3]) - self.assertIsNone(validate_non_string_sequence('123')) - self.assertIsNone(validate_non_string_sequence(1)) - - self.assertEqual(validate_non_string_sequence(1, 2), 2) - self.assertEqual(validate_non_string_sequence(1, default=2), 2) - - with self.assertRaises(RuntimeError): - validate_non_string_sequence(1, raise_exc=RuntimeError) - - def test_join_non_strings(self): - self.assertEqual(join_non_strings(':'), '') - self.assertEqual(join_non_strings(':', 'a'), 'a') - self.assertEqual(join_non_strings(':', 'a', 2, 'c'), 'a:2:c') - self.assertEqual(join_non_strings(':', ['a', 2, 'c']), 'a:2:c') - self.assertEqual(join_non_strings(':', 'abc'), 'abc') - - -class TestIxLoadTrafficGen(unittest.TestCase): - - def test_parse_run_test(self): - ports = [1, 2, 3] - test_input = { - "remote_server": "REMOTE_SERVER", - "ixload_cfg": "IXLOAD_CFG", - "result_dir": "RESULT_DIR", - "ixia_chassis": "IXIA_CHASSIS", - "IXIA": { - "card": "CARD", - "ports": ports, - }, - } - j = jsonutils.dump_as_bytes(test_input) - ixload = http_ixload.IXLOADHttpTest(j) - self.assertDictEqual(ixload.test_input, test_input) - self.assertIsNone(ixload.parse_run_test()) - self.assertEqual(ixload.ports_to_reassign, [ - ["IXIA_CHASSIS", "CARD", 1], - ["IXIA_CHASSIS", "CARD", 2], - ["IXIA_CHASSIS", "CARD", 3], - ]) - - def test_format_ports_for_reassignment(self): - ports = [ - ["IXIA_CHASSIS", "CARD", 1], - ["IXIA_CHASSIS", "CARD", 2], - ["IXIA_CHASSIS", "CARD", 3], - ] - formatted = http_ixload.IXLOADHttpTest.format_ports_for_reassignment(ports) - self.assertEqual(formatted, [ - "IXIA_CHASSIS;CARD;1", - "IXIA_CHASSIS;CARD;2", - "IXIA_CHASSIS;CARD;3", - ]) - - def test_reassign_ports(self): - ports = [1, 2, 3] - test_input = { - "remote_server": "REMOTE_SERVER", - "ixload_cfg": "IXLOAD_CFG", - "result_dir": "RESULT_DIR", - "ixia_chassis": "IXIA_CHASSIS", - "IXIA": { - "card": "CARD", - "ports": ports, - }, - } - j = jsonutils.dump_as_bytes(test_input) - ixload = http_ixload.IXLOADHttpTest(j) - repository = mock.Mock() - test = mock.MagicMock() - test.setPorts = mock.Mock() - ports_to_reassign = [(1, 2, 3), (1, 2, 4)] - ixload.format_ports_for_reassignment = mock.Mock(return_value=["1;2;3"]) - self.assertIsNone(ixload.reassign_ports(test, repository, ports_to_reassign)) - - def test_reassign_ports_error(self): - ports = [1, 2, 3] - test_input = { - "remote_server": "REMOTE_SERVER", - "ixload_cfg": "IXLOAD_CFG", - "result_dir": "RESULT_DIR", - "ixia_chassis": "IXIA_CHASSIS", - "IXIA": { - "card": "CARD", - "ports": ports, - }, - } - j = jsonutils.dump_as_bytes(test_input) - ixload = http_ixload.IXLOADHttpTest(j) - repository = mock.Mock() - test = "test" - ports_to_reassign = [(1, 2, 3), (1, 2, 4)] - ixload.format_ports_for_reassignment = mock.Mock(return_value=["1;2;3"]) - ixload.ix_load = mock.MagicMock() - ixload.ix_load.delete = mock.Mock() - ixload.ix_load.disconnect = mock.Mock() - with self.assertRaises(Exception): - ixload.reassign_ports(test, repository, ports_to_reassign) - - def test_stat_collector(self): - args = [0, 1] - self.assertIsNone( - http_ixload.IXLOADHttpTest.stat_collector(*args)) - - def test_IxL_StatCollectorCommand(self): - args = [[0, 1, 2, 3], [0, 1, 2, 3]] - self.assertIsNone( - http_ixload.IXLOADHttpTest.IxL_StatCollectorCommand(*args)) - - def test_set_results_dir(self): - test_stat_collector = mock.MagicMock() - test_stat_collector.setResultDir = mock.Mock() - results_on_windows = "c:/Results" - self.assertIsNone( - http_ixload.IXLOADHttpTest.set_results_dir(test_stat_collector, - results_on_windows)) - - def test_set_results_dir_error(self): - test_stat_collector = "" - results_on_windows = "c:/Results" - with self.assertRaises(Exception): - http_ixload.IXLOADHttpTest.set_results_dir(test_stat_collector, results_on_windows) - - def test_load_config_file(self): - ports = [1, 2, 3] - test_input = { - "remote_server": "REMOTE_SERVER", - "ixload_cfg": "IXLOAD_CFG", - "result_dir": "RESULT_DIR", - "ixia_chassis": "IXIA_CHASSIS", - "IXIA": { - "card": "CARD", - "ports": ports, - }, - } - j = jsonutils.dump_as_bytes(test_input) - ixload = http_ixload.IXLOADHttpTest(j) - ixload.ix_load = mock.MagicMock() - ixload.ix_load.new = mock.Mock(return_value="") - self.assertIsNotNone(ixload.load_config_file("ixload.cfg")) - - def test_load_config_file_error(self): - ports = [1, 2, 3] - test_input = { - "remote_server": "REMOTE_SERVER", - "ixload_cfg": "IXLOAD_CFG", - "result_dir": "RESULT_DIR", - "ixia_chassis": "IXIA_CHASSIS", - "IXIA": { - "card": "CARD", - "ports": ports, - }, - } - j = jsonutils.dump_as_bytes(test_input) - ixload = http_ixload.IXLOADHttpTest(j) - ixload.ix_load = "test" - with self.assertRaises(Exception): - ixload.load_config_file("ixload.cfg") - - @mock.patch('yardstick.network_services.traffic_profile.http_ixload.IxLoad') - @mock.patch('yardstick.network_services.traffic_profile.http_ixload.StatCollectorUtils') - def test_start_http_test_connect_error(self, mock_collector_type, mock_ixload_type): - ports = [1, 2, 3] - test_input = { - "remote_server": "REMOTE_SERVER", - "ixload_cfg": "IXLOAD_CFG", - "result_dir": "RESULT_DIR", - "ixia_chassis": "IXIA_CHASSIS", - "IXIA": { - "card": "CARD", - "ports": ports, - }, - } - - j = jsonutils.dump_as_bytes(test_input) - - mock_ixload = mock_ixload_type() - mock_ixload.connect.side_effect = RuntimeError - - ixload = http_ixload.IXLOADHttpTest(j) - ixload.results_on_windows = 'windows_result_dir' - ixload.result_dir = 'my_result_dir' - - with self.assertRaises(RuntimeError): - ixload.start_http_test() - - @mock.patch('yardstick.network_services.traffic_profile.http_ixload.IxLoad') - @mock.patch('yardstick.network_services.traffic_profile.http_ixload.StatCollectorUtils') - def test_start_http_test(self, mock_collector_type, mock_ixload_type): - ports = [1, 2, 3] - test_input = { - "remote_server": "REMOTE_SERVER", - "ixload_cfg": "IXLOAD_CFG", - "result_dir": "RESULT_DIR", - "ixia_chassis": "IXIA_CHASSIS", - "IXIA": { - "card": "CARD", - "ports": ports, - }, - } - - j = jsonutils.dump_as_bytes(test_input) - - ixload = http_ixload.IXLOADHttpTest(j) - ixload.results_on_windows = 'windows_result_dir' - ixload.result_dir = 'my_result_dir' - ixload.load_config_file = mock.MagicMock() - - self.assertIsNone(ixload.start_http_test()) - - @mock.patch('yardstick.network_services.traffic_profile.http_ixload.IxLoad') - @mock.patch('yardstick.network_services.traffic_profile.http_ixload.StatCollectorUtils') - def test_start_http_test_reassign_error(self, mock_collector_type, mock_ixload_type): - ports = [1, 2, 3] - test_input = { - "remote_server": "REMOTE_SERVER", - "ixload_cfg": "IXLOAD_CFG", - "result_dir": "RESULT_DIR", - "ixia_chassis": "IXIA_CHASSIS", - "IXIA": { - "card": "CARD", - "ports": ports, - }, - } - - j = jsonutils.dump_as_bytes(test_input) - - ixload = http_ixload.IXLOADHttpTest(j) - ixload.load_config_file = mock.MagicMock() - - reassign_ports = mock.Mock(side_effect=RuntimeError) - ixload.reassign_ports = reassign_ports - ixload.results_on_windows = 'windows_result_dir' - ixload.result_dir = 'my_result_dir' - - ixload.start_http_test() - self.assertEqual(reassign_ports.call_count, 1) - - @mock.patch("yardstick.network_services.traffic_profile.http_ixload.IXLOADHttpTest") - def test_main(self, IXLOADHttpTest): - args = ["1", "2", "3"] - http_ixload.main(args) diff --git a/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py b/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py deleted file mode 100644 index e8910d62b..000000000 --- a/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py +++ /dev/null @@ -1,611 +0,0 @@ -# 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 -from __future__ import division -import unittest -import mock - -from copy import deepcopy - -from tests.unit import STL_MOCKS - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.traffic_profile.trex_traffic_profile \ - import TrexProfile - from yardstick.network_services.traffic_profile.ixia_rfc2544 import \ - IXIARFC2544Profile - from yardstick.network_services.traffic_profile import ixia_rfc2544 - - -class TestIXIARFC2544Profile(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': 'IXIARFC2544Profile', - 'frame_rate': 100}, - IXIARFC2544Profile.DOWNLINK: {'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', 'count': '1', - 'srcip4': '90.90.1.1-90.105.255.255', - 'dscp': 0, 'ttl': 32}, - 'outer_l4': {'srcport': '2001', - 'dsrport': '1234'}}}, - IXIARFC2544Profile.UPLINK: {'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', 'count': '1', - '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_get_ixia_traffic_profile_error(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.my_ports = [0, 1] - traffic_generator.uplink_ports = [-1] - traffic_generator.downlink_ports = [1] - traffic_generator.client = \ - mock.Mock(return_value=True) - STATIC_TRAFFIC = { - IXIARFC2544Profile.UPLINK: { - "id": 1, - "bidir": "False", - "duration": 60, - "iload": "100", - "outer_l2": { - "dstmac": "00:00:00:00:00:03", - "framesPerSecond": True, - "framesize": 64, - "srcmac": "00:00:00:00:00:01" - }, - "outer_l3": { - "dscp": 0, - "dstip4": "152.16.40.20", - "proto": "udp", - "srcip4": "152.16.100.20", - "ttl": 32 - }, - "outer_l3v4": { - "dscp": 0, - "dstip4": "152.16.40.20", - "proto": "udp", - "srcip4": "152.16.100.20", - "ttl": 32 - }, - "outer_l3v6": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32 - }, - "outer_l4": { - "dstport": "2001", - "srcport": "1234" - }, - "traffic_type": "continuous" - }, - IXIARFC2544Profile.DOWNLINK: { - "id": 2, - "bidir": "False", - "duration": 60, - "iload": "100", - "outer_l2": { - "dstmac": "00:00:00:00:00:04", - "framesPerSecond": True, - "framesize": 64, - "srcmac": "00:00:00:00:00:01" - }, - "outer_l3": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32 - }, - "outer_l3v4": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32 - }, - "outer_l3v6": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32 - }, - "outer_l4": { - "dstport": "1234", - "srcport": "2001" - }, - "traffic_type": "continuous" - } - } - ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC - - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.rate = 100 - mac = {"src_mac_0": "00:00:00:00:00:01", - "src_mac_1": "00:00:00:00:00:02", - "src_mac_2": "00:00:00:00:00:02", - "dst_mac_0": "00:00:00:00:00:03", - "dst_mac_1": "00:00:00:00:00:04", - "dst_mac_2": "00:00:00:00:00:04"} - result = r_f_c2544_profile._get_ixia_traffic_profile(self.PROFILE, mac) - self.assertIsNotNone(result) - - def test_get_ixia_traffic_profile(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.my_ports = [0, 1] - traffic_generator.uplink_ports = [-1] - traffic_generator.downlink_ports = [1] - traffic_generator.client = \ - mock.Mock(return_value=True) - STATIC_TRAFFIC = { - IXIARFC2544Profile.UPLINK: { - "id": 1, - "bidir": "False", - "duration": 60, - "iload": "100", - "outer_l2": { - "dstmac": "00:00:00:00:00:03", - "framesPerSecond": True, - "framesize": 64, - "srcmac": "00:00:00:00:00:01" - }, - "outer_l3": { - "dscp": 0, - "dstip4": "152.16.40.20", - "proto": "udp", - "srcip4": "152.16.100.20", - "ttl": 32 - }, - "outer_l3v4": { - "dscp": 0, - "dstip4": "152.16.40.20", - "proto": "udp", - "srcip4": "152.16.100.20", - "ttl": 32, - "count": "1" - }, - "outer_l3v6": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32, - }, - "outer_l4": { - "dstport": "2001", - "srcport": "1234", - "count": "1" - }, - "traffic_type": "continuous" - }, - IXIARFC2544Profile.DOWNLINK: { - "id": 2, - "bidir": "False", - "duration": 60, - "iload": "100", - "outer_l2": { - "dstmac": "00:00:00:00:00:04", - "framesPerSecond": True, - "framesize": 64, - "srcmac": "00:00:00:00:00:01" - }, - "outer_l3": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32 - }, - "outer_l3v4": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32, - }, - "outer_l3v6": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32, - }, - "outer_l4": { - "dstport": "1234", - "srcport": "2001", - "count": "1" - }, - "traffic_type": "continuous" - } - } - ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC - - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.rate = 100 - mac = {"src_mac_0": "00:00:00:00:00:01", - "src_mac_1": "00:00:00:00:00:02", - "src_mac_2": "00:00:00:00:00:02", - "dst_mac_0": "00:00:00:00:00:03", - "dst_mac_1": "00:00:00:00:00:04", - "dst_mac_2": "00:00:00:00:00:04"} - result = r_f_c2544_profile._get_ixia_traffic_profile(self.PROFILE, mac) - self.assertIsNotNone(result) - - @mock.patch("yardstick.network_services.traffic_profile.ixia_rfc2544.open") - def test_get_ixia_traffic_profile_v6(self, *args): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.my_ports = [0, 1] - traffic_generator.uplink_ports = [-1] - traffic_generator.downlink_ports = [1] - traffic_generator.client = \ - mock.Mock(return_value=True) - STATIC_TRAFFIC = { - IXIARFC2544Profile.UPLINK: { - "id": 1, - "bidir": "False", - "duration": 60, - "iload": "100", - "outer_l2": { - "dstmac": "00:00:00:00:00:03", - "framesPerSecond": True, - "framesize": 64, - "srcmac": "00:00:00:00:00:01" - }, - "outer_l3": { - "dscp": 0, - "dstip4": "152.16.40.20", - "proto": "udp", - "srcip4": "152.16.100.20", - "ttl": 32 - }, - "outer_l3v4": { - "dscp": 0, - "dstip4": "152.16.40.20", - "proto": "udp", - "srcip4": "152.16.100.20", - "ttl": 32 - }, - "outer_l3v6": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32 - }, - "outer_l4": { - "dstport": "2001", - "srcport": "1234" - }, - "traffic_type": "continuous" - }, - IXIARFC2544Profile.DOWNLINK: { - "id": 2, - "bidir": "False", - "duration": 60, - "iload": "100", - "outer_l2": { - "dstmac": "00:00:00:00:00:04", - "framesPerSecond": True, - "framesize": 64, - "srcmac": "00:00:00:00:00:01" - }, - "outer_l3": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32 - }, - "outer_l3v4": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32 - }, - "outer_l3v6": { - "count": 1024, - "dscp": 0, - "dstip4": "152.16.100.20", - "proto": "udp", - "srcip4": "152.16.40.20", - "ttl": 32 - }, - "outer_l4": { - "dstport": "1234", - "srcport": "2001" - }, - "traffic_type": "continuous" - } - } - ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC - - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.rate = 100 - mac = {"src_mac_0": "00:00:00:00:00:01", - "src_mac_1": "00:00:00:00:00:02", - "src_mac_2": "00:00:00:00:00:02", - "dst_mac_0": "00:00:00:00:00:03", - "dst_mac_1": "00:00:00:00:00:04", - "dst_mac_2": "00:00:00:00:00:04"} - profile_data = {'description': 'Traffic profile to run RFC2544', - 'name': 'rfc2544', - 'traffic_profile': - {'traffic_type': 'IXIARFC2544Profile', - 'frame_rate': 100}, - IXIARFC2544Profile.DOWNLINK: - {'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', 'count': '1', - 'srcip4': '90.90.1.1-90.105.255.255', - 'dscp': 0, 'ttl': 32}, - 'outer_l3v6': {'dstip6': '1.1.1.1-1.15.255.255', - 'proto': 'udp', 'count': '1', - 'srcip6': '90.90.1.1-90.105.255.255', - 'dscp': 0, 'ttl': 32}, - 'outer_l4': {'srcport': '2001', - 'dsrport': '1234'}}}, - IXIARFC2544Profile.UPLINK: {'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', 'count': '1', - 'srcip4': '1.1.1.1-1.15.255.255', - 'dscp': 0, 'ttl': 32}, - 'outer_l3v6': - {'dstip6': '9.9.1.1-90.105.255.255', - 'proto': 'udp', 'count': '1', - 'srcip6': '1.1.1.1-1.15.255.255', - 'dscp': 0, 'ttl': 32}, - - 'outer_l4': {'dstport': '2001', - 'srcport': '1234'}}}, - 'schema': 'isb:traffic_profile:0.1'} - result = r_f_c2544_profile._get_ixia_traffic_profile(profile_data, mac) - self.assertIsNotNone(result) - - def test__get_ixia_traffic_profile_default_args(self): - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - - expected = {} - result = r_f_c2544_profile._get_ixia_traffic_profile({}) - self.assertDictEqual(result, expected) - - def test__ixia_traffic_generate(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.networks = { - "uplink_0": ["xe0"], - "downlink_0": ["xe1"], - } - traffic_generator.client = \ - mock.Mock(return_value=True) - traffic = {IXIARFC2544Profile.DOWNLINK: {'iload': 10}, - IXIARFC2544Profile.UPLINK: {'iload': 10}} - ixia_obj = mock.MagicMock() - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.rate = 100 - result = r_f_c2544_profile._ixia_traffic_generate(traffic, ixia_obj) - self.assertIsNone(result) - - def test_execute(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.networks = { - "uplink_0": ["xe0"], - "downlink_0": ["xe1"], - } - traffic_generator.client = \ - mock.Mock(return_value=True) - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.first_run = True - r_f_c2544_profile.params = {IXIARFC2544Profile.DOWNLINK: {'iload': 10}, - IXIARFC2544Profile.UPLINK: {'iload': 10}} - - r_f_c2544_profile.get_streams = mock.Mock() - r_f_c2544_profile.full_profile = {} - r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock() - r_f_c2544_profile.get_multiplier = mock.Mock() - r_f_c2544_profile._ixia_traffic_generate = mock.Mock() - ixia_obj = mock.MagicMock() - self.assertIsNone(r_f_c2544_profile.execute_traffic(traffic_generator, ixia_obj)) - - def test_update_traffic_profile(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.networks = { - "uplink_0": ["xe0"], # private, one value for intfs - "downlink_0": ["xe1", "xe2"], # public, two values for intfs - "downlink_1": ["xe3"], # not in TRAFFIC PROFILE - "tenant_0": ["xe4"], # not public or private - } - - ports_expected = [8, 3, 5] - traffic_generator.vnfd_helper.port_num.side_effect = ports_expected - traffic_generator.client.return_value = True - - traffic_profile = deepcopy(self.TRAFFIC_PROFILE) - traffic_profile.update({ - "uplink_0": ["xe0"], - "downlink_0": ["xe1", "xe2"], - }) - - r_f_c2544_profile = IXIARFC2544Profile(traffic_profile) - r_f_c2544_profile.full_profile = {} - r_f_c2544_profile.get_streams = mock.Mock() - - self.assertIsNone(r_f_c2544_profile.update_traffic_profile(traffic_generator)) - self.assertEqual(r_f_c2544_profile.ports, ports_expected) - - def test_get_drop_percentage(self): - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.params = self.PROFILE - ixia_obj = mock.MagicMock() - r_f_c2544_profile.execute = mock.Mock() - r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock() - r_f_c2544_profile._ixia_traffic_generate = mock.Mock() - r_f_c2544_profile.get_multiplier = mock.Mock() - r_f_c2544_profile.tmp_throughput = 0 - r_f_c2544_profile.tmp_drop = 0 - r_f_c2544_profile.full_profile = {} - 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, - "RxThroughput": 10, - "TxThroughput": 10, - "in_packets": 1000, - "out_packets": 1000} - tol_min = 100.0 - tolerance = 0.0 - self.assertIsNotNone( - r_f_c2544_profile.get_drop_percentage(samples, tol_min, tolerance, - ixia_obj)) - - def test_get_drop_percentage_update(self): - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.params = self.PROFILE - ixia_obj = mock.MagicMock() - r_f_c2544_profile.execute = mock.Mock() - r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock() - r_f_c2544_profile._ixia_traffic_generate = mock.Mock() - r_f_c2544_profile.get_multiplier = mock.Mock() - r_f_c2544_profile.tmp_throughput = 0 - r_f_c2544_profile.tmp_drop = 0 - r_f_c2544_profile.full_profile = {} - 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, - "RxThroughput": 10, - "TxThroughput": 10, - "in_packets": 1000, - "out_packets": 1002} - tol_min = 0.0 - tolerance = 1.0 - self.assertIsNotNone( - r_f_c2544_profile.get_drop_percentage(samples, tol_min, tolerance, - ixia_obj)) - - def test_get_drop_percentage_div_zero(self): - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.params = self.PROFILE - ixia_obj = mock.MagicMock() - r_f_c2544_profile.execute = mock.Mock() - r_f_c2544_profile._get_ixia_traffic_profile = mock.Mock() - r_f_c2544_profile._ixia_traffic_generate = mock.Mock() - r_f_c2544_profile.get_multiplier = mock.Mock() - r_f_c2544_profile.tmp_throughput = 0 - r_f_c2544_profile.tmp_drop = 0 - r_f_c2544_profile.full_profile = {} - 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, - "RxThroughput": 10, - "TxThroughput": 10, - "in_packets": 1000, - "out_packets": 0} - tol_min = 0.0 - tolerance = 0.0 - r_f_c2544_profile.tmp_throughput = 0 - self.assertIsNotNone( - r_f_c2544_profile.get_drop_percentage(samples, tol_min, tolerance, - ixia_obj)) - - def test_get_multiplier(self): - r_f_c2544_profile = IXIARFC2544Profile(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()) - - def test_start_ixia_latency(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.networks = { - "uplink_0": ["xe0"], - "downlink_0": ["xe1"], - } - traffic_generator.client = \ - mock.Mock(return_value=True) - r_f_c2544_profile = IXIARFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.max_rate = 100 - r_f_c2544_profile.min_rate = 100 - ixia_obj = mock.MagicMock() - r_f_c2544_profile._get_ixia_traffic_profile = \ - mock.Mock(return_value={}) - r_f_c2544_profile.full_profile = {} - r_f_c2544_profile._ixia_traffic_generate = mock.Mock() - self.assertIsNone( - r_f_c2544_profile.start_ixia_latency(traffic_generator, ixia_obj)) diff --git a/tests/unit/network_services/traffic_profile/test_prox_acl.py b/tests/unit/network_services/traffic_profile/test_prox_acl.py deleted file mode 100644 index ef5bac0d5..000000000 --- a/tests/unit/network_services/traffic_profile/test_prox_acl.py +++ /dev/null @@ -1,78 +0,0 @@ -# Copyright (c) 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 tests.unit import STL_MOCKS - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.traffic_profile.prox_ACL import ProxACLProfile - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple - - -class TestProxACLProfile(unittest.TestCase): - - def test_run_test_with_pkt_size(self): - def target(*args, **kwargs): - runs.append(args[2]) - if args[2] < 0 or args[2] > 100: - raise RuntimeError(' '.join([str(args), str(runs)])) - if args[2] > 75.0: - return fail_tuple, {} - return success_tuple, {} - - def get_mock_samples(*args, **kwargs): - if args[2] < 0: - raise RuntimeError(' '.join([str(args), str(runs)])) - return success_tuple - - tp_config = { - 'traffic_profile': { - 'upper_bound': 100.0, - 'lower_bound': 0.0, - 'tolerated_loss': 50.0, - 'attempts': 20 - }, - } - - runs = [] - success_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.1, 5.2, 5.3], 995, 1000, 123.4) - fail_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.6, 5.7, 5.8], 850, 1000, 123.4) - - traffic_gen = mock.MagicMock() - - profile_helper = mock.MagicMock() - profile_helper.run_test = target - - profile = ProxACLProfile(tp_config) - profile.init(mock.MagicMock()) - - profile.prox_config["attempts"] = 20 - profile.queue = mock.MagicMock() - profile.tolerated_loss = 50.0 - profile.pkt_size = 128 - profile.duration = 30 - profile.test_value = 100.0 - profile.tolerated_loss = 100.0 - profile._profile_helper = profile_helper - - profile.run_test_with_pkt_size(traffic_gen, profile.pkt_size, profile.duration) diff --git a/tests/unit/network_services/traffic_profile/test_prox_binsearch.py b/tests/unit/network_services/traffic_profile/test_prox_binsearch.py deleted file mode 100644 index 28840ef98..000000000 --- a/tests/unit/network_services/traffic_profile/test_prox_binsearch.py +++ /dev/null @@ -1,185 +0,0 @@ -# Copyright (c) 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 tests.unit import STL_MOCKS - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple - from yardstick.network_services.traffic_profile.prox_binsearch import ProxBinSearchProfile - - -class TestProxBinSearchProfile(unittest.TestCase): - - def test_execute_1(self): - def target(*args, **_): - runs.append(args[2]) - if args[2] < 0 or args[2] > 100: - raise RuntimeError(' '.join([str(args), str(runs)])) - if args[2] > 75.0: - return fail_tuple, {} - return success_tuple, {} - - tp_config = { - 'traffic_profile': { - 'packet_sizes': [200], - 'test_precision': 2.0, - 'tolerated_loss': 0.001, - }, - } - - runs = [] - success_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.1, 5.2, 5.3], 995, 1000, 123.4) - fail_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.6, 5.7, 5.8], 850, 1000, 123.4) - - traffic_generator = mock.MagicMock() - - profile_helper = mock.MagicMock() - profile_helper.run_test = target - - profile = ProxBinSearchProfile(tp_config) - profile.init(mock.MagicMock()) - profile._profile_helper = profile_helper - - profile.execute_traffic(traffic_generator) - self.assertEqual(round(profile.current_lower, 2), 74.69) - self.assertEqual(round(profile.current_upper, 2), 76.09) - self.assertEqual(len(runs), 7) - - # Result Samples inc theor_max - result_tuple = {"Result_Actual_throughput": 7.5e-07, - "Result_theor_max_throughput": 1.234e-10, - "Result_pktSize": 200} - profile.queue.put.assert_called_with(result_tuple) - - success_result_tuple = {"Success_CurrentDropPackets": 0.5, - "Success_DropPackets": 0.5, - "Success_LatencyAvg": 5.3, - "Success_LatencyMax": 5.2, - "Success_LatencyMin": 5.1, - "Success_PktSize": 200, - "Success_RxThroughput": 7.5e-07, - "Success_Throughput": 7.5e-07, - "Success_TxThroughput": 0.00012340000000000002} - - calls = profile.queue.put(success_result_tuple) - profile.queue.put.assert_has_calls(calls) - - success_result_tuple2 = {"Success_CurrentDropPackets": 0.5, - "Success_DropPackets": 0.5, - "Success_LatencyAvg": 5.3, - "Success_LatencyMax": 5.2, - "Success_LatencyMin": 5.1, - "Success_PktSize": 200, - "Success_RxThroughput": 7.5e-07, - "Success_Throughput": 7.5e-07, - "Success_TxThroughput": 123.4, - "Success_can_be_lost": 409600, - "Success_drop_total": 20480, - "Success_rx_total": 4075520, - "Success_tx_total": 4096000} - - calls = profile.queue.put(success_result_tuple2) - profile.queue.put.assert_has_calls(calls) - - def test_execute_2(self): - def target(*args, **_): - runs.append(args[2]) - if args[2] < 0 or args[2] > 100: - raise RuntimeError(' '.join([str(args), str(runs)])) - if args[2] > 25.0: - return fail_tuple, {} - return success_tuple, {} - - tp_config = { - 'traffic_profile': { - 'packet_sizes': [200], - 'test_precision': 2.0, - 'tolerated_loss': 0.001, - }, - } - - runs = [] - success_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.1, 5.2, 5.3], 995, 1000, 123.4) - fail_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.6, 5.7, 5.8], 850, 1000, 123.4) - - traffic_generator = mock.MagicMock() - - profile_helper = mock.MagicMock() - profile_helper.run_test = target - - profile = ProxBinSearchProfile(tp_config) - profile.init(mock.MagicMock()) - profile._profile_helper = profile_helper - - profile.execute_traffic(traffic_generator) - self.assertEqual(round(profile.current_lower, 2), 24.06) - self.assertEqual(round(profile.current_upper, 2), 25.47) - self.assertEqual(len(runs), 7) - - def test_execute_3(self): - def target(*args, **_): - runs.append(args[2]) - if args[2] < 0 or args[2] > 100: - raise RuntimeError(' '.join([str(args), str(runs)])) - if args[2] > 75.0: - return fail_tuple, {} - return success_tuple, {} - - tp_config = { - 'traffic_profile': { - 'packet_sizes': [200], - 'test_precision': 2.0, - 'tolerated_loss': 0.001, - }, - } - - runs = [] - success_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.1, 5.2, 5.3], 995, 1000, 123.4) - fail_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.6, 5.7, 5.8], 850, 1000, 123.4) - - traffic_generator = mock.MagicMock() - - profile_helper = mock.MagicMock() - profile_helper.run_test = target - - profile = ProxBinSearchProfile(tp_config) - profile.init(mock.MagicMock()) - profile._profile_helper = profile_helper - - profile.upper_bound = 100.0 - profile.lower_bound = 99.0 - profile.execute_traffic(traffic_generator) - - - # Result Samples - result_tuple = {"Result_theor_max_throughput": 0, "Result_pktSize": 200} - profile.queue.put.assert_called_with(result_tuple) - - # Check for success_ tuple (None expected) - calls = profile.queue.put.mock_calls - for call in calls: - for call_detail in call[1]: - for k in call_detail: - if "Success_" in k: - self.assertRaises(AttributeError) diff --git a/tests/unit/network_services/traffic_profile/test_prox_profile.py b/tests/unit/network_services/traffic_profile/test_prox_profile.py deleted file mode 100644 index e5b36096f..000000000 --- a/tests/unit/network_services/traffic_profile/test_prox_profile.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright (c) 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 tests.unit import STL_MOCKS - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.traffic_profile.prox_profile import ProxProfile - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper - - -class TestProxProfile(unittest.TestCase): - - def test_sort_vpci(self): - traffic_generator = mock.Mock() - interface_1 = {'virtual-interface': {'vpci': 'id1'}, 'name': 'name1'} - interface_2 = {'virtual-interface': {'vpci': 'id2'}, 'name': 'name2'} - interface_3 = {'virtual-interface': {'vpci': 'id3'}, 'name': 'name3'} - interfaces = [interface_2, interface_3, interface_1] - traffic_generator.vnfd_helper = { - 'vdu': [{'external-interface': interfaces}]} - output = ProxProfile.sort_vpci(traffic_generator) - self.assertEqual([interface_1, interface_2, interface_3], output) - - def test_fill_samples(self): - samples = {} - - traffic_generator = mock.MagicMock() - interfaces = [ - ['id1', 'name1'], - ['id2', 'name2'] - ] - traffic_generator.resource_helper.sut.port_stats.side_effect = [ - list(range(12)), - list(range(10, 22)), - ] - - expected = { - 'name1': { - 'in_packets': 6, - 'out_packets': 7, - }, - 'name2': { - 'in_packets': 16, - 'out_packets': 17, - }, - } - with mock.patch.object(ProxProfile, 'sort_vpci', return_value=interfaces): - ProxProfile.fill_samples(samples, traffic_generator) - - self.assertDictEqual(samples, expected) - - def test_init(self): - tp_config = { - 'traffic_profile': {}, - } - - profile = ProxProfile(tp_config) - queue = mock.Mock() - profile.init(queue) - self.assertIs(profile.queue, queue) - - def test_execute_traffic(self): - packet_sizes = [ - 10, - 100, - 1000, - ] - tp_config = { - 'traffic_profile': { - 'packet_sizes': packet_sizes, - }, - } - - traffic_generator = mock.MagicMock() - - setup_helper = traffic_generator.setup_helper - setup_helper.find_in_section.return_value = None - - prox_resource_helper = ProxResourceHelper(setup_helper) - traffic_generator.resource_helper = prox_resource_helper - - profile = ProxProfile(tp_config) - - self.assertFalse(profile.done) - for _ in packet_sizes: - with self.assertRaises(NotImplementedError): - profile.execute_traffic(traffic_generator) - - self.assertIsNone(profile.execute_traffic(traffic_generator)) - self.assertTrue(profile.done) - - def test_bounds_iterator(self): - tp_config = { - 'traffic_profile': {}, - } - - profile = ProxProfile(tp_config) - value = 0.0 - for value in profile.bounds_iterator(): - pass - - self.assertEqual(value, 100.0) - - mock_logger = mock.MagicMock() - for _ in profile.bounds_iterator(mock_logger): - pass - - self.assertEqual(mock_logger.debug.call_count, 1) - self.assertEqual(mock_logger.info.call_count, 10) diff --git a/tests/unit/network_services/traffic_profile/test_prox_ramp.py b/tests/unit/network_services/traffic_profile/test_prox_ramp.py deleted file mode 100644 index 1acec2f68..000000000 --- a/tests/unit/network_services/traffic_profile/test_prox_ramp.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright (c) 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 tests.unit import STL_MOCKS - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.traffic_profile.prox_ramp import ProxRampProfile - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxProfileHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple - - -class TestProxRampProfile(unittest.TestCase): - - def test_run_test_with_pkt_size(self): - tp_config = { - 'traffic_profile': { - 'lower_bound': 10.0, - 'upper_bound': 100.0, - 'step_value': 10.0, - }, - } - - success_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.1, 5.2, 5.3], 995, 1000, 123.4) - - traffic_gen = mock.MagicMock() - traffic_gen._test_type = 'Generic' - - profile_helper = ProxProfileHelper(traffic_gen.resource_helper) - profile_helper.run_test = run_test = mock.MagicMock(return_value=success_tuple) - - profile = ProxRampProfile(tp_config) - profile.fill_samples = fill_samples = mock.MagicMock() - profile.queue = mock.MagicMock() - profile._profile_helper = profile_helper - - profile.run_test_with_pkt_size(traffic_gen, 128, 30) - self.assertEqual(run_test.call_count, 10) - self.assertEqual(fill_samples.call_count, 10) - - def test_run_test_with_pkt_size_with_fail(self): - tp_config = { - 'traffic_profile': { - 'lower_bound': 10.0, - 'upper_bound': 100.0, - 'step_value': 10.0, - }, - } - - success_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.1, 5.2, 5.3], 995, 1000, 123.4) - fail_tuple = ProxTestDataTuple(10.0, 1, 2, 3, 4, [5.6, 5.7, 5.8], 850, 1000, 123.4) - - result_list = [ - success_tuple, - success_tuple, - success_tuple, - fail_tuple, - success_tuple, - fail_tuple, - fail_tuple, - fail_tuple, - ] - - traffic_gen = mock.MagicMock() - traffic_gen._test_type = 'Generic' - - profile_helper = ProxProfileHelper(traffic_gen.resource_helper) - profile_helper.run_test = run_test = mock.MagicMock(side_effect=result_list) - - profile = ProxRampProfile(tp_config) - profile.fill_samples = fill_samples = mock.MagicMock() - profile.queue = mock.MagicMock() - profile._profile_helper = profile_helper - - profile.run_test_with_pkt_size(traffic_gen, 128, 30) - self.assertEqual(run_test.call_count, 4) - self.assertEqual(fill_samples.call_count, 3) diff --git a/tests/unit/network_services/traffic_profile/test_rfc2544.py b/tests/unit/network_services/traffic_profile/test_rfc2544.py deleted file mode 100644 index cb3a547ee..000000000 --- a/tests/unit/network_services/traffic_profile/test_rfc2544.py +++ /dev/null @@ -1,276 +0,0 @@ -# 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. -# - -import unittest -import mock - -from tests.unit import STL_MOCKS - - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.traffic_profile.trex_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}, - 'downlink_0': {'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, 'count': 1}, - 'outer_l4': {'srcport': '2001', - 'dsrport': '1234', 'count': 1}}}, - 'uplink_0': {'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, 'count': 1}, - 'outer_l4': {'dstport': '2001', - 'srcport': '1234', 'count': 1}}}, - 'schema': 'isb:traffic_profile:0.1'} - - def test___init__(self): - r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) - self.assertIsNotNone(r_f_c2544_profile.rate) - - def test_execute(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.networks = { - "uplink_0": ["xe0"], - "downlink_0": ["xe1"], - } - traffic_generator.client.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.assertIsNone(r_f_c2544_profile.execute_traffic(traffic_generator)) - - def test_get_drop_percentage(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.networks = { - "uplink_0": ["xe0"], - "downlink_0": ["xe1"], - } - traffic_generator.client.return_value = True - - r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.params = self.PROFILE - r_f_c2544_profile.register_generator(traffic_generator) - self.assertIsNone(r_f_c2544_profile.execute_traffic(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, - } - - expected = { - 'DropPercentage': 0.0, - 'RxThroughput': 100 / 3.0, - 'TxThroughput': 100 / 3.0, - 'CurrentDropPercentage': 0.0, - 'Throughput': 66.66666666666667, - 'xe0': { - 'tx_throughput_fps': 20, - 'in_packets': 1000, - 'out_packets': 1000, - 'rx_throughput_mbps': 10, - 'tx_throughput_mbps': 10, - 'rx_throughput_fps': 20, - }, - } - traffic_generator.generate_samples.return_value = samples - traffic_generator.RUN_DURATION = 30 - traffic_generator.rfc2544_helper.tolerance_low = 0.0001 - traffic_generator.rfc2544_helper.tolerance_high = 0.0001 - result = r_f_c2544_profile.get_drop_percentage(traffic_generator) - self.assertDictEqual(result, expected) - - def test_get_drop_percentage_update(self): - traffic_generator = mock.Mock(autospec=RFC2544Profile) - traffic_generator.networks = { - "uplink_0": ["xe0"], - "downlink_0": ["xe1"], - } - 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.register_generator(traffic_generator) - self.assertIsNone(r_f_c2544_profile.execute_traffic()) - - 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, - } - expected = { - 'DropPercentage': 0.1996, - 'RxThroughput': 33.333333333333336, - 'TxThroughput': 33.4, - 'CurrentDropPercentage': 0.1996, - 'Throughput': 66.66666666666667, - 'xe0': { - 'tx_throughput_fps': 20, - 'in_packets': 1000, - 'out_packets': 1002, - 'rx_throughput_mbps': 10, - 'tx_throughput_mbps': 10, - 'rx_throughput_fps': 20, - }, - } - traffic_generator.generate_samples = mock.MagicMock( - return_value=samples) - traffic_generator.RUN_DURATION = 30 - traffic_generator.rfc2544_helper.tolerance_low = 0.0001 - traffic_generator.rfc2544_helper.tolerance_high = 0.0001 - result = r_f_c2544_profile.get_drop_percentage(traffic_generator) - self.assertDictEqual(expected, result) - - def test_get_drop_percentage_div_zero(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.networks = { - "uplink_0": ["xe0"], - "downlink_0": ["xe1"], - } - traffic_generator.client = \ - mock.Mock(return_value=True) - r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.params = self.PROFILE - self.assertIsNone(r_f_c2544_profile.execute_traffic(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} - r_f_c2544_profile.throughput_max = 0 - expected = { - 'DropPercentage': 100.0, 'RxThroughput': 100 / 3.0, - 'TxThroughput': 0.0, 'CurrentDropPercentage': 100.0, - 'Throughput': 66.66666666666667, - 'xe0': { - 'tx_throughput_fps': 20, 'in_packets': 1000, - 'out_packets': 0, 'rx_throughput_mbps': 10, - 'tx_throughput_mbps': 10, 'rx_throughput_fps': 20 - } - } - traffic_generator.generate_samples = mock.Mock(return_value=samples) - traffic_generator.RUN_DURATION = 30 - traffic_generator.rfc2544_helper.tolerance_low = 0.0001 - traffic_generator.rfc2544_helper.tolerance_high = 0.0001 - self.assertDictEqual(expected, - r_f_c2544_profile.get_drop_percentage(traffic_generator)) - - 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()) - - def test_calculate_pps(self): - r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile.rate = 100 - r_f_c2544_profile.pps = 100 - samples = {'Throughput': 4549093.33} - self.assertEqual((2274546.67, 1.0), - r_f_c2544_profile.calculate_pps(samples)) - - def test_create_single_stream(self): - r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile._create_single_packet = mock.MagicMock() - r_f_c2544_profile.pg_id = 1 - self.assertIsNotNone( - r_f_c2544_profile.create_single_stream(64, 2274546.67)) - - def test_create_single_stream_no_pg_id(self): - r_f_c2544_profile = RFC2544Profile(self.TRAFFIC_PROFILE) - r_f_c2544_profile._create_single_packet = mock.MagicMock() - r_f_c2544_profile.pg_id = 0 - self.assertIsNotNone( - r_f_c2544_profile.create_single_stream(64, 2274546.67)) - - def test_execute_latency(self): - traffic_generator = mock.Mock(autospec=TrexProfile) - traffic_generator.networks = { - "private_0": ["xe0"], - "public_0": ["xe1"], - } - 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 - 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} - - samples['Throughput'] = 4549093.33 - r_f_c2544_profile.calculate_pps = mock.Mock(return_value=[2274546.67, - 1.0]) - - self.assertIsNone(r_f_c2544_profile.execute_latency(traffic_generator, - samples)) diff --git a/tests/unit/network_services/traffic_profile/test_trex_traffic_profile.py b/tests/unit/network_services/traffic_profile/test_trex_traffic_profile.py deleted file mode 100644 index d1009a5e8..000000000 --- a/tests/unit/network_services/traffic_profile/test_trex_traffic_profile.py +++ /dev/null @@ -1,309 +0,0 @@ -# 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. - -import ipaddress - -import mock -import six -import unittest - -from tests.unit import STL_MOCKS -from yardstick.common import exceptions as y_exc - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.traffic_profile.base import TrafficProfile - from yardstick.network_services.traffic_profile.trex_traffic_profile import TrexProfile - from yardstick.network_services.traffic_profile.trex_traffic_profile import SRC - from yardstick.network_services.traffic_profile.trex_traffic_profile import DST - from yardstick.network_services.traffic_profile.trex_traffic_profile import ETHERNET - from yardstick.network_services.traffic_profile.trex_traffic_profile import IP - from yardstick.network_services.traffic_profile.trex_traffic_profile import IPv6 - from yardstick.network_services.traffic_profile.trex_traffic_profile import UDP - from yardstick.network_services.traffic_profile.trex_traffic_profile import SRC_PORT - from yardstick.network_services.traffic_profile.trex_traffic_profile import DST_PORT - from yardstick.network_services.traffic_profile.trex_traffic_profile import TYPE_OF_SERVICE - - -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}} - - EXAMPLE_ETHERNET_ADDR = "00:00:00:00:00:01" - EXAMPLE_IP_ADDR = "10.0.0.1" - EXAMPLE_IPv6_ADDR = "0064:ff9b:0:0:0:0:9810:6414" - - PROFILE = { - 'description': 'Traffic profile to run RFC2544 latency', - 'name': 'rfc2544', - 'traffic_profile': {'traffic_type': 'RFC2544Profile', - 'frame_rate': 100}, - TrafficProfile.DOWNLINK: { - '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, - 'count': 1}, - 'outer_l4': {'srcport': '2001', - 'dsrport': '1234', - 'count': 1}}}, - TrafficProfile.UPLINK: { - '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, 'count': 1}, - 'outer_l4': {'dstport': '2001', - 'srcport': '1234', - 'count': 1}}}, - '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}, - TrafficProfile.DOWNLINK: { - '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, - 'count': 1}, - 'outer_l4': {'srcport': '2001', - 'dsrport': '1234', - 'count': 1}}}, - TrafficProfile.UPLINK: { - '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, - 'count': 1}, - 'outer_l4': {'dstport': '2001', - 'srcport': '1234', - 'count': 1}}}, - '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_qinq(self): - qinq = {"S-VLAN": {"id": 128, "priority": 0, "cfi": 0}, - "C-VLAN": {"id": 512, "priority": 0, "cfi": 0}} - - trex_profile = \ - TrexProfile(TrafficProfile) - self.assertIsNone(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.assertIsNone(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[TrafficProfile.UPLINK]['ipv4']['outer_l2'] - outer_l2['QinQ'] = qinq - self.assertIsNone(trex_profile._set_outer_l2_fields(outer_l2)) - - def test__set_outer_l3v4_fields(self): - trex_profile = \ - TrexProfile(TrafficProfile) - outer_l3v4 = self.PROFILE[TrafficProfile.UPLINK]['ipv4']['outer_l3v4'] - outer_l3v4['proto'] = 'tcp' - self.assertIsNone(trex_profile._set_outer_l3v4_fields(outer_l3v4)) - - def test__set_outer_l3v6_fields(self): - trex_profile = \ - TrexProfile(TrafficProfile) - outer_l3v6 = self.PROFILE_v6[TrafficProfile.UPLINK]['ipv6']['outer_l3v4'] - outer_l3v6['proto'] = 'tcp' - outer_l3v6['tc'] = 1 - outer_l3v6['hlim'] = 10 - self.assertIsNone(trex_profile._set_outer_l3v6_fields(outer_l3v6)) - - def test__set_outer_l4_fields(self): - trex_profile = \ - TrexProfile(TrafficProfile) - outer_l4 = self.PROFILE[TrafficProfile.UPLINK]['ipv4']['outer_l4'] - self.assertIsNone(trex_profile._set_outer_l4_fields(outer_l4)) - - def test_get_streams(self): - trex_profile = \ - TrexProfile(TrafficProfile) - trex_profile.params = self.PROFILE - profile_data = self.PROFILE[TrafficProfile.UPLINK] - self.assertIsNotNone(trex_profile.get_streams(profile_data)) - trex_profile.pg_id = 1 - self.assertIsNotNone(trex_profile.get_streams(profile_data)) - trex_profile.params = self.PROFILE_v6 - trex_profile.profile_data = self.PROFILE_v6[TrafficProfile.UPLINK] - self.assertIsNotNone(trex_profile.get_streams(profile_data)) - trex_profile.pg_id = 1 - self.assertIsNotNone(trex_profile.get_streams(profile_data)) - - 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__count_ip_ipv4(self): - start, end, count = TrexProfile._count_ip('1.1.1.1', '1.2.3.4') - self.assertEqual('1.1.1.1', str(start)) - self.assertEqual('1.2.3.4', str(end)) - diff = (int(ipaddress.IPv4Address(six.u('1.2.3.4'))) - - int(ipaddress.IPv4Address(six.u('1.1.1.1')))) - self.assertEqual(diff, count) - - def test__count_ip_ipv6(self): - start_ip = '0064:ff9b:0:0:0:0:9810:6414' - end_ip = '0064:ff9b:0:0:0:0:9810:6420' - start, end, count = TrexProfile._count_ip(start_ip, end_ip) - self.assertEqual(0x98106414, start) - self.assertEqual(0x98106420, end) - self.assertEqual(0x98106420 - 0x98106414, count) - - def test__count_ip_ipv6_exception(self): - start_ip = '0064:ff9b:0:0:0:0:9810:6420' - end_ip = '0064:ff9b:0:0:0:0:9810:6414' - with self.assertRaises(y_exc.IPv6RangeError): - TrexProfile._count_ip(start_ip, end_ip) - - def test__dscp_range_action_partial_actual_count_zero(self): - traffic_profile = TrexProfile(TrafficProfile) - dscp_partial = traffic_profile._dscp_range_action_partial() - - flow_vars_initial_length = len(traffic_profile.vm_flow_vars) - dscp_partial('1', '1', 'unneeded') - self.assertEqual(len(traffic_profile.vm_flow_vars), flow_vars_initial_length + 2) - - def test__dscp_range_action_partial_count_greater_than_actual(self): - traffic_profile = TrexProfile(TrafficProfile) - dscp_partial = traffic_profile._dscp_range_action_partial() - - flow_vars_initial_length = len(traffic_profile.vm_flow_vars) - dscp_partial('1', '10', '100') - self.assertEqual(len(traffic_profile.vm_flow_vars), flow_vars_initial_length + 2) - - def test__udp_range_action_partial_actual_count_zero(self): - traffic_profile = TrexProfile(TrafficProfile) - traffic_profile.udp['field1'] = 'value1' - udp_partial = traffic_profile._udp_range_action_partial('field1') - - flow_vars_initial_length = len(traffic_profile.vm_flow_vars) - udp_partial('1', '1', 'unneeded') - self.assertEqual(len(traffic_profile.vm_flow_vars), flow_vars_initial_length + 2) - - def test__udp_range_action_partial_count_greater_than_actual(self): - traffic_profile = TrexProfile(TrafficProfile) - traffic_profile.udp['field1'] = 'value1' - udp_partial = traffic_profile._udp_range_action_partial('field1', 'not_used_count') - - flow_vars_initial_length = len(traffic_profile.vm_flow_vars) - udp_partial('1', '10', '100') - self.assertEqual(len(traffic_profile.vm_flow_vars), flow_vars_initial_length + 2) - - def test__general_single_action_partial(self): - trex_profile = TrexProfile(TrafficProfile) - - trex_profile._general_single_action_partial(ETHERNET)(SRC)( - self.EXAMPLE_ETHERNET_ADDR) - self.assertEqual(self.EXAMPLE_ETHERNET_ADDR, - trex_profile.ether_packet.src) - - trex_profile._general_single_action_partial(IP)(DST)( - self.EXAMPLE_IP_ADDR) - self.assertEqual(self.EXAMPLE_IP_ADDR, trex_profile.ip_packet.dst) - - trex_profile._general_single_action_partial(IPv6)(DST)( - self.EXAMPLE_IPv6_ADDR) - self.assertEqual(self.EXAMPLE_IPv6_ADDR, trex_profile.ip6_packet.dst) - - trex_profile._general_single_action_partial(UDP)(SRC_PORT)(5060) - self.assertEqual(5060, trex_profile.udp_packet.sport) - - trex_profile._general_single_action_partial(IP)(TYPE_OF_SERVICE)(0) - self.assertEqual(0, trex_profile.ip_packet.tos) - - def test__set_proto_addr(self): - trex_profile = TrexProfile(TrafficProfile) - - ether_range = "00:00:00:00:00:01-00:00:00:00:00:02" - ip_range = "1.1.1.2-1.1.1.10" - ipv6_range = '0064:ff9b:0:0:0:0:9810:6414-0064:ff9b:0:0:0:0:9810:6420' - - trex_profile._set_proto_addr(ETHERNET, SRC, ether_range) - trex_profile._set_proto_addr(ETHERNET, DST, ether_range) - trex_profile._set_proto_addr(IP, SRC, ip_range) - trex_profile._set_proto_addr(IP, DST, ip_range) - trex_profile._set_proto_addr(IPv6, SRC, ipv6_range) - trex_profile._set_proto_addr(IPv6, DST, ipv6_range) - trex_profile._set_proto_addr(UDP, SRC_PORT, "5060-5090") - trex_profile._set_proto_addr(UDP, DST_PORT, "5060") diff --git a/tests/unit/network_services/vnf_generic/__init__.py b/tests/unit/network_services/vnf_generic/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/network_services/vnf_generic/__init__.py +++ /dev/null diff --git a/tests/unit/network_services/vnf_generic/test_vnfdgen.py b/tests/unit/network_services/vnf_generic/test_vnfdgen.py deleted file mode 100644 index 2ab14129b..000000000 --- a/tests/unit/network_services/vnf_generic/test_vnfdgen.py +++ /dev/null @@ -1,279 +0,0 @@ -# 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. -# - -# Unittest for yardstick.network_services.vnf_generic.vnfdgen - -from __future__ import absolute_import -import unittest -from six.moves import range - -from yardstick.common.yaml_loader import yaml_load -from yardstick.network_services.vnf_generic import vnfdgen - - -UPLINK = "uplink" -DOWNLINK = "downlink" - -TREX_VNFD_TEMPLATE = """ -vnfd:vnfd-catalog: - vnfd: - - id: TrexTrafficGen # ISB class mapping - name: trexgen - short-name: trexgen - description: TRex stateless traffic generator for RFC2544 - mgmt-interface: - vdu-id: trexgen-baremetal - user: {{user}} # Value filled by vnfdgen - password: {{password}} # Value filled by vnfdgen - ip: {{ip}} # Value filled by vnfdgen - connection-point: - - name: xe0 - type: VPORT - - name: xe1 - type: VPORT - vdu: - - id: trexgen-baremetal - name: trexgen-baremetal - description: TRex stateless traffic generator for RFC2544 - external-interface: - - name: xe0 - virtual-interface: - type: PCI-PASSTHROUGH - vpci: '{{ interfaces.xe0.vpci}}' - local_ip: '{{ interfaces.xe0.local_ip }}' - dst_ip: '{{ interfaces.xe0.dst_ip }}' - local_mac: '{{ interfaces.xe0.local_mac }}' - dst_mac: '{{ interfaces.xe0.dst_mac }}' - bandwidth: 10 Gbps - vnfd-connection-point-ref: xe0 - - name: xe1 - virtual-interface: - type: PCI-PASSTHROUGH - vpci: '{{ interfaces.xe1.vpci }}' - local_ip: '{{ interfaces.xe1.local_ip }}' - dst_ip: '{{ interfaces.xe1.dst_ip }}' - local_mac: '{{ interfaces.xe1.local_mac }}' - dst_mac: '{{ interfaces.xe1.dst_mac }}' - bandwidth: 10 Gbps - vnfd-connection-point-ref: xe1 - routing_table: {{ routing_table }} - nd_route_tbl: {{ nd_route_tbl }} - - benchmark: - kpi: - - rx_throughput_fps - - tx_throughput_fps - - tx_throughput_mbps - - rx_throughput_mbps - - tx_throughput_pc_linerate - - rx_throughput_pc_linerate - - min_latency - - max_latency - - avg_latency -""" - -COMPLETE_TREX_VNFD = \ - {'vnfd:vnfd-catalog': - {'vnfd': - [{'benchmark': - {'kpi': - ['rx_throughput_fps', - 'tx_throughput_fps', - 'tx_throughput_mbps', - 'rx_throughput_mbps', - 'tx_throughput_pc_linerate', - 'rx_throughput_pc_linerate', - 'min_latency', - 'max_latency', - 'avg_latency']}, - 'connection-point': [{'name': 'xe0', - 'type': 'VPORT'}, - {'name': 'xe1', - 'type': 'VPORT'}], - 'description': 'TRex stateless traffic generator for RFC2544', - 'id': 'TrexTrafficGen', - 'mgmt-interface': {'ip': '1.1.1.1', - 'password': 'berta', - 'user': 'berta', - 'vdu-id': 'trexgen-baremetal'}, - 'name': 'trexgen', - 'short-name': 'trexgen', - 'vdu': [{'description': 'TRex stateless traffic generator for RFC2544', - 'external-interface': - [{'name': 'xe0', - 'virtual-interface': {'bandwidth': '10 Gbps', - 'dst_ip': '1.1.1.1', - 'dst_mac': '00:01:02:03:04:05', - 'local_ip': '1.1.1.2', - 'local_mac': '00:01:02:03:05:05', - 'type': 'PCI-PASSTHROUGH', - 'vpci': '0000:00:10.2'}, - 'vnfd-connection-point-ref': 'xe0'}, - {'name': 'xe1', - 'virtual-interface': {'bandwidth': '10 Gbps', - 'dst_ip': '2.1.1.1', - 'dst_mac': '00:01:02:03:04:06', - 'local_ip': '2.1.1.2', - 'local_mac': '00:01:02:03:05:06', - 'type': 'PCI-PASSTHROUGH', - 'vpci': '0000:00:10.1'}, - 'vnfd-connection-point-ref': 'xe1'}], - 'id': 'trexgen-baremetal', - 'nd_route_tbl': [{'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - 'netmask': '112', - 'network': '0064:ff9b:0:0:0:0:9810:6414'}, - {'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - 'netmask': '112', - 'network': '0064:ff9b:0:0:0:0:9810:2814'}], - 'routing_table': [{'gateway': '152.16.100.20', - 'if': 'xe0', - 'netmask': '255.255.255.0', - 'network': '152.16.100.20'}, - {'gateway': '152.16.40.20', - 'if': 'xe1', - 'netmask': '255.255.255.0', - 'network': '152.16.40.20'}], - 'name': 'trexgen-baremetal'}]}]}} - -NODE_CFG = {'ip': '1.1.1.1', - 'name': 'demeter', - 'password': 'berta', - 'role': 'TrafficGen', - 'user': 'berta', - 'interfaces': {'xe0': {'dpdk_port_num': 1, - 'dst_ip': '1.1.1.1', - 'dst_mac': '00:01:02:03:04:05', - 'local_ip': '1.1.1.2', - 'local_mac': '00:01:02:03:05:05', - 'vpci': '0000:00:10.2'}, - 'xe1': {'dpdk_port_num': 0, - 'dst_ip': '2.1.1.1', - 'dst_mac': '00:01:02:03:04:06', - 'local_ip': '2.1.1.2', - 'local_mac': '00:01:02:03:05:06', - 'vpci': '0000:00:10.1'}}, - 'nd_route_tbl': [{u'gateway': u'0064:ff9b:0:0:0:0:9810:6414', - u'if': u'xe0', - u'netmask': u'112', - u'network': u'0064:ff9b:0:0:0:0:9810:6414'}, - {u'gateway': u'0064:ff9b:0:0:0:0:9810:2814', - u'if': u'xe1', - u'netmask': u'112', - u'network': u'0064:ff9b:0:0:0:0:9810:2814'}], - 'routing_table': [{u'gateway': u'152.16.100.20', - u'if': u'xe0', - u'netmask': u'255.255.255.0', - u'network': u'152.16.100.20'}, - {u'gateway': u'152.16.40.20', - u'if': u'xe1', - u'netmask': u'255.255.255.0', - u'network': u'152.16.40.20'}], - } - - -# need to template, but can't use {} so use %s -TRAFFIC_PROFILE_TPL = """ -%(0)s: - - ipv4: - outer_l2: - framesize: - 64B: "{{ get(imix, '%(0)s.imix_small', 10) }}" - 128B: "{{ get(imix, '%(0)s.imix_128B', 10) }}" - 256B: "{{ get(imix, '%(0)s.imix_256B', 10) }}" - 373B: "{{ get(imix, '%(0)s.imix_373B', 10) }}" - 570B: "{{get(imix, '%(0)s.imix_570B', 10) }}" - 1400B: "{{get(imix, '%(0)s.imix_1400B', 10) }}" - 1518B: "{{get(imix, '%(0)s.imix_1500B', 40) }}" -""" % {"0": UPLINK} - -TRAFFIC_PROFILE = { - UPLINK: [{"ipv4": {"outer_l2": - {"framesize": {"64B": '10', "128B": '10', - "256B": '10', "373B": '10', - "570B": '10', "1400B": '10', - "1518B": '40'}}}}]} - - -class TestRender(unittest.TestCase): - - def test_render_none(self): - - tmpl = "{{ routing_table }}" - self.assertEqual(vnfdgen.render(tmpl, routing_table=None), u'~') - self.assertEqual(yaml_load(vnfdgen.render(tmpl, routing_table=None)), None) - - def test_render_unicode_dict(self): - - tmpl = "{{ routing_table }}" - self.assertEqual(yaml_load(vnfdgen.render(tmpl, **NODE_CFG)), NODE_CFG["routing_table"]) - - -class TestVnfdGen(unittest.TestCase): - """ Class to verify VNFS testcases """ - - def test_generate_vnfd(self): - """ Function to verify vnfd generation based on template """ - self.maxDiff = None - generated_vnfd = vnfdgen.generate_vnfd(TREX_VNFD_TEMPLATE, NODE_CFG) - self.assertDictEqual(COMPLETE_TREX_VNFD, generated_vnfd) - - def test_generate_tp_no_vars(self): - """ Function to verify traffic profile generation without imix """ - - self.maxDiff = None - generated_tp = vnfdgen.generate_vnfd(TRAFFIC_PROFILE_TPL, {"imix": {}}) - self.assertDictEqual(TRAFFIC_PROFILE, generated_tp) - - def test_deepgetitem(self): - d = {'a': 1, 'b': 2} - self.assertEqual(vnfdgen.deepgetitem(d, "a"), 1) - - def test_dict_flatten_int(self): - d = {'a': 1, 'b': 2} - self.assertEqual(vnfdgen.deepgetitem(d, "a"), 1) - - def test_dict_flatten_str_int_key_first(self): - d = {'0': 1, 0: 24, 'b': 2} - self.assertEqual(vnfdgen.deepgetitem(d, "0"), 1) - - def test_dict_flatten_int_key_fallback(self): - d = {0: 1, 'b': 2} - self.assertEqual(vnfdgen.deepgetitem(d, "0"), 1) - - def test_dict_flatten_list(self): - d = {'a': 1, 'b': list(range(2))} - self.assertEqual(vnfdgen.deepgetitem(d, "b.0"), 0) - - def test_dict_flatten_dict(self): - d = {'a': 1, 'b': {x: x for x in list(range(2))}} - self.assertEqual(vnfdgen.deepgetitem(d, "b.0"), 0) - - def test_dict_flatten_only_str_key(self): - d = {'0': 1, 0: 24, 'b': 2} - self.assertRaises(AttributeError, vnfdgen.deepgetitem, d, 0) - - - def test_generate_tp_single_var(self): - """ Function to verify traffic profile generation with imix """ - - generated_tp = \ - vnfdgen.generate_vnfd(TRAFFIC_PROFILE_TPL, - {"imix": {UPLINK: {"imix_small": '20'}}}) - self.maxDiff = None - tp2 = dict(TRAFFIC_PROFILE) - tp2[UPLINK][0]["ipv4"]["outer_l2"]["framesize"]["64B"] = '20' - self.assertDictEqual(tp2, generated_tp) diff --git a/tests/unit/network_services/vnf_generic/vnf/__init__.py b/tests/unit/network_services/vnf_generic/vnf/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/__init__.py +++ /dev/null diff --git a/tests/unit/network_services/vnf_generic/vnf/acl_1rule.yaml b/tests/unit/network_services/vnf_generic/vnf/acl_1rule.yaml deleted file mode 100644 index b184a29e2..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/acl_1rule.yaml +++ /dev/null @@ -1,47 +0,0 @@ -# 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. - -access-list1: - acl: - access-list-entries: - - ace: - ace-oper-data: - match-counter: 0 - actions: drop,count - matches: - destination-ipv4-network: 152.16.40.20/24 - destination-port-range: - lower-port: 0 - upper-port: 65535 - source-ipv4-network: 0.0.0.0/0 - source-port-range: - lower-port: 0 - upper-port: 65535 - rule-name: rule1588 - - ace: - ace-oper-data: - match-counter: 0 - actions: drop,count - matches: - destination-ipv4-network: 0.0.0.0/0 - destination-port-range: - lower-port: 0 - upper-port: 65535 - source-ipv4-network: 152.16.100.20/24 - source-port-range: - lower-port: 0 - upper-port: 65535 - rule-name: rule1589 - acl-name: sample-ipv4-acl - acl-type: ipv4-acl diff --git a/tests/unit/network_services/vnf_generic/vnf/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml b/tests/unit/network_services/vnf_generic/vnf/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml deleted file mode 100644 index fb1be35c1..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/tc_baremetal_rfc2544_ipv4_1flow_64B.yaml +++ /dev/null @@ -1,41 +0,0 @@ -# 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. - ---- -schema: yardstick:task:0.1 -scenarios: -- type: NSPerf - traffic_profile: "../../traffic_profiles/ipv4_throughput_vpe.yaml" - topology: vpe_vnf_topology.yaml - nodes: - tg__1: trafficgen_1.yardstick - vnf__1: vnf.yardstick - tc_options: - rfc2544: - allowed_drop_rate: 0.8 - 1 - vnf_options: - vpe: - cfg: vpe_config - runner: - type: Duration - duration: 400 - interval: 35 - traffic_options: - flow: "../../traffic_profiles/ipv4_1flow_Packets_vpe.yaml" - imix: "../../traffic_profiles/imix_voice.yaml" -context: - type: Node - name: yardstick - nfvi_type: baremetal - file: /etc/yardstick/nodes/pod.yaml diff --git a/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py deleted file mode 100644 index 2971b55eb..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py +++ /dev/null @@ -1,347 +0,0 @@ -# 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. -# - -import unittest -import mock -import os - -from tests.unit import STL_MOCKS -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh -from yardstick.common import utils - - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.acl_vnf import AclApproxVnf - from yardstick.network_services.nfvi.resource import ResourceProfile - - -TEST_FILE_YAML = 'nsb_test_case.yaml' -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' - - -name = 'vnf__1' - - -@mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Process") -class TestAclApproxVnf(unittest.TestCase): - VNFD = {'vnfd:vnfd-catalog': - {'vnfd': - [{'short-name': 'VpeVnf', - 'vdu': - [{'routing_table': - [{'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0'}, - {'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1'}], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': - [{'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'id': 'vpevnf-baremetal', - 'external-interface': - [{'virtual-interface': - {'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}]}], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': - {'vdu-id': 'vpevnf-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'AclApproxVnf', 'name': 'VPEVnfSsh'}]}} - - scenario_cfg = {'options': {'packetsize': 64, 'traffic_type': 4, - 'rfc2544': {'allowed_drop_rate': '0.8 - 1'}, - 'vnf__1': {'rules': 'acl_1rule.yaml', - 'vnf_config': {'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': - '1C/1T', - 'worker_threads': 1}} - }, - 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7', - 'task_path': '/tmp', - 'tc': 'tc_ipv4_1Mflow_64B_packetsize', - 'runner': {'object': 'NetworkServiceTestCase', - 'interval': 35, - 'output_filename': '/tmp/yardstick.out', - 'runner_id': 74476, 'duration': 400, - 'type': 'Duration'}, - 'traffic_profile': 'ipv4_throughput_acl.yaml', - 'traffic_options': {'flow': 'ipv4_Packets_acl.yaml', - 'imix': 'imix_voice.yaml'}, - 'type': 'ISB', - 'nodes': {'tg__2': 'trafficgen_2.yardstick', - 'tg__1': 'trafficgen_1.yardstick', - 'vnf__1': 'vnf.yardstick'}, - 'topology': 'vpe-tg-topology-baremetal.yaml'} - - context_cfg = {'nodes': {'tg__2': - {'member-vnf-index': '3', - 'role': 'TrafficGen', - 'name': 'trafficgen_2.yardstick', - 'vnfd-id-ref': 'tg__2', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens513f0', - 'vld_id': AclApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.20', - 'dst_mac': '00:00:00:00:00:01', - 'local_mac': '00:00:00:00:00:03', - 'dst_ip': '152.16.40.19', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens513f1', - 'netmask': '255.255.255.0', - 'network': '202.16.100.0', - 'local_ip': '202.16.100.20', - 'local_mac': '00:1e:67:d0:60:5d', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.1', - 'dpdk_port_num': 1}}, - 'password': 'r00t', - 'VNF model': 'l3fwd_vnf.yaml', - 'user': 'root'}, - 'tg__1': - {'member-vnf-index': '1', - 'role': 'TrafficGen', - 'name': 'trafficgen_1.yardstick', - 'vnfd-id-ref': 'tg__1', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens785f0', - 'vld_id': AclApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.20', - 'dst_mac': '00:00:00:00:00:02', - 'local_mac': '00:00:00:00:00:04', - 'dst_ip': '152.16.100.19', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens785f1', - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.21', - 'local_mac': '00:00:00:00:00:01', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1}}, - 'password': 'r00t', - 'VNF model': 'tg_rfc2544_tpl.yaml', - 'user': 'root'}, - 'vnf__1': - {'name': 'vnf.yardstick', - 'vnfd-id-ref': 'vnf__1', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens786f0', - 'vld_id': AclApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.19', - 'dst_mac': '00:00:00:00:00:04', - 'local_mac': '00:00:00:00:00:02', - 'dst_ip': '152.16.100.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens786f1', - 'vld_id': AclApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.19', - 'dst_mac': '00:00:00:00:00:03', - 'local_mac': '00:00:00:00:00:01', - 'dst_ip': '152.16.40.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1}}, - 'routing_table': - [{'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'network': '152.16.100.20', - 'if': 'xe0'}, - {'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'network': '152.16.40.20', - 'if': 'xe1'}], - 'member-vnf-index': '2', - 'host': '1.2.1.1', - 'role': 'vnf', - 'user': 'root', - 'nd_route_tbl': - [{'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'password': 'r00t', - 'VNF model': 'acl_vnf.yaml'}}} - - def test___init__(self, *args): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - acl_approx_vnf = AclApproxVnf(name, vnfd) - self.assertIsNone(acl_approx_vnf._vnf_process) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - acl_approx_vnf = AclApproxVnf(name, vnfd) - acl_approx_vnf.q_in = mock.MagicMock() - acl_approx_vnf.q_out = mock.MagicMock() - acl_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - acl_approx_vnf.resource = mock.Mock(autospec=ResourceProfile) - acl_approx_vnf.vnf_execute = mock.Mock(return_value="") - result = {'packets_dropped': 0, 'packets_fwd': 0, 'packets_in': 0} - self.assertEqual(result, acl_approx_vnf.collect_kpi()) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test_vnf_execute_command(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - acl_approx_vnf = AclApproxVnf(name, vnfd) - acl_approx_vnf.q_in = mock.MagicMock() - acl_approx_vnf.q_out = mock.MagicMock() - acl_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - cmd = "quit" - self.assertEqual("", acl_approx_vnf.vnf_execute(cmd)) - - @mock.patch(SSH_HELPER) - def test_get_stats(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - acl_approx_vnf = AclApproxVnf(name, vnfd) - acl_approx_vnf.q_in = mock.MagicMock() - acl_approx_vnf.q_out = mock.MagicMock() - acl_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - result = "ACL TOTAL: pkts_processed: 100, pkts_drop: 0, spkts_received: 100" - acl_approx_vnf.vnf_execute = mock.Mock(return_value=result) - self.assertEqual(result, acl_approx_vnf.get_stats()) - - def _get_file_abspath(self, filename): - curr_path = os.path.dirname(os.path.abspath(__file__)) - file_path = os.path.join(curr_path, filename) - return file_path - - @mock.patch("yardstick.network_services.vnf_generic.vnf.acl_vnf.hex") - @mock.patch("yardstick.network_services.vnf_generic.vnf.acl_vnf.eval") - @mock.patch('yardstick.network_services.vnf_generic.vnf.acl_vnf.open') - @mock.patch(SSH_HELPER) - def test_run_acl(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - acl_approx_vnf = AclApproxVnf(name, vnfd) - acl_approx_vnf._build_config = mock.MagicMock() - acl_approx_vnf.queue_wrapper = mock.MagicMock() - acl_approx_vnf.scenario_helper.scenario_cfg = self.scenario_cfg - acl_approx_vnf.vnf_cfg = {'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': '1C/1T', - 'worker_threads': 1} - acl_approx_vnf.all_options = {'traffic_type': '4', - 'topology': 'nsb_test_case.yaml'} - acl_approx_vnf._run() - acl_approx_vnf.ssh_helper.run.assert_called_once() - - @mock.patch("yardstick.network_services.vnf_generic.vnf.acl_vnf.YangModel") - @mock.patch.object(utils, 'find_relative_file') - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") - @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - acl_approx_vnf = AclApproxVnf(name, vnfd) - acl_approx_vnf.deploy_helper = mock.MagicMock() - acl_approx_vnf.resource_helper = mock.MagicMock() - acl_approx_vnf._build_config = mock.MagicMock() - self.scenario_cfg['vnf_options'] = {'acl': {'cfg': "", - 'rules': ""}} - acl_approx_vnf.q_out.put("pipeline>") - acl_approx_vnf.WAIT_TIME = 0 - self.scenario_cfg.update({"nodes": {"vnf__1": ""}}) - self.assertIsNone(acl_approx_vnf.instantiate(self.scenario_cfg, - self.context_cfg)) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - acl_approx_vnf = AclApproxVnf(name, vnfd) - acl_approx_vnf._vnf_process = mock.MagicMock() - acl_approx_vnf._vnf_process.terminate = mock.Mock() - acl_approx_vnf.used_drivers = {"01:01.0": "i40e", - "01:01.1": "i40e"} - acl_approx_vnf.vnf_execute = mock.MagicMock() - acl_approx_vnf.dpdk_devbind = "dpdk-devbind.py" - acl_approx_vnf._resource_collect_stop = mock.Mock() - self.assertIsNone(acl_approx_vnf.terminate()) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_base.py b/tests/unit/network_services/vnf_generic/vnf/test_base.py deleted file mode 100644 index 9ef6473f0..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_base.py +++ /dev/null @@ -1,238 +0,0 @@ -# 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. -# - -# Unittest for yardstick.network_services.vnf_generic.vnf.test_base - -import multiprocessing -import os - -import mock -import unittest - -from yardstick.network_services.vnf_generic.vnf import base -from yardstick.ssh import SSH - - -IP_PIPELINE_CFG_FILE_TPL = ("arp_route_tbl = ({port0_local_ip_hex}," - "{port0_netmask_hex},1,{port1_local_ip_hex}) " - "({port1_local_ip_hex},{port1_netmask_hex},0," - "{port0_local_ip_hex})") - -IP_PIPELINE_ND_CFG_FILE_TPL = """ -nd_route_tbl = ({port1_dst_ip_hex6},""" -"""{port1_dst_netmask_hex6},1,{port1_dst_ip_hex6})""" - -_LOCAL_OBJECT = object() - -VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01' - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02' - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' -} - -VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ] - } -} - - -class FileAbsPath(object): - def __init__(self, module_file): - super(FileAbsPath, self).__init__() - self.module_path = os.path.dirname(os.path.abspath(module_file)) - - def get_path(self, filename): - file_path = os.path.join(self.module_path, filename) - return file_path - - -def mock_ssh(mock_ssh_type, spec=None, exec_result=_LOCAL_OBJECT, run_result=_LOCAL_OBJECT): - if spec is None: - spec = SSH - - if exec_result is _LOCAL_OBJECT: - exec_result = 0, "", "" - - if run_result is _LOCAL_OBJECT: - run_result = 0, "", "" - - mock_ssh_instance = mock.Mock(autospec=spec) - mock_ssh_instance._get_client.return_value = mock.Mock() - mock_ssh_instance.execute.return_value = exec_result - mock_ssh_instance.run.return_value = run_result - mock_ssh_type.from_node.return_value = mock_ssh_instance - return mock_ssh_instance - - -class TestQueueFileWrapper(unittest.TestCase): - def setUp(self): - self.prompt = "pipeline>" - self.q_in = multiprocessing.Queue() - self.q_out = multiprocessing.Queue() - - def test___init__(self): - queue_file_wrapper = \ - base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) - self.assertEqual(queue_file_wrapper.prompt, self.prompt) - - def test_clear(self): - queue_file_wrapper = \ - base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) - queue_file_wrapper.bufsize = 5 - queue_file_wrapper.write("pipeline>") - queue_file_wrapper.close() - self.assertIsNone(queue_file_wrapper.clear()) - self.assertIsNotNone(queue_file_wrapper.q_out.empty()) - - def test_close(self): - queue_file_wrapper = \ - base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) - self.assertIsNone(queue_file_wrapper.close()) - - def test_read(self): - queue_file_wrapper = \ - base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) - queue_file_wrapper.q_in.put("pipeline>") - self.assertEqual("pipeline>", queue_file_wrapper.read(20)) - - def test_write(self): - queue_file_wrapper = \ - base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) - queue_file_wrapper.write("pipeline>") - self.assertIsNotNone(queue_file_wrapper.q_out.empty()) - - -class TestGenericVNF(unittest.TestCase): - - def test_definition(self): - """Make sure that the abstract class cannot be instantiated""" - with self.assertRaises(TypeError) as exc: - # pylint: disable=abstract-class-instantiated - base.GenericVNF('vnf1', VNFD['vnfd:vnfd-catalog']['vnfd'][0]) - - msg = ("Can't instantiate abstract class GenericVNF with abstract methods " - "collect_kpi, instantiate, scale, start_collect, " - "stop_collect, terminate, wait_for_instantiate") - - self.assertEqual(msg, str(exc.exception)) - - -class TestGenericTrafficGen(unittest.TestCase): - - def test_definition(self): - """Make sure that the abstract class cannot be instantiated""" - vnfd = VNFD['vnfd:vnfd-catalog']['vnfd'][0] - name = 'vnf1' - with self.assertRaises(TypeError) as exc: - # pylint: disable=abstract-class-instantiated - base.GenericTrafficGen(name, vnfd) - msg = ("Can't instantiate abstract class GenericTrafficGen with " - "abstract methods collect_kpi, instantiate, run_traffic, " - "scale, terminate") - self.assertEqual(msg, str(exc.exception)) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py deleted file mode 100644 index edaa0ad7e..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py +++ /dev/null @@ -1,419 +0,0 @@ -# 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 copy import deepcopy -import os -import unittest -import mock - -from tests.unit import STL_MOCKS -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh - - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.cgnapt_vnf import CgnaptApproxVnf, \ - CgnaptApproxSetupEnvHelper - from yardstick.network_services.vnf_generic.vnf import cgnapt_vnf - from yardstick.network_services.nfvi.resource import ResourceProfile - -TEST_FILE_YAML = 'nsb_test_case.yaml' -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' - - -name = 'vnf__0' - - -class TestCgnaptApproxSetupEnvHelper(unittest.TestCase): - - def test__generate_ip_from_pool(self): - - ip = CgnaptApproxSetupEnvHelper._generate_ip_from_pool("1.2.3.4") - self.assertEqual(next(ip), '1.2.3.4') - self.assertEqual(next(ip), '1.2.4.4') - self.assertEqual(next(ip), '1.2.5.4') - - def test__update_cgnat_script_file(self): - - sample = """\ -# See the License for the specific language governing permissions and -# limitations under the License. - -link 0 down -link 0 config {port0_local_ip} {port0_prefixlen} -link 0 up -link 1 down -link 1 config {port1_local_ip} {port1_prefixlen} -link 1 up -""" - header = "This is a header" - - out = CgnaptApproxSetupEnvHelper._update_cgnat_script_file(header, sample.splitlines()) - self.assertNotIn("This is a header", out) - - def test__get_cgnapt_config(self): - vnfd_helper = mock.MagicMock() - vnfd_helper.port_pairs.uplink_ports = [{"name": 'a'}, {"name": "b"}, {"name": "c"}] - - helper = CgnaptApproxSetupEnvHelper(vnfd_helper, mock.Mock(), mock.Mock()) - result = helper._get_cgnapt_config() - self.assertIsNotNone(result) - - def test_scale(self): - helper = CgnaptApproxSetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock()) - with self.assertRaises(NotImplementedError): - helper.scale() - - -@mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Process") -class TestCgnaptApproxVnf(unittest.TestCase): - VNFD = {'vnfd:vnfd-catalog': - {'vnfd': - [{'short-name': 'VpeVnf', - 'vdu': - [{'routing_table': - [{'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0'}, - {'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1'}], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': - [{'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'id': 'vpevnf-baremetal', - 'external-interface': - [{'virtual-interface': - {'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}]}], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': - {'vdu-id': 'vpevnf-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'CgnaptApproxVnf', 'name': 'VPEVnfSsh'}]}} - - SCENARIO_CFG = { - 'options': { - 'packetsize': 64, - 'traffic_type': 4, - 'rfc2544': { - 'allowed_drop_rate': '0.8 - 1', - }, - 'vnf__0': { - 'napt': 'dynamic', - 'vnf_config': { - 'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': - '1C/1T', - 'worker_threads': 1, - }, - }, - 'flow': {'count': 1, - 'dst_ip': [{'tg__1': 'xe0'}], - 'public_ip': [''], - 'src_ip': [{'tg__0': 'xe0'}]}, - }, - 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7', - 'task_path': '/tmp', - 'tc': 'tc_ipv4_1Mflow_64B_packetsize', - 'runner': { - 'object': 'NetworkServiceTestCase', - 'interval': 35, - 'output_filename': '/tmp/yardstick.out', - 'runner_id': 74476, - 'duration': 400, - 'type': 'Duration', - }, - 'traffic_profile': 'ipv4_throughput_acl.yaml', - 'type': 'NSPerf', - 'nodes': { - 'tg__1': 'trafficgen_1.yardstick', - 'tg__0': 'trafficgen_0.yardstick', - 'vnf__0': 'vnf.yardstick', - }, - 'topology': 'vpe-tg-topology-baremetal.yaml', - } - - context_cfg = {'nodes': {'tg__2': - {'member-vnf-index': '3', - 'role': 'TrafficGen', - 'name': 'trafficgen_2.yardstick', - 'vnfd-id-ref': 'tg__2', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens513f0', - 'vld_id': CgnaptApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.20', - 'dst_mac': '00:00:00:00:00:01', - 'local_mac': '00:00:00:00:00:03', - 'dst_ip': '152.16.40.19', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens513f1', - 'netmask': '255.255.255.0', - 'network': '202.16.100.0', - 'local_ip': '202.16.100.20', - 'local_mac': '00:1e:67:d0:60:5d', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.1', - 'dpdk_port_num': 1}}, - 'password': 'r00t', - 'VNF model': 'l3fwd_vnf.yaml', - 'user': 'root'}, - 'tg__1': - {'member-vnf-index': '1', - 'role': 'TrafficGen', - 'name': 'trafficgen_1.yardstick', - 'vnfd-id-ref': 'tg__1', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens785f0', - 'vld_id': CgnaptApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.20', - 'dst_mac': '00:00:00:00:00:02', - 'local_mac': '00:00:00:00:00:04', - 'dst_ip': '152.16.100.19', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens785f1', - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.21', - 'local_mac': '00:00:00:00:00:01', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1}}, - 'password': 'r00t', - 'VNF model': 'tg_rfc2544_tpl.yaml', - 'user': 'root'}, - 'vnf__0': - {'name': 'vnf.yardstick', - 'vnfd-id-ref': 'vnf__0', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens786f0', - 'vld_id': CgnaptApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.19', - 'dst_mac': '00:00:00:00:00:04', - 'local_mac': '00:00:00:00:00:02', - 'dst_ip': '152.16.100.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens786f1', - 'vld_id': CgnaptApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.19', - 'dst_mac': '00:00:00:00:00:03', - 'local_mac': '00:00:00:00:00:01', - 'dst_ip': '152.16.40.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1}}, - 'routing_table': - [{'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'network': '152.16.100.20', - 'if': 'xe0'}, - {'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'network': '152.16.40.20', - 'if': 'xe1'}], - 'member-vnf-index': '2', - 'host': '1.2.1.1', - 'role': 'vnf', - 'user': 'root', - 'nd_route_tbl': - [{'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'password': 'r00t', - 'VNF model': 'cgnapt_vnf.yaml'}}} - - def setUp(self): - self.scenario_cfg = deepcopy(self.SCENARIO_CFG) - - def test___init__(self, *args): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) - self.assertIsNone(cgnapt_approx_vnf._vnf_process) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') - @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) - cgnapt_approx_vnf._vnf_process = mock.MagicMock( - **{"is_alive.return_value": True, "exitcode": None}) - cgnapt_approx_vnf.q_in = mock.MagicMock() - cgnapt_approx_vnf.q_out = mock.MagicMock() - cgnapt_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - cgnapt_approx_vnf.resource = mock.Mock(autospec=ResourceProfile) - result = {'packets_dropped': 0, 'packets_fwd': 0, 'packets_in': 0} - self.assertEqual(result, cgnapt_approx_vnf.collect_kpi()) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') - @mock.patch(SSH_HELPER) - def test_vnf_execute_command(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) - cgnapt_approx_vnf.q_in = mock.MagicMock() - cgnapt_approx_vnf.q_out = mock.MagicMock() - cgnapt_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - cmd = "quit" - self.assertEqual("", cgnapt_approx_vnf.vnf_execute(cmd)) - - @mock.patch(SSH_HELPER) - def test_get_stats(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) - cgnapt_approx_vnf.q_in = mock.MagicMock() - cgnapt_approx_vnf.q_out = mock.MagicMock() - cgnapt_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - result = \ - "CG-NAPT(.*\n)*Received 100, Missed 0, Dropped 0,Translated 100,ingress" - cgnapt_approx_vnf.vnf_execute = mock.Mock(return_value=result) - self.assertListEqual(list(result), list(cgnapt_approx_vnf.get_stats())) - - def _get_file_abspath(self, filename): - curr_path = os.path.dirname(os.path.abspath(__file__)) - file_path = os.path.join(curr_path, filename) - return file_path - - @mock.patch("yardstick.network_services.vnf_generic.vnf.cgnapt_vnf.hex") - @mock.patch("yardstick.network_services.vnf_generic.vnf.cgnapt_vnf.eval") - @mock.patch('yardstick.network_services.vnf_generic.vnf.cgnapt_vnf.open') - @mock.patch(SSH_HELPER) - def test_run_vcgnapt(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) - cgnapt_approx_vnf._build_config = mock.MagicMock() - cgnapt_approx_vnf.queue_wrapper = mock.MagicMock() - cgnapt_approx_vnf.ssh_helper = mock.MagicMock() - cgnapt_approx_vnf.ssh_helper.run = mock.MagicMock() - cgnapt_approx_vnf.scenario_helper.scenario_cfg = self.scenario_cfg - cgnapt_approx_vnf._run() - cgnapt_approx_vnf.ssh_helper.run.assert_called_once() - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") - @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) - cgnapt_approx_vnf.deploy_helper = mock.MagicMock() - cgnapt_approx_vnf.resource_helper = mock.MagicMock() - cgnapt_approx_vnf._build_config = mock.MagicMock() - self.scenario_cfg['vnf_options'] = {'acl': {'cfg': "", - 'rules': ""}} - cgnapt_approx_vnf.q_out.put("pipeline>") - cgnapt_vnf.WAIT_TIME = 3 - self.scenario_cfg.update({"nodes": {"vnf__0": ""}}) - self.assertIsNone(cgnapt_approx_vnf.instantiate(self.scenario_cfg, - self.context_cfg)) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test__vnf_up_post(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - self.scenario_cfg['options'][name]['napt'] = 'static' - - cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) - cgnapt_approx_vnf._vnf_process = mock.MagicMock() - cgnapt_approx_vnf._vnf_process.terminate = mock.Mock() - cgnapt_approx_vnf.vnf_execute = mock.MagicMock() - cgnapt_approx_vnf.scenario_helper.scenario_cfg = self.scenario_cfg - cgnapt_approx_vnf._resource_collect_stop = mock.Mock() - cgnapt_approx_vnf._vnf_up_post() - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test__vnf_up_post_short(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) - cgnapt_approx_vnf._vnf_process = mock.MagicMock() - cgnapt_approx_vnf._vnf_process.terminate = mock.Mock() - cgnapt_approx_vnf.vnf_execute = mock.MagicMock() - cgnapt_approx_vnf.scenario_helper.scenario_cfg = self.scenario_cfg - cgnapt_approx_vnf._resource_collect_stop = mock.Mock() - cgnapt_approx_vnf._vnf_up_post() diff --git a/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py b/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py deleted file mode 100644 index bc48f994c..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py +++ /dev/null @@ -1,2321 +0,0 @@ -# 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 itertools import repeat, chain -import os -import socket -import time - -import mock -import unittest - -from tests.unit import STL_MOCKS -from yardstick.common import utils -from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper -from yardstick.network_services import constants - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxSocketHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import PacketDump - from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import TotStatsTuple - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDataHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxProfileHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxMplsProfileHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxBngProfileHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxVpeProfileHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxlwAFTRProfileHelper - -class TestCoreTuple(unittest.TestCase): - def test___init__(self): - core_tuple = CoreSocketTuple('core 5s6') - self.assertEqual(core_tuple.core_id, 5) - self.assertEqual(core_tuple.socket_id, 6) - self.assertFalse(core_tuple.is_hyperthread()) - - core_tuple = CoreSocketTuple('core 5s6h') - self.assertEqual(core_tuple.core_id, 5) - self.assertEqual(core_tuple.socket_id, 6) - self.assertTrue(core_tuple.is_hyperthread()) - - def test___init__negative(self): - bad_inputs = [ - '', - '5', - '5s', - '6h', - '5s6', - 'core', - 'core h', - 'core 5s', - 'core 5 6', - 'core 5 6h', - 'core 5d6', - 'core 5d6h', - 1, - 2.3, - [], - {}, - object(), - ] - - for bad_input in bad_inputs: - with self.assertRaises(ValueError): - CoreSocketTuple(bad_input) - - def test_find_in_topology(self): - topology_in = { - 6: { - 5: { - 'key1': ['a', 'b'], - 'key2': ['c', 'd'], - }, - }, - } - - core_tuple = CoreSocketTuple('core 5s6') - - expected = 'a' - result = core_tuple.find_in_topology(topology_in) - self.assertEqual(result, expected) - - core_tuple = CoreSocketTuple('core 5s6h') - - expected = 'c' - result = core_tuple.find_in_topology(topology_in) - self.assertEqual(result, expected) - - def test_find_in_topology_negative(self): - core_tuple = CoreSocketTuple('core 6s5') - with self.assertRaises(ValueError): - # no socket key - core_tuple.find_in_topology({}) - - with self.assertRaises(ValueError): - # no core key - core_tuple.find_in_topology({5: {}}) - - with self.assertRaises(ValueError): - # no first value (as needed by non-hyperthread core) - core_tuple.find_in_topology({5: {6: {'key1': []}}}) - - core_tuple = CoreSocketTuple('core 6s5h') - with self.assertRaises(ValueError): - # no second value (as needed by hyperthread core) - core_tuple.find_in_topology({5: {6: {'key1': ['e']}}}) - - -class TestTotStatsTuple(unittest.TestCase): - def test___new___negative(self): - with self.assertRaises(TypeError): - # no values - TotStatsTuple() - - with self.assertRaises(TypeError): - # one, non-integer value - TotStatsTuple('a') - - with self.assertRaises(TypeError): - # too many values - TotStatsTuple(3, 4, 5, 6, 7) - - -class TestProxTestDataTuple(unittest.TestCase): - def test___init__(self): - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9) - self.assertEqual(prox_test_data.tolerated, 1) - self.assertEqual(prox_test_data.tsc_hz, 2) - self.assertEqual(prox_test_data.delta_rx, 3) - self.assertEqual(prox_test_data.delta_tx, 4) - self.assertEqual(prox_test_data.delta_tsc, 5) - self.assertEqual(prox_test_data.latency, 6) - self.assertEqual(prox_test_data.rx_total, 7) - self.assertEqual(prox_test_data.tx_total, 8) - self.assertEqual(prox_test_data.pps, 9) - - def test_properties(self): - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9) - self.assertEqual(prox_test_data.pkt_loss, 12.5) - self.assertEqual(prox_test_data.mpps, 1.6 / 1e6) - self.assertEqual(prox_test_data.can_be_lost, 0) - self.assertEqual(prox_test_data.drop_total, 1) - self.assertFalse(prox_test_data.success) - - prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9) - self.assertTrue(prox_test_data.success) - - def test_pkt_loss_zero_division(self): - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9) - self.assertEqual(prox_test_data.pkt_loss, 100.0) - - def test_get_samples(self): - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9) - - expected = { - "Throughput": 1.6 / 1e6, - "DropPackets": 12.5, - "CurrentDropPackets": 12.5, - "TxThroughput": 9 / 1e6, - "RxThroughput": 1.6 / 1e6, - "PktSize": 64, - "PortSample": 1, - "LatencyMin": 6.1, - "LatencyMax": 6.9, - "LatencyAvg": 6.4, - } - result = prox_test_data.get_samples(64, port_samples={"PortSample": 1}) - self.assertDictEqual(result, expected) - - expected = { - "Throughput": 1.6 / 1e6, - "DropPackets": 0.123, - "CurrentDropPackets": 0.123, - "TxThroughput": 9 / 1e6, - "RxThroughput": 1.6 / 1e6, - "PktSize": 64, - "LatencyMin": 6.1, - "LatencyMax": 6.9, - "LatencyAvg": 6.4, - } - result = prox_test_data.get_samples(64, 0.123) - self.assertDictEqual(result, expected) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG') - def test_log_data(self, mock_logger): - my_mock_logger = mock.MagicMock() - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9) - prox_test_data.log_data() - self.assertEqual(my_mock_logger.debug.call_count, 0) - self.assertEqual(mock_logger.debug.call_count, 2) - - mock_logger.debug.reset_mock() - prox_test_data.log_data(my_mock_logger) - self.assertEqual(my_mock_logger.debug.call_count, 2) - self.assertEqual(mock_logger.debug.call_count, 0) - - -class TestPacketDump(unittest.TestCase): - PAYLOAD = "payload" - - def test__init__(self): - PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) - - def test___str__(self): - expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD) - dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) - self.assertEqual(str(dump1), expected) - - def test_port_id(self): - p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) - self.assertEqual(p.port_id, "port_id") - - def test_data_len(self): - p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) - self.assertEqual(p.data_len, len(self.PAYLOAD)) - - def test_payload(self): - p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) - self.assertEqual(p.payload(), self.PAYLOAD) - - self.assertEqual(p.payload(3), self.PAYLOAD[3:]) - - self.assertEqual(p.payload(end=3), self.PAYLOAD[:4]) - - self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5]) - - -PACKET_DUMP_1 = """\ -pktdump,3,11 -hello world -""" - -PACKET_DUMP_2 = """\ -pktdump,3,11 -hello world -pktdump,2,9 -brown fox jumped over -pktdump,4,8 -lazy -dog -""" - -PACKET_DUMP_NON_1 = """\ -not_a_dump,1,2 -other data -""" - -PACKET_DUMP_MIXED_1 = """\ -pktdump,3,11 -hello world -not_a_dump,1,2 -other data -""" - -PACKET_DUMP_BAD_1 = """\ -pktdump,one,12 -bad port id -""" - -PACKET_DUMP_BAD_2 = """\ -pktdump,3,twelve -bad data length -""" - -PACKET_DUMP_BAD_3 = """\ -pktdump,3 -no data length value -""" - - -class TestProxSocketHelper(unittest.TestCase): - - def setUp(self): - self.mock_time_sleep = mock.patch.object(time, 'sleep').start() - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') - def test___init__(self, mock_socket): - expected = mock_socket.socket() - prox = ProxSocketHelper() - result = prox._sock - self.assertEqual(result, expected) - - def test_connect(self): - mock_sock = mock.MagicMock() - prox = ProxSocketHelper(mock_sock) - prox.connect('10.20.30.40', 23456) - self.assertEqual(mock_sock.connect.call_count, 1) - - def test_get_sock(self): - mock_sock = mock.MagicMock() - prox = ProxSocketHelper(mock_sock) - result = prox.get_socket() - self.assertIs(result, mock_sock) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select') - def test_get_data(self, mock_select): - mock_select.select.side_effect = [[1], [0]] - mock_socket = mock.MagicMock() - mock_recv = mock_socket.recv() - mock_recv.decode.return_value = "" - prox = ProxSocketHelper(mock_socket) - ret = prox.get_data() - self.assertEqual(ret, "") - self.assertEqual(len(prox._pkt_dumps), 0) - - mock_select.select.reset_mock() - mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3)) - mock_recv.decode.return_value = PACKET_DUMP_1 - ret = prox.get_data() - self.assertEqual(mock_select.select.call_count, 2) - self.assertEqual(ret, 'pktdump,3,11') - self.assertEqual(len(prox._pkt_dumps), 1) - - mock_select.select.reset_mock() - mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3)) - mock_recv.decode.return_value = PACKET_DUMP_2 - ret = prox.get_data() - self.assertEqual(mock_select.select.call_count, 2) - self.assertEqual(ret, 'jumped over') - self.assertEqual(len(prox._pkt_dumps), 3) - - def test__parse_socket_data_mixed_data(self): - prox = ProxSocketHelper(mock.MagicMock()) - ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False) - self.assertEqual(ret, 'not_a_dump,1,2') - self.assertEqual(len(prox._pkt_dumps), 0) - - ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False) - self.assertEqual(ret, 'not_a_dump,1,2') - self.assertEqual(len(prox._pkt_dumps), 1) - - def test__parse_socket_data_bad_data(self): - prox = ProxSocketHelper(mock.MagicMock()) - with self.assertRaises(ValueError): - prox._parse_socket_data(PACKET_DUMP_BAD_1, False) - - with self.assertRaises(ValueError): - prox._parse_socket_data(PACKET_DUMP_BAD_2, False) - - ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False) - self.assertEqual(ret, 'pktdump,3') - - def test__parse_socket_data_pkt_dump_only(self): - prox = ProxSocketHelper(mock.MagicMock()) - ret = prox._parse_socket_data('', True) - self.assertFalse(ret) - - ret = prox._parse_socket_data(PACKET_DUMP_1, True) - self.assertTrue(ret) - - ret = prox._parse_socket_data(PACKET_DUMP_2, True) - self.assertTrue(ret) - - def test_put_command(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.put_command("data") - mock_socket.sendall.assert_called_once() - - def test_put_command_socket_error(self): - mock_socket = mock.MagicMock() - mock_socket.sendall.side_effect = OSError - prox = ProxSocketHelper(mock_socket) - prox.put_command("data") - mock_socket.sendall.assert_called_once() - - def test_get_packet_dump(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox._pkt_dumps = [] - self.assertIsNone(prox.get_packet_dump()) - - prox._pkt_dumps = [234] - self.assertEqual(prox.get_packet_dump(), 234) - self.assertEqual(prox._pkt_dumps, []) - - def test_stop_all_reset(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.stop_all_reset() - mock_socket.sendall.assert_called() - - def test_stop_all(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.stop_all() - mock_socket.sendall.assert_called() - - def test_stop(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.stop([3, 4, 5], 16) - mock_socket.sendall.assert_called() - - def test_start_all(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.start_all() - mock_socket.sendall.assert_called() - - def test_start(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.start([3, 4, 5]) - mock_socket.sendall.assert_called() - - def test_reset_stats(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.reset_stats() - mock_socket.sendall.assert_called() - - def test_set_pkt_size(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.set_pkt_size([3, 4, 5], 1024) - self.assertEqual(mock_socket.sendall.call_count, 3) - - def test_set_value(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.set_value([3, 4, 5], 10, 20, 30) - self.assertEqual(mock_socket.sendall.call_count, 3) - - def test_reset_values(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.reset_values([3, 4, 5]) - self.assertEqual(mock_socket.sendall.call_count, 3) - - def test_set_speed(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.set_speed([3, 4, 5], 1000) - self.assertEqual(mock_socket.sendall.call_count, 3) - - def test_slope_speed(self): - core_data = [ - { - 'cores': [3, 4, 5], - 'speed': 1000, - }, - { - 'cores': [9, 10, 11], - 'speed': '500.5', - }, - ] - - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.set_speed = set_speed = mock.MagicMock() - prox.slope_speed(core_data, 5) - self.assertEqual(set_speed.call_count, 20) - - set_speed.reset_mock() - prox.slope_speed(core_data, 5, 5) - self.assertEqual(set_speed.call_count, 10) - - def test_set_pps(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.set_pps([3, 4, 5], 1000, 512) - self.assertEqual(mock_socket.sendall.call_count, 3) - - def test_lat_stats(self): - latency_output = [ - '1, 2 , 3', # has white space - '4,5', # too short - '7,8,9,10.5,11', # too long with float, but float is in unused portion - 'twelve,13,14', # value as English word - '15,16.2,17', # float in used portion - ] - - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.get_data = mock.MagicMock(side_effect=latency_output) - - expected = ( - { - 3: 1, - 5: 7, - }, - { - 3: 2, - 5: 8, - }, - { - 3: 3, - 5: 9, - }, - ) - result = prox.lat_stats([3, 4, 5, 6, 7], 16) - self.assertEqual(mock_socket.sendall.call_count, 5) - self.assertEqual(result, expected) - - def test_get_all_tot_stats_error(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.get_data = mock.MagicMock(return_value='3,4,5') - expected = [0, 0, 0, 0] - result = prox.get_all_tot_stats() - self.assertEqual(result, expected) - - def test_get_all_tot_stats(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.get_data = mock.MagicMock(return_value='3,4,5,6') - expected = 3, 4, 5, 6 - result = prox.get_all_tot_stats() - self.assertEqual(result, expected) - - def test_hz(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.get_data = mock.MagicMock(return_value='3,4,5,6') - expected = 6 - result = prox.hz() - self.assertEqual(result, expected) - - def test_core_stats(self): - core_stats = [ - '3,4,5,6', - '7,8,9,10,NaN', - '11,12,13,14,15', - ] - - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.get_data = mock.MagicMock(side_effect=core_stats) - expected = 21, 24, 27, 14 - result = prox.core_stats([3, 4, 5], 16) - self.assertEqual(result, expected) - - def test_port_stats(self): - port_stats = [ - ','.join(str(n) for n in range(3, 15)), - ','.join(str(n) for n in range(8, 32, 2)), - ','.join(str(n) for n in range(5, 89, 7)), - ] - - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.get_data = mock.MagicMock(side_effect=port_stats) - expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126] - result = prox.port_stats([3, 4, 5]) - self.assertEqual(result, expected) - - def test_measure_tot_stats(self): - start_tot = 3, 4, 5, 6 - end_tot = 7, 9, 11, 13 - delta_tot = 4, 5, 6, 7 - - get_data_output = [ - ','.join(str(n) for n in start_tot), - ','.join(str(n) for n in end_tot), - ] - - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.get_data = mock.MagicMock(side_effect=get_data_output) - expected = { - 'start_tot': start_tot, - 'end_tot': end_tot, - 'delta': delta_tot, - } - with prox.measure_tot_stats() as result: - pass - self.assertEqual(result, expected) - - def test_tot_stats(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.get_data = mock.MagicMock(return_value='3,4,5,6') - expected = 3, 4, 5 - result = prox.tot_stats() - self.assertEqual(result, expected) - - def test_tot_ierrors(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.get_data = mock.MagicMock(return_value='3,4,5,6') - expected = 3, 3 - result = prox.tot_ierrors() - self.assertEqual(result, expected) - - def test_set_count(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.set_count(432, [3, 4, 5]) - self.assertEqual(mock_socket.sendall.call_count, 3) - - def test_dump_rx(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.dump_rx(3, 5, 8) - self.assertEqual(mock_socket.sendall.call_count, 1) - - def test_quit(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.quit() - mock_socket.sendall.assert_called() - - def test_force_quit(self): - mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) - prox.force_quit() - mock_socket.sendall.assert_called() - - -class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): - - VNFD0 = { - 'short-name': 'ProxVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0', - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1', - }, - ], - 'description': 'PROX approximation using DPDK', - 'name': 'proxvnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'id': 'proxvnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': 'uplink_0', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.19', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02', - 'ifname': 'xe0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0', - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': 'downlink_0', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01', - 'ifname': 'xe1', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1', - }, - ], - }, - ], - 'description': 'PROX approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'proxvnf-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1', - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'id': 'ProxApproxVnf', - 'name': 'ProxVnf', - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD0, - ], - }, - } - - def test_global_section(self): - setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(), - mock.MagicMock()) - - setup_helper._prox_config_data = [('a', [])] - - with self.assertRaises(KeyError): - _ = setup_helper.global_section - - global_section = ( - 'global', [ - ('not_name', 'other data'), - ('name_not', 'more data'), - ('name', 'prox type'), - ], - ) - - setup_helper._prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1', []), - ('core 2', [ - ('index', 8), - ('mode', ''), - ]), - global_section, - ('core 3', [ - ('index', 5), - ('mode', 'gen'), - ('name', 'tagged'), - ]), - ('section3', [ - ('key1', 'value1'), - ('key2', 'value2'), - ('key3', 'value3'), - ]), - ('core 4', [ - ('index', 7), - ('mode', 'gen'), - ('name', 'udp'), - ]), - ] - - result = setup_helper.global_section - self.assertEqual(result, global_section[1]) - - def test_find_in_section(self): - setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(), - mock.MagicMock()) - - setup_helper._prox_config_data = [ - ('global', [ - ('not_name', 'other data'), - ('name_not', 'more data'), - ('name', 'prox type'), - ]), - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1', []), - ('core 2', [ - ('index', 8), - ('mode', ''), - ]), - ('core 3', [ - ('index', 5), - ('mode', 'gen'), - ('name', 'tagged'), - ]), - ('section3', [ - ('key1', 'value1'), - ('key2', 'value2'), - ('key3', 'value3'), - ]), - ('core 4', [ - ('index', 7), - ('mode', 'gen'), - ('name', 'udp'), - ]), - ] - - expected = 'value3' - result = setup_helper.find_in_section('section3', 'key3') - self.assertEqual(result, expected) - - expected = 'default value' - result = setup_helper.find_in_section('section3', 'key4', 'default value') - self.assertEqual(result, expected) - - with self.assertRaises(KeyError): - setup_helper.find_in_section('section4', 'key1') - - with self.assertRaises(KeyError): - setup_helper.find_in_section('section1', 'key1') - - def test__replace_quoted_with_value(self): - # empty string - input_str = '' - expected = '' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') - self.assertEqual(result, expected) - - # no quoted substring - input_str = 'lion tiger bear' - expected = 'lion tiger bear' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') - self.assertEqual(result, expected) - - # partially quoted substring - input_str = 'lion "tiger bear' - expected = 'lion "tiger bear' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') - self.assertEqual(result, expected) - - # one quoted substring - input_str = 'lion "tiger" bear' - expected = 'lion "cat" bear' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') - self.assertEqual(result, expected) - - # two quoted substrings - input_str = 'lion "tiger" bear "shark" whale' - expected = 'lion "cat" bear "shark" whale' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') - self.assertEqual(result, expected) - - # two quoted substrings, both replaced - input_str = 'lion "tiger" bear "shark" whale' - expected = 'lion "cat" bear "cat" whale' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2) - self.assertEqual(result, expected) - - def test__get_tx_port(self): - # no data - input_data = {'section1': []} - expected = -1 - result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data) - self.assertEqual(result, expected) - - # data for other section - input_data = { - 'section1': [], - 'section2': [ - ('rx port', '3'), - ('tx port', '4'), - ], - } - expected = -1 - result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data) - self.assertEqual(result, expected) - - # data for section - input_data['section1'] = section1 = [ - ('rx port', '4', 'more', 432), - ('tx port', '3'), - ] - expected = 3 - result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data) - self.assertEqual(result, expected) - - # more data for section, - section1.extend([ - ('rx port', '2'), - ('tx port', '1', 'and more', 234), - ]) - expected = 1 - result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data) - self.assertEqual(result, expected) - - def test_write_prox_config(self): - input_data = {} - expected = '' - result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data) - self.assertEqual(result, expected) - - input_data = [ - [ - 'section1', - [], - ], - ] - expected = '[section1]' - result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data) - self.assertEqual(result, expected) - - input_data = [ - [ - 'section1', - [], - ], - [ - 'section2', - [ - ['key1', 'value1'], - ['__name__', 'not this one'], - ['key2', None], - ['key3', 234], - ['key4', 'multi-line\nvalue'], - ], - ], - ] - expected = os.linesep.join([ - '[section1]', - '[section2]', - 'key1=value1', - 'key2', - 'key3=234', - 'key4=multi-line\n\tvalue', - ]) - result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data) - self.assertEqual(result, expected) - - def test_prox_config_data(self): - setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(), - mock.MagicMock()) - - setup_helper.config_queue = config_queue = mock.MagicMock() - config_queue.get.return_value = expected = [('s', [('a', 3), ('b', 45)])] - - result = setup_helper.prox_config_data - self.assertEqual(result, expected) - - @mock.patch.object(utils, 'find_relative_file') - def test_build_config_file_no_additional_file(self, mock_find_path): - vnf1 = { - 'prox_args': {'-c': ""}, - 'prox_path': 'd', - 'prox_config': 'e/f', - 'prox_generate_parameter': False, - } - - mock_find_path.side_effect = ['1', '2'] - - vnfd_helper = mock.MagicMock() - ssh_helper = mock.MagicMock() - scenario_helper = ScenarioHelper('vnf1') - scenario_helper.scenario_cfg = { - 'task_path': 'a/b', - 'options': { - 'vnf1': vnf1, - }, - } - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - helper.copy_to_target = mock.MagicMock(return_value='3') - helper.generate_prox_config_file = mock.MagicMock(return_value='4') - helper.upload_prox_config = mock.MagicMock(return_value='5') - - self.assertEqual(helper.additional_files, {}) - self.assertNotEqual(helper._prox_config_data, '4') - self.assertNotEqual(helper.remote_path, '5') - helper.build_config_file() - self.assertEqual(helper.additional_files, {}) - self.assertEqual(helper._prox_config_data, '4') - self.assertEqual(helper.remote_path, '5') - - @mock.patch.object(utils, 'find_relative_file') - def test_build_config_file_additional_file_string(self, mock_find_path): - vnf1 = { - 'prox_args': {'-c': ""}, - 'prox_path': 'd', - 'prox_config': 'e/f', - 'prox_files': 'g/h.i', - 'prox_generate_parameter': True, - } - - mock_find_path.side_effect = ['1', '2'] - vnfd_helper = mock.MagicMock() - ssh_helper = mock.MagicMock() - scenario_helper = ScenarioHelper('vnf1') - scenario_helper.scenario_cfg = { - 'task_path': 'a/b', - 'options': { - 'vnf1': vnf1, - }, - } - - vnfd_helper.port_pairs.all_ports = ['xe0', 'xe1', 'xe2', 'xe3'] - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35']) - helper.generate_prox_config_file = mock.MagicMock(return_value='44') - helper.upload_prox_config = mock.MagicMock(return_value='55') - - self.assertEqual(helper.additional_files, {}) - expected = {'h.i': '33'} - helper.build_config_file() - self.assertDictEqual(helper.additional_files, expected) - - @mock.patch.object(utils, 'find_relative_file') - def test_build_config_file_additional_file(self, mock_find_path): - vnf1 = { - 'prox_args': {'-c': ""}, - 'prox_path': 'd', - 'prox_config': 'e/f', - 'prox_files': [ - 'g/h.i', - 'j/k/l', - 'm_n', - ], - } - - mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))] - vnfd_helper = mock.MagicMock() - ssh_helper = mock.MagicMock() - scenario_helper = ScenarioHelper('vnf1') - scenario_helper.scenario_cfg = { - 'task_path': 'a/b', - 'options': { - 'vnf1': vnf1, - }, - } - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35']) - helper.generate_prox_config_file = mock.MagicMock(return_value='44') - helper.upload_prox_config = mock.MagicMock(return_value='55') - - self.assertEqual(helper.additional_files, {}) - self.assertNotEqual(helper._prox_config_data, '44') - self.assertNotEqual(helper.remote_path, '55') - expected = {'h.i': '33', 'l': '34', 'm_n': '35'} - helper.build_config_file() - self.assertDictEqual(helper.additional_files, expected) - self.assertEqual(helper._prox_config_data, '44') - self.assertEqual(helper.remote_path, '55') - - def test_build_config(self): - vnf1 = { - 'prox_args': {'-f': ""}, - 'prox_path': '/opt/nsb_bin/prox', - 'prox_config': 'configs/gen_l2fwd-2.cfg', - 'prox_files': [ - 'g/h.i', - 'j/k/l', - 'm_n', - ], - } - - vnfd_helper = mock.Mock() - ssh_helper = mock.Mock() - ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/prox' - scenario_helper = ScenarioHelper('vnf1') - scenario_helper.scenario_cfg = { - 'task_path': 'a/b', - 'options': { - 'vnf1': vnf1, - }, - } - - expected = ("sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli " - "-f -f /tmp/prox.cfg '") - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, - scenario_helper) - with mock.patch.object(helper, 'build_config_file') as mock_cfg_file: - helper.remote_path = '/tmp/prox.cfg' - prox_cmd = helper.build_config() - self.assertEqual(prox_cmd, expected) - mock_cfg_file.assert_called_once() - - def test__insert_additional_file(self): - vnfd_helper = mock.MagicMock() - ssh_helper = mock.MagicMock() - scenario_helper = mock.MagicMock() - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"} - res = helper._insert_additional_file('dofile("ipv4.lua")') - self.assertEqual(res, 'dofile("/tmp/ipv4.lua")') - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser') - def test_generate_prox_config_file(self, mock_parser_type): - def init(*args): - if sections_data: - args[-1].extend(sections_data) - return mock.MagicMock() - - sections_data = [] - - mock_parser_type.side_effect = init - - vnfd_helper = VnfdHelper(self.VNFD0) - ssh_helper = mock.MagicMock() - scenario_helper = mock.MagicMock() - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - helper.additional_files = {} - - expected = [] - result = helper.generate_prox_config_file('a/b') - self.assertEqual(result, expected) - - helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"} - - helper.remote_prox_file_name = 'remote' - sections_data = [ - [ - 'lua', - [ - ['dofile("ipv4.lua")', ''], - ], - ], - [ - 'port 0', - [ - ['ip', ''], - ['mac', 'foo'], - ['dst mac', '@@1'], - ['tx port', '1'], - ], - ], - [ - 'port 2', - [ - ['ip', ''], - ['$sut_mac0', '@@dst_mac0'], - ['tx port', '0'], - ['single', '@'], - ['user_table', 'dofile("ipv4.lua")'], - ['missing_addtional_file', 'dofile("nosuch")'], - ], - ], - ] - - expected = [ - [ - 'lua', - [ - ['dofile("/tmp/ipv4.lua")', ''], - ], - ], - [ - 'port 0', - [ - ['ip', ''], - ['mac', 'hardware'], - ['dst mac', '00:00:00:00:00:03'], - ['tx port', '1'], - ], - ], - [ - 'port 2', - [ - ['ip', ''], - ['$sut_mac0', '00 00 00 00 00 04'], - ['tx port', '0'], - ['single', '@'], - ['user_table', 'dofile("/tmp/ipv4.lua")'], - ['missing_addtional_file', 'dofile("nosuch")'], - ], - ], - ] - result = helper.generate_prox_config_file('/c/d/e') - self.assertEqual(result, expected, str(result)) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser') - def test_generate_prox_config_file_negative(self, mock_parser_type): - def init(*args): - args[-1].update(sections_data) - return mock.MagicMock() - - sections_data = {} - - mock_parser_type.side_effect = init - - vnfd_helper = mock.MagicMock() - vnfd_helper.interfaces = [] - ssh_helper = mock.MagicMock() - scenario_helper = mock.MagicMock() - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - helper.additional_files = {} - helper.remote_prox_file_name = 'remote' - vnfd_helper.interfaces = [ - { - 'virtual-interface': { - 'dpdk_port_num': 3, - 'dst_mac': '00:00:00:de:ad:88', - }, - }, - { - 'virtual-interface': { - 'dpdk_port_num': 5, - 'dst_mac': '00:00:00:de:ad:ff', - }, - }, - { - 'virtual-interface': { - 'dpdk_port_num': 7, - 'dst_mac': '00:00:00:de:ad:ff', - }, - }, - ] - sections_data = { - 'port 3': [ - ['ip', ''], - ['mac', 'foo'], - ['dst mac', ''], - ], - 'port 5': [ - ['ip', ''], - ['dst mac', ''], - ['tx port', '0'], - ['???', 'dofile "here" 23'], - ], - } - - with self.assertRaises(Exception): - helper.generate_prox_config_file('a/b') - - def test_put_string_to_file(self): - vnfd_helper = mock.MagicMock() - vnfd_helper.interfaces = [] - ssh_helper = mock.MagicMock() - scenario_helper = mock.MagicMock() - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - - expected = 'a/b' - result = helper.put_string_to_file('my long string', 'a/b') - self.assertEqual(result, expected) - - def test_copy_to_target(self): - vnfd_helper = mock.MagicMock() - vnfd_helper.interfaces = [] - ssh_helper = mock.MagicMock() - scenario_helper = mock.MagicMock() - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - expected = '/tmp/c' - result = helper.copy_to_target('a/b', 'c') - self.assertEqual(result, expected) - - def test_upload_prox_config(self): - vnfd_helper = mock.MagicMock() - vnfd_helper.interfaces = [] - ssh_helper = mock.MagicMock() - scenario_helper = mock.MagicMock() - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - helper.write_prox_config = mock.MagicMock(return_value='a long string') - expected = '/tmp/a' - result = helper.upload_prox_config('a', {}) - self.assertEqual(result, expected) - - -class TestProxResourceHelper(unittest.TestCase): - - VNFD0 = { - 'short-name': 'ProxVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0', - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1', - }, - ], - 'description': 'PROX approximation using DPDK', - 'name': 'proxvnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'id': 'proxvnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': 'uplink_0', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.19', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02', - 'ifname': 'xe0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0', - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': 'downlink_0', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01', - 'ifname': 'xe1', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1', - }, - ], - }, - ], - 'description': 'PROX approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'proxvnf-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1', - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'id': 'ProxApproxVnf', - 'name': 'ProxVnf', - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD0, - ], - }, - } - - def test_find_pci(self): - input_str_list = [ - 'no target here', - 'nor here', - 'and still not', - ] - result = ProxResourceHelper.find_pci('target', input_str_list) - self.assertFalse(result) - - input_str_list = [ - 'no target here', - 'nor here', - 'this is a target', - 'did we miss it', - ] - result = ProxResourceHelper.find_pci('target', input_str_list) - self.assertTrue(result) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0) - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper') - def test_sut(self, *args): - helper = ProxResourceHelper(mock.MagicMock()) - self.assertIsNone(helper.client) - result = helper.sut - self.assertIsNotNone(result) - self.assertIs(result, helper.client) - self.assertIs(result, helper.sut) - - def test_test_type(self): - setup_helper = mock.MagicMock() - setup_helper.find_in_section.return_value = expected = 'prox type' - - helper = ProxResourceHelper(setup_helper) - - self.assertIsNone(helper._test_type) - self.assertEqual(helper.test_type, expected) - self.assertEqual(helper._test_type, expected) - self.assertEqual(helper.test_type, expected) - - def test_collect_collectd_kpi(self): - helper = ProxResourceHelper(mock.MagicMock()) - helper.resource = resource = mock.MagicMock() - - resource.check_if_system_agent_running.return_value = 0, '1234' - resource.amqp_collect_nfvi_kpi.return_value = 543 - resource.check_if_system_agent_running.return_value = (0, None) - - expected = {'core': 543} - result = helper.collect_collectd_kpi() - self.assertDictEqual(result, expected) - - def test_collect_kpi(self): - helper = ProxResourceHelper(mock.MagicMock()) - helper._queue = queue = mock.MagicMock() - helper._result = {'z': 123} - helper.resource = resource = mock.MagicMock() - - resource.check_if_system_agent_running.return_value = 0, '1234' - resource.amqp_collect_nfvi_kpi.return_value = 543 - resource.check_if_system_agent_running.return_value = (0, None) - - queue.empty.return_value = False - queue.get.return_value = {'a': 789} - - expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}} - result = helper.collect_kpi() - self.assertDictEqual(result, expected) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper') - def test__connect(self, mock_socket_helper_type, *args): - client = mock_socket_helper_type() - client.connect.side_effect = chain(repeat(socket.error, 5), [None]) - - setup_helper = mock.MagicMock() - setup_helper.vnfd_helper.interfaces = [] - - helper = ProxResourceHelper(setup_helper) - - result = helper._connect() - self.assertIs(result, client) - - client.connect.side_effect = chain(repeat(socket.error, 65), [None]) - - with self.assertRaises(Exception): - helper._connect() - - def test_run_traffic(self): - setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) - traffic_profile = mock.MagicMock(**{"done": True}) - helper.run_traffic(traffic_profile) - self.assertEqual(helper._terminated.value, 1) - - def test__run_traffic_once(self): - setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) - traffic_profile = mock.MagicMock(**{"done": True}) - helper._run_traffic_once(traffic_profile) - self.assertEqual(helper._terminated.value, 1) - - def test_start_collect(self): - setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) - helper.resource = resource = mock.MagicMock() - self.assertIsNone(helper.start_collect()) - resource.start.assert_called_once() - - def test_terminate(self): - setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) - with self.assertRaises(NotImplementedError): - helper.terminate() - - def test_up_post(self): - setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) - helper.client = expected = mock.MagicMock() - result = helper.up_post() - self.assertEqual(result, expected) - - def test_execute(self): - setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) - helper.client = mock.MagicMock() - - expected = helper.client.my_command() - result = helper.execute('my_command') - self.assertEqual(result, expected) - - helper.client = object() - - result = helper.execute('my_command') - self.assertIsNone(result) - - -class TestProxDataHelper(unittest.TestCase): - - def test_totals_and_pps(self): - pkt_size = 180 - vnfd_helper = mock.MagicMock() - vnfd_helper.port_pairs.all_ports = list(range(4)) - - sut = mock.MagicMock() - sut.port_stats.return_value = list(range(10)) - - data_helper = ProxDataHelper( - vnfd_helper, sut, pkt_size, 25, None, - constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS) - - self.assertEqual(data_helper.rx_total, 6) - self.assertEqual(data_helper.tx_total, 7) - self.assertEqual(data_helper.pps, 6.25e6) - - def test_samples(self): - vnfd_helper = mock.MagicMock() - vnfd_helper.port_pairs.all_ports = list(range(4)) - vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)] - - sut = mock.MagicMock() - sut.port_stats.return_value = list(range(10)) - - data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None, None) - - expected = { - 'xe1': { - 'in_packets': 6, - 'out_packets': 7, - }, - 'xe2': { - 'in_packets': 6, - 'out_packets': 7, - }, - } - result = data_helper.samples - self.assertDictEqual(result, expected) - - def test___enter__(self): - vnfd_helper = mock.MagicMock() - vnfd_helper.port_pairs.all_ports = list(range(4)) - vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)] - - sut = mock.MagicMock() - sut.port_stats.return_value = list(range(10)) - - data_helper = ProxDataHelper(vnfd_helper, sut, None, None, - 5.4, constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS) - data_helper._totals_and_pps = 12, 32, 4.5 - data_helper.tsc_hz = 9.8 - data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)} - data_helper.latency = 7 - - self.assertIsNone(data_helper.result_tuple) - self.assertEqual(data_helper.line_speed, 10000000000) - - expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5) - with data_helper: - pass - - result = data_helper.result_tuple - self.assertEqual(result, expected) - - data_helper.make_tuple() - self.assertIs(data_helper.result_tuple, result) - - def test___enter___negative(self): - vnfd_helper = mock.MagicMock() - - data_helper = ProxDataHelper(vnfd_helper, None, None, None, None, None) - - vnfd_helper.port_pairs.all_ports = [] - with self.assertRaises(AssertionError): - with data_helper: - pass - - vnfd_helper.port_pairs.all_ports = [0, 1, 2] - with self.assertRaises(AssertionError): - with data_helper: - pass - - def test_measure_tot_stats(self): - vnfd_helper = mock.MagicMock() - vnfd_helper.port_pairs.all_ports = list(range(4)) - - start = (3, 4, 1, 2) - end = (9, 7, 6, 8) - - sut = ProxSocketHelper(mock.MagicMock()) - sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end]) - - data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4, None) - - self.assertIsNone(data_helper.measured_stats) - - expected = { - 'start_tot': start, - 'end_tot': end, - 'delta': TotStatsTuple(6, 3, 5, 6), - } - with data_helper.measure_tot_stats(): - pass - - self.assertEqual(data_helper.measured_stats, expected) - - def test_capture_tsc_hz(self): - vnfd_helper = mock.MagicMock() - vnfd_helper.port_pairs.all_ports = list(range(4)) - - sut = mock.MagicMock() - sut.hz.return_value = '54.6' - - data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None, None) - - self.assertIsNone(data_helper.tsc_hz) - - expected = 54.6 - data_helper.capture_tsc_hz() - self.assertEqual(data_helper.tsc_hz, expected) - - -class TestProxProfileHelper(unittest.TestCase): - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils') - def test_get_cls(self, mock_utils): - mock_type1 = mock.MagicMock() - mock_type1.__prox_profile_type__ = 'another_type' - mock_type2 = mock.MagicMock() - mock_type2.__prox_profile_type__ = 'my_type' - mock_utils.itersubclasses.return_value = [mock_type1, mock_type2] - - self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils') - def test_get_cls_default(self, mock_utils): - mock_utils.itersubclasses.return_value = [] - ProxProfileHelper.get_cls('my_type') - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology') - def test_cpu_topology(self, mock_socket_topology): - mock_socket_topology.parse_cpuinfo.return_value = 432 - - resource_helper = mock.MagicMock() - resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', '' - - helper = ProxProfileHelper(resource_helper) - self.assertIsNone(helper._cpu_topology) - result = helper.cpu_topology - self.assertEqual(result, 432) - self.assertIs(result, helper._cpu_topology) - self.assertIs(result, helper.cpu_topology) - - def test_test_cores(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.prox_config_data = [] - - helper = ProxProfileHelper(resource_helper) - helper._cpu_topology = [] - - expected = [] - result = helper.test_cores - self.assertEqual(result, expected) - - resource_helper.setup_helper.prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1s3', []), - ('core 2s5', [ - ('index', 8), - ('mode', ''), - ]), - ('core 3s1', [ - ('index', 5), - ('mode', 'gen'), - ]), - ('core 4s9h', [ - ('index', 7), - ('mode', 'gen'), - ]), - ] - - helper = ProxProfileHelper(resource_helper) - helper._cpu_topology = { - 1: { - 3: { - 'key1': (23, 32), - 'key2': (12, 21), - 'key3': (44, 33), - }, - }, - 9: { - 4: { - 'key1': (44, 32), - 'key2': (23, 21), - 'key3': (12, 33), - }, - }, - } - - self.assertIsNone(helper._test_cores) - expected = [3, 4] - result = helper.test_cores - self.assertEqual(result, expected) - self.assertIs(result, helper._test_cores) - self.assertIs(result, helper.test_cores) - - def test_latency_cores(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.prox_config_data = [] - - helper = ProxProfileHelper(resource_helper) - helper._cpu_topology = [] - - expected = [] - result = helper.latency_cores - self.assertEqual(result, expected) - - resource_helper.setup_helper.prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1s3', []), - ('core 2s5', [ - ('index', 8), - ('mode', ''), - ]), - ('core 3s1', [ - ('index', 5), - ('mode', 'lat'), - ]), - ('core 4s9h', [ - ('index', 7), - ('mode', 'lat'), - ]), - ] - - helper = ProxProfileHelper(resource_helper) - helper._cpu_topology = { - 1: { - 3: { - 'key1': (23, 32), - 'key2': (12, 21), - 'key3': (44, 33), - }, - }, - 9: { - 4: { - 'key1': (44, 32), - 'key2': (23, 21), - 'key3': (12, 33), - }, - }, - } - - self.assertIsNone(helper._latency_cores) - expected = [3, 4] - result = helper.latency_cores - self.assertEqual(result, expected) - self.assertIs(result, helper._latency_cores) - self.assertIs(result, helper.latency_cores) - - def test_all_rx_cores(self): - helper = ProxBngProfileHelper(mock.MagicMock()) - helper._latency_cores = expected = [3, 4, 6] - helper._test_cores = [5, 2, 1] - - result = helper.all_rx_cores - self.assertEqual(result, expected) - - def test_get_cores(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1', []), - ('core 2', [ - ('index', 8), - ('mode', ''), - ]), - ('core 3', [ - ('index', 5), - ('mode', 'gen'), - ]), - ('core 4', [ - ('index', 7), - ('mode', 'gen'), - ]), - ] - - helper = ProxProfileHelper(resource_helper) - helper._cpu_topology = { - 0: { - 1: { - 5: (5, 1, 0) - }, - 2: { - 6: (6, 2, 0) - }, - 3: { - 7: (7, 3, 0) - }, - 4: { - 8: (8, 3, 0) - }, - } - } - - expected = [3, 4] - result = helper.get_cores(helper.PROX_CORE_GEN_MODE) - self.assertEqual(result, expected) - - def test_get_latency(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.vnfd_helper.interfaces = [] - - helper = ProxProfileHelper(resource_helper) - helper._latency_cores = [] - - expected = [] - result = helper.get_latency() - self.assertEqual(result, expected) - - helper._latency_cores = [1, 2] - helper.client = mock.MagicMock() - - expected = helper.sut.lat_stats() - result = helper.get_latency() - self.assertIs(result, expected) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') - def test_traffic_context(self, *args): - setup_helper = mock.MagicMock() - setup_helper.vnfd_helper.interfaces = [] - - helper = ProxProfileHelper(setup_helper) - helper._cpu_topology = { - 0: { - 1: { - 5: (5, 1, 0) - }, - 2: { - 6: (6, 2, 0) - }, - 3: { - 7: (7, 3, 0) - }, - 4: { - 8: (8, 3, 0) - }, - } - } - - setup_helper.prox_config_data = [ - ('global', [ - ('not_name', 'other data'), - ('name_not', 'more data'), - ('name', helper.__prox_profile_type__), - ]), - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1', []), - ('core 2', [ - ('index', 8), - ('mode', ''), - ]), - ('core 3', [ - ('index', 5), - ('mode', 'gen'), - ('name', 'tagged'), - ]), - ('core 4', [ - ('index', 7), - ('mode', 'gen'), - ('name', 'udp'), - ]), - ] - - client = mock.MagicMock() - client.hz.return_value = 2 - client.port_stats.return_value = tuple(range(12)) - - helper.client = client - helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8]) - - helper._test_cores = [3, 4] - - with helper.traffic_context(64, 1): - pass - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') - def test_run_test(self, _): - resource_helper = mock.MagicMock() - resource_helper.step_delta = 0.4 - resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2)) - resource_helper.sut.port_stats.return_value = list(range(10)) - - helper = ProxProfileHelper(resource_helper) - - helper.run_test(120, 5, 6.5, - constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS) - - -class TestProxMplsProfileHelper(unittest.TestCase): - - def test_mpls_cores(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1', []), - ('core 2', [ - ('index', 8), - ('mode', ''), - ]), - ('core 3', [ - ('index', 5), - ('mode', 'gen'), - ('name', 'tagged'), - ]), - ('core 4', [ - ('index', 7), - ('mode', 'gen'), - ('name', 'udp'), - ]), - ] - - helper = ProxMplsProfileHelper(resource_helper) - helper._cpu_topology = { - 0: { - 1: { - 5: (5, 1, 0) - }, - 2: { - 6: (6, 2, 0) - }, - 3: { - 7: (7, 3, 0) - }, - 4: { - 8: (8, 3, 0) - }, - } - } - - expected_tagged = [3] - expected_plain = [4] - self.assertIsNone(helper._cores_tuple) - self.assertEqual(helper.tagged_cores, expected_tagged) - self.assertEqual(helper.plain_cores, expected_plain) - self.assertEqual(helper._cores_tuple, (expected_tagged, expected_plain)) - - def test_traffic_context(self): - setup_helper = mock.MagicMock() - helper = ProxMplsProfileHelper(setup_helper) - - with helper.traffic_context(120, 5.4): - pass - - -class TestProxBngProfileHelper(unittest.TestCase): - - def test_bng_cores(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1', []), - ('core 2', [ - ('index', 8), - ('mode', ''), - ]), - ('core 3', [ - ('index', 5), - ('mode', 'gen'), - ('name', 'cpe'), - ]), - ('core 4', [ - ('index', 7), - ('mode', 'gen'), - ('name', 'inet'), - ]), - ('core 6', [ - ('index', 3), - ('mode', 'gen'), - ('name', 'arp_task'), - ]), - ('core 9', [ - ('index', 2), - ('mode', 'gen'), - ('name', 'arp'), - ]), - ] - - helper = ProxBngProfileHelper(resource_helper) - helper._cpu_topology = { - 0: { - 1: { - 5: (5, 1, 0) - }, - 2: { - 6: (6, 2, 0) - }, - 3: { - 7: (7, 3, 0) - }, - 4: { - 8: (8, 3, 0) - }, - 6: { - 1: (4, 8, 0) - }, - 9: { - 2: (3, 7, 0) - }, - } - } - - expected_cpe = [3] - expected_inet = [4] - expected_arp = [6, 9] - expected_arp_task = [0, 6] - expected_combined = (expected_cpe, expected_inet, expected_arp, expected_arp_task) - - self.assertIsNone(helper._cores_tuple) - self.assertEqual(helper.cpe_cores, expected_cpe) - self.assertEqual(helper.inet_cores, expected_inet) - self.assertEqual(helper.arp_cores, expected_arp) - self.assertEqual(helper.arp_task_cores, expected_arp_task) - self.assertEqual(helper._cores_tuple, expected_combined) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') - def test_run_test(self, _): - resource_helper = mock.MagicMock() - resource_helper.step_delta = 0.4 - resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2)) - resource_helper.sut.port_stats.return_value = list(range(10)) - - helper = ProxBngProfileHelper(resource_helper) - - helper.run_test(120, 5, 6.5, - constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS) - - # negative pkt_size is the only way to make ratio > 1 - helper.run_test(-1000, 5, 6.5, - constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS) - - -class TestProxVpeProfileHelper(unittest.TestCase): - - def test_vpe_cores(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1', []), - ('core 2', [ - ('index', 8), - ('mode', ''), - ]), - ('core 3', [ - ('index', 5), - ('mode', 'gen'), - ('name', 'cpe'), - ]), - ('core 4', [ - ('index', 7), - ('mode', 'gen'), - ('name', 'inet'), - ]), - ] - - helper = ProxVpeProfileHelper(resource_helper) - helper._cpu_topology = { - 0: { - 1: { - 5: (5, 1, 0) - }, - 2: { - 6: (6, 2, 0) - }, - 3: { - 7: (7, 3, 0) - }, - 4: { - 8: (8, 3, 0) - }, - } - } - - expected_cpe = [3] - expected_inet = [4] - expected_combined = (expected_cpe, expected_inet) - - self.assertIsNone(helper._cores_tuple) - self.assertEqual(helper.cpe_cores, expected_cpe) - self.assertEqual(helper.inet_cores, expected_inet) - self.assertEqual(helper._cores_tuple, expected_combined) - - def test_vpe_ports(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('port 3', [ - ('index', '5'), - ('name', 'cpe'), - ('mac', 'hardware'), - ]), - ('port 4', [ - ('index', '7'), - ('name', 'inet'), - ('mac', 'hardware'), - ]), - ] - - helper = ProxVpeProfileHelper(resource_helper) - helper._port_list = { - 0: { - 1: { - 5: 'cpe' - }, - 2: { - 6: 'inet' - }, - 3: { - 7: 'cpe' - }, - 4: { - 8: 'inet' - }, - } - } - - expected_cpe = [3] - expected_inet = [4] - expected_combined = (expected_cpe, expected_inet) - - self.assertIsNone(helper._ports_tuple) - self.assertEqual(helper.cpe_ports, expected_cpe) - self.assertEqual(helper.inet_ports, expected_inet) - self.assertEqual(helper._ports_tuple, expected_combined) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') - def test_run_test(self, _): - resource_helper = mock.MagicMock() - resource_helper.step_delta = 0.4 - resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2)) - resource_helper.sut.port_stats.return_value = list(range(10)) - - helper = ProxVpeProfileHelper(resource_helper) - - helper.run_test(120, 5, 6.5) - helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1 - - -class TestProxlwAFTRProfileHelper(unittest.TestCase): - - def test_lwaftr_cores(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('core 1', []), - ('core 2', [ - ('index', 8), - ('mode', ''), - ]), - ('core 3', [ - ('index', 5), - ('mode', 'gen'), - ('name', 'tun'), - ]), - ('core 4', [ - ('index', 7), - ('mode', 'gen'), - ('name', 'inet'), - ]), - ] - - helper = ProxlwAFTRProfileHelper(resource_helper) - helper._cpu_topology = { - 0: { - 1: { - 5: (5, 1, 0) - }, - 2: { - 6: (6, 2, 0) - }, - 3: { - 7: (7, 3, 0) - }, - 4: { - 8: (8, 3, 0) - }, - } - } - - expected_tun = [3] - expected_inet = [4] - expected_combined = (expected_tun, expected_inet) - - self.assertIsNone(helper._cores_tuple) - self.assertEqual(helper.tun_cores, expected_tun) - self.assertEqual(helper.inet_cores, expected_inet) - self.assertEqual(helper._cores_tuple, expected_combined) - - def test_tun_ports(self): - resource_helper = mock.MagicMock() - resource_helper.setup_helper.prox_config_data = [ - ('section1', []), - ('section2', [ - ('a', 'b'), - ('c', 'd'), - ]), - ('port 3', [ - ('index', '5'), - ('name', 'lwB4'), - ('mac', 'hardware'), - ]), - ('port 4', [ - ('index', '7'), - ('name', 'inet'), - ('mac', 'hardware'), - ]), - ] - - helper = ProxlwAFTRProfileHelper(resource_helper) - helper._port_list = { - 0: { - 1: { - 5: 'lwB4' - }, - 2: { - 6: 'inet' - }, - 3: { - 7: 'lwB4' - }, - 4: { - 8: 'inet' - }, - } - } - - expected_tun = [3] - expected_inet = [4] - expected_combined = (expected_tun, expected_inet) - - self.assertIsNone(helper._ports_tuple) - self.assertEqual(helper.tun_ports, expected_tun) - self.assertEqual(helper.inet_ports, expected_inet) - self.assertEqual(helper._ports_tuple, expected_combined) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') - def test_run_test(self, _): - resource_helper = mock.MagicMock() - resource_helper.step_delta = 0.4 - resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2)) - resource_helper.sut.port_stats.return_value = list(range(10)) - - helper = ProxlwAFTRProfileHelper(resource_helper) - - helper.run_test(120, 5, 6.5) - helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1 diff --git a/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py deleted file mode 100644 index 159b1f718..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py +++ /dev/null @@ -1,455 +0,0 @@ -# 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. -# - -import errno -import os -import unittest -import mock -from copy import deepcopy - -from tests.unit import STL_MOCKS - - -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.prox_vnf import ProxApproxVnf - from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh - - -NAME = "vnf__1" - - -@mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') -class TestProxApproxVnf(unittest.TestCase): - - VNFD0 = { - 'short-name': 'ProxVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0', - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1', - }, - ], - 'description': 'PROX approximation using DPDK', - 'name': 'proxvnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'id': 'proxvnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': 'downlink_0', - 'ifname': 'xe1', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0', - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': 'uplink_0', - 'ifname': 'xe1', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1', - }, - ], - }, - ], - 'description': 'PROX approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'proxvnf-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1', - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - 'curr_packets_fwd', - 'curr_packets_in' - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'ProxApproxVnf', - 'name': 'ProxVnf', - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD0, - ], - }, - } - - SCENARIO_CFG = { - 'task_path': "", - 'nodes': { - 'tg__1': 'trafficgen_1.yardstick', - 'vnf__1': 'vnf.yardstick'}, - 'runner': { - 'duration': 600, 'type': 'Duration'}, - 'topology': 'prox-tg-topology-2.yaml', - 'traffic_profile': '../../traffic_profiles/prox_binsearch.yaml', - 'type': 'NSPerf', - 'options': { - 'tg__1': {'prox_args': {'-e': '', - '-t': ''}, - 'prox_config': 'configs/l3-gen-2.cfg', - 'prox_path': - '/root/dppd-PROX-v035/build/prox'}, - 'vnf__1': { - 'prox_args': {'-t': ''}, - 'prox_config': 'configs/l3-swap-2.cfg', - 'prox_path': '/root/dppd-PROX-v035/build/prox'}}} - - CONTEXT_CFG = { - 'nodes': { - 'tg__2': { - 'member-vnf-index': '3', - 'role': 'TrafficGen', - 'name': 'trafficgen_2.yardstick', - 'vnfd-id-ref': 'tg__2', - 'ip': '1.2.1.1', - 'interfaces': { - 'xe0': { - 'local_iface_name': 'ens513f0', - 'vld_id': ProxApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.20', - 'dst_mac': '00:00:00:00:00:01', - 'local_mac': '00:00:00:00:00:03', - 'dst_ip': '152.16.40.19', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.0', - 'dpdk_port_num': 0, - }, - 'xe1': { - 'local_iface_name': 'ens513f1', - 'netmask': '255.255.255.0', - 'network': '202.16.100.0', - 'local_ip': '202.16.100.20', - 'local_mac': '00:1e:67:d0:60:5d', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.1', - 'dpdk_port_num': 1, - }, - }, - 'password': 'r00t', - 'VNF model': 'l3fwd_vnf.yaml', - 'user': 'root', - }, - 'tg__1': { - 'member-vnf-index': '1', - 'role': 'TrafficGen', - 'name': 'trafficgen_1.yardstick', - 'vnfd-id-ref': 'tg__1', - 'ip': '1.2.1.1', - 'interfaces': { - 'xe0': { - 'local_iface_name': 'ens785f0', - 'vld_id': ProxApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.20', - 'dst_mac': '00:00:00:00:00:02', - 'local_mac': '00:00:00:00:00:04', - 'dst_ip': '152.16.100.19', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0, - }, - 'xe1': { - 'local_iface_name': 'ens785f1', - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.21', - 'local_mac': '00:00:00:00:00:01', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1, - }, - }, - 'password': 'r00t', - 'VNF model': 'tg_rfc2544_tpl.yaml', - 'user': 'root', - }, - 'vnf__1': { - 'name': 'vnf.yardstick', - 'vnfd-id-ref': 'vnf__1', - 'ip': '1.2.1.1', - 'interfaces': { - 'xe0': { - 'local_iface_name': 'ens786f0', - 'vld_id': ProxApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.19', - 'dst_mac': '00:00:00:00:00:04', - 'local_mac': '00:00:00:00:00:02', - 'dst_ip': '152.16.100.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0, - }, - 'xe1': { - 'local_iface_name': 'ens786f1', - 'vld_id': ProxApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.19', - 'dst_mac': '00:00:00:00:00:03', - 'local_mac': '00:00:00:00:00:01', - 'dst_ip': '152.16.40.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1, - }, - }, - 'routing_table': [ - { - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'network': '152.16.100.20', - 'if': 'xe0', - }, - { - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'network': '152.16.40.20', - 'if': 'xe1', - }, - ], - 'member-vnf-index': '2', - 'host': '1.2.1.1', - 'role': 'vnf', - 'user': 'root', - 'nd_route_tbl': [ - { - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'password': 'r00t', - 'VNF model': 'prox_vnf.yaml', - }, - }, - } - - @mock.patch(SSH_HELPER) - def test___init__(self, ssh, *args): - mock_ssh(ssh) - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - self.assertIsNone(prox_approx_vnf._vnf_process) - - @mock.patch(SSH_HELPER) - def test_collect_kpi_no_client(self, ssh, *args): - mock_ssh(ssh) - - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - prox_approx_vnf.resource_helper = None - expected = { - 'packets_in': 0, - 'packets_dropped': 0, - 'packets_fwd': 0, - 'collect_stats': {'core': {}} - } - result = prox_approx_vnf.collect_kpi() - self.assertEqual(result, expected) - - @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, *args): - mock_ssh(ssh) - - resource_helper = mock.MagicMock() - resource_helper.execute.return_value = list(range(12)) - resource_helper.collect_collectd_kpi.return_value = {'core': {'result': 234}} - - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - prox_approx_vnf.resource_helper = resource_helper - - expected = { - 'packets_in': 6, - 'packets_dropped': 1, - 'packets_fwd': 7, - 'collect_stats': {'core': {'result': 234}}, - } - result = prox_approx_vnf.collect_kpi() - self.assertEqual(result['packets_in'], expected['packets_in']) - self.assertEqual(result['packets_dropped'], expected['packets_dropped']) - self.assertEqual(result['packets_fwd'], expected['packets_fwd']) - self.assertNotEqual(result['packets_fwd'], 0) - self.assertNotEqual(result['packets_fwd'], 0) - - @mock.patch(SSH_HELPER) - def test_collect_kpi_error(self, ssh, *args): - mock_ssh(ssh) - - resource_helper = mock.MagicMock() - - prox_approx_vnf = ProxApproxVnf(NAME, deepcopy(self.VNFD0)) - prox_approx_vnf.resource_helper = resource_helper - prox_approx_vnf.vnfd_helper['vdu'][0]['external-interface'] = [] - prox_approx_vnf.vnfd_helper.port_pairs.interfaces = [] - - with self.assertRaises(RuntimeError): - prox_approx_vnf.collect_kpi() - - def _get_file_abspath(self, filename, *args): - curr_path = os.path.dirname(os.path.abspath(__file__)) - file_path = os.path.join(curr_path, filename) - return file_path - - @mock.patch('yardstick.common.utils.open', create=True) - @mock.patch('yardstick.benchmark.scenarios.networking.vnf_generic.open', create=True) - @mock.patch('yardstick.network_services.helpers.iniparser.open', create=True) - @mock.patch(SSH_HELPER) - def test_run_prox(self, ssh, *_): - mock_ssh(ssh) - - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - prox_approx_vnf.scenario_helper.scenario_cfg = self.SCENARIO_CFG - prox_approx_vnf.ssh_helper.join_bin_path.return_value = '/tool_path12/tool_file34' - prox_approx_vnf.setup_helper.remote_path = 'configs/file56.cfg' - - expected = "sudo bash -c 'cd /tool_path12; " \ - "/tool_path12/tool_file34 -o cli -t -f /tmp/l3-swap-2.cfg '" - - prox_approx_vnf._run() - result = prox_approx_vnf.ssh_helper.run.call_args[0][0] - self.assertEqual(result, expected) - - @mock.patch(SSH_HELPER) - def bad_test_instantiate(self, *args): - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - prox_approx_vnf.scenario_helper = mock.MagicMock() - prox_approx_vnf.setup_helper = mock.MagicMock() - # we can't mock super - prox_approx_vnf.instantiate(self.SCENARIO_CFG, self.CONTEXT_CFG) - prox_approx_vnf.setup_helper.build_config.assert_called_once() - - @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_panic(self, ssh, *args): - mock_ssh(ssh, exec_result=(1, "", "")) - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - prox_approx_vnf._vnf_process = mock.MagicMock(**{"is_alive.return_value": True}) - prox_approx_vnf._run_prox = mock.Mock(return_value=0) - prox_approx_vnf.WAIT_TIME = 0 - prox_approx_vnf.q_out.put("PANIC") - with self.assertRaises(RuntimeError): - prox_approx_vnf.wait_for_instantiate() - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') - @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, *args): - mock_ssh(ssh) - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - prox_approx_vnf._vnf_process = mock.MagicMock() - prox_approx_vnf._vnf_process.terminate = mock.Mock() - prox_approx_vnf.ssh_helper = mock.MagicMock() - prox_approx_vnf.setup_helper = mock.Mock() - prox_approx_vnf.resource_helper = mock.MagicMock() - - self.assertIsNone(prox_approx_vnf.terminate()) - - @mock.patch(SSH_HELPER) - def test__vnf_up_post(self, ssh, *args): - mock_ssh(ssh) - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - prox_approx_vnf.resource_helper = resource_helper = mock.Mock() - - prox_approx_vnf._vnf_up_post() - self.assertEqual(resource_helper.up_post.call_count, 1) - - @mock.patch(SSH_HELPER) - def test_vnf_execute_oserror(self, ssh, *args): - mock_ssh(ssh) - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - prox_approx_vnf.resource_helper = resource_helper = mock.Mock() - - resource_helper.execute.side_effect = OSError(errno.EPIPE, "") - prox_approx_vnf.vnf_execute("", _ignore_errors=True) - - resource_helper.execute.side_effect = OSError(errno.ESHUTDOWN, "") - prox_approx_vnf.vnf_execute("", _ignore_errors=True) - - resource_helper.execute.side_effect = OSError(errno.EADDRINUSE, "") - with self.assertRaises(OSError): - prox_approx_vnf.vnf_execute("", _ignore_errors=True) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_router_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_router_vnf.py deleted file mode 100644 index c6292f258..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_router_vnf.py +++ /dev/null @@ -1,262 +0,0 @@ -# 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 tests.unit import STL_MOCKS -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh - - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.router_vnf import RouterVNF - - -TEST_FILE_YAML = 'nsb_test_case.yaml' -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' - - -name = 'vnf__1' - - -class TestRouterVNF(unittest.TestCase): - VNFD = {'vnfd:vnfd-catalog': - {'vnfd': - [{'short-name': 'RouterVNF', - 'vdu': - [{'routing_table': [], - 'description': 'RouterVNF', - 'name': 'router-baremetal', - 'nd_route_tbl': [], - 'id': 'router-baremetal', - 'external-interface': - [{'virtual-interface': - {'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}]}], - 'description': 'RouterVNF', - 'mgmt-interface': - {'vdu-id': 'router-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'RouterVNF', 'name': 'VPEVnfSsh'}]}} - - scenario_cfg = {'nodes': {'cpt__0': 'compute_0.compute_nodes', - 'tg__0': 'trafficgen_1.baremetal', - 'vnf__0': 'vnf.yardstick'}, - 'options': {'flow': {'count': 128000, - 'dst_ip': ['10.0.3.26-10.0.3.105'], - 'dst_port': ['2001-2004'], - 'src_ip': ['10.0.2.26-10.0.2.105'], - 'src_port': ['1234-1238']}, - 'framesize': {'downlink': {'1024B': 100}, - 'uplink': {'1024B': 100}}, - 'rfc2544': {'allowed_drop_rate': '0.0001 - 0.1'}, - 'tg__0': {'queues_per_port': 7}, - 'traffic_type': 4, - 'vnf__0': {'nfvi_enable': True}}, - 'runner': {'interval': 35, - 'iterations': 10, - 'type': 'Iteration'}, - 'topology': 'router-tg-topology.yaml', - 'traffic_profile': '../../traffic_profiles/ipv4_throughput.yaml', - 'type': 'NSPerf'} - - context_cfg = {'nodes': {'tg__1': - {'member-vnf-index': '1', - 'role': 'TrafficGen', - 'name': 'trafficgen_1.yardstick', - 'vnfd-id-ref': 'tg__1', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens785f0', - 'vld_id': RouterVNF.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.20', - 'dst_mac': '00:00:00:00:00:02', - 'local_mac': '00:00:00:00:00:04', - 'dst_ip': '152.16.100.19', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens785f1', - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.21', - 'local_mac': '00:00:00:00:00:01', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1}}, - 'password': 'r00t', - 'VNF model': 'tg_rfc2544_tpl.yaml', - 'user': 'root'}, - 'vnf__1': - {'name': 'vnf.yardstick', - 'vnfd-id-ref': 'vnf__1', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens786f0', - 'vld_id': RouterVNF.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.19', - 'dst_mac': '00:00:00:00:00:04', - 'local_mac': '00:00:00:00:00:02', - 'dst_ip': '152.16.100.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens786f1', - 'vld_id': RouterVNF.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.19', - 'dst_mac': '00:00:00:00:00:03', - 'local_mac': '00:00:00:00:00:01', - 'dst_ip': '152.16.40.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1}}, - 'routing_table': [], - 'member-vnf-index': '2', - 'host': '1.2.1.1', - 'role': 'vnf', - 'user': 'root', - 'nd_route_tbl': [], - 'password': 'r00t', - 'VNF model': 'router_vnf.yaml'}}} - - IP_SHOW_STATS_OUTPUT = """\ -2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 - link/ether d4:c9:ef:52:7c:4d brd ff:ff:ff:ff:ff:ff - RX: bytes packets errors dropped overrun mcast - 2781945429 3202213 0 0 0 30131 - RX errors: length crc frame fifo missed - 0 0 0 0 0 - TX: bytes packets errors dropped carrier collsns - 646221183 2145799 0 0 0 0 - TX errors: aborted fifo window heartbeat - 0 0 0 0 -""" - STATS = { - 'RX:bytes': '2781945429', - 'RX:dropped': '0', - 'RX:errors': '0', - 'RX:mcast': '30131', - 'RX:overrun': '0', - 'RX:packets': '3202213', - 'RX errors:length': '0', - 'RX errors:crc': '0', - 'RX errors:frame': '0', - 'RX errors:fifo': '0', - 'RX errors:missed': '0', - 'TX:bytes': '646221183', - 'TX:carrier': '0', - 'TX:collsns': '0', - 'TX:dropped': '0', - 'TX:errors': '0', - 'TX:packets': '2145799', - 'TX errors:aborted': '0', - 'TX errors:fifo': '0', - 'TX errors:window': '0', - 'TX errors:heartbeat': '0', - } - - def test___init__(self): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - router_vnf = RouterVNF(name, vnfd) - self.assertIsNone(router_vnf._vnf_process) - - def test_get_stats(self): - stats = RouterVNF.get_stats(self.IP_SHOW_STATS_OUTPUT) - self.assertDictEqual(stats, self.STATS) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, _): - m = mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - router_vnf = RouterVNF(name, vnfd) - router_vnf.ssh_helper = m - result = {'packets_dropped': 0, 'packets_fwd': 0, 'packets_in': 0, 'link_stats': {}} - self.assertEqual(result, router_vnf.collect_kpi()) - - @mock.patch(SSH_HELPER) - def test_run_router(self, ssh): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - router_vnf = RouterVNF(name, vnfd) - router_vnf.scenario_helper.scenario_cfg = self.scenario_cfg - router_vnf._run() - router_vnf.ssh_helper.drop_connection.assert_called_once() - - @mock.patch("yardstick.network_services.vnf_generic.vnf.router_vnf.Context") - @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh, _): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - router_vnf = RouterVNF(name, vnfd) - router_vnf.WAIT_TIME = 0 - router_vnf.INTERFACE_WAIT = 0 - self.scenario_cfg.update({"nodes": {"vnf__1": ""}}) - self.assertIsNone(router_vnf.instantiate(self.scenario_cfg, - self.context_cfg)) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, _): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - router_vnf = RouterVNF(name, vnfd) - router_vnf._vnf_process = mock.MagicMock() - router_vnf._vnf_process.terminate = mock.Mock() - self.assertIsNone(router_vnf.terminate()) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py deleted file mode 100644 index 38a043d00..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py +++ /dev/null @@ -1,2091 +0,0 @@ -# Copyright (c) 2017-2018 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 copy import deepcopy - -import unittest -import mock -import six - -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh -from tests.unit import STL_MOCKS -from yardstick.benchmark.contexts.base import Context -from yardstick.common import exceptions as y_exceptions -from yardstick.common import utils -from yardstick.network_services.nfvi.resource import ResourceProfile -from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper - - -class MockError(BaseException): - pass - - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf import sample_vnf - from yardstick.network_services.vnf_generic.vnf.vnf_ssh_helper import VnfSshHelper - from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFDeployHelper - from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper - from yardstick.network_services.vnf_generic.vnf.sample_vnf import ResourceHelper - from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper - from yardstick.network_services.vnf_generic.vnf.sample_vnf import Rfc2544ResourceHelper - from yardstick.network_services.vnf_generic.vnf.sample_vnf import SetupEnvHelper - from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF - from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNFTrafficGen - from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper - - -class TestVnfSshHelper(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01', - 'vld_id': 'uplink_0', - 'ifname': 'xe0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02', - 'vld_id': 'downlink_0', - 'ifname': 'xe1', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ] - } - } - - def assertAll(self, iterable, message=None): - self.assertTrue(all(iterable), message) - - def test_get_class(self): - self.assertIs(VnfSshHelper.get_class(), VnfSshHelper) - - @mock.patch('yardstick.ssh.paramiko') - def test_copy(self, _): - ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path') - ssh_helper._run = mock.Mock() - - ssh_helper.execute('ls') - self.assertTrue(ssh_helper.is_connected) - result = ssh_helper.copy() - self.assertIsInstance(result, VnfSshHelper) - self.assertFalse(result.is_connected) - self.assertEqual(result.bin_path, ssh_helper.bin_path) - self.assertEqual(result.host, ssh_helper.host) - self.assertEqual(result.port, ssh_helper.port) - self.assertEqual(result.user, ssh_helper.user) - self.assertEqual(result.password, ssh_helper.password) - self.assertEqual(result.key_filename, ssh_helper.key_filename) - - @mock.patch('yardstick.ssh.paramiko') - def test_upload_config_file(self, mock_paramiko): - ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path') - ssh_helper._run = mock.MagicMock() - - self.assertFalse(ssh_helper.is_connected) - cfg_file = ssh_helper.upload_config_file('my/prefix', 'my content') - self.assertTrue(ssh_helper.is_connected) - self.assertEqual(mock_paramiko.SSHClient.call_count, 1) - self.assertTrue(cfg_file.startswith('/tmp')) - - cfg_file = ssh_helper.upload_config_file('/my/prefix', 'my content') - self.assertTrue(ssh_helper.is_connected) - self.assertEqual(mock_paramiko.SSHClient.call_count, 1) - self.assertEqual(cfg_file, '/my/prefix') - - def test_join_bin_path(self): - ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path') - - expected_start = 'my' - expected_middle_list = ['bin'] - expected_end = 'path' - result = ssh_helper.join_bin_path() - self.assertTrue(result.startswith(expected_start)) - self.assertAll(middle in result for middle in expected_middle_list) - self.assertTrue(result.endswith(expected_end)) - - expected_middle_list.append(expected_end) - expected_end = 'some_file.sh' - result = ssh_helper.join_bin_path('some_file.sh') - self.assertTrue(result.startswith(expected_start)) - self.assertAll(middle in result for middle in expected_middle_list) - self.assertTrue(result.endswith(expected_end)) - - expected_middle_list.append('some_dir') - expected_end = 'some_file.sh' - result = ssh_helper.join_bin_path('some_dir', 'some_file.sh') - self.assertTrue(result.startswith(expected_start)) - self.assertAll(middle in result for middle in expected_middle_list) - self.assertTrue(result.endswith(expected_end)) - - @mock.patch('yardstick.ssh.paramiko') - @mock.patch('yardstick.ssh.provision_tool') - def test_provision_tool(self, mock_provision_tool, mock_paramiko): - ssh_helper = VnfSshHelper(self.VNFD_0['mgmt-interface'], 'my/bin/path') - ssh_helper._run = mock.MagicMock() - - self.assertFalse(ssh_helper.is_connected) - ssh_helper.provision_tool() - self.assertTrue(ssh_helper.is_connected) - self.assertEqual(mock_paramiko.SSHClient.call_count, 1) - self.assertEqual(mock_provision_tool.call_count, 1) - - ssh_helper.provision_tool(tool_file='my_tool.sh') - self.assertTrue(ssh_helper.is_connected) - self.assertEqual(mock_paramiko.SSHClient.call_count, 1) - self.assertEqual(mock_provision_tool.call_count, 2) - - ssh_helper.provision_tool('tool_path', 'my_tool.sh') - self.assertTrue(ssh_helper.is_connected) - self.assertEqual(mock_paramiko.SSHClient.call_count, 1) - self.assertEqual(mock_provision_tool.call_count, 3) - - -class TestSetupEnvHelper(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01', - 'vld_id': 'uplink_0', - 'ifname': 'xe0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02', - 'vld_id': 'downlink_0', - 'ifname': 'xe1', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' - } - - def test_build_config(self): - setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock()) - - with self.assertRaises(NotImplementedError): - setup_env_helper.build_config() - - def test_setup_vnf_environment(self): - setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock()) - self.assertIsNone(setup_env_helper.setup_vnf_environment()) - - def test_tear_down(self): - setup_env_helper = SetupEnvHelper(mock.Mock(), mock.Mock(), mock.Mock()) - - with self.assertRaises(NotImplementedError): - setup_env_helper.tear_down() - - -class TestDpdkVnfSetupEnvHelper(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0, - 'driver': 'i40e', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01', - 'vld_id': 'uplink_0', - 'ifname': 'xe0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1, - 'driver': 'ixgbe', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02', - 'vld_id': 'downlink_0', - 'ifname': 'xe1', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ] - } - } - - def test__update_packet_type(self): - ip_pipeline_cfg = 'pkt_type = ipv4' - pkt_type = {'pkt_type': '1'} - - expected = "pkt_type = 1" - result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type) - self.assertEqual(result, expected) - - def test__update_packet_type_no_op(self): - ip_pipeline_cfg = 'pkt_type = ipv6' - pkt_type = {'pkt_type': '1'} - - expected = "pkt_type = ipv6" - result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type) - self.assertEqual(result, expected) - - def test__update_packet_type_multi_op(self): - ip_pipeline_cfg = 'pkt_type = ipv4\npkt_type = 1\npkt_type = ipv4' - pkt_type = {'pkt_type': '1'} - - expected = 'pkt_type = 1\npkt_type = 1\npkt_type = 1' - result = DpdkVnfSetupEnvHelper._update_packet_type(ip_pipeline_cfg, pkt_type) - self.assertEqual(result, expected) - - def test__update_traffic_type(self): - ip_pipeline_cfg = 'pkt_type = ipv4' - - traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 4} - expected = "pkt_type = ipv4" - result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options) - self.assertEqual(result, expected) - - def test__update_traffic_type_ipv6(self): - ip_pipeline_cfg = 'pkt_type = ipv4' - - traffic_options = {"vnf_type": DpdkVnfSetupEnvHelper.APP_NAME, 'traffic_type': 6} - expected = "pkt_type = ipv6" - result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options) - self.assertEqual(result, expected) - - def test__update_traffic_type_not_app_name(self): - ip_pipeline_cfg = 'traffic_type = 4' - - vnf_type = ''.join(["Not", DpdkVnfSetupEnvHelper.APP_NAME]) - traffic_options = {"vnf_type": vnf_type, 'traffic_type': 8} - expected = "traffic_type = 8" - result = DpdkVnfSetupEnvHelper._update_traffic_type(ip_pipeline_cfg, traffic_options) - self.assertEqual(result, expected) - - @mock.patch.object(six, 'BytesIO', return_value=six.BytesIO(b'100\n')) - @mock.patch.object(utils, 'read_meminfo', - return_value={'Hugepagesize': '2048'}) - def test__setup_hugepages_no_hugepages_defined(self, mock_meminfo, *args): - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - scenario_helper.all_options = {} - dpdk_setup_helper = DpdkVnfSetupEnvHelper( - mock.ANY, ssh_helper, scenario_helper) - with mock.patch.object(sample_vnf.LOG, 'info') as mock_info: - dpdk_setup_helper._setup_hugepages() - mock_info.assert_called_once_with( - 'Hugepages size (kB): %s, number claimed: %s, number set: ' - '%s', 2048, 8192, 100) - mock_meminfo.assert_called_once_with(ssh_helper) - - @mock.patch.object(six, 'BytesIO', return_value=six.BytesIO(b'100\n')) - @mock.patch.object(utils, 'read_meminfo', - return_value={'Hugepagesize': '1048576'}) - def test__setup_hugepages_8gb_hugepages_defined(self, mock_meminfo, *args): - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - scenario_helper.all_options = {'hugepages_gb': 8} - dpdk_setup_helper = DpdkVnfSetupEnvHelper( - mock.ANY, ssh_helper, scenario_helper) - with mock.patch.object(sample_vnf.LOG, 'info') as mock_info: - dpdk_setup_helper._setup_hugepages() - mock_info.assert_called_once_with( - 'Hugepages size (kB): %s, number claimed: %s, number set: ' - '%s', 1048576, 8, 100) - mock_meminfo.assert_called_once_with(ssh_helper) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.open') - @mock.patch.object(utils, 'find_relative_file') - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig') - @mock.patch.object(utils, 'open_relative_file') - def test_build_config(self, mock_open_rf, mock_multi_port_config_class, mock_find, *args): - mock_multi_port_config = mock_multi_port_config_class() - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - scenario_helper.vnf_cfg = {} - scenario_helper.all_options = {} - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - - dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command' - result = dpdk_setup_helper.build_config() - self.assertEqual(result, expected) - self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2) - self.assertGreaterEqual(mock_find.call_count, 1) - self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1) - self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1) - - scenario_helper.vnf_cfg = {'file': 'fake_file'} - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - mock_open_rf.side_effect = mock.mock_open(read_data='fake_data') - dpdk_setup_helper.PIPELINE_COMMAND = expected = 'pipeline command' - - result = dpdk_setup_helper.build_config() - - mock_open_rf.assert_called_once() - self.assertEqual(result, expected) - self.assertGreaterEqual(ssh_helper.upload_config_file.call_count, 2) - self.assertGreaterEqual(mock_find.call_count, 1) - self.assertGreaterEqual(mock_multi_port_config.generate_config.call_count, 1) - self.assertGreaterEqual(mock_multi_port_config.generate_script.call_count, 1) - - def test__build_pipeline_kwargs(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - ssh_helper.provision_tool.return_value = 'tool_path' - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - dpdk_setup_helper.CFG_CONFIG = 'config' - dpdk_setup_helper.CFG_SCRIPT = 'script' - dpdk_setup_helper.pipeline_kwargs = {} - dpdk_setup_helper.all_ports = [0, 1, 2] - - expected = { - 'cfg_file': 'config', - 'script': 'script', - 'port_mask_hex': '0x3', - 'tool_path': 'tool_path', - } - dpdk_setup_helper._build_pipeline_kwargs() - self.assertDictEqual(dpdk_setup_helper.pipeline_kwargs, expected) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') - @mock.patch('yardstick.ssh.SSH') - def test_setup_vnf_environment(self, *args): - def execute(cmd): - if cmd.startswith('which '): - return exec_failure - return exec_success - - exec_success = (0, 'good output', '') - exec_failure = (1, 'bad output', 'error output') - - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - ssh_helper.execute = execute - - scenario_helper = mock.Mock() - scenario_helper.nodes = [None, None] - dpdk_vnf_setup_env_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - dpdk_vnf_setup_env_helper._validate_cpu_cfg = mock.Mock(return_value=[]) - - with mock.patch.object(dpdk_vnf_setup_env_helper, '_setup_dpdk'): - self.assertIsInstance( - dpdk_vnf_setup_env_helper.setup_vnf_environment(), - ResourceProfile) - - def test__setup_dpdk(self): - ssh_helper = mock.Mock() - ssh_helper.execute = mock.Mock() - ssh_helper.execute.return_value = (0, 0, 0) - dpdk_setup_helper = DpdkVnfSetupEnvHelper(mock.ANY, ssh_helper, mock.ANY) - with mock.patch.object(dpdk_setup_helper, '_setup_hugepages') as \ - mock_setup_hp: - dpdk_setup_helper._setup_dpdk() - mock_setup_hp.assert_called_once() - ssh_helper.execute.assert_has_calls([ - mock.call('sudo modprobe uio && sudo modprobe igb_uio'), - mock.call('lsmod | grep -i igb_uio') - ]) - - @mock.patch('yardstick.ssh.SSH') - def test__setup_resources(self, _): - vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0)) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - dpdk_setup_helper._validate_cpu_cfg = mock.Mock() - - dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in - vnfd_helper.interfaces] - result = dpdk_setup_helper._setup_resources() - self.assertIsInstance(result, ResourceProfile) - self.assertEqual(dpdk_setup_helper.socket, 0) - - @mock.patch('yardstick.ssh.SSH') - def test__setup_resources_socket_1(self, _): - vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0)) - vnfd_helper.interfaces[0]['virtual-interface']['vpci'] = '0000:55:00.0' - vnfd_helper.interfaces[1]['virtual-interface']['vpci'] = '0000:35:00.0' - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - dpdk_setup_helper._validate_cpu_cfg = mock.Mock() - - dpdk_setup_helper.bound_pci = [v['virtual-interface']["vpci"] for v in - vnfd_helper.interfaces] - result = dpdk_setup_helper._setup_resources() - self.assertIsInstance(result, ResourceProfile) - self.assertEqual(dpdk_setup_helper.socket, 1) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') - def test__detect_and_bind_drivers(self, *args): - vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0)) - ssh_helper = mock.Mock() - # ssh_helper.execute = mock.Mock(return_value = (0, 'text', '')) - # ssh_helper.execute.return_value = 0, 'output', '' - scenario_helper = mock.Mock() - scenario_helper.nodes = [None, None] - rv = ['0000:05:00.1', '0000:05:00.0'] - - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - dpdk_setup_helper.dpdk_bind_helper._get_bound_pci_addresses = mock.Mock(return_value=rv) - dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock() - dpdk_setup_helper.dpdk_bind_helper.read_status = mock.Mock() - - self.assertIsNone(dpdk_setup_helper._detect_and_bind_drivers()) - - intf_0 = vnfd_helper.vdu[0]['external-interface'][0]['virtual-interface'] - intf_1 = vnfd_helper.vdu[0]['external-interface'][1]['virtual-interface'] - self.assertEqual(0, intf_0['dpdk_port_num']) - self.assertEqual(1, intf_1['dpdk_port_num']) - - def test_tear_down(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - scenario_helper.nodes = [None, None] - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - dpdk_setup_helper.dpdk_bind_helper.bind = mock.Mock() - dpdk_setup_helper.dpdk_bind_helper.used_drivers = { - 'd1': ['0000:05:00.0'], - 'd3': ['0000:05:01.0'], - } - - self.assertIsNone(dpdk_setup_helper.tear_down()) - dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:00.0'], 'd1', True) - dpdk_setup_helper.dpdk_bind_helper.bind.assert_any_call(['0000:05:01.0'], 'd3', True) - - -class TestResourceHelper(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'driver': 'i40e', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01' - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'driver': 'ixgbe', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02' - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' - } - - def test_setup(self): - resource = object() - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - dpdk_setup_helper.setup_vnf_environment = mock.Mock(return_value=resource) - resource_helper = ResourceHelper(dpdk_setup_helper) - - self.assertIsNone(resource_helper.setup()) - self.assertIs(resource_helper.resource, resource) - - def test_generate_cfg(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - resource_helper = ResourceHelper(dpdk_setup_helper) - - self.assertIsNone(resource_helper.generate_cfg()) - - def test_stop_collect(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - resource_helper = ResourceHelper(dpdk_setup_helper) - resource_helper.resource = mock.Mock() - - self.assertIsNone(resource_helper.stop_collect()) - - def test_stop_collect_none(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - resource_helper = ResourceHelper(dpdk_setup_helper) - resource_helper.resource = None - - self.assertIsNone(resource_helper.stop_collect()) - - -class TestClientResourceHelper(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'driver': 'i40e', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01', - 'vld_id': 'uplink_0', - 'ifname': 'xe0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'driver': 'ixgbe', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02', - 'vld_id': 'downlink_0', - 'ifname': 'xe1', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:13', - 'vpci': '0000:05:00.2', - 'driver': 'ixgbe', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 2, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.30', - 'local_mac': '00:00:00:00:00:11' - }, - 'vnfd-connection-point-ref': 'xe2', - 'name': 'xe2' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ], - }, - } - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG') - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError', - new_callable=lambda: MockError) - def test_get_stats_not_connected(self, mock_state_error, *args): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client_resource_helper.client = mock.MagicMock() - client_resource_helper.client.get_stats.side_effect = mock_state_error - - self.assertEqual(client_resource_helper.get_stats(), {}) - self.assertEqual(client_resource_helper.client.get_stats.call_count, 1) - - def test_generate_samples(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client_resource_helper.client = mock.MagicMock() - client_resource_helper.client.get_stats.return_value = { - 0: { - 'rx_pps': 5.5, - 'tx_pps': 4.9, - 'rx_bps': 234.78, - 'tx_bps': 243.11, - 'ipackets': 34251, - 'opackets': 52342, - }, - 1: { - 'tx_pps': 5.9, - 'rx_bps': 434.78, - 'opackets': 48791, - }, - } - - expected = { - 'xe0': { - "rx_throughput_fps": 5.5, - "tx_throughput_fps": 4.9, - "rx_throughput_mbps": 234.78, - "tx_throughput_mbps": 243.11, - "in_packets": 34251, - "out_packets": 52342, - }, - 'xe1': { - "rx_throughput_fps": 0.0, - "tx_throughput_fps": 5.9, - "rx_throughput_mbps": 434.78, - "tx_throughput_mbps": 0.0, - "in_packets": 0, - "out_packets": 48791, - }, - } - ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports) - result = client_resource_helper.generate_samples(ports) - self.assertDictEqual(result, expected) - - def test_generate_samples_with_key(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client_resource_helper.client = mock.MagicMock() - client_resource_helper.client.get_stats.return_value = { - 'key_name': 'key_value', - 0: { - 'rx_pps': 5.5, - 'tx_pps': 4.9, - 'rx_bps': 234.78, - 'tx_bps': 243.11, - 'ipackets': 34251, - 'opackets': 52342, - }, - 1: { - 'tx_pps': 5.9, - 'rx_bps': 434.78, - 'opackets': 48791, - }, - } - - expected = { - 'xe0': { - 'key_name': 'key_value', - "rx_throughput_fps": 5.5, - "tx_throughput_fps": 4.9, - "rx_throughput_mbps": 234.78, - "tx_throughput_mbps": 243.11, - "in_packets": 34251, - "out_packets": 52342, - }, - 'xe1': { - 'key_name': 'key_value', - "rx_throughput_fps": 0.0, - "tx_throughput_fps": 5.9, - "rx_throughput_mbps": 434.78, - "tx_throughput_mbps": 0.0, - "in_packets": 0, - "out_packets": 48791, - }, - } - ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports) - result = client_resource_helper.generate_samples(ports, 'key_name') - self.assertDictEqual(result, expected) - - def test_generate_samples_with_key_and_default(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client_resource_helper.client = mock.MagicMock() - client_resource_helper.client.get_stats.return_value = { - 0: { - 'rx_pps': 5.5, - 'tx_pps': 4.9, - 'rx_bps': 234.78, - 'tx_bps': 243.11, - 'ipackets': 34251, - 'opackets': 52342, - }, - 1: { - 'tx_pps': 5.9, - 'rx_bps': 434.78, - 'opackets': 48791, - }, - } - - expected = { - 'xe0': { - 'key_name': 'default', - "rx_throughput_fps": 5.5, - "tx_throughput_fps": 4.9, - "rx_throughput_mbps": 234.78, - "tx_throughput_mbps": 243.11, - "in_packets": 34251, - "out_packets": 52342, - }, - 'xe1': { - 'key_name': 'default', - "rx_throughput_fps": 0.0, - "tx_throughput_fps": 5.9, - "rx_throughput_mbps": 434.78, - "tx_throughput_mbps": 0.0, - "in_packets": 0, - "out_packets": 48791, - }, - } - ports = vnfd_helper.port_nums(vnfd_helper.port_pairs.all_ports) - result = client_resource_helper.generate_samples(ports, 'key_name', 'default') - self.assertDictEqual(result, expected) - - def test_clear_stats(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client_resource_helper.client = mock.Mock() - - self.assertIsNone(client_resource_helper.clear_stats()) - self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1) - - def test_clear_stats_of_ports(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client_resource_helper.client = mock.Mock() - - self.assertIsNone(client_resource_helper.clear_stats([3, 4])) - self.assertEqual(client_resource_helper.client.clear_stats.call_count, 1) - - def test_start(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client_resource_helper.client = mock.Mock() - - self.assertIsNone(client_resource_helper.start()) - self.assertEqual(client_resource_helper.client.start.call_count, 1) - - def test_start_ports(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client_resource_helper.client = mock.Mock() - - self.assertIsNone(client_resource_helper.start([3, 4])) - self.assertEqual(client_resource_helper.client.start.call_count, 1) - - def test_collect_kpi_with_queue(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client_resource_helper._result = {'existing': 43, 'replaceable': 12} - client_resource_helper._queue = mock.Mock() - client_resource_helper._queue.empty.return_value = False - client_resource_helper._queue.get.return_value = {'incoming': 34, 'replaceable': 99} - - expected = { - 'existing': 43, - 'incoming': 34, - 'replaceable': 99, - } - result = client_resource_helper.collect_kpi() - self.assertDictEqual(result, expected) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG') - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError', - new_callable=lambda: MockError) - def test__connect_with_failures(self, mock_error, *args): - vnfd_helper = VnfdHelper(self.VNFD_0) - ssh_helper = mock.Mock() - scenario_helper = mock.Mock() - dpdk_setup_helper = DpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - client_resource_helper = ClientResourceHelper(dpdk_setup_helper) - client = mock.MagicMock() - client.connect.side_effect = mock_error - - self.assertIs(client_resource_helper._connect(client), client) - - -class TestRfc2544ResourceHelper(unittest.TestCase): - - RFC2544_CFG_1 = { - 'latency': True, - 'correlated_traffic': True, - 'allowed_drop_rate': '0.1 - 0.15', - } - - RFC2544_CFG_2 = { - 'allowed_drop_rate': ' 0.25 - 0.05 ', - } - - RFC2544_CFG_3 = { - 'allowed_drop_rate': '0.2', - } - - RFC2544_CFG_4 = { - 'latency': True, - } - - SCENARIO_CFG_1 = { - 'options': { - 'rfc2544': RFC2544_CFG_1, - } - } - - SCENARIO_CFG_2 = { - 'options': { - 'rfc2544': RFC2544_CFG_2, - } - } - - SCENARIO_CFG_3 = { - 'options': { - 'rfc2544': RFC2544_CFG_3, - } - } - - SCENARIO_CFG_4 = { - 'options': { - 'rfc2544': RFC2544_CFG_4, - } - } - - def test_property_rfc2544(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_1 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertIsNone(rfc2544_resource_helper._rfc2544) - self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1) - self.assertDictEqual(rfc2544_resource_helper._rfc2544, self.RFC2544_CFG_1) - scenario_helper.scenario_cfg = {} # ensure that resource_helper caches - self.assertDictEqual(rfc2544_resource_helper.rfc2544, self.RFC2544_CFG_1) - - def test_property_tolerance_high(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_1 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertIsNone(rfc2544_resource_helper._tolerance_high) - self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15) - self.assertEqual(rfc2544_resource_helper._tolerance_high, 0.15) - scenario_helper.scenario_cfg = {} # ensure that resource_helper caches - self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.15) - - def test_property_tolerance_low(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_1 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertIsNone(rfc2544_resource_helper._tolerance_low) - self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1) - self.assertEqual(rfc2544_resource_helper._tolerance_low, 0.1) - scenario_helper.scenario_cfg = {} # ensure that resource_helper caches - self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.1) - - def test_property_tolerance_high_range_swap(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_2 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.25) - - def test_property_tolerance_low_range_swap(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_2 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.05) - - def test_property_tolerance_high_not_range(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_3 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.2) - - def test_property_tolerance_low_not_range(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_3 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.2) - - def test_property_tolerance_high_default(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_4 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertEqual(rfc2544_resource_helper.tolerance_high, 0.0001) - - def test_property_tolerance_low_default(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_4 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertEqual(rfc2544_resource_helper.tolerance_low, 0.0001) - - def test_property_latency(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_1 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertIsNone(rfc2544_resource_helper._latency) - self.assertTrue(rfc2544_resource_helper.latency) - self.assertTrue(rfc2544_resource_helper._latency) - scenario_helper.scenario_cfg = {} # ensure that resource_helper caches - self.assertTrue(rfc2544_resource_helper.latency) - - def test_property_latency_default(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_2 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertFalse(rfc2544_resource_helper.latency) - - def test_property_correlated_traffic(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_1 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertIsNone(rfc2544_resource_helper._correlated_traffic) - self.assertTrue(rfc2544_resource_helper.correlated_traffic) - self.assertTrue(rfc2544_resource_helper._correlated_traffic) - scenario_helper.scenario_cfg = {} # ensure that resource_helper caches - self.assertTrue(rfc2544_resource_helper.correlated_traffic) - - def test_property_correlated_traffic_default(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = self.SCENARIO_CFG_2 - rfc2544_resource_helper = Rfc2544ResourceHelper(scenario_helper) - - self.assertFalse(rfc2544_resource_helper.correlated_traffic) - - -class TestSampleVNFDeployHelper(unittest.TestCase): - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') - @mock.patch('subprocess.check_output') - def test_deploy_vnfs_disabled(self, *_): - vnfd_helper = mock.Mock() - ssh_helper = mock.Mock() - ssh_helper.join_bin_path.return_value = 'joined_path' - ssh_helper.execute.return_value = 1, 'bad output', 'error output' - ssh_helper.put.return_value = None - sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper) - - self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1')) - sample_vnf_deploy_helper.DISABLE_DEPLOY = True - self.assertEqual(ssh_helper.execute.call_count, 5) - self.assertEqual(ssh_helper.put.call_count, 1) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') - @mock.patch('subprocess.check_output') - def test_deploy_vnfs(self, *args): - vnfd_helper = mock.Mock() - ssh_helper = mock.Mock() - ssh_helper.join_bin_path.return_value = 'joined_path' - ssh_helper.execute.return_value = 1, 'bad output', 'error output' - ssh_helper.put.return_value = None - sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper) - sample_vnf_deploy_helper.DISABLE_DEPLOY = False - - self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1')) - self.assertEqual(ssh_helper.execute.call_count, 5) - self.assertEqual(ssh_helper.put.call_count, 1) - - @mock.patch('subprocess.check_output') - def test_deploy_vnfs_early_success(self, *args): - vnfd_helper = mock.Mock() - ssh_helper = mock.Mock() - ssh_helper.join_bin_path.return_value = 'joined_path' - ssh_helper.execute.return_value = 0, 'output', '' - ssh_helper.put.return_value = None - sample_vnf_deploy_helper = SampleVNFDeployHelper(vnfd_helper, ssh_helper) - sample_vnf_deploy_helper.DISABLE_DEPLOY = False - - self.assertIsNone(sample_vnf_deploy_helper.deploy_vnfs('name1')) - self.assertEqual(ssh_helper.execute.call_count, 1) - self.assertEqual(ssh_helper.put.call_count, 0) - - -class TestScenarioHelper(unittest.TestCase): - - def test_property_task_path(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = { - 'task_path': 'my_path', - } - - self.assertEqual(scenario_helper.task_path, 'my_path') - - def test_property_nodes(self): - nodes = ['node1', 'node2'] - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = { - 'nodes': nodes, - } - - self.assertEqual(scenario_helper.nodes, nodes) - - def test_property_all_options(self): - data = { - 'name1': { - 'key3': 'value3', - }, - 'name2': {} - } - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = { - 'options': data, - } - - self.assertDictEqual(scenario_helper.all_options, data) - - def test_property_options(self): - data = { - 'key1': 'value1', - 'key2': 'value2', - } - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = { - 'options': { - 'name1': data, - }, - } - - self.assertDictEqual(scenario_helper.options, data) - - def test_property_vnf_cfg(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = { - 'options': { - 'name1': { - 'vnf_config': 'my_config', - }, - }, - } - - self.assertEqual(scenario_helper.vnf_cfg, 'my_config') - - def test_property_vnf_cfg_default(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = { - 'options': { - 'name1': {}, - }, - } - - self.assertDictEqual(scenario_helper.vnf_cfg, ScenarioHelper.DEFAULT_VNF_CFG) - - def test_property_topology(self): - scenario_helper = ScenarioHelper('name1') - scenario_helper.scenario_cfg = { - 'topology': 'my_topology', - } - - self.assertEqual(scenario_helper.topology, 'my_topology') - - -class TestSampleVnf(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01' - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02' - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ] - } - } - - 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, - }, - } - - def test___init__(self): - sample_vnf = SampleVNF('vnf1', self.VNFD_0) - - self.assertEqual(sample_vnf.name, 'vnf1') - self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0) - - # test the default setup helper is SetupEnvHelper, not subclass - self.assertEqual(type(sample_vnf.setup_helper), SetupEnvHelper) - - # test the default resource helper is ResourceHelper, not subclass - self.assertEqual(type(sample_vnf.resource_helper), ResourceHelper) - - def test___init___alt_types(self): - class MySetupEnvHelper(SetupEnvHelper): - pass - - class MyResourceHelper(ResourceHelper): - pass - - sample_vnf = SampleVNF('vnf1', self.VNFD_0, MySetupEnvHelper, MyResourceHelper) - - self.assertEqual(sample_vnf.name, 'vnf1') - self.assertDictEqual(sample_vnf.vnfd_helper, self.VNFD_0) - - # test the default setup helper is MySetupEnvHelper, not subclass - self.assertEqual(type(sample_vnf.setup_helper), MySetupEnvHelper) - - # test the default resource helper is MyResourceHelper, not subclass - self.assertEqual(type(sample_vnf.resource_helper), MyResourceHelper) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process') - def test__start_vnf(self, *args): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf._run = mock.Mock() - - self.assertIsNone(sample_vnf.queue_wrapper) - self.assertIsNone(sample_vnf._vnf_process) - self.assertIsNone(sample_vnf._start_vnf()) - self.assertIsNotNone(sample_vnf.queue_wrapper) - self.assertIsNotNone(sample_vnf._vnf_process) - - @mock.patch("yardstick.ssh.SSH") - def test_instantiate(self, ssh): - mock_ssh(ssh) - - nodes = { - 'vnf1': 'name1', - 'vnf2': 'name2', - } - - context1 = mock.Mock() - context1._get_server.return_value = None - context2 = mock.Mock() - context2._get_server.return_value = context2 - - try: - Context.list.clear() - except AttributeError: - # clear() but works in Py2.7 - Context.list[:] = [] - - Context.list.extend([ - context1, - context2, - ]) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf.APP_NAME = 'sample1' - sample_vnf._start_server = mock.Mock(return_value=0) - sample_vnf._vnf_process = mock.MagicMock() - sample_vnf._vnf_process._is_alive.return_value = 1 - sample_vnf.ssh_helper = mock.MagicMock() - sample_vnf.deploy_helper = mock.MagicMock() - sample_vnf.resource_helper.ssh_helper = mock.MagicMock() - scenario_cfg = { - 'nodes': nodes, - } - - self.assertIsNone(sample_vnf.instantiate(scenario_cfg, {})) - self.assertEqual(sample_vnf.nfvi_context, context2) - - def test__update_collectd_options(self): - scenario_cfg = {'options': - {'collectd': - {'interval': 3, - 'plugins': - {'plugin3': {'param': 3}}}, - 'vnf__0': - {'collectd': - {'interval': 2, - 'plugins': - {'plugin3': {'param': 2}, - 'plugin2': {'param': 2}}}}}} - context_cfg = {'nodes': - {'vnf__0': - {'collectd': - {'interval': 1, - 'plugins': - {'plugin3': {'param': 1}, - 'plugin2': {'param': 1}, - 'plugin1': {'param': 1}}}}}} - expected = {'interval': 1, - 'plugins': - {'plugin3': {'param': 1}, - 'plugin2': {'param': 1}, - 'plugin1': {'param': 1}}} - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf__0', vnfd) - sample_vnf._update_collectd_options(scenario_cfg, context_cfg) - self.assertEqual(sample_vnf.setup_helper.collectd_options, expected) - - def test__update_options(self): - options1 = {'interval': 1, - 'param1': 'value1', - 'plugins': - {'plugin3': {'param': 3}, - 'plugin2': {'param': 1}, - 'plugin1': {'param': 1}}} - options2 = {'interval': 2, - 'param2': 'value2', - 'plugins': - {'plugin4': {'param': 4}, - 'plugin2': {'param': 2}, - 'plugin1': {'param': 2}}} - expected = {'interval': 1, - 'param1': 'value1', - 'param2': 'value2', - 'plugins': - {'plugin4': {'param': 4}, - 'plugin3': {'param': 3}, - 'plugin2': {'param': 1}, - 'plugin1': {'param': 1}}} - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf._update_options(options2, options1) - self.assertEqual(options2, expected) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch("yardstick.ssh.SSH") - def test_wait_for_instantiate_empty_queue(self, ssh, *args): - mock_ssh(ssh, exec_result=(1, "", "")) - - queue_size_list = [ - 0, - 1, - 0, - 1, - ] - - queue_get_list = [ - 'some output', - 'pipeline> ', - ] - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf.APP_NAME = 'sample1' - sample_vnf.WAIT_TIME_FOR_SCRIPT = 0 - sample_vnf._start_server = mock.Mock(return_value=0) - sample_vnf._vnf_process = mock.MagicMock() - sample_vnf._vnf_process.exitcode = 0 - sample_vnf._vnf_process._is_alive.return_value = 1 - sample_vnf.queue_wrapper = mock.Mock() - sample_vnf.q_out = mock.Mock() - sample_vnf.q_out.qsize.side_effect = iter(queue_size_list) - sample_vnf.q_out.get.side_effect = iter(queue_get_list) - sample_vnf.ssh_helper = mock.MagicMock() - sample_vnf.resource_helper.ssh_helper = mock.MagicMock() - sample_vnf.resource_helper.start_collect = mock.MagicMock() - - self.assertEqual(sample_vnf.wait_for_instantiate(), 0) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - def test_vnf_execute_with_queue_data(self, *args): - queue_size_list = [ - 1, - 1, - 0, - ] - - queue_get_list = [ - 'hello ', - 'world' - ] - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf.APP_NAME = 'sample1' - sample_vnf.q_out = mock.Mock() - sample_vnf.q_out.qsize.side_effect = iter(queue_size_list) - sample_vnf.q_out.get.side_effect = iter(queue_get_list) - - self.assertEqual(sample_vnf.vnf_execute('my command'), 'hello world') - - def test_terminate_without_vnf_process(self): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf.APP_NAME = 'sample1' - sample_vnf.vnf_execute = mock.Mock() - sample_vnf.ssh_helper = mock.Mock() - sample_vnf._tear_down = mock.Mock() - sample_vnf.resource_helper = mock.Mock() - - self.assertIsNone(sample_vnf.terminate()) - - def test_get_stats(self): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf.APP_NAME = 'sample1' - sample_vnf.APP_WORD = 'sample1' - sample_vnf.vnf_execute = mock.Mock(return_value='the stats') - - self.assertEqual(sample_vnf.get_stats(), 'the stats') - - def test_collect_kpi(self): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf.APP_NAME = 'sample1' - sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)' - sample_vnf.COLLECT_MAP = { - 'k1': 3, - 'k2': 1, - 'k3': 2, - } - sample_vnf.get_stats = mock.Mock(return_value='index0: 34 -- 91, 27') - sample_vnf.resource_helper = mock.Mock() - sample_vnf.resource_helper.collect_kpi.return_value = {} - - expected = { - 'k1': 27, - 'k2': 34, - 'k3': 91, - 'collect_stats': {}, - } - result = sample_vnf.collect_kpi() - self.assertDictEqual(result, expected) - - def test_collect_kpi_default(self): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf.APP_NAME = 'sample1' - sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)' - sample_vnf.get_stats = mock.Mock(return_value='') - - expected = { - 'packets_in': 0, - 'packets_fwd': 0, - 'packets_dropped': 0, - } - result = sample_vnf.collect_kpi() - self.assertDictEqual(result, expected) - - def test_scale(self): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - self.assertRaises(y_exceptions.FunctionNotImplemented, - sample_vnf.scale) - - def test__run(self): - test_cmd = 'test cmd' - run_kwargs = {'arg1': 'val1', 'arg2': 'val2'} - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sample_vnf = SampleVNF('vnf1', vnfd) - sample_vnf.ssh_helper = mock.Mock() - sample_vnf.setup_helper = mock.Mock() - with mock.patch.object(sample_vnf, '_build_config', - return_value=test_cmd), \ - mock.patch.object(sample_vnf, '_build_run_kwargs'): - sample_vnf.run_kwargs = run_kwargs - sample_vnf._run() - sample_vnf.ssh_helper.drop_connection.assert_called_once() - sample_vnf.ssh_helper.run.assert_called_once_with(test_cmd, - **run_kwargs) - sample_vnf.setup_helper.kill_vnf.assert_called_once() - - -class TestSampleVNFTrafficGen(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'driver': 'i40e', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01' - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'driver': 'ixgbe', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02' - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ], - }, - } - - 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, - }, - } - - def test__check_status(self): - sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0) - - with self.assertRaises(NotImplementedError): - sample_vnf_tg._check_status() - - def test_listen_traffic(self): - sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0) - - sample_vnf_tg.listen_traffic(mock.Mock()) - - def test_verify_traffic(self): - sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0) - - sample_vnf_tg.verify_traffic(mock.Mock()) - - def test_terminate(self): - sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0) - sample_vnf_tg._traffic_process = mock.Mock() - sample_vnf_tg._tg_process = mock.Mock() - - sample_vnf_tg.terminate() - - def test__wait_for_process(self): - sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0) - with mock.patch.object(sample_vnf_tg, '_check_status', - return_value=0) as mock_status, \ - mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc: - mock_proc.is_alive.return_value = True - mock_proc.exitcode = 234 - self.assertEqual(sample_vnf_tg._wait_for_process(), 234) - mock_proc.is_alive.assert_called_once() - mock_status.assert_called_once() - - def test__wait_for_process_not_alive(self): - sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0) - with mock.patch.object(sample_vnf_tg, '_tg_process') as mock_proc: - mock_proc.is_alive.return_value = False - self.assertRaises(RuntimeError, sample_vnf_tg._wait_for_process) - mock_proc.is_alive.assert_called_once() - - def test__wait_for_process_delayed(self): - sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0) - with mock.patch.object(sample_vnf_tg, '_check_status', - side_effect=[1, 0]) as mock_status, \ - mock.patch.object(sample_vnf_tg, - '_tg_process') as mock_proc: - mock_proc.is_alive.return_value = True - mock_proc.exitcode = 234 - self.assertEqual(sample_vnf_tg._wait_for_process(), 234) - mock_proc.is_alive.assert_has_calls([mock.call(), mock.call()]) - mock_status.assert_has_calls([mock.call(), mock.call()]) - - def test_scale(self): - sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0) - self.assertRaises(y_exceptions.FunctionNotImplemented, - sample_vnf_tg.scale) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_ixload.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_ixload.py deleted file mode 100644 index d831ddd3d..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_ixload.py +++ /dev/null @@ -1,318 +0,0 @@ -# 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. -# - -import subprocess - -import mock -import unittest -import six - -from tests.unit import STL_MOCKS -from yardstick import ssh -from yardstick.common import utils - - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.tg_ixload import IxLoadTrafficGen - from yardstick.network_services.vnf_generic.vnf.tg_ixload import IxLoadResourceHelper - from yardstick.network_services.traffic_profile.base import TrafficProfile - - -NAME = "tg__1" - - -class TestIxLoadTrafficGen(unittest.TestCase): - VNFD = {'vnfd:vnfd-catalog': - {'vnfd': - [{'short-name': 'VpeVnf', - 'vdu': - [{'routing_table': - [{'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0'}, - {'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1'}], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': - [{'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'id': 'vpevnf-baremetal', - 'external-interface': - [{'virtual-interface': - {'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}]}], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': - {'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} - - 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}} - - def test___init__(self): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd) - self.assertIsNone(ixload_traffic_gen.resource_helper.data) - - def test_collect_kpi(self): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd) - ixload_traffic_gen.data = {} - restult = ixload_traffic_gen.collect_kpi() - self.assertEqual({}, restult) - - def test_listen_traffic(self): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd) - self.assertIsNone(ixload_traffic_gen.listen_traffic({})) - - @mock.patch.object(utils, 'find_relative_file') - @mock.patch.object(utils, 'makedirs') - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil") - def test_instantiate(self, shutil, *args): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh_mock.run = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd) - scenario_cfg = {'tc': "nsb_test_case", - 'ixia_profile': "ixload.cfg", - 'task_path': "/path/to/task"} - ixload_traffic_gen.RESULTS_MOUNT = "/tmp/result" - shutil.copy = mock.Mock() - scenario_cfg.update({'options': {'packetsize': 64, 'traffic_type': 4, - 'rfc2544': {'allowed_drop_rate': '0.8 - 1'}, - 'vnf__1': {'rules': 'acl_1rule.yaml', - 'vnf_config': {'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': - '1C/1T', - 'worker_threads': 1}} - }}) - with mock.patch.object(six.moves.builtins, 'open', - create=True) as mock_open: - mock_open.return_value = mock.MagicMock() - ixload_traffic_gen.instantiate(scenario_cfg, {}) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.open") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.min") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.max") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.len") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil") - def test_run_traffic(self, shutil, *args): - mock_traffic_profile = mock.Mock(autospec=TrafficProfile) - mock_traffic_profile.get_traffic_definition.return_value = "64" - mock_traffic_profile.params = self.TRAFFIC_PROFILE - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh_mock.run = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vnfd["mgmt-interface"].update({"tg-config": {}}) - vnfd["mgmt-interface"]["tg-config"].update({"ixchassis": - "1.1.1.1"}) - vnfd["mgmt-interface"]["tg-config"].update({"py_bin_path": - "/root"}) - sut = IxLoadTrafficGen(NAME, vnfd) - sut.connection = mock.Mock() - sut.connection.run = mock.Mock() - sut._traffic_runner = mock.Mock(return_value=0) - shutil.copy = mock.Mock() - result = sut.run_traffic(mock_traffic_profile) - self.assertIsNone(result) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.open") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.min") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.max") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.len") - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.shutil") - def test_run_traffic_csv(self, shutil, *args): - mock_traffic_profile = mock.Mock(autospec=TrafficProfile) - mock_traffic_profile.get_traffic_definition.return_value = "64" - mock_traffic_profile.params = self.TRAFFIC_PROFILE - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh_mock.run = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vnfd["mgmt-interface"].update({"tg-config": {}}) - vnfd["mgmt-interface"]["tg-config"].update({"ixchassis": - "1.1.1.1"}) - vnfd["mgmt-interface"]["tg-config"].update({"py_bin_path": - "/root"}) - sut = IxLoadTrafficGen(NAME, vnfd) - sut.connection = mock.Mock() - sut.connection.run = mock.Mock() - sut._traffic_runner = mock.Mock(return_value=0) - shutil.copy = mock.Mock() - subprocess.call(["touch", "/tmp/1.csv"]) - sut.rel_bin_path = mock.Mock(return_value="/tmp/*.csv") - result = sut.run_traffic(mock_traffic_profile) - self.assertIsNone(result) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call") - @mock.patch.object(ssh, 'SSH') - def test_terminate(self, *args): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd) - self.assertIsNone(ixload_traffic_gen.terminate()) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call") - @mock.patch.object(ssh, 'SSH') - def test_parse_csv_read(self, mock_ssh, *args): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - kpi_data = { - 'HTTP Total Throughput (Kbps)': 1, - 'HTTP Simulated Users': 2, - 'HTTP Concurrent Connections': '3', - 'HTTP Connection Rate': 4.3, - 'HTTP Transaction Rate': True, - } - http_reader = [kpi_data] - - mock_ssh_type = mock.Mock(autospec=mock_ssh.SSH) - mock_ssh_type.execute.return_value = 0, "", "" - mock_ssh.from_node.return_value = mock_ssh_type - - ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd) - result = ixload_traffic_gen.resource_helper.result - - ixload_traffic_gen.resource_helper.parse_csv_read(http_reader) - for key_left, key_right in IxLoadResourceHelper.KPI_LIST.items(): - self.assertEqual(result[key_left][-1], int(kpi_data[key_right])) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call") - @mock.patch.object(ssh, 'SSH') - def test_parse_csv_read_value_error(self, mock_ssh, *args): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - http_reader = [{ - 'HTTP Total Throughput (Kbps)': 1, - 'HTTP Simulated Users': 2, - 'HTTP Concurrent Connections': "not a number", - 'HTTP Connection Rate': 4, - 'HTTP Transaction Rate': 5, - }] - - mock_ssh_type = mock.Mock(autospec=mock_ssh.SSH) - mock_ssh_type.execute.return_value = 0, "", "" - mock_ssh.from_node.return_value = mock_ssh_type - - ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd) - init_value = ixload_traffic_gen.resource_helper.result - - ixload_traffic_gen.resource_helper.parse_csv_read(http_reader) - self.assertDictEqual(ixload_traffic_gen.resource_helper.result, init_value) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_ixload.call") - @mock.patch.object(ssh, 'SSH') - def test_parse_csv_read_error(self, mock_ssh, *args): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - http_reader = [{ - 'HTTP Total Throughput (Kbps)': 1, - 'HTTP Simulated Users': 2, - 'HTTP Concurrent Connections': 3, - 'HTTP Transaction Rate': 5, - }] - - mock_ssh_type = mock.Mock(autospec=mock_ssh.SSH) - mock_ssh_type.execute.return_value = 0, "", "" - mock_ssh.from_node.return_value = mock_ssh_type - - ixload_traffic_gen = IxLoadTrafficGen(NAME, vnfd) - - with self.assertRaises(KeyError): - ixload_traffic_gen.resource_helper.parse_csv_read(http_reader) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py deleted file mode 100644 index 91a353d0d..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py +++ /dev/null @@ -1,293 +0,0 @@ -# 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 multiprocessing import Queue -import multiprocessing - -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh -from tests.unit import STL_MOCKS - -SSH_HELPER = "yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper" - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.tg_ping import PingParser - from yardstick.network_services.vnf_generic.vnf.tg_ping import PingTrafficGen - from yardstick.network_services.vnf_generic.vnf.tg_ping import PingResourceHelper - from yardstick.network_services.vnf_generic.vnf.tg_ping import PingSetupEnvHelper - from yardstick.network_services.vnf_generic.vnf.vnf_ssh_helper import VnfSshHelper - - -class TestPingResourceHelper(unittest.TestCase): - def test___init__(self): - setup_helper = mock.Mock() - helper = PingResourceHelper(setup_helper) - - self.assertIsInstance(helper._queue, multiprocessing.queues.Queue) - self.assertIsInstance(helper._parser, PingParser) - - def test_run_traffic(self): - setup_helper = mock.Mock() - traffic_profile = mock.Mock() - traffic_profile.params = { - 'traffic_profile': { - 'frame_size': 64, - }, - } - - helper = PingResourceHelper(setup_helper) - helper.cmd_kwargs = {'target_ip': '10.0.0.2', - 'local_ip': '10.0.0.1', - 'local_if_name': 'eth0', - } - helper.ssh_helper = mock.Mock() - helper.run_traffic(traffic_profile) - helper.ssh_helper.run.called_with('ping-s 64 10.0.0.2') - - -class TestPingParser(unittest.TestCase): - def test___init__(self): - q_out = Queue() - ping_parser = PingParser(q_out) - self.assertIsNotNone(ping_parser.queue) - - def test_clear(self): - sample_out = """ -64 bytes from 10.102.22.93: icmp_seq=3 ttl=64 time=0.296 ms - """ - q_out = Queue() - ping_parser = PingParser(q_out) - ping_parser.write(sample_out) - ping_parser.clear() - self.assertTrue(q_out.empty()) - - def test_close(self): - q_out = Queue() - ping_parser = PingParser(q_out) - self.assertIsNone(ping_parser.close()) - - def test_write(self): - sample_out = """ -64 bytes from 10.102.22.93: icmp_seq=3 ttl=64 time=0.296 ms - """ - q_out = Queue() - ping_parser = PingParser(q_out) - ping_parser.write(sample_out) - - self.assertEqual({"packets_received": 3.0, "rtt": 0.296}, q_out.get()) - - -class TestPingTrafficGen(unittest.TestCase): - VNFD_0_EXT_IF_0 = { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': u'152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': u'152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0', - } - - VNFD_0_EXT_IF_1 = { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': u'152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'bandwidth': '10 Gbps', - 'dst_ip': u'152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1', - } - - VNFD_0_EXT_IF_LIST = [ - VNFD_0_EXT_IF_0, - VNFD_0_EXT_IF_1, - ] - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': u'152.16.100.20', - 'netmask': u'255.255.255.0', - 'gateway': u'152.16.100.20', - 'if': 'xe0', - }, - { - 'network': u'152.16.40.20', - 'netmask': u'255.255.255.0', - 'gateway': u'152.16.40.20', - 'if': 'xe1', - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': VNFD_0_EXT_IF_LIST, - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1', - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', - 'name': 'VPEVnfSsh', - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ], - }, - } - - 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, - }, - } - - CMD_KWARGS = { - 'target_ip': u'152.16.100.20', - 'local_ip': u'152.16.100.19', - 'local_if_name': u'xe0_fake', - } - - @mock.patch("yardstick.ssh.SSH") - def test___init__(self, ssh): - ssh.from_node.return_value.execute.return_value = 0, "success", "" - ping_traffic_gen = PingTrafficGen('vnf1', self.VNFD_0) - - self.assertIsInstance(ping_traffic_gen.setup_helper, PingSetupEnvHelper) - self.assertIsInstance(ping_traffic_gen.resource_helper, PingResourceHelper) - self.assertEqual(ping_traffic_gen._result, {}) - - @mock.patch("yardstick.ssh.SSH") - def test__bind_device_kernel_with_failure(self, ssh): - mock_ssh(ssh) - - execute_result_data = [ - (1, 'bad stdout messages', 'error messages'), - (0, '', ''), - (0, 'if_name_1', ''), - (0, 'if_name_2', ''), - ] - ssh.from_node.return_value.execute.side_effect = iter(execute_result_data) - ping_traffic_gen = PingTrafficGen('vnf1', self.VNFD_0) - ext_ifs = ping_traffic_gen.vnfd_helper.interfaces - self.assertNotEqual(ext_ifs[0]['virtual-interface']['local_iface_name'], 'if_name_1') - self.assertNotEqual(ext_ifs[1]['virtual-interface']['local_iface_name'], 'if_name_2') - - @mock.patch("yardstick.ssh.SSH") - def test_collect_kpi(self, ssh): - mock_ssh(ssh, exec_result=(0, "success", "")) - ping_traffic_gen = PingTrafficGen('vnf1', self.VNFD_0) - ping_traffic_gen._queue = Queue() - ping_traffic_gen._queue.put({}) - ping_traffic_gen.collect_kpi() - self.assertEqual(ping_traffic_gen._result, {}) - - @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh): - mock_ssh(ssh, spec=VnfSshHelper, exec_result=(0, "success", "")) - ping_traffic_gen = PingTrafficGen('vnf1', self.VNFD_0) - ping_traffic_gen.setup_helper.ssh_helper = mock.MagicMock( - **{"execute.return_value": (0, "xe0_fake", "")}) - self.assertIsInstance(ping_traffic_gen.ssh_helper, mock.Mock) - self.assertEqual(ping_traffic_gen._result, {}) - - self.assertIsNone(ping_traffic_gen.instantiate({}, {})) - - self.assertEqual( - ping_traffic_gen.vnfd_helper.interfaces[0]['virtual-interface']['local_iface_name'], - 'xe0_fake') - self.assertEqual(self.CMD_KWARGS, ping_traffic_gen.resource_helper.cmd_kwargs) - self.assertIsNotNone(ping_traffic_gen._result) - - def test_listen_traffic(self): - ping_traffic_gen = PingTrafficGen('vnf1', self.VNFD_0) - self.assertIsNone(ping_traffic_gen.listen_traffic({})) - - @mock.patch("yardstick.ssh.SSH") - def test_terminate(self, ssh): - ssh.from_node.return_value.execute.return_value = 0, "success", "" - ssh.from_node.return_value.run.return_value = 0, "success", "" - - ping_traffic_gen = PingTrafficGen('vnf1', self.VNFD_0) - self.assertIsNone(ping_traffic_gen.terminate()) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py deleted file mode 100644 index 2151a3284..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py +++ /dev/null @@ -1,426 +0,0 @@ -# Copyright (c) 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. -# - -import unittest -import mock - -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh -from tests.unit import STL_MOCKS - - -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' -NAME = 'vnf__1' - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.tg_prox import ProxTrafficGen - from yardstick.network_services.traffic_profile.base import TrafficProfile - - -@mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') -class TestProxTrafficGen(unittest.TestCase): - VNFD0 = { - 'short-name': 'ProxVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0', - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1', - }, - ], - 'description': 'PROX approximation using DPDK', - 'name': 'proxvnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'id': 'proxvnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': '', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0', - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': '', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1', - }, - ], - }, - ], - 'description': 'PROX approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'proxvnf-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1', - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'ProxApproxVnf', - 'name': 'ProxVnf', - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD0, - ], - }, - } - - SCENARIO_CFG = { - 'task_path': "", - 'nodes': { - 'tg__1': 'trafficgen_1.yardstick', - 'vnf__1': 'vnf.yardstick'}, - 'runner': { - 'duration': 600, 'type': 'Duration'}, - 'topology': 'prox-tg-topology-2.yaml', - 'traffic_profile': '../../traffic_profiles/prox_binsearch.yaml', - 'type': 'NSPerf', - 'options': { - 'tg__1': {'prox_args': {'-e': '', - '-t': ''}, - 'prox_config': 'configs/l3-gen-2.cfg', - 'prox_path': - '/root/dppd-PROX-v035/build/prox'}, - 'vnf__1': { - 'prox_args': {'-t': ''}, - 'prox_config': 'configs/l3-swap-2.cfg', - 'prox_path': '/root/dppd-PROX-v035/build/prox'}}} - - CONTEXT_CFG = { - 'nodes': { - 'tg__2': { - 'member-vnf-index': '3', - 'role': 'TrafficGen', - 'name': 'trafficgen_2.yardstick', - 'vnfd-id-ref': 'tg__2', - 'ip': '1.2.1.1', - 'interfaces': { - 'xe0': { - 'local_iface_name': 'ens513f0', - 'vld_id': ProxTrafficGen.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.20', - 'dst_mac': '00:00:00:00:00:01', - 'local_mac': '00:00:00:00:00:03', - 'dst_ip': '152.16.40.19', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.0', - 'dpdk_port_num': 0, - }, - 'xe1': { - 'local_iface_name': 'ens513f1', - 'netmask': '255.255.255.0', - 'network': '202.16.100.0', - 'local_ip': '202.16.100.20', - 'local_mac': '00:1e:67:d0:60:5d', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.1', - 'dpdk_port_num': 1, - }, - }, - 'password': 'r00t', - 'VNF model': 'l3fwd_vnf.yaml', - 'user': 'root', - }, - 'tg__1': { - 'member-vnf-index': '1', - 'role': 'TrafficGen', - 'name': 'trafficgen_1.yardstick', - 'vnfd-id-ref': 'tg__1', - 'ip': '1.2.1.1', - 'interfaces': { - 'xe0': { - 'local_iface_name': 'ens785f0', - 'vld_id': ProxTrafficGen.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.20', - 'dst_mac': '00:00:00:00:00:02', - 'local_mac': '00:00:00:00:00:04', - 'dst_ip': '152.16.100.19', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0, - }, - 'xe1': { - 'local_iface_name': 'ens785f1', - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.21', - 'local_mac': '00:00:00:00:00:01', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1, - }, - }, - 'password': 'r00t', - 'VNF model': 'tg_rfc2544_tpl.yaml', - 'user': 'root', - }, - 'vnf__1': { - 'name': 'vnf.yardstick', - 'vnfd-id-ref': 'vnf__1', - 'ip': '1.2.1.1', - 'interfaces': { - 'xe0': { - 'local_iface_name': 'ens786f0', - 'vld_id': ProxTrafficGen.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.19', - 'dst_mac': '00:00:00:00:00:04', - 'local_mac': '00:00:00:00:00:02', - 'dst_ip': '152.16.100.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0, - }, - 'xe1': { - 'local_iface_name': 'ens786f1', - 'vld_id': ProxTrafficGen.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.19', - 'dst_mac': '00:00:00:00:00:03', - 'local_mac': '00:00:00:00:00:01', - 'dst_ip': '152.16.40.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1, - }, - }, - 'routing_table': [ - { - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'network': '152.16.100.20', - 'if': 'xe0', - }, - { - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'network': '152.16.40.20', - 'if': 'xe1', - }, - ], - 'member-vnf-index': '2', - 'host': '1.2.1.1', - 'role': 'vnf', - 'user': 'root', - 'nd_route_tbl': [ - { - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'password': 'r00t', - 'VNF model': 'prox_vnf.yaml', - }, - }, - } - - TRAFFIC_PROFILE = { - 'description': 'Binary search for max no-drop throughput over given packet sizes', - 'name': 'prox_binsearch', - 'schema': 'nsb:traffic_profile:0.1', - 'traffic_profile': { - 'duration': 5, - 'lower_bound': 0.0, - 'packet_sizes': [64, 65], - 'test_precision': 1.0, - 'tolerated_loss': 0.0, - 'traffic_type': 'ProxBinSearchProfile', - 'upper_bound': 100.0}} - - @mock.patch(SSH_HELPER) - def test___init__(self, ssh, *args): - mock_ssh(ssh) - prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0) - self.assertIsNone(prox_traffic_gen._tg_process) - self.assertIsNone(prox_traffic_gen._traffic_process) - - @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, *args): - mock_ssh(ssh) - - prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0) - prox_traffic_gen._vnf_wrapper.resource_helper.resource = mock.MagicMock( - **{"self.check_if_system_agent_running.return_value": [False]}) - prox_traffic_gen._vnf_wrapper.vnf_execute = mock.Mock(return_value="") - self.assertEqual({}, prox_traffic_gen.collect_kpi()) - - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file') - @mock.patch( - 'yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores') - @mock.patch(SSH_HELPER) - def bad_test_instantiate(self, ssh, mock_cpu_sys_cores, *args): - mock_ssh(ssh) - - mock_cpu_sys_cores.get_core_socket.return_value = {'0': '01234'} - - mock_traffic_profile = mock.Mock(autospec=TrafficProfile) - mock_traffic_profile.get_traffic_definition.return_value = "64" - mock_traffic_profile.params = self.TRAFFIC_PROFILE - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - prox_traffic_gen = ProxTrafficGen(NAME, vnfd) - ssh_helper = mock.MagicMock( - **{"execute.return_value": (0, "", ""), "bin_path": ""}) - prox_traffic_gen.ssh_helper = ssh_helper - prox_traffic_gen.setup_helper.dpdk_bind_helper.ssh_helper = ssh_helper - prox_traffic_gen.setup_helper._setup_resources = mock.MagicMock() - prox_traffic_gen.setup_hugepages = mock.MagicMock() - prox_traffic_gen.generate_prox_config_file = mock.MagicMock() - prox_traffic_gen.upload_prox_config = mock.MagicMock() - prox_traffic_gen.setup_helper._find_used_drivers = mock.MagicMock() - prox_traffic_gen.setup_helper.used_drivers = {} - prox_traffic_gen.setup_helper.bound_pci = [] - prox_traffic_gen._start_server = mock.Mock(return_value=0) - prox_traffic_gen._tg_process = mock.MagicMock() - prox_traffic_gen._tg_process.start = mock.Mock() - prox_traffic_gen._tg_process.exitcode = 0 - prox_traffic_gen._tg_process._is_alive = mock.Mock(return_value=1) - prox_traffic_gen.ssh_helper = mock.MagicMock() - prox_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() - scenario_cfg = { - 'task_path': '', - 'options': {'tg__1': {'prox_args': {'-e': '', - '-t': ''}, - 'prox_config': 'configs/l3-gen-2.cfg', - 'prox_path': '/root/dppd-PROX-v035/build/prox'}, - 'vnf__1': {'prox_args': {'-t': ''}, - 'prox_config': 'configs/l3-swap-2.cfg', - 'prox_path': '/root/dppd-PROX-v035/build/prox'} - } - } - prox_traffic_gen.instantiate(scenario_cfg, {}) - - @mock.patch(SSH_HELPER) - def test__traffic_runner(self, ssh, *args): - mock_ssh(ssh) - - mock_traffic_profile = mock.Mock(autospec=TrafficProfile) - mock_traffic_profile.get_traffic_definition.return_value = "64" - mock_traffic_profile.execute_traffic.return_value = "64" - mock_traffic_profile.params = self.TRAFFIC_PROFILE - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sut = ProxTrafficGen(NAME, vnfd) - sut._get_socket = mock.MagicMock() - sut.ssh_helper = mock.Mock() - sut.ssh_helper.run = mock.Mock() - sut.setup_helper.prox_config_dict = {} - sut._connect_client = mock.Mock(autospec=STLClient) - sut._connect_client.get_stats = mock.Mock(return_value="0") - sut._traffic_runner(mock_traffic_profile) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') - @mock.patch(SSH_HELPER) - def test_listen_traffic(self, ssh, *args): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - prox_traffic_gen = ProxTrafficGen(NAME, vnfd) - self.assertIsNone(prox_traffic_gen.listen_traffic(mock.Mock())) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') - @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, *args): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - prox_traffic_gen = ProxTrafficGen(NAME, vnfd) - prox_traffic_gen._terminated = mock.MagicMock() - prox_traffic_gen._traffic_process = mock.MagicMock() - prox_traffic_gen._traffic_process.terminate = mock.Mock() - prox_traffic_gen.ssh_helper = mock.MagicMock() - prox_traffic_gen.setup_helper = mock.MagicMock() - prox_traffic_gen.resource_helper = mock.MagicMock() - prox_traffic_gen._vnf_wrapper.setup_helper = mock.MagicMock() - prox_traffic_gen._vnf_wrapper._vnf_process = mock.MagicMock() - prox_traffic_gen._vnf_wrapper.resource_helper = mock.MagicMock() - self.assertIsNone(prox_traffic_gen.terminate()) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py deleted file mode 100644 index 61fc012bc..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py +++ /dev/null @@ -1,352 +0,0 @@ -# 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. -# - -import os - -import mock -import six -import unittest - -from tests.unit import STL_MOCKS - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia import IxiaTrafficGen - from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia import IxiaRfc2544Helper - from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia import IxiaResourceHelper - from yardstick.network_services.traffic_profile.base import TrafficProfile - -TEST_FILE_YAML = 'nsb_test_case.yaml' - -NAME = "tg__1" - - -@mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.IxNextgen") -class TestIxiaResourceHelper(unittest.TestCase): - def test___init___with_custom_rfc_helper(self, *args): - class MyRfcHelper(IxiaRfc2544Helper): - pass - - ixia_resource_helper = IxiaResourceHelper(mock.Mock(), MyRfcHelper) - self.assertIsInstance(ixia_resource_helper.rfc_helper, MyRfcHelper) - - def test_stop_collect_with_client(self, *args): - mock_client = mock.Mock() - - ixia_resource_helper = IxiaResourceHelper(mock.Mock()) - - ixia_resource_helper.client = mock_client - ixia_resource_helper.stop_collect() - self.assertEqual(mock_client.ix_stop_traffic.call_count, 1) - - -@mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.IxNextgen") -class TestIXIATrafficGen(unittest.TestCase): - VNFD = {'vnfd:vnfd-catalog': - {'vnfd': - [{'short-name': 'VpeVnf', - 'vdu': - [{'routing_table': - [{'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0'}, - {'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1'}], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': - [{'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'id': 'vpevnf-baremetal', - 'external-interface': - [{'virtual-interface': - {'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}]}], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': - {'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} - - 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}} - - TC_YAML = {'scenarios': [{'tc_options': - {'rfc2544': {'allowed_drop_rate': '0.8 - 1'}}, - 'runner': {'duration': 400, - 'interval': 35, 'type': 'Duration'}, - 'traffic_options': - {'flow': 'ipv4_1flow_Packets_vpe.yaml', - 'imix': 'imix_voice.yaml'}, - 'vnf_options': {'vpe': {'cfg': 'vpe_config'}}, - 'traffic_profile': 'ipv4_throughput_vpe.yaml', - 'type': 'NSPerf', - 'nodes': {'tg__1': 'trafficgen_1.yardstick', - 'vnf__1': 'vnf.yardstick'}, - 'topology': 'vpe_vnf_topology.yaml'}], - 'context': {'nfvi_type': 'baremetal', 'type': 'Node', - 'name': 'yardstick', - 'file': '/etc/yardstick/nodes/pod.yaml'}, - 'schema': 'yardstick:task:0.1'} - - def test___init__(self, *args): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - # NOTE(ralonsoh): check the object returned. - IxiaTrafficGen(NAME, vnfd) - - def test_listen_traffic(self, *args): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd) - self.assertIsNone(ixnet_traffic_gen.listen_traffic({})) - - def test_instantiate(self, *args): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh_mock.run = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd) - scenario_cfg = {'tc': "nsb_test_case", "topology": "", - 'ixia_profile': "ixload.cfg"} - scenario_cfg.update({'options': {'packetsize': 64, - 'traffic_type': 4, - 'rfc2544': {'allowed_drop_rate': '0.8 - 1'}, - 'vnf__1': {'rules': 'acl_1rule.yaml', - 'vnf_config': {'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': - '1C/1T', - 'worker_threads': 1}} - }}) - ixnet_traffic_gen.topology = "" - ixnet_traffic_gen.get_ixobj = mock.MagicMock() - ixnet_traffic_gen._ixia_traffic_gen = mock.MagicMock() - ixnet_traffic_gen._ixia_traffic_gen._connect = mock.Mock() - self.assertRaises( - IOError, - ixnet_traffic_gen.instantiate(scenario_cfg, {})) - - def test_collect_kpi(self, *args): - with mock.patch("yardstick.ssh.SSH") as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd) - ixnet_traffic_gen.data = {} - restult = ixnet_traffic_gen.collect_kpi() - self.assertEqual({}, restult) - - def test_terminate(self, *args): - with mock.patch("yardstick.ssh.SSH") as ssh: - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = \ - mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd) - ixnet_traffic_gen._terminated = mock.MagicMock() - ixnet_traffic_gen._terminated.value = 0 - ixnet_traffic_gen._ixia_traffic_gen = mock.MagicMock() - ixnet_traffic_gen._ixia_traffic_gen.ix_stop_traffic = mock.Mock() - ixnet_traffic_gen._traffic_process = mock.MagicMock() - ixnet_traffic_gen._traffic_process.terminate = mock.Mock() - self.assertIsNone(ixnet_traffic_gen.terminate()) - - def _get_file_abspath(self, filename): - curr_path = os.path.dirname(os.path.abspath(__file__)) - file_path = os.path.join(curr_path, filename) - return file_path - - def test__check_status(self, *args): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sut = IxiaTrafficGen('vnf1', vnfd) - sut._check_status() - - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.time") - @mock.patch("yardstick.ssh.SSH") - def test_traffic_runner(self, mock_ssh, *args): - mock_traffic_profile = mock.Mock(autospec=TrafficProfile) - mock_traffic_profile.get_traffic_definition.return_value = "64" - mock_traffic_profile.params = self.TRAFFIC_PROFILE - # traffic_profile.ports is standardized on port_num - mock_traffic_profile.ports = [0, 1] - - mock_ssh_instance = mock.Mock(autospec=mock_ssh.SSH) - mock_ssh_instance.execute.return_value = 0, "", "" - mock_ssh_instance.run.return_value = 0, "", "" - - mock_ssh.from_node.return_value = mock_ssh_instance - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vnfd["mgmt-interface"].update({ - 'tg-config': { - "ixchassis": "1.1.1.1", - "py_bin_path": "/root", - } - }) - - samples = {} - name = '' - for ifname in range(1): - name = "xe{}".format(ifname) - samples[name] = { - "Rx_Rate_Kbps": 20, - "Tx_Rate_Kbps": 20, - "Rx_Rate_Mbps": 10, - "Tx_Rate_Mbps": 10, - "RxThroughput": 10, - "TxThroughput": 10, - "Valid_Frames_Rx": 1000, - "Frames_Tx": 1000, - "in_packets": 1000, - "out_packets": 1000, - } - - samples.update({"CurrentDropPercentage": 0.0}) - - last_res = [ - 0, - { - "Rx_Rate_Kbps": [20, 20], - "Tx_Rate_Kbps": [20, 20], - "Rx_Rate_Mbps": [10, 10], - "Tx_Rate_Mbps": [10, 10], - "CurrentDropPercentage": [0, 0], - "RxThroughput": [10, 10], - "TxThroughput": [10, 10], - "Frames_Tx": [1000, 1000], - "in_packets": [1000, 1000], - "Valid_Frames_Rx": [1000, 1000], - "out_packets": [1000, 1000], - }, - ] - - mock_traffic_profile.execute_traffic.return_value = ['Completed', samples] - mock_traffic_profile.get_drop_percentage.return_value = ['Completed', samples] - - sut = IxiaTrafficGen(name, vnfd) - sut.vnf_port_pairs = [[[0], [1]]] - sut.tc_file_name = self._get_file_abspath(TEST_FILE_YAML) - sut.topology = "" - - sut.ssh_helper = mock.Mock() - sut._traffic_process = mock.MagicMock() - sut.generate_port_pairs = mock.Mock() - - sut._ixia_traffic_gen = mock.MagicMock() - sut._ixia_traffic_gen.ix_get_statistics.return_value = last_res - - sut.resource_helper.client = mock.MagicMock() - sut.resource_helper.client_started = mock.MagicMock() - sut.resource_helper.client_started.value = 1 - sut.resource_helper.rfc_helper.iteration.value = 11 - - sut.scenario_helper.scenario_cfg = { - 'options': { - 'packetsize': 64, - 'traffic_type': 4, - 'rfc2544': { - 'allowed_drop_rate': '0.8 - 1', - 'latency': True - }, - 'vnf__1': { - 'rules': 'acl_1rule.yaml', - 'vnf_config': { - 'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': '1C/1T', - 'worker_threads': 1, - }, - }, - }, - 'ixia_profile': '/path/to/profile', - 'task_path': '/path/to/task' - } - - @mock.patch.object(six.moves.builtins, 'open', create=True) - @mock.patch('yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.open', - mock.mock_open(), create=True) - @mock.patch('yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.LOG.exception') - def _traffic_runner(*args): - result = sut._traffic_runner(mock_traffic_profile) - self.assertIsNone(result) - - _traffic_runner() diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py deleted file mode 100644 index b9a95a945..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py +++ /dev/null @@ -1,339 +0,0 @@ -# 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 tests.unit import STL_MOCKS -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' - - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.tg_rfc2544_trex import TrexTrafficGenRFC, \ - TrexRfcResourceHelper - from yardstick.network_services.vnf_generic.vnf import tg_rfc2544_trex - from yardstick.network_services.traffic_profile.base import TrafficProfile - from tests.unit.network_services.vnf_generic.vnf.test_base import FileAbsPath, mock_ssh - -MODULE_PATH = FileAbsPath(__file__) -get_file_abspath = MODULE_PATH.get_path - - -class TestTrexRfcResouceHelper(unittest.TestCase): - - @mock.patch('yardstick.network_services.helpers.samplevnf_helper.MultiPortConfig') - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_trex.time") - @mock.patch(SSH_HELPER) - def test__run_traffic_once(self, ssh, *_): - mock_ssh(ssh) - - mock_traffic_profile = mock.MagicMock(autospec=TrafficProfile, - **{'get_drop_percentage.return_value': {}}) - sut = TrexRfcResourceHelper(mock.MagicMock(), mock.MagicMock()) - sut.client = mock.MagicMock() - sut._run_traffic_once(mock_traffic_profile) - - -class TestTrexTrafficGenRFC(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0', - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1', - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'ifname': 'xe0', - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'vld_id': 'uplink_0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:01', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0', - }, - { - 'virtual-interface': { - 'ifname': 'xe1', - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'vld_id': 'downlink_0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:02' - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1', - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1', - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', - 'name': 'VPEVnfSsh', - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ], - }, - } - - 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, - }, - } - - TC_YAML = { - 'scenarios': [ - { - 'tc_options': { - 'rfc2544': { - 'allowed_drop_rate': '0.8 - 1', - }, - }, - 'runner': { - 'duration': 400, - 'interval': 35, - 'type': 'Duration', - }, - 'traffic_options': { - 'flow': 'ipv4_1flow_Packets_vpe.yaml', - 'imix': 'imix_voice.yaml', - }, - 'vnf_options': { - 'vpe': { - 'cfg': 'vpe_config', - }, - }, - 'traffic_profile': 'ipv4_throughput_vpe.yaml', - 'type': 'NSPerf', - 'nodes': { - 'tg__1': 'trafficgen_1.yardstick', - 'vnf__1': 'vnf.yardstick', - }, - 'topology': 'vpe_vnf_topology.yaml', - }, - ], - 'context': { - 'nfvi_type': 'baremetal', - 'type': 'Node', - 'name': 'yardstick', - 'file': '/etc/yardstick/nodes/pod.yaml', - }, - 'schema': 'yardstick:task:0.1', - } - - @mock.patch(SSH_HELPER) - def test___init__(self, ssh): - mock_ssh(ssh) - trex_traffic_gen = TrexTrafficGenRFC('vnf1', self.VNFD_0) - self.assertIsNotNone(trex_traffic_gen.resource_helper._terminated.value) - - @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh): - mock_ssh(ssh) - trex_traffic_gen = TrexTrafficGenRFC('vnf1', self.VNFD_0) - self.assertEqual(trex_traffic_gen.collect_kpi(), {}) - - @mock.patch(SSH_HELPER) - def test_listen_traffic(self, ssh): - mock_ssh(ssh) - trex_traffic_gen = TrexTrafficGenRFC('vnf1', self.VNFD_0) - self.assertIsNone(trex_traffic_gen.listen_traffic({})) - - @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh): - mock_ssh(ssh) - - mock_traffic_profile = mock.Mock(autospec=TrafficProfile) - mock_traffic_profile.get_traffic_definition.return_value = "64" - mock_traffic_profile.params = self.TRAFFIC_PROFILE - - trex_traffic_gen = TrexTrafficGenRFC('vnf1', self.VNFD_0) - trex_traffic_gen._start_server = mock.Mock(return_value=0) - trex_traffic_gen.resource_helper = mock.MagicMock() - trex_traffic_gen.setup_helper.setup_vnf_environment = mock.MagicMock() - - scenario_cfg = { - "tc": "tc_baremetal_rfc2544_ipv4_1flow_64B", - "topology": 'nsb_test_case.yaml', - 'options': { - 'packetsize': 64, - 'traffic_type': 4, - 'rfc2544': { - 'allowed_drop_rate': '0.8 - 1', - }, - 'vnf__1': { - 'rules': 'acl_1rule.yaml', - 'vnf_config': { - 'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': '1C/1T', - 'worker_threads': 1 - }, - }, - }, - } - tg_rfc2544_trex.WAIT_TIME = 3 - scenario_cfg.update({"nodes": ["tg_1", "vnf_1"]}) - self.assertIsNone(trex_traffic_gen.instantiate(scenario_cfg, {})) - - @mock.patch(SSH_HELPER) - def test_instantiate_error(self, ssh): - mock_ssh(ssh, exec_result=(1, "", "")) - - mock_traffic_profile = mock.Mock(autospec=TrafficProfile) - mock_traffic_profile.get_traffic_definition.return_value = "64" - mock_traffic_profile.params = self.TRAFFIC_PROFILE - - trex_traffic_gen = TrexTrafficGenRFC('vnf1', self.VNFD_0) - trex_traffic_gen.resource_helper = mock.MagicMock() - trex_traffic_gen.setup_helper.setup_vnf_environment = mock.MagicMock() - scenario_cfg = { - "tc": "tc_baremetal_rfc2544_ipv4_1flow_64B", - "nodes": [ - "tg_1", - "vnf_1", - ], - "topology": 'nsb_test_case.yaml', - 'options': { - 'packetsize': 64, - 'traffic_type': 4, - 'rfc2544': { - 'allowed_drop_rate': '0.8 - 1', - }, - 'vnf__1': { - 'rules': 'acl_1rule.yaml', - 'vnf_config': { - 'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': '1C/1T', - 'worker_threads': 1, - }, - }, - }, - } - trex_traffic_gen.instantiate(scenario_cfg, {}) - - @mock.patch(SSH_HELPER) - def test__start_server(self, ssh): - mock_ssh(ssh) - trex_traffic_gen = TrexTrafficGenRFC('vnf1', self.VNFD_0) - trex_traffic_gen.resource_helper = mock.MagicMock() - self.assertIsNone(trex_traffic_gen._start_server()) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_trex.time") - @mock.patch(SSH_HELPER) - def test__generate_trex_cfg(self, ssh, _): - mock_ssh(ssh) - - trex_traffic_gen = TrexTrafficGenRFC('vnf1', self.VNFD_0) - trex_traffic_gen.ssh_helper = mock.MagicMock() - trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() - self.assertIsNone(trex_traffic_gen.resource_helper.generate_cfg()) - - def test_terminate(self): - with mock.patch(SSH_HELPER) as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - trex_traffic_gen = TrexTrafficGenRFC('vnf1', self.VNFD_0) - trex_traffic_gen.resource_helper = mock.MagicMock() - self.assertIsNone(trex_traffic_gen.terminate()) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py deleted file mode 100644 index f80d1f948..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py +++ /dev/null @@ -1,483 +0,0 @@ -# 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. -# - -import copy -import mock - -import unittest - -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh -from tests.unit import STL_MOCKS - - -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' -NAME = 'vnf_1' - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.tg_trex import \ - TrexTrafficGen, TrexResourceHelper - from yardstick.network_services.traffic_profile.base import TrafficProfile - - -class TestTrexTrafficGen(unittest.TestCase): - VNFD = {'vnfd:vnfd-catalog': - {'vnfd': - [{'short-name': 'VpeVnf', - 'vdu': - [{'routing_table': - [{'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0'}, - {'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1'}], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': - [{'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'id': 'vpevnf-baremetal', - 'external-interface': - [{'virtual-interface': - {'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'vld_id': 'downlink_0', - 'ifname': 'xe0', - 'local_mac': '00:00:00:00:00:02'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'vld_id': 'uplink_0', - 'ifname': 'xe1', - 'local_mac': '00:00:00:00:00:01'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}]}], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': - {'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh'}]}} - - 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 - }, - } - - SCENARIO_CFG = { - "options": { - "packetsize": 64, - "traffic_type": 4, - "rfc2544": { - "allowed_drop_rate": "0.8 - 1", - }, - "vnf__1": { - "rules": "acl_1rule.yaml", - "vnf_config": { - "lb_config": "SW", - "lb_count": 1, - "worker_config": "1C/1T", - "worker_threads": 1, - } - } - }, - "task_id": "a70bdf4a-8e67-47a3-9dc1-273c14506eb7", - "tc": "tc_ipv4_1Mflow_64B_packetsize", - "runner": { - "object": "NetworkServiceTestCase", - "interval": 35, - "output_filename": "/tmp/yardstick.out", - "runner_id": 74476, "duration": 400, - "type": "Duration" - }, - "traffic_profile": "ipv4_throughput_acl.yaml", - "traffic_options": { - "flow": "ipv4_Packets_acl.yaml", - "imix": "imix_voice.yaml" - }, - "type": "ISB", - "nodes": { - "tg__2": "trafficgen_2.yardstick", - "tg__1": "trafficgen_1.yardstick", - "vnf__1": "vnf.yardstick" - }, - "topology": "udpreplay-tg-topology-baremetal.yaml" - } - - CONTEXT_CFG = { - "nodes": { - "vnf__1": { - "vnfd-id-ref": "vnf__1", - "ip": "1.2.1.1", - "interfaces": { - "xe0": { - "local_iface_name": "ens786f0", - "vld_id": TrafficProfile.UPLINK, - "netmask": "255.255.255.0", - "vpci": "0000:05:00.0", - "local_ip": "152.16.100.19", - "driver": "i40e", - "dst_ip": "152.16.100.20", - "local_mac": "00:00:00:00:00:02", - "dst_mac": "00:00:00:00:00:04", - "dpdk_port_num": 0 - }, - "xe1": { - "local_iface_name": "ens786f1", - "vld_id": TrafficProfile.DOWNLINK, - "netmask": "255.255.255.0", - "vpci": "0000:05:00.1", - "local_ip": "152.16.40.19", - "driver": "i40e", - "dst_ip": "152.16.40.20", - "local_mac": "00:00:00:00:00:01", - "dst_mac": "00:00:00:00:00:03", - "dpdk_port_num": 1 - } - }, - "host": "1.2.1.1", - "user": "root", - "nd_route_tbl": [ - { - "netmask": "112", - "if": "xe0", - "gateway": "0064:ff9b:0:0:0:0:9810:6414", - "network": "0064:ff9b:0:0:0:0:9810:6414" - }, - { - "netmask": "112", - "if": "xe1", - "gateway": "0064:ff9b:0:0:0:0:9810:2814", - "network": "0064:ff9b:0:0:0:0:9810:2814" - } - ], - "password": "r00t", - "VNF model": "udp_replay.yaml", - "name": "vnf.yardstick", - "member-vnf-index": "2", - "routing_table": [ - { - "netmask": "255.255.255.0", - "if": "xe0", - "gateway": "152.16.100.20", - "network": "152.16.100.20" - }, - { - "netmask": "255.255.255.0", - "if": "xe1", - "gateway": "152.16.40.20", - "network": "152.16.40.20" - } - ], - "role": "vnf" - }, - "trafficgen_2.yardstick": { - "member-vnf-index": "3", - "role": "TrafficGen", - "name": "trafficgen_2.yardstick", - "vnfd-id-ref": "tg__2", - "ip": "1.2.1.1", - "interfaces": { - "xe0": { - "local_iface_name": "ens513f0", - "vld_id": TrafficProfile.DOWNLINK, - "netmask": "255.255.255.0", - "vpci": "0000:02:00.0", - "local_ip": "152.16.40.20", - "driver": "ixgbe", - "dst_ip": "152.16.40.19", - "local_mac": "00:00:00:00:00:03", - "dst_mac": "00:00:00:00:00:01", - "dpdk_port_num": 0 - }, - "xe1": { - "local_iface_name": "ens513f1", - "netmask": "255.255.255.0", - "network": "202.16.100.0", - "local_ip": "202.16.100.20", - "driver": "ixgbe", - "local_mac": "00:1e:67:d0:60:5d", - "vpci": "0000:02:00.1", - "dpdk_port_num": 1 - } - }, - "password": "r00t", - "VNF model": "l3fwd_vnf.yaml", - "user": "root" - }, - "trafficgen_1.yardstick": { - "member-vnf-index": "1", - "role": "TrafficGen", - "name": "trafficgen_1.yardstick", - "vnfd-id-ref": "tg__1", - "ip": "1.2.1.1", - "interfaces": { - "xe0": { - "local_iface_name": "ens785f0", - "vld_id": TrafficProfile.UPLINK, - "netmask": "255.255.255.0", - "vpci": "0000:05:00.0", - "local_ip": "152.16.100.20", - "driver": "i40e", - "dst_ip": "152.16.100.19", - "local_mac": "00:00:00:00:00:04", - "dst_mac": "00:00:00:00:00:02", - "dpdk_port_num": 0 - }, - "xe1": { - "local_ip": "152.16.100.21", - "driver": "i40e", - "vpci": "0000:05:00.1", - "dpdk_port_num": 1, - "local_iface_name": "ens785f1", - "netmask": "255.255.255.0", - "local_mac": "00:00:00:00:00:01" - } - }, - "password": "r00t", - "VNF model": "tg_rfc2544_tpl.yaml", - "user": "root" - } - } - } - - @mock.patch(SSH_HELPER) - def test___init__(self, ssh): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - self.assertIsInstance(trex_traffic_gen.resource_helper, TrexResourceHelper) - - @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - trex_traffic_gen.resource_helper._queue.put({}) - result = trex_traffic_gen.collect_kpi() - self.assertEqual({}, result) - - @mock.patch(SSH_HELPER) - def test_listen_traffic(self, ssh): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - self.assertIsNone(trex_traffic_gen.listen_traffic({})) - - @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - trex_traffic_gen._start_server = mock.Mock(return_value=0) - trex_traffic_gen._tg_process = mock.MagicMock() - trex_traffic_gen._tg_process.start = mock.Mock() - trex_traffic_gen._tg_process.exitcode = 0 - trex_traffic_gen._tg_process._is_alive = mock.Mock(return_value=1) - trex_traffic_gen.ssh_helper = mock.MagicMock() - trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() - trex_traffic_gen.setup_helper.setup_vnf_environment = mock.MagicMock() - - self.assertIsNone(trex_traffic_gen.instantiate(self.SCENARIO_CFG, self.CONTEXT_CFG)) - - @mock.patch(SSH_HELPER) - def test_instantiate_error(self, ssh): - mock_ssh(ssh, exec_result=(1, "", "")) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - trex_traffic_gen._start_server = mock.Mock(return_value=0) - trex_traffic_gen._tg_process = mock.MagicMock() - trex_traffic_gen._tg_process.start = mock.Mock() - trex_traffic_gen._tg_process._is_alive = mock.Mock(return_value=0) - trex_traffic_gen.ssh_helper = mock.MagicMock() - trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() - trex_traffic_gen.setup_helper.setup_vnf_environment = mock.MagicMock() - self.assertIsNone(trex_traffic_gen.instantiate(self.SCENARIO_CFG, self.CONTEXT_CFG)) - - @mock.patch(SSH_HELPER) - def test__start_server(self, ssh): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - trex_traffic_gen.ssh_helper = mock.MagicMock() - trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() - trex_traffic_gen.scenario_helper.scenario_cfg = {} - self.assertIsNone(trex_traffic_gen._start_server()) - - @mock.patch(SSH_HELPER) - def test__start_server_multiple_queues(self, ssh): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - trex_traffic_gen.ssh_helper = mock.MagicMock() - trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() - trex_traffic_gen.scenario_helper.scenario_cfg = {"options": {NAME: {"queues_per_port": 2}}} - self.assertIsNone(trex_traffic_gen._start_server()) - - @mock.patch(SSH_HELPER) - def test__traffic_runner(self, ssh): - mock_ssh(ssh) - - mock_traffic_profile = mock.Mock(autospec=TrafficProfile) - mock_traffic_profile.get_traffic_definition.return_value = "64" - mock_traffic_profile.execute_traffic.return_value = "64" - mock_traffic_profile.params = self.TRAFFIC_PROFILE - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - self.sut = TrexTrafficGen(NAME, vnfd) - self.sut.ssh_helper = mock.Mock() - self.sut.ssh_helper.run = mock.Mock() - self.sut._connect_client = mock.Mock(autospec=STLClient) - self.sut._connect_client.get_stats = mock.Mock(return_value="0") - self.sut.resource_helper.RUN_DURATION = 0 - self.sut.resource_helper.QUEUE_WAIT_TIME = 0 - # must generate cfg before we can run traffic so Trex port mapping is created - self.sut.resource_helper.generate_cfg() - self.sut._traffic_runner(mock_traffic_profile) - - @mock.patch(SSH_HELPER) - def test__generate_trex_cfg(self, ssh): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() - self.assertIsNone(trex_traffic_gen.resource_helper.generate_cfg()) - - @mock.patch(SSH_HELPER) - def test_build_ports_reversed_pci_ordering(self, ssh): - mock_ssh(ssh) - vnfd = copy.deepcopy(self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) - vnfd['vdu'][0]['external-interface'] = [ - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 2, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'vld_id': 'downlink_0', - 'ifname': 'xe0', - 'local_mac': '00:00:00:00:00:02'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:04:00.0', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'vld_id': 'uplink_0', - 'ifname': 'xe1', - 'local_mac': '00:00:00:00:00:01'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() - trex_traffic_gen.resource_helper.generate_cfg() - trex_traffic_gen.resource_helper._build_ports() - self.assertEqual(sorted(trex_traffic_gen.resource_helper.all_ports), [0, 1]) - # there is a gap in ordering - self.assertEqual(dict(trex_traffic_gen.resource_helper.dpdk_to_trex_port_map), - {0: 0, 2: 1}) - - @mock.patch(SSH_HELPER) - def test_run_traffic(self, ssh): - mock_ssh(ssh) - - mock_traffic_profile = mock.Mock(autospec=TrafficProfile) - mock_traffic_profile.get_traffic_definition.return_value = "64" - mock_traffic_profile.params = self.TRAFFIC_PROFILE - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - self.sut = TrexTrafficGen(NAME, vnfd) - self.sut.ssh_helper = mock.Mock() - self.sut.ssh_helper.run = mock.Mock() - self.sut._traffic_runner = mock.Mock(return_value=0) - self.sut.resource_helper.client_started.value = 1 - result = self.sut.run_traffic(mock_traffic_profile) - self.sut._traffic_process.terminate() - self.assertIsNotNone(result) - - @mock.patch(SSH_HELPER) - def test_terminate(self, ssh): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - trex_traffic_gen.ssh_helper = mock.MagicMock() - trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() - self.assertIsNone(trex_traffic_gen.terminate()) - - @mock.patch(SSH_HELPER) - def test__connect_client(self, ssh): - mock_ssh(ssh) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - client = mock.Mock(autospec=STLClient) - client.connect = mock.Mock(return_value=0) - self.assertIsNotNone(trex_traffic_gen.resource_helper._connect(client)) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_udp_replay.py b/tests/unit/network_services/vnf_generic/vnf/test_udp_replay.py deleted file mode 100644 index 4cf4320f9..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_udp_replay.py +++ /dev/null @@ -1,462 +0,0 @@ -# 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. -# - -import unittest -import mock -import os - -from tests.unit import STL_MOCKS -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh - - -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.udp_replay import UdpReplayApproxVnf - from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper - - -TEST_FILE_YAML = 'nsb_test_case.yaml' - - -NAME = "vnf__1" - - -@mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Process") -class TestUdpReplayApproxVnf(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'UdpReplayVnf', - 'vdu': [ - { - 'description': 'UDPReplay approximation using DPDK', - 'routing_table': [ - { - 'netmask': '255.255.255.0', - 'if': 'xe0', - 'network': '152.16.100.20', - 'gateway': '152.16.100.20', - }, - { - 'netmask': '255.255.255.0', - 'if': 'xe1', - 'network': '152.16.40.20', - 'gateway': '152.16.40.20', - } - ], - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'driver': 'i40e', - 'local_iface_name': 'xe0', - 'bandwidth': '10 Gbps', - 'local_ip': '152.16.100.19', - 'local_mac': '00:00:00:00:00:02', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0, - 'netmask': '255.255.255.0', - 'dst_ip': '152.16.100.20', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': 'uplink_0', - 'ifname': 'xe0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0', - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'driver': 'i40e', - 'local_iface_name': 'xe1', - 'bandwidth': '10 Gbps', - 'local_ip': '152.16.40.19', - 'local_mac': '00:00:00:00:00:01', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1, - 'netmask': '255.255.255.0', - 'dst_ip': '152.16.40.20', - 'type': 'PCI-PASSTHROUGH', - 'vld_id': 'downlink_0', - 'ifname': 'xe1', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1', - } - ], - 'nd_route_tbl': [ - { - 'netmask': '112', - 'if': 'xe0', - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - }, - { - 'netmask': '112', - 'if': 'xe1', - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - } - ], - 'id': 'udpreplayvnf-baremetal', - 'name': 'udpreplayvnf-baremetal', - } - ], - 'description': 'UDPReplay approximation using DPDK', - 'name': 'VPEVnfSsh', - 'mgmt-interface': { - 'vdu-id': 'udpreplay-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1', - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ] - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - } - ], - 'id': 'UdpReplayApproxVnf', - } - - SCENARIO_CFG = { - "options": { - "packetsize": 64, - "traffic_type": 4, - "rfc2544": { - "allowed_drop_rate": "0.8 - 1", - }, - "vnf__1": { - "rules": "acl_1rule.yaml", - "vnf_config": { - "lb_config": "SW", - "lb_count": 1, - "worker_config": "1C/1T", - "worker_threads": 1, - }, - "hw_csum": "false", - } - }, - "task_id": "a70bdf4a-8e67-47a3-9dc1-273c14506eb7", - "tc": "tc_ipv4_1Mflow_64B_packetsize", - "runner": { - "object": "NetworkServiceTestCase", - "interval": 35, - "output_filename": "/tmp/yardstick.out", - "runner_id": 74476, "duration": 400, - "type": "Duration" - }, - "traffic_profile": "ipv4_throughput_acl.yaml", - "traffic_options": { - "flow": "ipv4_Packets_acl.yaml", - "imix": "imix_voice.yaml" - }, - "type": "ISB", - "nodes": { - "tg__2": "trafficgen_2.yardstick", - "tg__1": "trafficgen_1.yardstick", - "vnf__1": "vnf.yardstick" - }, - "topology": "udpreplay-tg-topology-baremetal.yaml" - } - - CONTEXT_CFG = { - "nodes": { - "vnf__1": { - "vnfd-id-ref": "vnf__1", - "ip": "1.2.1.1", - "interfaces": { - "xe0": { - "local_iface_name": "ens786f0", - "vld_id": UdpReplayApproxVnf.UPLINK, - "netmask": "255.255.255.0", - "vpci": "0000:05:00.0", - "local_ip": "152.16.100.19", - "driver": "i40e", - "dst_ip": "152.16.100.20", - "local_mac": "00:00:00:00:00:02", - "dst_mac": "00:00:00:00:00:04", - "dpdk_port_num": 0 - }, - "xe1": { - "local_iface_name": "ens786f1", - "vld_id": UdpReplayApproxVnf.DOWNLINK, - "netmask": "255.255.255.0", - "vpci": "0000:05:00.1", - "local_ip": "152.16.40.19", - "driver": "i40e", - "dst_ip": "152.16.40.20", - "local_mac": "00:00:00:00:00:01", - "dst_mac": "00:00:00:00:00:03", - "dpdk_port_num": 1 - } - }, - "host": "1.2.1.1", - "user": "root", - "nd_route_tbl": [ - { - "netmask": "112", - "if": "xe0", - "gateway": "0064:ff9b:0:0:0:0:9810:6414", - "network": "0064:ff9b:0:0:0:0:9810:6414" - }, - { - "netmask": "112", - "if": "xe1", - "gateway": "0064:ff9b:0:0:0:0:9810:2814", - "network": "0064:ff9b:0:0:0:0:9810:2814" - } - ], - "password": "r00t", - "VNF model": "udp_replay.yaml", - "name": "vnf.yardstick", - "member-vnf-index": "2", - "routing_table": [ - { - "netmask": "255.255.255.0", - "if": "xe0", - "gateway": "152.16.100.20", - "network": "152.16.100.20" - }, - { - "netmask": "255.255.255.0", - "if": "xe1", - "gateway": "152.16.40.20", - "network": "152.16.40.20" - } - ], - "role": "vnf" - }, - "trafficgen_2.yardstick": { - "member-vnf-index": "3", - "role": "TrafficGen", - "name": "trafficgen_2.yardstick", - "vnfd-id-ref": "tg__2", - "ip": "1.2.1.1", - "interfaces": { - "xe0": { - "local_iface_name": "ens513f0", - "vld_id": UdpReplayApproxVnf.DOWNLINK, - "netmask": "255.255.255.0", - "vpci": "0000:02:00.0", - "local_ip": "152.16.40.20", - "driver": "ixgbe", - "dst_ip": "152.16.40.19", - "local_mac": "00:00:00:00:00:03", - "dst_mac": "00:00:00:00:00:01", - "dpdk_port_num": 0 - }, - "xe1": { - "local_iface_name": "ens513f1", - "netmask": "255.255.255.0", - "network": "202.16.100.0", - "local_ip": "202.16.100.20", - "driver": "ixgbe", - "local_mac": "00:1e:67:d0:60:5d", - "vpci": "0000:02:00.1", - "dpdk_port_num": 1 - } - }, - "password": "r00t", - "VNF model": "l3fwd_vnf.yaml", - "user": "root" - }, - "trafficgen_1.yardstick": { - "member-vnf-index": "1", - "role": "TrafficGen", - "name": "trafficgen_1.yardstick", - "vnfd-id-ref": "tg__1", - "ip": "1.2.1.1", - "interfaces": { - "xe0": { - "local_iface_name": "ens785f0", - "vld_id": UdpReplayApproxVnf.UPLINK, - "netmask": "255.255.255.0", - "vpci": "0000:05:00.0", - "local_ip": "152.16.100.20", - "driver": "i40e", - "dst_ip": "152.16.100.19", - "local_mac": "00:00:00:00:00:04", - "dst_mac": "00:00:00:00:00:02", - "dpdk_port_num": 0 - }, - "xe1": { - "local_ip": "152.16.100.21", - "driver": "i40e", - "vpci": "0000:05:00.1", - "dpdk_port_num": 1, - "local_iface_name": "ens785f1", - "netmask": "255.255.255.0", - "local_mac": "00:00:00:00:00:01" - } - }, - "password": "r00t", - "VNF model": "tg_rfc2544_tpl.yaml", - "user": "root" - } - } - } - - def test___init__(self, *args): - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) - self.assertIsNone(udp_replay_approx_vnf._vnf_process) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD_0 - result = "stats\r\r\n\r\nUDP_Replay stats:\r\n--------------\r\n" \ - "Port\t\tRx Packet\t\tTx Packet\t\tRx Pkt Drop\t\tTx Pkt Drop \r\n"\ - "0\t\t7374156\t\t7374136\t\t\t0\t\t\t0\r\n" \ - "1\t\t7374316\t\t7374315\t\t\t0\t\t\t0\r\n\r\nReplay>\r\r\nReplay>" - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, vnfd) - udp_replay_approx_vnf.q_in = mock.MagicMock() - udp_replay_approx_vnf.q_out = mock.MagicMock() - udp_replay_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - udp_replay_approx_vnf.all_ports = ["xe0", "xe1"] - udp_replay_approx_vnf.get_stats = mock.Mock(return_value=result) - result = {'collect_stats': {}, 'packets_dropped': 0, - 'packets_fwd': 14748451, 'packets_in': 14748472} - self.assertEqual(result, udp_replay_approx_vnf.collect_kpi()) - - @mock.patch(SSH_HELPER) - def test_get_stats(self, ssh, *args): - mock_ssh(ssh) - - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) - udp_replay_approx_vnf.q_in = mock.MagicMock() - udp_replay_approx_vnf.q_out = mock.MagicMock() - udp_replay_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - mock_result = \ - "CG-NAPT(.*\n)*Received 100, Missed 0, Dropped 0,Translated 100,ingress" - - udp_replay_approx_vnf.vnf_execute = mock.Mock(return_value=mock_result) - - self.assertEqual(mock_result, - udp_replay_approx_vnf.get_stats()) - - def _get_file_abspath(self, filename): - curr_path = os.path.dirname(os.path.abspath(__file__)) - file_path = os.path.join(curr_path, filename) - return file_path - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") - @mock.patch(SSH_HELPER) - def test__build_config(self, ssh, mock_context, *args): - mock_ssh(ssh) - - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) - udp_replay_approx_vnf.queue_wrapper = mock.MagicMock() - udp_replay_approx_vnf.nfvi_context = mock_context - udp_replay_approx_vnf.nfvi_context.attrs = {'nfvi_type': 'baremetal'} - udp_replay_approx_vnf.setup_helper.bound_pci = [] - udp_replay_approx_vnf.ssh_helper.provision_tool = mock.MagicMock(return_value="tool_path") - udp_replay_approx_vnf.scenario_helper = ScenarioHelper(name='vnf__1') - udp_replay_approx_vnf.scenario_helper.scenario_cfg = self.SCENARIO_CFG - - cmd_line = udp_replay_approx_vnf._build_config() - - expected = \ - "sudo tool_path --log-level=5 -c 0x7 -n 4 -w -- -p 0x3 --config='(0,0,1),(1,0,2)'" - self.assertEqual(cmd_line, expected) - - @mock.patch('yardstick.network_services.vnf_generic.vnf.udp_replay.open') - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") - @mock.patch(SSH_HELPER) - def test__build_pipeline_kwargs(self, ssh, mock_context, *args): - mock_ssh(ssh) - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) - udp_replay_approx_vnf.nfvi_context = mock_context - udp_replay_approx_vnf.nfvi_context.attrs = {'nfvi_type': 'baremetal'} - udp_replay_approx_vnf.setup_helper.bound_pci = ['0000:00:0.1', '0000:00:0.3'] - udp_replay_approx_vnf.all_ports = ["xe0", "xe1"] - udp_replay_approx_vnf.ssh_helper.provision_tool = mock.MagicMock(return_value="tool_path") - udp_replay_approx_vnf.scenario_helper = ScenarioHelper(name='vnf__1') - udp_replay_approx_vnf.scenario_helper.scenario_cfg = self.SCENARIO_CFG - - udp_replay_approx_vnf._build_pipeline_kwargs() - - self.assertEqual(udp_replay_approx_vnf.pipeline_kwargs, { - 'config': '(0,0,1),(1,0,2)', - 'cpu_mask_hex': '0x7', - 'hw_csum': '', - 'port_mask_hex': '0x3', - 'tool_path': 'tool_path', - 'whitelist': '0000:00:0.1 -w 0000:00:0.3' - }) - - @mock.patch(SSH_HELPER) - def test_run_udp_replay(self, ssh, *args): - mock_ssh(ssh) - - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) - udp_replay_approx_vnf._build_config = mock.MagicMock() - udp_replay_approx_vnf.queue_wrapper = mock.MagicMock() - udp_replay_approx_vnf.scenario_helper = mock.MagicMock() - - udp_replay_approx_vnf._run() - - udp_replay_approx_vnf.ssh_helper.run.assert_called_once() - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") - @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh, *args): - mock_ssh(ssh) - - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) - udp_replay_approx_vnf.q_out.put("Replay>") - udp_replay_approx_vnf.WAIT_TIME = 0 - udp_replay_approx_vnf.setup_helper.setup_vnf_environment = mock.Mock() - - udp_replay_approx_vnf.deploy_helper = mock.MagicMock() - udp_replay_approx_vnf.deploy_vnfs = mock.MagicMock() - self.assertIsNone(udp_replay_approx_vnf.instantiate(self.SCENARIO_CFG, self.CONTEXT_CFG)) - - udp_replay_approx_vnf._vnf_process.is_alive = mock.Mock(return_value=1) - udp_replay_approx_vnf._vnf_process.exitcode = 0 - - self.assertEqual(udp_replay_approx_vnf.wait_for_instantiate(), 0) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") - @mock.patch('yardstick.ssh.SSH') - @mock.patch(SSH_HELPER) - def test_instantiate_panic(self, *args): - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) - udp_replay_approx_vnf.WAIT_TIME = 0 - udp_replay_approx_vnf.q_out.put("some text PANIC some text") - udp_replay_approx_vnf.setup_helper.setup_vnf_environment = mock.Mock() - - udp_replay_approx_vnf.deploy_helper = mock.MagicMock() - self.assertIsNone(udp_replay_approx_vnf.instantiate(self.SCENARIO_CFG, self.CONTEXT_CFG)) - with self.assertRaises(RuntimeError): - udp_replay_approx_vnf.wait_for_instantiate() diff --git a/tests/unit/network_services/vnf_generic/vnf/test_vfw_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_vfw_vnf.py deleted file mode 100644 index 48fc87ed4..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_vfw_vnf.py +++ /dev/null @@ -1,351 +0,0 @@ -# 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. -# - -import unittest -import mock -import os - -from tests.unit import STL_MOCKS -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh - -from yardstick.common import utils - - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.vfw_vnf import FWApproxVnf - from yardstick.network_services.nfvi.resource import ResourceProfile - - -TEST_FILE_YAML = 'nsb_test_case.yaml' -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' - -name = 'vnf__1' - - -@mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Process") -class TestFWApproxVnf(unittest.TestCase): - VNFD = {'vnfd:vnfd-catalog': - {'vnfd': - [{'short-name': 'VpeVnf', - 'vdu': - [{'routing_table': - [{'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0'}, - {'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1'}], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': - [{'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'id': 'vpevnf-baremetal', - 'external-interface': - [{'virtual-interface': - {'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02'}, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0'}, - {'virtual-interface': - {'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01'}, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1'}]}], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': - {'vdu-id': 'vpevnf-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1'}, - 'benchmark': - {'kpi': ['packets_in', 'packets_fwd', 'packets_dropped']}, - 'connection-point': [{'type': 'VPORT', 'name': 'xe0'}, - {'type': 'VPORT', 'name': 'xe1'}], - 'id': 'FWApproxVnf', 'name': 'VPEVnfSsh'}]}} - - scenario_cfg = {'options': {'packetsize': 64, 'traffic_type': 4, - 'rfc2544': {'allowed_drop_rate': '0.8 - 1'}, - 'vnf__1': {'rules': 'acl_1rule.yaml', - 'vnf_config': {'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': - '1C/1T', - 'worker_threads': 1}} - }, - 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7', - 'task_path': '/tmp', - 'tc': 'tc_ipv4_1Mflow_64B_packetsize', - 'runner': {'object': 'NetworkServiceTestCase', - 'interval': 35, - 'output_filename': '/tmp/yardstick.out', - 'runner_id': 74476, 'duration': 400, - 'type': 'Duration'}, - 'traffic_profile': 'ipv4_throughput_vfw.yaml', - 'traffic_options': {'flow': 'ipv4_Packets_vfw.yaml', - 'imix': 'imix_voice.yaml'}, - 'type': 'ISB', - 'nodes': {'tg__2': 'trafficgen_2.yardstick', - 'tg__1': 'trafficgen_1.yardstick', - 'vnf__1': 'vnf.yardstick'}, - 'topology': 'vpe-tg-topology-baremetal.yaml'} - - context_cfg = {'nodes': {'tg__2': - {'member-vnf-index': '3', - 'role': 'TrafficGen', - 'name': 'trafficgen_2.yardstick', - 'vnfd-id-ref': 'tg__2', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens513f0', - 'vld_id': FWApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.20', - 'dst_mac': '00:00:00:00:00:01', - 'local_mac': '00:00:00:00:00:03', - 'dst_ip': '152.16.40.19', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens513f1', - 'netmask': '255.255.255.0', - 'network': '202.16.100.0', - 'local_ip': '202.16.100.20', - 'local_mac': '00:1e:67:d0:60:5d', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.1', - 'dpdk_port_num': 1}}, - 'password': 'r00t', - 'VNF model': 'l3fwd_vnf.yaml', - 'user': 'root'}, - 'tg__1': - {'member-vnf-index': '1', - 'role': 'TrafficGen', - 'name': 'trafficgen_1.yardstick', - 'vnfd-id-ref': 'tg__1', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens785f0', - 'vld_id': FWApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.20', - 'dst_mac': '00:00:00:00:00:02', - 'local_mac': '00:00:00:00:00:04', - 'dst_ip': '152.16.100.19', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens785f1', - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.21', - 'local_mac': '00:00:00:00:00:01', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1}}, - 'password': 'r00t', - 'VNF model': 'tg_rfc2544_tpl.yaml', - 'user': 'root'}, - 'vnf__1': - {'name': 'vnf.yardstick', - 'vnfd-id-ref': 'vnf__1', - 'ip': '1.2.1.1', - 'interfaces': - {'xe0': {'local_iface_name': 'ens786f0', - 'vld_id': FWApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.19', - 'dst_mac': '00:00:00:00:00:04', - 'local_mac': '00:00:00:00:00:02', - 'dst_ip': '152.16.100.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0}, - 'xe1': {'local_iface_name': 'ens786f1', - 'vld_id': FWApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.19', - 'dst_mac': '00:00:00:00:00:03', - 'local_mac': '00:00:00:00:00:01', - 'dst_ip': '152.16.40.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1}}, - 'routing_table': - [{'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'network': '152.16.100.20', - 'if': 'xe0'}, - {'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'network': '152.16.40.20', - 'if': 'xe1'}], - 'member-vnf-index': '2', - 'host': '1.2.1.1', - 'role': 'vnf', - 'user': 'root', - 'nd_route_tbl': - [{'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0'}, - {'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1'}], - 'password': 'r00t', - 'VNF model': 'vfw_vnf.yaml'}}} - - def test___init__(self, *args): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vfw_approx_vnf = FWApproxVnf(name, vnfd) - self.assertIsNone(vfw_approx_vnf._vnf_process) - - STATS = """\ -p vfw stats - -VFW Stats -{"VFW_counters" : {"id" : "PIPELINE4", " pkts_received": 6007180, " pkts_fw_forwarded": 6007180, " pkts_drop_fw": 0, " pkts_acl_forwarded": 6007180, "pkts_drop_without_rule" : 0, "average_pkts_in_batch" : 31, "average_internal_time_in_clocks" : 17427, "average_external_time_in_clocks" : 261120, "total_time_measures" : 189829, "ct_packets_forwarded" : 6007148, "ct_packets_dropped" : 0, "bytes_processed ": 360430800, "ct_sessions" : {"active" : 130050, "open_attempt" : 130050, "re-open_attempt" : 0, "established" : 0, "closed" : 0, "timeout" : 0}, "ct_drops" : {"out_of_window" : 0, "invalid_conn" : 0, "invalid_state_transition" : 0 "RST" : 0}} -VFW TOTAL: pkts_received: 6007180, "pkts_fw_forwarded": 6007180, "pkts_drop_fw": 0, "fw_drops" : {"TTL_zero" : 0, "bad_size" : 0, "fragmented_packet" : 0, "unsupported_packet_types" : 0, "no_arp_entry" : 6007180}, "pkts_acl_forwarded": 6007180, "pkts_drop_without_rule": 0, "packets_last_sec" : 0, "average_packets_per_sec" : 0, "bytes_last_sec" : 0, "average_bytes_per_sec" : 0, "bytes_processed ": 360430800 -"CT TOTAL: ct_packets_forwarded" : 6007180, " ct_packets_dropped" : 0, "ct_sessions" : {"active" : 130050, "open_attempt" : 130050, "re-open_attempt" : 0, "established" : 0, "closed" : 0, "timeout" : 0}, "ct_drops" : {"out_of_window" : 0, "invalid_conn" : 0, "invalid_state_transition" : 0 "RST" : 0} -Action ID: 00, packetCount: 2954633, byteCount: 177277980 -Action ID: 01, packetCount: 3052547, byteCount: 183152820 -pipeline> - -pipeline> -""" # noqa - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vfw_approx_vnf = FWApproxVnf(name, vnfd) - vfw_approx_vnf.q_in = mock.MagicMock() - vfw_approx_vnf.q_out = mock.MagicMock() - vfw_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - vfw_approx_vnf.resource = mock.Mock(autospec=ResourceProfile) - vfw_approx_vnf.resource_helper = mock.MagicMock( - **{'collect_kpi.return_value': {"core": {}}}) - vfw_approx_vnf.vnf_execute = mock.Mock(return_value=self.STATS) - result = { - 'packets_dropped': 0, - 'packets_fwd': 6007180, - 'packets_in': 6007180, - 'collect_stats': {'core': {}}, - } - self.assertEqual(result, vfw_approx_vnf.collect_kpi()) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - @mock.patch(SSH_HELPER) - def test_vnf_execute_command(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vfw_approx_vnf = FWApproxVnf(name, vnfd) - vfw_approx_vnf.q_in = mock.MagicMock() - vfw_approx_vnf.q_out = mock.MagicMock() - vfw_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - cmd = "quit" - self.assertEqual(vfw_approx_vnf.vnf_execute(cmd), "") - - @mock.patch(SSH_HELPER) - def test_get_stats(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vfw_approx_vnf = FWApproxVnf(name, vnfd) - vfw_approx_vnf.q_in = mock.MagicMock() - vfw_approx_vnf.q_out = mock.MagicMock() - vfw_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - vfw_approx_vnf.vnf_execute = mock.Mock(return_value=self.STATS) - self.assertEqual(self.STATS, vfw_approx_vnf.get_stats()) - - def _get_file_abspath(self, filename): - curr_path = os.path.dirname(os.path.abspath(__file__)) - file_path = os.path.join(curr_path, filename) - return file_path - - @mock.patch("yardstick.network_services.vnf_generic.vnf.vfw_vnf.hex") - @mock.patch("yardstick.network_services.vnf_generic.vnf.vfw_vnf.eval") - @mock.patch("yardstick.network_services.vnf_generic.vnf.vfw_vnf.open") - @mock.patch(SSH_HELPER) - def test_run_vfw(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vfw_approx_vnf = FWApproxVnf(name, vnfd) - vfw_approx_vnf._build_config = mock.MagicMock() - vfw_approx_vnf.queue_wrapper = mock.MagicMock() - vfw_approx_vnf.ssh_helper = mock.MagicMock() - vfw_approx_vnf.ssh_helper.run = mock.MagicMock() - vfw_approx_vnf.scenario_helper.scenario_cfg = self.scenario_cfg - vfw_approx_vnf.vnf_cfg = {'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': '1C/1T', - 'worker_threads': 1} - vfw_approx_vnf.all_options = {'traffic_type': '4', - 'topology': 'nsb_test_case.yaml'} - vfw_approx_vnf._run() - vfw_approx_vnf.ssh_helper.run.assert_called_once() - - @mock.patch.object(utils, 'find_relative_file') - @mock.patch("yardstick.network_services.vnf_generic.vnf.vfw_vnf.YangModel") - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") - @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh, *args): - mock_ssh(ssh) - - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vfw_approx_vnf = FWApproxVnf(name, vnfd) - vfw_approx_vnf.ssh_helper = ssh - vfw_approx_vnf.deploy_helper = mock.MagicMock() - vfw_approx_vnf.resource_helper = mock.MagicMock() - vfw_approx_vnf._build_config = mock.MagicMock() - self.scenario_cfg['vnf_options'] = {'acl': {'cfg': "", - 'rules': ""}} - self.scenario_cfg.update({"nodes": {"vnf__1": ""}}) - self.assertIsNone(vfw_approx_vnf.instantiate(self.scenario_cfg, self.context_cfg)) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py deleted file mode 100644 index 8c45d973e..000000000 --- a/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py +++ /dev/null @@ -1,787 +0,0 @@ -# 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 multiprocessing import Process, Queue -import os -import time - -import mock -import six.moves.configparser as configparser -import unittest - -from tests.unit import STL_MOCKS -from tests.unit.network_services.vnf_generic.vnf.test_base import FileAbsPath -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh -from yardstick.network_services.vnf_generic.vnf.base import QueueFileWrapper -from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper - - -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' - -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.vpe_vnf import ConfigCreate - from yardstick.network_services.nfvi.resource import ResourceProfile - from yardstick.network_services.vnf_generic.vnf.vpe_vnf import \ - VpeApproxVnf, VpeApproxSetupEnvHelper - - -TEST_FILE_YAML = 'nsb_test_case.yaml' - -NAME = 'vnf_1' - -PING_OUTPUT_1 = "Pkts in: 101\r\n\tPkts dropped by AH: 100\r\n\tPkts dropped by other: 100" - -MODULE_PATH = FileAbsPath(__file__) -get_file_abspath = MODULE_PATH.get_path - - -class TestConfigCreate(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01', - 'vld_id': 'uplink_0', - 'ifname': 'xe0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02', - 'vld_id': 'downlink_0', - 'ifname': 'xe1', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' - } - - def test___init__(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - config_create = ConfigCreate(vnfd_helper, 2) - self.assertEqual(config_create.uplink_ports, ['xe0']) - self.assertEqual(config_create.downlink_ports, ['xe1']) - self.assertEqual(config_create.socket, 2) - - def test_dpdk_port_to_link_id(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - config_create = ConfigCreate(vnfd_helper, 2) - self.assertEqual(config_create.dpdk_port_to_link_id_map, {'xe0': 0, 'xe1': 1}) - - def test_vpe_initialize(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - config_create = ConfigCreate(vnfd_helper, 2) - config = configparser.ConfigParser() - config_create.vpe_initialize(config) - self.assertEqual(config.get('EAL', 'log_level'), '0') - self.assertEqual(config.get('PIPELINE0', 'type'), 'MASTER') - self.assertEqual(config.get('PIPELINE0', 'core'), 's2C0') - self.assertEqual(config.get('MEMPOOL0', 'pool_size'), '256K') - self.assertEqual(config.get('MEMPOOL1', 'pool_size'), '2M') - - def test_vpe_rxq(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - config_create = ConfigCreate(vnfd_helper, 2) - config = configparser.ConfigParser() - config_create.downlink_ports = ['xe0'] - config_create.vpe_rxq(config) - self.assertEqual(config.get('RXQ0.0', 'mempool'), 'MEMPOOL1') - - def test_get_sink_swq(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - config_create = ConfigCreate(vnfd_helper, 2) - config = configparser.ConfigParser() - config.add_section('PIPELINE0') - config.set('PIPELINE0', 'key1', 'value1') - config.set('PIPELINE0', 'key2', 'value2 SINK') - config.set('PIPELINE0', 'key3', 'TM value3') - config.set('PIPELINE0', 'key4', 'value4') - config.set('PIPELINE0', 'key5', 'the SINK value5') - - self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key1', 5), 'SWQ-1') - self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key2', 5), 'SWQ-1 SINK0') - self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key3', 5), 'SWQ-1 TM5') - config_create.sw_q += 1 - self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key4', 5), 'SWQ0') - self.assertEqual(config_create.get_sink_swq(config, 'PIPELINE0', 'key5', 5), 'SWQ0 SINK1') - - def test_generate_vpe_script(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - vpe_config_vnf = ConfigCreate(vnfd_helper, 2) - intf = [ - { - "name": 'xe1', - "virtual-interface": { - "dst_ip": "1.1.1.1", - "dst_mac": "00:00:00:00:00:00:02", - }, - }, - { - "name": 'xe2', - "virtual-interface": { - "dst_ip": "1.1.1.1", - "dst_mac": "00:00:00:00:00:00:02", - }, - }, - ] - vpe_config_vnf.downlink_ports = ['xe1'] - vpe_config_vnf.uplink_ports = ['xe2'] - result = vpe_config_vnf.generate_vpe_script(intf) - self.assertIsInstance(result, str) - self.assertNotEqual(result, '') - - def test_create_vpe_config(self): - vnfd_helper = VnfdHelper(self.VNFD_0) - config_create = ConfigCreate(vnfd_helper, 23) - config_create.downlink_ports = ['xe1'] - config_create.uplink_ports = ['xe1'] - curr_path = os.path.dirname(os.path.abspath(__file__)) - vpe_cfg = "samples/vnf_samples/nsut/vpe/vpe_config" - vnf_cfg = os.path.join(curr_path, "../../../../..", vpe_cfg) - config_create.create_vpe_config(vnf_cfg) - os.system("git checkout -- %s" % vnf_cfg) - - -class TestVpeApproxVnf(unittest.TestCase): - - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0', - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1', - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'driver': "i40e", - 'dst_ip': '152.16.100.20', - 'local_iface_name': 'xe0', - 'local_mac': '00:00:00:00:00:02', - 'vld_id': 'uplink_0', - 'ifname': 'xe0', - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0', - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'driver': "i40e", - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_iface_name': 'xe1', - 'local_mac': '00:00:00:00:00:01', - 'vld_id': 'downlink_0', - 'ifname': 'xe1', - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1', - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.2.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.2.1.1', - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', - 'name': 'VPEVnfSsh', - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ], - }, - } - - SCENARIO_CFG = { - 'options': { - 'packetsize': 64, - 'traffic_type': 4, - 'rfc2544': { - 'allowed_drop_rate': '0.8 - 1', - }, - 'vnf__1': { - 'cfg': 'acl_1rule.yaml', - 'vnf_config': { - 'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': - '1C/1T', - 'worker_threads': 1, - }, - } - }, - 'task_id': 'a70bdf4a-8e67-47a3-9dc1-273c14506eb7', - 'tc': 'tc_ipv4_1Mflow_64B_packetsize', - 'runner': { - 'object': 'NetworkServiceTestCase', - 'interval': 35, - 'output_filename': '/tmp/yardstick.out', - 'runner_id': 74476, - 'duration': 400, - 'type': 'Duration', - }, - 'traffic_profile': 'ipv4_throughput_vpe.yaml', - 'traffic_options': { - 'flow': 'ipv4_Packets_vpe.yaml', - 'imix': 'imix_voice.yaml', - }, - 'type': 'ISB', - 'nodes': { - 'tg__2': 'trafficgen_2.yardstick', - 'tg__1': 'trafficgen_1.yardstick', - 'vnf__1': 'vnf.yardstick', - }, - 'topology': 'vpe-tg-topology-baremetal.yaml', - } - - CONTEXT_CFG = { - 'nodes': { - 'tg__2': { - 'member-vnf-index': '3', - 'role': 'TrafficGen', - 'name': 'trafficgen_2.yardstick', - 'vnfd-id-ref': 'tg__2', - 'ip': '1.2.1.1', - 'interfaces': { - 'xe0': { - 'local_iface_name': 'ens513f0', - 'vld_id': VpeApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.20', - 'dst_mac': '00:00:00:00:00:01', - 'local_mac': '00:00:00:00:00:03', - 'dst_ip': '152.16.40.19', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.0', - 'dpdk_port_num': 0, - }, - 'xe1': { - 'local_iface_name': 'ens513f1', - 'netmask': '255.255.255.0', - 'network': '202.16.100.0', - 'local_ip': '202.16.100.20', - 'local_mac': '00:1e:67:d0:60:5d', - 'driver': 'ixgbe', - 'vpci': '0000:02:00.1', - 'dpdk_port_num': 1, - }, - }, - 'password': 'r00t', - 'VNF model': 'l3fwd_vnf.yaml', - 'user': 'root', - }, - 'tg__1': { - 'member-vnf-index': '1', - 'role': 'TrafficGen', - 'name': 'trafficgen_1.yardstick', - 'vnfd-id-ref': 'tg__1', - 'ip': '1.2.1.1', - 'interfaces': { - 'xe0': { - 'local_iface_name': 'ens785f0', - 'vld_id': VpeApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.20', - 'dst_mac': '00:00:00:00:00:02', - 'local_mac': '00:00:00:00:00:04', - 'dst_ip': '152.16.100.19', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0, - }, - 'xe1': { - 'local_iface_name': 'ens785f1', - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.21', - 'local_mac': '00:00:00:00:00:01', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1, - }, - }, - 'password': 'r00t', - 'VNF model': 'tg_rfc2544_tpl.yaml', - 'user': 'root', - }, - 'vnf__1': { - 'name': 'vnf.yardstick', - 'vnfd-id-ref': 'vnf__1', - 'ip': '1.2.1.1', - 'interfaces': { - 'xe0': { - 'local_iface_name': 'ens786f0', - 'vld_id': VpeApproxVnf.UPLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.100.19', - 'dst_mac': '00:00:00:00:00:04', - 'local_mac': '00:00:00:00:00:02', - 'dst_ip': '152.16.100.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.0', - 'dpdk_port_num': 0, - }, - 'xe1': { - 'local_iface_name': 'ens786f1', - 'vld_id': VpeApproxVnf.DOWNLINK, - 'netmask': '255.255.255.0', - 'local_ip': '152.16.40.19', - 'dst_mac': '00:00:00:00:00:03', - 'local_mac': '00:00:00:00:00:01', - 'dst_ip': '152.16.40.20', - 'driver': 'i40e', - 'vpci': '0000:05:00.1', - 'dpdk_port_num': 1, - }, - }, - 'routing_table': [ - { - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'network': '152.16.100.20', - 'if': 'xe0', - }, - { - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'network': '152.16.40.20', - 'if': 'xe1', - }, - ], - 'member-vnf-index': '2', - 'host': '1.2.1.1', - 'role': 'vnf', - 'user': 'root', - 'nd_route_tbl': [ - { - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0', - }, - { - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1', - }, - ], - 'password': 'r00t', - 'VNF model': 'vpe_vnf.yaml', - }, - }, - } - - def setUp(self): - self.mock_sleep = mock.patch.object(time, 'sleep').start() - - def test___init__(self): - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - self.assertIsNone(vpe_approx_vnf._vnf_process) - - @mock.patch(SSH_HELPER) - def test_collect_kpi_sa_not_running(self, ssh): - mock_ssh(ssh) - - resource = mock.Mock(autospec=ResourceProfile) - resource.check_if_system_agent_running.return_value = 1, '' - resource.amqp_collect_nfvi_kpi.return_value = {'foo': 234} - resource.check_if_system_agent_running.return_value = (1, None) - - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf.q_in = mock.MagicMock() - vpe_approx_vnf.q_out = mock.MagicMock() - vpe_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - vpe_approx_vnf.resource_helper.resource = resource - - expected = { - 'pkt_in_down_stream': 0, - 'pkt_in_up_stream': 0, - 'pkt_drop_down_stream': 0, - 'pkt_drop_up_stream': 0, - 'collect_stats': {'core': {}}, - } - self.assertEqual(vpe_approx_vnf.collect_kpi(), expected) - - @mock.patch(SSH_HELPER) - def test_collect_kpi_sa_running(self, ssh): - mock_ssh(ssh) - - resource = mock.Mock(autospec=ResourceProfile) - resource.check_if_system_agent_running.return_value = 0, '1234' - resource.amqp_collect_nfvi_kpi.return_value = {'foo': 234} - - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf.q_in = mock.MagicMock() - vpe_approx_vnf.q_out = mock.MagicMock() - vpe_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - vpe_approx_vnf.resource_helper.resource = resource - - expected = { - 'pkt_in_down_stream': 0, - 'pkt_in_up_stream': 0, - 'pkt_drop_down_stream': 0, - 'pkt_drop_up_stream': 0, - 'collect_stats': {'core': {'foo': 234}}, - } - self.assertEqual(vpe_approx_vnf.collect_kpi(), expected) - - @mock.patch(SSH_HELPER) - def test_vnf_execute(self, ssh): - mock_ssh(ssh) - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf.q_in = mock.MagicMock() - vpe_approx_vnf.q_out = mock.MagicMock() - vpe_approx_vnf.q_out.qsize = mock.Mock(return_value=0) - self.assertEqual(vpe_approx_vnf.vnf_execute("quit", 0), '') - - @mock.patch(SSH_HELPER) - def test_run_vpe(self, ssh): - mock_ssh(ssh) - - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf.tc_file_name = get_file_abspath(TEST_FILE_YAML) - vpe_approx_vnf.vnf_cfg = { - 'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': '1C/1T', - 'worker_threads': 1, - } - vpe_approx_vnf.scenario_helper.scenario_cfg = { - 'options': { - NAME: { - 'traffic_type': '4', - 'topology': 'nsb_test_case.yaml', - 'vnf_config': 'vpe_config', - } - } - } - vpe_approx_vnf.topology = "nsb_test_case.yaml" - vpe_approx_vnf.nfvi_type = "baremetal" - vpe_approx_vnf._provide_config_file = mock.Mock() - vpe_approx_vnf._build_config = mock.MagicMock() - - self.assertIsInstance(vpe_approx_vnf.ssh_helper, mock.Mock) - self.assertIsInstance(vpe_approx_vnf.ssh_helper, mock.Mock) - self.assertIsNone(vpe_approx_vnf._run()) - - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig") - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") - @mock.patch("yardstick.network_services.vnf_generic.vnf.vpe_vnf.ConfigCreate") - @mock.patch("yardstick.network_services.vnf_generic.vnf.vpe_vnf.open") - @mock.patch(SSH_HELPER) - def test_build_config(self, ssh, *args): - mock_ssh(ssh) - vpe_approx_vnf = VpeApproxSetupEnvHelper(mock.MagicMock(), - mock.MagicMock(), mock.MagicMock()) - vpe_approx_vnf.tc_file_name = get_file_abspath(TEST_FILE_YAML) - vpe_approx_vnf.generate_port_pairs = mock.Mock() - vpe_approx_vnf.vnf_cfg = { - 'lb_config': 'SW', - 'lb_count': 1, - 'worker_config': '1C/1T', - 'worker_threads': 1, - } - vpe_approx_vnf.scenario_helper.scenario_cfg = { - 'options': { - NAME: { - 'traffic_type': '4', - 'topology': 'nsb_test_case.yaml', - 'vnf_config': 'vpe_config', - } - } - } - vpe_approx_vnf.topology = "nsb_test_case.yaml" - vpe_approx_vnf.nfvi_type = "baremetal" - vpe_approx_vnf._provide_config_file = mock.Mock() - - vpe_approx_vnf.ssh_helper = mock.MagicMock() - vpe_approx_vnf.scenario_helper = mock.MagicMock() - vpe_approx_vnf.ssh_helper.bin_path = mock.Mock() - vpe_approx_vnf.ssh_helper.upload_config_file = mock.MagicMock() - self.assertIsNone(vpe_approx_vnf._build_vnf_ports()) - self.assertIsNotNone(vpe_approx_vnf.build_config()) - - @mock.patch(SSH_HELPER) - def test_wait_for_instantiate(self, ssh): - mock_ssh(ssh) - - mock_process = mock.Mock(autospec=Process) - mock_process.is_alive.return_value = True - mock_process.exitcode = 432 - - mock_q_out = mock.Mock(autospec=Queue) - mock_q_out.get.side_effect = iter(["pipeline>"]) - mock_q_out.qsize.side_effect = range(1, -1, -1) - - mock_resource = mock.MagicMock() - - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf._vnf_process = mock_process - vpe_approx_vnf.q_out = mock_q_out - vpe_approx_vnf.queue_wrapper = mock.Mock(autospec=QueueFileWrapper) - vpe_approx_vnf.resource_helper.resource = mock_resource - - vpe_approx_vnf.q_out.put("pipeline>") - self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432) - - @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_fragmented(self, ssh): - mock_ssh(ssh) - - mock_process = mock.Mock(autospec=Process) - mock_process.is_alive.return_value = True - mock_process.exitcode = 432 - - # test that fragmented pipeline prompt is recognized - mock_q_out = mock.Mock(autospec=Queue) - mock_q_out.get.side_effect = iter(["wow pipel", "ine>"]) - mock_q_out.qsize.side_effect = range(2, -1, -1) - - mock_resource = mock.MagicMock() - - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf._vnf_process = mock_process - vpe_approx_vnf.q_out = mock_q_out - vpe_approx_vnf.queue_wrapper = mock.Mock(autospec=QueueFileWrapper) - vpe_approx_vnf.resource_helper.resource = mock_resource - - self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432) - - @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_crash(self, ssh): - mock_ssh(ssh, exec_result=(1, "", "")) - - mock_process = mock.Mock(autospec=Process) - mock_process.is_alive.return_value = False - mock_process.exitcode = 432 - - mock_resource = mock.MagicMock() - - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf._vnf_process = mock_process - vpe_approx_vnf.resource_helper.resource = mock_resource - - with self.assertRaises(RuntimeError) as raised: - vpe_approx_vnf.wait_for_instantiate() - - self.assertIn('VNF process died', str(raised.exception)) - - @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_panic(self, ssh): - mock_ssh(ssh, exec_result=(1, "", "")) - - mock_process = mock.Mock(autospec=Process) - mock_process.is_alive.return_value = True - mock_process.exitcode = 432 - - mock_resource = mock.MagicMock() - - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf._vnf_process = mock_process - vpe_approx_vnf.resource_helper.resource = mock_resource - - vpe_approx_vnf.q_out.put("PANIC") - with self.assertRaises(RuntimeError) as raised: - vpe_approx_vnf.wait_for_instantiate() - - self.assertIn('Error starting', str(raised.exception)) - - @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_panic_fragmented(self, ssh): - mock_ssh(ssh, exec_result=(1, "", "")) - - mock_process = mock.Mock(autospec=Process) - mock_process.is_alive.return_value = True - mock_process.exitcode = 432 - - # test that fragmented PANIC is recognized - mock_q_out = mock.Mock(autospec=Queue) - mock_q_out.get.side_effect = iter(["omg PA", "NIC this is bad"]) - mock_q_out.qsize.side_effect = range(2, -1, -1) - - mock_resource = mock.MagicMock() - - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf._vnf_process = mock_process - vpe_approx_vnf.q_out = mock_q_out - vpe_approx_vnf.resource_helper.resource = mock_resource - - with self.assertRaises(RuntimeError) as raised: - vpe_approx_vnf.wait_for_instantiate() - - self.assertIn('Error starting', str(raised.exception)) - - @mock.patch(SSH_HELPER) - def test_terminate(self, ssh): - mock_ssh(ssh) - - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - vpe_approx_vnf._vnf_process = mock.MagicMock() - vpe_approx_vnf._resource_collect_stop = mock.Mock() - vpe_approx_vnf.resource_helper = mock.MagicMock() - - self.assertIsNone(vpe_approx_vnf.terminate()) |