aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docker/Dockerfile10
-rw-r--r--docker/supervisord.conf13
-rw-r--r--docs/configguide/configuration.rst60
-rw-r--r--docs/userguide/introduction.rst72
-rw-r--r--func/args_handler.py8
-rw-r--r--func/cli.py28
-rw-r--r--restful_server/qtip_server.py8
-rwxr-xr-xscripts/qtip_creds.sh2
-rw-r--r--supporting/servers/roles/ssh/defaults/main.yml1
-rw-r--r--supporting/servers/roles/ssh/files/zhifeng.authorized_keys1
-rw-r--r--test_list/compute16
-rw-r--r--test_list/network9
-rw-r--r--test_list/storage8
-rw-r--r--tests/cli_test.py2
14 files changed, 106 insertions, 132 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 05286b09..204400cc 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -35,6 +35,7 @@ libjpeg62-dev \
zlib1g-dev \
python-tk \
curl \
+supervisor \
--no-install-recommends
RUN apt-add-repository ppa:ansible/ansible -y
@@ -60,4 +61,11 @@ RUN git clone https://gerrit.opnfv.org/gerrit/releng $REPOS_DIR/releng
RUN pip install -r $REPOS_DIR/qtip/requirements.txt
-CMD cd $REPOS_DIR/qtip && python restful_server/qtip_server.py>$HOME/qtip/logs/run.log
+#Config supervisor
+
+RUN mkdir -p /var/log/supervisor
+RUN locale-gen en_US en_US.UTF-8
+COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
+
+
+CMD ["/usr/bin/supervisord"]
diff --git a/docker/supervisord.conf b/docker/supervisord.conf
new file mode 100644
index 00000000..35d16c7e
--- /dev/null
+++ b/docker/supervisord.conf
@@ -0,0 +1,13 @@
+[supervisord]
+nodaemon=true
+
+[program:qtip_server]
+command=bash -c "cd $REPOS_DIR/qtip&&python restful_server/qtip_server.py"
+numprocs=1
+autostart=true
+autorestart=true
+user=root
+environment=INSTALLER_TYPE="%(ENV_INSTALLER_TYPE)s",INSTALLER_IP="%(ENV_INSTALLER_IP)s",NODE_NAME="%(ENV_NODE_NAME)s"
+stdout_logfile=/var/log/supervisor/%(program_name)s.log
+stderr_logfile=/var/log/supervisor/%(program_name)s.log
+
diff --git a/docs/configguide/configuration.rst b/docs/configguide/configuration.rst
index e5228541..d6d2fd5d 100644
--- a/docs/configguide/configuration.rst
+++ b/docs/configguide/configuration.rst
@@ -7,39 +7,14 @@
Configuration
*************
-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.
+QTIP currently supports by using a Docker image. Detailed steps
+about setting up QTIP 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. Add a brief introduction
to configure OPNFV with this specific installer
-Pre-configuration activities
-----------------------------
-
-
-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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -47,18 +22,25 @@ QTIP has a Docker images on the docker hub. Pulling opnfv/qtip docker image
from docker hub:
::
- sudo docker pull opnfv/qtip
+ 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
+ docker images
-Run the Docker instance:
+Make dir to store the QTIP image which will be used to create vm in cloud.
::
- docker run -it opnfv/qtip /bin/bash
+ mkdir $HOME/imgstore
+
+Run and enter the Docker instance:
+::
+ envs="INSTALLER_TYPE={INSTALLER_TYPE} -e INSTALLER_IP={INSTALLER_IP}
+-e NODE_NAME={NODE_NAME}"
+ docker run --name qtip -id -e $envs -v "$HOME/imgstore:/home/opnfv/imgstore" opnfv/qtip
+ docker exec -i -t qtip /bin/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.
@@ -79,22 +61,22 @@ 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 scripts/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}"
+environment variables.
QTIP default key pair
""""""""""""""""""""""
-QTIP uses a SSH key pair to connect to the guest image. This key pair can
-be found in the ``config/`` directory.
+QTIP uses a SSH key pair to connect to the guest image. You should generate key pair
+before running QTIP test. And put key pair in the ``config/`` directory.
+::
+
+ ssh-keygen -t rsa -N "" -f config/QtipKey -q
+
Hardware configuration
diff --git a/docs/userguide/introduction.rst b/docs/userguide/introduction.rst
index 7a202a45..4876d0e2 100644
--- a/docs/userguide/introduction.rst
+++ b/docs/userguide/introduction.rst
@@ -9,16 +9,16 @@ Introduction
************
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.
+run QTIP the first time when the user pull QTIP image on to their host machine.
+In order to install and config QTIP please follow the instructions in the
+configuration.rst located in docs/configguide/configuration.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/`.
+ the end user are `test_cases/` and `benchmarks/suite/`.
**test_cases/:**
@@ -58,7 +58,7 @@ distinguishes between a test to be run on the Virtual Machine or the compute
node itself, respectively.
-**test_list/:**
+**benchmarks/suite/:**
This folder contains three files, namely `compute`, `network` and `storage`.
These files list the benchmarks are to be run by the QTIP framework. Sample
@@ -132,11 +132,13 @@ 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.
+ to specify the IP of the particular compute node.The `ip:` tag can be left
+ blank when installer type is 'fuel',because QTIP will get ip
+ from installer. 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.
::
@@ -312,71 +314,67 @@ Sample dhrystone_vm.yaml file:
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>):
+In order to start QTIP on the default lab please use the following commands (asssuming your installer
+is 'fuel' or 'compass', you use the config files in the test_cases/default/ directory and listed the
+intended suite in the benchmarks/suite/<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
+First step is to export the necessary information to the environment and generate QTIP key pair.
+Please follow the instructions in the configuration.rst.
-This will generate the `opnfv-creds.sh` file needed to use the python clients for keystone, glance, nova, and neutron.
+Secondary step download the QTIP image and upload it to the Cloud.QTIP will use this image
+to create VM when test VM performance.
::
- source opnfv-creds.sh
+ source docker/prepare_qtip_image.sh
-Running QTIP on the using `default` as the pod name and for the `compute` suite by cli
+Running QTIP on the using `default` as the pod name and for the `compute` suite by cli.
::
python qtip.py -l default -f compute
-Running QTIP on the using 'default' as the pod name and for the 'compute' suite 'bm' type by restful api
+Running QTIP on the using 'default' as the pod name and for the 'compute' suite 'bm' type by restful api.
::
- curl --trace-ascii debug.txt -X POST -d '{ "installer_ip": "10.20.6.2","installer_type":"fuel", "suite_name":"compute", "type": "BM"}' -H "Content-Type: application/json" http://qtip_server_ip:5000/api/v1.0/jobs
+ curl --trace-ascii debug.txt -X POST -d '{ "installer_ip": "10.20.6.2","installer_type":"fuel", "suite_name":"compute", "type": "BM"}' -H "Content-Type: application/json" http://127.0.0.1:5000/api/v1.0/jobs
-Running QTIP on the using 'default' as the pod name and for the 'compute' suite 'vm' type by restful api
+Running QTIP on the using 'default' as the pod name and for the 'compute' suite 'vm' type by restful api.
::
- curl --trace-ascii debug.txt -X POST -d '{ "installer_ip": "10.20.6.2","installer_type":"fuel", "suite_name":"compute", "type": "VM"}' -H "Content-Type: application/json" http://qtip_server_ip:5000/api/v1.0/jobs
+ curl --trace-ascii debug.txt -X POST -d '{ "installer_ip": "10.20.6.2","installer_type":"fuel", "suite_name":"compute", "type": "VM"}' -H "Content-Type: application/json" http://127.0.0.1:5000/api/v1.0/jobs
-Running QTIP on the using `default` as the pod name and for the `network` suite by cli
+Running QTIP on the using `default` as the pod name and for the `network` suite by cli.
::
python qtip.py -l default -f network
-Running QTIP on the using 'default' as the pod name and for the 'network' suite 'bm' type by restful api
+Running QTIP on the using 'default' as the pod name and for the 'network' suite 'bm' type by restful api.
::
- curl --trace-ascii debug.txt -X POST -d '{ "installer_ip": "10.20.6.2","installer_type":"fuel", "suite_name":"network", "type": "BM"}' -H "Content-Type: application/json" http://qtip_server_ip:5000/api/v1.0/jobs
+ curl --trace-ascii debug.txt -X POST -d '{ "installer_ip": "10.20.6.2","installer_type":"fuel", "suite_name":"network", "type": "BM"}' -H "Content-Type: application/json" http://127.0.0.1:5000/api/v1.0/jobs
-Running QTIP on the using `default` as the pod name and for the `storage` suite by cli
+Running QTIP on the using `default` as the pod name and for the `storage` suite by cli.
::
python qtip.py -l default -f network
-Running QTIP on the using 'default' as the pod name and for the 'storage' suite 'bm' type by restful api
+Running QTIP on the using 'default' as the pod name and for the 'storage' suite 'bm' type by restful api.
::
- curl --trace-ascii debug.txt -X POST -d '{ "installer_ip": "10.20.6.2","installer_type":"fuel", "suite_name":"storage", "type": "BM"}' -H "Content-Type: application/json" http://qtip_server_ip:5000/api/v1.0/jobs
+ curl --trace-ascii debug.txt -X POST -d '{ "installer_ip": "10.20.6.2","installer_type":"fuel", "suite_name":"storage", "type": "BM"}' -H "Content-Type: application/json" http://127.0.0.1:5000/api/v1.0/jobs
Get running QTIP job status by restful api
::
- curl --trace-ascii debug.txt -X GET http://qtip_server_ip:5000/api/v1.0/jobs/job-id
+ curl --trace-ascii debug.txt -X GET http://127.0.0.1:5000/api/v1.0/jobs/job-id
For example:
- curl --trace-ascii debug.txt -X GET http://172.37.0.3:5000/api/v1.0/jobs/5b71f035-3fd6-425c-9cc7-86acd3a04214
+ curl --trace-ascii debug.txt -X GET http://127.0.0.1:5000/api/v1.0/jobs/5b71f035-3fd6-425c-9cc7-86acd3a04214
Stop running QTIP job by restful api.The job will finish the current benchmark test and stop.
::
- curl --trace-ascii debug.txt -X DELTET http://qtip_server_ip:5000/api/v1.0/jobs/job-id
+ curl --trace-ascii debug.txt -X DELTET http://127.0.0.1:5000/api/v1.0/jobs/job-id
For example:
- curl --trace-ascii debug.txt -X DELETE http://172.37.0.3:5000/api/v1.0/jobs/5b71f035-3fd6-425c-9cc7-86acd3a04214q
+ curl --trace-ascii debug.txt -X DELETE http://127.0.0.1:5000/api/v1.0/jobs/5b71f035-3fd6-425c-9cc7-86acd3a04214q
Results:
--------
diff --git a/func/args_handler.py b/func/args_handler.py
index 582a24b1..624f90c4 100644
--- a/func/args_handler.py
+++ b/func/args_handler.py
@@ -14,8 +14,8 @@ from func.spawn_vm import SpawnVM
from func.driver import Driver
-def get_files_in_test_list(suite_name, case_type='all'):
- benchmark_list = json.load(file('test_list/{0}'.format(suite_name)))
+def get_files_in_suite(suite_name, case_type='all'):
+ benchmark_list = json.load(file('benchmarks/suite/{0}'.format(suite_name)))
return reduce(add, benchmark_list.values()) \
if case_type == 'all' else benchmark_list[case_type]
@@ -30,8 +30,8 @@ def get_benchmark_path(lab, suit, benchmark):
return './test_cases/{0}/{1}/{2}'.format(lab, suit, benchmark)
-def check_suite_in_test_list(suite_name):
- return True if os.path.isfile('test_list/' + suite_name) else False
+def check_suite(suite_name):
+ return True if os.path.isfile('benchmarks/suite/' + suite_name) else False
def check_lab_name(lab_name):
diff --git a/func/cli.py b/func/cli.py
index d914a2de..c5f5d2b7 100644
--- a/func/cli.py
+++ b/func/cli.py
@@ -11,6 +11,9 @@ import sys
import os
import args_handler
import argparse
+from utils import logger_utils
+
+logger = logger_utils.QtipLogger('cli').get
class Cli:
@@ -26,40 +29,41 @@ class Cli:
' The user should list default after -l . all the fields in'
' the files are necessary and should be filled')
parser.add_argument('-f', '--file', required=True, help='File in '
- 'test_list with the list of tests. there are three files'
+ 'benchmarks/suite/ 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')
parser.add_argument('-b', '--benchmark', help='Name of the benchmark.'
- 'Can be found in test_lists/file_name')
+ 'Can be found in benchmarks/suite/file_name')
return parser.parse_args(args)
def __init__(self, args=sys.argv[1:]):
args = self._parse_args(args)
- if not args_handler.check_suite_in_test_list(args.file):
- print('\n\n ERROR: Test File Does not exist in test_list/ please enter correct file \n\n')
+ if not args_handler.check_suite(args.file):
+ logger.error("ERROR: This suite file doesn't exist under benchmarks/suite/.\
+ Please enter correct file." % str(args.file))
sys.exit(1)
if not args_handler.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')
+ logger.error("You have specified a lab that is not present under test_cases/.\
+ Please enter correct file. If unsure how to proceed, use -l default.")
sys.exit(1)
suite = args.file
- benchmarks = args_handler.get_files_in_test_list(suite)
+ benchmarks = args_handler.get_files_in_suite(suite)
test_cases = args_handler.get_files_in_test_case(args.lab, suite)
benchmarks_list = filter(lambda x: x in test_cases, benchmarks)
if args.benchmark:
if not args_handler.check_benchmark_name(args.lab, args.file, args.benchmark):
- print('\n\n You have specified an incorrect benchmark. Please'
- 'enter the correct one.\n\n')
+ logger.error("You have specified an incorrect benchmark.\
+ Please enter the correct one.")
sys.exit(1)
else:
- print("Starting with " + args.benchmark)
+ logger.info("Starting with " + args.benchmark)
args_handler.prepare_and_run_benchmark(
os.environ['INSTALLER_TYPE'], os.environ['PWD'],
args_handler.get_benchmark_path(args.lab.lower(), args.file, args.benchmark))
@@ -68,5 +72,5 @@ class Cli:
os.environ['INSTALLER_TYPE'], os.environ['PWD'],
args_handler.get_benchmark_path(args.lab.lower(), suite, x)), benchmarks_list)
- print('{0} is not a Template in the Directory Enter a Valid file name.'
- 'or use qtip.py -h for list'.format(filter(lambda x: x not in test_cases, benchmarks)))
+ logger.info("{0} is not a Template in the Directory Enter a Valid file name.\
+ or use qtip.py -h for list".format(filter(lambda x: x not in test_cases, benchmarks)))
diff --git a/restful_server/qtip_server.py b/restful_server/qtip_server.py
index d9dc52ad..7b55020a 100644
--- a/restful_server/qtip_server.py
+++ b/restful_server/qtip_server.py
@@ -146,8 +146,8 @@ default is all benchmarks in suite with specified type,
help='testdb_url should be test db http url,for example http://testresults.opnfv.org/test/api/v1')
parser.add_argument('node_name', type=str, required=False, default=None, help='node_name should be string')
args = parser.parse_args()
- if not args_handler.check_suite_in_test_list(args["suite_name"]):
- return abort(404, 'message:Test suite {0} does not exist in test_list'.format(args["suite_name"]))
+ if not args_handler.check_suite(args["suite_name"]):
+ return abort(404, 'message:Test suite {0} does not exist under benchmarks/suite'.format(args["suite_name"]))
if not args_handler.check_lab_name(args["pod_name"]):
return abort(404, 'message: You have specified a lab {0}\
that is not present in test_cases'.format(args['pod_name']))
@@ -156,8 +156,8 @@ default is all benchmarks in suite with specified type,
if not job_id:
return abort(409, 'message:It already has one job running now!')
- benchmarks = args_handler.get_files_in_test_list(args["suite_name"],
- args["type"].lower())
+ benchmarks = args_handler.get_files_in_suite(args["suite_name"],
+ args["type"].lower())
test_cases = args_handler.get_files_in_test_case(args["pod_name"],
args["suite_name"],
args["type"].lower())
diff --git a/scripts/qtip_creds.sh b/scripts/qtip_creds.sh
index 94d9133c..af051ac5 100755
--- a/scripts/qtip_creds.sh
+++ b/scripts/qtip_creds.sh
@@ -1,4 +1,4 @@
-! /bin/bash
+#! /bin/bash
DEST_IP=$1
echo $INSTALLER_TYPE
diff --git a/supporting/servers/roles/ssh/defaults/main.yml b/supporting/servers/roles/ssh/defaults/main.yml
index 59dfd086..41ee9853 100644
--- a/supporting/servers/roles/ssh/defaults/main.yml
+++ b/supporting/servers/roles/ssh/defaults/main.yml
@@ -3,3 +3,4 @@ users:
- { name: yujunz, comment: "Yujun Zhang <zhang.yujunz@zte.com.cn>" }
- { name: taseer, comment: "Taseer Ahmed <taseer94@gmail.com>" }
- { name: serena, comment: "Serena Feng <feng.xiaowei@zte.com.cn>" }
+ - { name: zhifeng, comment: "Zhifeng Jiang<jiang.zhifeng@zte.com.cn>" }
diff --git a/supporting/servers/roles/ssh/files/zhifeng.authorized_keys b/supporting/servers/roles/ssh/files/zhifeng.authorized_keys
new file mode 100644
index 00000000..195cfdca
--- /dev/null
+++ b/supporting/servers/roles/ssh/files/zhifeng.authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuck9a5uUXLtzlTaCYhwcLDffFH8o5ldhU4iKr0D4KaXlFfUsKD7VyHN+Zck3HBWTB4U7X9FEeFINtp2v2aoY8n74TS4LUGT8yqRYLyvsh2LgrhE4ouRvYgWlrZGice2x6ZZrcGM4uoGTC/lUHEvMDGDkDxUCfhxlFWcrplCUMcgd1V/5U14s0ufDgLGyEhXWWXFW4pNoqKBEGZNChBSvnq+NvOD7I4jgStUm9REooOp/VPpubH/6mSvDSTokCvrgWSCaNpcDqLCUjhwpoT/D1oFzEd4jBfPSV3jva+eAKPE2r/dnudQR5NR8T/eUz25YRGeJfrjDP6cMgXJoG43IXQ== root@fuel.domain.tld
diff --git a/test_list/compute b/test_list/compute
deleted file mode 100644
index 3bf1b184..00000000
--- a/test_list/compute
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "bm": [
- "dhrystone_bm.yaml",
- "whetstone_bm.yaml",
- "ramspeed_bm.yaml",
- "dpi_bm.yaml",
- "ssl_bm.yaml"
- ],
- "vm": [
- "dhrystone_vm.yaml",
- "whetstone_vm.yaml",
- "ramspeed_vm.yaml",
- "dpi_vm.yaml",
- "ssl_vm.yaml"
- ]
-}
diff --git a/test_list/network b/test_list/network
deleted file mode 100644
index 58ce5cb9..00000000
--- a/test_list/network
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "bm": [
- "iperf_bm.yaml"
- ],
- "vm": [
- "iperf_vm.yaml",
- "iperf_vm_2.yaml"
- ]
-}
diff --git a/test_list/storage b/test_list/storage
deleted file mode 100644
index f3068dd5..00000000
--- a/test_list/storage
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "bm": [
- "fio_bm.yaml"
- ],
- "vm": [
- "fio_vm.yaml"
- ]
-}
diff --git a/tests/cli_test.py b/tests/cli_test.py
index 43a11089..e47d99ad 100644
--- a/tests/cli_test.py
+++ b/tests/cli_test.py
@@ -13,7 +13,7 @@ class TestClass:
(['-l',
'default',
'-f',
- 'test'], "Test File Does not exist in test_list")
+ 'test'], "This suite file doesn't exist under benchmarks/suite/")
])
def test_cli_error(self, capfd, test_input, expected):
k = mock.patch.dict(os.environ, {'INSTALLER_TYPE': 'fuel', 'PWD': '/home'})