diff options
41 files changed, 1288 insertions, 27 deletions
diff --git a/.gitignore b/.gitignore index 6f462f55a..4843ba8ba 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,4 @@ cover/ .*.sw? /docs_build/ /docs_output/ -/releng/ +/docs/apidocs/yardstick*.rst diff --git a/docs/pre-hook.sh b/docs/pre-hook.sh new file mode 100644 index 000000000..4ecdb198e --- /dev/null +++ b/docs/pre-hook.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# SPDX-license-identifier: Apache-2.0 +############################################################################## +# Copyright (c) 2016 NEC 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 +############################################################################## + +sphinx-apidoc -o docs/apidocs yardstick diff --git a/docs/userguide/opnfv_yardstick_tc044.rst b/docs/userguide/opnfv_yardstick_tc044.rst new file mode 100644 index 000000000..2be8517a1 --- /dev/null +++ b/docs/userguide/opnfv_yardstick_tc044.rst @@ -0,0 +1,82 @@ +.. 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 TC044 +************************************* + +.. _man-pages: http://manpages.ubuntu.com/manpages/trusty/en/man1/free.1.html + ++-----------------------------------------------------------------------------+ +|Memory Utilization | +| | ++--------------+--------------------------------------------------------------+ +|test case id | OPNFV_YARDSTICK_TC044_Memory Utilization | +| | | ++--------------+--------------------------------------------------------------+ +|metric | Memory utilization | +| | | ++--------------+--------------------------------------------------------------+ +|test purpose | To evaluate the IaaS compute capability with regards to | +| | memory utilization.This test case should be run in parallel | +| | to other Yardstick test cases and not run as a stand-alone | +| | test case. | +| | Measure the memory usage statistics including used memory, | +| | free memory, buffer, cache and shared memory. | +| | Both average and maximun values are obtained. | +| | The purpose is also to be able to spot trends. | +| | Test results, graphs and similar shall be stored for | +| | comparison reasons and product evolution understanding | +| | between different OPNFV versions and/or configurations. | +| | | ++--------------+--------------------------------------------------------------+ +|configuration | File: memload.yaml (in the 'samples' directory) | +| | | +| | * interval: 1 - repeat, pausing every 1 seconds in-between. | +| | * count: 10 - display statistics 10 times, then exit. | +| | | ++--------------+--------------------------------------------------------------+ +|test tool | free | +| | | +| | free provides information about unused and used memory and | +| | swap space on any computer running Linux or another Unix-like| +| | operating system. | +| | free is normally part of a Linux distribution, hence it | +| | doesn't needs to be installed. | +| | | ++--------------+--------------------------------------------------------------+ +|references | man-pages_ | +| | | +| | ETSI-NFV-TST001 | +| | | ++--------------+--------------------------------------------------------------+ +|applicability | Test can be configured with different: | +| | | +| | * interval; | +| | * count; | +| | * runner Iteration and intervals. | +| | | +| | There are default values for each above-mentioned option. | +| | Run in background with other test cases. | +| | | ++--------------+--------------------------------------------------------------+ +|pre-test | The test case image needs to be installed into Glance | +|conditions | with free included in the image. | +| | | +| | No POD specific requirements have been identified. | +| | | ++--------------+--------------------------------------------------------------+ +|test sequence | description and expected result | +| | | ++--------------+--------------------------------------------------------------+ +|step 1 | The host is installed as client. The related TC, or TCs, is | +| | invoked and free logs are produced and stored. | +| | | +| | Result: logs are stored. | +| | | ++--------------+--------------------------------------------------------------+ +|test verdict | None. Memory utilization results are fetched and stored. | +| | | ++--------------+--------------------------------------------------------------+ diff --git a/docs/userguide/opnfv_yardstick_tc069.rst b/docs/userguide/opnfv_yardstick_tc069.rst new file mode 100644 index 000000000..51807e246 --- /dev/null +++ b/docs/userguide/opnfv_yardstick_tc069.rst @@ -0,0 +1,95 @@ +.. 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 TC069 +************************************* + +.. _RAMspeed: http://alasir.com/software/ramspeed/ + ++-----------------------------------------------------------------------------+ +|Memory Bandwidth | +| | ++--------------+--------------------------------------------------------------+ +|test case id | OPNFV_YARDSTICK_TC069_Memory Bandwidth | +| | | ++--------------+--------------------------------------------------------------+ +|metric | Megabyte per second (MBps) | +| | | ++--------------+--------------------------------------------------------------+ +|test purpose | To evaluate the IaaS compute performance with regards to | +| | memory bandwidth. | +| | Measure the maximum possible cache and memory performance | +| | while reading and writing certain blocks of data (starting | +| | from 1Kb and further in power of 2) continuously through ALU | +| | and FPU respectively. | +| | Measure different aspects of memory performance via synthetic| +| | simulations. Each simulation consists of four performances | +| | (Copy, Scale, Add, Triad). | +| | Test results, graphs and similar shall be stored for | +| | comparison reasons and product evolution understanding | +| | between different OPNFV versions and/or configurations. | +| | | ++--------------+--------------------------------------------------------------+ +|configuration | File: opnfv_yardstick_tc069.yaml | +| | | +| | * SLA (optional): 7000 (MBps) min_bandwidth: The minimum | +| | amount of memory bandwidth that is accepted. | +| | * type_id: 1 - runs a specified benchmark (by an ID number): | +| | 1 -- INTmark [writing] 4 -- FLOATmark [writing] | +| | 2 -- INTmark [reading] 5 -- FLOATmark [reading] | +| | 3 -- INTmem 6 -- FLOATmem | +| | * block_size: 64 Megabytes - the maximum block size per array| +| | * load: 32 Gigabytes - the amount of data load per pass | +| | * iterations: 5 - test is run 5 times iteratively. | +| | * interval: 1 - there is 1 second delay between each | +| | iteration. | +| | | ++--------------+--------------------------------------------------------------+ +|test tool | RAMspeed | +| | | +| | RAMspeed is a free open source command line utility to | +| | measure cache and memory performance of computer systems. | +| | RAMspeed is not always part of a Linux distribution, hence it| +| | needs to be installed in the test image. | +| | | ++--------------+--------------------------------------------------------------+ +|references | RAMspeed_ | +| | | +| | ETSI-NFV-TST001 | +| | | ++--------------+--------------------------------------------------------------+ +|applicability | Test can be configured with different: | +| | | +| | * benchmark operations (such as INTmark [writing], | +| | INTmark [reading], FLOATmark [writing], | +| | FLOATmark [reading], INTmem, FLOATmem); | +| | * block size per array; | +| | * load per pass; | +| | * number of batch run iterations; | +| | * iterations and intervals. | +| | | +| | There are default values for each above-mentioned option. | +| | | ++--------------+--------------------------------------------------------------+ +|pre-test | The test case image needs to be installed into Glance | +|conditions | with RAmspeed included in the image. | +| | | +| | No POD specific requirements have been identified. | +| | | ++--------------+--------------------------------------------------------------+ +|test sequence | description and expected result | +| | | ++--------------+--------------------------------------------------------------+ +|step 1 | The host is installed as client. RAMspeed is invoked and logs| +| | are produced and stored. | +| | | +| | Result: logs are stored. | +| | | ++--------------+--------------------------------------------------------------+ +|test verdict | Test fails if the measured memory bandwidth is below the SLA | +| | value or if there is a test case execution problem. | +| | | ++--------------+--------------------------------------------------------------+ diff --git a/docs/userguide/opnfv_yardstick_tc071.rst b/docs/userguide/opnfv_yardstick_tc071.rst new file mode 100644 index 000000000..673480b55 --- /dev/null +++ b/docs/userguide/opnfv_yardstick_tc071.rst @@ -0,0 +1,109 @@ +.. 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 TC071 +************************************* + +.. _cirros: https://download.cirros-cloud.net +.. _pktgen: https://www.kernel.org/doc/Documentation/networking/pktgen.txt +.. _cachestat: https://github.com/brendangregg/perf-tools/tree/master/fs + ++-----------------------------------------------------------------------------+ +|Latency, Cache Utilization, Throughput, Packet Loss | +| | ++--------------+--------------------------------------------------------------+ +|test case id | OPNFV_YARDSTICK_TC071_Latency, Cache Utilization, | +| | Throughput,Packet Loss | +| | | ++--------------+--------------------------------------------------------------+ +|metric | Number of flows, latency, throughput, Cache Utilization, | +| | packet loss | +| | | ++--------------+--------------------------------------------------------------+ +|test purpose | To evaluate the IaaS network performance with regards to | +| | flows and throughput, such as if and how different amounts | +| | of flows matter for the throughput between hosts on different| +| | compute blades. Typically e.g. the performance of a vSwitch | +| | depends on the number of flows running through it. Also | +| | performance of other equipment or entities can depend | +| | on the number of flows or the packet sizes used. | +| | The purpose is also to be able to spot trends. | +| | Test results, graphs and similar shall be stored for | +| | comparison reasons and product evolution understanding | +| | between different OPNFV versions and/or configurations. | +| | | ++--------------+--------------------------------------------------------------+ +|configuration | file: opnfv_yardstick_tc071.yaml | +| | | +| | Packet size: 64 bytes | +| | Number of ports: 1, 10, 50, 100, 300, 500, 750 and 1000. | +| | The amount configured ports map from 2 up to 1001000 flows, | +| | respectively. Each port amount is run two times, for 20 | +| | seconds each. Then the next port_amount is run, and so on. | +| | During the test Cache Utilization on both client and server, | +| | and the network latency between the client and server are | +| | measured. | +| | The client and server are distributed on different HW. | +| | For SLA max_ppm is set to 1000. | +| | | ++--------------+--------------------------------------------------------------+ +|test tool | pktgen | +| | | +| | Pktgen is not always part of a Linux distribution, hence it | +| | needs to be installed. It is part of the Yardstick Glance | +| | image. | +| | (As an example see the /yardstick/tools/ directory for how | +| | to generate a Linux image with pktgen included.) | +| | | +| | ping | +| | | +| | Ping is normally part of any Linux distribution, hence it | +| | doesn't need to be installed. It is also part of the | +| | Yardstick Glance image. | +| | (For example also a cirros_ image can be downloaded, it | +| | includes ping) | +| | | +| | cachestat | +| | | +| | cachestat is not always part of a Linux distribution, hence | +| | it needs to be installed. | +| | | ++--------------+--------------------------------------------------------------+ +|references | Ping man pages | +| | | +| | pktgen_ | +| | | +| | cachestat_ | +| | | +| | ETSI-NFV-TST001 | +| | | ++--------------+--------------------------------------------------------------+ +|applicability | Test can be configured with different packet sizes, amount | +| | of flows and test duration. Default values exist. | +| | | +| | SLA (optional): max_ppm: The number of packets per million | +| | packets sent that are acceptable to lose, not received. | +| | | ++--------------+--------------------------------------------------------------+ +|pre-test | The test case image needs to be installed into Glance | +|conditions | with pktgen included in it. | +| | | +| | No POD specific requirements have been identified. | +| | | ++--------------+--------------------------------------------------------------+ +|test sequence | description and expected result | +| | | ++--------------+--------------------------------------------------------------+ +|step 1 | The hosts are installed, as server and client. pktgen is | +| | invoked and logs are produced and stored. | +| | | +| | Result: Logs are stored. | +| | | ++--------------+--------------------------------------------------------------+ +|test verdict | Fails only if SLA is not passed, or if there is a test case | +| | execution problem. | +| | | ++--------------+--------------------------------------------------------------+ diff --git a/docs/userguide/opnfv_yardstick_tc072.rst b/docs/userguide/opnfv_yardstick_tc072.rst new file mode 100644 index 000000000..2e7ee057c --- /dev/null +++ b/docs/userguide/opnfv_yardstick_tc072.rst @@ -0,0 +1,110 @@ +.. 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 TC072 +************************************* + +.. _cirros: https://download.cirros-cloud.net +.. _pktgen: https://www.kernel.org/doc/Documentation/networking/pktgen.txt +.. _sar: http://linux.die.net/man/1/sar + ++-----------------------------------------------------------------------------+ +|Latency, Network Utilization, Throughput, Packet Loss | +| | ++--------------+--------------------------------------------------------------+ +|test case id | OPNFV_YARDSTICK_TC072_Latency, Network Utilization, | +| | Throughput,Packet Loss | +| | | ++--------------+--------------------------------------------------------------+ +|metric | Number of flows, latency, throughput, Network Utilization, | +| | packet loss | +| | | ++--------------+--------------------------------------------------------------+ +|test purpose | To evaluate the IaaS network performance with regards to | +| | flows and throughput, such as if and how different amounts | +| | of flows matter for the throughput between hosts on different| +| | compute blades. Typically e.g. the performance of a vSwitch | +| | depends on the number of flows running through it. Also | +| | performance of other equipment or entities can depend | +| | on the number of flows or the packet sizes used. | +| | The purpose is also to be able to spot trends. | +| | Test results, graphs and similar shall be stored for | +| | comparison reasons and product evolution understanding | +| | between different OPNFV versions and/or configurations. | +| | | ++--------------+--------------------------------------------------------------+ +|configuration | file: opnfv_yardstick_tc072.yaml | +| | | +| | Packet size: 64 bytes | +| | Number of ports: 1, 10, 50, 100, 300, 500, 750 and 1000. | +| | The amount configured ports map from 2 up to 1001000 flows, | +| | respectively. Each port amount is run two times, for 20 | +| | seconds each. Then the next port_amount is run, and so on. | +| | During the test Network Utilization on both client and | +| | server, and the network latency between the client and server| +| | are measured. | +| | The client and server are distributed on different HW. | +| | For SLA max_ppm is set to 1000. | +| | | ++--------------+--------------------------------------------------------------+ +|test tool | pktgen | +| | | +| | Pktgen is not always part of a Linux distribution, hence it | +| | needs to be installed. It is part of the Yardstick Glance | +| | image. | +| | (As an example see the /yardstick/tools/ directory for how | +| | to generate a Linux image with pktgen included.) | +| | | +| | ping | +| | | +| | Ping is normally part of any Linux distribution, hence it | +| | doesn't need to be installed. It is also part of the | +| | Yardstick Glance image. | +| | (For example also a cirros_ image can be downloaded, it | +| | includes ping) | +| | | +| | sar | +| | | +| | The sar command writes to standard output the contents of | +| | selected cumulative activity counters in the operating | +| | system. | +| | sar is normally part of a Linux distribution, hence it | +| | doesn't needs to be installed. | +| | | ++--------------+--------------------------------------------------------------+ +|references | Ping and sar man pages | +| | | +| | pktgen_ | +| | | +| | ETSI-NFV-TST001 | +| | | ++--------------+--------------------------------------------------------------+ +|applicability | Test can be configured with different packet sizes, amount | +| | of flows and test duration. Default values exist. | +| | | +| | SLA (optional): max_ppm: The number of packets per million | +| | packets sent that are acceptable to lose, not received. | +| | | ++--------------+--------------------------------------------------------------+ +|pre-test | The test case image needs to be installed into Glance | +|conditions | with pktgen included in it. | +| | | +| | No POD specific requirements have been identified. | +| | | ++--------------+--------------------------------------------------------------+ +|test sequence | description and expected result | +| | | ++--------------+--------------------------------------------------------------+ +|step 1 | The hosts are installed, as server and client. pktgen is | +| | invoked and logs are produced and stored. | +| | | +| | Result: Logs are stored. | +| | | ++--------------+--------------------------------------------------------------+ +|test verdict | Fails only if SLA is not passed, or if there is a test case | +| | execution problem. | +| | | ++--------------+--------------------------------------------------------------+ diff --git a/plugin/storperf.yaml b/plugin/storperf.yaml new file mode 100644 index 000000000..d08e26eb6 --- /dev/null +++ b/plugin/storperf.yaml @@ -0,0 +1,13 @@ +--- +# StorPerf plugin configration file +# Used for integration StorPerf into Yardstick as a plugin + +schema: "yardstick:plugin:0.1" + +plugins: + name: storperf + +deployment: + ip: 192.168.23.2 + user: root + password: root diff --git a/samples/memload.yaml b/samples/memload.yaml index 0acba21b1..87d727707 100644 --- a/samples/memload.yaml +++ b/samples/memload.yaml @@ -9,13 +9,14 @@ scenarios: type: MEMORYload options: interval: 1 - count: 1 + count: 10 host: kratos.demo runner: - type: Duration - duration: 60 + type: Iteration + iterations: 5 + interval: 1 context: name: demo diff --git a/samples/netutilization.yaml b/samples/netutilization.yaml new file mode 100644 index 000000000..598a5af15 --- /dev/null +++ b/samples/netutilization.yaml @@ -0,0 +1,32 @@ +--- +# Sample benchmark task config file +# Reading network interface utilization statistics + +schema: "yardstick:task:0.1" + +scenarios: +- + type: NetUtilization + options: + interval: 1 + count: 1 + + host: apollo.demo + + runner: + type: Iteration + interval: 1 + +context: + name: demo + image: yardstick-trusty-server + flavor: yardstick-flavor + user: ubuntu + + servers: + apollo: + floating_ip: true + + networks: + test: + cidr: '10.0.1.0/24' @@ -19,7 +19,9 @@ setup( 'benchmark/scenarios/networking/*.txt', 'benchmark/scenarios/parser/*.sh', 'benchmark/scenarios/storage/*.bash', - 'resources/files/*' + 'resources/files/*', + 'resources/scripts/install/*.bash', + 'resources/scripts/remove/*.bash' ] }, url="https://www.opnfv.org", diff --git a/tests/ci/prepare_env.sh b/tests/ci/prepare_env.sh index ed832bc47..723a04aa1 100755 --- a/tests/ci/prepare_env.sh +++ b/tests/ci/prepare_env.sh @@ -52,3 +52,6 @@ fi source $OPENRC export EXTERNAL_NETWORK INSTALLER_TYPE DEPLOY_TYPE NODE_NAME + +# Prepare a admin-rc file for StorPerf integration +$YARDSTICK_REPO_DIR/tests/ci/prepare_storperf_admin-rc.sh diff --git a/tests/ci/prepare_storperf_admin-rc.sh b/tests/ci/prepare_storperf_admin-rc.sh new file mode 100755 index 000000000..0401719ff --- /dev/null +++ b/tests/ci/prepare_storperf_admin-rc.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +############################################################################## +# Copyright (c) 2016 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 +############################################################################## + +AUTH_URL=${OS_AUTH_URL} +USERNAME=${OS_USERNAME:-admin} +PASSWORD=${OS_PASSWORD:-console} +TENANT_NAME=${OS_TENANT_NAME:-admin} +VOLUME_API_VERSION=${OS_VOLUME_API_VERSION:-2} +PROJECT_NAME=${OS_PROJECT_NAME:-$TENANT_NAME} +TENANT_ID=`keystone tenant-get admin|grep 'id'|awk -F '|' '{print $3}'|sed -e 's/^[[:space:]]*//'` + + +rm -f ~/storperf_admin-rc +touch ~/storperf_admin-rc + +echo "OS_AUTH_URL="$AUTH_URL >> ~/storperf_admin-rc +echo "OS_USERNAME="$USERNAME >> ~/storperf_admin-rc +echo "OS_PASSWORD="$PASSWORD >> ~/storperf_admin-rc +echo "OS_TENANT_NAME="$TENANT_NAME >> ~/storperf_admin-rc +echo "OS_VOLUME_API_VERSION="$VOLUME_API_VERSION >> ~/storperf_admin-rc +echo "OS_PROJECT_NAME="$PROJECT_NAME >> ~/storperf_admin-rc +echo "OS_TENANT_ID="$TENANT_ID >> ~/storperf_admin-rc diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml new file mode 100644 index 000000000..637e160c6 --- /dev/null +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml @@ -0,0 +1,38 @@ +--- +# Yardstick TC069 config file +# Measure memory read and write bandwidth using ramspeed + +schema: "yardstick:task:0.1" + +scenarios: +- + type: Ramspeed + options: + type_id: 1 + load: 32 + block_size: 64 + + host: kratos.yardstick-TC069 + + runner: + type: Iteration + iterations: 5 + interval: 1 + + sla: + min_bandwidth: 7000 + action: monitor + +context: + name: yardstick-TC069 + image: yardstick-trusty-server + flavor: yardstick-flavor + user: ubuntu + + servers: + kratos: + floating_ip: true + + networks: + test: + cidr: '10.0.1.0/24' diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml new file mode 100644 index 000000000..644010916 --- /dev/null +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml @@ -0,0 +1,85 @@ +--- +# Yardstick TC071 config file +# Measure cache hit/miss ratio and usage, network throughput and latency. +# Different amounts of flows are tested with, from 2 up to 1001000. +# All tests are run 2 times each. First 2 times with the least +# amount of ports, then 2 times with the next amount of ports, +# and so on until all packet sizes have been run with. +# +# During the measurements cache hit/miss ration, cache usage statistics and +# network latency are recorded/measured using cachestat and ping, respectively. + +schema: "yardstick:task:0.1" + +scenarios: +- + type: CACHEstat + run_in_background: true + + options: + interval: 1 + + host: demeter.yardstick-TC071 +- + type: CACHEstat + run_in_background: true + + options: + interval: 1 + + host: poseidon.yardstick-TC071 +- + type: Ping + run_in_background: true + + options: + packetsize: 100 + + host: demeter.yardstick-TC071 + target: poseidon.yardstick-TC071 + + sla: + max_rtt: 10 + action: monitor +{% for num_ports in [1, 10, 50, 100, 300, 500, 750, 1000] %} +- + type: Pktgen + options: + packetsize: 64 + number_of_ports: {{num_ports}} + duration: 20 + + host: demeter.yardstick-TC071 + target: poseidon.yardstick-TC071 + + runner: + type: Iteration + iterations: 2 + interval: 1 + + sla: + max_ppm: 1000 + action: monitor +{% endfor %} + +context: + name: yardstick-TC071 + image: yardstick-trusty-server + flavor: yardstick-flavor + user: ubuntu + + placement_groups: + pgrp1: + policy: "availability" + + servers: + demeter: + floating_ip: true + placement: "pgrp1" + poseidon: + floating_ip: true + placement: "pgrp1" + + networks: + test: + cidr: '10.0.1.0/24' diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc044.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml index d7406832d..f3e6d4c40 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc044.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml @@ -1,35 +1,35 @@ --- -# Yardstick TC044 config file -# Measure memory usage statistics, network throughput, latency and packet loss. +# Yardstick TC072 config file +# Measure network throughput and packet loss using pktgen. # Different amounts of flows are tested with, from 2 up to 1001000. # All tests are run 2 times each. First 2 times with the least # amount of ports, then 2 times with the next amount of ports, # and so on until all packet sizes have been run with. # -# During the measurements memory usage statistics and network latency are +# During the measurements network usage statistics and network latency are # recorded/measured using sar and ping, respectively. schema: "yardstick:task:0.1" scenarios: - - type: MEMORYload + type: NetUtilization run_in_background: true options: interval: 1 - count: 1 + count: 10 - host: demeter.yardstick-TC044 + host: demeter.yardstick-TC072 - - type: MEMORYload + type: NetUtilization run_in_background: true options: interval: 1 - count: 1 + count: 10 - host: poseidon.yardstick-TC044 + host: poseidon.yardstick-TC072 - type: Ping run_in_background: true @@ -37,8 +37,8 @@ scenarios: options: packetsize: 100 - host: demeter.yardstick-TC044 - target: poseidon.yardstick-TC044 + host: demeter.yardstick-TC072 + target: poseidon.yardstick-TC072 sla: max_rtt: 10 @@ -51,8 +51,8 @@ scenarios: number_of_ports: {{num_ports}} duration: 20 - host: demeter.yardstick-TC044 - target: poseidon.yardstick-TC044 + host: demeter.yardstick-TC072 + target: poseidon.yardstick-TC072 runner: type: Iteration @@ -65,7 +65,7 @@ scenarios: {% endfor %} context: - name: yardstick-TC044 + name: yardstick-TC072 image: yardstick-trusty-server flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-lxd-ha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-lxd-ha_daily.yaml new file mode 100644 index 000000000..d40125e36 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-lxd-ha_daily.yaml @@ -0,0 +1,22 @@ +--- +# Huawei US bare daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-lxd-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 diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-lxd-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-lxd-noha_daily.yaml new file mode 100644 index 000000000..7c0785fe5 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-lxd-noha_daily.yaml @@ -0,0 +1,22 @@ +--- +# Huawei US bare daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-lxd-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 diff --git a/tests/opnfv/test_suites/opnfv_os-nosdn-nofeature-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-nosdn-nofeature-noha_daily.yaml new file mode 100644 index 000000000..b0a340dbf --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-nosdn-nofeature-noha_daily.yaml @@ -0,0 +1,22 @@ +--- +# Huawei US bare daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-nosdn-nofeature-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 diff --git a/tests/opnfv/test_suites/opnfv_os-ocl-nofeature-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-ocl-nofeature-noha_daily.yaml new file mode 100644 index 000000000..9888935cc --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-ocl-nofeature-noha_daily.yaml @@ -0,0 +1,22 @@ +--- +# Huawei US bare daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-ocl-nofeature-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 diff --git a/tests/opnfv/test_suites/opnfv_os-odl_l2-nofeature-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-odl_l2-nofeature-noha_daily.yaml new file mode 100644 index 000000000..b94cdf755 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-odl_l2-nofeature-noha_daily.yaml @@ -0,0 +1,22 @@ +--- +# Huawei US bare daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-odl_l2-nofeature-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 diff --git a/tests/opnfv/test_suites/opnfv_os-odl_l2-sfc-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-odl_l2-sfc-noha_daily.yaml new file mode 100644 index 000000000..458afba13 --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-odl_l2-sfc-noha_daily.yaml @@ -0,0 +1,22 @@ +--- +# Huawei US bare daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-odl_l2-sfc-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 diff --git a/tests/opnfv/test_suites/opnfv_os-onos-nofeature-noha_daily.yaml b/tests/opnfv/test_suites/opnfv_os-onos-nofeature-noha_daily.yaml new file mode 100644 index 000000000..fd76673de --- /dev/null +++ b/tests/opnfv/test_suites/opnfv_os-onos-nofeature-noha_daily.yaml @@ -0,0 +1,22 @@ +--- +# Huawei US bare daily task suite + +schema: "yardstick:suite:0.1" + +name: "os-onos-nofeature-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 diff --git a/tests/unit/benchmark/scenarios/availability/test_attacker_general.py b/tests/unit/benchmark/scenarios/availability/test_attacker_general.py index 643c1e7ac..aa2e0cc4d 100644 --- a/tests/unit/benchmark/scenarios/availability/test_attacker_general.py +++ b/tests/unit/benchmark/scenarios/availability/test_attacker_general.py @@ -33,6 +33,7 @@ class GeneralAttackerServiceTestCase(unittest.TestCase): 'action_parameter':{'process_name':'nova_api'}, 'rollback_parameter':{'process_name':'nova_api'}, 'key':'stop-service', + 'attack_key':'stop-service', 'host': 'node1', } diff --git a/tests/unit/benchmark/scenarios/availability/test_monitor_general.py b/tests/unit/benchmark/scenarios/availability/test_monitor_general.py index b48434c99..de7d26cbf 100644 --- a/tests/unit/benchmark/scenarios/availability/test_monitor_general.py +++ b/tests/unit/benchmark/scenarios/availability/test_monitor_general.py @@ -32,6 +32,7 @@ class GeneralMonitorServiceTestCase(unittest.TestCase): self.monitor_cfg = { 'monitor_type': 'general-monitor', 'key': 'service-status', + 'monitor_key': 'service-status', 'host': 'node1', 'monitor_time': 3, 'parameter': {'serviceName': 'haproxy'}, @@ -40,6 +41,7 @@ class GeneralMonitorServiceTestCase(unittest.TestCase): self.monitor_cfg_noparam = { 'monitor_type': 'general-monitor', 'key': 'service-status', + 'monitor_key': 'service-status', 'host': 'node1', 'monitor_time': 3, 'sla': {'max_outage_time': 1} diff --git a/tests/unit/benchmark/scenarios/availability/test_operation_general.py b/tests/unit/benchmark/scenarios/availability/test_operation_general.py index 6713733a8..26cd3f7c4 100644 --- a/tests/unit/benchmark/scenarios/availability/test_operation_general.py +++ b/tests/unit/benchmark/scenarios/availability/test_operation_general.py @@ -34,11 +34,13 @@ class GeneralOperaionTestCase(unittest.TestCase): 'action_parameter': {'ins_cup': 2}, 'rollback_parameter': {'ins_id': 'id123456'}, 'key': 'nova-create-instance', + 'operation_key': 'nova-create-instance', 'host': 'node1', } self.operation_cfg_noparam = { 'operation_type': 'general-operation', 'key': 'nova-create-instance', + 'operation_key': 'nova-create-instance', 'host': 'node1', } diff --git a/tests/unit/benchmark/scenarios/availability/test_result_checker_general.py b/tests/unit/benchmark/scenarios/availability/test_result_checker_general.py index 88a9b9d20..bbadf0ac3 100644 --- a/tests/unit/benchmark/scenarios/availability/test_result_checker_general.py +++ b/tests/unit/benchmark/scenarios/availability/test_result_checker_general.py @@ -38,6 +38,7 @@ class GeneralResultCheckerTestCase(unittest.TestCase): 'condition' : 'eq', 'expectedValue' : 1, 'key' : 'process-checker', + 'checker_key' : 'process-checker', 'host': 'node1' } diff --git a/tests/unit/benchmark/scenarios/networking/netutilization_sample_output1.txt b/tests/unit/benchmark/scenarios/networking/netutilization_sample_output1.txt new file mode 100644 index 000000000..f90457cb3 --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/netutilization_sample_output1.txt @@ -0,0 +1,9 @@ +Linux 3.19.0-25-generic (huawei-pod4) 07/19/2016 _x86_64_ (1 CPU) + +02:01:50 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil +02:01:51 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 +02:01:51 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 + +Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil +Average: eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 +Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 diff --git a/tests/unit/benchmark/scenarios/networking/netutilization_sample_output2.txt b/tests/unit/benchmark/scenarios/networking/netutilization_sample_output2.txt new file mode 100644 index 000000000..417613ec1 --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/netutilization_sample_output2.txt @@ -0,0 +1,13 @@ +Linux 3.19.0-25-generic (huawei-pod4) 07/19/2016 _x86_64_ (1 CPU) + +02:01:50 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil +02:01:51 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 +02:01:51 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 + +02:01:52 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil +02:01:53 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 +02:01:53 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 + +Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil +Average: eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 +Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 diff --git a/tests/unit/benchmark/scenarios/networking/test_netutilization.py b/tests/unit/benchmark/scenarios/networking/test_netutilization.py new file mode 100644 index 000000000..eb6626fea --- /dev/null +++ b/tests/unit/benchmark/scenarios/networking/test_netutilization.py @@ -0,0 +1,225 @@ +#!/usr/bin/env python + +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and other. +# +# 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.networking.netutilization.NetUtilization + +import mock +import unittest +import os + +from yardstick.benchmark.scenarios.networking import netutilization + + +@mock.patch('yardstick.benchmark.scenarios.networking.netutilization.ssh') +class NetUtilizationTestCase(unittest.TestCase): + + def setUp(self): + self.ctx = { + 'host': { + 'ip': '172.16.0.137', + 'user': 'cirros', + 'key_filename': "mykey.key" + } + } + + self.result = {} + + def test_setup_success(self, mock_ssh): + options = { + "interval": 1, + "count": 1 + } + args = {'options': options} + + n = netutilization.NetUtilization(args, self.ctx) + mock_ssh.SSH().execute.return_value = (0, '', '') + + n.setup() + self.assertIsNotNone(n.client) + self.assertTrue(n.setup_done) + + def test_execute_command_success(self, mock_ssh): + options = { + "interval": 1, + "count": 1 + } + args = {'options': options} + + n = netutilization.NetUtilization(args, self.ctx) + mock_ssh.SSH().execute.return_value = (0, '', '') + n.setup() + + expected_result = 'abcdefg' + mock_ssh.SSH().execute.return_value = (0, expected_result, '') + result = n._execute_command("foo") + self.assertEqual(result, expected_result) + + def test_execute_command_failed(self, mock_ssh): + options = { + "interval": 1, + "count": 1 + } + args = {'options': options} + + n = netutilization.NetUtilization(args, self.ctx) + mock_ssh.SSH().execute.return_value = (0, '', '') + n.setup() + + mock_ssh.SSH().execute.return_value = (127, '', 'abcdefg') + self.assertRaises(RuntimeError, n._execute_command, + "failed") + + def test_get_network_utilization_success(self, mock_ssh): + options = { + "interval": 1, + "count": 1 + } + args = {'options': options} + + n = netutilization.NetUtilization(args, self.ctx) + mock_ssh.SSH().execute.return_value = (0, '', '') + n.setup() + + mpstat_output = self._read_file("netutilization_sample_output1.txt") + mock_ssh.SSH().execute.return_value = (0, mpstat_output, '') + result = n._get_network_utilization() + + expected_result = \ + {"network_utilization_maximun": { + "lo": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}, + "eth0": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}}, + "network_utilization_average": { + "lo": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}, + "eth0": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}}, + "network_utilization_minimum": { + "lo": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}, + "eth0": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}}} + + self.assertDictEqual(result, expected_result) + + def test_get_network_utilization_2_success(self, mock_ssh): + options = { + "interval": 1, + "count": 2 + } + args = {'options': options} + + n = netutilization.NetUtilization(args, self.ctx) + mock_ssh.SSH().execute.return_value = (0, '', '') + n.setup() + + mpstat_output = self._read_file("netutilization_sample_output2.txt") + mock_ssh.SSH().execute.return_value = (0, mpstat_output, '') + result = n._get_network_utilization() + + expected_result = \ + {"network_utilization_maximun": { + "lo": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}, + "eth0": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}}, + "network_utilization_average": { + "lo": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}, + "eth0": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}}, + "network_utilization_minimum": { + "lo": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}, + "eth0": {"rxcmp/s": "0.00", + "%ifutil": "0.00", + "txcmp/s": "0.00", + "txkB/s": "0.00", + "rxkB/s": "0.00", + "rxpck/s": "0.00", + "txpck/s": "0.00", + "rxmcst/s": "0.00"}}} + + self.assertDictEqual(result, expected_result) + + def _read_file(self, filename): + curr_path = os.path.dirname(os.path.abspath(__file__)) + output = os.path.join(curr_path, filename) + with open(output) as f: + sample_output = f.read() + return sample_output diff --git a/yardstick/benchmark/contexts/node.py b/yardstick/benchmark/contexts/node.py index 54ee076f4..c3d652119 100644 --- a/yardstick/benchmark/contexts/node.py +++ b/yardstick/benchmark/contexts/node.py @@ -82,6 +82,8 @@ class NodeContext(Context): LOG.error("Nodes: %r" % nodes) sys.exit(-1) - node = nodes[0] + # A clone is created in order to avoid affecting the + # original one. + node = dict(nodes[0]) node["name"] = attr_name return node diff --git a/yardstick/benchmark/scenarios/availability/attacker/attacker_general.py b/yardstick/benchmark/scenarios/availability/attacker/attacker_general.py index 018362a15..816e7e37d 100644 --- a/yardstick/benchmark/scenarios/availability/attacker/attacker_general.py +++ b/yardstick/benchmark/scenarios/availability/attacker/attacker_general.py @@ -31,6 +31,7 @@ class GeneralAttacker(BaseAttacker): LOG.debug("ssh host success!") self.key = self._config['key'] + self.attack_key = self._config['attack_key'] if "action_parameter" in self._config: actionParameter = self._config['action_parameter'] @@ -50,7 +51,7 @@ class GeneralAttacker(BaseAttacker): l = list(item for item in rollbackParameter.values()) self.rollback_param = str.format(*l) - self.fault_cfg = BaseAttacker.attacker_cfgs.get(self.key) + self.fault_cfg = BaseAttacker.attacker_cfgs.get(self.attack_key) self.inject_script = self.get_script_fullpath( self.fault_cfg['inject_script']) self.recovery_script = self.get_script_fullpath( diff --git a/yardstick/benchmark/scenarios/availability/monitor/monitor_general.py b/yardstick/benchmark/scenarios/availability/monitor/monitor_general.py index e7e4d5bce..61efc0520 100644 --- a/yardstick/benchmark/scenarios/availability/monitor/monitor_general.py +++ b/yardstick/benchmark/scenarios/availability/monitor/monitor_general.py @@ -27,6 +27,7 @@ class GeneralMonitor(basemonitor.BaseMonitor): user = host.get("user", "root") key_filename = host.get("key_filename", "~/.ssh/id_rsa") self.key = self._config["key"] + self.monitor_key = self._config["monitor_key"] self.monitor_type = self._config["monitor_type"] if "parameter" in self._config: @@ -35,7 +36,8 @@ class GeneralMonitor(basemonitor.BaseMonitor): l = list(item for item in parameter.values()) self.cmd_param = str.format(*l) - self.monitor_cfg = basemonitor.BaseMonitor.monitor_cfgs.get(self.key) + self.monitor_cfg = basemonitor.BaseMonitor.monitor_cfgs.get( + self.monitor_key) self.monitor_script = self.get_script_fullpath( self.monitor_cfg['monitor_script']) self.connection = ssh.SSH(user, ip, key_filename=key_filename) diff --git a/yardstick/benchmark/scenarios/availability/operation/operation_general.py b/yardstick/benchmark/scenarios/availability/operation/operation_general.py index d41371629..e43f6e1d5 100644 --- a/yardstick/benchmark/scenarios/availability/operation/operation_general.py +++ b/yardstick/benchmark/scenarios/availability/operation/operation_general.py @@ -30,6 +30,7 @@ class GeneralOperaion(BaseOperation): LOG.debug("ssh host success!") self.key = self._config['key'] + self.operation_key = self._config['operation_key'] if "action_parameter" in self._config: actionParameter = self._config['action_parameter'] @@ -43,7 +44,8 @@ class GeneralOperaion(BaseOperation): l = list(item for item in rollbackParameter.values()) self.rollback_param = str.format(*l) - self.operation_cfgs = BaseOperation.operation_cfgs.get(self.key) + self.operation_cfgs = BaseOperation.operation_cfgs.get( + self.operation_key) self.action_script = self.get_script_fullpath( self.operation_cfgs['action_script']) self.rollback_script = self.get_script_fullpath( diff --git a/yardstick/benchmark/scenarios/availability/result_checker/result_checker_general.py b/yardstick/benchmark/scenarios/availability/result_checker/result_checker_general.py index 70bf9aea6..681fbf63f 100644 --- a/yardstick/benchmark/scenarios/availability/result_checker/result_checker_general.py +++ b/yardstick/benchmark/scenarios/availability/result_checker/result_checker_general.py @@ -32,6 +32,7 @@ class GeneralResultChecker(BaseResultChecker): LOG.debug("ssh host success!") self.key = self._config['key'] + self.resultchecker_key = self._config['checker_key'] self.type = self._config['checker_type'] self.condition = self._config['condition'] self.expectedResult = self._config['expectedValue'] @@ -45,7 +46,7 @@ class GeneralResultChecker(BaseResultChecker): self.shell_cmd = str.format(*l) self.resultchecker_cfgs = BaseResultChecker.resultchecker_cfgs.get( - self.key) + self.resultchecker_key) self.verify_script = self.get_script_fullpath( self.resultchecker_cfgs['verify_script']) diff --git a/yardstick/benchmark/scenarios/networking/netutilization.py b/yardstick/benchmark/scenarios/networking/netutilization.py new file mode 100644 index 000000000..ea43e6077 --- /dev/null +++ b/yardstick/benchmark/scenarios/networking/netutilization.py @@ -0,0 +1,186 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and other. +# +# 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 +############################################################################## +import logging +import re + +import yardstick.ssh as ssh +from yardstick.benchmark.scenarios import base + +LOG = logging.getLogger(__name__) + + +class NetUtilization(base.Scenario): + """Collect network utilization statistics. + + This scenario reads statistics from the network devices on a Linux host. + Network utilization statistics are read using the utility 'sar'. + + The following values are displayed: + + IFACE: Name of the network interface for which statistics are reported. + + rxpck/s: Total number of packets received per second. + + txpck/s: Total number of packets transmitted per second. + + rxkB/s: Total number of kilobytes received per second. + + txkB/s: Total number of kilobytes transmitted per second. + + rxcmp/s: Number of compressed packets received per second (for cslip etc.). + + txcmp/s: Number of compressed packets transmitted per second. + + rxmcst/s: Number of multicast packets received per second. + + %ifutil: Utilization percentage of the network interface. For half-duplex + interfaces, utilization is calculated using the sum of rxkB/s and txkB/s + as a percentage of the interface speed. For full-duplex, this is the + greater of rxkB/S or txkB/s. + + Parameters + interval - Time interval to measure network utilization. + type: [int] + unit: seconds + default: 1 + + count - Number of times to measure network utilization. + type: [int] + unit: N/A + default: 1 + """ + + __scenario_type__ = "NetUtilization" + + NET_UTILIZATION_FIELD_SIZE = 8 + + def __init__(self, scenario_cfg, context_cfg): + """Scenario construction.""" + self.scenario_cfg = scenario_cfg + self.context_cfg = context_cfg + self.setup_done = False + + def setup(self): + """Scenario setup.""" + host = self.context_cfg['host'] + user = host.get('user', 'ubuntu') + ip = host.get('ip', None) + key_filename = host.get('key_filename', '~/.ssh/id_rsa') + + LOG.info("user:%s, host:%s", user, ip) + self.client = ssh.SSH(user, ip, key_filename=key_filename) + self.client.wait(timeout=600) + + self.setup_done = True + + def _execute_command(self, cmd): + """Execute a command on target.""" + LOG.info("Executing: %s" % cmd) + status, stdout, stderr = self.client.execute(cmd) + if status: + raise RuntimeError("Failed executing command: ", + cmd, stderr) + return stdout + + def _filtrate_result(self, raw_result): + """Filtrate network utilization statistics.""" + fields = [] + maximum = {} + minimum = {} + average = {} + + time_marker = re.compile("^([0-9]+):([0-9]+):([0-9]+)$") + ampm_marker = re.compile("(AM|PM)$") + + # Parse network utilization stats + for row in raw_result.split('\n'): + line = row.split() + + if line and re.match(time_marker, line[0]): + if re.match(ampm_marker, line[1]): + del line[:2] + + if line[0] == 'IFACE': + # header fields + fields = line[1:] + if len(fields) != NetUtilization.\ + NET_UTILIZATION_FIELD_SIZE: + raise RuntimeError("network_utilization: unexpected\ + field size", fields) + else: + # value fields + net_interface = line[0] + values = line[1:] + + if values and len(values) == len(fields): + temp_dict = dict(zip(fields, values)) + if net_interface not in maximum: + maximum[net_interface] = temp_dict + else: + for item in temp_dict: + if float(maximum[net_interface][item]) <\ + float(temp_dict[item]): + maximum[net_interface][item] = \ + temp_dict[item] + + if net_interface not in minimum: + minimum[net_interface] = temp_dict + else: + for item in temp_dict: + if float(minimum[net_interface][item]) >\ + float(temp_dict[item]): + minimum[net_interface][item] = \ + temp_dict[item] + else: + raise RuntimeError("network_utilization: parse error", + fields, line) + + elif line and line[0] == 'Average:': + del line[:1] + + if line[0] == 'IFACE': + # header fields + fields = line[1:] + if len(fields) != NetUtilization.\ + NET_UTILIZATION_FIELD_SIZE: + raise RuntimeError("network_utilization average: \ + unexpected field size", fields) + else: + # value fields + net_interface = line[0] + values = line[1:] + if values and len(values) == len(fields): + average[net_interface] = dict(zip(fields, values)) + else: + raise RuntimeError("network_utilization average: \ + parse error", fields, line) + + return {'network_utilization_maximun': maximum, + 'network_utilization_minimum': minimum, + 'network_utilization_average': average} + + def _get_network_utilization(self): + """Get network utilization statistics using sar.""" + options = self.scenario_cfg["options"] + interval = options.get('interval', 1) + count = options.get('count', 1) + + cmd = "sudo sar -n DEV %d %d" % (interval, count) + + raw_result = self._execute_command(cmd) + result = self._filtrate_result(raw_result) + + return result + + def run(self, result): + """Read statistics.""" + if not self.setup_done: + self.setup() + + result.update(self._get_network_utilization()) diff --git a/yardstick/benchmark/scenarios/networking/sfc_openstack.py b/yardstick/benchmark/scenarios/networking/sfc_openstack.py index 2a5fbde1c..d1d45d8e4 100644 --- a/yardstick/benchmark/scenarios/networking/sfc_openstack.py +++ b/yardstick/benchmark/scenarios/networking/sfc_openstack.py @@ -1,5 +1,5 @@ import os -from novaclient.v2 import client as novaclient +from novaclient import client as novaclient from neutronclient.v2_0 import client as neutronclient diff --git a/yardstick/cmd/commands/plugin.py b/yardstick/cmd/commands/plugin.py index e65c818fa..8e3ddb5a5 100644 --- a/yardstick/cmd/commands/plugin.py +++ b/yardstick/cmd/commands/plugin.py @@ -50,6 +50,8 @@ class PluginCommands(object): print("Done, exiting") + @cliargs("input_file", type=str, help="path to plugin configuration file", + nargs=1) def do_remove(self, args): '''Remove a plugin.''' @@ -74,7 +76,7 @@ class PluginCommands(object): '''Deployment environment setup''' target_script = plugin_name + ".bash" self.script = pkg_resources.resource_filename( - 'yardstick.resources', 'script/install/' + target_script) + 'yardstick.resources', 'scripts/install/' + target_script) deployment_user = deployment.get("user") deployment_ip = deployment.get("ip") @@ -93,7 +95,7 @@ class PluginCommands(object): '''Deployment environment setup''' target_script = plugin_name + ".bash" self.script = pkg_resources.resource_filename( - 'yardstick.resources', 'script/remove/' + target_script) + 'yardstick.resources', 'scripts/remove/' + target_script) deployment_user = deployment.get("user") deployment_ip = deployment.get("ip") diff --git a/yardstick/resources/script/install/storperf.bash b/yardstick/resources/script/install/storperf.bash new file mode 100644 index 000000000..9bbec7206 --- /dev/null +++ b/yardstick/resources/script/install/storperf.bash @@ -0,0 +1,27 @@ +#!/bin/bash + +############################################################################## +# Copyright (c) 2016 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 +############################################################################## + +# StorPerf plugin installation script +# After installation, it will run StorPerf container on Jump Host +# Requirements: +# 1. docker has been installed on the Jump Host +# 2. Openstack environment file for storperf, '~/storperf_admin-rc', is ready. + +set -e + +mkdir -p /tmp/storperf-yardstick + +docker pull opnfv/storperf +docker run -t \ +--env-file ~/storperf_admin-rc \ +-p 5000:5000 -p 8000:8000 \ +-v /tmp/storperf-yardstick/carbon:/opt/graphite/storage/whisper \ +--name storperf-yardstick opnfv/storperf & diff --git a/yardstick/resources/script/remove/storperf.bash b/yardstick/resources/script/remove/storperf.bash new file mode 100644 index 000000000..a8eb51c89 --- /dev/null +++ b/yardstick/resources/script/remove/storperf.bash @@ -0,0 +1,20 @@ +#!/bin/bash + +############################################################################## +# Copyright (c) 2016 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 +############################################################################## + +# StorPerf plugin un-installation script + +set -e + +docker stop storperf-yardstick +docker rm -f storperf-yardstick +docker rmi opnfv/storperf + +rm -rf /tmp/storperf-yardstick diff --git a/yardstick/resources/script/install/sample.bash b/yardstick/resources/scripts/install/sample.bash index 21eb14680..21eb14680 100644 --- a/yardstick/resources/script/install/sample.bash +++ b/yardstick/resources/scripts/install/sample.bash diff --git a/yardstick/resources/script/remove/sample.bash b/yardstick/resources/scripts/remove/sample.bash index 15618df2d..15618df2d 100644 --- a/yardstick/resources/script/remove/sample.bash +++ b/yardstick/resources/scripts/remove/sample.bash |