diff options
32 files changed, 1194 insertions, 116 deletions
diff --git a/ansible/roles/download_pmu_tools/tasks/main.yml b/ansible/roles/download_pmu_tools/tasks/main.yml index 3ef412217..59a63aa85 100644 --- a/ansible/roles/download_pmu_tools/tasks/main.yml +++ b/ansible/roles/download_pmu_tools/tasks/main.yml @@ -31,6 +31,8 @@ - name: Create perfmon local mirror command: "wget -mkEpnp {{ perfmon_url }} -P {{ INSTALL_BIN_PATH }}/pmu_local_mirror" ignore_errors: yes + failed_when: false #some of the links while creating mirror are not found, results in failure + no_log: True - name: Copy local event download file copy: diff --git a/ansible/roles/install_image_dependencies/defaults/main.yml b/ansible/roles/install_image_dependencies/defaults/main.yml index 1540806cc..362fa351b 100644 --- a/ansible/roles/install_image_dependencies/defaults/main.yml +++ b/ansible/roles/install_image_dependencies/defaults/main.yml @@ -22,6 +22,9 @@ install_dependencies: - unzip # for Trex - libpython2.7-dev + # for IxLoad + - libxft-dev + - libxss-dev RedHat: - bc - fio diff --git a/ansible/scale_out_test_templates.yml b/ansible/scale_out_test_templates.yml index 4213816fa..487319f2a 100644 --- a/ansible/scale_out_test_templates.yml +++ b/ansible/scale_out_test_templates.yml @@ -40,6 +40,10 @@ dest: ../samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_{{ num_vnfs }}.yaml - template: + src: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-scale-out.yaml + dest: ../samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-{{ num_vnfs }}.yaml + +- template: src: ../samples/vnf_samples/nsut/cgnapt/tc_heat_rfc2544_ipv4_1flow_64B_trex_correlated_scale_out.yaml dest: ../samples/vnf_samples/nsut/cgnapt/tc_heat_rfc2544_ipv4_1flow_64B_trex_correlated_scale_{{ num_vnfs }}.yaml diff --git a/docs/testing/developer/devguide/index.rst b/docs/testing/developer/devguide/index.rst index fc3ca155d..92a18f6ee 100644 --- a/docs/testing/developer/devguide/index.rst +++ b/docs/testing/developer/devguide/index.rst @@ -5,9 +5,9 @@ .. http://creativecommons.org/licenses/by/4.0 .. (c) OPNFV, Ericsson AB and others. -********************************* -OPNFV Yardstick developer guide -********************************* +************************* +Yardstick Developer Guide +************************* .. toctree:: :maxdepth: 4 diff --git a/docs/testing/user/userguide/15-list-of-tcs.rst b/docs/testing/user/userguide/15-list-of-tcs.rst index 1b5806cd9..b62bf6390 100644 --- a/docs/testing/user/userguide/15-list-of-tcs.rst +++ b/docs/testing/user/userguide/15-list-of-tcs.rst @@ -50,8 +50,14 @@ Generic NFVI Test Case Descriptions opnfv_yardstick_tc071.rst opnfv_yardstick_tc072.rst opnfv_yardstick_tc073.rst + opnfv_yardstick_tc074.rst opnfv_yardstick_tc075.rst opnfv_yardstick_tc076.rst + opnfv_yardstick_tc078.rst + opnfv_yardstick_tc079.rst + opnfv_yardstick_tc080.rst + opnfv_yardstick_tc081.rst + opnfv_yardstick_tc083.rst OPNFV Feature Test Cases ======================== diff --git a/docs/testing/user/userguide/index.rst b/docs/testing/user/userguide/index.rst index 3b55b7f9b..707e12b56 100644 --- a/docs/testing/user/userguide/index.rst +++ b/docs/testing/user/userguide/index.rst @@ -5,9 +5,9 @@ .. http://creativecommons.org/licenses/by/4.0 .. (c) OPNFV, Ericsson AB and others. -=========================================== -Performance Testing User Guide (Yardstick) -=========================================== +******************** +Yardstick User Guide +******************** .. toctree:: :maxdepth: 4 diff --git a/docs/testing/user/userguide/opnfv_yardstick_tc002.rst b/docs/testing/user/userguide/opnfv_yardstick_tc002.rst index c98780fd5..bf2466fb2 100644 --- a/docs/testing/user/userguide/opnfv_yardstick_tc002.rst +++ b/docs/testing/user/userguide/opnfv_yardstick_tc002.rst @@ -106,8 +106,8 @@ Yardstick Test Case Description TC002 | | | +--------------+--------------------------------------------------------------+ |step 2 | Yardstick is connected with the server VM by using ssh. | -| | 'ping_benchmark' bash script is copyied from Jump Host to | -| | the server VM via the ssh tunnel. | +| | 'ping_benchmark' bash script is copied from Jump Host to the | +| | server VM via the ssh tunnel. | | | | +--------------+--------------------------------------------------------------+ |step 3 | Ping is invoked. Ping packets are sent from server VM to | diff --git a/docs/testing/user/userguide/opnfv_yardstick_tc078.rst b/docs/testing/user/userguide/opnfv_yardstick_tc078.rst index 560d55e07..b5a6545ba 100644 --- a/docs/testing/user/userguide/opnfv_yardstick_tc078.rst +++ b/docs/testing/user/userguide/opnfv_yardstick_tc078.rst @@ -114,7 +114,8 @@ Yardstick Test Case Description TC078 |step 3 | Yardstick is connected with the target server by using ssh. | | | If custom runspec config file is used, this file is copyied | | | from yardstick to the target server via the ssh tunnel. | ---------------+---------------------------------------------------------------+ +| | | ++--------------+--------------------------------------------------------------+ |step 4 | SPEC CPU2006 benchmark is invoked and SPEC CPU 2006 metrics | | | are generated. | | | | diff --git a/docs/testing/user/userguide/opnfv_yardstick_tc080.rst b/docs/testing/user/userguide/opnfv_yardstick_tc080.rst new file mode 100644 index 000000000..05eca502e --- /dev/null +++ b/docs/testing/user/userguide/opnfv_yardstick_tc080.rst @@ -0,0 +1,117 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International +.. License. +.. http://creativecommons.org/licenses/by/4.0 +.. (c) OPNFV, Huawei Technologies Co.,Ltd and others. + +************************************* +Yardstick Test Case Description TC080 +************************************* + +.. _Ping: https://linux.die.net/man/8/ping + ++-----------------------------------------------------------------------------+ +|Network Latency | +| | ++--------------+--------------------------------------------------------------+ +|test case id | OPNFV_YARDSTICK_TC080_NETWORK_LATENCY_BETWEEN_CONTAINER | +| | | ++--------------+--------------------------------------------------------------+ +|metric | RTT (Round Trip Time) | +| | | ++--------------+--------------------------------------------------------------+ +|test purpose | The purpose of TC080 is to do a basic verification that | +| | network latency is within acceptable boundaries when packets | +| | travel between containers located in two different | +| | Kubernetes pods. | +| | | +| | The purpose is also to be able to spot the trends. | +| | Test results, graphs and similar shall be stored for | +| | comparison reasons and product evolution understanding | +| | between different OPNFV versions and/or configurations. | +| | | ++--------------+--------------------------------------------------------------+ +|test tool | ping | +| | | +| | Ping is a computer network administration software utility | +| | used to test the reachability of a host on an Internet | +| | Protocol (IP) network. It measures the round-trip time for | +| | packet sent from the originating host to a destination | +| | computer that are echoed back to the source. | +| | | +| | Ping is normally part of any Linux distribution, hence it | +| | doesn't need to be installed. It is also part of the | +| | Yardstick Docker image. | +| | | ++--------------+--------------------------------------------------------------+ +|test topology | Ping packets (ICMP protocol's mandatory ECHO_REQUEST | +| | datagram) are sent from host container to target container | +| | to elicit ICMP ECHO_RESPONSE. | +| | | ++--------------+--------------------------------------------------------------+ +|configuration | file: opnfv_yardstick_tc080.yaml | +| | | +| | Packet size 200 bytes. Test duration 60 seconds. | +| | SLA RTT is set to maximum 10 ms. | +| | | ++--------------+--------------------------------------------------------------+ +|applicability | This test case can be configured with different: | +| | | +| | * packet sizes; | +| | * burst sizes; | +| | * ping intervals; | +| | * test durations; | +| | * test iterations. | +| | | +| | Default values exist. | +| | | +| | SLA is optional. The SLA in this test case serves as an | +| | example. Considerably lower RTT is expected, and also normal | +| | to achieve in balanced L2 environments. However, to cover | +| | most configurations, both bare metal and fully virtualized | +| | ones, this value should be possible to achieve and | +| | acceptable for black box testing. Many real time | +| | applications start to suffer badly if the RTT time is higher | +| | than this. Some may suffer bad also close to this RTT, while | +| | others may not suffer at all. It is a compromise that may | +| | have to be tuned for different configuration purposes. | +| | | ++--------------+--------------------------------------------------------------+ +|usability | This test case should be run in Kunernetes environment. | +| | | ++--------------+--------------------------------------------------------------+ +|references | Ping_ | +| | | +| | ETSI-NFV-TST001 | +| | | ++--------------+--------------------------------------------------------------+ +|pre-test | The test case Docker image (openretriever/yardstick) needs | +|conditions | to be pulled into Kubernetes environment. | +| | | +| | No further requirements have been identified. | +| | | ++--------------+--------------------------------------------------------------+ +|test sequence | description and expected result | +| | | ++--------------+--------------------------------------------------------------+ +|step 1 | Two containers are booted, as server and client. | +| | | ++--------------+--------------------------------------------------------------+ +|step 2 | Yardstick is connected with the server container by using | +| | ssh. 'ping_benchmark' bash script is copied from Jump Host | +| | to the server container via the ssh tunnel. | +| | | ++--------------+--------------------------------------------------------------+ +|step 3 | Ping is invoked. Ping packets are sent from server container | +| | to client container. RTT results are calculated and checked | +| | against the SLA. Logs are produced and stored. | +| | | +| | Result: Logs are stored. | +| | | ++--------------+--------------------------------------------------------------+ +|step 4 | Two containers are deleted. | +| | | ++--------------+--------------------------------------------------------------+ +|test verdict | Test should not PASS if any RTT is above the optional SLA | +| | value, or if there is a test case execution problem. | +| | | ++--------------+--------------------------------------------------------------+ diff --git a/docs/testing/user/userguide/opnfv_yardstick_tc081.rst b/docs/testing/user/userguide/opnfv_yardstick_tc081.rst new file mode 100644 index 000000000..90af8a382 --- /dev/null +++ b/docs/testing/user/userguide/opnfv_yardstick_tc081.rst @@ -0,0 +1,122 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International +.. License. +.. http://creativecommons.org/licenses/by/4.0 +.. (c) OPNFV, Huawei Technologies Co.,Ltd and others. + +************************************* +Yardstick Test Case Description TC080 +************************************* + +.. _cirros-image: https://download.cirros-cloud.net +.. _Ping: https://linux.die.net/man/8/ping + ++-----------------------------------------------------------------------------+ +|Network Latency | +| | ++--------------+--------------------------------------------------------------+ +|test case id | OPNFV_YARDSTICK_TC081_NETWORK_LATENCY_BETWEEN_CONTAINER_AND_ | +| | VM | +| | | ++--------------+--------------------------------------------------------------+ +|metric | RTT (Round Trip Time) | +| | | ++--------------+--------------------------------------------------------------+ +|test purpose | The purpose of TC080 is to do a basic verification that | +| | network latency is within acceptable boundaries when packets | +| | travel between a containers and a VM. | +| | | +| | The purpose is also to be able to spot the trends. | +| | Test results, graphs and similar shall be stored for | +| | comparison reasons and product evolution understanding | +| | between different OPNFV versions and/or configurations. | +| | | ++--------------+--------------------------------------------------------------+ +|test tool | ping | +| | | +| | Ping is a computer network administration software utility | +| | used to test the reachability of a host on an Internet | +| | Protocol (IP) network. It measures the round-trip time for | +| | packet sent from the originating host to a destination | +| | computer that are echoed back to the source. | +| | | +| | Ping is normally part of any Linux distribution, hence it | +| | doesn't need to be installed. It is also part of the | +| | Yardstick Docker image. (For example also a Cirros image can | +| | be downloaded from cirros-image_, it includes ping) | +| | | ++--------------+--------------------------------------------------------------+ +|test topology | Ping packets (ICMP protocol's mandatory ECHO_REQUEST | +| | datagram) are sent from host container to target vm to | +| | elicit ICMP ECHO_RESPONSE. | +| | | ++--------------+--------------------------------------------------------------+ +|configuration | file: opnfv_yardstick_tc081.yaml | +| | | +| | Packet size 200 bytes. Test duration 60 seconds. | +| | SLA RTT is set to maximum 10 ms. | +| | | ++--------------+--------------------------------------------------------------+ +|applicability | This test case can be configured with different: | +| | | +| | * packet sizes; | +| | * burst sizes; | +| | * ping intervals; | +| | * test durations; | +| | * test iterations. | +| | | +| | Default values exist. | +| | | +| | SLA is optional. The SLA in this test case serves as an | +| | example. Considerably lower RTT is expected, and also normal | +| | to achieve in balanced L2 environments. However, to cover | +| | most configurations, both bare metal and fully virtualized | +| | ones, this value should be possible to achieve and | +| | acceptable for black box testing. Many real time | +| | applications start to suffer badly if the RTT time is higher | +| | than this. Some may suffer bad also close to this RTT, while | +| | others may not suffer at all. It is a compromise that may | +| | have to be tuned for different configuration purposes. | +| | | ++--------------+--------------------------------------------------------------+ +|usability | This test case should be run in Kunernetes environment. | +| | | ++--------------+--------------------------------------------------------------+ +|references | Ping_ | +| | | +| | ETSI-NFV-TST001 | +| | | ++--------------+--------------------------------------------------------------+ +|pre-test | The test case Docker image (openretriever/yardstick) needs | +|conditions | to be pulled into Kubernetes environment. | +| | The VM image (cirros-image) needs to be installed into | +| | Glance with ping included in it. | +| | | +| | No further requirements have been identified. | +| | | ++--------------+--------------------------------------------------------------+ +|test sequence | description and expected result | +| | | ++--------------+--------------------------------------------------------------+ +|step 1 | A containers is booted, as server and a VM is booted as | +| | client. | +| | | ++--------------+--------------------------------------------------------------+ +|step 2 | Yardstick is connected with the server container by using | +| | ssh. 'ping_benchmark' bash script is copied from Jump Host | +| | to the server container via the ssh tunnel. | +| | | ++--------------+--------------------------------------------------------------+ +|step 3 | Ping is invoked. Ping packets are sent from server container | +| | to client VM. RTT results are calculated and checked against | +| | the SLA. Logs are produced and stored. | +| | | +| | Result: Logs are stored. | +| | | ++--------------+--------------------------------------------------------------+ +|step 4 | The container and VM are deleted. | +| | | ++--------------+--------------------------------------------------------------+ +|test verdict | Test should not PASS if any RTT is above the optional SLA | +| | value, or if there is a test case execution problem. | +| | | ++--------------+--------------------------------------------------------------+ diff --git a/install.sh b/install.sh index 49a8bd085..dfad3a51a 100755 --- a/install.sh +++ b/install.sh @@ -79,7 +79,9 @@ apt-get update && apt-get install -y \ uwsgi-plugin-python \ supervisor \ python-pip \ - vim + vim \ + libxft-dev \ + libxss-dev if [[ "${DOCKER_ARCH}" != "aarch64" ]]; then apt-get install -y libc6:arm64 diff --git a/nsb_setup.sh b/nsb_setup.sh index 1c27af7db..28d31967f 100755 --- a/nsb_setup.sh +++ b/nsb_setup.sh @@ -25,8 +25,8 @@ done pip install ansible==2.3.2 shade==1.17.0 docker-py==1.10.6 if [ $# -eq 1 ]; then - extra_args="-e openrc_file=$1" - OPENRC=$1 + OPENRC=$(readlink -f -- "$1") + extra_args="-e openrc_file=${OPENRC}" source "${OPENRC}" CONTROLLER_IP=$(echo ${OS_AUTH_URL} | sed -ne "s/http:\/\/\(.*\):.*/\1/p") export no_proxy="localhost,127.0.0.1,${CONTROLLER_IP},$no_proxy" diff --git a/samples/check_connectivity.yaml b/samples/check_connectivity.yaml new file mode 100644 index 000000000..47f7d2c81 --- /dev/null +++ b/samples/check_connectivity.yaml @@ -0,0 +1,31 @@ +############################################################################## +# 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 +############################################################################## +--- +schema: "yardstick:task:0.1" + +scenarios: +- + type: CheckConnectivity + options: + src_ip_addr: '192.168.23.2' + dest_ip_addr: '192.168.23.10' + ssh_user: 'root' + ssh_passwd: 'root' + # ssh_key: + ssh_port: 22 + ssh_timeout: 600 + ping_parameter: "-s 2048" + + runner: + type: Iteration + iterations: 1 + + sla: + status: True + action: assert diff --git a/samples/vnf_samples/nsut/acl/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_scale_up.yaml b/samples/vnf_samples/nsut/acl/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_scale_up.yaml new file mode 100644 index 000000000..2d84802f8 --- /dev/null +++ b/samples/vnf_samples/nsut/acl/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_scale_up.yaml @@ -0,0 +1,98 @@ +# 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. + +--- + +{% set mem = mem or 20480 %} +{% set vcpus = vcpus or 10 %} + +schema: yardstick:task:0.1 +scenarios: +- type: NSPerf + traffic_profile: ../../traffic_profiles/ipv4_throughput.yaml + topology: acl-tg-topology.yaml + nodes: + tg__0: tg_0.yardstick + vnf__0: vnf_0.yardstick + options: + framesize: + uplink: {64B: 100} + downlink: {64B: 100} + flow: + src_ip: [{'tg__0': 'xe0'}] + dst_ip: [{'tg__0': 'xe1'}] + count: 1 + traffic_type: 4 + rfc2544: + allowed_drop_rate: 0.0001 - 0.0001 + vnf__0: + rules: acl_1rule.yaml + # with 1 worker_thread we need 5 or so extra cores + vnf_config: {lb_config: 'HW', lb_count: 1, worker_config: '1C/1T', worker_threads: {{ vcpus - 5 if vcpus - 5 > 1 else 1 }}} + nfvi_enable: True + runner: + type: Iteration + iterations: 10 + interval: 35 +context: + name: yardstick + image: yardstick-samplevnfs + flavor: + vcpus: {{ vcpus }} + ram: {{ mem }} + disk: 6 + extra_specs: + hw:cpu_sockets: 1 + hw:cpu_cores: {{ vcpus }} + hw:cpu_threads: 1 + user: ubuntu + placement_groups: + pgrp1: + policy: "availability" + servers: + vnf_0: + floating_ip: true + placement: "pgrp1" + network_ports: + mgmt: + - mgmt + uplink_0: + - xe0 + downlink_0: + - xe1 + tg_0: + floating_ip: true + placement: "pgrp1" + network_ports: + mgmt: + - mgmt + uplink_0: + - xe0 + downlink_0: + - xe1 + networks: + mgmt: + cidr: '10.0.1.0/24' + uplink_0: + cidr: '10.1.0.0/24' + gateway_ip: 'null' + port_security_enabled: False + enable_dhcp: 'false' + downlink_0: + cidr: '10.1.1.0/24' + gateway_ip: 'null' + port_security_enabled: False + enable_dhcp: 'false' + + diff --git a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_10.yaml b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_10.yaml index cf60ba1f9..1d9c4e1c6 100644 --- a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_10.yaml +++ b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_10.yaml @@ -15,22 +15,22 @@ --- schema: yardstick:task:0.1 scenarios: -- type: NSPerf - traffic_profile: ../../traffic_profiles/ipv4_throughput-10.yaml - topology: vfw-tg-topology-3node-10.yaml - nodes: - tg__0: tg_0.yardstick - tg__1: tg_1.yardstick - vnf__0: vnf_0.yardstick - vnf__1: vnf_1.yardstick - vnf__2: vnf_2.yardstick - vnf__3: vnf_3.yardstick - vnf__4: vnf_4.yardstick - vnf__5: vnf_5.yardstick - vnf__6: vnf_6.yardstick - vnf__7: vnf_7.yardstick - vnf__8: vnf_8.yardstick - vnf__9: vnf_9.yardstick + - type: NSPerf + traffic_profile: ../../traffic_profiles/ipv4_throughput-10.yaml + topology: vfw-tg-topology-3node-10.yaml + nodes: + tg__0: tg_0.yardstick + tg__1: tg_1.yardstick + vnf__0: vnf_0.yardstick + vnf__1: vnf_1.yardstick + vnf__2: vnf_2.yardstick + vnf__3: vnf_3.yardstick + vnf__4: vnf_4.yardstick + vnf__5: vnf_5.yardstick + vnf__6: vnf_6.yardstick + vnf__7: vnf_7.yardstick + vnf__8: vnf_8.yardstick + vnf__9: vnf_9.yardstick options: framesize: uplink: {64B: 100} diff --git a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_2.yaml b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_2.yaml index b12a62a1b..bfda0bb7f 100644 --- a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_2.yaml +++ b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_2.yaml @@ -15,14 +15,14 @@ --- schema: yardstick:task:0.1 scenarios: -- type: NSPerf - traffic_profile: ../../traffic_profiles/ipv4_throughput-2.yaml - topology: vfw-tg-topology-3node-2.yaml - nodes: - tg__0: tg_0.yardstick - tg__1: tg_1.yardstick - vnf__0: vnf_0.yardstick - vnf__1: vnf_1.yardstick + - type: NSPerf + traffic_profile: ../../traffic_profiles/ipv4_throughput-2.yaml + topology: vfw-tg-topology-3node-2.yaml + nodes: + tg__0: tg_0.yardstick + tg__1: tg_1.yardstick + vnf__0: vnf_0.yardstick + vnf__1: vnf_1.yardstick options: framesize: uplink: {64B: 100} diff --git a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_4.yaml b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_4.yaml index 64633eb77..bd29ab76c 100644 --- a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_4.yaml +++ b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_4.yaml @@ -15,16 +15,16 @@ --- schema: yardstick:task:0.1 scenarios: -- type: NSPerf - traffic_profile: ../../traffic_profiles/ipv4_throughput-4.yaml - topology: vfw-tg-topology-3node-4.yaml - nodes: - tg__0: tg_0.yardstick - tg__1: tg_1.yardstick - vnf__0: vnf_0.yardstick - vnf__1: vnf_1.yardstick - vnf__2: vnf_2.yardstick - vnf__3: vnf_3.yardstick + - type: NSPerf + traffic_profile: ../../traffic_profiles/ipv4_throughput-4.yaml + topology: vfw-tg-topology-3node-4.yaml + nodes: + tg__0: tg_0.yardstick + tg__1: tg_1.yardstick + vnf__0: vnf_0.yardstick + vnf__1: vnf_1.yardstick + vnf__2: vnf_2.yardstick + vnf__3: vnf_3.yardstick options: framesize: uplink: {64B: 100} diff --git a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_out.yaml b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_out.yaml index 767ecbc1c..be15e4550 100644 --- a/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_out.yaml +++ b/samples/vnf_samples/nsut/vfw/tc_heat_rfc2544_ipv4_1rule_1flow_64B_trex_correlated_scale_out.yaml @@ -15,14 +15,14 @@ --- schema: yardstick:task:0.1 scenarios: -- type: NSPerf - traffic_profile: ../../traffic_profiles/ipv4_throughput-{{ num_vnfs }}.yaml - topology: vfw-tg-topology-3node-{{ num_vnfs }}.yaml - nodes: - tg__0: tg_0.yardstick - tg__1: tg_1.yardstick + - type: NSPerf + traffic_profile: ../../traffic_profiles/ipv4_throughput-{{ num_vnfs }}.yaml + topology: vfw-tg-topology-3node-{{ num_vnfs }}.yaml + nodes: + tg__0: tg_0.yardstick + tg__1: tg_1.yardstick {% for vnf_num in range(num_vnfs|int) %} - vnf__{{ vnf_num }}: vnf_{{ vnf_num }}.yardstick + vnf__{{ vnf_num }}: vnf_{{ vnf_num }}.yardstick {% endfor %} options: framesize: diff --git a/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-10.yaml b/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-10.yaml new file mode 100644 index 000000000..99ac9e8c9 --- /dev/null +++ b/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-10.yaml @@ -0,0 +1,260 @@ +# Copyright (c) 2016 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: 10-vnf-correlated + name: 10-vnf-correlated + short-name: 10-vnf-correlated + description: 10-vnf-correlated + constituent-vnfd: + - member-vnf-index: '0' + vnfd-id-ref: tg__0 + VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #VNF type + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/udp_replay_vnf.yaml #VNF type + - member-vnf-index: '2' + vnfd-id-ref: vnf__0 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '3' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '4' + vnfd-id-ref: vnf__2 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '5' + vnfd-id-ref: vnf__3 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '6' + vnfd-id-ref: vnf__4 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '7' + vnfd-id-ref: vnf__5 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '8' + vnfd-id-ref: vnf__6 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '9' + vnfd-id-ref: vnf__7 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '10' + vnfd-id-ref: vnf__8 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '11' + vnfd-id-ref: vnf__9 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + + vld: + - id: uplink_0 + name: "tg__0 to vnf__0 link 0" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__0 + - id: downlink_0 + name: "vnf__0 to tg__1 link 0" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__0 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__1 + - id: uplink_1 + name: "tg__0 to vnf__1 link 1" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '3' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__1 + - id: downlink_1 + name: "vnf__1 to tg__1 link 1" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '3' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__1 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__1 + - id: uplink_2 + name: "tg__0 to vnf__2 link 2" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe2 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '4' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__2 + - id: downlink_2 + name: "vnf__2 to tg__1 link 2" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '4' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__2 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe2 + vnfd-id-ref: tg__1 + - id: uplink_3 + name: "tg__0 to vnf__3 link 3" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe3 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '5' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__3 + - id: downlink_3 + name: "vnf__3 to tg__1 link 3" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '5' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__3 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe3 + vnfd-id-ref: tg__1 + - id: uplink_4 + name: "tg__0 to vnf__4 link 4" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe4 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '6' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__4 + - id: downlink_4 + name: "vnf__4 to tg__1 link 4" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '6' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__4 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe4 + vnfd-id-ref: tg__1 + - id: uplink_5 + name: "tg__0 to vnf__5 link 5" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe5 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '7' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__5 + - id: downlink_5 + name: "vnf__5 to tg__1 link 5" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '7' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__5 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe5 + vnfd-id-ref: tg__1 + - id: uplink_6 + name: "tg__0 to vnf__6 link 6" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe6 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '8' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__6 + - id: downlink_6 + name: "vnf__6 to tg__1 link 6" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '8' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__6 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe6 + vnfd-id-ref: tg__1 + - id: uplink_7 + name: "tg__0 to vnf__7 link 7" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe7 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '9' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__7 + - id: downlink_7 + name: "vnf__7 to tg__1 link 7" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '9' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__7 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe7 + vnfd-id-ref: tg__1 + - id: uplink_8 + name: "tg__0 to vnf__8 link 8" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe8 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '10' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__8 + - id: downlink_8 + name: "vnf__8 to tg__1 link 8" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '10' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__8 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe8 + vnfd-id-ref: tg__1 + - id: uplink_9 + name: "tg__0 to vnf__9 link 9" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe9 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '11' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__9 + - id: downlink_9 + name: "vnf__9 to tg__1 link 9" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '11' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__9 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe9 + vnfd-id-ref: tg__1 + diff --git a/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-2.yaml b/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-2.yaml new file mode 100644 index 000000000..a1043c280 --- /dev/null +++ b/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-2.yaml @@ -0,0 +1,76 @@ +# Copyright (c) 2016 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: 2-vnf-correlated + name: 2-vnf-correlated + short-name: 2-vnf-correlated + description: 2-vnf-correlated + constituent-vnfd: + - member-vnf-index: '0' + vnfd-id-ref: tg__0 + VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #VNF type + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/udp_replay_vnf.yaml #VNF type + - member-vnf-index: '2' + vnfd-id-ref: vnf__0 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '3' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + + vld: + - id: uplink_0 + name: "tg__0 to vnf__0 link 0" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__0 + - id: downlink_0 + name: "vnf__0 to tg__1 link 0" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__0 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__1 + - id: uplink_1 + name: "tg__0 to vnf__1 link 1" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '3' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__1 + - id: downlink_1 + name: "vnf__1 to tg__1 link 1" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '3' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__1 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__1 + diff --git a/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-4.yaml b/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-4.yaml new file mode 100644 index 000000000..22e172d58 --- /dev/null +++ b/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-4.yaml @@ -0,0 +1,122 @@ +# Copyright (c) 2016 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: 4-vnf-correlated + name: 4-vnf-correlated + short-name: 4-vnf-correlated + description: 4-vnf-correlated + constituent-vnfd: + - member-vnf-index: '0' + vnfd-id-ref: tg__0 + VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #VNF type + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/udp_replay_vnf.yaml #VNF type + - member-vnf-index: '2' + vnfd-id-ref: vnf__0 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '3' + vnfd-id-ref: vnf__1 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '4' + vnfd-id-ref: vnf__2 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + - member-vnf-index: '5' + vnfd-id-ref: vnf__3 + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type + + vld: + - id: uplink_0 + name: "tg__0 to vnf__0 link 0" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__0 + - id: downlink_0 + name: "vnf__0 to tg__1 link 0" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '2' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__0 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: tg__1 + - id: uplink_1 + name: "tg__0 to vnf__1 link 1" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '3' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__1 + - id: downlink_1 + name: "vnf__1 to tg__1 link 1" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '3' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__1 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: tg__1 + - id: uplink_2 + name: "tg__0 to vnf__2 link 2" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe2 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '4' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__2 + - id: downlink_2 + name: "vnf__2 to tg__1 link 2" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '4' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__2 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe2 + vnfd-id-ref: tg__1 + - id: uplink_3 + name: "tg__0 to vnf__3 link 3" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe3 + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '5' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__3 + - id: downlink_3 + name: "vnf__3 to tg__1 link 3" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '5' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__3 + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe3 + vnfd-id-ref: tg__1 + diff --git a/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-scale-out.yaml b/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-scale-out.yaml new file mode 100644 index 000000000..0052c4139 --- /dev/null +++ b/samples/vnf_samples/nsut/vfw/vfw-tg-topology-3node-scale-out.yaml @@ -0,0 +1,57 @@ +# Copyright (c) 2016 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: {{ num_vnfs }}-vnf-correlated + name: {{ num_vnfs }}-vnf-correlated + short-name: {{ num_vnfs }}-vnf-correlated + description: {{ num_vnfs }}-vnf-correlated + constituent-vnfd: + - member-vnf-index: '0' + vnfd-id-ref: tg__0 + VNF model: ../../vnf_descriptors/tg_rfc2544_tpl.yaml #VNF type + - member-vnf-index: '1' + vnfd-id-ref: tg__1 + VNF model: ../../vnf_descriptors/udp_replay_vnf.yaml #VNF type +{% for vnf_num in range(num_vnfs|int) %} + - member-vnf-index: '{{ vnf_num + 2 }}' + vnfd-id-ref: vnf__{{ vnf_num }} + VNF model: ../../vnf_descriptors/vfw_vnf.yaml #VNF type +{% endfor %} + + vld: +{% for vnf_num in range(num_vnfs|int) %} + - id: uplink_{{ vnf_num }} + name: "tg__0 to vnf__{{ vnf_num }} link {{ vnf_num }}" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '0' + vnfd-connection-point-ref: xe{{ vnf_num }} + vnfd-id-ref: tg__0 + - member-vnf-index-ref: '{{ vnf_num + 2 }}' + vnfd-connection-point-ref: xe0 + vnfd-id-ref: vnf__{{ vnf_num }} + - id: downlink_{{ vnf_num }} + name: "vnf__{{ vnf_num }} to tg__1 link {{ vnf_num }}" + type: ELAN + vnfd-connection-point-ref: + - member-vnf-index-ref: '{{ vnf_num + 2}}' + vnfd-connection-point-ref: xe1 + vnfd-id-ref: vnf__{{ vnf_num }} + - member-vnf-index-ref: '1' + vnfd-connection-point-ref: xe{{ vnf_num }} + vnfd-id-ref: tg__1 +{% endfor %} + diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc006.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc006.yaml index 81b42dc4d..fe244e81c 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc006.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc006.yaml @@ -13,7 +13,8 @@ description: > Yardstick TC006 config file; Measure volume storage IOPS, throughput and latency using fio with job file. -{% set directory = directory or "/FIO_Test" %} +{% set job_file_config = job_file_config or '["[random-writers]", ioengine=libaio, rw=randwrite, size=128m, bs=32k, direct=0, size=64m, numjobs=4]' %} +{% set directory = directory or '/FIO_Test' %} {% set volume_size = volume_size or 200 %} {% set provider = provider or none %} {% set physical_network = physical_network or 'physnet1' %} @@ -25,7 +26,10 @@ scenarios: - type: Fio options: - job_file: "job_file.ini" + # input the content of a fio job file directly + job_file_config: {{ job_file_config }} + # or input the job file name + #job_file: "job_file.ini" directory: {{ directory }} host: fio.yardstick-TC006 diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc080.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc080.yaml index 503fe6a45..0da296297 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc080.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc080.yaml @@ -8,10 +8,11 @@ ############################################################################## --- -# Sample benchmark task config file -# measure network latency using ping in container schema: "yardstick:task:0.1" +description: > + Yardstick TC080 config file; + measure network latency between containers in k8s using ping; scenarios: - diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc081.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc081.yaml index d99757e47..0d79a41ed 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc081.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc081.yaml @@ -8,10 +8,12 @@ ############################################################################## --- -# Sample benchmark task config file -# measure network latency using ping betwwen container and VM schema: "yardstick:task:0.1" +description: > + Yardstick TC081 config file; + measure network latency between container and VM using ping; + scenarios: - diff --git a/tests/unit/benchmark/contexts/standalone/test_model.py b/tests/unit/benchmark/contexts/standalone/test_model.py index ddbc1a4bb..6899a0af6 100644 --- a/tests/unit/benchmark/contexts/standalone/test_model.py +++ b/tests/unit/benchmark/contexts/standalone/test_model.py @@ -91,10 +91,12 @@ class ModelLibvirtTestCase(unittest.TestCase): image = Libvirt.create_snapshot_qemu(ssh_mock, "0", "ubuntu.img") self.assertEqual(image, result) + @mock.patch("yardstick.benchmark.contexts.standalone.model.Libvirt.pin_vcpu_for_perf") @mock.patch("yardstick.benchmark.contexts.standalone.model.Libvirt.create_snapshot_qemu") @mock.patch('yardstick.benchmark.contexts.standalone.model.open') @mock.patch('yardstick.benchmark.contexts.standalone.model.write_file') - def test_build_vm_xml(self, mock_open, mock_write_file, mock_create_snapshot_qemu): + def test_build_vm_xml(self, mock_open, mock_write_file, mock_create_snapshot_qemu, + mock_pin_vcpu_for_perf): result = [4] with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) @@ -102,17 +104,10 @@ class ModelLibvirtTestCase(unittest.TestCase): mock.Mock(return_value=(0, "a", "")) ssh.return_value = ssh_mock mock_create_snapshot_qemu.return_value = "0.img" + status = Libvirt.build_vm_xml(ssh_mock, {}, "test", "vm_0", 0) self.assertEqual(status[0], result[0]) - def test_split_cpu_list(self): - result = Libvirt.split_cpu_list("1,2,3") - self.assertEqual(result, [1, 2, 3]) - - def test_get_numa_nodes(self): - result = Libvirt.get_numa_nodes() - self.assertIsNotNone(result) - def test_update_interrupts_hugepages_perf(self): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) @@ -122,17 +117,16 @@ class ModelLibvirtTestCase(unittest.TestCase): status = Libvirt.update_interrupts_hugepages_perf(ssh_mock) self.assertIsNone(status) - @mock.patch("yardstick.benchmark.contexts.standalone.model.Libvirt.get_numa_nodes") + @mock.patch("yardstick.benchmark.contexts.standalone.model.CpuSysCores") @mock.patch("yardstick.benchmark.contexts.standalone.model.Libvirt.update_interrupts_hugepages_perf") - def test_pin_vcpu_for_perf(self, mock_update_interrupts_hugepages_perf, mock_get_numa_nodes): + def test_pin_vcpu_for_perf(self, mock_update_interrupts_hugepages_perf, mock_CpuSysCores): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ mock.Mock(return_value=(0, "a", "")) ssh.return_value = ssh_mock - mock_get_numa_nodes.return_value = {'1': [18, 19, 20, 21], '0': [0, 1, 2, 3]} status = Libvirt.pin_vcpu_for_perf(ssh_mock, "vm_0", 4) - self.assertIsNone(status) + self.assertIsNotNone(status) class StandaloneContextHelperTestCase(unittest.TestCase): diff --git a/tests/unit/benchmark/scenarios/lib/test_check_connectivity.py b/tests/unit/benchmark/scenarios/lib/test_check_connectivity.py new file mode 100644 index 000000000..1fb2f89ca --- /dev/null +++ b/tests/unit/benchmark/scenarios/lib/test_check_connectivity.py @@ -0,0 +1,84 @@ +############################################################################## +# 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 +############################################################################## + +# Unittest for yardstick.benchmark.scenarios.lib.check_connectivity.CheckConnectivity + +from __future__ import absolute_import + +import mock +import unittest + +from yardstick.benchmark.scenarios.lib import check_connectivity + + +class CheckConnectivityTestCase(unittest.TestCase): + + def setUp(self): + self.ctx = { + 'host': { + 'ip': '172.16.0.137', + 'user': 'root', + 'key_filename': 'mykey.key', + 'ssh_port': '22' + }, + 'target': { + 'ipaddr': '172.16.0.138' + } + } + + @mock.patch('yardstick.benchmark.scenarios.lib.check_connectivity.ssh') + def test_check_connectivity(self, mock_ssh): + + args = { + 'options': {'src_ip_addr': '192.168.23.2', + 'dest_ip_addr': '192.168.23.10', + 'ssh_user': 'root', + 'ssh_passwd': 'root', + 'ssh_port': '22', + 'ssh_timeout': 600, + 'ping_parameter': "-s 2048" + }, + 'sla': {'status': 'True', + 'action': 'assert'} + } + + result = {} + + obj = check_connectivity.CheckConnectivity(args, {}) + obj.setup() + mock_ssh.SSH.execute.return_value = (0, '100', '') + + + @mock.patch('yardstick.benchmark.scenarios.lib.check_connectivity.ssh') + def test_check_connectivity_key(self, mock_ssh): + + args = { + 'options': {'ssh_user': 'root', + 'ssh_key': '/root/.ssh/id_rsa', + 'ssh_port': '22', + 'ssh_timeout': 600, + 'ping_parameter': "-s 2048" + }, + 'sla': {'status': 'True', + 'action': 'assert'} + } + + result = {} + + obj = check_connectivity.CheckConnectivity(args, self.ctx) + obj.setup() + + mock_ssh.SSH.execute.return_value = (0, '100', '') + +def main(): + unittest.main() + + +if __name__ == '__main__': + main() diff --git a/yardstick/benchmark/contexts/standalone/model.py b/yardstick/benchmark/contexts/standalone/model.py index 4491660e0..ffd8858d9 100644 --- a/yardstick/benchmark/contexts/standalone/model.py +++ b/yardstick/benchmark/contexts/standalone/model.py @@ -16,11 +16,9 @@ from __future__ import absolute_import import os import re import time -import glob import uuid import random import logging -import itertools import errno from netaddr import IPNetwork @@ -30,6 +28,7 @@ from yardstick import ssh from yardstick.common.constants import YARDSTICK_ROOT_PATH from yardstick.common.yaml_loader import yaml_load from yardstick.network_services.utils import PciAddress +from yardstick.network_services.helpers.cpu import CpuSysCores from yardstick.common.utils import write_file LOG = logging.getLogger(__name__) @@ -43,7 +42,7 @@ VM_TEMPLATE = """ <memoryBacking> <hugepages /> </memoryBacking> - <vcpu placement="static">{vcpu}</vcpu> + <vcpu cpuset='{cpuset}'>{vcpu}</vcpu> <os> <type arch="x86_64" machine="pc-i440fx-utopic">hvm</type> <boot dev="hd" /> @@ -192,6 +191,8 @@ class Libvirt(object): threads = extra_spec.get('hw:cpu_threads', '2') vcpu = int(cpu) * int(threads) numa_cpus = '0-%s' % (vcpu - 1) + hw_socket = flavor.get('hw_socket', '0') + cpuset = Libvirt.pin_vcpu_for_perf(connection, vm_name, vcpu, hw_socket) mac = StandaloneContextHelper.get_mac_address(0x00) image = cls.create_snapshot_qemu(connection, index, @@ -203,51 +204,28 @@ class Libvirt(object): memory=memory, vcpu=vcpu, cpu=cpu, numa_cpus=numa_cpus, socket=socket, threads=threads, - vm_image=image) + vm_image=image, cpuset=cpuset) write_file(cfg, vm_xml) return [vcpu, mac] @staticmethod - def split_cpu_list(cpu_list): - if not cpu_list: - return [] - - ranges = cpu_list.split(',') - bounds = ([int(b) for b in r.split('-')] for r in ranges) - range_objects = \ - (range(bound[0], bound[1] + 1 if len(bound) == 2 - else bound[0] + 1) for bound in bounds) - - return sorted(itertools.chain.from_iterable(range_objects)) - - @classmethod - def get_numa_nodes(cls): - nodes_sysfs = glob.iglob("/sys/devices/system/node/node*") - nodes = {} - for node_sysfs in nodes_sysfs: - num = os.path.basename(node_sysfs).replace("node", "") - with open(os.path.join(node_sysfs, "cpulist")) as cpulist_file: - cpulist = cpulist_file.read().strip() - nodes[num] = cls.split_cpu_list(cpulist) - LOG.info("nodes: {0}".format(nodes)) - return nodes - - @staticmethod def update_interrupts_hugepages_perf(connection): connection.execute("echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts") connection.execute("echo never > /sys/kernel/mm/transparent_hugepage/enabled") @classmethod - def pin_vcpu_for_perf(cls, connection, vm_name, cpu): - nodes = cls.get_numa_nodes() - num_nodes = len(nodes) - vcpi_pin_template = "virsh vcpupin {0} {1} {2}" - for i in range(0, int(cpu)): - core = nodes[str(num_nodes - 1)][i % len(nodes[str(num_nodes - 1)])] - connection.execute(vcpi_pin_template.format(vm_name, i, core)) - cls.update_interrupts_hugepages_perf(connection) + def pin_vcpu_for_perf(cls, connection, vm_name, cpu, socket="0"): + threads = "" + sys_obj = CpuSysCores(connection) + soc_cpu = sys_obj.get_core_socket() + sys_cpu = int(soc_cpu["cores_per_socket"]) + cores = "%s-%s" % (soc_cpu[socket][0], soc_cpu[socket][sys_cpu - 1]) + if int(soc_cpu["thread_per_core"]): + threads = "%s-%s" % (soc_cpu[socket][sys_cpu], soc_cpu[socket][-1]) + cpuset = "%s,%s" % (cores, threads) + return cpuset class StandaloneContextHelper(object): diff --git a/yardstick/benchmark/contexts/standalone/ovs_dpdk.py b/yardstick/benchmark/contexts/standalone/ovs_dpdk.py index 833c3fb80..fcb7bb66c 100644 --- a/yardstick/benchmark/contexts/standalone/ovs_dpdk.py +++ b/yardstick/benchmark/contexts/standalone/ovs_dpdk.py @@ -138,6 +138,7 @@ class OvsDpdkContext(Context): cmd_list = [ "mkdir -p /usr/local/var/run/openvswitch", + "mkdir -p {}".format(os.path.dirname(log_path)), "ovsdb-server --remote=punix:/{0}/{1} --pidfile --detach".format(vpath, ovs_sock_path), ovs_other_config.format("--no-wait ", "dpdk-init=true"), @@ -164,7 +165,7 @@ class OvsDpdkContext(Context): cmd_dpdk_list = [ "ovs-vsctl del-br br0", - "rm -rf /usr/local/var/run/openvswitch/dpdkvhostuser*", + "rm -rf {0}/var/run/openvswitch/dpdkvhostuser*".format(vpath), "ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev", ] @@ -175,7 +176,7 @@ class OvsDpdkContext(Context): dpdk_list.append(ovs_add_port.format(br='br0', port='dpdk%s' % vnf.get("port_num", 0), type_='dpdk', dpdk_args=dpdk_args)) dpdk_list.append(ovs_add_queue.format(port='dpdk%s' % vnf.get("port_num", 0), - queue=self.ovs_properties.get("queues", 4))) + queue=self.ovs_properties.get("queues", 1))) # Sorting the array to make sure we execute dpdk0... in the order list.sort(dpdk_list) @@ -370,8 +371,6 @@ class OvsDpdkContext(Context): LOG.info("virsh create ...") Libvirt.virsh_create_vm(self.connection, cfg) - # 5: Tunning for better performace - Libvirt.pin_vcpu_for_perf(self.connection, vm_name, vcpu) self.vm_names.append(vm_name) # build vnf node details diff --git a/yardstick/benchmark/contexts/standalone/sriov.py b/yardstick/benchmark/contexts/standalone/sriov.py index 55d7057a9..69825fbbf 100644 --- a/yardstick/benchmark/contexts/standalone/sriov.py +++ b/yardstick/benchmark/contexts/standalone/sriov.py @@ -196,6 +196,8 @@ class SriovContext(Context): LOG.info("Ports %s" % self.networks) def _enable_interfaces(self, index, idx, vfs, cfg): + vf_spoofchk = "ip link set {0} vf 0 spoofchk off" + vf = self.networks[vfs[0]] vpci = PciAddress.parse_address(vf['vpci'].strip(), multi_line=True) # Generate the vpci for the interfaces @@ -205,6 +207,7 @@ class SriovContext(Context): Libvirt.add_sriov_interfaces( vf['vpci'], vf['vf_pci']['vf_pci'], vf['mac'], str(cfg)) self.connection.execute("ifconfig %s up" % vf['interface']) + self.connection.execute(vf_spoofchk.format(vf['interface'])) def setup_sriov_context(self): nodes = [] @@ -233,8 +236,6 @@ class SriovContext(Context): LOG.info("virsh create ...") Libvirt.virsh_create_vm(self.connection, cfg) - # 5: Tunning for better performace - Libvirt.pin_vcpu_for_perf(self.connection, vm_name, vcpu) self.vm_names.append(vm_name) # build vnf node details diff --git a/yardstick/benchmark/scenarios/lib/check_connectivity.py b/yardstick/benchmark/scenarios/lib/check_connectivity.py new file mode 100644 index 000000000..bdf52d4c8 --- /dev/null +++ b/yardstick/benchmark/scenarios/lib/check_connectivity.py @@ -0,0 +1,99 @@ +############################################################################## +# 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 +############################################################################## + +from __future__ import print_function +from __future__ import absolute_import + +import logging +import yardstick.ssh as ssh + +from yardstick.benchmark.scenarios import base + +LOG = logging.getLogger(__name__) + + +class CheckConnectivity(base.Scenario): + """Check connectivity between two VMs""" + + __scenario_type__ = "CheckConnectivity" + + def __init__(self, scenario_cfg, context_cfg): + self.scenario_cfg = scenario_cfg + self.context_cfg = context_cfg + self.options = self.scenario_cfg['options'] + + try: + self.source_ip_addr = self.options['src_ip_addr'] + self.dest_ip_addr = self.options['dest_ip_addr'] + except KeyError: + host = self.context_cfg['host'] + target = self.context_cfg['target'] + self.ssh_user = host.get('user', 'ubuntu') + self.ssh_port = host.get("ssh_port", 22) + self.source_ip_addr = host.get('ip', None) + self.dest_ip_addr = target.get('ipaddr', None) + self.ssh_key = host.get('key_filename', '/root/.ssh/id_rsa') + self.ssh_passwd = host.get('password', None) + self.ssh_timeout = 600 + else: + self.ssh_user = self.options.get("ssh_user", 'ubuntu') + self.ssh_port = self.options.get("ssh_port", 22) + self.ssh_key = self.options.get("ssh_key", '/root/.ssh/id_rsa') + self.ssh_passwd = self.options.get("ssh_passwd", None) + self.ssh_timeout = self.options.get("ssh_timeout", 600) + + self.connection = None + self.setup_done = False + + def setup(self): + """scenario setup""" + + if self.ssh_passwd is not None: + LOG.info("Log in via pw, user:%s, host:%s, pw:%s", + self.ssh_user, self.source_ip_addr, self.ssh_passwd) + self.connection = ssh.SSH(self.ssh_user, + self.source_ip_addr, + password=self.ssh_passwd, + port=self.ssh_port) + else: + LOG.info("Log in via key, user:%s, host:%s, key_filename:%s", + self.ssh_user, self.source_ip_addr, self.ssh_key) + self.connection = ssh.SSH(self.ssh_user, + self.source_ip_addr, + key_filename=self.ssh_key, + port=self.ssh_port) + + self.connection.wait(timeout=self.ssh_timeout) + self.setup_done = True + + def run(self, result): # pragma: no cover + """execute the test""" + + if not self.setup_done: + self.setup() + + cmd = 'ping -c 4 ' + self.dest_ip_addr + parameter = self.options.get('ping_parameter', None) + if parameter: + cmd += (" %s" % parameter) + + LOG.info("Executing command: %s", cmd) + LOG.info("ping %s ==> %s", self.source_ip_addr, self.dest_ip_addr) + status, stdout, stderr = self.connection.execute(cmd) + + conn_status = self.scenario_cfg['sla']['status'] + + if bool(status) != bool(conn_status): + LOG.info("%s ===> %s connectivity check passed!" % (self.source_ip_addr, + self.dest_ip_addr)) + result['Check_Connectivity'] = 'PASS' + else: + LOG.info("%s ===> %s connectivity check failed!" % (self.source_ip_addr, + self.dest_ip_addr)) + result['Check_Connectivity'] = 'FAIL' diff --git a/yardstick/benchmark/scenarios/storage/fio.py b/yardstick/benchmark/scenarios/storage/fio.py index 98fe26973..125bc7ed4 100644 --- a/yardstick/benchmark/scenarios/storage/fio.py +++ b/yardstick/benchmark/scenarios/storage/fio.py @@ -32,6 +32,10 @@ class Fio(base.Scenario): type: string unit: na default: None + job_file_config - content of job configuration file + type: list + unit: na + default: None directory - mount directoey for test volume type: string unit: na @@ -90,15 +94,26 @@ class Fio(base.Scenario): self.client.wait(timeout=600) self.job_file = self.options.get("job_file", None) + config_lines = self.options.get("job_file_config", None) if self.job_file: self.job_file_script = pkg_resources.resource_filename( "yardstick.resources", 'files/' + self.job_file) - # copy script to host + # copy job file to host self.client._put_file_shell(self.job_file_script, '~/job_file.ini') + elif config_lines: + LOG.debug("Job file configuration received, Fio job file will be created.") + self.job_file = 'tmp_job_file.ini' + self.job_file_script = pkg_resources.resource_filename( + "yardstick.resources", 'files/' + self.job_file) + with open(self.job_file_script, 'w') as f: + f.write('\n'.join(str(line) for line in config_lines)) + # copy job file to host + self.client._put_file_shell(self.job_file_script, '~/job_file.ini') else: + LOG.debug("No job file configuration received, Fio will use parameters.") self.target_script = pkg_resources.resource_filename( "yardstick.benchmark.scenarios.storage", Fio.TARGET_SCRIPT) |