diff options
-rw-r--r-- | docker/Dockerfile | 10 | ||||
-rw-r--r-- | docker/supervisord.conf | 13 | ||||
-rw-r--r-- | docs/configguide/configuration.rst | 60 | ||||
-rw-r--r-- | docs/userguide/introduction.rst | 72 | ||||
-rw-r--r-- | func/args_handler.py | 8 | ||||
-rw-r--r-- | func/cli.py | 28 | ||||
-rw-r--r-- | restful_server/qtip_server.py | 8 | ||||
-rwxr-xr-x | scripts/qtip_creds.sh | 2 | ||||
-rw-r--r-- | supporting/servers/roles/ssh/defaults/main.yml | 1 | ||||
-rw-r--r-- | supporting/servers/roles/ssh/files/zhifeng.authorized_keys | 1 | ||||
-rw-r--r-- | test_list/compute | 16 | ||||
-rw-r--r-- | test_list/network | 9 | ||||
-rw-r--r-- | test_list/storage | 8 | ||||
-rw-r--r-- | tests/cli_test.py | 2 |
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'}) |