diff options
31 files changed, 394 insertions, 199 deletions
diff --git a/dashboard/opnfv_yardstick_tc037.json b/dashboard/opnfv_yardstick_tc037.json index 366210503..85f7908b6 100644 --- a/dashboard/opnfv_yardstick_tc037.json +++ b/dashboard/opnfv_yardstick_tc037.json @@ -846,7 +846,7 @@ ], "timeFrom": null, "timeShift": null, - "title": "Latency - Ping", + "title": "Latency - Ping, 999999 rtt indicates ping error", "tooltip": { "shared": true, "sort": 0, diff --git a/dashboard/opnfv_yardstick_tc038.json b/dashboard/opnfv_yardstick_tc038.json index bf068d5a9..65b97d626 100644 --- a/dashboard/opnfv_yardstick_tc038.json +++ b/dashboard/opnfv_yardstick_tc038.json @@ -566,7 +566,7 @@ ], "timeFrom": null, "timeShift": null, - "title": "Latency - Ping", + "title": "Latency - Ping, 999999 rtt indicates ping error", "tooltip": { "shared": true, "sort": 0, diff --git a/dashboard/opnfv_yardstick_tc070.json b/dashboard/opnfv_yardstick_tc070.json index 152ecca24..c57d4194e 100644 --- a/dashboard/opnfv_yardstick_tc070.json +++ b/dashboard/opnfv_yardstick_tc070.json @@ -914,7 +914,7 @@ ], "timeFrom": null, "timeShift": null, - "title": "Latency - Ping", + "title": "Latency - Ping, 999999 rtt indicates ping error", "tooltip": { "shared": true, "sort": 0, diff --git a/dashboard/opnfv_yardstick_tc071.json b/dashboard/opnfv_yardstick_tc071.json index defd6fada..009e0a173 100644 --- a/dashboard/opnfv_yardstick_tc071.json +++ b/dashboard/opnfv_yardstick_tc071.json @@ -994,7 +994,7 @@ ], "timeFrom": null, "timeShift": null, - "title": "Latency - Ping", + "title": "Latency - Ping, 999999 rtt indicates ping error", "tooltip": { "shared": true, "sort": 0, diff --git a/dashboard/opnfv_yardstick_tc072.json b/dashboard/opnfv_yardstick_tc072.json index 2d330a05f..b8e9fa356 100644 --- a/dashboard/opnfv_yardstick_tc072.json +++ b/dashboard/opnfv_yardstick_tc072.json @@ -723,7 +723,7 @@ ], "timeFrom": null, "timeShift": null, - "title": "Latency - Ping", + "title": "Latency - Ping, 999999 rtt indicates ping error", "tooltip": { "shared": true, "sort": 0, diff --git a/samples/vnf_samples/nsut/acl/acl.cfg b/samples/vnf_samples/nsut/acl/acl.cfg index fd3c51ee8..06da405db 100644 --- a/samples/vnf_samples/nsut/acl/acl.cfg +++ b/samples/vnf_samples/nsut/acl/acl.cfg @@ -20,8 +20,6 @@ type = ARPICMP core = 1 pktq_in = SWQ4 pktq_out = TXQ0.0 TXQ1.0 TXQ2.0 TXQ3.0 -arp_route_tbl = (c0102814,fffff000,1,c0102814) (c0106414,fffff000,0,c0106414) -nd_route_tbl = (0064:ff9b:0:0:0:0:9810:6414,120,0,0064:ff9b:0:0:0:0:9810:6414) pktq_in_prv = RXQ0.0 prv_to_pub_map = (0,1) [PIPELINE2] diff --git a/samples/vnf_samples/nsut/acl/acl_config/acl_config b/samples/vnf_samples/nsut/acl/acl_config/acl_config deleted file mode 100644 index 52b6a5002..000000000 --- a/samples/vnf_samples/nsut/acl/acl_config/acl_config +++ /dev/null @@ -1,61 +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. - -[PIPELINE0] -type = MASTER -core = s{socket}c0 -[PIPELINE1] -type = ARPICMP -core = s{socket}c1 -pktq_in = SWQ2 -pktq_out = SWQ7 -# debug output -# ({port1_dst_ip},{port1_netmask},1,{port1_dst_ip}) ({port0_dst_ip},{port0_netmask},0,{port0_dst_ip}) -arp_route_tbl = ({port0_dst_ip_hex},{port0_netmask_hex},0,{port0_dst_ip_hex}) ({port1_dst_ip_hex},{port1_netmask_hex},1,{port1_dst_ip_hex}) -#ports_mac_list = port0_local_mac port1_local_mac -ports_mac_list = {port0_local_mac} {port1_local_mac} -pktq_in_prv = RXQ0.0 RXQ1.0 -prv_to_pub_map = (0,1) -prv_que_handler = (0) - -[PIPELINE2] -type = TXRX -core = s{socket}c2 -pktq_in = RXQ0.0 RXQ1.0 -pktq_out = SWQ0 SWQ1 SWQ2 -pipeline_txrx_type = RXRX -dest_if_offset=176 -[PIPELINE3] -type = LOADB -core = s{socket}c3 -pktq_in = SWQ0 SWQ1 -pktq_out = SWQ3 SWQ4 -outport_offset = 136 -phyport_offset = 204 -n_vnf_threads = 1 -prv_que_handler = (0) -[PIPELINE4] -type = ACL -core = s{socket}c4 -pktq_in = SWQ3 SWQ4 -pktq_out = SWQ5 SWQ6 -n_flows = 1000000 -pkt_type = ipv4 -traffic_type = 4 -[PIPELINE5] -type = TXRX -core = s{socket}c5 -pktq_in = SWQ5 SWQ6 SWQ7 -pktq_out = TXQ0.0 TXQ1.0 -pipeline_txrx_type = TXTX diff --git a/samples/vnf_samples/nsut/acl/acl_config/acl_script b/samples/vnf_samples/nsut/acl/acl_config/acl_script deleted file mode 100644 index 4d7553609..000000000 --- a/samples/vnf_samples/nsut/acl/acl_config/acl_script +++ /dev/null @@ -1,53 +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. - -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 - -p action add 0 accept -p action add 0 fwd 0 -p action add 0 count - -p action add 1 accept -p action add 1 fwd 1 -p action add 1 count - -#p acl add 1 0.0.0.0 0 0.0.0.0 0 0 65535 0 65535 0 0 0 -#p acl add 1 0.0.0.0 0 0.0.0.0 0 0 65535 0 65535 0 0 1 - -# action rule matches dest port -p acl add 1 {port1_local_network} {port1_prefix} 0.0.0.0 0 0 65535 0 65535 0 0 0 -p acl add 1 0.0.0.0 0 {port1_local_network} {port1_prefix} 0 65535 0 65535 0 0 1 - -p acl add 1 {port0_local_network} {port0_prefix} 0.0.0.0 0 0 65535 0 65535 0 0 1 -p acl add 1 0.0.0.0 0 {port0_local_network} {port0_prefix} 0 65535 0 65535 0 0 0 - -p acl add 1 {port0_local_network} {port0_prefix} {port1_local_network} {port1_prefix} 0 65535 0 65535 0 0 1 -p acl add 1 {port1_local_network} {port1_prefix} {port0_local_network} {port0_prefix} 0 65535 0 65535 0 0 0 - -# gateway is the remote port -p 1 arpadd 0 {port0_gateway} {port0_local_mac} -p 1 arpadd 0 {port0_local_ip} {port0_local_mac} -p 1 arpadd 0 {port0_dst_ip} {port0_dst_mac} -p 1 arpadd 1 {port1_gateway} {port1_local_mac} -p 1 arpadd 1 {port1_local_ip} {port1_local_mac} -p 1 arpadd 1 {port1_dst_ip} {port1_dst_mac} - -p acl applyruleset - -#p acl dbg 1 diff --git a/samples/vnf_samples/nsut/cgnapt/cgnat.cfg b/samples/vnf_samples/nsut/cgnapt/cgnat.cfg index 37c5e2731..27169f8dc 100644 --- a/samples/vnf_samples/nsut/cgnapt/cgnat.cfg +++ b/samples/vnf_samples/nsut/cgnapt/cgnat.cfg @@ -21,15 +21,7 @@ core = 1 pktq_in = SWQ4 pktq_out = TXQ0.0 TXQ1.0 TXQ2.0 TXQ3.0 -; ARP route table entries (ip, mask, if_port, nh) hex values with no 0x -arp_route_tbl = (c0102814,fffff000,1,c0102814) (c0106414,fffff000,0,c0106414) -;arp_route_tbl = (c0122814,fffff000,3,c0122814) (c0126414,fffff000,1,c0126414) -; Link MAC addresses in order aa:bb:cc:dd:ee:ff separated by space -nd_route_tbl = (0064:ff9b:0:0:0:0:9810:6414,120,0,0064:ff9b:0:0:0:0:9810:6414) -; -; Hex values with no leading 0x, MACs in ascending port order starting @P0 -;ports_mac_list = 00:05:CA:30:21:F0 00:05:CA:30:21:F1 ;00:05:CA:30:21:F2 00:05:CA:30:21:F3 -; + ; egress (private interface) info pktq_in_prv = RXQ0.0 ; @@ -72,7 +64,7 @@ key_size = 8 hash_offset = 200;72 ;cgnapt_debug = 2 ; -timer_period = 10000 +timer_period = 100 max_clients_per_ip = 65535 max_port_per_client = 100 public_ip_port_range = 04040000:(1, 65535) diff --git a/samples/vnf_samples/nsut/vfw/vfw.cfg b/samples/vnf_samples/nsut/vfw/vfw.cfg index 8bab8d047..c0b11419c 100644 --- a/samples/vnf_samples/nsut/vfw/vfw.cfg +++ b/samples/vnf_samples/nsut/vfw/vfw.cfg @@ -20,8 +20,6 @@ type = ARPICMP core = 1 pktq_in = SWQ4 pktq_out = TXQ0.0 TXQ1.0 TXQ2.0 TXQ3.0 -arp_route_tbl = (c0102814,fffff000,1,c0102814) (c0106414,fffff000,0,c0106414) -nd_route_tbl = (0064:ff9b:0:0:0:0:9810:6414,120,0,0064:ff9b:0:0:0:0:9810:6414) pktq_in_prv = RXQ0.0 prv_to_pub_map = (0,1) [PIPELINE2] diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-openbaton-ha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-openbaton-ha_daily.yaml new file mode 100644 index 000000000..d1b4cce1a --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-openbaton-ha_daily.yaml @@ -0,0 +1,62 @@ +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 +############################################################################## +--- +# os-nosdn-openbaton-ha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-openbaton-ha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml +- + file_name: opnfv_yardstick_tc075.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node1.LF"}' diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-ovs_dpdk-ha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-ovs_dpdk-ha_daily.yaml new file mode 100644 index 000000000..10772e0cc --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-ovs_dpdk-ha_daily.yaml @@ -0,0 +1,62 @@ +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 +############################################################################## +--- +# os-nosdn-ovs_dpdk-ha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-ovs_dpdk-ha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml +- + file_name: opnfv_yardstick_tc075.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node1.LF"}' diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-ovs_dpdk-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-ovs_dpdk-noha_daily.yaml new file mode 100644 index 000000000..9b2be3710 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-ovs_dpdk-noha_daily.yaml @@ -0,0 +1,62 @@ +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 +############################################################################## +--- +# os-nosdn-ovs_dpdk-noha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-ovs_dpdk-noha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml +- + file_name: opnfv_yardstick_tc075.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node1.LF"}' diff --git a/tests/opnfv/test_suites/opnfv_os-odl_l2-moon-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-odl_l2-moon-noha_daily.yaml new file mode 100644 index 000000000..cff147720 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-odl_l2-moon-noha_daily.yaml @@ -0,0 +1,62 @@ +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd 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 +############################################################################## +--- +# os-odl_l2-moon-noha daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-odl_l2-moon-noha" +test_cases_dir: "tests/opnfv/test_cases/" +test_cases: +- + file_name: opnfv_yardstick_tc002.yaml +- + file_name: opnfv_yardstick_tc005.yaml +- + file_name: opnfv_yardstick_tc010.yaml +- + file_name: opnfv_yardstick_tc011.yaml +- + file_name: opnfv_yardstick_tc012.yaml +- + file_name: opnfv_yardstick_tc014.yaml +- + file_name: opnfv_yardstick_tc037.yaml +- + file_name: opnfv_yardstick_tc055.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC055"}' +- + file_name: opnfv_yardstick_tc063.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node5.yardstick-TC063"}' +- + file_name: opnfv_yardstick_tc069.yaml +- + file_name: opnfv_yardstick_tc070.yaml +- + file_name: opnfv_yardstick_tc071.yaml +- + file_name: opnfv_yardstick_tc072.yaml +- + file_name: opnfv_yardstick_tc075.yaml + constraint: + installer: compass + pod: huawei-pod1 + task_args: + huawei-pod1: '{"file": "etc/yardstick/nodes/compass_sclab_physical/pod.yaml", + "host": "node1.LF"}' diff --git a/tests/unit/network_services/vnf_generic/vnf/test_iniparser.py b/tests/unit/network_services/helpers/test_iniparser.py index 1ad8df9c6..bd27b497e 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_iniparser.py +++ b/tests/unit/network_services/helpers/test_iniparser.py @@ -27,10 +27,10 @@ stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) stl_patch.start() if stl_patch: - from yardstick.network_services.vnf_generic.vnf.iniparser import ParseError - from yardstick.network_services.vnf_generic.vnf.iniparser import LineParser - from yardstick.network_services.vnf_generic.vnf.iniparser import BaseParser - from yardstick.network_services.vnf_generic.vnf.iniparser import ConfigParser + 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 = """\ @@ -141,7 +141,7 @@ class TestConfigParser(unittest.TestCase): return internal_open - @mock.patch('yardstick.network_services.vnf_generic.vnf.iniparser.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) @@ -182,7 +182,7 @@ class TestConfigParser(unittest.TestCase): self.assertEqual(config_parser.find_section_index('section1'), 1) self.assertEqual(config_parser.find_section_index('section3'), -1) - @mock.patch('yardstick.network_services.vnf_generic.vnf.iniparser.open') + @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) @@ -200,7 +200,7 @@ class TestConfigParser(unittest.TestCase): self.assertEqual(config_parser.sections, expected) - @mock.patch('yardstick.network_services.vnf_generic.vnf.iniparser.open') + @mock.patch('yardstick.network_services.helpers.iniparser.open') def test_parse_negative(self, mock_open): bad_text_dict = { 'no section': PARSE_TEXT_BAD_1, diff --git a/tests/unit/network_services/helpers/test_samplevnf_helper.py b/tests/unit/network_services/helpers/test_samplevnf_helper.py index 0ac363f28..bff3a7722 100644 --- a/tests/unit/network_services/helpers/test_samplevnf_helper.py +++ b/tests/unit/network_services/helpers/test_samplevnf_helper.py @@ -211,6 +211,7 @@ class TestMultiPortConfig(unittest.TestCase): 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)) @@ -823,8 +824,9 @@ class TestMultiPortConfig(unittest.TestCase): opnfv_vnf = MultiPortConfig(topology_file, config_tpl, tmp_file, vnfd_mock) opnfv_vnf.all_ports = [3, 2, 5] - expected = '(0a141000,fffff000,32,0a141e28) (0ac81e00,ffffff00,1,0ac81e28) ' \ - '(0a000000,ff000000,987,0a140328)' + 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) 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 index 09060ff57..a6d40877d 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py @@ -376,7 +376,7 @@ class TestProxApproxVnf(unittest.TestCase): return file_path @mock.patch('yardstick.benchmark.scenarios.networking.vnf_generic.open', create=True) - @mock.patch('yardstick.network_services.vnf_generic.vnf.iniparser.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) 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 index 1e6bc1a13..c41da2c45 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py @@ -1886,6 +1886,7 @@ class TestSampleVnf(unittest.TestCase): 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 diff --git a/yardstick/benchmark/core/task.py b/yardstick/benchmark/core/task.py index 53298d8d3..9b1b3f851 100644 --- a/yardstick/benchmark/core/task.py +++ b/yardstick/benchmark/core/task.py @@ -28,6 +28,7 @@ from jinja2 import Environment from yardstick.benchmark.contexts.base import Context from yardstick.benchmark.runners import base as base_runner +from yardstick.common.constants import CONF_FILE from yardstick.common.yaml_loader import yaml_load from yardstick.dispatcher.base import Base as DispatcherBase from yardstick.common.task_template import TaskTemplate @@ -36,10 +37,8 @@ from yardstick.common import constants from yardstick.common.html_template import report_template output_file_default = "/tmp/yardstick.out" -config_file = '/etc/yardstick/yardstick.conf' test_cases_dir_default = "tests/opnfv/test_cases/" LOG = logging.getLogger(__name__) -JOIN_TIMEOUT = 60 class Task(object): # pragma: no cover @@ -69,7 +68,7 @@ class Task(object): # pragma: no cover self._set_log() try: - output_config = utils.parse_ini_file(config_file) + output_config = utils.parse_ini_file(CONF_FILE) except Exception: # all error will be ignore, the default value is {} output_config = {} @@ -260,7 +259,7 @@ class Task(object): # pragma: no cover # Wait for runners to finish for runner in runners: - status = runner_join(runner, self.outputs, result) + status = runner_join(runner, background_runners, self.outputs, result) if status != 0: raise RuntimeError( "{0} runner status {1}".format(runner.__execution_type__, status)) @@ -270,7 +269,7 @@ class Task(object): # pragma: no cover for scenario in scenarios: if not _is_background_scenario(scenario): runner = self.run_one_scenario(scenario, output_file) - status = runner_join(runner, self.outputs, result) + status = runner_join(runner, background_runners, self.outputs, result) if status != 0: LOG.error('Scenario NO.%s: "%s" ERROR!', scenarios.index(scenario) + 1, @@ -285,11 +284,11 @@ class Task(object): # pragma: no cover # Wait for background runners to finish for runner in background_runners: - status = runner.join(self.outputs, result, JOIN_TIMEOUT) + status = runner.join(self.outputs, result) if status is None: # Nuke if it did not stop nicely base_runner.Runner.terminate(runner) - runner.join(self.outputs, result, JOIN_TIMEOUT) + runner.join(self.outputs, result) base_runner.Runner.release(runner) print("Background task ended") @@ -641,13 +640,22 @@ def get_networks_from_nodes(nodes): return networks -def runner_join(runner, outputs, result): +def runner_join(runner, background_runners, outputs, result): """join (wait for) a runner, exit process at runner failure + :param background_runners: + :type background_runners: :param outputs: :type outputs: dict :param result: :type result: list """ + while runner.poll() is None: + outputs.update(runner.get_output()) + result.extend(runner.get_result()) + # drain all the background runner queues + for background in background_runners: + outputs.update(background.get_output()) + result.extend(background.get_result()) status = runner.join(outputs, result) base_runner.Runner.release(runner) return status diff --git a/yardstick/benchmark/runners/base.py b/yardstick/benchmark/runners/base.py index 13718d793..a887fa5b3 100755 --- a/yardstick/benchmark/runners/base.py +++ b/yardstick/benchmark/runners/base.py @@ -210,6 +210,10 @@ class Runner(object): QUEUE_JOIN_INTERVAL = 5 + def poll(self, timeout=QUEUE_JOIN_INTERVAL): + self.process.join(timeout) + return self.process.exitcode + def join(self, outputs, result, interval=QUEUE_JOIN_INTERVAL): while self.process.exitcode is None: # drain the queue while we are running otherwise we won't terminate diff --git a/yardstick/benchmark/scenarios/compute/qemu_migrate_benchmark.bash b/yardstick/benchmark/scenarios/compute/qemu_migrate_benchmark.bash index d9a440c89..757553e8b 100644 --- a/yardstick/benchmark/scenarios/compute/qemu_migrate_benchmark.bash +++ b/yardstick/benchmark/scenarios/compute/qemu_migrate_benchmark.bash @@ -21,15 +21,24 @@ max_down_time=$6 OUTPUT_FILE=/tmp/output-qemu.log +echo "To check the parameters:" +echo "SRC: $src" +echo "DST: $dst" +echo "DST_IP: $dst_ip" +echo "MIGRATE_PORT: $migrate_to_port" +echo "DOWN_TIME: $max_down_time" + do_migrate() { + echo "Execution of Live Migration" + echo "info status" | nc -U $src # with no speed limit - echo "migrate_set_speed 0" |nc -U $src + echo "migrate_set_speed 0" | nc -U $src # set the expected max downtime - echo "migrate_set_downtime ${max_down_time}" |nc -U $src + echo "migrate_set_downtime ${max_down_time}" | nc -U $src # start live migration - echo "migrate -d tcp:${dst_ip}:$migrate_to_port" |nc -U $src + echo "migrate -d tcp:${dst_ip}:${migrate_to_port}" | nc -U $src # wait until live migration completed status="" while [ "${status}" == "" ] @@ -38,14 +47,17 @@ do_migrate() echo ${status} sleep 1; done -} >/dev/null + + echo "End of Live Migration" +} output_qemu() { + echo "Checking status of Migration" # print detail information echo "info migrate" | nc -U $src echo "quit" | nc -U $src - echo "quit" | nc -u $dst + echo "quit" | nc -U $dst sleep 5 echo "Migration executed successfully" @@ -65,8 +77,11 @@ echo -e "{ \ # main entry main() { + echo "Perform LiveMigration" do_migrate + echo "LiveMigration Status" output_qemu + echo "LiveMigration JSON output " output_json } main diff --git a/yardstick/benchmark/scenarios/networking/ping.py b/yardstick/benchmark/scenarios/networking/ping.py index 3bade73e2..e7d9beea8 100644 --- a/yardstick/benchmark/scenarios/networking/ping.py +++ b/yardstick/benchmark/scenarios/networking/ping.py @@ -24,6 +24,8 @@ LOG = logging.getLogger(__name__) class Ping(base.Scenario): """Execute ping between two hosts + If ping error, RTT will be set to 999999 + Parameters packetsize - number of data bytes to send type: int @@ -33,6 +35,8 @@ class Ping(base.Scenario): __scenario_type__ = "Ping" + PING_ERROR_RTT = 999999 + TARGET_SCRIPT = 'ping_benchmark.bash' def __init__(self, scenario_cfg, context_cfg): @@ -60,6 +64,7 @@ class Ping(base.Scenario): rtt_result = {} ping_result = {"rtt": rtt_result} + sla_max_rtt = self.scenario_cfg.get("sla", {}).get("max_rtt") for pos, dest in enumerate(dest_list): if 'targets' in self.scenario_cfg: @@ -76,20 +81,34 @@ class Ping(base.Scenario): if exit_status != 0: raise RuntimeError(stderr) + if isinstance(target_vm, dict): + target_vm_name = target_vm.get("name") + else: + target_vm_name = target_vm.split('.')[0] if stdout: - if isinstance(target_vm, dict): - target_vm_name = target_vm.get("name") - else: - target_vm_name = target_vm.split('.')[0] - rtt_result[target_vm_name] = float(stdout) - if "sla" in self.scenario_cfg: - sla_max_rtt = int(self.scenario_cfg["sla"]["max_rtt"]) + rtt_result[target_vm_name] = float(stdout.strip()) + # store result before potential AssertionError + result.update(utils.flatten_dict_key(ping_result)) + if sla_max_rtt is not None: + sla_max_rtt = float(sla_max_rtt) assert rtt_result[target_vm_name] <= sla_max_rtt,\ "rtt %f > sla: max_rtt(%f); " % \ (rtt_result[target_vm_name], sla_max_rtt) else: LOG.error("ping '%s' '%s' timeout", options, target_vm) - result.update(utils.flatten_dict_key(ping_result)) + # we need to specify a result to satisfy influxdb schema + # choose a very large number to inidcate timeout + # in this case choose an order of magnitude greater than the SLA + rtt_result[target_vm_name] = float(self.PING_ERROR_RTT) + # store result before potential AssertionError + result.update(utils.flatten_dict_key(ping_result)) + if sla_max_rtt is not None: + raise AssertionError("packet dropped rtt {:f} > sla: max_rtt({:f})".format( + rtt_result[target_vm_name], sla_max_rtt)) + + else: + raise AssertionError( + "packet dropped rtt {:f}".format(rtt_result[target_vm_name])) def _test(): # pragma: no cover diff --git a/yardstick/benchmark/scenarios/networking/vnf_generic.py b/yardstick/benchmark/scenarios/networking/vnf_generic.py index 0fab45480..b94bfc9ab 100644 --- a/yardstick/benchmark/scenarios/networking/vnf_generic.py +++ b/yardstick/benchmark/scenarios/networking/vnf_generic.py @@ -190,6 +190,12 @@ class NetworkServiceTestCase(base.Scenario): for index, publicip in enumerate(fflow.get("public_ip", [])): flow["public_ip_{}".format(index)] = publicip + for index, src_port in enumerate(fflow.get("src_port", [])): + flow["src_port_{}".format(index)] = src_port + + for index, dst_port in enumerate(fflow.get("dst_port", [])): + flow["dst_port_{}".format(index)] = dst_port + flow["count"] = fflow["count"] except KeyError: flow = {} diff --git a/yardstick/cmd/NSBperf.py b/yardstick/cmd/NSBperf.py index 2dc0f65e7..5d0aa746d 100755 --- a/yardstick/cmd/NSBperf.py +++ b/yardstick/cmd/NSBperf.py @@ -150,8 +150,24 @@ class YardstickNSCli(object): testcases = os.listdir(test_path + vnf) print(("VNF :(%s)" % vnf)) print("================") - for testcase in [tc for tc in testcases if "tc_" in tc]: - print('%s' % testcase) + test_cases = [tc for tc in testcases if "tc_" in tc and "template" not in tc] + + print("\tBareMetal Testcase:") + print("\t===================") + for testcase in [tc for tc in test_cases if "baremetal" in tc]: + print("\t%s" % testcase) + + print(os.linesep) + print("\tStandalone Virtualization Testcase:") + print("\t===================================") + for testcase in [tc for tc in test_cases if "ovs" in tc or "sriov" in tc]: + print("\t%s" % testcase) + + print(os.linesep) + print("\tOpenstack Testcase:") + print("\t===================") + for testcase in [tc for tc in test_cases if "heat" in tc]: + print("\t%s" % testcase) print(os.linesep) raise SystemExit(0) diff --git a/yardstick/dispatcher/influxdb.py b/yardstick/dispatcher/influxdb.py index f157e91f9..632b433b5 100644 --- a/yardstick/dispatcher/influxdb.py +++ b/yardstick/dispatcher/influxdb.py @@ -55,7 +55,9 @@ class InfluxdbDispatcher(DispatchBase): for case, data in testcases.items(): tc_criteria = data['criteria'] for record in data['tc_data']: - self._upload_one_record(record, case, tc_criteria) + # skip results with no data because we influxdb encode empty dicts + if record.get("data"): + self._upload_one_record(record, case, tc_criteria) return 0 diff --git a/yardstick/network_services/collector/subscriber.py b/yardstick/network_services/collector/subscriber.py index d560e1d42..4dc5a796e 100644 --- a/yardstick/network_services/collector/subscriber.py +++ b/yardstick/network_services/collector/subscriber.py @@ -23,18 +23,6 @@ LOG = logging.getLogger(__name__) class Collector(object): """Class that handles dictionary of results in yardstick-plot format.""" - @staticmethod - def make_resource_profile(node, timeout): - # node dict works as mgmt dict - # don't need port names, there is no way we can - # tell what port is used on the compute node - collectd_options = node["collectd"] - plugins = collectd_options.get("plugins", {}) - interval = collectd_options.get("interval") - - # use default cores = None to MatchAllCores - return ResourceProfile(node, plugins=plugins, interval=interval, timeout=timeout) - def __init__(self, vnfs, nodes, traffic_profile, timeout=3600): super(Collector, self).__init__() self.traffic_profile = traffic_profile @@ -42,7 +30,7 @@ class Collector(object): self.nodes = nodes self.timeout = timeout self.bin_path = get_nsb_option('bin_path', '') - self.resource_profiles = {node_name: self.make_resource_profile(node, self.timeout) + self.resource_profiles = {node_name: ResourceProfile.make_from_node(node, self.timeout) for node_name, node in self.nodes.items() if node.get("collectd")} diff --git a/yardstick/network_services/vnf_generic/vnf/iniparser.py b/yardstick/network_services/helpers/iniparser.py index 98256e08a..98256e08a 100644 --- a/yardstick/network_services/vnf_generic/vnf/iniparser.py +++ b/yardstick/network_services/helpers/iniparser.py diff --git a/yardstick/network_services/helpers/samplevnf_helper.py b/yardstick/network_services/helpers/samplevnf_helper.py index 0174d9c0d..4718bbd59 100644 --- a/yardstick/network_services/helpers/samplevnf_helper.py +++ b/yardstick/network_services/helpers/samplevnf_helper.py @@ -55,6 +55,10 @@ SCRIPT_TPL = """ {arp_config6} +{arp_route_tbl} + +{arp_route_tbl6} + {actions} {rules} @@ -345,30 +349,28 @@ class MultiPortConfig(object): "".join(("{},".format(port_list.index(x)) for x in uplink_ports))) def generate_arp_route_tbl(self): - arp_route_tbl_tmpl = "({port0_dst_ip_hex},{port0_netmask_hex},{port_num}," \ - "{next_hop_ip_hex})" + arp_route_tbl_tmpl = "routeadd net {port_num} {port_dst_ip} 0x{port_netmask_hex}" def build_arp_config(port): dpdk_port_num = self.vnfd_helper.port_num(port) interface = self.vnfd_helper.find_interface(name=port)["virtual-interface"] # We must use the dst because we are on the VNF and we need to # reach the TG. - dst_port0_ip = ipaddress.ip_interface(six.text_type( + dst_port_ip = ipaddress.ip_interface(six.text_type( "%s/%s" % (interface["dst_ip"], interface["netmask"]))) arp_vars = { - "port0_dst_ip_hex": ip_to_hex(dst_port0_ip.network.network_address.exploded), - "port0_netmask_hex": ip_to_hex(dst_port0_ip.network.netmask.exploded), + "port_netmask_hex": ip_to_hex(dst_port_ip.network.netmask.exploded), # this is the port num that contains port0 subnet and next_hop_ip_hex # this is LINKID which should be based on DPDK port number "port_num": dpdk_port_num, # next hop is dst in this case # must be within subnet - "next_hop_ip_hex": ip_to_hex(dst_port0_ip.ip.exploded), + "port_dst_ip": str(dst_port_ip.ip), } return arp_route_tbl_tmpl.format(**arp_vars) - return ' '.join(build_arp_config(port) for port in self.all_ports) + return '\n'.join(build_arp_config(port) for port in self.all_ports) def generate_arpicmp_data(self): swq_in_str = self.make_range_str('SWQ{}', self.swq, offset=self.lb_count) @@ -391,11 +393,6 @@ class MultiPortConfig(object): # 'ports_mac_list': ' '.join(mac_iter), 'pktq_in_prv': ' '.join(pktq_in_iter), 'prv_to_pub_map': self.set_priv_to_pub_mapping(), - 'arp_route_tbl': self.generate_arp_route_tbl(), - # nd_route_tbl must be set or we get segault on random OpenStack IPv6 traffic - # 'nd_route_tbl': "(0064:ff9b:0:0:0:0:9810:6414,120,0,0064:ff9b:0:0:0:0:9810:6414)" - # safe default? route discard prefix to localhost - 'nd_route_tbl': "(0100::,64,0,::1)" } self.pktq_out_os = swq_out_str.split(' ') # HWLB is a run to complition. So override the pktq_in/pktq_out @@ -710,6 +707,9 @@ class MultiPortConfig(object): # disable IPv6 for now # 'arp_config6': self.generate_arp_config6(), 'arp_config6': "", + 'arp_config': self.generate_arp_config(), + 'arp_route_tbl': self.generate_arp_route_tbl(), + 'arp_route_tbl6': "", 'actions': '', 'rules': '', } diff --git a/yardstick/network_services/nfvi/resource.py b/yardstick/network_services/nfvi/resource.py index dea754d8b..5b96aaf29 100644 --- a/yardstick/network_services/nfvi/resource.py +++ b/yardstick/network_services/nfvi/resource.py @@ -82,6 +82,18 @@ class ResourceProfile(object): self.mgmt = mgmt self.connection = ssh.AutoConnectSSH.from_node(mgmt) + @classmethod + def make_from_node(cls, node, timeout): + # node dict works as mgmt dict + # don't need port names, there is no way we can + # tell what port is used on the compute node + collectd_options = node["collectd"] + plugins = collectd_options.get("plugins", {}) + interval = collectd_options.get("interval") + + # use default cores = None to MatchAllCores + return cls(node, plugins=plugins, interval=interval, timeout=timeout) + def check_if_sa_running(self, process): """ verify if system agent is running """ try: diff --git a/yardstick/network_services/vnf_generic/vnf/prox_helpers.py b/yardstick/network_services/vnf_generic/vnf/prox_helpers.py index 992b6d06e..ac5abfbcb 100644 --- a/yardstick/network_services/vnf_generic/vnf/prox_helpers.py +++ b/yardstick/network_services/vnf_generic/vnf/prox_helpers.py @@ -14,28 +14,27 @@ from __future__ import absolute_import import array -import operator -import logging import io +import logging +import operator import os import re import select import socket - -from collections import OrderedDict, namedtuple import time +from collections import OrderedDict, namedtuple from contextlib import contextmanager from itertools import repeat, chain from multiprocessing import Queue import six -from six.moves import zip, StringIO from six.moves import cStringIO +from six.moves import zip, StringIO from yardstick.benchmark.scenarios.networking.vnf_generic import find_relative_file from yardstick.common import utils from yardstick.common.utils import SocketTopology, join_non_strings, try_int -from yardstick.network_services.vnf_generic.vnf.iniparser import ConfigParser +from yardstick.network_services.helpers.iniparser import ConfigParser from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper diff --git a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py index 92f78c2bc..06f259685 100644 --- a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py +++ b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py @@ -685,6 +685,7 @@ class SampleVNF(GenericVNF): VNF_PROMPT = "pipeline>" WAIT_TIME = 1 + WAIT_TIME_FOR_SCRIPT = 10 APP_NAME = "SampleVNF" # we run the VNF interactively, so the ssh command will timeout after this long @@ -811,7 +812,7 @@ class SampleVNF(GenericVNF): self.APP_NAME) LOG.info("Waiting for %s VNF to start.. ", self.APP_NAME) - time.sleep(1) + time.sleep(self.WAIT_TIME_FOR_SCRIPT) # Send ENTER to display a new prompt in case the prompt text was corrupted # by other VNF output self.q_in.put('\r\n') |