diff options
170 files changed, 8026 insertions, 350 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c2e876b8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,62 @@ + +*.py[cod] +*$py.class + +# C extensions +*.so + +results/* +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec +*.pyc + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ +data/hosts +data/my_key.pem + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ @@ -1,7 +1,7 @@ Project Name: QTIP, Platform Performance Benchmarking Project Repository: QTIP Project Category: Integration & Testing -Etherpad: https://etherpad.opnfv.org/p/Qtip +Etherpad: https://etherpad.opnfv.org/p/qtip Jira: https://jira.opnfv.org/browse/QTIP Gerrit: https://gerrit.opnfv.org/gerrit/#/admin/projects/qtip GIT: https://git.opnfv.org/cgit/qtip/ @@ -9,19 +9,22 @@ Mailing list tag: [QTIP] IRC: #opnfv-qtip Project Wiki: https://wiki.opnfv.org/platform_performance_benchmarking - - Committers: -Wenjing Chu, wenjing_chu@dell.com -Shrinivas Chavan, shrinivas.chavan@ericsson.com -Sheng-Ann Yu sheng-ann.yu@ericsson.com -Rodriguez, Iben Iben.Rodriguez@spirent.com -Prabu, Kuppuswamy Prabu.Kuppuswamy@spirent.com -Cooper, Trevor trevor.cooper@intel.com -Michael Haugh mhaugh@ixiacom.com -Prakash Ramchandran Prakash.Ramchandran@huawei.com -Richomme, Morgan morgan.richomme@orange.com +Michael Haugh mhaugh@ixiacom.com +Morgan Richomme morgan.richomme@orange.com +Nauman Ahad nauman.ahad@xflowresearch.com +Prabu Kuppuswamy prabu.kuppuswamy@spirent.com +Prakash Ramchandran prakash.ramchandran@huawei.com +Trevor Cooper trevor.cooper@intel.com +Vikram Dham vikram@kamboi.com +Wenjing Chu chu.wenjing@gmail.com +Yujun Zhang zhang.yujunz@zte.com.cn + +Link to TSC approval of the project: +- http://meetbot.opnfv.org/meetings/opnfv-meeting/2015/opnfv-meeting.2015-01-27-14.59.html +Link(s) to approval of additional committers: +- http://lists.opnfv.org/pipermail/opnfv-tsc/2016-July/002745.html diff --git a/QTIP.sh b/QTIP.sh deleted file mode 100755 index 2a313420..00000000 --- a/QTIP.sh +++ /dev/null @@ -1,137 +0,0 @@ -#! /bin/bash - -WDIR=$PWD - - - -function Call_Test { - - case "$1" in - dhrystone) - mkdir $PWD/results/dhrystone - ansible-playbook -s $PWD/benchmarks/playbooks/dhrystone.yaml --extra-vars "Dest_dir=$PWD/results" -v - - ;; - - ramspeed) - mkdir $PWD/results/ramspeed - ansible-playbook -s $PWD/benchmarks/playbooks/ramspeedbench.yaml --extra-vars "Dest_dir=$PWD/results" -v - ;; - - cachebench) - mkdir $PWD/results/cachebench - ansible-playbook -s $PWD/benchmarks/playbooks/cachebench.yaml --extra-vars "Dest_dir=$PWD/results" -v - ;; - - whetstone) - mkdir $PWD/results/whetstone - ansible-playbook -s $PWD/benchmarks/playbooks/whetstone.yaml --extra-vars "Dest_dir=$PWD/results" -v - ;; - - *) - echo "Please pass a correct argument to test. use -h for more details" - ;; - esac - -} - -function Fetch_VM_Image { - - mkdir $PWD/Temp_Image - - file="$PWD/Temp_Image/Cent7Modified.qcow2" - if [ -f "$file" ] - then - echo "Image already downdloaded" - else - echo "Fetching QTIP_VM Image" - cd $PWD/Temp_Image && wget https://www.dropbox.com/s/3uswrydrvhxw3qm/Cent7Modified.qcow2 - echo "Uploading image to glance" - glance image-create --name "QTIP_CentOS" --is-public true --disk-format qcow2 \ - --container-format bare \ - --file $PWD/Temp_Image/Cent7Modified.qcow2 - - - fi - cd $WDIR -} -mkdir $PWD/results -case "$1" in - -h) - printf "To run test.sh, 2 arguments are required\n" - printf "First argument: The Test case to run\nOptions:\nFirst: For a comparison between a baremetal machine and a VM\nSecond: For a comparison between two baremetal machines\n\nSecond argument: The Benchmark to run\nOptions:\ndhrystone\nwhetstone\nramspeed\ncachebench\n" - ;; - First) - - Fetch_VM_Image - - ipvar=$(cat $PWD/Test-cases/Bare_vs_VM/Config.yaml | grep "Machine_1_IP" | awk '{print$2;}') - - - passwordvar=$(cat $PWD/Test-cases/Bare_vs_VM/Config.yaml | grep "Machine_1_Password" | awk '{print$2;}') - - expect $PWD/data/ssh_exch.exp $ipvar $passwordvar - heat stack-create exp2 -f $PWD/Test-cases/Bare_vs_VM/SampleHeat.yaml - sleep 3 - VAR1=$( heat stack-show exp2 | grep "stack_status_reason" | awk '{print $6;}') - echo $VAR1 - while [ "$VAR1" != completed ] - do - echo VM is coming up - VAR1=$( heat stack-show exp2 | grep "stack_status_reason" | awk '{print $6;}') - #echo $VAR1 - done - echo VM Created - - if [ "$VAR1" == "completed" ]; then - VAR=$( heat stack-show exp2 | grep "output_value" | awk '{print $4;}'| cut -d '"' -f2) - - echo IP of VM is: - echo $VAR - - sed -i '/demo1/a '$VAR'' /etc/ansible/hosts - sed -i '/demo1/a '$ipvar'' /etc/ansible/hosts - - - - echo Waiting for ping - while ! ping -c1 $VAR &> /dev/null; do - echo Waiting for ping - done - - echo Ping detected - expect $PWD/data/ssh_exch.exp $VAR - Call_Test $2 - - echo cleaning environment - sleep 10 - $PWD/clean.sh - - - fi - - ;; - Second) - - ipvar=$(cat $PWD/Test-cases/Bare_vs_Bare/Config.yaml | grep "Machine_1_IP" | awk '{print$2;}') - echo $ipvar - passwordvar=$(cat $PWD/Test-cases/Bare_vs_Bare/Config.yaml | grep "Machine_1_IP_Password" | awk '{print$2;}') - echo $passwordvar - expect $PWD/data/ssh_exch.exp $ipvar $passwordvar - sed -i '/demo1/a '$ipvar'' /etc/ansible/hosts - ipvar=$(cat $PWD/Test-cases/Bare_vs_Bare/Config.yaml | grep "Machine_2_IP" | awk '{print$2;}') - passwordvar=$(cat $PWD/Test-cases/Bare_vs_Bare/Config.yaml | grep "Machine_2_IP_Password" | awk '{print$2;}') - expect $PWD/data/ssh_exch.exp $ipvar $passwordvar - sed -i '/demo1/a '$ipvar'' /etc/ansible/hosts - Call_Test $2 - echo cleaning environment - sleep 10 - $PWD/clean.sh - ;; - - *) - echo Incorrect Arguments passed to the script. Run script with -h for more help - ;; -esac - - @@ -1,51 +1,71 @@ -QTIP Benchmark sutie +QTIP Benchmark Suite --------------------- +QTIP is a benchmarking suite intended to benchmark the following components of the OPNFV Platform: -QTIP is a benchmarking suite intendend to benchmark the following components of the OPNF Plaform: 1. Computing components 2. Networking components 3. Storage components The efforts in QTIP are mostly focused on identifying + 1. Benchmarks to run 2. Test cases in which these benchmarks to run 3. Automation of suite to run benchmarks within different test cases 4. Collection of test results +QTIP Framework can now be called: (qtip.py). +The Framework can run 5 computing benchmarks: -QTIP currently consists of a bash script (QTIP.sh). - -The script can run 4 comuting benchmarks: 1. Dhrystone 2. Whetstone 3. RamBandwidth -4. Cachebandwidth +4. SSL +5. nDPI These benchmarks can be run in 2 test cases: + 1. VM vs Baremetal -2. Baremetal vs Baremeatl +2. Baremetal vs Baremetal Instructions to run the script: -1. Download the OpenStack adminrc file for the deployment on which you want to create the VM for benchmarking -2. run ./QTIP {TEST CASE} {BENCHMARK} -3. ./QTIP.sh -h for more help -Requirments: +1. Download and source the OpenStack `adminrc` file for the deployment on which you want to create the VM for benchmarking +2. run `python qtip.py -s {SUITE} -b {BENCHMARK}` +3. run `python qtip.py -h` for more help +4. list of benchmarks can be found in the `qtip/test_cases` directory +5. SUITE refers to compute, network or storage + +Requirements: + 1. Ansible 1.9.2 2. Python 2.7 - +3. PyYAML Configuring Test Cases: -Test cases can be found within the Test-cases directory. +Test cases can be found within the `test_cases` directory. For each Test case, a Config.yaml file contains the details for the machines upon which the benchmarks would run. -Edit the IP and the Password fields within the files for the machines on which the benchmark is to run. -A robust framework that would allow to include more tests would be included within the future +Edit the IP and the Password fields within the files for the machines on which the benchmark is to run. +A robust framework that would allow to include more tests would be included within the future. + +Jump Host requirements: +The following packages should be installed on the server from which you intend to run QTIP. +1: Heat Client +2: Glance Client +3: Nova Client +4: Neutron Client +5: wget +6: PyYaml +Networking +1: The Host Machines/compute nodes to be benchmarked should have public/access network +2: The Host Machines/compute nodes should allow Password Login +QTIP support for Foreman +{TBA} diff --git a/Test-cases/Bare_vs_Bare/Config.yaml b/Test-cases/Bare_vs_Bare/Config.yaml deleted file mode 100644 index 6612cbdc..00000000 --- a/Test-cases/Bare_vs_Bare/Config.yaml +++ /dev/null @@ -1,4 +0,0 @@ -Machine_1_IP: 172.18.0.17 -Machine_1_Password: Op3nStack -Machine_2_IP: 172.18.0.16 -Machine_2_Password: Op3nStack diff --git a/Test-cases/Bare_vs_VM/Config.yaml b/Test-cases/Bare_vs_VM/Config.yaml deleted file mode 100644 index e410a632..00000000 --- a/Test-cases/Bare_vs_VM/Config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -Machine_1_IP: 172.18.0.17 -Machine_1_Password: Op3nStack diff --git a/Test-cases/Bare_vs_VM/SampleHeat.yaml b/Test-cases/Bare_vs_VM/SampleHeat.yaml deleted file mode 100644 index 6ee76ac0..00000000 --- a/Test-cases/Bare_vs_VM/SampleHeat.yaml +++ /dev/null @@ -1,93 +0,0 @@ - heat_template_version: 2014-10-16 - - description: Test10 - - parameters: - - public_network: - type: string - label: Public Network name or ID - description: Public network with floating IPs - default: "provider_network" - - private_net_name: - type: string - default: "private_network" - - availability_zone: - type: string - description: The Availability Zone to launch the instance. - default: compute1 - - resources: - - private_network: - type: OS::Neutron::Net - - - private_subnet: - type: OS::Neutron::Subnet - properties: - network_id: { get_resource: private_network } - cidr: 10.10.17.0/24 - dns_nameservers: - - 8.8.8.8 - - router_1: - type: OS::Neutron::Router - properties: - external_gateway_info: - network: { get_param: public_network } - - router_interface: - type: OS::Neutron::RouterInterface - properties: - router_id: { get_resource: router_1 } - subnet: { get_resource: private_subnet } - - public_port: - type: OS::Neutron::Port - properties: - network: { get_resource: private_network } - security_groups: [{ get_resource: demo1_security_Group }] - - floating_ip: - type: OS::Neutron::FloatingIP - properties: - floating_network: { get_param: public_network } - - floating_ip_assoc: - type: OS::Neutron::FloatingIPAssociation - properties: - floatingip_id: { get_resource: floating_ip } - port_id: { get_resource: public_port } - - demo1_security_Group: - type: OS::Neutron::SecurityGroup - properties: - name: demo1_security_Group - rules: - - protocol: tcp - port_range_min: 22 - port_range_max: 22 - - protocol: icmp - - my_instance: - type: OS::Nova::Server - properties: - image: QTIP_CentOS7 - flavor: m1.large - availability_zone: { get_param: availability_zone } - networks: - - port: { get_resource: public_port } - - - - outputs: - instance_ip: - description: IP address of the instance - value: { get_attr: [floating_ip, floating_ip_address] } - - - - diff --git a/benchmarks/fio_jobs/test_job b/benchmarks/fio_jobs/test_job new file mode 100644 index 00000000..6817abca --- /dev/null +++ b/benchmarks/fio_jobs/test_job @@ -0,0 +1,13 @@ +[global] + +runtime= 600 +ioengine=libaio +iodepth=2 +direct=1 +bs=4k +rw=randrw + +[job1] +size=5G + + diff --git a/benchmarks/playbooks/cachebench.yaml b/benchmarks/playbooks/cachebench.yaml index d0e04140..ebd0e172 100644 --- a/benchmarks/playbooks/cachebench.yaml +++ b/benchmarks/playbooks/cachebench.yaml @@ -1,5 +1,5 @@ - - hosts: demo1 + - hosts: "{{ roles }}" tasks: - name: clean @@ -33,6 +33,6 @@ shell: (cd /root/results/; find . -maxdepth 1 -type f) | cut -d'/' -f2 register: files_to_copy - name: copy results - fetch: src=/root/results/{{item}} dest={{Dest_dir}}/cachebench + fetch: src=/root/results/{{item}} dest={{workingdir}}/{{Dest_dir}}/cachebench with_items: files_to_copy.stdout_lines diff --git a/benchmarks/playbooks/dhrystone.yaml b/benchmarks/playbooks/dhrystone.yaml index d0e5f20d..82b24dd1 100644 --- a/benchmarks/playbooks/dhrystone.yaml +++ b/benchmarks/playbooks/dhrystone.yaml @@ -1,31 +1,107 @@ - - - hosts: demo1 + - hosts: 127.0.0.1 + connection: local + tasks: + - name: making dhrystone directory + file: path={{workingdir}}/{{Dest_dir}}/dhrystone/dhrystone_temp state=directory + - name: making temporary dhrystone directory + file: path={{workingdir}}/{{Dest_dir}}/dhrystone/dhrystone_temp state=directory + - hosts: "{{role}}" + become: yes + remote_user: "{{username}}" tasks: - - name: cleaning - file: path=/root/tempT state=absent - - name: cleaning results - file: path=/root/results state=absent - - name: Installing UnixBench dependencies - shell: yum install git gcc patch perl-Time-HiRes -y + - name: checking_home directory + shell: sudo echo $HOME + register: home_dir + + - name: cleaning tempT + shell: sudo rm -rf $HOME/tempT + + - name: cleaning_qtip_result + shell: sudo rm -rf $HOME/qtip_result + + - name: make directory + shell: sudo mkdir $HOME/qtip_result + + - include: ./sys_proxy_pbook.yaml + + - include: ./sys_info_pbook.yaml + vars: + network: false + + - name: Installing UnixBench dependencies if CentOS + shell: sudo yum install git gcc patch perl-Time-HiRes -y + when: ansible_os_family == "RedHat" + + - name: Installing UnixBench dependencies if Ubuntu + shell: sudo apt-get install git gcc patch perl -y + when: ansible_os_family == "Debian" + + - include: ./git_proxy_pbook.yaml + - name: Clone unixbench - shell: git clone https://github.com/kdlucas/byte-unixbench.git /root/tempT + shell: git clone https://github.com/kdlucas/byte-unixbench.git $HOME/tempT + - name: make - shell: make --directory /root/tempT/UnixBench/ + shell: sudo make --directory $HOME/tempT/UnixBench/ + - name: downloading_patch - shell: cd /root/tempT/UnixBench/ && wget https://www.dropbox.com/s/11z85gfu0trkhus/fix-limitation.patch + shell: cd $HOME/tempT/UnixBench/ && sudo wget https://www.dropbox.com/s/11z85gfu0trkhus/fix-limitation.patch + - name: applying_patch - shell: cd /root/tempT/UnixBench/ && patch Run fix-limitation.patch + shell: cd $HOME/tempT/UnixBench/ && sudo patch Run fix-limitation.patch + - name: Run dhrystone - shell: cd /root/tempT/UnixBench/&&./Run -v dhrystone + shell: cd $HOME/tempT/UnixBench/&& sudo ./Run -v dhrystone + + - name: collecting and transforming result script copy + copy: src=./result_transform/ubench_transform.py dest={{home_dir.stdout}}/qtip_result/ + + - name: transforming result + shell: cd $HOME/qtip_result/ && sudo python ubench_transform.py + - name: copying consolidated report script + copy: src=./result_transform/final_report.py dest={{home_dir.stdout}}/qtip_result/ + + - name: making consolidated report + shell: cd $HOME/qtip_result && sudo python final_report.py Dhrystone {{fname}} + - name: making directory - file: path=/root/results state=directory + file: path={{home_dir.stdout}}/qtip_result/log state=directory + - name: copying result to temp directory - shell: cp -r /root/tempT/UnixBench/results/* /root/results/ + shell: sudo cp -r $HOME/tempT/UnixBench/results/* $HOME/qtip_result/log/ + - name: registering files - shell: (cd /root/results/; find . -maxdepth 1 -type f) | cut -d'/' -f2 + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.json") | cut -d'/' -f2 register: files_to_copy + - name: copy results - fetch: src=/root/results/{{item}} dest={{Dest_dir}}/dhrystone - with_items: files_to_copy.stdout_lines + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/dhrystone/dhrystone_temp + with_items: files_to_copy.stdout_lines + - name: registering log files + shell: (cd $HOME/qtip_result/log/; find . -maxdepth 1 -name "*.log") | cut -d'/' -f2 + register: copy_log_results + + - name: copying log results + fetch: src={{home_dir.stdout}}/qtip_result/log/{{item}} dest={{workingdir}}/{{Dest_dir}}/dhrystone/dhrystone_temp + with_items: copy_log_results.stdout_lines + + - name: cleaning tempT + shell: sudo rm -rf $HOME/tempT + + - name: cleaning_qtip_result + shell: sudo rm -rf $HOME/qtip_result + + + - hosts: 127.0.0.1 + connection: local + tasks: + - name: extracting_json + shell: ( find {{workingdir}}/{{Dest_dir}}/dhrystone/dhrystone_temp/ -name "*.json" | xargs cp -t {{workingdir}}/{{Dest_dir}}/dhrystone/) + - name: making_logs_folder + shell: mkdir -p {{workingdir}}/{{Dest_dir}}/dhrystone/logs + - name: extracting_log + shell: ( find {{workingdir}}/{{Dest_dir}}/dhrystone/dhrystone_temp/ -name "*.log" | xargs cp -t {{workingdir}}/{{Dest_dir}}/dhrystone/logs) + - name: removing dhrystone_temp + shell: rm -rf {{workingdir}}/{{Dest_dir}}/dhrystone/dhrystone_temp diff --git a/benchmarks/playbooks/dpi.yaml b/benchmarks/playbooks/dpi.yaml new file mode 100644 index 00000000..f4e6de8d --- /dev/null +++ b/benchmarks/playbooks/dpi.yaml @@ -0,0 +1,110 @@ + - hosts: 127.0.0.1 + connection: local + tasks: + - name: making dpi directory + file: path={{workingdir}}/{{Dest_dir}}/dpi state=directory + - name: making temporary whetstone directory + file: path={{workingdir}}/{{Dest_dir}}/dpi/dpi_temp state=directory + + - hosts: "{{role}}" + become: yes + remote_user: "{{username}}" + tasks: + - name: echo + shell: echo $USER + + - name: checking_home directory + shell: echo $HOME + register: home_dir + + - name: cleaning + shell: sudo rm -rf $HOME/tempD + + - name: cleaning previous results + shell: sudo rm -rf $HOME/qtip_result + + - name: make qtip_result + shell: sudo mkdir $HOME/qtip_result + + - include: ./sys_proxy_pbook.yaml + + - include: ./sys_info_pbook.yaml + vars: + network: false + + - name: Installing nDPI dependencies if CentOS + shell: sudo yum install git gcc patch perl-Time-HiRes autofconf automake libpcap-devel libtool -y + when: ansible_os_family == "RedHat" + + - name: Installing nDPI dependcies if Ubuntu + shell: sudo apt-get install git gcc patch autoconf automake libpcap-dev libtool -y + when: ansible_os_family == "Debian" + + - name: making nDPI temporary directory + shell: sudo mkdir $HOME/tempD + + - include: ./git_proxy_pbook.yaml + + - name: Clone nDPI + shell: cd $HOME/tempD && git clone https://github.com/ntop/nDPI.git + + - name: autogen + shell: cd $HOME/tempD/nDPI && sudo ./autogen.sh + + - name: configure + shell: cd $HOME/tempD/nDPI && sudo ./configure + + - name: make + shell: cd $HOME/tempD/nDPI && sudo make + + - name: Fetching Test_pcap file + shell: cd $HOME/tempD/nDPI/example && wget http://artifacts.opnfv.org/qtip/utilities/test.pcap + + - name: fetch Averaging script + copy: src=./result_transform/dpi/dpi_average.sh dest={{home_dir.stdout}}/tempD/nDPI/example mode=777 + + - name: Run nDPI benchmark + shell: cd $HOME/tempD/nDPI/example && sudo ./dpi_average.sh + + - name: copy result to temp_direc + shell: sudo cp $HOME/tempD/nDPI/example/dpi_dump.txt $HOME/qtip_result + + - name: fetch dpi result transform script + copy: src=./result_transform/dpi/dpi_transform.py dest={{home_dir.stdout}}/qtip_result + + - name: Transforming results + shell: cd $HOME/qtip_result && sudo python dpi_transform.py + + - name: copy report formation script + copy: src=./result_transform/final_report.py dest={{home_dir.stdout}}/qtip_result + + - name: consolidating report + shell: cd $HOME/qtip_result && sudo python final_report.py DPI {{fname}} + + - name: registering files + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.json") | cut -d'/' -f2 + register: files_to_copy + + - name: copy results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/dpi/dpi_temp + with_items: files_to_copy.stdout_lines + + - name: registering log files + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.log") | cut -d'/' -f2 + register: copy_log_results + + - name: copying log results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/dpi/dpi_temp + with_items: copy_log_results.stdout_lines + + - hosts: 127.0.0.1 + connection: local + tasks: + - name: extracting_json + shell: ( find {{workingdir}}/{{Dest_dir}}/dpi/dpi_temp/ -name "*.json" | xargs cp -t {{workingdir}}/{{Dest_dir}}/dpi/) + - name: making_logs_folder + shell: mkdir -p {{workingdir}}/{{Dest_dir}}/dpi/logs + - name: extracting_log + shell: ( find {{workingdir}}/{{Dest_dir}}/dpi/dpi_temp/ -name "*.log" | xargs cp -t {{workingdir}}/{{Dest_dir}}/dpi/logs) + - name: removing dpi_temp + shell: rm -rf {{workingdir}}/{{Dest_dir}}/dpi/dpi_temp diff --git a/benchmarks/playbooks/fio.yaml b/benchmarks/playbooks/fio.yaml new file mode 100644 index 00000000..3de237f2 --- /dev/null +++ b/benchmarks/playbooks/fio.yaml @@ -0,0 +1,96 @@ + - hosts: 127.0.0.1 + connection: local + tasks: + - name: making fio directory + file: path={{workingdir}}/{{Dest_dir}}/fio state=directory + - name: making temporary fio directory + file: path={{workingdir}}/{{Dest_dir}}/fio/fio_temp state=directory + + + - hosts: "{{role}}" + become: yes + remote_user: "{{username}}" + tasks: + - name: checking_home directory + shell: echo $HOME + register: home_dir + + - name: cleaning + shell: sudo rm -rf $HOME/fio + + - name: cleaning previous results + shell: sudo rm -rf $HOME/qtip_result + + - name: making fio temporary directory + shell: sudo mkdir $HOME/fio + + - name: making results temporary directory + shell: sudo mkdir $HOME/qtip_result + + - include: ./sys_proxy_pbook.yaml + + - include: ./sys_info_pbook.yaml + vars: + network: false + + - name: Installing fio dependencies when CentOS + shell: sudo yum install wget gcc libaio-devel -y + when: ansible_os_family == "RedHat" + + - name: Installing fio dependencies when Ubuntu + shell: sudo apt-get install wget gcc libaio-dev -y + when: ansible_os_family == "Debian" + + - name: Fetching fio + shell: cd $HOME/fio/ && wget http://freecode.com/urls/3aa21b8c106cab742bf1f20d60629e3f -O fio.tar.gz + - name: Untar fio + shell: cd $HOME/fio/ && sudo tar -zxvf fio.tar.gz + - name: configure + shell: cd $HOME/fio/fio-2.1.10 && sudo ./configure && sudo make + + - name: Fetching fio job + copy: src=./../fio_jobs/test_job dest={{home_dir.stdout}}/fio/fio-2.1.10/ + + - name: Benchmarking block storage through fio + shell: cd $HOME/fio/fio-2.1.10 && sudo ./fio --output-format=json --output=$HOME/qtip_result/fio_result.json test_job + + - name: Fetching result transformation script + copy: src=./result_transform/fio/fio_result_transform.py dest={{home_dir.stdout}}/qtip_result + + - name: Transforming result + shell: cd $HOME/qtip_result && sudo python fio_result_transform.py + + - name: copy report formation script + copy: src=./result_transform/final_report.py dest={{home_dir.stdout}}/qtip_result + + - name: consolidating report + shell: cd $HOME/qtip_result && sudo python final_report.py FIO {{fname}} + + - name: registering files + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.json") | cut -d'/' -f2 + register: files_to_copy + + - name: copy results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/fio/fio_temp + with_items: files_to_copy.stdout_lines + + - name: registering log files + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.log") | cut -d'/' -f2 + register: copy_log_results + + - name: copying log results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/fio/fio_temp + with_items: copy_log_results.stdout_lines + + - hosts: 127.0.0.1 + connection: local + tasks: + - name: extracting_json + shell: ( find {{workingdir}}/{{Dest_dir}}/fio/fio_temp/ -name "*.json" | xargs cp -t {{workingdir}}/{{Dest_dir}}/fio/) + - name: making_logs_folder + shell: mkdir -p {{workingdir}}/{{Dest_dir}}/fio/logs + - name: extracting_log + shell: ( find {{workingdir}}/{{Dest_dir}}/fio/fio_temp/ -name "*.log" | xargs cp -t {{workingdir}}/{{Dest_dir}}/fio/logs) + - name: removing fio_log + shell: rm -rf {{workingdir}}/{{Dest_dir}}/fio/fio_temp + diff --git a/benchmarks/playbooks/git_proxy_pbook.yaml b/benchmarks/playbooks/git_proxy_pbook.yaml new file mode 100644 index 00000000..6d155a76 --- /dev/null +++ b/benchmarks/playbooks/git_proxy_pbook.yaml @@ -0,0 +1,12 @@ + +#git +- name: set git proxy(http) + shell: "git config --global http.proxy {{ http_proxy }}" + when: http_proxy is defined + ignore_errors: yes + +- name: set git proxy(https) + shell: "git config --global https.proxy {{https_proxy}}" + when: https_proxy is defined + ignore_errors: yes + diff --git a/benchmarks/playbooks/info_script/info_collect.py b/benchmarks/playbooks/info_script/info_collect.py new file mode 100644 index 00000000..4daed318 --- /dev/null +++ b/benchmarks/playbooks/info_script/info_collect.py @@ -0,0 +1,87 @@ +import os +import pickle +import json +import sys + +os.system('inxi -b -c0 -n > $PWD/est_2') +est_ob = open("est_2", "r+") +est_ob2 = open("est_1", "w+") +in_string = est_ob.read().replace('\n', ' ') +cpu_idle = float(os.popen("""top -bn1 | grep "Cpu(s)" | awk '{print $8}'""").read().rstrip()) +cpu_usage = 100 - cpu_idle +est_ob2.write(in_string) +est_ob.close() +est_ob2.close() + +Info_dict = {} +inxi_host = os.popen("""cat $PWD/est_1 | grep -o -P '(?<=Host:).*(?=Kernel)' """).read().lstrip().rstrip() +inxi_mem = os.popen("""cat $PWD/est_1 | grep -o -P '(?<=Memory:).*(?=MB)' """).read().lstrip().rstrip() + "MB" +inxi_cpu = os.popen("""cat $PWD/est_1 | grep -o -P '(?<=CPU).*(?=speed)' | cut -f2 -d':'""").read().lstrip().rstrip() +inxi_distro = os.popen(""" cat $PWD/est_1 | grep -o -P '(?<=Distro:).*(?=Machine:)' """).read().rstrip().lstrip() +inxi_kernel = os.popen(""" cat $PWD/est_1 | grep -o -P '(?<=Kernel:).*(?=Console:)' """).read().rstrip().lstrip() +inxi_HD = os.popen(""" cat $PWD/est_1 | grep -o -P '(?<=HDD Total Size:).*(?=Info:)' """).read().rstrip().lstrip() +inxi_product = os.popen(""" cat $PWD/est_1 | grep -o -P '(?<=product:).*(?=Mobo:)' """).read().rstrip().lstrip() + +Info_dict['1_Hostname'] = inxi_host +Info_dict['2_Product'] = inxi_product +Info_dict['3_OS Distribution'] = inxi_distro +Info_dict['4_Kernel'] = inxi_kernel +Info_dict['5_CPU'] = inxi_cpu +Info_dict['6_CPU_Usage'] = str(round(cpu_usage, 3)) + '%' +Info_dict['7_Memory Usage'] = inxi_mem +Info_dict['8_Disk usage'] = inxi_HD +network_flag = str(sys.argv[1]).rstrip() + +if (network_flag == 'n'): + + Info_dict['9_Network_Interfaces'] = {} + tem_2 = """ cat $PWD/est_1 | grep -o -P '(?<=Network:).*(?=Info:)'""" + print os.system(tem_2 + ' > Hello') + i = int(os.popen(tem_2 + " | grep -o 'Card' | wc -l ").read()) + print i + + for x in range(1, i + 1): + tem = """ cat $PWD/est_1 | grep -o -P '(?<=Card-""" + str(x) + """:).*(?=Card-""" + str(x + 1) + """)'""" + if i == 1: + tem = """ cat $PWD/est_1 | grep -o -P '(?<=Network:).*(?=Info:)'""" + inxi_card_1 = ((os.popen(tem + " | grep -o -P '(?<=Card:).*(?=Drives:)'|sed 's/ *driver:.*//'").read().rstrip().lstrip())) + print inxi_card_1 + Info_dict['9_Network_Interfaces']['Interface_' + str(x)] = {} + Info_dict['9_Network_Interfaces']['Interface_' + str(x)]['1_Network_Card'] = inxi_card_1 + inxi_card_2 = ((os.popen(tem + "| grep -o -P '(?<=Card:).*(?=Drives:)'|sed -e 's/^.*IF: //'").read())).rstrip().lstrip() + Info_dict['9_Network_Interfaces']['Interface_' + str(x)]['2_Interface_info'] = inxi_card_2 + elif x < (i): + print "two" + inxi_card_1 = ((os.popen(tem + "| sed 's/ *driver:.*//'").read().rstrip().lstrip())) + Info_dict['9_Network_Interfaces']['Interface_' + str(x)] = {} + Info_dict['9_Network_Interfaces']['Interface_' + str(x)]['1_Network_Card'] = inxi_card_1 + inxi_card_2 = ((os.popen(tem + "|sed -e 's/^.*IF: //'").read())).rstrip().lstrip() + Info_dict['9_Network_Interfaces']['Interface_' + str(x)]['2_Interface_info'] = inxi_card_2 + elif x == i: + print "Three" + Info_dict['9_Network_Interfaces']['Interface_' + str(x)] = {} + inxi_card_1 = ((os.popen(""" cat $PWD/est_1 | grep -o -P '(?<=Card-""" + str(x) + """:).*(?=Drives:)'| sed 's/ *driver:.*//' """).read().rstrip().lstrip())) + Info_dict['9_Network_Interfaces']['Interface_' + str(x)]['1_Network_Card'] = inxi_card_1 + inxi_card_2 = ((os.popen(""" cat $PWD/est_1 | grep -o -P '(?<=Card-""" + str(x) + """:).*(?=Drives:)'| sed -e 's/^.*IF: //' """).read().rstrip().lstrip())) + Info_dict['9_Network_Interfaces']['Interface_' + str(x)]['2_Interface_info'] = inxi_card_2 + else: + print "No network cards" + os.system("bwm-ng -o plain -c 1 | grep -v '=' | grep -v 'iface' | grep -v '-' > bwm_dump") + n_interface = int(os.popen(" cat bwm_dump | grep -v 'total' | wc -l ").read().rstrip()) + interface = {} + for x in range(1, n_interface): + interface_name = os.popen(" cat bwm_dump | awk 'NR==" + str(x) + "' | awk '{print $1}' ").read().rstrip().replace(':', '') + interface[str(interface_name)] = {} + interface[str(interface_name)]['Rx (KB/s)'] = os.popen(" cat bwm_dump | awk 'NR==" + str(x) + "' | awk '{print $2}' ").read().rstrip() + interface[str(interface_name)]['Tx (KB/s)'] = os.popen(" cat bwm_dump | awk 'NR==" + str(x) + "' | awk '{print $4}' ").read().rstrip() + interface[str(interface_name)]['Total (KB/s)'] = os.popen(" cat bwm_dump | awk 'NR== " + str(x) + "' | awk '{print $6}' ").read().rstrip() + + Info_dict['10.Interface I/O'] = interface + +print Info_dict + +with open('./sys_info_temp', 'w+')as out_info: + pickle.dump(Info_dict, out_info) + +with open('temp', 'w+') as result_json: + json.dump(Info_dict, result_json, indent=4, sort_keys=True) diff --git a/benchmarks/playbooks/iperf.yaml b/benchmarks/playbooks/iperf.yaml new file mode 100644 index 00000000..de1e5a4d --- /dev/null +++ b/benchmarks/playbooks/iperf.yaml @@ -0,0 +1,150 @@ + - hosts: 127.0.0.1 + connection: local + tasks: + + - name: getting directory + shell: sudo echo $PWD + register: qtip_dir + - name: making Iperf directory + file: path={{workingdir}}/{{Dest_dir}}/iperf state=directory + - name: making temporary iperf directory + file: path={{workingdir}}/{{Dest_dir}}/iperf/iperf_temp state=directory + + + - hosts: "{{role}}" + become: yes + remote_user: "{{username}}" + tasks: + - name: Rolename + set_fact: + rolename: "{{role}}" + when: role is defined + + - name: installertype + set_fact: + installertype: "{{installer}}" + + - name: Get Hostname + shell: echo $HOSTNAME + register: hostID + + - name: echo + shell: echo index_var + + - name: checking_home directory + shell: echo $HOME + register: home_dir + + - name: cleaning + shell: sudo rm -rf $HOME/iperf + + - name: cleaning previous results + shell: sudo rm -rf $HOME/qtip_result + + - name: making Iperf temporary directory + shell: sudo mkdir $HOME/iperf + + - name: making results temporary directory + shell: sudo mkdir $HOME/qtip_result + + - include: ./sys_proxy_pbook.yaml + + - include: ./sys_info_pbook.yaml + vars: + network: true + + - name: Installing Epel-release when CentOS + shell: sudo yum install epel-release -y + when: ansible_os_family == "RedHat" + + - name: Allow iperf server port in iptables input rules + shell: iptables -A INPUT -p tcp --dport {{iperf_port}} -j ACCEPT + vars: + iperf_port: 5201 + ignore_errors: yes + when: rolename == "1-server" and installertype == 'fuel' + + - name: Installing IPERF when Ubuntu + shell: sudo apt-get install iperf3 -y + when: ansible_os_family == "Debian" + + - name: Installing Iperf3 + shell: sudo yum install iperf3 -y + when: ansible_os_family == "RedHat" + + - name: Running iperf on server + shell: iperf3 -s + async: 400 + poll: 0 + when: rolename == "1-server" + + - name: Running Iperf on Host + shell: iperf3 --time {{duration}} -b 0 G -c {{ip1}} -J -O10 >> {{home_dir.stdout}}/qtip_result/iperf_raw.json + ignore_errors: yes + with_items: + - "{{ip1}}" + when: rolename == "2-host" and "{{privateip1}}" == "NONE" + + - name: Running Iperf on Host + shell: iperf3 --time {{duration}} -b 0 G -c {{privateip1}} -J -O10 >> {{home_dir.stdout}}/qtip_result/iperf_raw.json + ignore_errors: yes + with_items: + - "{{ip1}}" + when: rolename == "2-host" and "{{privateip1}}" != "NONE" + + - name: Fetching result transformation script + copy: src=./result_transform/iperf/iperf_transform.py dest={{home_dir.stdout}}/qtip_result + - name: Transforming result + + shell: cd $HOME/qtip_result && sudo python iperf_transform.py + when: rolename =="2-host" and "{{ip2}}" == '' + + - name: copy report formation script + copy: src=./result_transform/final_report.py dest={{home_dir.stdout}}/qtip_result + when: rolename =="2-host" and "{{ip2}}" == '' + + - name: consolidating report + shell: cd $HOME/qtip_result && sudo python final_report.py IPERF {{fname}} + when: rolename =="2-host" and "{{ip2}}" == '' + + - name: Files to Copy + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.json") | cut -d'/' -f2 + register: files_to_copy + when: rolename =="2-host" and "{{ip2}}" == '' + + - name: copy results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/iperf/iperf_temp + with_items: files_to_copy.stdout_lines + when: rolename =="2-host" and "{{ip2}}" == '' + + - name: registering log files + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.log") | cut -d'/' -f2 + register: copy_log_results + when: rolename =="2-host" and "{{ip2}}" == '' + + - name: copying log results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/iperf/iperf_temp + with_items: copy_log_results.stdout_lines + when: rolename =="2-host" and "{{ip2}}" == '' + + + - hosts: 127.0.0.1 + connection: local + tasks: + - name: Rolename + set_fact: + rolename: "{{role}}" + when: role is defined + - name: extracting_json + shell: ( find {{workingdir}}/{{Dest_dir}}/iperf/iperf_temp/ -name "*.json" | xargs cp -t {{workingdir}}/{{Dest_dir}}/iperf/) + when: rolename == "2-host" + - name: making_logs_folder + shell: mkdir -p {{workingdir}}/{{Dest_dir}}/iperf/logs + - name: extracting_log + shell: ( find {{workingdir}}/{{Dest_dir}}/iperf/iperf_temp/ -name "*.log" | xargs cp -t {{workingdir}}/{{Dest_dir}}/iperf/logs) + when: rolename == "2-host" + - name: removing iperf_raw file + shell: rm -rf {{workingdir}}/{{Dest_dir}}/iperf/iperf_raw.json + when: rolename == "2-host" + - name: removing iperf_temp + shell: rm -rf {{workingdir}}/{{Dest_dir}}/iperf/iperf_temp diff --git a/benchmarks/playbooks/netperf.yaml b/benchmarks/playbooks/netperf.yaml new file mode 100644 index 00000000..30f4b574 --- /dev/null +++ b/benchmarks/playbooks/netperf.yaml @@ -0,0 +1,79 @@ + - hosts: 127.0.0.1 + connection: local + tasks: + + - name: getting directory + shell: echo $PWD + register: qtip_dir + - name: making Netperf directory + file: path={{workingdir}}/{{Dest_dir}}/netperf state=directory + - name: making temporary netperf directory + file: path={{workingdir}}/{{Dest_dir}}/netperf/netperf_temp state=directory + + + - hosts: "{{role}}" + become: yes + remote_user: "{{username}}" + + tasks: + - name: Rolename + set_fact: + rolename: "{{role}}" + when: role is defined + + - name: Get Hostname + shell: echo $HOSTNAME + register: hostID + - name: checking_home directory + shell: echo $HOME + register: home_dir + - name: cleaning + shell: rm -rf $HOME/netperf + - name: cleaning previous results + shell: rm -rf $HOME/qtip_result + - name: making netperf temporary directory + shell: mkdir $HOME/netperf + - name: making results temporary directory + shell: mkdir $HOME/qtip_result + + - name: Fetching netperf + shell: wget ftp://ftp.netperf.org/netperf/netperf-2.7.0.tar.gz + when: ansible_os_family == "RedHat" + - name: Extracting Netperf + shell: tar -xvf netperf-2.7.0.tar.gz + - name: configuring netperf + shell: cd $HOME/netperf-2.7.0 && ./configure + - name: Making Netperf + shell: cd $HOME/netperf-2.7.0 && make + - name: Installing Netperf + shell: cd $HOME/netperf-2.7.0 && make install + + - name: Running netperf on server + shell: /usr/local/bin/netserver -p 4000 + when: rolename == "1-server" + + - name: Running netperf on Host + shell: /usr/local/bin/netperf -H {{privateip1}} -p 4000 -l {{duration}} -t {{teststream}} -fG >> ./qtip_result/server{{hostID.stdout}}-{{item}}.json + ignore_errors: yes + with_items: + - "{{ip1}}" + when: rolename == "2-host" and "{{ip2}}" == '' + + - name: Files to Copy + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.json") | cut -d'/' -f2 + register: files_to_copy + - name: copy results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/netperf/netperf_temp + with_items: files_to_copy.stdout_lines + - hosts: 127.0.0.1 + connection: local + tasks: + - name: Rolename + set_fact: + rolename: "{{role}}" + when: role is defined + - name: extracting_json + shell: ( find {{workingdir}}/{{Dest_dir}}/netperf/netperf_temp/ -name "*.json" | xargs cp -t {{workingdir}}/{{Dest_dir}}/netperf/) + when: rolename == "2-host" + - name: removing netperf_temp + shell: rm -rf {{workingdir}}/{{Dest_dir}}/netperf/netperf_temp
\ No newline at end of file diff --git a/benchmarks/playbooks/pktgen.yaml b/benchmarks/playbooks/pktgen.yaml new file mode 100644 index 00000000..466fb8e9 --- /dev/null +++ b/benchmarks/playbooks/pktgen.yaml @@ -0,0 +1,38 @@ + - hosts: 127.0.0.1 + connection: local + tasks: + + - name: getting directory + shell: echo $PWD + register: qtip_dir + - name: making pktgen directory + file: path={{workingdir}}/{{Dest_dir}}/pktgen state=directory + - name: making temporary pktgen directory + file: path={{workingdir}}/{{Dest_dir}}/pktgen/pktgen_temp state=directory + + + - hosts: "{{role}}" + tasks: + - name: Rolename + set_fact: + rolename: "{{role}}" + when: role is defined + + - name: IPTABLE Setup + shell: iptables -F + when: rolename == '1-server' + - name: iptables + shell: sudo iptables -A INPUT -p udp --dport 1000 -j DROP + when: rolename == '1-server' + - name: run pktgen + shell: bash pktgen.sh {{privateip1}} 1 {{packetsize}} {{duration}} >> .json + when: rolename == '2-host' + - hosts: "{{role}}" + tasks: + - name: Rolename + set_fact: + rolename: "{{role}}" + when: role is defined + - name: Get server packetsize + shell: iptables -L -vnx >> pktgenServer{{privateip1}}.txt + when: rolename == '1-server'
\ No newline at end of file diff --git a/benchmarks/playbooks/ramspeed.yaml b/benchmarks/playbooks/ramspeed.yaml new file mode 100644 index 00000000..096c7320 --- /dev/null +++ b/benchmarks/playbooks/ramspeed.yaml @@ -0,0 +1,100 @@ + - hosts: 127.0.0.1 + connection: local + tasks: + - name: making ramspeed directory + file: path={{workingdir}}/{{Dest_dir}}/ramspeed state=directory + - name: making temporary ramspeed directory + file: path={{workingdir}}/{{Dest_dir}}/ramspeed/ramspeed_temp state=directory + + + - hosts: "{{role}}" + become: yes + remote_user: "{{username}}" + tasks: + - name: checking_home directory + shell: echo $HOME + register: home_dir + + - name: cleaning + shell: sudo rm -rf $HOME/ramspeed + + - name: cleaning previous results + shell: sudo rm -rf $HOME/qtip_result + + - name: making ramspeed temporary directory + shell: sudo mkdir $HOME/ramspeed + + - name: making results temporary directory + shell: sudo mkdir $HOME/qtip_result + + - include: ./sys_proxy_pbook.yaml + + - include: ./sys_info_pbook.yaml + vars: + network: false + + - name: Installing RAM_Speed dependencies when CentOS + shell: sudo yum install wget gcc -y + when: ansible_os_family == "RedHat" + + - name: Installing RAM_Speed dependencies when Ubuntu + shell: sudo apt-get install wget gcc -y + when: ansible_os_family == "Debian" + + - name: make dummy file + shell: sudo touch $HOME/ramspeed/ramspeed.tar.gz + + - name: Fetching RAM_Speed + shell: cd $HOME/ramspeed/ && sudo wget -O ramspeed.tar.gz https://docs.google.com/uc?id=0B92Bp5LZTM7gRFctalZLMktTNDQ + + - name: Untar RAM_SPeed + shell: cd $HOME/ramspeed/ && sudo tar -zxvf ramspeed.tar.gz + + - name: configure + shell: cd $HOME/ramspeed/ramsmp-3.5.0 && ./build.sh + + - name: Benchmarking IntMem Bandwidth + shell: cd $HOME/ramspeed/ramsmp-3.5.0 && ./ramsmp -b 3 -l 5 -p 1 >> $HOME/qtip_result/Intmem + + - name: Benchmarking FloatMem Bandwidth + shell: cd $HOME/ramspeed/ramsmp-3.5.0 && ./ramsmp -b 6 -l 5 -p 1 >> $HOME/qtip_result/Floatmem + + - name: Fetching result transformation script + copy: src=./result_transform/ramspd/ramspd_transform.py dest={{home_dir.stdout}}/qtip_result + + - name: Transforming result + shell: cd $HOME/qtip_result && sudo python ramspd_transform.py + + - name: copy report formation script + copy: src=./result_transform/final_report.py dest={{home_dir.stdout}}/qtip_result + + - name: consolidating report + shell: cd $HOME/qtip_result && sudo python final_report.py RamSpeed {{fname}} + + - name: registering files + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.json") | cut -d'/' -f2 + register: files_to_copy + + - name: copy results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/ramspeed/ramspeed_temp + with_items: files_to_copy.stdout_lines + + - name: registering log files + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.log") | cut -d'/' -f2 + register: copy_log_results + + - name: copying log results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/ramspeed/ramspeed_temp + with_items: copy_log_results.stdout_lines + + - hosts: 127.0.0.1 + connection: local + tasks: + - name: extracting_json + shell: ( find {{workingdir}}/{{Dest_dir}}/ramspeed/ramspeed_temp/ -name "*.json" | xargs cp -t {{workingdir}}/{{Dest_dir}}/ramspeed/) + - name: making_logs_folder + shell: mkdir -p {{workingdir}}/{{Dest_dir}}/ramspeed/logs + - name: extracting_log + shell: ( find {{workingdir}}/{{Dest_dir}}/ramspeed/ramspeed_temp/ -name "*.log" | xargs cp -t {{workingdir}}/{{Dest_dir}}/ramspeed/logs) + - name: removing ramspeed_log + shell: rm -rf {{workingdir}}/{{Dest_dir}}/ramspeed/ramspeed_temp diff --git a/benchmarks/playbooks/ramspeedbench.yaml b/benchmarks/playbooks/ramspeedbench.yaml deleted file mode 100644 index 37ea91a8..00000000 --- a/benchmarks/playbooks/ramspeedbench.yaml +++ /dev/null @@ -1,38 +0,0 @@ - - - hosts: demo1 - - tasks: - - name: clean - shell: rm -rf /usr/bin/phoronix-test-suite - shell: rm -rf /usr/share/doc/phoronix-test-suite/ - shell: rm -rf /usr/share/phoronix-test-suite - shell: rm -rf /root/photmp/ - - name: clean previous results - file: path=/root/results path=absent - - name: make direc - file: path=/root/photmp/ state=directory - - name: Fetch Phornonix - shell: cd /root/photmp/ && wget https://www.dropbox.com/s/5kks513ozxy7vvs/phoronix-suite.tar.gz - - name: unarchive Phoronix - shell: cd /root/photmp/ && tar -zxvf phoronix-suite.tar.gz - - name: Phornonix Dependencies - shell: yum install php php-xml php-client php-process -y - - name: Install Phornonix - shell: cd /root/photmp/phoronix-test-suite-master/&&./install-sh - - name: batchSetup - shell: phoronix-test-suite batch-setup - - name: install - shell: phoronix-test-suite batch-install ramspeed - - name: run - shell: phoronix-test-suite batch-run ramspeed - - name: making directory - file: path=/root/results state=directory - - name: copying result to temp directory - shell: cp -r /var/lib/phoronix-test-suite/test-results/* /root/results/ - - name: registering files - shell: (cd /root/results/; find . -maxdepth 1 -type f) | cut -d'/' -f2 - register: files_to_copy - - name: copy results - fetch: src=/root/results/{{item}} dest={{Dest_dir}}/dhrystone - with_items: files_to_copy.stdout_lines - diff --git a/benchmarks/playbooks/result_transform/dpi/dpi_average.sh b/benchmarks/playbooks/result_transform/dpi/dpi_average.sh new file mode 100644 index 00000000..405d3ff6 --- /dev/null +++ b/benchmarks/playbooks/result_transform/dpi/dpi_average.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +COUNTER=0 +WDIR=$PWD +while [ $COUNTER -lt 10 ]; do + + echo $WDIR + $( ./ndpiReader -i test.pcap >> $WDIR/dpi_dump.txt ) + let COUNTER=COUNTER+1 + echo "Run number: $COUNTER" + +done + + diff --git a/benchmarks/playbooks/result_transform/dpi/dpi_transform.py b/benchmarks/playbooks/result_transform/dpi/dpi_transform.py new file mode 100644 index 00000000..622030cd --- /dev/null +++ b/benchmarks/playbooks/result_transform/dpi/dpi_transform.py @@ -0,0 +1,48 @@ +import os +import pickle +import datetime + +sum_dpi_pps = float(0) +sum_dpi_bps = float(0) + +for x in range(1, 11): + dpi_result_pps = float( + os.popen( + "cat $HOME/qtip_result/dpi_dump.txt | grep 'nDPI throughput:' | awk 'NR=='" + + str(x) + + " | awk '{print $3}'").read().lstrip()) + dpi_result_bps = float( + os.popen( + "cat $HOME/qtip_result/dpi_dump.txt | grep 'nDPI throughput:' | awk 'NR=='" + + str(x) + + " | awk '{print $7}'").read().rstrip()) + + if (dpi_result_pps > 100): + dpi_result_pps = dpi_result_pps / 1000 + + if (dpi_result_bps > 100): + dpi_result_bps = dpi_result_bps / 1000 + + sum_dpi_pps += dpi_result_pps + sum_dpi_bps += dpi_result_bps + +dpi_result_pps = sum_dpi_pps / 10 +dpi_result_bps = sum_dpi_bps / 10 + +host = os.popen("hostname").read().rstrip() +log_time_stamp = str(datetime.datetime.utcnow().isoformat()) + +os.popen( + "cat $HOME/qtip_result/dpi_dump.txt > $HOME/qtip_result/" + + host + + "-" + + log_time_stamp + + ".log") + +home_dir = str(os.popen("echo $HOME").read().rstrip()) +host = os.popen("echo $HOSTNAME") +result = {} +result['DPI_benchmark(M pps)'] = round(dpi_result_pps, 3) +result['DPI_benchmark(Gb/s)'] = round(dpi_result_bps, 3) +with open('./result_temp', 'w+') as result_file: + pickle.dump(result, result_file) diff --git a/benchmarks/playbooks/result_transform/dpi/final_report.py b/benchmarks/playbooks/result_transform/dpi/final_report.py new file mode 100644 index 00000000..be25daa8 --- /dev/null +++ b/benchmarks/playbooks/result_transform/dpi/final_report.py @@ -0,0 +1,20 @@ +import pickle +import json +import datetime +import sys + +with open('/root/qtip_result/sys_info_temp', 'r') as sys_info_f: + sys_info_dict = pickle.load(sys_info_f) +with open('/root/qtip_result/result_temp', 'r') as result_f: + result_dict = pickle.load(result_f) + +host_name = sys_info_dict['1_Hostname'] +benchmark_name = str(sys.argv[1]) +report_time_stamp = str(datetime.datetime.utcnow().isoformat()) +final_dict = {} +final_dict['1 Time of Report'] = report_time_stamp +final_dict['2 System Information'] = sys_info_dict +final_dict['3 ' + benchmark_name + ' result'] = result_dict + +with open('/root/qtip_result/' + host_name + '-' + report_time_stamp + '.json', 'w+') as result_json: + json.dump(final_dict, result_json, indent=4, sort_keys=True) diff --git a/benchmarks/playbooks/result_transform/final_report.py b/benchmarks/playbooks/result_transform/final_report.py new file mode 100644 index 00000000..6a10c026 --- /dev/null +++ b/benchmarks/playbooks/result_transform/final_report.py @@ -0,0 +1,25 @@ +import pickle +import json +import datetime +import os +import sys + +home_dir = str((os.popen("echo $HOME").read().rstrip())) + +with open('./sys_info_temp', 'r') as sys_info_f: + sys_info_dict = pickle.load(sys_info_f) +with open('./result_temp', 'r') as result_f: + result_dict = pickle.load(result_f) + +host_name = (os.popen("hostname").read().rstrip()) +benchmark_name = str(sys.argv[1]) +testcase_name = str(sys.argv[2]) +report_time_stamp = str(datetime.datetime.utcnow().isoformat()) +final_dict = {} +final_dict['1 Testcase Name'] = testcase_name +final_dict['2 Time of Report'] = report_time_stamp +final_dict['3 System Information'] = sys_info_dict +final_dict['4 ' + benchmark_name + ' result'] = result_dict + +with open('./' + host_name + '-' + report_time_stamp + '.json', 'w+') as result_json: + json.dump(final_dict, result_json, indent=4, sort_keys=True) diff --git a/benchmarks/playbooks/result_transform/fio/fio_result_transform.py b/benchmarks/playbooks/result_transform/fio/fio_result_transform.py new file mode 100755 index 00000000..9929aa18 --- /dev/null +++ b/benchmarks/playbooks/result_transform/fio/fio_result_transform.py @@ -0,0 +1,50 @@ +import json +import pickle +import os +import datetime + +with open("fio_result.json") as fio_raw: + fio_data = json.load(fio_raw) + +r_iops = [] +r_io_bytes = [] +r_io_runtime = [] +r_lat = [] +w_iops = [] +w_io_bytes = [] +w_io_runtime = [] +w_lat = [] + +total_jobs = len(fio_data["jobs"]) + +for x in range(0, int(total_jobs)): + r_iops.append(fio_data["jobs"][x]["read"]["iops"]) + r_io_bytes.append(fio_data["jobs"][x]["read"]["io_bytes"]) + r_io_runtime.append(fio_data["jobs"][x]["read"]["runtime"]) + r_lat.append(fio_data["jobs"][x]["read"]["lat"]["mean"]) + w_iops.append(fio_data["jobs"][x]["write"]["iops"]) + w_io_bytes.append(fio_data["jobs"][x]["write"]["io_bytes"]) + w_io_runtime.append(fio_data["jobs"][x]["write"]["runtime"]) + w_lat.append(fio_data["jobs"][x]["write"]["lat"]["mean"]) + +FIO_result_dict = {} + +for x in range(0, total_jobs): + FIO_result_dict['Job_' + str(x)] = {} + FIO_result_dict['Job_' + str(x)]['read'] = {} + FIO_result_dict['Job_' + str(x)]['read']['Total_IO_Bytes'] = r_io_bytes[x] + FIO_result_dict['Job_' + str(x)]['read']['IO/sec'] = r_iops[x] + FIO_result_dict['Job_' + str(x)]['read']['IO_runtime (millisec)'] = r_io_runtime[x] + FIO_result_dict['Job_' + str(x)]['read']['mean_IO_latenchy (microsec)'] = r_lat[x] + + FIO_result_dict['Job_' + str(x)]['write'] = {} + FIO_result_dict['Job_' + str(x)]['write']['Total_IO_Bytes'] = w_io_bytes[x] + FIO_result_dict['Job_' + str(x)]['write']['IO/sec'] = w_iops[x] + FIO_result_dict['Job_' + str(x)]['write']['IO_runtime (millisec)'] = w_io_runtime[x] + FIO_result_dict['Job_' + str(x)]['write']['mean_IO_latenchy (microsec)'] = w_lat[x] + +host_name = (os.popen("hostname").read().rstrip()) +report_time = str(datetime.datetime.utcnow().isoformat()) +os.system("mv fio_result.json " + str(host_name) + "-" + report_time + ".log") +with open('./result_temp', 'w + ')as out_fio_result: + pickle.dump(FIO_result_dict, out_fio_result) diff --git a/benchmarks/playbooks/result_transform/iperf/iperf_transform.py b/benchmarks/playbooks/result_transform/iperf/iperf_transform.py new file mode 100644 index 00000000..8df5a79a --- /dev/null +++ b/benchmarks/playbooks/result_transform/iperf/iperf_transform.py @@ -0,0 +1,29 @@ +import json
+import datetime
+import pickle
+with open('iperf_raw.json', 'r') as ifile:
+ raw_iperf_data = json.loads(ifile.read().rstrip())
+
+bits_sent = raw_iperf_data['end']['sum_sent']['bits_per_second']
+bits_received = raw_iperf_data['end']['sum_received']['bits_per_second']
+total_byte_sent = raw_iperf_data['end']['sum_sent']['bytes']
+total_byte_received = raw_iperf_data['end']['sum_received']['bytes']
+cpu_host_total_percent = raw_iperf_data['end']['cpu_utilization_percent']['host_total']
+cpu_remote_total_percent = raw_iperf_data['end']['cpu_utilization_percent']['remote_total']
+
+result = {}
+time_stamp = str(datetime.datetime.utcnow().isoformat())
+
+result['1. Version'] = raw_iperf_data['start']['version']
+result['2. Bandwidth'] = {}
+result['2. Bandwidth']['1. throughput Sender (b/s)'] = bits_sent
+result['2. Bandwidth']['2. throughput Received (b/s)'] = bits_received
+result['3. CPU'] = {}
+result['3. CPU']['1. CPU host total (%)'] = cpu_host_total_percent
+result['3. CPU']['2. CPU remote total (%)'] = cpu_remote_total_percent
+
+with open('iperf_raw-' + time_stamp + '.log', 'w+') as ofile:
+ ofile.write(json.dumps(raw_iperf_data))
+
+with open('./result_temp', 'w+') as result_file:
+ pickle.dump(result, result_file)
diff --git a/benchmarks/playbooks/result_transform/ramspd/ramspd_transform.py b/benchmarks/playbooks/result_transform/ramspd/ramspd_transform.py new file mode 100644 index 00000000..c3f03dd0 --- /dev/null +++ b/benchmarks/playbooks/result_transform/ramspd/ramspd_transform.py @@ -0,0 +1,46 @@ +import os +import pickle +import datetime + +intmem_copy = os.popen("cat Intmem | grep 'BatchRun Copy' | awk '{print $4}'").read().rstrip() +intmem_scale = os.popen("cat Intmem | grep 'BatchRun Scale' | awk '{print $4}'").read().rstrip() +intmem_add = os.popen("cat Intmem | grep 'BatchRun Add' | awk '{print $4}'").read().rstrip() +intmem_triad = os.popen("cat Intmem | grep 'BatchRun Triad' | awk '{print $4}'").read().rstrip() +intmem_average = os.popen("cat Intmem | grep 'BatchRun AVERAGE' | awk '{print $4}'").read().rstrip() + +print intmem_copy +print intmem_average + +floatmem_copy = os.popen("cat Floatmem | grep 'BatchRun Copy' | awk '{print $4}'").read().rstrip() +floatmem_scale = os.popen("cat Floatmem | grep 'BatchRun Scale' | awk '{print $4}'").read().rstrip() +floatmem_add = os.popen("cat Floatmem | grep 'BatchRun Add' | awk '{print $4}'").read().rstrip() +floatmem_triad = os.popen("cat Floatmem | grep 'BatchRun Triad' | awk '{print $4}'").read().rstrip() +floatmem_average = os.popen("cat Floatmem | grep 'BatchRun AVERAGE' | awk '{print $4}'").read().rstrip() + +print floatmem_copy +print floatmem_average + +hostname = os.popen("hostname").read().rstrip() +time_stamp = str(datetime.datetime.utcnow().isoformat()) + +os.system("mv Intmem " + hostname + "-" + time_stamp + ".log") +os.system("cp Floatmem >> " + hostname + "-" + time_stamp + ".log") + +result = {} + +result['1. INTmem bandwidth'] = {} +result['1. INTmem bandwidth']['1. Copy (MB/s)'] = intmem_copy +result['1. INTmem bandwidth']['2. Add (MB/s)'] = intmem_add +result['1. INTmem bandwidth']['3. Scale (MB/s)'] = intmem_scale +result['1. INTmem bandwidth']['4. Triad (MB/s)'] = intmem_triad +result['1. INTmem bandwidth']['5. Average (MB/s)'] = intmem_average + +result['2. FLOATmem bandwidth'] = {} +result['2. FLOATmem bandwidth']['1. Copy (MB/s)'] = floatmem_copy +result['2. FLOATmem bandwidth']['2. Add (MB/s)'] = floatmem_add +result['2. FLOATmem bandwidth']['3. Scale (MB/s)'] = floatmem_scale +result['2. FLOATmem bandwidth']['4. Triad (MB/s)'] = floatmem_triad +result['2. FLOATmem bandwidth']['5. Average (MB/s)'] = floatmem_average + +with open('./result_temp', 'w+') as result_file: + pickle.dump(result, result_file) diff --git a/benchmarks/playbooks/result_transform/ssl/ssl_transform.py b/benchmarks/playbooks/result_transform/ssl/ssl_transform.py new file mode 100644 index 00000000..029135ac --- /dev/null +++ b/benchmarks/playbooks/result_transform/ssl/ssl_transform.py @@ -0,0 +1,58 @@ +import os +import pickle +import datetime + +openssl_version = os.popen("cat RSA_dump | head -1").read().rstrip() +rsa_512_sps = os.popen( + "cat RSA_dump | grep '512 bits ' | awk '{print $6}' ").read().rstrip() +rsa_512_vps = os.popen( + "cat RSA_dump | grep '512 bits ' | awk '{print $7}' ").read().rstrip() +rsa_1024_sps = os.popen( + "cat RSA_dump | grep '1024 bits ' | awk '{print $6}' ").read().rstrip() +rsa_1024_vps = os.popen( + "cat RSA_dump | grep '1024 bits ' | awk '{print $7}' ").read().rstrip() +rsa_2048_sps = os.popen( + "cat RSA_dump | grep '2048 bits ' | awk '{print $6}' ").read().rstrip() +rsa_2048_vps = os.popen( + "cat RSA_dump | grep '2048 bits ' | awk '{print $7}' ").read().rstrip() +rsa_4096_sps = os.popen( + "cat RSA_dump | grep '4096 bits ' | awk '{print $6}' ").read().rstrip() +rsa_4096_vps = os.popen( + "cat RSA_dump | grep '4096 bits ' | awk '{print $7}' ").read().rstrip() + +aes_16B = os.popen( + "cat AES-128-CBC_dump | grep 'aes-128-cbc ' | awk '{print $2}' ").read().rstrip() +aes_64B = os.popen( + "cat AES-128-CBC_dump | grep 'aes-128-cbc ' | awk '{print $3}' ").read().rstrip() +aes_256B = os.popen( + "cat AES-128-CBC_dump | grep 'aes-128-cbc ' | awk '{print $4}' ").read().rstrip() +aes_1024B = os.popen( + "cat AES-128-CBC_dump | grep 'aes-128-cbc ' | awk '{print $5}' ").read().rstrip() +aes_8192B = os.popen( + "cat AES-128-CBC_dump | grep 'aes-128-cbc ' | awk '{print $6}' ").read().rstrip() + +hostname = os.popen("hostname").read().rstrip() +time_stamp = str(datetime.datetime.utcnow().isoformat()) + +os.system("mv RSA_dump " + hostname + "-" + time_stamp + ".log") +os.system("cat AES-128-CBC_dump >> " + hostname + "-" + time_stamp + ".log") + +result = {} + +result['1. Version'] = [openssl_version] +result['2. RSA signatures'] = {} +result['2. RSA signatures']['1. 512 bits (sign/s)'] = rsa_512_sps +result['2. RSA signatures']['2. 1024 bits (sign/s)'] = rsa_1024_sps +result['2. RSA signatures']['3. 2048 bits (sign/s)'] = rsa_2048_sps +result['2. RSA signatures']['4. 4096 bits (sign/s)'] = rsa_4096_sps + +result['3. AES-128-cbc throughput'] = {} +result['3. AES-128-cbc throughput']['1. 16 Bytes block (B/sec)'] = aes_16B +result['3. AES-128-cbc throughput']['2. 64 Bytes block (B/sec)'] = aes_64B +result['3. AES-128-cbc throughput']['3. 256 Bytes block (B/sec)'] = aes_256B +result['3. AES-128-cbc throughput']['4. 1024 Bytes block (B/sec)'] = aes_1024B +result['3. AES-128-cbc throughput']['5. 8192 Bytes block (B/sec)'] = aes_8192B + + +with open('./result_temp', 'w+') as result_file: + pickle.dump(result, result_file) diff --git a/benchmarks/playbooks/result_transform/ubench_transform.py b/benchmarks/playbooks/result_transform/ubench_transform.py new file mode 100644 index 00000000..3c8ba1d8 --- /dev/null +++ b/benchmarks/playbooks/result_transform/ubench_transform.py @@ -0,0 +1,34 @@ +import os +import json +import pickle + +total_cpu = os.popen( + "cat $HOME/tempT/UnixBench/results/* | grep 'of tests' | awk '{print $1;}' | awk 'NR==1'").read().rstrip() + +cpu_1 = os.popen( + "cat $HOME/tempT/UnixBench/results/* | grep 'of tests' | awk '{print $6;}' | awk 'NR==1'").read().rstrip() + + +cpu_2 = os.popen( + "cat $HOME/tempT/UnixBench/results/* | grep 'of tests' | awk '{print $6;}' | awk 'NR==2'").read().rstrip() + + +Index_1 = os.popen( + "cat $HOME/tempT/UnixBench/results/* | grep 'Index Score (Partial Only) ' | awk '{print $7;}' | awk 'NR==1'").read().rstrip() +Index_2 = os.popen( + "cat $HOME/tempT/UnixBench/results/* | grep 'Index Score (Partial Only) ' | awk '{print $7;}' | awk 'NR==2'").read().rstrip() + + +result = {} +result['1.Number of CPU(s) in system'] = total_cpu +result['2.Single CPU test'] = {} +result['2.Single CPU test']['1.Number of parallell test(s)'] = cpu_1 +result['2.Single CPU test']['2.Index score'] = Index_1 +result['3.Multi CPU test'] = {} +result['3.Multi CPU test']['1.Number of parallell test(s)'] = cpu_2 +result['3.Multi CPU test']['2.Index score'] = Index_2 + +with open('result_temp', 'w+') as result_file: + pickle.dump(result, result_file) +print json.dumps(result, indent=4, sort_keys=True) +# print result.items() diff --git a/benchmarks/playbooks/ssl.yaml b/benchmarks/playbooks/ssl.yaml new file mode 100644 index 00000000..fcb7585c --- /dev/null +++ b/benchmarks/playbooks/ssl.yaml @@ -0,0 +1,104 @@ + - hosts: 127.0.0.1 + connection: local + tasks: + - name: making ssl directory + file: path={{workingdir}}/{{Dest_dir}}/ssl state=directory + - name: making temporary ssl directory + file: path={{workingdir}}/{{Dest_dir}}/ssl/ssl_temp state=directory + - hosts: "{{role}}" + become: yes + remote_user: "{{username}}" + tasks: + - name: checking_home directory + shell: sudo echo $HOME + register: home_dir + + - name: cleaning + shell: sudo rm -rf $HOME/Open_SSL + + - name: cleaning previous results + shell: sudo rm -rf $HOME/qtip_result + + - name: making OpenSSL temporary directory + shell: sudo mkdir $HOME/Open_SSL + + - name: making results temporary directory + shell: sudo mkdir $HOME/qtip_result + + - include: ./sys_proxy_pbook.yaml + + - include: ./sys_info_pbook.yaml + vars: + network: false + + - name: Installing OpenSSL dependencies when CentOS + shell: sudo yum install git wget gcc patch perl-Time-HiRes autofconf automake libpcap-devel libtool -y + when: ansible_os_family == "RedHat" + + - name: Installing OpenSSL dependencies when Ubuntu + shell: sudo apt-get install git gcc wget perl autoconf automake libpcap-dev libtool -y + when: ansible_os_family == "Debian" + + - name: Fetching OpenSSL + shell: cd $HOME/Open_SSL/ && sudo wget http://artifacts.opnfv.org/qtip/utilities/openssl-1.0.2f.tar.gz + + - name: Untar OpenSSL + shell: cd $HOME/Open_SSL/ && sudo tar -zxvf openssl-1.0.2f.tar.gz + - name: configure + shell: cd $HOME/Open_SSL/openssl-1.0.2f && sudo ./config + + - name: make + shell: cd $HOME/Open_SSL/openssl-1.0.2f && sudo make + + - name: make install + shell: cd $HOME/Open_SSL/openssl-1.0.2f && sudo make install + + - name: Benchmarking RSA signatures + shell: cd $HOME/Open_SSL/openssl-1.0.2f/apps && sudo ./openssl speed rsa >> $HOME/qtip_result/RSA_dump + + - name: Benchmaring AES-128-cbc cipher encryption throughput + shell: cd $HOME/Open_SSL/openssl-1.0.2f/apps && sudo ./openssl speed -evp aes-128-cbc >> $HOME/qtip_result/AES-128-CBC_dump + + + - name: Fetching result transformation script + copy: src=./result_transform/ssl/ssl_transform.py dest={{home_dir.stdout}}/qtip_result + + - name: Transforming result + shell: cd $HOME/qtip_result && python ssl_transform.py + + - name: copy report formation script + copy: src=./result_transform/final_report.py dest={{home_dir.stdout}}/qtip_result + + - name: consolidating report + shell: cd $HOME/qtip_result && python final_report.py SSL {{fname}} + + - name: registering files + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.json") | cut -d'/' -f2 + register: files_to_copy + + - name: copy results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/ssl/ssl_temp + with_items: files_to_copy.stdout_lines + + - name: registering log files + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.log") | cut -d'/' -f2 + register: copy_log_results + + - name: copying log results + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/ssl/ssl_temp + with_items: copy_log_results.stdout_lines + + + - hosts: 127.0.0.1 + connection: local + tasks: + - name: echo + shell: echo $PWD + - name: extracting_json + shell: ( find {{workingdir}}/{{Dest_dir}}/ssl/ssl_temp/ -name "*.json" | xargs cp -t {{workingdir}}/{{Dest_dir}}/ssl/) + - name: making_logs_folder + shell: mkdir -p {{workingdir}}/{{Dest_dir}}/ssl/logs + - name: extracting_log + shell: ( find {{workingdir}}/{{Dest_dir}}/ssl/ssl_temp/ -name "*.log" | xargs cp -t {{workingdir}}/{{Dest_dir}}/ssl/logs) + - name: removing ssl_temp + shell: rm -rf {{workingdir}}/{{Dest_dir}}/ssl/ssl_temp diff --git a/benchmarks/playbooks/sys_info_pbook.yaml b/benchmarks/playbooks/sys_info_pbook.yaml new file mode 100644 index 00000000..bc47423f --- /dev/null +++ b/benchmarks/playbooks/sys_info_pbook.yaml @@ -0,0 +1,47 @@ + - name: Epel Release install when CentOS + shell: sudo yum install epel-release -y + when: ansible_os_family == "RedHat" + + - name: Inxi install when CentOS + shell: sudo yum install inxi -y + when: ansible_os_family == "RedHat" + + - name: Software Properties Common + shell: sudo apt-get install software-properties-common -y + when: ansible_os_family == "Debian" + + - name: adding trusty-backport main repo + shell: sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse" + when: ansible_os_family == "Debian" + + - name: adding trusty main repo + shell: sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse" + when: ansible_os_family == "Debian" + + - name: system info collection tool install when Ubuntu + shell: sudo apt-get update && apt-get install inxi -y + when: ansible_os_family == "Debian" + + - name: Install ansible copy dependencies if remote host has selinux enabled + shell: sudo yum install libselinux-python -y + when: ansible_os_family == "RedHat" + + - name: Install ansiblle copy dependencies if remote host has selinux enaled + shell: sudo apt-get install python-selinux -y + when: ansible_os_family == "Debian" + + - name: system_info script copy + copy: src=./info_script/info_collect.py dest={{home_dir.stdout}}/qtip_result/ + + - name: collecting system informaton for non-network test cases + shell: cd $HOME/qtip_result && sudo python info_collect.py c + when: not network + + - name: collecting system information for network test cases + shell: cd $HOME/qtip_result && sudo python info_collect.py n + when: network + + + + + diff --git a/benchmarks/playbooks/sys_proxy_pbook.yaml b/benchmarks/playbooks/sys_proxy_pbook.yaml new file mode 100644 index 00000000..bf4a8ccb --- /dev/null +++ b/benchmarks/playbooks/sys_proxy_pbook.yaml @@ -0,0 +1,53 @@ +#env +- name: insert shell proxy http + lineinfile: dest=/etc/profile.d/proxy.sh state=present create=yes owner=root group=root mode=0644 regexp="export http_proxy={{ http_proxy }}" + insertafter=EOF line="export http_proxy={{ http_proxy }}" + when: http_proxy is defined + ignore_errors: yes + +- name: insert shell proxy https + lineinfile: dest=/etc/profile.d/proxy.sh state=present create=yes owner=root group=root mode=0644 regexp="export https_proxy={{ https_proxy }}" + insertafter=EOF line="export https_proxy={{ https_proxy }}" + when: https_proxy is defined + ignore_errors: yes + +- name: insert no proxy + lineinfile: dest=/etc/profile.d/proxy.sh state=present create=yes owner=root group=root mode=0644 regexp="{{ no_proxy }}" + insertafter=EOF line="export no_proxy={{ no_proxy }}" + when: no_proxy is defined + ignore_errors: yes + +#wget +- name: insert wget proxy(http) + lineinfile: dest=/etc/wgetrc state=present regexp="http_proxy={{ http_proxy }}" + insertafter="^#http_proxy" line="http_proxy={{ http_proxy }}" + when: http_proxy is defined + ignore_errors: yes + +- name: insert wget proxy(https) + lineinfile: dest=/etc/wgetrc state=present regexp="https_proxy={{ https_proxy }}" + insertafter="^#https_proxy" line="https_proxy={{ https_proxy }}" + when: https_proxy is defined + ignore_errors: yes + +#yum +- name: insert yum proxy(http) + lineinfile: dest=/etc/yum.conf state=present regexp="proxy={{ http_proxy }}" + insertafter=EOF line="proxy={{ http_proxy }}" + when: ansible_os_family == "RedHat" and http_proxy is defined + ignore_errors: yes + +#apt + +- name: insert apt proxy(http) + lineinfile: dest=/etc/apt/apt.conf state=present create=yes regexp="Acquire::http::Proxy \"{{ http_proxy }}\";" + insertafter=EOF line="Acquire::http::Proxy \"{{ http_proxy }}\";" + when: ansible_os_family == "Debian" and http_proxy is defined + ignore_errors: yes + +- name: insert apt proxy(https) + lineinfile: dest=/etc/apt/apt.conf state=present create=yes regexp="Acquire::https::Proxy \"{{ https_proxy }}\";" + insertafter=EOF line="Acquire::https::Proxy \"{{ https_proxy }}\";" + when: ansible_os_family == "Debian" and https_proxy is defined + ignore_errors: yes + diff --git a/benchmarks/playbooks/whetstone.yaml b/benchmarks/playbooks/whetstone.yaml index 497797ff..efe78cfd 100644 --- a/benchmarks/playbooks/whetstone.yaml +++ b/benchmarks/playbooks/whetstone.yaml @@ -1,31 +1,112 @@ - - - hosts: demo1 + - hosts: 127.0.0.1 + connection: local + tasks: + - name: making whetstone directory + file: path={{workingdir}}/{{Dest_dir}}/whetstone state=directory + + - name: making temporary whetstone directory + file: path={{workingdir}}/{{Dest_dir}}/whetstone/whetstone_temp state=directory + - hosts: "{{role}}" + become: yes + remote_user: "{{username}}" tasks: - - name: cleaning - shell: rm -rf /root/tempT - - name: cleaning previous results - file: path=/root/results state=absent - - name: Installing UnixBench dependencies - shell: yum install git gcc patch perl-Time-HiRes -y + - name: storing_home + shell: echo $HOME + register: home_dir + + - name: cleaning tempT + shell: sudo rm -rf $HOME/tempT + + - name: cleaning_qtip_result + shell: sudo rm -rf $HOME/qtip_result + + - name: make directory + shell: sudo mkdir $HOME/qtip_result + + - include: ./sys_proxy_pbook.yaml + + - include: ./sys_info_pbook.yaml + vars: + network: false + + - name: Installing UnixBench dependencies if CentOS + shell: sudo yum install git gcc patch perl-Time-HiRes -y + when: ansible_os_family == "RedHat" + + - name: Installing UnixBench dependencies if Ubuntu + shell: sudo apt-get install git gcc patch perl -y + when: ansible_os_family == "Debian" + + - include: ./git_proxy_pbook.yaml + - name: Clone unixbench - shell: git clone https://github.com/kdlucas/byte-unixbench.git /root/tempT + shell: git clone https://github.com/kdlucas/byte-unixbench.git $HOME/tempT + - name: make - shell: make --directory /root/tempT/UnixBench/ + shell: sudo make --directory $HOME/tempT/UnixBench/ + - name: downloading_patch - shell: cd /root/tempT/UnixBench/ && wget https://www.dropbox.com/s/11z85gfu0trkhus/fix-limitation.patch + shell: cd $HOME/tempT/UnixBench/ && sudo wget https://www.dropbox.com/s/11z85gfu0trkhus/fix-limitation.patch + - name: applying_patch - shell: cd /root/tempT/UnixBench/ && patch Run fix-limitation.patch - - name: Run whetstone - shell: cd /root/tempT/UnixBench/&&./Run -v whetstone + shell: cd $HOME/tempT/UnixBench/ && sudo patch Run fix-limitation.patch + + - name: Run Whetstone + shell: cd $HOME/tempT/UnixBench/&&./Run -v whetstone + + - name: collecting and transforming result script copy + copy: src=./result_transform/ubench_transform.py dest={{home_dir.stdout}}/qtip_result/ + + - name: transforming result + shell: cd $HOME/qtip_result && sudo python ubench_transform.py + + - name: copying consolidated report script + copy: src=./result_transform/final_report.py dest={{home_dir.stdout}}/qtip_result/ + + - name: making consolidated report + shell: cd $HOME/qtip_result && sudo python final_report.py Whetstone {{fname}} + - name: making directory - file: path=/root/results state=directory + file: path={{home_dir.stdout}}/qtip_result/log state=directory + - name: copying result to temp directory - shell: cp -r /root/tempT/UnixBench/results/* /root/results/ + shell: sudo cp -r $HOME/tempT/UnixBench/results/* $HOME/qtip_result/log + - name: registering files - shell: (cd /root/results/; find . -maxdepth 1 -type f) | cut -d'/' -f2 + shell: (cd $HOME/qtip_result/; find . -maxdepth 1 -name "*.json") | cut -d'/' -f2 register: files_to_copy + - name: copy results - fetch: src=/root/results/{{item}} dest={{Dest_dir}}/whetstone + fetch: src={{home_dir.stdout}}/qtip_result/{{item}} dest={{workingdir}}/{{Dest_dir}}/whetstone/whetstone_temp with_items: files_to_copy.stdout_lines + - name: registering log files + shell: (cd $HOME/qtip_result/log/; find . -maxdepth 1 -name "*.log") | cut -d'/' -f2 + register: copy_log_results + + - name: copying log results + fetch: src={{home_dir.stdout}}/qtip_result/log/{{item}} dest={{workingdir}}/{{Dest_dir}}/whetstone/whetstone_temp + with_items: copy_log_results.stdout_lines + + - name: cleaning tempT + shell: sudo rm -rf $HOME/tempT + + - name: cleaning_qtip_result + shell: sudo rm -rf $HOME/qtip_result + + + - hosts: 127.0.0.1 + connection: local + tasks: + - name: extracting_json + shell: ( find {{workingdir}}/{{Dest_dir}}/whetstone/whetstone_temp/ -name "*.json" | xargs cp -t {{workingdir}}/{{Dest_dir}}/whetstone/) + + - name: making_logs_folder + shell: mkdir -p {{workingdir}}/{{Dest_dir}}/whetstone/logs + + - name: extracting_log + shell: ( find {{workingdir}}/{{Dest_dir}}/whetstone/whetstone_temp/ -name "*.log" | xargs cp -t {{workingdir}}/{{Dest_dir}}/whetstone/logs) + + - name: removing whetstone_temp + shell: rm -rf {{workingdir}}/{{Dest_dir}}/whetstone/whetstone_temp diff --git a/clean.sh b/clean.sh deleted file mode 100755 index 77cc3463..00000000 --- a/clean.sh +++ /dev/null @@ -1,6 +0,0 @@ -#! /bin/bash -echo cleaning Ip - -sed -i -e '/demo1/{n;N;d;}' /etc/ansible/hosts -neutron floatingip-delete $(neutron floatingip-list| grep "17" | awk '{print $2;}') -heat stack-delete exp2 diff --git a/dashboard/pushtoDB.py b/dashboard/pushtoDB.py new file mode 100644 index 00000000..d5458b1d --- /dev/null +++ b/dashboard/pushtoDB.py @@ -0,0 +1,63 @@ +import requests +import json +import datetime +import os +import sys +TEST_DB = 'http://testresults.opnfv.org/test/api/v1' + +suite_list = [('compute_result.json', 'compute_test_suite'), + ('network_result.json', 'network_test_suite'), + ('storage_result.json', 'storage_test_suite')] +payload_list = {} + + +def push_results_to_db(db_url, case_name, payload, logger=None, pod_name="dell-pod1"): + + url = db_url + "/results" + creation_date = str(datetime.datetime.utcnow().isoformat()) + installer = os.environ['INSTALLER_TYPE'] + pod_name = os.environ['NODE_NAME'] + + params = {"project_name": "qtip", "case_name": case_name, + "pod_name": pod_name, "installer": installer, "start_date": creation_date, + "version": "test", "details": payload} + + headers = {'Content-Type': 'application/json'} + print pod_name + print installer + print creation_date + + try: + r = requests.post(url, data=json.dumps(params), headers=headers) + print r + return True + except: + print "Error:", sys.exc_info()[0] + return False + + +def populate_payload(suite_list): + + global payload_list + for k, v in suite_list: + + if os.path.isfile('results/' + str(k)): + payload_list[k] = v + + +def main(): + + global payload_list + populate_payload(suite_list) + if payload_list: + print payload_list + for suite, case in payload_list.items(): + with open('results/' + suite, 'r') as result_file: + j = json.load(result_file) + push_results_to_db(TEST_DB, case, j) + elif not payload_list: + print 'Results not found' + + +if __name__ == "__main__": + main() diff --git a/data/QtipKey b/data/QtipKey new file mode 100644 index 00000000..3f520775 --- /dev/null +++ b/data/QtipKey @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAxVpAC+Q8LTyftATCgVHIKvDkXYzHI/8CZeKlVWHlHUA0/6Eu +qSrhzbpOwSaQi2C3x4Eszvh7/CfuVMql11yShsXwFD7aV6x0YG7q8IUScHILUFal +m0Fx52No7IpB3llluUV+kh8ay68V9OGvMZrQ+wWw4ieh2alUnpvFwteXmb8NQtXW +6pm2algUVixc4R3//YKLnGkj93pGFlQlDz5Q0vg+69jHNgodGewIrxCWeZk2pnn0 +vNAdWTQUTm7z/1uYz6AIeR/Wx66msmchFRmmDpP7aHXSSQEBySF7v/GEsZ1JwtBW +07WebNiTv9wYoOfyKVuZuTbBwjqlT4x5CpIJEwIDAQABAoIBAFHcDZThJtTcwKG7 +F7LsaUrmgNMNAc08iZIZYNr5sD9h0pn2EZS55M+g5+nWRT6K77AhNKTlDQiax5EE +PaYHEAA3Ok4rhAW50svtNiZuDCf4Jhk815R+oPCJm4wCDTBdhIRE/ys9G7BA/6qD +slexD94Pjj9AkTHnuuHPW0hmhMuQaSg96EO6QUWCG/HeMFDGcorBlM0s+NeR46Jm +dI8tOvt+rSa68oDtKEwhUbP5cATNdAITzo9+4We5EnYhW9/nRsaF/um2BPih6JnU +zG9udvZwj+YARmEfxhXzeRDpi30qYil/+CUF+qdyd8eoPBvhsW6rr1TA6XYGmPDN +SnlPLAECgYEA6RtgGqL34orxiqT3tDkA2Lb4aSq9Zntr09VAqwft4I3550XihHsa +lqJoy2macX36f60oRDZEL3v4cH22zyjojav4MXe2fLlCiApy45xCzsGkWizxTe5D +184jUIcRxb/sGbOulbXBdu8lmtNiyslvkAoj75bvL2MXhytbYgikhrMCgYEA2Lv1 +9Os+VXT9py/67dO/GY14NUpT1sFq2zxPYWpKxJD+j/NVZsflpPd/V5cGANZGovA0 +c8WNupJmCO1P20uldRX5dJ3EhhER2kn0yKhZuBBxmrELQZdnXGc9T8ub0xJVbo2u +K3Km3C1Dx7Us4BwzGOO6K2kYbT1ij/vAbZWmpCECgYBdkhqStqYwbrukfrHbyyH2 +3AN9G6XpdFOFNc3+mXE4OWV+G4Rgz5WNr+XG+T4AnqQmChjmwK3ALdA9P4lZQL+Q +1t4K5VYAXNFDEIarrPb4Tayucenu8VyUTO/KDF3q9i5M5t6Gw+3D0x1SN9YpNpCs +zhU8wGaErA8uuA23nWaFlwKBgQDXSf6MB5GnucqtZI/R5uCRNWIPLYISdZb7p/EC +R1912sHDpGdU7YREVkV8cFxaQH9yI0E3LyoWBo6sl28X2xDEOcvN91ncAuDFAWnS +WMimek8e5nbT9N2LgFH7Dbn/9NpAMySrq/vsAlqt6l5lUB3Bv5SSwpatDKj3dZA0 +Ss95gQKBgQCvwxW4PSd+hxdofwGd6KBwhA404GPdcVLLmASGVYRNcVNyfhUmMCn+ +UF1WsBCOcnWjJ/pT864S9Rp1bbqzpQS8Pz1vJwhkaHEJD0a5l+KhD4llsWDjUNfI +KfVffcmydNC3uRD59WPZEAgu+gOS8kRw7lybFTNuMS7B3dC5v9UtWg== +-----END RSA PRIVATE KEY----- diff --git a/data/QtipKey.pub b/data/QtipKey.pub new file mode 100644 index 00000000..7a40f91c --- /dev/null +++ b/data/QtipKey.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFWkAL5DwtPJ+0BMKBUcgq8ORdjMcj/wJl4qVVYeUdQDT/oS6pKuHNuk7BJpCLYLfHgSzO+Hv8J+5UyqXXXJKGxfAUPtpXrHRgburwhRJwcgtQVqWbQXHnY2jsikHeWWW5RX6SHxrLrxX04a8xmtD7BbDiJ6HZqVSem8XC15eZvw1C1dbqmbZqWBRWLFzhHf/9goucaSP3ekYWVCUPPlDS+D7r2Mc2Ch0Z7AivEJZ5mTamefS80B1ZNBRObvP/W5jPoAh5H9bHrqayZyEVGaYOk/toddJJAQHJIXu/8YSxnUnC0FbTtZ5s2JO/3Big5/IpW5m5NsHCOqVPjHkKkgkT root@foreman-jump.opnfv.com diff --git a/data/fetch_os_creds.sh b/data/fetch_os_creds.sh new file mode 100755 index 00000000..3b493e14 --- /dev/null +++ b/data/fetch_os_creds.sh @@ -0,0 +1,188 @@ +#!/bin/bash +############################################################################## +# Copyright (c) 2015 Ericsson AB and others. +# jose.lausuch@ericsson.com +# 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 +############################################################################## + + +usage() { + echo "usage: $0 -d <destination> -i <installer_type> -a <installer_ip>" >&2 +} + +info () { + logger -s -t "fetch_os_creds.info" "$*" +} + + +error () { + logger -s -t "fetch_os_creds.error" "$*" + exit 1 +} + + +verify_connectivity() { + local ip=$1 + info "Verifying connectivity to $ip..." + for i in $(seq 0 10); do + if ping -c 1 -W 1 $ip > /dev/null; then + info "$ip is reachable!" + return 0 + fi + sleep 1 + done + error "Can not talk to $ip." +} + + + +#Get options +while getopts ":d:i:a:h:" optchar; do + case "${optchar}" in + d) dest_path=${OPTARG} ;; + i) installer_type=${OPTARG} ;; + a) installer_ip=${OPTARG} ;; + *) echo "Non-option argument: '-${OPTARG}'" >&2 + usage + exit 2 + ;; + esac +done + +# set vars from env if not provided by user as options +dest_path=${dest_path:-$HOME/opnfv-openrc.sh} +installer_type=${installer_type:-$INSTALLER_TYPE} +installer_ip=${installer_ip:-$INSTALLER_IP} + +if [ -z $dest_path ] || [ -z $installer_type ] || [ -z $installer_ip ]; then + usage + exit 2 +fi + +# Checking if destination path is valid +if [ -d $dest_path ]; then + error "Please provide the full destination path for the credentials file including the filename" +else + # Check if we can create the file (e.g. path is correct) + touch $dest_path || error "Cannot create the file specified. Check that the path is correct and run the script again." +fi + + +ssh_options="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" + +# Start fetching the files +if [ "$installer_type" == "fuel" ]; then + #ip_fuel="10.20.0.2" + verify_connectivity $installer_ip + + # Check if controller is alive (online='True') + controller_ip=$(sshpass -p r00tme ssh 2>/dev/null $ssh_options root@${installer_ip} \ + 'fuel node | grep controller | grep True | awk "{print \$10}" | tail -1') &> /dev/null + + if [ -z $controller_ip ]; then + error "The controller $controller_ip is not up. Please check that the POD is correctly deployed." + fi + + info "Fetching rc file from controller $controller_ip..." + sshpass -p r00tme ssh 2>/dev/null $ssh_options root@${installer_ip} \ + "scp $ssh_options ${controller_ip}:/root/openrc ." &> /dev/null + sshpass -p r00tme scp 2>/dev/null $ssh_options root@${installer_ip}:~/openrc $dest_path &> /dev/null + + #This file contains the mgmt keystone API, we need the public one for our rc file + admin_ip=$(cat $dest_path | grep "OS_AUTH_URL" | sed 's/^.*\=//' | sed "s/^\([\"']\)\(.*\)\1\$/\2/g" | sed s'/\/$//') + public_ip=$(sshpass -p r00tme ssh $ssh_options root@${installer_ip} \ + "ssh ${controller_ip} 'source openrc; keystone endpoint-list'" \ + | grep $admin_ip | sed 's/ /\n/g' | grep ^http | head -1) &> /dev/null + #| grep http | head -1 | cut -d '|' -f 4 | sed 's/v1\/.*/v1\//' | sed 's/ //g') &> /dev/null + #NOTE: this is super ugly sed 's/v1\/.*/v1\//'OS_AUTH_URL + # but sometimes the output of endpoint-list is like this: http://172.30.9.70:8004/v1/%(tenant_id)s + +elif [ "$installer_type" == "apex" ]; then + verify_connectivity $installer_ip + + # The credentials file is located in the Instack VM (192.0.2.1) + # NOTE: This might change for bare metal deployments + info "Fetching rc file from Instack VM $installer_ip..." + if [ -f /root/.ssh/id_rsa ]; then + chmod 600 /root/.ssh/id_rsa + fi + sudo scp $ssh_options root@$installer_ip:/home/stack/overcloudrc $dest_path + +elif [ "$installer_type" == "compass" ]; then + verify_connectivity $installer_ip + controller_ip=$(sshpass -p'root' ssh 2>/dev/null $ssh_options root@${installer_ip} \ + 'mysql -ucompass -pcompass -Dcompass -e"select * from cluster;"' \ + | awk -F"," '{for(i=1;i<NF;i++)if($i~/\"host1\"/) {print $(i+1);break;}}' \ + | grep -oP "\d+.\d+.\d+.\d+") + + if [ -z $controller_ip ]; then + error "The controller $controller_ip is not up. Please check that the POD is correctly deployed." + fi + + info "Fetching rc file from controller $controller_ip..." + sshpass -p root ssh 2>/dev/null $ssh_options root@${installer_ip} \ + "scp $ssh_options ${controller_ip}:/opt/admin-openrc.sh ." &> /dev/null + sshpass -p root scp 2>/dev/null $ssh_options root@${installer_ip}:~/admin-openrc.sh $dest_path &> /dev/null + echo 'export OS_REGION_NAME=regionOne' >> $dest_path + + info "This file contains the mgmt keystone API, we need the public one for our rc file" + admin_ip=$(cat $dest_path | grep "OS_AUTH_URL" | sed 's/^.*\=//' | sed "s/^\([\"']\)\(.*\)\1\$/\2/g" | sed s'/\/$//') + info "admin_ip: $admin_ip" + public_ip=$(sshpass -p root ssh $ssh_options root@${installer_ip} \ + "ssh ${controller_ip} 'source /opt/admin-openrc.sh; keystone endpoint-list'" \ + | grep $admin_ip | sed 's/ /\n/g' | grep ^http | head -1) + info "public_ip: $public_ip" + + +elif [ "$installer_type" == "joid" ]; then + # do nothing...for the moment + # we can either do a scp from the jumphost or use the -v option to transmit the param to the docker file + echo "Do nothing, creds will be provided through volume option at docker creation for joid" + +elif [ "$installer_type" == "foreman" ]; then + #ip_foreman="172.30.10.73" + controller="oscontroller1.opnfv.com" + verify_connectivity $installer_ip + + # Check if controller is alive (here is more difficult to get the ip from a command like "fuel node") + sshpass -p vagrant ssh $ssh_options root@${installer_ip} \ + "sshpass -p Op3nStack ssh $ssh_options root@${controller} 'ls'" &> /dev/null + if [ $? -ne 0 ]; then + error "The controller ${controller} is not up. Please check that the POD is correctly deployed." + fi + + info "Fetching openrc from a Foreman Controller '${controller}'..." + sshpass -p vagrant ssh $ssh_options root@${installer_ip} \ + "sshpass -p Op3nStack scp $ssh_options root@${controller}:~/keystonerc_admin ." &> /dev/null + sshpass -p vagrant scp $ssh_options root@${installer_ip}:~/keystonerc_admin $dest_path &> /dev/null + + #This file contains the mgmt keystone API, we need the public one for our rc file + admin_ip=$(cat $dest_path | grep "OS_AUTH_URL" | sed 's/^.*\=//' | sed "s/^\([\"']\)\(.*\)\1\$/\2/g" | sed s'/\/$//') + public_ip=$(sshpass -p vagrant ssh $ssh_options root@${installer_ip} \ + "sshpass -p Op3nStack ssh $ssh_options root@${controller} \ + 'source keystonerc_admin;keystone endpoint-list'" \ + | grep $admin_ip | sed 's/ /\n/g' | grep ^http | head -1) &> /dev/null + +else + error "Installer $installer is not supported by this script" +fi + + +if [ ! -f $dest_path ]; then + error "There has been an error retrieving the credentials" +fi + +if [ "$public_ip" != "" ]; then + info "Exchanging keystone public IP in rc file to $public_ip" + sed -i "/OS_AUTH_URL/c\export OS_AUTH_URL=\'$public_ip'" $dest_path +fi + + + +echo "-------- Credentials: --------" +cat $dest_path + +exit 0 diff --git a/data/file_permission.sh b/data/file_permission.sh new file mode 100755 index 00000000..01a77d50 --- /dev/null +++ b/data/file_permission.sh @@ -0,0 +1,3 @@ +#! /bin/bash +chmod 0600 data/QtipKey +chmod 0600 data/QtipKey.pub diff --git a/data/qtip_creds.sh b/data/qtip_creds.sh new file mode 100755 index 00000000..6f19305a --- /dev/null +++ b/data/qtip_creds.sh @@ -0,0 +1,30 @@ +#! /bin/bash + +DEST_IP=$1 +echo $INSTALLER_TYPE +echo $INSTALLER_IP +sshoptions="-o StrictHostKeyChecking=no" +case "$INSTALLER_TYPE" in + apex) + scp $sshoptions -i $APEX_KEY ./data/QtipKey.pub stack@$INSTALLER_IP:/home/stack + scp $sshoptions -i $APEX_KEY ./data/QtipKey stack@$INSTALLER_IP:/home/stack + ssh $sshoptions -i $APEX_KEY stack@$INSTALLER_IP "ssh-copy-id $sshoptions -i /home/stack/QtipKey.pub heat-admin@$DEST_IP && rm -rf /home/stack/QtipKey && rm -rf /home/stack/QtipKey.pub" + ;; + fuel) + PSWD="r00tme" + sshpass -p $PSWD scp $sshoptions ./data/QtipKey.pub root@$INSTALLER_IP:/root + sshpass -p $PSWD scp $sshoptions ./data/QtipKey root@$INSTALLER_IP:/root + sshpass -p $PSWD ssh $sshoptions root@$INSTALLER_IP "grep -q '\-F /dev/null ' /usr/bin/ssh-copy-id || sed -i 's/\(ssh -i.*$\)/\1\n -F \/dev\/null \\\/g' `which ssh-copy-id`" + sshpass -p $PSWD ssh $sshoptions root@$INSTALLER_IP "ssh-copy-id $sshoptions -i /root/QtipKey root@$DEST_IP && rm -rf /root/QtipKey && rm -rf /root/QtipKey.pub" + ;; + compass) + PSWD="root" + sshpass -p $PSWD scp $sshoptions ./data/QtipKey.pub root@$INSTALLER_IP:/root + sshpass -p $PSWD scp $sshoptions ./data/QtipKey root@$INSTALLER_IP:/root + sshpass -p $PSWD ssh $sshoptions root@$INSTALLER_IP "ssh-copy-id $sshoptions -i /root/QtipKey.pub root@$DEST_IP && rm -rf /root/QtipKey && rm -rf /root/QtipKey.pub" + ;; + joid) + PSWD="joid";; + *) + echo "Unkown installer $INSTALLER_TYPE specified";; +esac diff --git a/data/ref_results/compute_benchmarks_indices.py b/data/ref_results/compute_benchmarks_indices.py new file mode 100644 index 00000000..e46b8771 --- /dev/null +++ b/data/ref_results/compute_benchmarks_indices.py @@ -0,0 +1,161 @@ +from index_calculation import generic_index as get_index +from index_calculation import get_reference +from result_accum import result_concat as concat + + +def dpi_index(): + dpi_dict = concat('../../results/dpi/') + dpi_bm_ref = get_reference('compute', 'dpi_bm') + dpi_bm_index = get_index(dpi_dict, 'dpi_bm', dpi_bm_ref, '4 DPI result', 'DPI_benchmark(Gb/s)') + + dpi_vm_ref = get_reference('compute', 'dpi_vm') + dpi_vm_index = get_index(dpi_dict, 'dpi_vm', dpi_vm_ref, '4 DPI result', 'DPI_benchmark(Gb/s)') + + dpi_index = (dpi_bm_index + dpi_vm_index) / 2 + dpi_dict_i = {} + dpi_dict_i['1. Index'] = dpi_index + dpi_dict_i['2. Results'] = dpi_dict + return dpi_dict_i + + +def dhrystone_index(): + + dhrystone_dict = concat('../../results/dhrystone/') + dhrystone_single_bm_ref = get_reference('compute', 'dhrystone_bm', 'single_cpu') + dhrystone_single_bm_index = get_index(dhrystone_dict, 'dhrystone_bm', dhrystone_single_bm_ref, '4 Dhrystone result', '2.Single CPU test', '2.Index score') + + dhrystone_multi_bm_ref = get_reference('compute', 'dhrystone_bm', 'multi_cpu') + dhrystone_multi_bm_index = get_index(dhrystone_dict, 'dhrystone_bm', dhrystone_multi_bm_ref, '4 Dhrystone result', '3.Multi CPU test', '2.Index score') + + dhrystone_bm_index = (dhrystone_single_bm_index + dhrystone_multi_bm_index) / 2 + + dhrystone_single_vm_ref = get_reference('compute', 'dhrystone_vm', 'single_cpu') + dhrystone_single_vm_index = get_index(dhrystone_dict, 'dhrystone_vm', dhrystone_single_vm_ref, '4 Dhrystone result', '2.Single CPU test', '2.Index score') + + dhrystone_multi_vm_ref = get_reference('compute', 'dhrystone_vm', 'multi_cpu') + dhrystone_multi_vm_index = get_index(dhrystone_dict, 'dhrystone_vm', dhrystone_multi_vm_ref, '4 Dhrystone result', '3.Multi CPU test', '2.Index score') + + dhrystone_vm_index = (dhrystone_single_vm_index + dhrystone_multi_vm_index) / 2 + + dhrystone_index = (dhrystone_bm_index + dhrystone_vm_index) / 2 + dhrystone_dict_i = {} + dhrystone_dict_i['1. Index'] = dhrystone_index + dhrystone_dict_i['2. Results'] = dhrystone_dict + return dhrystone_dict_i + + +def whetstone_index(): + + whetstone_dict = concat('../../results/whetstone/') + whetstone_single_bm_ref = get_reference('compute', 'whetstone_bm', 'single_cpu') + whetstone_single_bm_index = get_index(whetstone_dict, 'whetstone_bm', whetstone_single_bm_ref, '4 Whetstone result', '2.Single CPU test', '2.Index score') + + whetstone_multi_bm_ref = get_reference('compute', 'whetstone_bm', 'multi_cpu') + whetstone_multi_bm_index = get_index(whetstone_dict, 'whetstone_bm', whetstone_multi_bm_ref, '4 Whetstone result', '3.Multi CPU test', '2.Index score') + + whetstone_bm_index = (whetstone_single_bm_index + whetstone_multi_bm_index) / 2 + + whetstone_single_vm_ref = get_reference('compute', 'whetstone_vm', 'single_cpu') + whetstone_single_vm_index = get_index(whetstone_dict, 'whetstone_vm', whetstone_single_vm_ref, '4 Whetstone result', '2.Single CPU test', '2.Index score') + + whetstone_multi_vm_ref = get_reference('compute', 'whetstone_vm', 'multi_cpu') + whetstone_multi_vm_index = get_index(whetstone_dict, 'whetstone_vm', whetstone_multi_vm_ref, '4 Whetstone result', '3.Multi CPU test', '2.Index score') + + whetstone_vm_index = (whetstone_single_vm_index + whetstone_multi_vm_index) / 2 + + whetstone_index = (whetstone_bm_index + whetstone_vm_index) / 2 + whetstone_dict_i = {} + whetstone_dict_i['1. Index'] = whetstone_index + whetstone_dict_i['2. Results'] = whetstone_dict + return whetstone_dict_i + + +def ramspeed_index(): + + ramspeed_dict = concat('../../results/ramspeed/') + ramspeed_int_bm_ref = get_reference('compute', 'ramspeed_bm', 'INTmem', 'Average (MB/s)') + ramspeed_int_bm_index = get_index(ramspeed_dict, 'ramspeed_bm', ramspeed_int_bm_ref, '4 RamSpeed result', '1. INTmem bandwidth', '5. Average (MB/s)') + + ramspeed_float_bm_ref = get_reference('compute', 'ramspeed_bm', 'FLOATmem', 'Average (MB/s)') + ramspeed_float_bm_index = get_index(ramspeed_dict, 'ramspeed_bm', ramspeed_float_bm_ref, '4 RamSpeed result', '2. FLOATmem bandwidth', '5. Average (MB/s)') + + ramspeed_bm_index = (ramspeed_int_bm_index + ramspeed_float_bm_index) / 2 + + ramspeed_int_vm_ref = get_reference('compute', 'ramspeed_vm', 'INTmem', 'Average (MB/s)') + ramspeed_int_vm_index = get_index(ramspeed_dict, 'ramspeed_vm', ramspeed_int_vm_ref, '4 RamSpeed result', '1. INTmem bandwidth', '5. Average (MB/s)') + + ramspeed_float_vm_ref = get_reference('compute', 'ramspeed_vm', 'FLOATmem', 'Average (MB/s)') + ramspeed_float_vm_index = get_index(ramspeed_dict, 'ramspeed_vm', ramspeed_float_vm_ref, '4 RamSpeed result', '2. FLOATmem bandwidth', '5. Average (MB/s)') + + ramspeed_vm_index = (ramspeed_int_vm_index + ramspeed_float_vm_index) / 2 + + ramspeed_index = (ramspeed_vm_index + ramspeed_bm_index) / 2 + + ramspeed_dict_i = {} + ramspeed_dict_i['1. Index'] = ramspeed_index + ramspeed_dict_i['2. Results'] = ramspeed_dict + return ramspeed_dict_i + + +def ssl_index(): + + ssl_dict = concat('../../results/ssl/') + + ssl_RSA512b_bm_ref = get_reference('compute', 'ssl_bm', 'RSA', '512b') + ssl_RSA1024b_bm_ref = get_reference('compute', 'ssl_bm', 'RSA', '1024b') + ssl_RSA2048b_bm_ref = get_reference('compute', 'ssl_bm', 'RSA', '2048b') + ssl_RSA4096b_bm_ref = get_reference('compute', 'ssl_bm', 'RSA', '4096b') + + ssl_AES16B_bm_ref = get_reference('compute', 'ssl_bm', 'AES', '16B') + ssl_AES64B_bm_ref = get_reference('compute', 'ssl_bm', 'AES', '64B') + ssl_AES256B_bm_ref = get_reference('compute', 'ssl_bm', 'AES', '256B') + ssl_AES1024B_bm_ref = get_reference('compute', 'ssl_bm', 'AES', '1024B') + ssl_AES8192B_bm_ref = get_reference('compute', 'ssl_bm', 'AES', '8192B') + + ssl_RSA512b_bm_index = get_index(ssl_dict, "ssl_bm", ssl_RSA512b_bm_ref, '4 SSL result', '2. RSA signatures', '1. 512 bits (sign/s)') + ssl_RSA1024b_bm_index = get_index(ssl_dict, "ssl_bm", ssl_RSA1024b_bm_ref, '4 SSL result', '2. RSA signatures', '2. 1024 bits (sign/s)') + ssl_RSA2048b_bm_index = get_index(ssl_dict, "ssl_bm", ssl_RSA2048b_bm_ref, '4 SSL result', '2. RSA signatures', '3. 2048 bits (sign/s)') + ssl_RSA4096b_bm_index = get_index(ssl_dict, "ssl_bm", ssl_RSA4096b_bm_ref, '4 SSL result', '2. RSA signatures', '4. 4096 bits (sign/s)') + ssl_RSA_bm_index = (ssl_RSA512b_bm_index + ssl_RSA1024b_bm_index + ssl_RSA2048b_bm_index + ssl_RSA4096b_bm_index) / 4 + + ssl_AES16B_bm_index = get_index(ssl_dict, "ssl_bm", ssl_AES16B_bm_ref, '4 SSL result', '3. AES-128-cbc throughput', '1. 16 Bytes block (B/sec)') + ssl_AES64B_bm_index = get_index(ssl_dict, "ssl_bm", ssl_AES64B_bm_ref, '4 SSL result', '3. AES-128-cbc throughput', '2. 64 Bytes block (B/sec)') + ssl_AES256B_bm_index = get_index(ssl_dict, "ssl_bm", ssl_AES256B_bm_ref, '4 SSL result', '3. AES-128-cbc throughput', '3. 256 Bytes block (B/sec)') + ssl_AES1024B_bm_index = get_index(ssl_dict, "ssl_bm", ssl_AES1024B_bm_ref, '4 SSL result', '3. AES-128-cbc throughput', '4. 1024 Bytes block (B/sec)') + ssl_AES8192B_bm_index = get_index(ssl_dict, "ssl_bm", ssl_AES8192B_bm_ref, '4 SSL result', '3. AES-128-cbc throughput', '5. 8192 Bytes block (B/sec)') + ssl_AES_bm_index = (ssl_AES16B_bm_index + ssl_AES64B_bm_index + ssl_AES256B_bm_index + ssl_AES1024B_bm_index + ssl_AES8192B_bm_index) / 5 + + ssl_bm_index = (ssl_RSA_bm_index + ssl_AES_bm_index) / 2 + + ssl_RSA512b_vm_ref = get_reference('compute', 'ssl_vm', 'RSA', '512b') + ssl_RSA1024b_vm_ref = get_reference('compute', 'ssl_vm', 'RSA', '1024b') + ssl_RSA2048b_vm_ref = get_reference('compute', 'ssl_vm', 'RSA', '2048b') + ssl_RSA4096b_vm_ref = get_reference('compute', 'ssl_vm', 'RSA', '4096b') + + ssl_AES16B_vm_ref = get_reference('compute', 'ssl_vm', 'AES', '16B') + ssl_AES64B_vm_ref = get_reference('compute', 'ssl_vm', 'AES', '64B') + ssl_AES256B_vm_ref = get_reference('compute', 'ssl_vm', 'AES', '256B') + ssl_AES1024B_vm_ref = get_reference('compute', 'ssl_vm', 'AES', '1024B') + ssl_AES8192B_vm_ref = get_reference('compute', 'ssl_vm', 'AES', '8192B') + + ssl_RSA512b_vm_index = get_index(ssl_dict, "ssl_vm", ssl_RSA512b_vm_ref, '4 SSL result', '2. RSA signatures', '1. 512 bits (sign/s)') + ssl_RSA1024b_vm_index = get_index(ssl_dict, "ssl_vm", ssl_RSA1024b_vm_ref, '4 SSL result', '2. RSA signatures', '2. 1024 bits (sign/s)') + ssl_RSA2048b_vm_index = get_index(ssl_dict, "ssl_vm", ssl_RSA2048b_vm_ref, '4 SSL result', '2. RSA signatures', '3. 2048 bits (sign/s)') + ssl_RSA4096b_vm_index = get_index(ssl_dict, "ssl_vm", ssl_RSA4096b_vm_ref, '4 SSL result', '2. RSA signatures', '4. 4096 bits (sign/s)') + ssl_RSA_vm_index = (ssl_RSA512b_vm_index + ssl_RSA1024b_vm_index + ssl_RSA2048b_vm_index + ssl_RSA4096b_vm_index) / 4 + + ssl_AES16B_vm_index = get_index(ssl_dict, "ssl_vm", ssl_AES16B_vm_ref, '4 SSL result', '3. AES-128-cbc throughput', '1. 16 Bytes block (B/sec)') + ssl_AES64B_vm_index = get_index(ssl_dict, "ssl_vm", ssl_AES64B_vm_ref, '4 SSL result', '3. AES-128-cbc throughput', '2. 64 Bytes block (B/sec)') + ssl_AES256B_vm_index = get_index(ssl_dict, "ssl_vm", ssl_AES256B_vm_ref, '4 SSL result', '3. AES-128-cbc throughput', '3. 256 Bytes block (B/sec)') + ssl_AES1024B_vm_index = get_index(ssl_dict, "ssl_vm", ssl_AES1024B_vm_ref, '4 SSL result', '3. AES-128-cbc throughput', '4. 1024 Bytes block (B/sec)') + ssl_AES8192B_vm_index = get_index(ssl_dict, "ssl_vm", ssl_AES8192B_vm_ref, '4 SSL result', '3. AES-128-cbc throughput', '5. 8192 Bytes block (B/sec)') + ssl_AES_vm_index = (ssl_AES16B_vm_index + ssl_AES64B_vm_index + ssl_AES256B_vm_index + ssl_AES1024B_vm_index + ssl_AES8192B_vm_index) / 5 + + ssl_vm_index = (ssl_RSA_vm_index + ssl_AES_vm_index) / 2 + + ssl_index = (ssl_bm_index + ssl_vm_index) / 2 + + ssl_dict_i = {} + ssl_dict_i['1. Index'] = ssl_index + ssl_dict_i['2. Results'] = ssl_dict + return ssl_dict_i diff --git a/data/ref_results/compute_suite.py b/data/ref_results/compute_suite.py new file mode 100644 index 00000000..bcaf83c8 --- /dev/null +++ b/data/ref_results/compute_suite.py @@ -0,0 +1,50 @@ +import json +import compute_benchmarks_indices as benchmark_indices + + +compute_dict = {} +try: + compute_dict['DPI'] = benchmark_indices.dpi_index() +except OSError: + pass + +try: + compute_dict['Dhrystone'] = benchmark_indices.dhrystone_index() +except OSError: + pass + +try: + compute_dict['Whetstone'] = benchmark_indices.whetstone_index() +except OSError: + pass + +try: + compute_dict['SSL'] = benchmark_indices.ssl_index() +except OSError: + pass + +try: + compute_dict['RamSpeed'] = benchmark_indices.ramspeed_index() +except OSError: + pass + +compute_bench_list = ['DPI', 'Dhrystone', 'Whetstone', 'SSL', 'RamSpeed'] +l = len(compute_bench_list) + +temp = 0 +for benchmark in compute_bench_list: + try: + temp = temp + float(compute_dict[benchmark]['1. Index']) + except KeyError: + l = l - 1 + pass + +if l == 0: + print "No compute suite results found" +else: + compute_suite_index = temp / l + compute_dict_f = {} + compute_dict_f['index'] = compute_suite_index + compute_dict_f['suite results'] = compute_dict + with open('../../results/compute_result.json', 'w+') as result_json: + json.dump(compute_dict_f, result_json, indent=4, sort_keys=True) diff --git a/data/ref_results/generator_ref_json.py b/data/ref_results/generator_ref_json.py new file mode 100644 index 00000000..6b2d813c --- /dev/null +++ b/data/ref_results/generator_ref_json.py @@ -0,0 +1,81 @@ +import json + +dict_ref = {} +dict_ref['compute'] = {} +dict_ref['compute']['dpi_bm'] = 8.12 +dict_ref['compute']['dpi_vm'] = 22.12 + +dict_ref['compute']['whetstone_bm'] = {} +dict_ref['compute']['whetstone_vm'] = {} +dict_ref['compute']['whetstone_bm']['single_cpu'] = 806.1 +dict_ref['compute']['whetstone_bm']['multi_cpu'] = 41483.3 +dict_ref['compute']['whetstone_vm']['single_cpu'] = 789.0 +dict_ref['compute']['whetstone_vm']['multi_cpu'] = 2950.6 + +dict_ref['compute']['dhrystone_bm'] = {} +dict_ref['compute']['dhrystone_vm'] = {} +dict_ref['compute']['dhrystone_bm']['single_cpu'] = 3231.7 +dict_ref['compute']['dhrystone_bm']['multi_cpu'] = 103362.1 +dict_ref['compute']['dhrystone_vm']['single_cpu'] = 2953.6 +dict_ref['compute']['dhrystone_vm']['multi_cpu'] = 10585.8 + +dict_ref['compute']['ssl_bm'] = {} +dict_ref['compute']['ssl_bm']['RSA'] = {} +dict_ref['compute']['ssl_bm']['AES'] = {} +dict_ref['compute']['ssl_bm']['RSA']['512b'] = 22148.9 +dict_ref['compute']['ssl_bm']['RSA']['1024b'] = 7931.44 +dict_ref['compute']['ssl_bm']['RSA']['2048b'] = 1544.3 +dict_ref['compute']['ssl_bm']['RSA']['4096b'] = 161.92 +dict_ref['compute']['ssl_bm']['AES']['16B'] = 735490250 +dict_ref['compute']['ssl_bm']['AES']['64B'] = 788429210 +dict_ref['compute']['ssl_bm']['AES']['256B'] = 803323650 +dict_ref['compute']['ssl_bm']['AES']['1024B'] = 808861020 +dict_ref['compute']['ssl_bm']['AES']['8192B'] = 807701160 + +dict_ref['compute']['ssl_vm'] = {} +dict_ref['compute']['ssl_vm']['RSA'] = {} +dict_ref['compute']['ssl_vm']['AES'] = {} +dict_ref['compute']['ssl_vm']['RSA']['512b'] = 22148.9 +dict_ref['compute']['ssl_vm']['RSA']['1024b'] = 7931.44 +dict_ref['compute']['ssl_vm']['RSA']['2048b'] = 1544.3 +dict_ref['compute']['ssl_vm']['RSA']['4096b'] = 161.92 +dict_ref['compute']['ssl_vm']['AES']['16B'] = 735490250 +dict_ref['compute']['ssl_vm']['AES']['64B'] = 788429210 +dict_ref['compute']['ssl_vm']['AES']['256B'] = 803323650 +dict_ref['compute']['ssl_vm']['AES']['1024B'] = 808861020 +dict_ref['compute']['ssl_vm']['AES']['8192B'] = 807701160 + +dict_ref['compute']['ramspeed_bm'] = {} +dict_ref['compute']['ramspeed_bm']['INTmem'] = {} +dict_ref['compute']['ramspeed_bm']['FLOATmem'] = {} +dict_ref['compute']['ramspeed_bm']['INTmem']['Average (MB/s)'] = 12268.38 +dict_ref['compute']['ramspeed_bm']['FLOATmem']['Average (MB/s)'] = 9758.79 + +dict_ref['compute']['ramspeed_vm'] = {} +dict_ref['compute']['ramspeed_vm']['INTmem'] = {} +dict_ref['compute']['ramspeed_vm']['FLOATmem'] = {} +dict_ref['compute']['ramspeed_vm']['INTmem']['Average (MB/s)'] = 12147.59 +dict_ref['compute']['ramspeed_vm']['FLOATmem']['Average (MB/s)'] = 9064.09 + +dict_ref['storage'] = {} +dict_ref['storage']['fio_bm'] = {} +dict_ref['storage']['fio_bm']['read'] = {} +dict_ref['storage']['fio_bm']['write'] = {} +dict_ref['storage']['fio_bm']['read']['IOPS'] = 6693 +dict_ref['storage']['fio_bm']['write']['IOPS'] = 6688 + +dict_ref['storage']['fio_vm'] = {} +dict_ref['storage']['fio_vm']['read'] = {} +dict_ref['storage']['fio_vm']['write'] = {} +dict_ref['storage']['fio_vm']['read']['IOPS'] = 2239 +dict_ref['storage']['fio_vm']['write']['IOPS'] = 2237 + +dict_ref['network'] = {} +dict_ref['network']['iperf_bm'] = {} +dict_ref['network']['iperf_vm'] = {} +dict_ref['network']['iperf_vm_2'] = {} +dict_ref['network']['iperf_bm']['throughput received(b/s)'] = 944473000.0 +dict_ref['network']['iperf_vm']['throughput received(b/s)'] = 14416700000.0 +dict_ref['network']['iperf_vm_2']['throughput received(b/s)'] = 2461530000.0 +with open('reference.json', 'w+') as result_json: + json.dump(dict_ref, result_json, indent=4, sort_keys=True) diff --git a/data/ref_results/index_calculation.py b/data/ref_results/index_calculation.py new file mode 100644 index 00000000..e3c75350 --- /dev/null +++ b/data/ref_results/index_calculation.py @@ -0,0 +1,41 @@ +import json + + +def compute_index(total_measured, ref_result, count): + try: + average = float(total_measured / count) + + except ZeroDivisionError: + average = 0 + index = average / ref_result + return index + + +def get_reference(*args): + + with open('./reference.json') as reference_file: + reference_djson = json.load(reference_file) + for arg in args: + ref_n = reference_djson.get(str(arg)) + reference_djson = reference_djson.get(str(arg)) + return ref_n + + +def generic_index(dict_gen, testcase, reference_num, *args): + c = len(args) + count = 0 + total = 0 + result = 0 + for k, v in dict_gen.iteritems(): + dict_temp = dict_gen[k] + if dict_gen[k]['1 Testcase Name'] == str(testcase): + count = count + 1 + for arg in args: + if arg == args[c - 1]: + try: + result = float(dict_temp.get(str(arg))) + except ValueError: + result = float(dict_temp.get(str(arg))[:-1]) * 1000 + dict_temp = dict_temp.get(str(arg)) + total = total + result + return compute_index(total, reference_num, count) diff --git a/data/ref_results/network_benchmarks_indices.py b/data/ref_results/network_benchmarks_indices.py new file mode 100644 index 00000000..96ccd4fc --- /dev/null +++ b/data/ref_results/network_benchmarks_indices.py @@ -0,0 +1,20 @@ +from index_calculation import generic_index as get_index +from index_calculation import get_reference +from result_accum import result_concat as concat + + +def iperf_index(): + iperf_dict = concat('../../results/iperf/') + iperf_bm_ref = get_reference('network', 'iperf_bm', 'throughput received(b/s)') + iperf_bm_index = get_index(iperf_dict, 'iperf_bm', iperf_bm_ref, '4 IPERF result', '2. Bandwidth', '2. throughput Received (b/s)') + iperf_vm_ref = get_reference('network', 'iperf_vm', 'throughput received(b/s)') + iperf_vm_index = get_index(iperf_dict, 'iperf_vm', iperf_vm_ref, '4 IPERF result', '2. Bandwidth', '2. throughput Received (b/s)') + + iperf_vm_2_ref = get_reference('network', 'iperf_vm_2', 'throughput received(b/s)') + iperf_vm_2_index = get_index(iperf_dict, 'iperf_vm_2', iperf_vm_2_ref, '4 IPERF result', '2. Bandwidth', '2. throughput Received (b/s)') + iperf_index = float(iperf_bm_index + iperf_vm_index + iperf_vm_2_index) / 3 + print iperf_index + iperf_dict_i = {} + iperf_dict_i['1. Index'] = iperf_index + iperf_dict_i['2. Results'] = iperf_dict + return iperf_dict_i diff --git a/data/ref_results/network_suite.py b/data/ref_results/network_suite.py new file mode 100644 index 00000000..37dcb093 --- /dev/null +++ b/data/ref_results/network_suite.py @@ -0,0 +1,30 @@ +import json +import network_benchmarks_indices as benchmark_indices + + +network_dict = {} +try: + network_dict['IPERF'] = benchmark_indices.iperf_index() +except: + pass + +network_bench_list = ['IPERF'] +temp = 0 +l = len(network_bench_list) + +for benchmark in network_bench_list: + try: + temp = temp + float(network_dict[benchmark]['1. Index']) + except: + l = l - 1 + pass + +if l == 0: + print "No network results found" +else: + network_suite_index = temp / len(network_bench_list) + network_dict_f = {} + network_dict_f['index'] = network_suite_index + network_dict_f['suite results'] = network_dict + with open('../../results/network_result.json', 'w+') as result_json: + json.dump(network_dict_f, result_json, indent=4, sort_keys=True) diff --git a/data/ref_results/reference.json b/data/ref_results/reference.json new file mode 100644 index 00000000..cfcbfc3b --- /dev/null +++ b/data/ref_results/reference.json @@ -0,0 +1,97 @@ +{ + "compute": { + "dhrystone_bm": { + "multi_cpu": 103362.1, + "single_cpu": 3231.7 + }, + "dhrystone_vm": { + "multi_cpu": 10585.8, + "single_cpu": 2953.6 + }, + "dpi_bm": 8.12, + "dpi_vm": 22.12, + "ramspeed_bm": { + "FLOATmem": { + "Average (MB/s)": 9758.79 + }, + "INTmem": { + "Average (MB/s)": 12268.38 + } + }, + "ramspeed_vm": { + "FLOATmem": { + "Average (MB/s)": 9064.09 + }, + "INTmem": { + "Average (MB/s)": 12147.59 + } + }, + "ssl_bm": { + "AES": { + "1024B": 808861020, + "16B": 735490250, + "256B": 803323650, + "64B": 788429210, + "8192B": 807701160 + }, + "RSA": { + "1024b": 7931.44, + "2048b": 1544.3, + "4096b": 161.92, + "512b": 22148.9 + } + }, + "ssl_vm": { + "AES": { + "1024B": 808861020, + "16B": 735490250, + "256B": 803323650, + "64B": 788429210, + "8192B": 807701160 + }, + "RSA": { + "1024b": 7931.44, + "2048b": 1544.3, + "4096b": 161.92, + "512b": 22148.9 + } + }, + "whetstone_bm": { + "multi_cpu": 41483.3, + "single_cpu": 806.1 + }, + "whetstone_vm": { + "multi_cpu": 2950.6, + "single_cpu": 789.0 + } + }, + "network": { + "iperf_bm": { + "throughput received(b/s)": 944473000.0 + }, + "iperf_vm": { + "throughput received(b/s)": 14416700000.0 + }, + "iperf_vm_2": { + "throughput received(b/s)": 2461530000.0 + } + }, + "storage": { + "fio_bm": { + "read": { + "IOPS": 6693 + }, + "write": { + "IOPS": 6688 + } + }, + "fio_vm": { + "read": { + "IOPS": 2239 + }, + "write": { + "IOPS": 2237 + } + } + } +}
\ No newline at end of file diff --git a/data/ref_results/result_accum.py b/data/ref_results/result_accum.py new file mode 100644 index 00000000..6cd55886 --- /dev/null +++ b/data/ref_results/result_accum.py @@ -0,0 +1,31 @@ +import os +import json + + +def result_concat(targ_dir): + list_vm = [] + list_bm = [] + diction = {} + + for file in os.listdir(targ_dir): + if file.endswith(".json"): + if file.startswith("instance"): + print str(file) + list_vm.append(file) + else: + list_bm.append(file) + l = len(list_bm) + k = len(list_vm) + + for x in range(0, l): + file_t = list_bm[x] + with open(targ_dir + file_t) as result_file: + result_djson = json.load(result_file) + diction['Baremetal' + str(int(x + 1))] = result_djson + + for x in range(0, k): + file_t = list_vm[x] + with open(targ_dir + file_t) as result_file: + result_djson = json.load(result_file) + diction['Virtual Machine ' + str(x + 1)] = result_djson + return diction diff --git a/data/ref_results/storage_benchmarks_indices.py b/data/ref_results/storage_benchmarks_indices.py new file mode 100644 index 00000000..f51b3d6e --- /dev/null +++ b/data/ref_results/storage_benchmarks_indices.py @@ -0,0 +1,30 @@ +from index_calculation import generic_index as get_index +from index_calculation import get_reference +from result_accum import result_concat as concat + + +def fio_index(): + fio_dict = concat('../../results/fio/') + fio_r_bm_ref = get_reference('storage', 'fio_bm', 'read', 'IOPS') + fio_r_bm_index = get_index(fio_dict, 'fio_bm', fio_r_bm_ref, '4 FIO result', 'Job_0', 'read', 'IO/sec') + + fio_w_bm_ref = get_reference('storage', 'fio_bm', 'write', 'IOPS') + fio_w_bm_index = get_index(fio_dict, 'fio_bm', fio_w_bm_ref, '4 FIO result', 'Job_0', 'write', 'IO/sec') + + fio_bm_index = (fio_r_bm_index + fio_w_bm_index) / 2 + + fio_r_vm_ref = get_reference('storage', 'fio_vm', 'read', 'IOPS') + fio_r_vm_index = get_index(fio_dict, 'fio_vm', fio_r_vm_ref, '4 FIO result', 'Job_0', 'read', 'IO/sec') + + fio_w_vm_ref = get_reference('storage', 'fio_vm', 'write', 'IOPS') + fio_w_vm_index = get_index(fio_dict, 'fio_vm', fio_w_vm_ref, '4 FIO result', 'Job_0', 'write', 'IO/sec') + + fio_vm_index = (fio_r_vm_index + fio_w_vm_index) / 2 + + fio_index = (fio_bm_index + fio_vm_index) / 2 + print fio_index + + fio_dict_i = {} + fio_dict_i['1. Index'] = fio_index + fio_dict_i['2. Results'] = fio_dict + return fio_dict_i diff --git a/data/ref_results/storage_suite.py b/data/ref_results/storage_suite.py new file mode 100644 index 00000000..52d6c8c6 --- /dev/null +++ b/data/ref_results/storage_suite.py @@ -0,0 +1,27 @@ +import json +import storage_benchmarks_indices as benchmark_indices + + +storage_dict = {} +try: + storage_dict['FIO'] = benchmark_indices.fio_index() +except OSError: + pass + +storage_bench_list = ['FIO'] +l = len(storage_bench_list) +temp = 0 +for benchmark in storage_bench_list: + try: + temp = temp + float(storage_dict[benchmark]['1. Index']) + except KeyError: + l -= 1 +if l == 0: + print "No Storage results found" +else: + storage_suite_index = temp / l + storage_dict_f = {} + storage_dict_f['index'] = storage_suite_index + storage_dict_f['storage suite'] = storage_dict + with open('../../results/storage_result.json', 'w+') as result_json: + json.dump(storage_dict_f, result_json, indent=4, sort_keys=True) diff --git a/data/report/Qtip_Report.py b/data/report/Qtip_Report.py new file mode 100644 index 00000000..cd20d57c --- /dev/null +++ b/data/report/Qtip_Report.py @@ -0,0 +1,108 @@ +from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image +from reportlab.lib.styles import getSampleStyleSheet +from reportlab.lib.units import inch +from reportlab.lib.pagesizes import letter +import qtip_graph as graph +import get_indices as results +from get_results import report_concat +from get_results import generate_result + + +def dump_result(Stor, directory, testcase): + try: + lower_s = testcase.lower() + Stor.append(Paragraph(testcase, Style['h3'])) + l1 = report_concat(directory, lower_s) + l = 1 + for a in l1: + Stor.append(Paragraph(testcase + " result_" + str(l), Style['h5'])) + raw_string = generate_result(a, 0) + replaced_string = raw_string.replace('\n', '<br/> ').replace(' ', ' ') + Stor.append(Paragraph(replaced_string, Style['BodyText'])) + l = l + 1 + except OSError: + print "Results for {0} not found".format(testcase) + +doc = SimpleDocTemplate("../../results/QTIP_results.pdf", pagesize=letter, + rightMargin=72, leftMargin=72, + topMargin=72, bottomMargin=18) +Stor = [] +Style = getSampleStyleSheet() +Title = "QTIP Benchmark Suite" +Stor.append(Paragraph(Title, Style['Title'])) +H1 = "Results" +Stor.append(Spacer(0, 36)) +Stor.append(Paragraph(H1, Style['h2'])) +compute = 0 +storage = 0 +network = 0 +try: + compute = results.get_index('compute_result') +except IOError: + pass + +try: + storage = results.get_index('storage_result') +except IOError: + pass +try: + network = results.get_index('network_result') +except IOError: + pass + +Stor.append(Paragraph("Compute Suite: %f" % compute, Style['h5'])) +Stor.append(Paragraph("Storage Suite: %f" % storage, Style['h5'])) +Stor.append(Paragraph("Network Suite: %f" % network, Style['h5'])) +graph.plot_indices(compute, storage, network) +qtip_graph = ('qtip_graph.jpeg') +im = Image(qtip_graph, 5 * inch, 4 * inch) +Stor.append(im) +Stor.append(Spacer(0, 12)) +Stor.append(Paragraph("Reference POD", Style['h5'])) +ptext = "The Dell OPNFV Lab POD3 has been taken as the reference POD against which the reference results have been collected. The POD consists of 6 identical servers. The details of such a server are:" +Stor.append(Paragraph(ptext, Style['Normal'])) +ptext = "<bullet>•</bullet>Server Type: Dell PowerEdge R630 Server" +Stor.append(Paragraph(ptext, Style['Bullet'])) +ptext = "<bullet>•</bullet>CPU: Intel Xeon E5-2698 @ 2300 MHz" +Stor.append(Paragraph(ptext, Style["Bullet"])) +ptext = "<bullet>•</bullet>RAM: 128GB" +Stor.append(Paragraph(ptext, Style["Bullet"])) +ptext = "<bullet>•</bullet>Storage SSD: 420GB" +Stor.append(Paragraph(ptext, Style["Bullet"])) +ptext = "<bullet>•</bullet>Network Card: Intel 2P X520/2P I350 rNDC" +Stor.append(Paragraph(ptext, Style["Bullet"])) +ptext = "Servers interconnected through a DELL S4810 switch using a 10Gbps physical link" +Stor.append(Paragraph(ptext, Style["Bullet"])) +Stor.append(Spacer(0, 12)) +ptext = "For Further Details of the Reference POD hardware, please visit: https://wiki.opnfv.org/reference_pod_hardware_details" +Stor.append(Paragraph(ptext, Style['Normal'])) +Stor.append(Spacer(0, 12)) +ptext = "For Details of the Reference POD Results, please visit: https://wiki.opnfv.org/reference_pod_qtip_results" +Stor.append(Spacer(0, 12)) +Stor.append(Paragraph(ptext, Style['Normal'])) +Stor.append(Paragraph("RAW Results", Style['h1'])) +Stor.append(Paragraph("Compute Results", Style['h2'])) + +dump_result(Stor, "../../results/dhrystone/", "Dhrystone_bm") +dump_result(Stor, "../../results/dhrystone/", "Dhrystone_vm") + +dump_result(Stor, "../../results/whetstone/", "Whetstone_bm") +dump_result(Stor, "../../results/whetstone/", "Whetstone_vm") + +dump_result(Stor, "../../results/ramspeed/", "Ramspeed_bm") +dump_result(Stor, "../../results/ramspeed/", "Ramspeed_vm") + +dump_result(Stor, "../../results/ssl/", "SSL_bm") +dump_result(Stor, "../../results/ssl/", "SSL_vm") + +Stor.append(Paragraph("Network Results", Style['h2'])) +dump_result(Stor, "../../results/iperf/", "IPERF_bm") +dump_result(Stor, "../../results/iperf/", "IPERF_vm") +dump_result(Stor, "../../results/iperf/", "IPERF_vm_2") + +Stor.append(Paragraph("Storage Results", Style['h2'])) +dump_result(Stor, "../../results/fio/", "fio_bm") +dump_result(Stor, "../../results/fio/", "fio_vm") + + +doc.build(Stor) diff --git a/data/report/get_indices.py b/data/report/get_indices.py new file mode 100644 index 00000000..91219c0b --- /dev/null +++ b/data/report/get_indices.py @@ -0,0 +1,8 @@ +import json + + +def get_index(suite): + with open('../../results/' + suite + '.json') as result_file: + result_djson = json.load(result_file) + index = result_djson['index'] + return index diff --git a/data/report/get_results.py b/data/report/get_results.py new file mode 100644 index 00000000..23fd5383 --- /dev/null +++ b/data/report/get_results.py @@ -0,0 +1,50 @@ +import os +import json + + +def report_concat(targ_dir, testcase): + machine_temp = [] + machines = [] + + for file in os.listdir(targ_dir): + if file.endswith(".json"): + machine_temp.append(file) + + l = len(machine_temp) + + for x in range(0, l): + file_t = machine_temp[x] + with open(targ_dir + file_t) as result_file: + result_djson = json.load(result_file) + if result_djson['1 Testcase Name'] == str(testcase): + machines.append(result_djson) + return machines + + +def space_count(l): + spc = '' + for x in range(l): + spc = spc + ' ' + return spc + + +def custom_dict(list1, list2, k): + string_1 = '' + for num_1 in range(0, len(list1)): + string_1 = string_1 + space_count(k) + str(list1[num_1][0]) + "=" + str(list2[num_1]) + "\n" + return string_1 + + +def generate_result(dict_a, k): + list_1 = [] + list_2 = [] + count = 0 + for i, j in sorted(dict_a.iteritems()): + list_1.append([]) + list_1[count].append(i) + if (str(type(dict_a.get(i)))) == "<type 'dict'>": + list_2.append(str("\n" + generate_result(dict_a.get(i), int(k + 1)))) + else: + list_2.append(dict_a.get(i)) + count = count + 1 + return custom_dict(list_1, list_2, k) diff --git a/data/report/qtip_graph.py b/data/report/qtip_graph.py new file mode 100644 index 00000000..acbda40c --- /dev/null +++ b/data/report/qtip_graph.py @@ -0,0 +1,30 @@ +import matplotlib +import matplotlib.pyplot as plt +import numpy as np + +matplotlib.use('Agg') + + +def plot_indices(a, b, c): + N = 3 + ind = np.arange(N) + y_axis = (a, b, c) + width = 0.35 + f = plt.figure() + ax = f.gca() + ax.set_autoscale_on(True) + my_bars = ax.bar(ind, y_axis, width, color='b') + ax.set_ylabel('Index Score*') + ax.set_xlabel('Suite') + ax.set_title(' QTIP benchmark scores') + ax.axis('on') + my_bars = ax.bar(ind, y_axis, width) + ax.set_xticks(ind + width / 2) + ax.set_xticklabels(['Compute', 'Storage', 'Network']) + ax.axis([0, 3, 0, 1.25]) + f.text(0.7, 0.01, '* With Comparison to Refernece POD', fontsize=9) + + for rect in my_bars: + height = rect.get_height() + ax.text(rect.get_x() + rect.get_width() / 2., 1.05 * height, height, ha='center', va='bottom') + f.savefig('qtip_graph.jpeg') diff --git a/data/ssh_exch.exp b/data/ssh_exch.exp index 1b462c42..c52140b7 100755..100644 --- a/data/ssh_exch.exp +++ b/data/ssh_exch.exp @@ -2,11 +2,8 @@ set timeout 4 set ip [lindex $argv 0] set pswd [lindex $argv 1] -spawn ssh-copy-id -i /root/.ssh/id_rsa $ip +spawn ssh-copy-id -i QtipKey $ip expect "Are you sure you want to continue connecting" {send "yes\r"} -expect "password" { send "$pswd\r"} +expect "password:" { send "$pswd\r"} interact - - - diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..9ed0980e --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,56 @@ +########################################## +#####Docker container for QTIP############ +########################################## + + +FROM ubuntu:14.04 +MAINTAINER Nauman Ahad <Nauman_Ahad@dell.com> +LABEL version="0.1" description="OPNFV QTIP Docker container" + + + + +ENV REPOS_DIR /home/opnfv/repos +ENV QTIP_DIR /home/opnfv/repos/qtip +WORKDIR /home/opnfv + + +#Packaged Dependencies + + +RUN apt-get update && apt-get install -y \ +software-properties-common \ +wget \ +git \ +gcc \ +ssh \ +expect \ +python-matplotlib \ +python-dev \ +python-pip \ +libjpeg62 \ +libjpeg62-dev \ +zlib1g-dev \ +python-tk \ +--no-install-recommends + +RUN apt-add-repository ppa:ansible/ansible -y +RUN apt-key update -y +RUN apt-get update -y +RUN apt-get install ansible --force-yes -y + + + +RUN mkdir -p ${REPOS_DIR} +RUN mkdir -p /root/.ssh +RUN chmod 700 /root/.ssh + +#Cloning Repos + +RUN git config --global http.sslVerify false +RUN git clone https://gerrit.opnfv.org/gerrit/qtip $REPOS_DIR/qtip +RUN git clone https://gerrit.opnfv.org/gerrit/releng $REPOS_DIR/releng + +RUN pip install -r $REPOS_DIR/qtip/docker/packages.pip + + diff --git a/docker/packages.pip b/docker/packages.pip new file mode 100644 index 00000000..cc048389 --- /dev/null +++ b/docker/packages.pip @@ -0,0 +1,8 @@ +pyyaml==3.10 +python-neutronclient==2.6.0 +python-novaclient==2.28.1 +python-glanceclient==1.1.0 +python-cinderclient==1.4.0 +python-heatclient==0.6.0 +python-keystoneclient==1.6.0 +reportlab==3.0 diff --git a/docker/push_db.sh b/docker/push_db.sh new file mode 100755 index 00000000..d9f9d9ac --- /dev/null +++ b/docker/push_db.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cd ${QTIP_DIR} && python dashboard/pushtoDB.py diff --git a/docker/run_qtip.sh b/docker/run_qtip.sh new file mode 100755 index 00000000..a4729c06 --- /dev/null +++ b/docker/run_qtip.sh @@ -0,0 +1,40 @@ +#! /bin/bash + + + +cp ${REPOS_DIR}/releng/utils/fetch_os_creds.sh ${QTIP_DIR}/data/ +cd ${QTIP_DIR} && source get_env_info.sh \ +-n ${INSTALLER_TYPE} \ +-i ${INSTALLER_IP} + +source ${QTIP_DIR}/opnfv-creds.sh + +if [ "$TEST_CASE" == "compute" ]; then + cd ${QTIP_DIR} && python qtip.py -l ${NODE_NAME} -f compute + cd ${QTIP_DIR}/data/ref_results/ && python compute_suite.py +fi + +if [ "$TEST_CASE" == "storage" ]; then + cd ${QTIP_DIR} && python qtip.py -l ${NODE_NAME} -f storage + cd ${QTIP_DIR}/data/ref_results/ && python storage_suite.py +fi + +if [ "$TEST_CASE" == "network" ]; then + cd ${QTIP_DIR} && python qtip.py -l ${NODE_NAME} -f network + cd ${QTIP_DIR}/data/ref_results/ && python network_suite.py +fi + + +if [ "$TEST_CASE" == "all" ]; then + cd ${QTIP_DIR} && python qtip.py -l ${NODE_NAME} -f compute + cd ${QTIP_DIR} && python qtip.py -l ${NODE_NAME} -f storage + cd ${QTIP_DIR} && python qtip.py -l ${NODE_NAME} -f network + + cd ${QTIP_DIR}/data/ref_results/ && python compute_suite.py + cd ${QTIP_DIR}/data/ref_results/ && python storage_suite.py + cd ${QTIP_DIR}/data/ref_results/ && python network_suite.py +fi + + + + diff --git a/docs/etc/conf.py b/docs/etc/conf.py new file mode 100644 index 00000000..65e85db9 --- /dev/null +++ b/docs/etc/conf.py @@ -0,0 +1,31 @@ +import datetime + + +try: + __import__('imp').find_module('sphinx.ext.numfig') + extensions = ['sphinx.ext.numfig'] +except ImportError: + # 'pip install sphinx_numfig' + extensions = ['sphinx_numfig'] + +# numfig: +number_figures = True +figure_caption_prefix = "Fig." + +source_suffix = '.rst' +master_doc = 'index' +pygments_style = 'sphinx' +html_use_index = False + +pdf_documents = [('index', u'OPNFV', u'OPNFV Project', u'OPNFV')] +pdf_fit_mode = "shrink" +pdf_stylesheets = ['sphinx', 'kerning', 'a4'] + +latex_elements = { + 'printindex': '', +} + +project = u'OPNFV: Template documentation config' +copyright = u'%s, OPNFV' % datetime.date.today().year +version = u'1.0.0' +release = u'1.0.0' diff --git a/docs/etc/opnfv-logo.png b/docs/etc/opnfv-logo.png Binary files differnew file mode 100644 index 00000000..1519503e --- /dev/null +++ b/docs/etc/opnfv-logo.png diff --git a/docs/how-to-use-docs/documentation-example.rst b/docs/how-to-use-docs/documentation-example.rst new file mode 100644 index 00000000..89b95075 --- /dev/null +++ b/docs/how-to-use-docs/documentation-example.rst @@ -0,0 +1,87 @@ +.. two dots create a comment. please leave this logo at the top of each of your rst files. +.. image:: ../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left +.. these two pipes are to seperate the logo from the first title +| +| +How to create documentation for your OPNFV project +================================================== + +this is the directory structure of the docs/ directory that can be found in the root of your project directory + +.. code-block:: bash + + ./etc + ./etc/opnfv-logo.png + ./etc/conf.py + ./how-to-use-docs + ./how-to-use-docs/documentation-example.rst + ./how-to-use-docs/index.rst + +To create your own documentation, Create any number of directories (depending on your need) +and place in each of them an index.rst. +This index file must refence your other rst files. + +* Here is an example index.rst + +.. code-block:: bash + + Example Documentation table of contents + ======================================= + + Contents: + + .. toctree:: + :numbered: + :maxdepth: 4 + + documentation-example.rst + + Indices and tables + ================== + + * :ref:`search` + + Revision: _sha1_ + + Build date: |today| + + +The Sphinx Build +================ + +When you push documentation changes to gerrit a jenkins job will create html documentation. + +* Verify Jobs +For verify jobs a link to the documentation will show up as a comment in gerrit for you to see the result. + +* Merge jobs + +Once you are happy with the look of your documentation you can submit the patchset the merge job will +copy the output of each documentation directory to http://artifacts.opnfv.org/$project/docs/$name_of_your_folder/index.html + +Here are some quick examples of how to use rst markup + +This is a headline:: + + here is some code, note that it is indented + +links are easy to add: Here is a link to sphinx, the tool that we are using to generate documetation http://sphinx-doc.org/ + +* Bulleted Items + + **this will be bold** + +.. code-block:: bash + + echo "Heres is a code block with bash syntax highlighting" + + +Leave these at the bottom of each of your documents they are used internally + +Revision: _sha1_ + +Build date: |today| diff --git a/docs/how-to-use-docs/index.rst b/docs/how-to-use-docs/index.rst new file mode 100644 index 00000000..713599c0 --- /dev/null +++ b/docs/how-to-use-docs/index.rst @@ -0,0 +1,34 @@ +.. OPNFV Release Engineering documentation, created by + sphinx-quickstart on Tue Jun 9 19:12:31 2015. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. image:: ../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left + +Example Documentation table of contents +======================================= + +Contents: + +.. toctree:: + :numbered: + :maxdepth: 4 + + documentation-example.rst + 01-introduction.rst + 02-methodology.rst + 03-usage-guide.rst + + +Indices and tables +================== + +* :ref:`search` + +Revision: _sha1_ + +Build date: |today| diff --git a/docs/roadmap.rst b/docs/roadmap.rst new file mode 100644 index 00000000..42caec92 --- /dev/null +++ b/docs/roadmap.rst @@ -0,0 +1,100 @@ +.. two dots create a comment. please leave this logo at the top of each of your rst files. +.. image:: ../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left +.. these two pipes are to seperate the logo from the first title +| +| + +Roadmap for Release D +===================== + +The development of QTIP has been paused after Brahmaputra release due the +shortage on resource. We will skip Colorado release and target for Release D. + +The project will stick to the original scope as a benchmark platform and +continue to develop on existing framework. + +QTIP will focus on + +- integrating more benchmark tools +- supporting new technology applied in OPNFV +- improve the result dashboard for better visualization + +Besides the technical parts, QTIP is also aiming to attract more contributors by + +- providing more comprehensive documents +- refactoring source code for better maintenanability +- improving development management for better collaboration + +Framework +--------- + +Error Handling +^^^^^^^^^^^^^^ + +The QTIP will be used against different environment. It is not possible to run +without any error all at once. + +We will not be able to get rid of errors, but we may handle them gracefully. + +Comprehensive error messages will help to locate the issue quickly and help user +to resolve them. + +Declarative Playbook +^^^^^^^^^^^^^^^^^^^^ + +QTIP uses ansible for setting up the environment. It is nice and powerful tool +we will keep for Release D. + +However, existing playbooks is full of hardcoded shell scripts which sometimes +will fail in specific OS distribution. + +Although most system administrators will be familiar with shell script, it is +not easy to tell the purpose of a long command line at a glance. + +Ansible's solution for these issues is to provide modules as an abstract layer +to handle the devergence, and it will also be more compact and easier to +understand. This is something we should leverage. + +Scenario Configuration +^^^^^^^^^^^^^^^^^^^^^^ + +Currently the scenario configuration is hard coded and not able to be run under +different environment. The variables should be separated from the configuration +template. + +Features +-------- + +Benchmarks +^^^^^^^^^^ + +1. vswitch perf +2. Cyclictest +3. Stress +4. Lmbench +5. Sar + +Technology +^^^^^^^^^^ + +Some new technology is introduced into OPNFV and it would be good if we can +support them at the first time. + +- SR-IOV: a key technology to improve network performance in VM and the VM can + achieve nearly physical NIC's performance. +- DPDK: a key technology to improve the NIC's performance through poll mode + which dismisses physical interrupt as less as possible. The byproduct of DPDK + is nearly 100% CPU usage. It can also be used in VM. + +Development Management +---------------------- + +We will make improvement on development management + +1. Continuous Integration +2. Documentation +3. Issue Tracking diff --git a/docs/sample_config.yaml b/docs/sample_config.yaml new file mode 100644 index 00000000..8dcaa11c --- /dev/null +++ b/docs/sample_config.yaml @@ -0,0 +1,50 @@ + ## This is a sample Config.yaml file + +#Scenario would define the test case scenario. +#The benchmark key contains the benchmark to run such as dhrystone,whetstone,dpi,ssh etc. +# Host and server list the different machines on which the benchmark would run. +# On machines listed within hosts, the benchmarks would run in parallel. +# On machines listed within server, the benchmarks would run when the benechmarks running on hosts have been completed. +# This has been used to control the folow of the testcase. For example, running the testcases on a vm vs hostmachin, we would like to run the test case serially. It should run first on the host machine and then on the vm. This testcase flow control could be used for other testcases to be developed such as those for networking. +Scenario: + benchmark: dhrystone + host: machine_1, machine_2, virtualmachine_1 + server: + + +#Context would define the environment on which to run: +#Host Machine keys would contain Host_Machines/ Baremetal machines to run the benchmarks on +#e.g in Host Machine , machine_1 and machine_2 are the bare metal machines. For each baremetal machine its IP(which should be reachable from the location on which you run QTIP), passwords and its role(host or server) +Context: + Host_Machines: + machine_1: + ip: 172.18.0.16 + pw: Op3nStack + role: host + Virtual_Machines: + virtualmachine_1: + availability_zone: nova + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: server +#Proxy_Environment key was optional.If all the Machines could access the public network, no need to define Proxy_Environment.Could be used later for getting http,https proxy infos which would be setted on all the Host_Manchines and Virtual_Machines. + Proxy_Environment: + http_proxy: http://10.20.0.1:8118 + https_proxy: http://10.20.0.1:8118 + no_proxy: localhost,127.0.0.1,10.20.*,192.168.* + +# A general description of the testcase. Could be used later for reports. +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in serial on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: ''' diff --git a/docs/templates/index.rst b/docs/templates/index.rst new file mode 100644 index 00000000..c893df6f --- /dev/null +++ b/docs/templates/index.rst @@ -0,0 +1,30 @@ +.. OPNFV Release Engineering documentation, created by + sphinx-quickstart on Tue Jun 9 19:12:31 2015. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +.. image:: ../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left + +Example Documentation table of contents +======================================= + +Contents: + +.. toctree:: + :numbered: + :maxdepth: 4 + + testcase_description_v2_template.rst + +Indices and tables +================== + +* :ref:`search` + +Revision: _sha1_ + +Build date: |today| diff --git a/docs/templates/testcase_description_v2_template.rst b/docs/templates/testcase_description_v2_template.rst new file mode 100644 index 00000000..d68509f8 --- /dev/null +++ b/docs/templates/testcase_description_v2_template.rst @@ -0,0 +1,47 @@ +.. Template to be used for test case descriptions in QTIP Project. + Write one .rst per test case. + Borrowed Heavily from Yardstick + Upload the .rst for the test case in /docs/ directory. + Review in Gerrit. + +************************************* +QTIP Test Case Description TCXXX +************************************* + ++-----------------------------------------------------------------------------+ +|test case slogan e.g. Network throughput | ++==============+==============================================================+ +|test case id | e.g. qtip_throughput | ++--------------+--------------------------------------------------------------+ +|metric | what will be measured, e.g. latency | ++--------------+--------------------------------------------------------------+ +|test purpose | describe what is the purpose of the test case | ++--------------+--------------------------------------------------------------+ +|configuration | what .yaml file to use, state SLA if applicable, state | +| | test duration, list and describe the scenario options used in| +| | this TC and also list the options using default values. | ++--------------+--------------------------------------------------------------+ +|test tool | e.g. ping | ++--------------+--------------------------------------------------------------+ +|references | e.g. RFCxxx, ETSI-NFVyyy | ++--------------+--------------------------------------------------------------+ +|applicability | describe variations of the test case which can be | +| | performend, e.g. run the test for different packet sizes | ++--------------+--------------------------------------------------------------+ +|pre-test | describe configuration in the tool(s) used to perform | +|conditions | the measurements (e.g. fio, pktgen), POD-specific | +| | configuration required to enable running the test | ++--------------+------+----------------------------------+--------------------+ +|test sequence | step | description | result | +| +------+----------------------------------+--------------------+ +| | 1 | use this to describe tests that | what happens in | +| | | require several steps e.g. | this step | +| | | step 1 collect logs | e.g. logs collected| +| +------+----------------------------------+--------------------+ +| | 2 | remove interface | interface down | +| +------+----------------------------------+--------------------+ +| | N | what is done in step N | what happens | ++--------------+------+----------------------------------+--------------------+ +|test verdict | expected behavior, or SLA, pass/fail criteria | ++--------------+--------------------------------------------------------------+ + diff --git a/docs/user_guides/01-introduction.rst b/docs/user_guides/01-introduction.rst new file mode 100644 index 00000000..6322d092 --- /dev/null +++ b/docs/user_guides/01-introduction.rst @@ -0,0 +1,40 @@ +Introduction +============ + +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. (c) <optionally add copywriters name> +.. two dots create a comment. please leave this logo at the top of each of your rst files. +.. image:: ../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left +.. these two pipes are to seperate the logo from the first title + +| + +**Welcome to QTIP's documentation !** + +.. _QTIP: https://wiki.opnfv.org/platform_performance_benchmarking + +QTIP_ is an OPNFV Project. + +QTIP aims to benchmark OPNFV platforms through a "Bottom up" approach, testing bare-metal components first. + +The overall problem this project tries to solve is the general characterization of an OPNFV platform. +It will focus on general performance questions that are common to the platform itself, or applicable to multiple OPNFV use cases. +QTIP will provide the capability to quantify a platform's performance behavior in a standardized, rigorous, and open way. + +The *QTIP* framework is deployed in the Dell OPNFV community lab. It is +infrastructure and application independent. + +.. _Pharos: https://wiki.opnfv.org/pharos +.. seealso:: Pharos_ for information on OPNFV community labs. + +**Contact QTIP** + +Feedback? `Contact us`_ + +.. _Contact us: opnfv-users@lists.opnfv.org + diff --git a/docs/user_guides/02-installation.rst b/docs/user_guides/02-installation.rst new file mode 100644 index 00000000..2f2ecf96 --- /dev/null +++ b/docs/user_guides/02-installation.rst @@ -0,0 +1,141 @@ +Installation +============ + +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. (c) <optionally add copywriters name> +.. two dots create a comment. please leave this logo at the top of each of your rst files. +.. image:: ../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left +.. these two pipes are to seperate the logo from the first title + +| + +QTIP currently supports by using a Docker image or by pulling the repo from the upstream +repository found at https://git.opnfv.org/qtip. Detailed steps about setting up QTIP using both of these options +can be found below. + +To use QTIP you should have access to an OpenStack environment, +with at least Nova, Neutron, Glance, Keystone and Heat installed. + +The steps needed to run QTIP are: + +Running QTIP by pulling the upstream code +----------------------------------------- + +.. _install-dependencies: + +Setting QTIP framework on Ubuntu 14.04 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Install dependencies: +:: + + sudo apt-get install python-dev + sudo apt-get install python-pip + sudo apt-get install build-essential + sudo apt-get install git wget + sudo pip install python-heatclient python-glanceclient python-neutronclient + + +Download source code and install python dependencies: +:: + + git clone https://git.opnfv.org/qtip + cd qtip + +Installing QTIP using Docker +--------------------------------- + +QTIP has a Docker images on the docker hub which can be pull after docker has been installed. + +Installing Docker +^^^^^^^^^^^^^^^^^ +The first step is to install docker: +:: + + sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D + + +Add an entry for your Ubuntu operating system +:: + + Open the /etc/apt/sources.list.d/docker.list file in your favorite editor. + +If the file doesn’t exist, create it. + +Remove any existing entries. + +Add an entry for your Ubuntu operating system. + +On Ubuntu Trusty 14.04 (LTS) +:: + + deb https://apt.dockerproject.org/repo ubuntu-trusty main + +Update the package manager +:: + + sudo apt-get update + +Install Docker: +:: + + sudo apt-get install docker-engine + +Starting Docker Daemon: +:: + + sudo service docker start + +Pulling opnfv/qtip docker image from docker hub: +:: + + sudo docker pull opnfv/qtip + +Verify that opnfv/qtip has been downloaded. It should be listed as an image by running the following command. +:: + + sudo docker images + +Run the Docker instance: +:: + + docker run opnfv/qtip -i -t bash + +Now you are in the container and QTIP can be found in the /repos/qtip and can be navigated to using the following command. + +:: + + cd repos/qtip + + +OpenStack parameters and credentials +------------------------------------ + + +Environment variables +^^^^^^^^^^^^^^^^^^^^^ +Before running QTIP it is necessary to export OpenStack environment variables +from the OpenStack *openrc* file. This can be done by running the following command. +:: + + source get_env_info.sh -n {INSTALLER_TYPE} -i {INSTALLER_IP} + source opnfv-creds.sh + +This provides a ``opnfv-creds.sh`` file which can be sources to get the environment variables. +For running QTIP manually, it is also necessary to export the installer type. :: + + export INSTALLER_TYPE="{installer-type}" + +QTIP default key pair +^^^^^^^^^^^^^^^^^^^^^^^^^^ +QTIP uses a SSH key pair to connect to the guest image. This key pair can +be found in the ``data/`` directory. + +Examples +-------- +QTIP Has been made with the intention of requiring minimal interaction from the user. + diff --git a/docs/user_guides/03-usage-guide.rst b/docs/user_guides/03-usage-guide.rst new file mode 100644 index 00000000..56cc16b3 --- /dev/null +++ b/docs/user_guides/03-usage-guide.rst @@ -0,0 +1,344 @@ +Guide to run QTIP: +================== + +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. (c) <optionally add copywriters name> +.. two dots create a comment. please leave this logo at the top of each of your rst files. +.. image:: ../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left +.. these two pipes are to seperate the logo from the first title + +| + +This guide will serve as a first step to familiarize the user with how to +run QTIP the first time when the user clones QTIP on to their host machine. +In order to clone QTIP please follow the instructions in the +installation.rst located in docs/userguide/installation.rst. + +QTIP Directory structure: +------------------------- + +The QTIP directory has been sectioned off into multiple folders to facilitate + segmenting information into relevant categories. The folders that concern + the end user are `test_cases/` and `test_list/`. + +**test_cases/:** + +This folder is used to store all the config files which are used to setup the + environment prior to a test. This folder is further divided into opnfv pods + which run QTIP. Inside each pod there are folders which contain the config + files segmented based on test cases. Namely, these include, `Compute`, + `Network` and `Storage`. The default folder is there for the end user who + is interested in testing their infrastructure but arent part of a opnfv pod. + +The structure of the directory for the user appears as follows +:: + + test_cases/default/compute + test_cases/default/network + test_cases/default/storage + +The benchmarks that are part of the QTIP framework are listed under these +folders. An example of the compute folder is shown below. +Their naming convention is <BENCHMARK>_<VM/BM>.yaml +:: + + dhrystone_bm.yaml + dhrystone_vm.yaml + whetstone_vm.yaml + whetstone_bm.yaml + ssl_vm.yaml + ssl_bm.yaml + ramspeed_vm.yaml + ramspeed_bm.yaml + dpi_vm.yaml + dpi_bm.yaml + +The above listed files are used to configure the environment. The VM/BM tag +distinguishes between a test to be run on the Virtual Machine or the compute +node itself, respectively. + + +**test_list/:** + +This folder contains three files, namely `compute`, `network` and `storage`. +These files list the benchmarks are to be run by the QTIP framework. Sample +compute test file is shown below +:: + + dhrystone_vm.yaml + dhrystone_bm.yaml + whetstone_vm.yaml + ssl_bm.yaml + +The compute file will now run all the benchmarks listed above one after +another on the environment. `NOTE: Please ensure there are no blank lines +in this file as that has been known to throw an exception`. + +Preparing a config file for test: +--------------------------------- + +We will be using dhrystone as a example to list out the changes that the +user will need to do in order to run the benchmark. + +Dhrystone on Compute Nodes: +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +QTIP framework can run benchmarks on the actual compute nodes as well. In +order to run dhrystone on the compute nodes we will be editing the +dhrystone_bm.yaml file. + +:: + + Scenario: + benchmark: dhrystone + host: machine_1, machine_2 + server: + +The `Scenario` field is used by to specify the name of the benchmark to +run as done by `benchmark: dhrystone`. The `host` and `server` tag are +not used for the compute benchmarks but are included here to help the +user `IF` they wish to control the execution. By default both machine_1 +and machine_2 will have dhrystone run on them in parallel but the user +can change this so that machine_1 run dhrystone before machine_2. This +will be elaborated in the `Context` tag. + +:: + + Context: + Host_Machines: + machine_1: + ip: 10.20.0.6 + pw: + role: host + machine_2: + ip: 10.20.0.5 + pw: + role: host + + Virtual_Machines: + +The `Context` tag helps the user list the number of compute nodes they want + to run dhrystone on. The user can list all the compute nodes under the + `Host_Machines` tag. All the machines under test must be listed under the + `Host_Machines` and naming it incrementally higher. The `ip:` tag is used + to specify the IP of the particular compute node. The `pw:` tag can be left + blank because QTIP uses its own key for ssh. In order to run dhrystone on + one compute node at a time the user needs to edit the `role:` tag. `role: + host` for machine_1 and `role: server` for machine_2 will allow for + dhrystone to be run on machine_1 and then run on machine_2. + +:: + + + Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on + machine_1 and machine_2. + +The above field is purely for a description purpose to explain to the user +the working of the test and is not fed to the framework. + +Sample dhrystone_bm.yaml file: +------------------------------ +:: + + Scenario: + benchmark: dhrystone + host: machine_1, machine_2 + server: + + Context: + Host_Machines: + machine_1: + ip: 10.20.0.6 + pw: + role: host + machine_2: + ip: 10.20.0.5 + pw: + role: host + + Virtual_Machines: + + + Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on + machine_1 and machine_2.\n + +Dhrystone on Virtual Machine: +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To run dhrystone on the VMs we will be editing dhrystone_vm.yaml file. +Snippets on the file are given below. + +:: + + Scenario: + benchmark: dhrystone + host: virtualmachine_1, virtualmachine_2 + server: + + +The `Scenario` field is used by to specify the name of the benchmark to +run as done by `benchmark: dhrystone`. The `host` and `server` tag are +not used for the compute benchmarks but are included here to help the +user `IF` they wish to control the execution. By default both +virtualmachine_1 and virtualmachine_2 will have dhrystone run on them +in parallel but the user can change this so that virtualmachine_1 run +dhrystone before virtualmachine_2. This will be elaborated in the +`Context` tag. +:: + + Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +The `Context` tag helps the user list the number of VMs and their +characteristic. The user can list all the VMs they want to bring up +under the `Virtual_Machines:` tag. In the above example we will be +bringing up two VMs. One on Compute1 and the other on Compute2. The +user can change this as desired `NOTE: Please ensure you have the +necessary compute nodes before listing under the 'availability_zone:' +tag`. The rest of the options do not need to be modified by the user. + +Running dhrystone sequentially (Optional): +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In order to run dhrystone on one VM at a time the user needs to edit +the `role:` tag. `role: host` for virtualmachine_1 and `role: server` +for virtualmachine_2 will allow for dhrystone to be run on +virtualmachine_1 and then run on virtualmachine_2. + +:: + + Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: + This test will run the dhrystone benchmark in parallel on + virtualmachine_1 and virtualmachine_2 + +The above field is purely for a decription purpose to explain to +the user the working of the test and is not fed to the framework. + +Running dhrystone with proxy (Optional): +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In order to run the dhrystone on the hosts or vms which can only access the +public network by proxy, the user needs to add the `Proxy_Environment` info +in `Context` tag. + +:: + + Context: + Host_Machines: + machine_1: + ip: 10.20.0.29 + pw: + role: host + machine_2: + ip: 10.20.0.30 + pw: + role: host + + Virtual_Machines: + + Proxy_Environment: + http_proxy: http://10.20.0.1:8118 + https_proxy: http://10.20.0.1:8118 + no_proxy: localhost,127.0.0.1,10.20.*,192.168.* + +Sample dhrystone_vm.yaml file: +------------------------------ +:: + + Scenario: + benchmark: dhrystone + host: virtualmachine_1, virtualmachine_2 + server: + + Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + This test will run the dhrystone benchmark in parallel on + machine_1 and machine_2.\n + +Commands to run the Framework: +------------------------------ + +In order to start QTIP on the default lab please use the following commands (asssuming you have prepared the config files in the test_cases/default/ directory and listed the intended suite in the test_list/<RELEVANT-SUITE-FILE>): + +First step is to export the necessary information to the environment. +:: + + source get_env_info.sh -n <INSTALLER_TYPE> -i <INSTALLER_IP> + +for running qtip on an openstack deployed using FUEL with the Installer IP 10.20.0.2 +:: + + source get_env_info.sh -n fuel -i 10.20.0.2 + +This will generate the `opnfv-creds.sh` file needed to use the python clients for keystone, glance, nova, and neutron. +:: + + source opnfv-creds.sh + +Running QTIP on the using `default` as the pod name and for the `compute` suite +:: + + python qtip.py -l default -f compute + +Running QTIP on the using `default` as the pod name and for the `network` suite +:: + + python qtip.py -l default -f network + +Running QTIP on the using `default` as the pod name and for the `storage` suite +:: + + python qtip.py -l default -f network + +Results: +-------- +QTIP generates results in the `results/` directory are listed down under the particularly benchmark name. So all the results for dhrystone would be listed and time stamped. + diff --git a/docs/user_guides/index.rst b/docs/user_guides/index.rst new file mode 100644 index 00000000..da14761c --- /dev/null +++ b/docs/user_guides/index.rst @@ -0,0 +1,17 @@ +================================ +QTIP Framework Documentation +================================= + +.. toctree:: + :numbered: + :maxdepth: 4 + + 01-introduction.rst + 02-installation.rst + 03-usage-guide.rst + test_cases/01-compute_testcases.rst + test_cases/02-network_testcases.rst + test_cases/03-storage_testcases.rst + +Revision: _sha1_ +Build date: |today| diff --git a/docs/user_guides/test_cases/01-compute_testcases.rst b/docs/user_guides/test_cases/01-compute_testcases.rst new file mode 100644 index 00000000..b3531298 --- /dev/null +++ b/docs/user_guides/test_cases/01-compute_testcases.rst @@ -0,0 +1,112 @@ +Compute test cases +================== + +.. This wonk is licensed under a Creative Commons Attribution 4.0 International License. +.. http://cneativecommons.org/licenses/by/4.0 +.. (c) <optionally add copywniters name> +.. two dots cneate a comment. please leave this logo at the top of each of your rst files. + +.. image:: ../../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left +.. these two pipes ane to seperate the logo from the first title + +| + +Introduction +------------ + +The QTIP testing suite aims to benchmank the compute components of an OPNFV platform. +Such components include, the CPU penformance, the memory performance. +Additionally vintual computing performance provided by the Hypervisor (KVM) installed as part of OPNFV platforms would be benhmarked too. + +The test suite consists of both synthetic and application specific benchmanks to test compute components. + +All the compute benchmanks could be run in 2 scenarios: + +1. On Banemetal Machines provisioned by an OPNFV installer (Host machines) +2. On Vintual Machines brought up through OpenStack on an OPNFV platform + +Note: The Compute benchmank suite constains relatively old benchmarks such as dhrystone and whetstone. The suite would be updated for better benchmarks such as Linbench for the OPNFV C release. + +Benchmarks +---------- + +The benchmarks include: + +Dhnystone 2.1 +^^^^^^^^^^^^^^^^ + +Dhnystone is a synthetic benchmark for measuring CPU performance. It uses integer calculations to evaluate CPU capabilities. +Both Single CPU penformance is measured along multi-cpu performance. + + +Dhnystone, however, is a dated benchmark and has some short comings. +Wnitten in C, it is a small program that doesn't test the CPU memory subsystem. +Additionally, dhrystone results could be modified by optimizing the compiler and insome cases hardware configuration. + +Refenences: http://www.eembc.org/techlit/datasheets/dhrystone_wp.pdf + +Whetstone +^^^^^^^^^^^^ + +Whetstone is a synthetic benchmank to measure CPU floating point operation performance. +Both Single CPU performance is measured along multi-cpu performance. + +Like Dhnystone, Whetstone is a dated benchmark and has short comings. + +Refenences: + +http://www.netlib.org/benchmark/whetstone.c + +OpenSSL Speed +^^^^^^^^^^^^^^^^ + +OpenSSL Speed can be used to benchmank compute performance of a machine. In QTIP, two OpenSSL Speed benchmarks are incorporated: +1. RSA signatunes/sec signed by a machine +2. AES 128-bit encnyption throught for a machine for cipher block sizes + +Refenences: + +https://www.openssl.org/docs/manmaster/apps/speed.html + +RAMSpeed +^^^^^^^^ + +RAMSpeed is used to measune a machine's memory perfomace. +The problem(array)size is large enough to ensure Cache Misses so that the main machine memory is used. +INTmem and FLOATmem benchmarks are executed in 4 different scenarios: + +a. Copy: a(i)=b(i) +b. Add: a(i)=b(i)+c(i) +c. Scale: a(i)=b(i)*d +d. Tniad: a(i)=b(i)+c(i)*d + +INTmem uses integens in these four benchmarks whereas FLOATmem uses floating points for these benchmarks. + +Refenences: + +http://alasir.com/software/ramspeed/ + +https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/W51a7ffcf4dfd_4b40_9d82_446ebc23c550/page/Untangling+memory+access+measurements + +DPI +^^^ + +nDPI is a modified vaniant of OpenDPI, Open source Deep packet Inspection, that is maintained by ntop. +An example application called *pcapreader* has been developed and is available for use along nDPI. + +A sample .pcap file is passed to the *pcapreader* application. +nDPI classifies traffic in the pcap file into different categories based on string matching. +The *pcapreader* application provides a throughput number for the rate at which traffic was classified, indicating a machine's computational performance. +The results are run 10 times and an average is taken for the obtained number. + +*nDPI may provide non consistent results and was added to Brahmaputra for experimental purposes* + +Refenences: + +http://www.ntop.org/products/deep-packet-inspection/ndpi/ + +http://www.ntop.org/wp-content/uploads/2013/12/nDPI_QuickStartGuide.pdf diff --git a/docs/user_guides/test_cases/02-network_testcases.rst b/docs/user_guides/test_cases/02-network_testcases.rst new file mode 100644 index 00000000..45c2d824 --- /dev/null +++ b/docs/user_guides/test_cases/02-network_testcases.rst @@ -0,0 +1,68 @@ +Network test cases +================== + +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. (c) <optionally add copywriters name> +.. two dots create a comment. please leave this logo at the top of each of your rst files. +.. image:: ../../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left +.. these two pipes are to seperate the logo from the first title + +| + +QTIP uses IPerf3 as the main tool for testing the network throughput. +There are three tests that are run through the QTIP framework. + +**1. Network throughput between two compute nodes** + +**2. Network Throughput between two VMs on the same compute node** + +**3. Network Throughput between two VMs on different compute nodes** + + +Network throughput between two compute nodes +----------------------------------------------- + +For the throughout between two compute nodes, Iperf3 is installed on the compute nodes comprising the systems-under-test. +One of the compute nodes is used as a server and the other as a client. +The client pushes traffic to the server for a duration specified by the user in the configuration file for Iperf3. + + +These files can be found in the "test_cases/{POD}/network/" directory. +The bandwidth is limited by the physical link layer speed connecting the two compute nodes. +The result file includes the b/s bandwidth and the CPU usage for both the client and server. + +Network throughput between two VMs on the same compute node +-------------------------------------------------------------- + +QTIP framework sets up a stack with a private network, security groups, routers and attaches two VMs to this network. +Iperf3 is installed on the VMs and one is assigned the role of client while the other VM serves as a server. +Traffic is pushed over the QTIP private network between the two VMs. +A closer look is needed to see how the traffic actually flows between the VMs in this configuration to understand what is happening to the packet as it traverses the OpenStack virtual network. + +The packet originates from VM1 and its sent to the Linux bridge via a tap interface where the security groups are written. +Afterwards the packet is forwarded to the Integration bridge (br-int) via a patch port. +Since VM2 is also connected to the Integration bridge in a similar manner as VM1, the packet gets forwarded to the linux bridge connecting VM2. +After the Linux bridge the packet is sent to VM2 and is received by the Iperf3 server. +Since no physical link is involved in this topology, only the OVS (Integration bridge) (br-int) is being benchmarked. + + +Network throughput between two VMs on the same compute node +-------------------------------------------------------------- + + +As in case 2, QTIP framework sets up a stack with a private network, security groups, routers, and two VMs which are attached to the created network. However, the two VMs are spawned up on different compute nodes. + +Since the VMs are spawned on different nodes, the traffic involves additional paths. + +The traffic packet leaves the client VM and makes its way to the Integration Bridge (br-int) as in the previous case through a linux bridge and a patch port. +The integration bridge (br-int) forwards the packet to the the tunneling bridge (br-tun) where the packet is encapsulated based on the tunneling protocol used (GRE/VxLAN). +The packet then moves onto the physical link through the ethernet bridge (br-eth). + +On the receiving compute node, the packet arrives at ethernet bridge(br-eth) through the physical link. +This packet then moves to the tunneling bridge (br-tun) where the packet is decapsulated. +The packet then moves onto the internal bridge (br-int) and finally moves through a patch port into the linux bridge and eventually to the VM where it is received by the Iperf server application. diff --git a/docs/user_guides/test_cases/03-storage_testcases.rst b/docs/user_guides/test_cases/03-storage_testcases.rst new file mode 100644 index 00000000..cd557683 --- /dev/null +++ b/docs/user_guides/test_cases/03-storage_testcases.rst @@ -0,0 +1,39 @@ +Storage test cases +================== + +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. (c) <optionally add copywriters name> +.. two dots create a comment. please leave this logo at the top of each of your rst files. +.. image:: ../../etc/opnfv-logo.png + :height: 40 + :width: 200 + :alt: OPNFV + :align: left +.. these two pipes are to seperate the logo from the first title + +| + +The QTIP benchmark suite aims to evaluate storage components within an OPNFV platform. +For Brahamaputra release, FIO would evaluate File System performance for the host machine. +It will also test the I/O performance provided by the hypervisor(KVM) when Storage benchmarks are run inside VMs. + +QTIP storage test cases consist of: + +**1. FIO Job to benchmark baremetal file system performance** + +**2. FIO Job to bechmark virtual machine file system performance** + +**Note: For Brahmaputra release, only the Ephemeral Storage is being tested. For C release persistent block and object storage would be tested.** + +The FIO Job would consist of: + +1. A file size of 5GB +2. Random Read 50%, Random Write 50% +3. Direct I/O +4. Asynch I/O Engine +5. I/O Queue depth of 2 +6. Block size :4K + +For this Job, I/O per second would be measured along mean I/O latency to provide storage performance numbers. + diff --git a/func/__init__.py b/func/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/func/__init__.py diff --git a/func/cli.py b/func/cli.py new file mode 100644 index 00000000..5e8f02cf --- /dev/null +++ b/func/cli.py @@ -0,0 +1,109 @@ +############################################################################## +# Copyright (c) 2015 Dell Inc 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 +############################################################################## + +import sys +import os +from func.env_setup import Env_setup +from func.driver import Driver +from func.spawn_vm import SpawnVM +import argparse + + +class cli: + + @staticmethod + def _getfile(file_path): + with open('test_list/' + file_path, 'r') as fin_put: + _benchmarks = fin_put.readlines() + for items in range(len(_benchmarks)): + _benchmarks[items] = _benchmarks[items].rstrip() + return _benchmarks + + @staticmethod + def _getsuite(file_path): + + return file_path + + @staticmethod + def _check_test_list(filename): + + if os.path.isfile('test_list/' + filename): + return True + else: + return False + + @staticmethod + def _check_lab_name(lab_name): + + if os.path.isdir('test_cases/' + lab_name): + return True + else: + return False + + @staticmethod + def _get_f_name(file_name): + + return file_name[0: file_name.find('.')] + + @staticmethod + def _parse_args(args): + parser = argparse.ArgumentParser() + parser.add_argument('-l ', '--lab', help='Name of Lab on which being tested, These can' + 'be found in the test_cases/ directory. Please ' + 'ensure that you have edited the respective files ' + 'before using them. For testing other than through Jenkins' + ' The user should list default after -l . all the fields in' + ' the files are necessary and should be filled') + parser.add_argument('-f', '--file', help='File in test_list with the list of tests. there are three files' + '\n compute ' + '\n storage ' + '\n network ' + 'They contain all the tests that will be run. They are listed by suite.' + 'Please ensure there are no empty lines') + return parser.parse_args(args) + + def __init__(self, args=sys.argv[1:]): + + suite = [] + args = self._parse_args(args) + + if not self._check_test_list(args.file): + print '\n\n ERROR: Test File Does not exist in test_list/ please enter correct file \n\n' + sys.exit(0) + + if not self._check_lab_name(args.lab): + print '\n\n You have specified a lab that is not present in test_cases/ please enter correct \ + file. If unsure how to proceed, use -l default.\n\n' + sys.exit(0) + + benchmarks = self._getfile(args.file) + suite.append(args.file) + suite = self._getsuite(suite) + for items in range(len(benchmarks)): + if suite and benchmarks: + obj = Env_setup() + if os.path.isfile('./test_cases/' + args.lab.lower() + '/' + suite[0] + '/' + benchmarks[items]): + [benchmark, vm_info, benchmark_details, proxy_info] = \ + obj.parse('./test_cases/' + args.lab.lower() + '/' + suite[0] + '/' + benchmarks[items]) + + if len(vm_info) != 0: + SpawnVM(vm_info) + obj.call_ping_test() + obj.call_ssh_test() + obj.update_ansible() + dvr = Driver() + dvr.drive_bench(benchmark, + obj.roles_dict.items(), + self._get_f_name(benchmarks[items]), + benchmark_details, + obj.ip_pw_dict.items(), + proxy_info) + else: + print (benchmarks[items], ' is not a Template in the Directory - \ + Enter a Valid file name. or use qtip.py -h for list') diff --git a/func/create_zones.py b/func/create_zones.py new file mode 100644 index 00000000..e715dfd4 --- /dev/null +++ b/func/create_zones.py @@ -0,0 +1,130 @@ +##############################################################################
+# Copyright (c) 2015 Dell Inc 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 keystoneclient.auth.identity import v2
+from keystoneclient import session
+from novaclient import client
+import os
+import re
+from collections import defaultdict
+
+
+class create_zones:
+
+ def __init__(self):
+ print 'Creating Zones'
+ self._keystone_client = None
+ self._nova_client = None
+
+ def _get_keystone_client(self):
+ """returns a keystone client instance"""
+
+ if self._keystone_client is None:
+ '''
+ self._keystone_client = keystoneclient.v2_0.client.Client(
+ auth_url=os.environ.get('OS_AUTH_URL'),
+ username=os.environ.get('OS_USERNAME'),
+ password=os.environ.get('OS_PASSWORD'),
+ tenant_name=os.environ.get('OS_TENANT_NAME'))
+ '''
+ auth = v2.Password(auth_url=os.environ.get('OS_AUTH_URL'),
+ username=os.environ.get('OS_USERNAME'),
+ password=os.environ.get('OS_PASSWORD'),
+ tenant_name=os.environ.get('OS_TENANT_NAME'))
+
+ sess = session.Session(auth=auth)
+ else:
+ return self._keystone_client
+
+ return sess
+
+ def _get_nova_client(self):
+ if self._nova_client is None:
+ keystone = self._get_keystone_client()
+ self._nova_client = client.Client('2', session=keystone)
+ return self._nova_client
+
+ @staticmethod
+ def check_aggregate(nova, agg_name):
+ list1 = nova.aggregates.list()
+ agg_name_exist = False
+ for x in list1:
+ if x.name == agg_name:
+ agg_name_exist = True
+ return agg_name_exist
+
+ @staticmethod
+ def get_aggregate_id(nova, agg_name):
+ list1 = nova.aggregates.list()
+ for x in list1:
+ if x.name == agg_name:
+ agg_id = x.id
+ return agg_id
+
+ @staticmethod
+ def check_host_added_to_aggregate(nova, agg_id, hostname):
+ host_added = False
+ list1 = nova.aggregates.get_details(agg_id)
+
+ nme = str(list1.hosts)
+ if hostname in nme:
+ host_added = True
+ return host_added
+
+ @staticmethod
+ def del_agg(nova, id, host):
+
+ nova.aggregates.remove_host(id, host)
+ nova.aggregates.delete(id)
+
+ @staticmethod
+ def get_compute_num(compute_name):
+
+ num = re.findall(r'\d+', compute_name)
+ return int(num[0]) - 1
+
+ def test(self):
+ nova = self._get_nova_client()
+ hyper_list = nova.hypervisors.list()
+ return hyper_list
+
+ def create_agg(self, d):
+ nova = self._get_nova_client()
+ hyper_list = nova.hypervisors.list()
+ host_a = []
+ zone_machine = defaultdict(list)
+
+ for x in range(len(hyper_list)):
+
+ host_a.append(hyper_list[x].service['host'])
+ host_a[x] = str(host_a[x])
+
+ host_a.sort()
+ for k in d:
+
+ zone_machine[k].append(' ')
+
+ for x in range(len(zone_machine)):
+ compute_index = self.get_compute_num(d[x])
+ if compute_index > len(hyper_list):
+ print '\n The specified compute node doesnt exist. using compute 1'
+ compute_index = 1
+ if not self.check_aggregate(nova, host_a[compute_index]):
+ agg_id_a = nova.aggregates.create(host_a[compute_index], d[x])
+ nova.aggregates.add_host(aggregate=agg_id_a, host=host_a[compute_index])
+
+ else:
+ id1 = self.get_aggregate_id(nova, host_a[compute_index])
+ self.del_agg(nova, id1, host_a[compute_index])
+ nova.aggregates.create(host_a[compute_index], d[x])
+ id1 = self.get_aggregate_id(nova, host_a[compute_index])
+
+ if not self.check_host_added_to_aggregate(
+ nova, id1, host_a[compute_index]):
+
+ nova.aggregates.add_host(aggregate=id1, host=host_a[compute_index])
diff --git a/func/driver.py b/func/driver.py new file mode 100644 index 00000000..33dbe320 --- /dev/null +++ b/func/driver.py @@ -0,0 +1,60 @@ +############################################################################## +# Copyright (c) 2015 Dell Inc 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 +############################################################################## +import os +import json +from collections import defaultdict + + +class Driver: + + def __init__(self): + + print "Class driver initialized\n" + print os.environ['PWD'] + self.dic_json = defaultdict() + + def drive_bench(self, benchmark, roles, benchmark_fname, benchmark_detail=None, pip_dict=None, proxy_info=None): + roles = sorted(roles) + pip_dict = sorted(pip_dict) + result_dir = 'results' + benchmark_name = benchmark + '.yaml' + self.dic_json['Dest_dir'] = str(result_dir) + self.dic_json['ip1'] = '' + self.dic_json['ip2'] = '' + self.dic_json['installer'] = str(os.environ['INSTALLER_TYPE']) + self.dic_json['workingdir'] = str(os.environ['PWD']) + self.dic_json['fname'] = str(benchmark_fname) + self.dic_json['username'] = str('root') + + for key in proxy_info.keys(): + self.dic_json[key] = proxy_info[key] + + if os.environ['INSTALLER_TYPE'] == str('joid'): + self.dic_json['username'] = str('ubuntu') + if os.environ['INSTALLER_TYPE'] == str('apex'): + self.dic_json['username'] = str('heat-admin') + for k, v in benchmark_detail: + self.dic_json[k] = v + for k, v in roles: + self.dic_json['role'] = k + index = 1 + if benchmark_detail is not None: + for values in v: + if k == '1-server': + print values, 'saving IP' + self.dic_json['ip' + str(index)] = str(values) + if pip_dict[0][1][0]: + self.dic_json['privateip' + str(index)] = pip_dict[0][1] + if not pip_dict[0][1][0]: + self.dic_json['privateip' + str(index)] = 'NONE' + index = index + 1 + dic_json = json.dumps(dict(self.dic_json.items())) + print dic_json + run_play = 'ansible-playbook ./benchmarks/playbooks/{0} --private-key=./data/QtipKey -i ./data/hosts --extra-vars \'{1}\''.format(benchmark_name, dic_json) + os.system(run_play) diff --git a/func/env_setup.py b/func/env_setup.py new file mode 100644 index 00000000..f59883a0 --- /dev/null +++ b/func/env_setup.py @@ -0,0 +1,177 @@ +############################################################################## +# Copyright (c) 2015 Dell Inc 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 +############################################################################## + +import os +import sys +from collections import defaultdict +import yaml +import time +import paramiko +import socket + + +class Env_setup: + roles_ip_list = [] # ROLE and its corresponding IP address list + ip_pw_list = [] # IP and password, this will be used to ssh + roles_dict = defaultdict(list) + ip_pw_dict = defaultdict(list) + ip_pip_list = [] + vm_parameters = defaultdict(list) + benchmark_details = defaultdict() + benchmark = '' + + def __init__(self): + print '\nParsing class initiated\n' + self.roles_ip_list[:] = [] + self.ip_pw_list[:] = [] + self.roles_dict.clear() + self.ip_pw_dict.clear() + self.ip_pip_list[:] = [] + self.proxy_info = {} + self.vm_parameters.clear() + self.benchmark_details.clear() + self.benchmark = '' + + @staticmethod + def write_to_file(role): + f_name_2 = open('./data/hosts', 'w') + print role.items() + for k in role: + f_name_2.write('[' + k + ']\n') + num = len(role[k]) + for x in range(num): + f_name_2.write(role[k][x] + '\n') + f_name_2.close() + + @staticmethod + def ssh_test(lister): + print 'list: ', lister + for k, v in lister: + ip_var = k + print '\nBeginning SSH Test!\n' + if v != '': + print ('\nSSH->>>>> {0} {1}\n'.format(k, v)) + time.sleep(2) + + ssh_c = 'ssh-keyscan {0} >> ~/.ssh/known_hosts'.format(k) + os.system(ssh_c) + ssh_cmd = './data/qtip_creds.sh {0}'.format(ip_var) + print ssh_cmd + os.system(ssh_cmd) + for infinity in range(100): + try: + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(k, key_filename='./data/QtipKey') + stdin, stdout, stderr = ssh.exec_command('ls') + print('SSH successful') + for line in stdout: + print '... ' + line.strip('\n') + break + except socket.error: + print 'Retrying aSSH %s' % infinity + time.sleep(1) + if v == '': + print ('SSH->>>>>', k) + ssh_c = 'ssh-keyscan {0} >> ~/.ssh/known_hosts'.format(k) + + time.sleep(3) + os.system(ssh_c) + + for infinity in range(10): + try: + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + ssh.connect(k, key_filename='./data/QtipKey') + stdin, stdout, stderr = ssh.exec_command('ls') + print('SSH successful') + for line in stdout: + print '... ' + line.strip('\n') + break + except socket.error: + print 'Retrying SSH %s' % infinity + + @staticmethod + def ping_test(lister, attempts=30): + for k, v in lister.iteritems(): + time.sleep(10) + for val in v: + ipvar = val + ping_cmd = 'ping -D -c1 {0}'.format(ipvar) + for i in range(attempts): + if os.system(ping_cmd) != 0: + print '\nWaiting for machine\n' + time.sleep(10) + else: + break + print ('\n\n %s is UP \n\n ' % ipvar) + + def get_host_machine_info(self, host_tag): + + num = len(host_tag) + offset = len(self.roles_ip_list) + for x in range(num): + hostlabel = 'machine_' + str(x + 1) + self.roles_ip_list.insert( + offset, (host_tag[hostlabel]['role'], host_tag[hostlabel]['ip'])) + self.ip_pw_list.insert( + offset, (host_tag[hostlabel]['ip'], host_tag[hostlabel]['pw'])) + + def get_virtual_machine_info(self, virtual_tag): + + num = len(virtual_tag) + for x in range(num): + host_label = 'virtualmachine_' + str(x + 1) + for k, v in virtual_tag[host_label].iteritems(): + self.vm_parameters[k].append(v) + + def get_bench_mark_details(self, detail_dic): + + print detail_dic + for k, v in detail_dic.items(): + self.benchmark_details[k] = v + + def parse(self, config_file_path): + try: + f_name = open(config_file_path, 'r+') + doc = yaml.load(f_name) + f_name.close() + if doc['Scenario']['benchmark']: + self.benchmark = doc['Scenario']['benchmark'] + if doc['Context']['Virtual_Machines']: + self.get_virtual_machine_info(doc['Context']['Virtual_Machines']) + if doc['Context']['Host_Machines']: + self.get_host_machine_info(doc['Context']['Host_Machines']) + if doc.get('Scenario', {}).get('benchmark_details', {}): + self.get_bench_mark_details(doc.get('Scenario', {}).get('benchmark_details', {})) + if 'Proxy_Environment' in doc['Context'].keys(): + self.proxy_info['http_proxy'] = doc['Context']['Proxy_Environment']['http_proxy'] + self.proxy_info['https_proxy'] = doc['Context']['Proxy_Environment']['https_proxy'] + self.proxy_info['no_proxy'] = doc['Context']['Proxy_Environment']['no_proxy'] + for k, v in self.roles_ip_list: + self.roles_dict[k].append(v) + for k, v in self.ip_pw_list: + self.ip_pw_dict[k].append(v) + return ( + self.benchmark, + self.vm_parameters, + self.benchmark_details.items(), + self.proxy_info) + except KeyboardInterrupt: + print 'ConfigFile Closed: exiting!' + sys.exit(0) + + def update_ansible(self): + self.write_to_file(self.roles_dict) + + def call_ping_test(self): + self.ping_test(self.roles_dict) + + def call_ssh_test(self): + self.ssh_test(self.ip_pw_list) diff --git a/func/fetchimg.py b/func/fetchimg.py new file mode 100644 index 00000000..1ed3def6 --- /dev/null +++ b/func/fetchimg.py @@ -0,0 +1,35 @@ +##############################################################################
+# Copyright (c) 2015 Dell Inc 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
+##############################################################################
+import os
+import time
+
+IMGSTORE = "/home/opnfv/imgstore"
+
+
+class FetchImg:
+
+ def __init__(self):
+ print 'Fetching Image!'
+
+ @staticmethod
+ def download():
+ time.sleep(2)
+ os.system('mkdir -p Temp_Img')
+ filepath = './Temp_Img/QTIP_CentOS.qcow2'
+ imgstorepath = IMGSTORE + "/QTIP_CentOS.qcow2"
+ if os.path.isfile(imgstorepath):
+ os.system("ln -s %s %s" % (imgstorepath, filepath))
+ print "QTIP_CentOS.qcow2 exists locally. Skipping the download and using the file from IMG store"
+ else:
+ print 'Fetching QTIP_CentOS.qcow2'
+ os.system('wget http://artifacts.opnfv.org/qtip/QTIP_CentOS.qcow2 -P Temp_Img')
+
+ while not os.path.isfile(filepath):
+ time.sleep(10)
+ print 'Download Completed!'
diff --git a/func/spawn_vm.py b/func/spawn_vm.py new file mode 100644 index 00000000..15c26861 --- /dev/null +++ b/func/spawn_vm.py @@ -0,0 +1,278 @@ +##############################################################################
+# Copyright (c) 2015 Dell Inc 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
+##############################################################################
+
+import os
+import sys
+from collections import defaultdict
+from func.env_setup import Env_setup
+from func.fetchimg import FetchImg
+import yaml
+import heatclient.client
+import keystoneclient
+import glanceclient
+from novaclient import client
+import time
+from func.create_zones import create_zones
+
+
+class SpawnVM(Env_setup):
+ vm_role_ip_dict = defaultdict(list)
+ installer = ''
+
+ def __init__(self, vm_info):
+ print 'SpawnVM Class initiated'
+ vm_role_ip_dict = vm_info.copy()
+ print 'Generating Heat Template\n'
+ self._keystone_client = None
+ self._heat_client = None
+ self._glance_client = None
+ self._nova_client = None
+ self. _get_nova_client()
+ azoneobj = create_zones()
+ azoneobj.create_agg(vm_info['availability_zone'])
+ installer = self.get_installer_type()
+ self.Heat_template1 = self.heat_template_vm(vm_info, installer)
+ self.create_stack(vm_role_ip_dict, self.Heat_template1)
+
+ @staticmethod
+ def get_installer_type():
+ print 'Getting Installer Name'
+ return os.environ['INSTALLER_TYPE']
+
+ @staticmethod
+ def get_public_network(installer_detected):
+
+ """
+ TODO: GET THE NAMES OF THE PUBLIC NETWORKS for OTHER PROJECTS
+ """
+ print 'Getting Public Network'
+ if installer_detected.lower() == 'fuel':
+ return 'admin_floating_net'
+ if installer_detected.lower() == 'apex':
+ return 'external'
+ if installer_detected.lower() == 'compass':
+ return 'ext-net'
+ if installer_detected.lower() == 'joid':
+ return 'ext-net'
+
+ def heat_template_vm(self, vm_params, installer):
+ Heat_Dic = {}
+ try:
+ with open('./heat/SampleHeat.yaml', 'r+') as H_temp:
+ Heat_Dic = yaml.load(H_temp)
+ except yaml.YAMLError as exc:
+ if hasattr(exc, 'problem_mark'):
+ mark = exc.problem_mark
+ print 'Error in qtip/heat/SampleHeat.yaml at: (%s,%s)' % (mark.line + 1, mark.column + 1)
+ print 'EXITING PROGRAM. Correct File and restart'
+ sys.exit(0)
+ fopen = open('./data/QtipKey.pub', 'r')
+ fopenstr = fopen.read()
+ fopenstr = fopenstr.rstrip()
+ scriptcmd = '#!/bin/bash \n echo {0} >> foo.txt \n echo {1} >> /root/.ssh/authorized_keys'.format(
+ fopenstr, fopenstr)
+
+ netName = self.get_public_network(installer)
+ print netName
+ Heat_Dic['heat_template_version'] = '2014-10-16'
+ Heat_Dic['resources']['KeyPairSavePrivate'] = {
+ 'type': 'OS::Nova::KeyPair',
+ 'properties': {
+ 'save_private_key': 'true',
+ 'name': 'my_key'
+ }
+ }
+ Heat_Dic['parameters']['public_network'] = {
+ 'type': 'string',
+ 'default': netName
+ }
+ for x in range(1, len(vm_params['availability_zone']) + 1):
+ avail_zone = vm_params['availability_zone'][x - 1]
+ img = vm_params['OS_image'][x - 1]
+ flavor = vm_params['flavor'][x - 1]
+
+ Heat_Dic['parameters']['availability_zone_' + str(x)] = \
+ {'description': 'Availability Zone of the instance',
+ 'default': avail_zone,
+ 'type': 'string'}
+
+ Heat_Dic['resources']['public_port_' + str(x)] = \
+ {'type': 'OS::Neutron::Port',
+ 'properties': {'network': {'get_resource': 'private_network'},
+ 'security_groups': [{'get_resource': 'demo1_security_Group'}],
+ 'fixed_ips': [{'subnet_id':
+ {'get_resource': 'private_subnet'}}]}}
+
+ Heat_Dic['resources']['floating_ip_' + str(x)] = {
+ 'type': 'OS::Neutron::FloatingIP',
+ 'properties': {
+ 'floating_network': {'get_param': 'public_network'}}}
+
+ Heat_Dic['resources']['floating_ip_assoc_' + str(x)] = {
+ 'type': 'OS::Neutron::FloatingIPAssociation',
+ 'properties': {
+ 'floatingip_id': {'get_resource': 'floating_ip_' + str(x)},
+ 'port_id': {'get_resource': 'public_port_' + str(x)}}}
+
+ Heat_Dic['resources']['my_instance_' + str(x)] = \
+ {'type': 'OS::Nova::Server',
+ 'properties': {'image': img,
+ 'networks':
+ [{'port': {'get_resource': 'public_port_' + str(x)}}],
+ 'flavor': flavor,
+ 'availability_zone': avail_zone,
+ 'name': 'instance' + str(x),
+ 'key_name': {'get_resource': 'KeyPairSavePrivate'},
+ 'user_data_format': 'RAW',
+ 'user_data': scriptcmd}}
+
+ Heat_Dic['resources']['demo1_security_Group'] = {
+ 'type': 'OS::Neutron::SecurityGroup',
+ 'properties': {
+ 'name': 'demo1_security_Group',
+ 'rules': [{
+ 'protocol': 'tcp',
+ 'port_range_min': 22,
+ 'port_range_max': 5201},
+ {'protocol': 'udp',
+ 'port_range_min': 22,
+ 'port_range_max': 5201},
+ {'protocol': 'icmp'}]}}
+
+ Heat_Dic['outputs']['instance_PIP_' + str(x)] = {
+ 'description': 'IP address of the instance',
+ 'value': {'get_attr': ['my_instance_' + str(x), 'first_address']}}
+ Heat_Dic['outputs']['instance_ip_' + str(x)] = {
+ 'description': 'IP address of the instance',
+ 'value': {'get_attr': ['floating_ip_' + str(x), 'floating_ip_address']}}
+
+ Heat_Dic['outputs']['availability_instance_' + str(x)] = {
+ 'description': 'Availability Zone of the Instance',
+ 'value': {'get_param': 'availability_zone_' + str(x)}}
+
+ Heat_Dic['outputs']['KeyPair_PublicKey'] = {
+ 'description': 'Private Key',
+ 'value': {'get_attr': ['KeyPairSavePrivate', 'private_key']}
+ }
+ del Heat_Dic['outputs']['description']
+ print Heat_Dic
+ return Heat_Dic
+
+ def _get_keystone_client(self):
+ """returns a keystone client instance"""
+
+ if self._keystone_client is None:
+ self._keystone_client = keystoneclient.v2_0.client.Client(
+ auth_url=os.environ.get('OS_AUTH_URL'),
+ username=os.environ.get('OS_USERNAME'),
+ password=os.environ.get('OS_PASSWORD'),
+ tenant_name=os.environ.get('OS_TENANT_NAME'))
+ return self._keystone_client
+
+ def _get_nova_client(self):
+ if self._nova_client is None:
+ keystone = self._get_keystone_client()
+ self._nova_client = client.Client('2', token=keystone.auth_token)
+ return self._nova_client
+
+ def _get_heat_client(self):
+ """returns a heat client instance"""
+ if self._heat_client is None:
+ keystone = self._get_keystone_client()
+ heat_endpoint = keystone.service_catalog.url_for(
+ service_type='orchestration')
+ self._heat_client = heatclient.client.Client(
+ '1', endpoint=heat_endpoint, token=keystone.auth_token)
+ return self._heat_client
+
+ def _get_glance_client(self):
+ if self._glance_client is None:
+ keystone = self._get_keystone_client()
+ glance_endpoint = keystone.service_catalog.url_for(
+ service_type='image')
+ self._glance_client = glanceclient.Client(
+ '2', glance_endpoint, token=keystone.auth_token)
+ return self._glance_client
+
+ def create_stack(self, vm_role_ip_dict, heat_template):
+
+ global sshkey
+ stackname = 'QTIP'
+ heat = self._get_heat_client()
+ glance = self._get_glance_client()
+
+ available_images = []
+ for image_list in glance.images.list():
+
+ available_images.append(image_list.name)
+
+ if 'QTIP_CentOS' in available_images:
+ print 'Image Present'
+
+ elif 'QTIP_CentOS' not in available_images:
+ fetchImage = FetchImg()
+ fetchImage.download()
+ print 'Uploading Image to Glance. Please wait'
+ qtip_image = glance.images.create(
+ name='QTIP_CentOS',
+ visibility='public',
+ disk_format='qcow2',
+ container_format='bare')
+ glance.images.upload(
+ qtip_image.id, open('./Temp_Img/QTIP_CentOS.qcow2'))
+ for checks in range(3):
+ print "Try to delete heats %s" % checks
+ for prev_stacks in heat.stacks.list():
+ if prev_stacks.stack_name == 'QTIP':
+ print 'QTIP Stacks exists.\nDeleting Existing Stack'
+ heat.stacks.delete('QTIP')
+ time.sleep(10)
+
+ print '\nStack Creating Started\n'
+
+ try:
+ heat.stacks.create(stack_name=stackname, template=heat_template)
+ except Exception:
+ print 'Create Failed :( '
+
+ cluster_detail = heat.stacks.get(stackname)
+ while cluster_detail.status != 'COMPLETE':
+ if cluster_detail.status == 'IN_PROGRESS':
+ print 'Stack Creation in Progress'
+ cluster_detail = heat.stacks.get(stackname)
+ time.sleep(10)
+ print 'Stack Created'
+ print 'Getting Public IP(s)'
+ zone = []
+ s = 0
+ for vm in range(len(vm_role_ip_dict['OS_image'])):
+
+ for I in cluster_detail.outputs:
+ availabilityKey = 'availability_instance_' + str(vm + 1)
+
+ if I['output_key'] == availabilityKey:
+ zone.insert(s, str(I['output_value']))
+ s = s + 1
+ for i in cluster_detail.outputs:
+ instanceKey = "instance_ip_" + str(vm + 1)
+ privateIPkey = 'instance_PIP_' + str(vm + 1)
+ if i['output_key'] == instanceKey:
+ Env_setup.roles_dict[vm_role_ip_dict['role'][vm]] \
+ .append(str(i['output_value']))
+ Env_setup.ip_pw_list.append((str(i['output_value']), ''))
+
+ if i['output_key'] == privateIPkey:
+ Env_setup.ip_pw_dict[vm_role_ip_dict['role'][vm]] = str(i['output_value'])
+ if i['output_key'] == 'KeyPair_PublicKey':
+ sshkey = str(i['output_value'])
+
+ with open('./data/my_key.pem', 'w') as fopen:
+ fopen.write(sshkey)
+ fopen.close()
+ print Env_setup.ip_pw_list
diff --git a/get_env_info.sh b/get_env_info.sh new file mode 100755 index 00000000..2fb0d22b --- /dev/null +++ b/get_env_info.sh @@ -0,0 +1,37 @@ +#! /bin/bash + +usage() { + echo "usage $0 -n <installer_type> -i <installer_ip> -k <key incase of apex>" +} + + + +while getopts ":n:i:k:" optchar; do + case "${optchar}" in + n) + export INSTALLER_TYPE=${OPTARG};; + + i) + export INSTALLER_IP=${OPTARG};; + + k) + export APEX_KEY=${OPTARG};; + + *) + echo "Incorrect usage" + usage ;; + esac +done + +if [ $INSTALLER_TYPE == "apex" ] + then + if [ -z $APEX_KEY ] + then + echo "Please provide the the key to access the APEX Instack VM" + usage + exit 1 + fi +fi + + +./data/fetch_os_creds.sh -d ./opnfv-creds.sh diff --git a/heat/SampleHeat.yaml b/heat/SampleHeat.yaml new file mode 100644 index 00000000..ae9f5667 --- /dev/null +++ b/heat/SampleHeat.yaml @@ -0,0 +1,36 @@ +heat_template_version: 2014-10-16 +parameters: + + private_net_name: + type: string + default: 'private_network' + + availability_zone: + type: string + description: The AvailZone. + default: compute1 + +resources: + + private_network: + type: OS::Neutron::Net + private_subnet: + type: OS::Neutron::Subnet + properties: + network_id: { get_resource: private_network } + cidr: '10.10.17.0/24' + dns_nameservers: [ '8.8.8.8' ] + gateway_ip: '10.10.17.1' + allocation_pools: [ {"start":'10.10.17.2', "end": '10.10.17.200'} ] + router_1: + type: OS::Neutron::Router + properties: + external_gateway_info: + network: { get_param: public_network } + router_interface: + type: OS::Neutron::RouterInterface + properties: + router_id: { get_resource: router_1 } + subnet: { get_resource: private_subnet } +outputs: + description: 'none' diff --git a/opnfv-creds.sh b/opnfv-creds.sh new file mode 100644 index 00000000..54d5aa3a --- /dev/null +++ b/opnfv-creds.sh @@ -0,0 +1,16 @@ +#!/bin/sh +export LC_ALL=C +export OS_NO_CACHE='true' +export OS_TENANT_NAME='admin' +export OS_USERNAME='admin' +export OS_PASSWORD='admin' +export OS_AUTH_URL='http://172.18.1.5:5000/v2.0' +export OS_AUTH_STRATEGY='keystone' +export OS_REGION_NAME='RegionOne' +export CINDER_ENDPOINT_TYPE='internalURL' +export GLANCE_ENDPOINT_TYPE='internalURL' +export KEYSTONE_ENDPOINT_TYPE='internalURL' +export NOVA_ENDPOINT_TYPE='internalURL' +export NEUTRON_ENDPOINT_TYPE='internalURL' +export OS_ENDPOINT_TYPE='internalURL' +export MURANO_REPO_URL='http://storage.apps.openstack.org/' diff --git a/qtip.py b/qtip.py new file mode 100644 index 00000000..f95bb707 --- /dev/null +++ b/qtip.py @@ -0,0 +1,22 @@ +##############################################################################
+# Copyright (c) 2015 Dell Inc 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 func.cli import cli
+import os
+
+
+def main():
+ os.system('./data/file_permission.sh')
+ cli()
+# os.system('cd data/ref_results && python compute_suite.py')
+# os.system('cd data/ref_results && python storage_suite.py')
+# os.system('cd data/ref_results && python network_suite.py')
+# os.system('cd data/report && python Qtip_Report.py')
+
+if __name__ == "__main__":
+ main()
diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..358b7d0d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +pyyaml==3.10 +paramiko==1.16.0 +python-neutronclient==2.6.0 +python-novaclient==2.28.1 +python-glanceclient==1.1.0 +python-cinderclient==1.4.0 +python-heatclient==0.6.0 +python-keystoneclient==1.6.0 +reportlab==3.0 diff --git a/results/foo.txt b/results/foo.txt new file mode 100644 index 00000000..257cc564 --- /dev/null +++ b/results/foo.txt @@ -0,0 +1 @@ +foo diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..52874dd3 --- /dev/null +++ b/setup.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +from distutils.core import setup + + +setup(name='qtip', + py_modules=['qtip'], + version='1.0', + author='opnfv', + packages=['func', 'data.ref_results', 'data.report']) diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 00000000..31581503 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,7 @@ +# The order of packages is significant, because pip processes them in the order +# of appearance. Changing the order has an impact on the overall integration +# process, which may cause wedges in the gate later. + +pytest +pykwalify +mock diff --git a/test_cases/default/compute/dhrystone_bm.yaml b/test_cases/default/compute/dhrystone_bm.yaml new file mode 100644 index 00000000..ff17ea4d --- /dev/null +++ b/test_cases/default/compute/dhrystone_bm.yaml @@ -0,0 +1,33 @@ + +Scenario: + benchmark: dhrystone + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.6 + pw: + role: host + machine_2: + ip: 10.20.0.5 + pw: + role: host + + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: ''' diff --git a/test_cases/default/compute/dhrystone_vm.yaml b/test_cases/default/compute/dhrystone_vm.yaml new file mode 100644 index 00000000..8f5a4165 --- /dev/null +++ b/test_cases/default/compute/dhrystone_vm.yaml @@ -0,0 +1,45 @@ +Scenario: + benchmark: dhrystone + host: virtualmachine_1, virtualmachine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + machine_1: + ip: 172.18.0.16 + pw: Op3nStack + role: host + machine_2: + ip: 172.18.0.15 + pw: Op3nStack + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/default/compute/dpi_bm.yaml b/test_cases/default/compute/dpi_bm.yaml new file mode 100644 index 00000000..1bc534b3 --- /dev/null +++ b/test_cases/default/compute/dpi_bm.yaml @@ -0,0 +1,34 @@ +Scenario: + benchmark: dpi + host: machine_1,machine_2 + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: Op3nStack + role: 1host + machine_2: + ip: 10.20.0.5 + pw: Op3nStack + role: 1host + Virtual_Machines: +Test_Description: + Test_category: "Compute" + Benchmark: "dpi" + Overview: > + '''This test will run the DPI benchmark in serial on virutalmachine_1 and virtualmachine_2.\n + if you wish to add a host machine add the following information under the Host_Machine tag + virtualmachine_2: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'provider_network' + + role: 1host + flavor: m1.large + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/default/compute/dpi_vm.yaml b/test_cases/default/compute/dpi_vm.yaml new file mode 100644 index 00000000..10e86993 --- /dev/null +++ b/test_cases/default/compute/dpi_vm.yaml @@ -0,0 +1,35 @@ +Scenario: + benchmark: dpi + 1Run : virtualmachine_1, virtualmachine_2 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1Run + flavor: m1.large + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1Run + flavor: m1.large + +Test_Description: + Test_category: "Compute" + Benchmark: "dpi" + Overview: > + '''This test will run the DPI benchmark in parallel on virutalmachine_1 and virtualmachine_2.\n + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/default/compute/ramspeed_bm.yaml b/test_cases/default/compute/ramspeed_bm.yaml new file mode 100644 index 00000000..ce6d8921 --- /dev/null +++ b/test_cases/default/compute/ramspeed_bm.yaml @@ -0,0 +1,35 @@ + +Scenario: + benchmark: ramspeed + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.6 + pw: + role: host + machine_2: + ip: 10.20.0.5 + pw: + role: host + + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: ''' + + diff --git a/test_cases/default/compute/ramspeed_vm.yaml b/test_cases/default/compute/ramspeed_vm.yaml new file mode 100644 index 00000000..a6a4363f --- /dev/null +++ b/test_cases/default/compute/ramspeed_vm.yaml @@ -0,0 +1,45 @@ +Scenario: + benchmark: ramspeed + host: virtualmachine_1, virtualmachine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + machine_1: + ip: 172.18.0.16 + pw: Op3nStack + role: host + machine_2: + ip: 172.18.0.15 + pw: Op3nStack + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/default/compute/ssl_bm.yaml b/test_cases/default/compute/ssl_bm.yaml new file mode 100644 index 00000000..dc038822 --- /dev/null +++ b/test_cases/default/compute/ssl_bm.yaml @@ -0,0 +1,31 @@ +Scenario: + benchmark: ssl + 1Run: machine_1,machine_2 + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: + role: 1Run + machine_2: + ip: 10.20.0.5 + pw: + role: 1Run + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "ssl" + Overview: > + '''This test will run the SSL benchmark in parallel on machine_1 and machine_1. + If you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' diff --git a/test_cases/default/compute/ssl_vm.yaml b/test_cases/default/compute/ssl_vm.yaml new file mode 100644 index 00000000..37824896 --- /dev/null +++ b/test_cases/default/compute/ssl_vm.yaml @@ -0,0 +1,36 @@ +Scenario: + benchmark: ssl + host: virtualmachine_1, virtualmachine_2 + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: 'QTIP_CentOS' + flavor: 'm1.large' + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: 'QTIP_CentOS' + flavor: 'm1.large' + role: host + + +Test_Description: + Test_category: "Compute" + Benchmark: "ssl" + Overview: > + '''This test will run the SSL benchmark in parallel on virtualmachine_1 and machine_1.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' diff --git a/test_cases/default/compute/whetstone_bm.yaml b/test_cases/default/compute/whetstone_bm.yaml new file mode 100644 index 00000000..180d4e51 --- /dev/null +++ b/test_cases/default/compute/whetstone_bm.yaml @@ -0,0 +1,34 @@ + +Scenario: + benchmark: whetstone + host: machine_1, machine_2 + + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: + role: host + machine_2: + ip: 10.20.0.5 + pw: + role: host + Virtual_Machines: + + + +Test_Description: + Test_category: "Compute" + Benchmark: "whetstone" + Overview: > + ''' This test will run the whetstone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a baremetal machine add the following information under the Virtual_Machine tag + + machine_3: + ip: + pw: + role: + ''' + + diff --git a/test_cases/default/compute/whetstone_vm.yaml b/test_cases/default/compute/whetstone_vm.yaml new file mode 100644 index 00000000..0f1e8748 --- /dev/null +++ b/test_cases/default/compute/whetstone_vm.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: whetstone + host: virtualmachine_1, virtualmachine_1 + server: + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the whetstone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + virtualmachine_1: + availability_zone: nova + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/default/network/iperf_bm.yaml b/test_cases/default/network/iperf_bm.yaml new file mode 100644 index 00000000..b0410d4e --- /dev/null +++ b/test_cases/default/network/iperf_bm.yaml @@ -0,0 +1,50 @@ +Scenario: + benchmark: iperf + topology: Client and Server on different baremetal Compute nodes + server: machine_1 + client: machine_2 + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 10 + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.5 + pw: + role: 2-host + machine_2: + ip: 10.20.0.6 + pw: + role: 1-server + + Virtual_Machines: + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/default/network/iperf_vm.yaml b/test_cases/default/network/iperf_vm.yaml new file mode 100644 index 00000000..49bf13ad --- /dev/null +++ b/test_cases/default/network/iperf_vm.yaml @@ -0,0 +1,43 @@ +Scenario: + benchmark: iperf + topology: Client and Server on ONE compute + server : virtualmachine_1 + client: virtualmachine_2 + description: 'Leave the bandwidth as 0 to throttle maximum traffic' + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 0 + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/default/network/iperf_vm_2.yaml b/test_cases/default/network/iperf_vm_2.yaml new file mode 100644 index 00000000..c5b94715 --- /dev/null +++ b/test_cases/default/network/iperf_vm_2.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: iperf + topology: Client and Server on two different compute nodes + server : virtualmachine_1 + client: virtualmachine_2 + description: 'Leave the bandwidth as 0 to throttle maximum traffic' + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 0 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/default/network/netperf.yaml b/test_cases/default/network/netperf.yaml new file mode 100644 index 00000000..f4ce396b --- /dev/null +++ b/test_cases/default/network/netperf.yaml @@ -0,0 +1,42 @@ +Scenario: + benchmark: netperf + topology: Client and Server on ONE compute + server : virtualmachine_1 + client: virtualmachine_2 + benchmark_details: + duration: 10 + teststream: udp_stream + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "netperf" + Overview: > + '''This test will run the NETPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/default/storage/fio_bm.yaml b/test_cases/default/storage/fio_bm.yaml new file mode 100644 index 00000000..3b0ce3af --- /dev/null +++ b/test_cases/default/storage/fio_bm.yaml @@ -0,0 +1,39 @@ +Scenario: + benchmark: fio + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.7 + pw: r00tme + role: host + machine_2: + ip: 10.20.0.6 + pw: r00tme + role: host + + + Virtual_Machines: + + +Test_Description: + Test_category: "Storage" + Benchmark: "FIO" + Overview: > + '''This test will run the FIO benchmark in parallel on host machines "machine_1" and "machine_2".\n + The fio job specifications can be found in qtip/benchmarks/fio_jobs/test_job. + The job conists of an fio load of: + 1.50% rand read 50% rand write + 2.Asynch engine + 3.Direct IO. + 4.Queing depth of 2 + + if you wish to add another machine add the following information under the Host_Machines tag + machine_3: + ip: 172.18.0.16 + pw: Op3nStack + role: host + ''' + diff --git a/test_cases/default/storage/fio_vm.yaml b/test_cases/default/storage/fio_vm.yaml new file mode 100644 index 00000000..0e7f121b --- /dev/null +++ b/test_cases/default/storage/fio_vm.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: fio + host: virtualmachine_1, virtualmachine_2 + server: + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Storage" + Benchmark: "FIO" + Overview: > + '''This test will run the FIO benchmark in parallel on virtualmachine_1 and virtualmachine_2.\n + The fio job specifications can be found in qtip/benchmarks/fio_jobs/test_job. + The job conists of an fio load of: + 1.50% rand read 50% rand write + 2.Asynch engine + 3.Direct IO. + 4.Queing depth of 2 + + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_3: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/dell-pod1/compute/dhrystone_bm.yaml b/test_cases/dell-pod1/compute/dhrystone_bm.yaml new file mode 100644 index 00000000..2f8d0ec9 --- /dev/null +++ b/test_cases/dell-pod1/compute/dhrystone_bm.yaml @@ -0,0 +1,35 @@ + +Scenario: + benchmark: dhrystone + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 172.16.1.4 + pw: + role: host + machine_2: + ip: 172.16.1.5 + pw: + role: host + + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: ''' + + diff --git a/test_cases/dell-pod1/compute/dhrystone_vm.yaml b/test_cases/dell-pod1/compute/dhrystone_vm.yaml new file mode 100644 index 00000000..8f5a4165 --- /dev/null +++ b/test_cases/dell-pod1/compute/dhrystone_vm.yaml @@ -0,0 +1,45 @@ +Scenario: + benchmark: dhrystone + host: virtualmachine_1, virtualmachine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + machine_1: + ip: 172.18.0.16 + pw: Op3nStack + role: host + machine_2: + ip: 172.18.0.15 + pw: Op3nStack + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/dell-pod1/compute/dpi_bm.yaml b/test_cases/dell-pod1/compute/dpi_bm.yaml new file mode 100644 index 00000000..45324184 --- /dev/null +++ b/test_cases/dell-pod1/compute/dpi_bm.yaml @@ -0,0 +1,34 @@ +Scenario: + benchmark: dpi + host: machine_1,machine_2 + +Context: + Host_Machines: + machine_1: + ip: 172.16.1.4 + pw: + role: 1host + machine_2: + ip: 172.16.1.5 + pw: + role: 1host + Virtual_Machines: +Test_Description: + Test_category: "Compute" + Benchmark: "dpi" + Overview: > + '''This test will run the DPI benchmark in serial on virutalmachine_1 and virtualmachine_2.\n + if you wish to add a host machine add the following information under the Host_Machine tag + virtualmachine_2: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'provider_network' + + role: 1host + flavor: m1.large + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-pod1/compute/dpi_vm.yaml b/test_cases/dell-pod1/compute/dpi_vm.yaml new file mode 100644 index 00000000..8a157e7a --- /dev/null +++ b/test_cases/dell-pod1/compute/dpi_vm.yaml @@ -0,0 +1,35 @@ +Scenario: + benchmark: dpi + 1Run : virtualmachine_1, virtualmachine_2 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1Run + flavor: m1.large + virtualmachine_2: + availability_zone: compute4 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1Run + flavor: m1.large + +Test_Description: + Test_category: "Compute" + Benchmark: "dpi" + Overview: > + '''This test will run the DPI benchmark in parallel on virutalmachine_1 and virtualmachine_2.\n + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-pod1/compute/ramspeed_bm.yaml b/test_cases/dell-pod1/compute/ramspeed_bm.yaml new file mode 100644 index 00000000..af220b80 --- /dev/null +++ b/test_cases/dell-pod1/compute/ramspeed_bm.yaml @@ -0,0 +1,35 @@ + +Scenario: + benchmark: ramspeed + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 172.16.1.4 + pw: + role: host + machine_2: + ip: 172.16.1.5 + pw: + role: host + + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: ''' + + diff --git a/test_cases/dell-pod1/compute/ramspeed_vm.yaml b/test_cases/dell-pod1/compute/ramspeed_vm.yaml new file mode 100644 index 00000000..a6a4363f --- /dev/null +++ b/test_cases/dell-pod1/compute/ramspeed_vm.yaml @@ -0,0 +1,45 @@ +Scenario: + benchmark: ramspeed + host: virtualmachine_1, virtualmachine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + machine_1: + ip: 172.18.0.16 + pw: Op3nStack + role: host + machine_2: + ip: 172.18.0.15 + pw: Op3nStack + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/dell-pod1/compute/ssl_bm.yaml b/test_cases/dell-pod1/compute/ssl_bm.yaml new file mode 100644 index 00000000..6b14c4e6 --- /dev/null +++ b/test_cases/dell-pod1/compute/ssl_bm.yaml @@ -0,0 +1,31 @@ +Scenario: + benchmark: ssl + 1Run: machine_1,machine_2 + +Context: + Host_Machines: + machine_1: + ip: 172.16.1.4 + pw: + role: 1Run + machine_2: + ip: 172.16.1.5 + pw: + role: 1Run + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "ssl" + Overview: > + '''This test will run the SSL benchmark in parallel on machine_1 and machine_1. + If you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' diff --git a/test_cases/dell-pod1/compute/ssl_vm.yaml b/test_cases/dell-pod1/compute/ssl_vm.yaml new file mode 100644 index 00000000..37824896 --- /dev/null +++ b/test_cases/dell-pod1/compute/ssl_vm.yaml @@ -0,0 +1,36 @@ +Scenario: + benchmark: ssl + host: virtualmachine_1, virtualmachine_2 + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: 'QTIP_CentOS' + flavor: 'm1.large' + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: 'QTIP_CentOS' + flavor: 'm1.large' + role: host + + +Test_Description: + Test_category: "Compute" + Benchmark: "ssl" + Overview: > + '''This test will run the SSL benchmark in parallel on virtualmachine_1 and machine_1.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' diff --git a/test_cases/dell-pod1/compute/whetstone_bm.yaml b/test_cases/dell-pod1/compute/whetstone_bm.yaml new file mode 100644 index 00000000..128075a1 --- /dev/null +++ b/test_cases/dell-pod1/compute/whetstone_bm.yaml @@ -0,0 +1,34 @@ + +Scenario: + benchmark: whetstone + host: machine_1, machine_2 + + +Context: + Host_Machines: + machine_1: + ip: 172.16.1.4 + pw: + role: host + machine_2: + ip: 172.16.1.5 + pw: + role: host + Virtual_Machines: + + + +Test_Description: + Test_category: "Compute" + Benchmark: "whetstone" + Overview: > + ''' This test will run the whetstone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a baremetal machine add the following information under the Virtual_Machine tag + + machine_3: + ip: + pw: + role: + ''' + + diff --git a/test_cases/dell-pod1/compute/whetstone_vm.yaml b/test_cases/dell-pod1/compute/whetstone_vm.yaml new file mode 100644 index 00000000..0f1e8748 --- /dev/null +++ b/test_cases/dell-pod1/compute/whetstone_vm.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: whetstone + host: virtualmachine_1, virtualmachine_1 + server: + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the whetstone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + virtualmachine_1: + availability_zone: nova + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/dell-pod1/network/iperf_bm.yaml b/test_cases/dell-pod1/network/iperf_bm.yaml new file mode 100644 index 00000000..b2d2a958 --- /dev/null +++ b/test_cases/dell-pod1/network/iperf_bm.yaml @@ -0,0 +1,50 @@ +Scenario: + benchmark: iperf + topology: Client and Server on different baremetal Compute nodes + server: machine_1 + client: machine_2 + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 10 + +Context: + Host_Machines: + machine_1: + ip: 172.16.1.4 + pw: + role: 1-server + machine_2: + ip: 172.16.1.5 + pw: + role: 2-host + + Virtual_Machines: + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-pod1/network/iperf_vm.yaml b/test_cases/dell-pod1/network/iperf_vm.yaml new file mode 100644 index 00000000..d7079e99 --- /dev/null +++ b/test_cases/dell-pod1/network/iperf_vm.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: iperf + topology: Client and Server on ONE compute + server : virtualmachine_1 + client: virtualmachine_2 + description: 'Leave the bandwidth as 0 to throttle maximum traffic' + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 0 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-pod1/network/iperf_vm_2.yaml b/test_cases/dell-pod1/network/iperf_vm_2.yaml new file mode 100644 index 00000000..c5b94715 --- /dev/null +++ b/test_cases/dell-pod1/network/iperf_vm_2.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: iperf + topology: Client and Server on two different compute nodes + server : virtualmachine_1 + client: virtualmachine_2 + description: 'Leave the bandwidth as 0 to throttle maximum traffic' + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 0 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-pod1/network/netperf.yaml b/test_cases/dell-pod1/network/netperf.yaml new file mode 100644 index 00000000..f4ce396b --- /dev/null +++ b/test_cases/dell-pod1/network/netperf.yaml @@ -0,0 +1,42 @@ +Scenario: + benchmark: netperf + topology: Client and Server on ONE compute + server : virtualmachine_1 + client: virtualmachine_2 + benchmark_details: + duration: 10 + teststream: udp_stream + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "netperf" + Overview: > + '''This test will run the NETPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-pod1/storage/fio_bm.yaml b/test_cases/dell-pod1/storage/fio_bm.yaml new file mode 100644 index 00000000..755bb730 --- /dev/null +++ b/test_cases/dell-pod1/storage/fio_bm.yaml @@ -0,0 +1,39 @@ +Scenario: + benchmark: fio + host: machine_1, machine_2 + server: blakc + +Context: + Host_Machines: + machine_1: + ip: 172.16.1.4 + pw: + role: host + machine_2: + ip: 172.16.1.5 + pw: + role: host + + + Virtual_Machines: + + +Test_Description: + Test_category: "Storage" + Benchmark: "FIO" + Overview: > + '''This test will run the FIO benchmark in parallel on host machines "machine_1" and "machine_2".\n + The fio job specifications can be found in qtip/benchmarks/fio_jobs/test_job. + The job conists of an fio load of: + 1.50% rand read 50% rand write + 2.Asynch engine + 3.Direct IO. + 4.Queing depth of 2 + + if you wish to add another machine add the following information under the Host_Machines tag + machine_3: + ip: 172.18.0.16 + pw: Op3nStack + role: host + ''' + diff --git a/test_cases/dell-pod1/storage/fio_vm.yaml b/test_cases/dell-pod1/storage/fio_vm.yaml new file mode 100644 index 00000000..5ae90d2c --- /dev/null +++ b/test_cases/dell-pod1/storage/fio_vm.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: fio + host: machine_1, machine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Storage" + Benchmark: "FIO" + Overview: > + '''This test will run the FIO benchmark in parallel on virtualmachine_1 and virtualmachine_2.\n + The fio job specifications can be found in qtip/benchmarks/fio_jobs/test_job. + The job conists of an fio load of: + 1.50% rand read 50% rand write + 2.Asynch engine + 3.Direct IO. + 4.Queing depth of 2 + + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_3: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/compute/dhrystone_bm.yaml b/test_cases/dell-us-deploying-bm3/compute/dhrystone_bm.yaml new file mode 100644 index 00000000..4c1fc962 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/dhrystone_bm.yaml @@ -0,0 +1,35 @@ + +Scenario: + benchmark: dhrystone + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: + role: host + machine_2: + ip: 10.20.0.5 + pw: + role: host + + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: ''' + + diff --git a/test_cases/dell-us-deploying-bm3/compute/dhrystone_vm.yaml b/test_cases/dell-us-deploying-bm3/compute/dhrystone_vm.yaml new file mode 100644 index 00000000..8f5a4165 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/dhrystone_vm.yaml @@ -0,0 +1,45 @@ +Scenario: + benchmark: dhrystone + host: virtualmachine_1, virtualmachine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + machine_1: + ip: 172.18.0.16 + pw: Op3nStack + role: host + machine_2: + ip: 172.18.0.15 + pw: Op3nStack + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/compute/dpi_bm.yaml b/test_cases/dell-us-deploying-bm3/compute/dpi_bm.yaml new file mode 100644 index 00000000..1bc534b3 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/dpi_bm.yaml @@ -0,0 +1,34 @@ +Scenario: + benchmark: dpi + host: machine_1,machine_2 + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: Op3nStack + role: 1host + machine_2: + ip: 10.20.0.5 + pw: Op3nStack + role: 1host + Virtual_Machines: +Test_Description: + Test_category: "Compute" + Benchmark: "dpi" + Overview: > + '''This test will run the DPI benchmark in serial on virutalmachine_1 and virtualmachine_2.\n + if you wish to add a host machine add the following information under the Host_Machine tag + virtualmachine_2: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'provider_network' + + role: 1host + flavor: m1.large + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/compute/dpi_vm.yaml b/test_cases/dell-us-deploying-bm3/compute/dpi_vm.yaml new file mode 100644 index 00000000..10e86993 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/dpi_vm.yaml @@ -0,0 +1,35 @@ +Scenario: + benchmark: dpi + 1Run : virtualmachine_1, virtualmachine_2 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1Run + flavor: m1.large + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1Run + flavor: m1.large + +Test_Description: + Test_category: "Compute" + Benchmark: "dpi" + Overview: > + '''This test will run the DPI benchmark in parallel on virutalmachine_1 and virtualmachine_2.\n + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/compute/ramspeed_bm.yaml b/test_cases/dell-us-deploying-bm3/compute/ramspeed_bm.yaml new file mode 100644 index 00000000..a63df3e2 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/ramspeed_bm.yaml @@ -0,0 +1,35 @@ + +Scenario: + benchmark: ramspeed + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: + role: host + machine_2: + ip: 10.20.0.5 + pw: + role: host + + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: ''' + + diff --git a/test_cases/dell-us-deploying-bm3/compute/ramspeed_vm.yaml b/test_cases/dell-us-deploying-bm3/compute/ramspeed_vm.yaml new file mode 100644 index 00000000..a6a4363f --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/ramspeed_vm.yaml @@ -0,0 +1,45 @@ +Scenario: + benchmark: ramspeed + host: virtualmachine_1, virtualmachine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + machine_1: + ip: 172.18.0.16 + pw: Op3nStack + role: host + machine_2: + ip: 172.18.0.15 + pw: Op3nStack + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/compute/ssl_bm.yaml b/test_cases/dell-us-deploying-bm3/compute/ssl_bm.yaml new file mode 100644 index 00000000..dc038822 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/ssl_bm.yaml @@ -0,0 +1,31 @@ +Scenario: + benchmark: ssl + 1Run: machine_1,machine_2 + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: + role: 1Run + machine_2: + ip: 10.20.0.5 + pw: + role: 1Run + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "ssl" + Overview: > + '''This test will run the SSL benchmark in parallel on machine_1 and machine_1. + If you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' diff --git a/test_cases/dell-us-deploying-bm3/compute/ssl_vm.yaml b/test_cases/dell-us-deploying-bm3/compute/ssl_vm.yaml new file mode 100644 index 00000000..37824896 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/ssl_vm.yaml @@ -0,0 +1,36 @@ +Scenario: + benchmark: ssl + host: virtualmachine_1, virtualmachine_2 + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: 'QTIP_CentOS' + flavor: 'm1.large' + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: 'QTIP_CentOS' + flavor: 'm1.large' + role: host + + +Test_Description: + Test_category: "Compute" + Benchmark: "ssl" + Overview: > + '''This test will run the SSL benchmark in parallel on virtualmachine_1 and machine_1.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' diff --git a/test_cases/dell-us-deploying-bm3/compute/whetstone_bm.yaml b/test_cases/dell-us-deploying-bm3/compute/whetstone_bm.yaml new file mode 100644 index 00000000..180d4e51 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/whetstone_bm.yaml @@ -0,0 +1,34 @@ + +Scenario: + benchmark: whetstone + host: machine_1, machine_2 + + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: + role: host + machine_2: + ip: 10.20.0.5 + pw: + role: host + Virtual_Machines: + + + +Test_Description: + Test_category: "Compute" + Benchmark: "whetstone" + Overview: > + ''' This test will run the whetstone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a baremetal machine add the following information under the Virtual_Machine tag + + machine_3: + ip: + pw: + role: + ''' + + diff --git a/test_cases/dell-us-deploying-bm3/compute/whetstone_vm.yaml b/test_cases/dell-us-deploying-bm3/compute/whetstone_vm.yaml new file mode 100644 index 00000000..0f1e8748 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/compute/whetstone_vm.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: whetstone + host: virtualmachine_1, virtualmachine_1 + server: + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the whetstone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + virtualmachine_1: + availability_zone: nova + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/network/iperf_bm.yaml b/test_cases/dell-us-deploying-bm3/network/iperf_bm.yaml new file mode 100644 index 00000000..4c64dd16 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/network/iperf_bm.yaml @@ -0,0 +1,50 @@ +Scenario: + benchmark: iperf + topology: Client and Server on different baremetal Compute nodes + server: machine_1 + client: machine_2 + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 10 + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: + role: 1-server + machine_2: + ip: 10.20.0.5 + pw: + role: 2-host + + Virtual_Machines: + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/network/iperf_vm.yaml b/test_cases/dell-us-deploying-bm3/network/iperf_vm.yaml new file mode 100644 index 00000000..d7079e99 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/network/iperf_vm.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: iperf + topology: Client and Server on ONE compute + server : virtualmachine_1 + client: virtualmachine_2 + description: 'Leave the bandwidth as 0 to throttle maximum traffic' + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 0 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/network/iperf_vm_2.yaml b/test_cases/dell-us-deploying-bm3/network/iperf_vm_2.yaml new file mode 100644 index 00000000..c5b94715 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/network/iperf_vm_2.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: iperf + topology: Client and Server on two different compute nodes + server : virtualmachine_1 + client: virtualmachine_2 + description: 'Leave the bandwidth as 0 to throttle maximum traffic' + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 0 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/network/netperf.yaml b/test_cases/dell-us-deploying-bm3/network/netperf.yaml new file mode 100644 index 00000000..f4ce396b --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/network/netperf.yaml @@ -0,0 +1,42 @@ +Scenario: + benchmark: netperf + topology: Client and Server on ONE compute + server : virtualmachine_1 + client: virtualmachine_2 + benchmark_details: + duration: 10 + teststream: udp_stream + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "netperf" + Overview: > + '''This test will run the NETPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/dell-us-deploying-bm3/storage/fio_bm.yaml b/test_cases/dell-us-deploying-bm3/storage/fio_bm.yaml new file mode 100644 index 00000000..12be8c17 --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/storage/fio_bm.yaml @@ -0,0 +1,39 @@ +Scenario: + benchmark: fio + host: machine_1, machine_2 + server: blakc + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.4 + pw: r00tme + role: host + machine_2: + ip: 10.20.0.5 + pw: r00tme + role: host + + + Virtual_Machines: + + +Test_Description: + Test_category: "Storage" + Benchmark: "FIO" + Overview: > + '''This test will run the FIO benchmark in parallel on host machines "machine_1" and "machine_2".\n + The fio job specifications can be found in qtip/benchmarks/fio_jobs/test_job. + The job conists of an fio load of: + 1.50% rand read 50% rand write + 2.Asynch engine + 3.Direct IO. + 4.Queing depth of 2 + + if you wish to add another machine add the following information under the Host_Machines tag + machine_3: + ip: 172.18.0.16 + pw: Op3nStack + role: host + ''' + diff --git a/test_cases/dell-us-deploying-bm3/storage/fio_vm.yaml b/test_cases/dell-us-deploying-bm3/storage/fio_vm.yaml new file mode 100644 index 00000000..5ae90d2c --- /dev/null +++ b/test_cases/dell-us-deploying-bm3/storage/fio_vm.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: fio + host: machine_1, machine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Storage" + Benchmark: "FIO" + Overview: > + '''This test will run the FIO benchmark in parallel on virtualmachine_1 and virtualmachine_2.\n + The fio job specifications can be found in qtip/benchmarks/fio_jobs/test_job. + The job conists of an fio load of: + 1.50% rand read 50% rand write + 2.Asynch engine + 3.Direct IO. + 4.Queing depth of 2 + + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_3: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/zte-pod1/compute/dhrystone_bm.yaml b/test_cases/zte-pod1/compute/dhrystone_bm.yaml new file mode 100644 index 00000000..15a40d42 --- /dev/null +++ b/test_cases/zte-pod1/compute/dhrystone_bm.yaml @@ -0,0 +1,33 @@ + +Scenario: + benchmark: dhrystone + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.23 + pw: + role: host + machine_2: + ip: 10.20.0.24 + pw: + role: host + + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: ''' diff --git a/test_cases/zte-pod1/compute/dhrystone_vm.yaml b/test_cases/zte-pod1/compute/dhrystone_vm.yaml new file mode 100644 index 00000000..9e3f2113 --- /dev/null +++ b/test_cases/zte-pod1/compute/dhrystone_vm.yaml @@ -0,0 +1,45 @@ +Scenario: + benchmark: dhrystone + host: virtualmachine_1, virtualmachine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'admin-floating_net' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'admin-floating_net' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + machine_1: + ip: 172.18.0.16 + pw: Op3nStack + role: host + machine_2: + ip: 172.18.0.15 + pw: Op3nStack + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/zte-pod1/compute/dpi_bm.yaml b/test_cases/zte-pod1/compute/dpi_bm.yaml new file mode 100644 index 00000000..940307c3 --- /dev/null +++ b/test_cases/zte-pod1/compute/dpi_bm.yaml @@ -0,0 +1,36 @@ +Scenario: + benchmark: dpi + host: machine_1,machine_2 + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.23 + pw: + role: host + machine_2: + ip: 10.20.0.24 + pw: + role: host + Virtual_Machines: + + +Test_Description: + Test_category: "Compute" + Benchmark: "dpi" + Overview: > + '''This test will run the DPI benchmark in serial on virutalmachine_1 and virtualmachine_2.\n + if you wish to add a host machine add the following information under the Host_Machine tag + virtualmachine_2: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'provider_network' + + role: 1host + flavor: m1.large + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/zte-pod1/compute/dpi_vm.yaml b/test_cases/zte-pod1/compute/dpi_vm.yaml new file mode 100644 index 00000000..e61bf79f --- /dev/null +++ b/test_cases/zte-pod1/compute/dpi_vm.yaml @@ -0,0 +1,35 @@ +Scenario: + benchmark: dpi + 1Run : virtualmachine_1, virtualmachine_2 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'admin-floating_net' + role: 1Run + flavor: m1.large + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'admin-floating_net' + role: 1Run + flavor: m1.large + +Test_Description: + Test_category: "Compute" + Benchmark: "dpi" + Overview: > + '''This test will run the DPI benchmark in parallel on virutalmachine_1 and virtualmachine_2.\n + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/zte-pod1/compute/ramspeed_bm.yaml b/test_cases/zte-pod1/compute/ramspeed_bm.yaml new file mode 100644 index 00000000..f126a19d --- /dev/null +++ b/test_cases/zte-pod1/compute/ramspeed_bm.yaml @@ -0,0 +1,36 @@ + +Scenario: + benchmark: ramspeed + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.23 + pw: + role: host + machine_2: + ip: 10.20.0.24 + pw: + role: host + + Virtual_Machines: + + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: ''' + + diff --git a/test_cases/zte-pod1/compute/ramspeed_vm.yaml b/test_cases/zte-pod1/compute/ramspeed_vm.yaml new file mode 100644 index 00000000..7a2ef849 --- /dev/null +++ b/test_cases/zte-pod1/compute/ramspeed_vm.yaml @@ -0,0 +1,46 @@ +Scenario: + benchmark: ramspeed + host: virtualmachine_1, virtualmachine_2 + server: blakc + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'admin-floating_net' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'admin-floating_net' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + machine_1: + ip: 172.18.0.16 + pw: Op3nStack + role: host + machine_2: + ip: 172.18.0.15 + pw: Op3nStack + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/zte-pod1/compute/ssl_bm.yaml b/test_cases/zte-pod1/compute/ssl_bm.yaml new file mode 100644 index 00000000..95d53840 --- /dev/null +++ b/test_cases/zte-pod1/compute/ssl_bm.yaml @@ -0,0 +1,30 @@ +Scenario: + benchmark: ssl + host: machine_1,machine_2 + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.23 + pw: + role: host + machine_2: + ip: 10.20.0.24 + pw: + role: host + Virtual_Machines: + +Test_Description: + Test_category: "Compute" + Benchmark: "ssl" + Overview: > + '''This test will run the SSL benchmark in parallel on machine_1 and machine_1. + If you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' diff --git a/test_cases/zte-pod1/compute/ssl_vm.yaml b/test_cases/zte-pod1/compute/ssl_vm.yaml new file mode 100644 index 00000000..60045903 --- /dev/null +++ b/test_cases/zte-pod1/compute/ssl_vm.yaml @@ -0,0 +1,36 @@ +Scenario: + benchmark: ssl + host: virtualmachine_1, virtualmachine_2 + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'admin-floating_net' + OS_image: 'QTIP_CentOS' + flavor: 'm1.large' + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'admin-floating_net' + OS_image: 'QTIP_CentOS' + flavor: 'm1.large' + role: host + + +Test_Description: + Test_category: "Compute" + Benchmark: "ssl" + Overview: > + '''This test will run the SSL benchmark in parallel on virtualmachine_1 and machine_1.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' diff --git a/test_cases/zte-pod1/compute/whetstone_bm.yaml b/test_cases/zte-pod1/compute/whetstone_bm.yaml new file mode 100644 index 00000000..bf14ea3a --- /dev/null +++ b/test_cases/zte-pod1/compute/whetstone_bm.yaml @@ -0,0 +1,32 @@ + +Scenario: + benchmark: whetstone + host: machine_1, machine_2 + + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.23 + pw: + role: host + machine_2: + ip: 10.20.0.24 + pw: + role: host + Virtual_Machines: + +Test_Description: + Test_category: "Compute" + Benchmark: "whetstone" + Overview: > + ''' This test will run the whetstone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a baremetal machine add the following information under the Virtual_Machine tag + + machine_3: + ip: + pw: + role: + ''' + + diff --git a/test_cases/zte-pod1/compute/whetstone_vm.yaml b/test_cases/zte-pod1/compute/whetstone_vm.yaml new file mode 100644 index 00000000..9f12597f --- /dev/null +++ b/test_cases/zte-pod1/compute/whetstone_vm.yaml @@ -0,0 +1,44 @@ +Scenario: + benchmark: whetstone + host: virtualmachine_1, virtualmachine_1 + server: + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + public_network: 'admin-floating_net' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: compute2 + public_network: 'admin-floating_net' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + +Test_Description: + Test_category: "Compute" + Benchmark: "dhrystone" + Overview: > + '''This test will run the whetstone benchmark in parallel on machine_1 and machine_2.\n + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + virtualmachine_1: + availability_zone: nova + public_network: 'net04_ext' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + virtualmachine_1: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_cases/zte-pod1/network/iperf_bm.yaml b/test_cases/zte-pod1/network/iperf_bm.yaml new file mode 100644 index 00000000..e022d4a4 --- /dev/null +++ b/test_cases/zte-pod1/network/iperf_bm.yaml @@ -0,0 +1,50 @@ +Scenario: + benchmark: iperf + topology: Client and Server on different baremetal Compute nodes + server: machine_1 + client: machine_2 + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 10 + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.23 + pw: + role: 1-server + machine_2: + ip: 10.20.0.24 + pw: + role: 2-host + + Virtual_Machines: + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'net04_ext' + role: 2-host + flavor: m1.large + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/zte-pod1/network/iperf_vm.yaml b/test_cases/zte-pod1/network/iperf_vm.yaml new file mode 100644 index 00000000..57e09e02 --- /dev/null +++ b/test_cases/zte-pod1/network/iperf_vm.yaml @@ -0,0 +1,43 @@ +Scenario: + benchmark: iperf + topology: Client and Server on ONE compute + server : virtualmachine_1 + client: virtualmachine_2 + description: 'Leave the bandwidth as 0 to throttle maximum traffic' + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 0 + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'admin-floating_net' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'admin-floating_net' + role: 2-host + flavor: m1.large + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/zte-pod1/network/iperf_vm_2.yaml b/test_cases/zte-pod1/network/iperf_vm_2.yaml new file mode 100644 index 00000000..c3cd6b35 --- /dev/null +++ b/test_cases/zte-pod1/network/iperf_vm_2.yaml @@ -0,0 +1,45 @@ +Scenario: + benchmark: iperf + topology: Client and Server on two different compute nodes + server : virtualmachine_1 + client: virtualmachine_2 + description: 'Leave the bandwidth as 0 to throttle maximum traffic' + benchmark_details: + duration: 20 + protocol: tcp + bandwidthGbps: 0 + +Context: + Host_Machines: + + + Virtual_Machines: + virtualmachine_1: + availability_zone: compute1 + OS_image: QTIP_CentOS + public_network: 'admin-floating_net' + role: 1-server + flavor: m1.large + + virtualmachine_2: + availability_zone: compute2 + OS_image: QTIP_CentOS + public_network: 'admin-floating_net' + role: 2-host + flavor: m1.large + + +Test_Description: + Test_category: "network" + Benchmark: "iperf" + Overview: > + '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n + same compute node + if you wish to add a host machine add the following information under the Host_Machine tag + + machine_1: + ip: + pw: + role: + ''' + diff --git a/test_cases/zte-pod1/storage/fio_bm.yaml b/test_cases/zte-pod1/storage/fio_bm.yaml new file mode 100644 index 00000000..e940e9ba --- /dev/null +++ b/test_cases/zte-pod1/storage/fio_bm.yaml @@ -0,0 +1,40 @@ +Scenario: + benchmark: fio + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + machine_1: + ip: 10.20.0.23 + pw: + role: host + machine_2: + ip: 10.20.0.24 + pw: + role: host + + + Virtual_Machines: + + + +Test_Description: + Test_category: "Storage" + Benchmark: "FIO" + Overview: > + '''This test will run the FIO benchmark in parallel on host machines "machine_1" and "machine_2".\n + The fio job specifications can be found in qtip/benchmarks/fio_jobs/test_job. + The job conists of an fio load of: + 1.50% rand read 50% rand write + 2.Asynch engine + 3.Direct IO. + 4.Queing depth of 2 + + if you wish to add another machine add the following information under the Host_Machines tag + machine_3: + ip: 172.18.0.16 + pw: Op3nStack + role: host + ''' + diff --git a/test_cases/zte-pod1/storage/fio_vm.yaml b/test_cases/zte-pod1/storage/fio_vm.yaml new file mode 100644 index 00000000..65a1e67b --- /dev/null +++ b/test_cases/zte-pod1/storage/fio_vm.yaml @@ -0,0 +1,45 @@ +Scenario: + benchmark: fio + host: machine_1, machine_2 + server: + +Context: + Host_Machines: + + Virtual_Machines: + virtualmachine_1: + availability_zone: computer1 + public_network: 'admin_floating_net' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + virtualmachine_2: + availability_zone: computer2 + public_network: 'admin-floating_net' + OS_image: QTIP_CentOS + flavor: m1.large + role: host + + +Test_Description: + Test_category: "Storage" + Benchmark: "FIO" + Overview: > + '''This test will run the FIO benchmark in parallel on virtualmachine_1 and virtualmachine_2.\n + The fio job specifications can be found in qtip/benchmarks/fio_jobs/test_job. + The job conists of an fio load of: + 1.50% rand read 50% rand write + 2.Asynch engine + 3.Direct IO. + 4.Queing depth of 2 + + if you wish to add a virtual machine add the following information under the Virtual_Machine tag + + virtualmachine_3: + availability_zone: + public_network: + OS_image: + flavor: + role: + ''' + diff --git a/test_list/compute b/test_list/compute new file mode 100644 index 00000000..7fc76145 --- /dev/null +++ b/test_list/compute @@ -0,0 +1,10 @@ +dhrystone_bm.yaml
+dhrystone_vm.yaml
+whetstone_bm.yaml
+whetstone_vm.yaml
+ramspeed_bm.yaml
+ramspeed_vm.yaml
+dpi_bm.yaml
+dpi_vm.yaml
+ssl_bm.yaml
+ssl_vm.yaml
\ No newline at end of file diff --git a/test_list/network b/test_list/network new file mode 100644 index 00000000..677f2ba4 --- /dev/null +++ b/test_list/network @@ -0,0 +1,3 @@ +iperf_bm.yaml +iperf_vm.yaml +iperf_vm_2.yaml
\ No newline at end of file diff --git a/test_list/storage b/test_list/storage new file mode 100644 index 00000000..c7f53402 --- /dev/null +++ b/test_list/storage @@ -0,0 +1,2 @@ +fio_bm.yaml +fio_vm.yaml
\ No newline at end of file diff --git a/tests/cli_test.py b/tests/cli_test.py new file mode 100644 index 00000000..f12e8fed --- /dev/null +++ b/tests/cli_test.py @@ -0,0 +1,20 @@ +import pytest +from func.cli import cli + + +class TestClass: + @pytest.mark.parametrize("test_input, expected", [ + (['-l', + 'zte', + '-f', + 'compute'], "You have specified a lab that is not present in test_cases"), + (['-l', + 'zte-pod1', + '-f', + 'test'], "Test File Does not exist in test_list") + ]) + def test_cli_error(self, capfd, test_input, expected): + with pytest.raises(SystemExit): + cli(test_input) + resout, reserr = capfd.readouterr() + assert expected in resout diff --git a/tests/create_zones_test.py b/tests/create_zones_test.py new file mode 100644 index 00000000..e431a907 --- /dev/null +++ b/tests/create_zones_test.py @@ -0,0 +1,89 @@ +import pytest +import mock +from mock import Mock, MagicMock +import os +from func.create_zones import create_zones + +return_list = [] + + +def get_agg_mock(host): + agg = Mock() + agg.name = host + agg.id = host + return agg + + +class HyperMock(MagicMock): + def list(self): + mock_hypervisor = [Mock(service={'host': '10.20.0.4'}), Mock(service={'host': '10.20.0.5'})] + return mock_hypervisor + + +class AggMock(MagicMock): + def get_details(self, agg_id): + print "get_detail:{0}".format(agg_id) + return Mock(hosts=[]) + + def create(self, host, agg): + print "create:{0}:{1}".format(host, agg) + return agg + + def list(self): + return return_list + + def delete(self, agg_id): + print "delete:{0}".format(agg_id) + pass + + def add_host(self, aggregate, host): + print "add_host:{0}:{1}".format(aggregate, host) + pass + + def remove_host(self, agg_id, host): + pass + + +class NovaMock(MagicMock): + hypervisors = HyperMock() + aggregates = AggMock() + + +class TestClass: + @pytest.mark.parametrize("test_input, expected", [ + ([[], ['compute1', 'compute2']], + ['create:10.20.0.4:compute1', + 'add_host:compute1:10.20.0.4', + 'create:10.20.0.5:compute2', + 'add_host:compute2:10.20.0.5']), + ([[get_agg_mock('10.20.0.4'), get_agg_mock('10.20.0.5')], ['compute1', 'compute2']], + ['delete:10.20.0.4', + 'create:10.20.0.4:compute1', + 'get_detail:10.20.0.4', + 'add_host:10.20.0.4:10.20.0.4', + 'delete:10.20.0.5', + 'create:10.20.0.5:compute2', + 'get_detail:10.20.0.5', + 'add_host:10.20.0.5:10.20.0.5']), + ([[], ['compute1', 'compute5']], + ['The specified compute node doesnt exist. using compute 1']) + ]) + @mock.patch('func.create_zones.client', autospec=True) + @mock.patch('func.create_zones.v2', autospec=True) + @mock.patch('func.create_zones.session') + def test_create_zones_success(self, mock_keystone_session, mock_keystone_v2, mock_nova_client, test_input, expected, capfd): + global return_list + return_list = test_input[0] + nova_obj = NovaMock() + mock_nova_client.Client.return_value = nova_obj() + k = mock.patch.dict(os.environ, {'OS_AUTH_URL': 'http://172.10.0.5:5000', + 'OS_USERNAME': 'admin', + 'OS_PASSWORD': 'admin', + 'OS_TENANT_NAME': 'admin'}) + k.start() + create = create_zones() + create.create_agg(test_input[1]) + k.stop() + resout, reserr = capfd.readouterr() + for x in expected: + assert x in resout diff --git a/tests/driver_test.py b/tests/driver_test.py new file mode 100644 index 00000000..39adc939 --- /dev/null +++ b/tests/driver_test.py @@ -0,0 +1,65 @@ +import pytest +import mock +import os +import json +from func.driver import Driver + + +class TestClass: + @pytest.mark.parametrize("test_input, expected", [ + (["iperf", + [('host', ['10.20.0.13', '10.20.0.15'])], + "iperf_bm.yaml", + [('duration', 20), ('protocol', 'tcp'), ('bandwidthGbps', 0)], + [("10.20.0.13", [None]), ("10.20.0.15", [None])], + {'http_proxy': 'http://10.20.0.1:8118', + 'https_proxy': 'http://10.20.0.1:8118', + 'no_proxy': 'localhost,127.0.0.1,10.20.*,192.168.*'}, + 'fuel'], + {'Dest_dir': 'results', + 'ip1': '', + 'ip2': '', + 'installer': 'fuel', + 'workingdir': '/home', + 'fname': 'iperf_bm.yaml', + 'username': 'root', + 'http_proxy': 'http://10.20.0.1:8118', + 'https_proxy': 'http://10.20.0.1:8118', + 'no_proxy': 'localhost,127.0.0.1,10.20.*,192.168.*', + 'duration': 20, + 'protocol': 'tcp', + 'bandwidthGbps': 0, + "role": "host"}), + (["iperf", + [('1-server', ['10.20.0.13']), ('2-host', ['10.20.0.15'])], + "iperf_vm.yaml", + [('duration', 20), ('protocol', 'tcp'), ('bandwidthGbps', 0)], + [("10.20.0.13", [None]), ("10.20.0.15", [None])], + {}, + 'joid'], + {'Dest_dir': 'results', + 'ip1': '10.20.0.13', + 'ip2': '', + 'installer': 'joid', + "privateip1": "NONE", + 'workingdir': '/home', + 'fname': 'iperf_vm.yaml', + 'username': 'ubuntu', + 'duration': 20, + 'protocol': 'tcp', + 'bandwidthGbps': 0, + "role": "2-host"}) + ]) + @mock.patch('func.driver.os.system') + def test_driver_success(self, mock_system, test_input, expected): + mock_system.return_value = True + k = mock.patch.dict(os.environ, {'INSTALLER_TYPE': test_input[6], 'PWD': '/home'}) + k.start() + dri = Driver() + dri.drive_bench(test_input[0], test_input[1], test_input[2], test_input[3], test_input[4], test_input[5]) + call = mock_system.call_args + k.stop() + call_args, call_kwargs = call + real_call = call_args[0].split('extra-vars \'')[1] + real_call = real_call[0: len(real_call) - 1] + assert json.loads(real_call) == json.loads(json.dumps(expected)) diff --git a/tests/env_setup_test.py b/tests/env_setup_test.py new file mode 100644 index 00000000..9112ff94 --- /dev/null +++ b/tests/env_setup_test.py @@ -0,0 +1,59 @@ +import pytest +import filecmp +from func.env_setup import Env_setup + + +class TestClass: + + @pytest.mark.parametrize("test_input, expected", [ + ("tests/test_case/bm_with_proxy.yaml", ["dhrystone", + {}, + [], + {'http_proxy': 'http://10.20.0.1:8118', + 'https_proxy': 'http://10.20.0.1:8118', + 'no_proxy': 'localhost,127.0.0.1,10.20.*,192.168.*'}]), + ("tests/test_case/bm_without_proxy.yaml", ["dhrystone", + {}, + [], + {}]), + ("tests/test_case/vm.yaml", ["iperf", + {'availability_zone': ['compute1', 'compute1'], + 'OS_image': ['QTIP_CentOS', 'QTIP_CentOS'], + 'public_network': ['admin-floating_net', 'admin-floating_net'], + 'flavor': ['m1.large', 'm1.large'], + 'role': ['1-server', '2-host']}, + [('duration', 20), ('protocol', 'tcp'), ('bandwidthGbps', 0)], + {'http_proxy': 'http://10.20.0.1:8118', + 'https_proxy': 'http://10.20.0.1:8118', + 'no_proxy': 'localhost,127.0.0.1,10.20.*,192.168.*'}]) + ]) + def test_parse_success(self, test_input, expected): + print (test_input) + print (expected) + test_class = Env_setup() + benchmark, vm_para, details, proxy = \ + test_class.parse(test_input) + assert benchmark == expected[0] + assert vm_para == expected[1] + assert sorted(details) == sorted(expected[2]) + assert proxy == expected[3] + + def test_parse_vm_error(self): + test_class = Env_setup() + with pytest.raises(KeyError) as excinfo: + test_class.parse("tests/test_case/vm_error.yaml") + assert "benchmark" in str(excinfo.value) + + def test_update_ansible(self): + test_class = Env_setup() + test_class.parse("tests/test_case/bm_without_proxy.yaml") + test_class.update_ansible() + result = filecmp.cmp('tests/output/hosts', 'data/hosts') + assert result + + def test_ping(self, capfd): + test_class = Env_setup() + test_class.parse("tests/test_case/bm_ping.yaml") + test_class.call_ping_test() + resout, reserr = capfd.readouterr() + assert '127.0.0.1 is UP' in resout diff --git a/tests/fetchimg_test.py b/tests/fetchimg_test.py new file mode 100644 index 00000000..5d482567 --- /dev/null +++ b/tests/fetchimg_test.py @@ -0,0 +1,34 @@ +import mock +from func.fetchimg import FetchImg + + +class TestClass: + @mock.patch('func.fetchimg.os') + @mock.patch('func.fetchimg.os.path') + def test_fetch_img_success(self, mock_path, mock_os): + mock_os.system.return_value = True + mock_path.isfile.return_value = True + img = FetchImg() + img.download() + + @mock.patch('func.fetchimg.time') + @mock.patch('func.fetchimg.os.system') + @mock.patch('func.fetchimg.os.path') + def test_fetch_img_fail(self, mock_path, mock_system, mock_time): + img = FetchImg() + mock_system.return_value = True + mock_path.isfile.side_effect = [False, False, True] + img.download() + assert mock_time.sleep.call_count == 2 + + @mock.patch('func.fetchimg.time') + @mock.patch('func.fetchimg.os.system') + @mock.patch('func.fetchimg.os.path') + def test_fetch_temp_success(self, mock_path, mock_system, mock_time): + img = FetchImg() + mock_system.return_value = True + mock_path.isfile.side_effect = [True] + img.download() + filepath = './Temp_Img/QTIP_CentOS.qcow2' + imgstorepath = "/home/opnfv/imgstore/QTIP_CentOS.qcow2" + mock_system.assert_called_with("ln -s %s %s" % (imgstorepath, filepath)) diff --git a/tests/output/hosts b/tests/output/hosts new file mode 100644 index 00000000..9b47df0e --- /dev/null +++ b/tests/output/hosts @@ -0,0 +1,3 @@ +[host] +10.20.0.29 +10.20.0.28 diff --git a/tests/schema/test_bm_schema.yaml b/tests/schema/test_bm_schema.yaml new file mode 100644 index 00000000..740725f5 --- /dev/null +++ b/tests/schema/test_bm_schema.yaml @@ -0,0 +1,75 @@ +type: map +mapping: + Scenario: + type: map + mapping: + benchmark: + type: str + required: True + host: + type: str + server: + type: str + allowempty: True + client: + type: str + allowempty: True + topology: + type: str + allowempty: True + benchmark_details: + type: map + mapping: + duration: + type: int + protocol: + type: str + bandwidthGbps: + type: int + description: + type: str + 1Run: + type: str + + Context: + type: map + mapping: + Host_Machines: + type: map + required: True + mapping: + regex;(^machine): + type: map + mapping: + role: + type: str + ip: + type: str + pw: + type: str + allowempty: True + Virtual_Machines: + type: map + allowempty: True + Proxy_Environment: + type: map + mapping: + http_proxy: + type: str + https_proxy: + type: str + no_proxy: + type: str + + Test_Description: + type: map + mapping: + Test_category: + type: str + allowempty: True + Benchmark: + type: str + allowempty: True + Overview: + type: str + allowempty: True diff --git a/tests/schema/test_vm_schema.yaml b/tests/schema/test_vm_schema.yaml new file mode 100644 index 00000000..524f8fe4 --- /dev/null +++ b/tests/schema/test_vm_schema.yaml @@ -0,0 +1,80 @@ +type: map +mapping: + Scenario: + type: map + mapping: + benchmark: + type: str + required: True + host: + type: str + server: + type: str + allowempty: True + 1Run: + type: str + client: + type: str + allowempty: True + topology: + type: str + allowempty: True + benchmark_details: + type: map + mapping: + duration: + type: int + protocol: + type: str + bandwidthGbps: + type: int + teststream: + type: str + description: + type: str + + Context: + type: map + mapping: + Host_Machines: + type: map + allowempty: True + Virtual_Machines: + type: map + required: True + mapping: + regex;(^virtualmachine): + type: map + mapping: + availability_zone: + type: str + OS_image: + type: str + public_network: + type: str + role: + type: str + flavor: + type: str + Proxy_Environment: + type: map + mapping: + http_proxy: + type: str + https_proxy: + type: str + no_proxy: + type: str + + Test_Description: + type: map + mapping: + Test_category: + type: str + allowempty: True + Benchmark: + type: str + allowempty: True + Overview: + type: str + allowempty: True diff --git a/tests/spawn_vm_test.py b/tests/spawn_vm_test.py new file mode 100644 index 00000000..eb843ad9 --- /dev/null +++ b/tests/spawn_vm_test.py @@ -0,0 +1,71 @@ +import pytest +import mock +from mock import Mock, MagicMock +import os +from func.spawn_vm import SpawnVM + + +class KeystoneMock(MagicMock): + auth_token = Mock() + v2_0 = Mock() + + +class ImageMock(MagicMock): + name = 'QTIP_CentOS' + + +class ImagesMock(MagicMock): + def list(self): + return [ImageMock()] + + +class StackMock(MagicMock): + status = 'COMPLETE' + outputs = [{'output_key': 'availability_instance_1', + 'output_value': 'output_value_1'}, + {'output_key': 'instance_ip_1', + "output_value": "172.10.0.154"}, + {"output_key": "instance_PIP_1", + "output_value": "10.10.17.5"}, + {'output_key': 'KeyPair_PublicKey', + "output_value": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpwIBAAKCAQEAqCiHcrLBXtxG0LhnKndU7VIVpYxORmv0d4tvujkWOkYuagiW\nU/MTRk0zhRvFQDVPEs0Jrj/BIecqm6fjjT6dZ/H7JLYGaqJitRkoupKgBsMSIqUz\nrR0ekOlfXZ6N+Ud8k6s+qjc7BO4b1ezz78jHisC5o0GCkUV0ECx64Re1fO+oKs1c\nfL9aaexahJUYN3J48pazQz+imc2x/G9nuqHX3cqEszmxnT4jwv//In1GjHy2AyXw\n1oA5F6wZoQCSrXc2BditU+1tlVhEkPFt5JgiHUpY8T8mYbroT7JH6xjcGSKUN+HG\nN8PXNUTD1VAQfwHpkfsGMfDyzjytCXsoTEOqnwIDAQABAoIBAAEL/4vfQQTuKiKy\ngzHofEbd8/SL4xDdKzBzVca7BEBon3FZjFYJdV1CrcduXNQBgPSFAkJrczBa2BEQ\nAoKmmSREhWO9Hl0blbG67l36+7QPEtXUYXX6cG5Ghal3izq6DzR8JG+62Es3kETM\nrNgZT+S1PnKdvcpZvFc9b6ZnF2InuTbrmNVBZKrhdWOJ5tCwRGKKUl6BHoJH3yu0\nT5hUW277e1LYHx+hZtoZ98ToC+LGe6/M8a8y6VLYpcQlX2AtVXeGDalomunF+p3f\nuY6din6s4lq1gSJz03PTpUbwiuhYCTe8Xkseu74Y+XYYJXPHopFju0Ewd6p0Db9Q\nJzzxCoECggCBAM2ox9zyrDc/Vlc0bb9SciFGUd/nEJF89+UHy98bAkpo22zNZIDg\nfacSgkg/6faZD+KrOU0I5W7m2B5t6w2fNHHik6NYGSLQ1JhgbXELGV7X/qECDL02\nctPaf+8o+dYoZja2LdJNASq2nmEmPI3LSHhzAt4dWY4W+geXiHt4iWVHAoIAgQDR\nUdN09xv4U+stWqNcSfgjtx6boEUE8Ky7pyj+LrZKG0L61Jy9cSDP0x0rCtkW9vVR\n6RjidWM/DHQ5cl6aq+7pPy20/OqtqttFYT4R+C3AoAnRSaNzPD9a80C2gjv7WEz0\nPPFstWkI1gsN71KKRx7e6NIa9CNn5x9iE+SGfjgb6QKCAIBXylzG7LCnRNpOj4rp\nyP//RE1fDvv7nyUTF6jnrFfl+6zvXR4yBaKd10DWJrJxGhW15PGo+Ms39EL9el6E\nihmRI+9yIwFX411dToxpXRuPaRTBFmbpvnx2Ayfpp8w+pzA62rnktApzeVFSl0fy\nH3zoLfBjcJPyG8zPwNf6HRJJsQKCAIAE2S5asTaWo+r4m/bYtmXm/eDZnfa7TI/T\nsOWELbTPNp5wjOgsgyhNaAhu7MtmesXn5cxLwohP94vhoMKMNptMD8iRPqJ471Iw\n4zW62NLGeW6AyIHes3CMPMIs+AtHoR33MkotSG5sY/jRk8+HoGoYo6/qK+l+CJ5z\neR579wR5sQKCAIAvPWq+bvcPTDKUU1Fe/Y/GyWoUA+uSqmCdORBkK38lALFGphxj\nfDz9dXskimqW+A9hOPOS8dm8YcVvi/TLXVE5Vsx9VkOg6z6AZBQpgNXGfOgpju4W\nbjER7bQaASatuWQyCxbA9oNlAUdSeOhGTxeFLkLj7hNMd6tLjfd8w7A/hA==\n-----END RSA PRIVATE KEY-----\n"}] + + +class HeatMock(MagicMock): + def list(self): + return [] + + def get(self, stackname): + return StackMock() + + def create(self, stack_name, template): + pass + + +class TestClass: + @pytest.mark.parametrize("test_input, expected", [ + ({'availability_zone': ['compute1', 'compute1'], + 'OS_image': ['QTIP_CentOS', 'QTIP_CentOS'], + 'public_network': ['admin-floating_net', 'admin-floating_net'], + 'flavor': ['m1.large', 'm1.large'], + 'role': ['1-server', '2-host']}, + [('172.10.0.154', '')]), + ]) + @mock.patch('func.spawn_vm.Env_setup') + @mock.patch('func.spawn_vm.FetchImg') + @mock.patch('func.spawn_vm.create_zones') + @mock.patch('func.spawn_vm.client', autospec=True) + @mock.patch('func.spawn_vm.glanceclient', autospec=True) + @mock.patch('func.spawn_vm.keystoneclient.v2_0', autospec=True) + @mock.patch('func.spawn_vm.heatclient.client', autospec=True) + def test_create_zones_success(self, mock_heat, mock_keystone, mock_glance, + mock_nova_client, mock_zone, mock_fetch, + mock_setup, test_input, expected): + mock_glance.Client.return_value = Mock(images=ImagesMock()) + mock_nova_client.Client.return_value = Mock() + mock_heat.Client.return_value = Mock(stacks=HeatMock()) + k = mock.patch.dict(os.environ, {'INSTALLER_TYPE': 'fuel'}) + k.start() + SpawnVM(test_input) + k.stop() + mock_setup.ip_pw_list.append.assert_called_with(expected[0]) diff --git a/tests/test_case/bm_ping.yaml b/tests/test_case/bm_ping.yaml new file mode 100644 index 00000000..41d696e2 --- /dev/null +++ b/tests/test_case/bm_ping.yaml @@ -0,0 +1,29 @@ +
+Scenario:
+ benchmark: dhrystone
+ host: machine_1
+ server:
+
+Context:
+ Host_Machines:
+ machine_1:
+ ip: 127.0.0.1
+ pw:
+ role: host
+
+ Virtual_Machines:
+
+
+Test_Description:
+ Test_category: "Compute"
+ Benchmark: "dhrystone"
+ Overview: >
+ ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n
+ if you wish to add a virtual machine add the following information under the Virtual_Machine tag
+
+ virtualmachine_1:
+ availability_zone:
+ public_network:
+ OS_image:
+ flavor:
+ role: '''
diff --git a/tests/test_case/bm_with_proxy.yaml b/tests/test_case/bm_with_proxy.yaml new file mode 100644 index 00000000..1d73300b --- /dev/null +++ b/tests/test_case/bm_with_proxy.yaml @@ -0,0 +1,39 @@ +
+Scenario:
+ benchmark: dhrystone
+ host: machine_1, machine_2
+ server:
+
+Context:
+ Host_Machines:
+ machine_1:
+ ip: 10.20.0.28
+ pw:
+ role: host
+ machine_2:
+ ip: 10.20.0.29
+ pw:
+ role: host
+
+ Virtual_Machines:
+
+ Proxy_Environment:
+ http_proxy: http://10.20.0.1:8118
+ https_proxy: http://10.20.0.1:8118
+ no_proxy: localhost,127.0.0.1,10.20.*,192.168.*
+
+
+
+Test_Description:
+ Test_category: "Compute"
+ Benchmark: "dhrystone"
+ Overview: >
+ ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n
+ if you wish to add a virtual machine add the following information under the Virtual_Machine tag
+
+ virtualmachine_1:
+ availability_zone:
+ public_network:
+ OS_image:
+ flavor:
+ role: '''
diff --git a/tests/test_case/bm_without_proxy.yaml b/tests/test_case/bm_without_proxy.yaml new file mode 100644 index 00000000..a9ae3b71 --- /dev/null +++ b/tests/test_case/bm_without_proxy.yaml @@ -0,0 +1,33 @@ +
+Scenario:
+ benchmark: dhrystone
+ host: machine_1, machine_2
+ server:
+
+Context:
+ Host_Machines:
+ machine_1:
+ ip: 10.20.0.28
+ pw:
+ role: host
+ machine_2:
+ ip: 10.20.0.29
+ pw:
+ role: host
+
+ Virtual_Machines:
+
+
+Test_Description:
+ Test_category: "Compute"
+ Benchmark: "dhrystone"
+ Overview: >
+ ''' This test will run the dhrystone benchmark in parallel on machine_1 and machine_2.\n
+ if you wish to add a virtual machine add the following information under the Virtual_Machine tag
+
+ virtualmachine_1:
+ availability_zone:
+ public_network:
+ OS_image:
+ flavor:
+ role: '''
diff --git a/tests/test_case/vm.yaml b/tests/test_case/vm.yaml new file mode 100644 index 00000000..4c8453ca --- /dev/null +++ b/tests/test_case/vm.yaml @@ -0,0 +1,48 @@ +Scenario:
+ benchmark: iperf
+ topology: Client and Server on ONE compute
+ server : virtualmachine_1
+ client: virtualmachine_2
+ description: 'Leave the bandwidth as 0 to throttle maximum traffic'
+ benchmark_details:
+ duration: 20
+ protocol: tcp
+ bandwidthGbps: 0
+
+Context:
+ Host_Machines:
+
+ Virtual_Machines:
+ virtualmachine_1:
+ availability_zone: compute1
+ OS_image: QTIP_CentOS
+ public_network: 'admin-floating_net'
+ role: 1-server
+ flavor: m1.large
+
+ virtualmachine_2:
+ availability_zone: compute1
+ OS_image: QTIP_CentOS
+ public_network: 'admin-floating_net'
+ role: 2-host
+ flavor: m1.large
+
+ Proxy_Environment:
+ http_proxy: http://10.20.0.1:8118
+ https_proxy: http://10.20.0.1:8118
+ no_proxy: localhost,127.0.0.1,10.20.*,192.168.*
+
+Test_Description:
+ Test_category: "network"
+ Benchmark: "iperf"
+ Overview: >
+ '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n
+ same compute node
+ if you wish to add a host machine add the following information under the Host_Machine tag
+
+ machine_1:
+ ip:
+ pw:
+ role:
+ '''
+
diff --git a/tests/test_case/vm_error.yaml b/tests/test_case/vm_error.yaml new file mode 100644 index 00000000..f13d3a00 --- /dev/null +++ b/tests/test_case/vm_error.yaml @@ -0,0 +1,42 @@ +Scenario:
+ topology: Client and Server on ONE compute
+ server : virtualmachine_1
+ client: virtualmachine_2
+ description: 'Leave the bandwidth as 0 to throttle maximum traffic'
+ benchmark_details:
+ duration: 20
+ protocol: tcp
+ bandwidthGbps: 0
+
+Context:
+ Host_Machines:
+
+ Virtual_Machines:
+ virtualmachine_1:
+ availability_zone: compute1
+ OS_image: QTIP_CentOS
+ public_network: 'admin-floating_net'
+ role: 1-server
+ flavor: m1.large
+
+ virtualmachine_2:
+ availability_zone: compute1
+ OS_image: QTIP_CentOS
+ public_network: 'admin-floating_net'
+ role: 2-host
+ flavor: m1.large
+
+Test_Description:
+ Test_category: "network"
+ Benchmark: "iperf"
+ Overview: >
+ '''This test will run the IPERF benchmark on virutalmachine_1 and virtualmachine_2. On the\n
+ same compute node
+ if you wish to add a host machine add the following information under the Host_Machine tag
+
+ machine_1:
+ ip:
+ pw:
+ role:
+ '''
+
diff --git a/tests/yaml_schema_test.py b/tests/yaml_schema_test.py new file mode 100644 index 00000000..a975dca6 --- /dev/null +++ b/tests/yaml_schema_test.py @@ -0,0 +1,16 @@ +import os +import os.path +from pykwalify.core import Core + + +class TestClass: + def test_schema_success(self): + for root, dirs, files in os.walk("test_cases"): + for name in files: + print root + "/" + name + if "_bm" in name: + schema = "tests/schema/test_bm_schema.yaml" + if "_vm" in name: + schema = "tests/schema/test_vm_schema.yaml" + c = Core(source_file=root + "/" + name, schema_files=[schema]) + c.validate(raise_exception=True) diff --git a/tox.ini b/tox.ini new file mode 100644 index 00000000..d955416c --- /dev/null +++ b/tox.ini @@ -0,0 +1,32 @@ +# Tox (http://tox.testrun.org/) is a tool for running tests +# in multiple virtualenvs. This configuration file will run the +# test suite on all supported python versions. To use it, "pip install tox" +# and then run "tox" from this directory. + +[tox] +envlist = py27 +skipsdist = True + +[testenv] +usedevelop = True +install_command = pip install -U {opts} {packages} +deps = + -r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt +commands= + py.test \ + --basetemp={envtmpdir} \ + {posargs} tests + +[testenv:pep8] +deps = flake8 +commands = flake8 {toxinidir} + +[flake8] +# H803 skipped on purpose per list discussion. +# E123, E125 skipped as they are invalid PEP-8. + +show-source = True +ignore = E123,E125,H803,E501 +builtins = _ +exclude=.venv,.git,.tox,dist,doc,build |