diff options
64 files changed, 953 insertions, 64 deletions
diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/api/__init__.py diff --git a/api/actions/__init__.py b/api/actions/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/api/actions/__init__.py diff --git a/api/actions/result.py b/api/actions/result.py new file mode 100644 index 000000000..9f606d2cb --- /dev/null +++ b/api/actions/result.py @@ -0,0 +1,55 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import logging + +from api.utils import influx as influx_utils +from api.utils import common as common_utils +from api import conf + +logger = logging.getLogger(__name__) + + +def getResult(args): + try: + measurement = args['measurement'] + task_id = args['task_id'] + except KeyError: + message = 'measurement and task_id must be needed' + return common_utils.error_handler(message) + + measurement = conf.TEST_CASE_PRE + measurement + + query_sql = "select * from $table where task_id='$task_id'" + param = {'table': 'tasklist', 'task_id': task_id} + data = common_utils.translate_to_str(influx_utils.query(query_sql, param)) + + def _unfinished(): + return common_utils.result_handler(0, []) + + def _finished(): + param = {'table': measurement, 'task_id': task_id} + data = common_utils.translate_to_str(influx_utils.query(query_sql, + param)) + + return common_utils.result_handler(1, data) + + def _error(): + return common_utils.result_handler(2, data[0]['error']) + + try: + status = data[0]['status'] + + switcher = { + 0: _unfinished, + 1: _finished, + 2: _error + } + return switcher.get(status, lambda: 'nothing')() + except IndexError: + return common_utils.error_handler('no such task') diff --git a/api/actions/test.py b/api/actions/test.py new file mode 100644 index 000000000..b1dc212c2 --- /dev/null +++ b/api/actions/test.py @@ -0,0 +1,48 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import uuid +import json +import os +import logging + +from api import conf +from api.utils import common as common_utils + +logger = logging.getLogger(__name__) + + +def runTestCase(args): + try: + opts = args.get('opts', {}) + testcase = args['testcase'] + except KeyError: + logger.error('Lack of testcase argument') + result = { + 'status': 'error', + 'message': 'need testcase name' + } + return json.dumps(result) + + testcase = os.path.join(conf.TEST_CASE_PATH, + conf.TEST_CASE_PRE + testcase + '.yaml') + + task_id = str(uuid.uuid4()) + + command_list = ['task', 'start'] + command_list = common_utils.get_command_list(command_list, opts, testcase) + logger.debug('The command_list is: %s', command_list) + + logger.debug('Start to execute command list') + common_utils.exec_command_task(command_list, task_id) + + result = { + 'status': 'success', + 'task_id': task_id + } + return json.dumps(result) diff --git a/api/api-prepare.sh b/api/api-prepare.sh new file mode 100755 index 000000000..075d7875c --- /dev/null +++ b/api/api-prepare.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +# yardstick output config +output_config='/etc/yardstick/yardstick.conf' + +if [[ ! -e "${output_config}" ]];then + gateway_ip=$(ip route | grep default | awk '{print $3}') + echo "${gateway_ip}" + + install -d /etc/yardstick -m 0755 -o root + + cat << EOF > "${output_config}" +[DEFAULT] +debug = True +dispatcher = influxdb + +[dispatcher_file] +file_path = /tmp/yardstick.out + +[dispatcher_http] +timeout = 5 +# target = http://127.0.0.1:8000/results + +[dispatcher_influxdb] +timeout = 5 +target = http://${gateway_ip}:8086 +db_name = yardstick +username = root +password = root +EOF +fi + +# nginx config +nginx_config='/etc/nginx/conf.d/yardstick.conf' + +if [[ ! -e "${nginx_config}" ]];then + + cat << EOF >> "${nginx_config}" +server { + listen 5000; + server_name localhost; + index index.htm index.html; + location / { + include uwsgi_params; + uwsgi_pass unix:///home/opnfv/repos/yardstick/api/yardstick.sock; + } +} +EOF +fi + +# nginx service start when boot +cat << EOF >> /root/.bashrc + +nginx_status=\$(service nginx status | grep not) +if [ -n "\${nginx_status}" ];then + service nginx restart + uwsgi -i /home/opnfv/repos/yardstick/api/yardstick.ini +fi +EOF diff --git a/api/conf.py b/api/conf.py new file mode 100644 index 000000000..e1da4aba0 --- /dev/null +++ b/api/conf.py @@ -0,0 +1,25 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +from pyroute2 import IPDB + + +# configuration for influxdb +with IPDB() as ip: + GATEWAY_IP = ip.routes['default'].gateway +PORT = 8086 + +TEST_ACTION = ['runTestCase'] + +TEST_CASE_PATH = '../tests/opnfv/test_cases/' + +TEST_CASE_PRE = 'opnfv_yardstick_' + +TEST_SUITE_PATH = '../tests/opnfv/test_suites/' + +OUTPUT_CONFIG_FILE_PATH = '/etc/yardstick/yardstick.conf' diff --git a/api/server.py b/api/server.py new file mode 100644 index 000000000..1cbe1725d --- /dev/null +++ b/api/server.py @@ -0,0 +1,27 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import logging + +from flask import Flask +from flask_restful import Api + +from api.urls import urlpatterns + +logger = logging.getLogger(__name__) + +app = Flask(__name__) + +api = Api(app) + +reduce(lambda a, b: a.add_resource(b.resource, b.url, + endpoint=b.endpoint) or a, urlpatterns, api) + +if __name__ == '__main__': + logger.info('Starting server') + app.run(host='0.0.0.0') diff --git a/api/urls.py b/api/urls.py new file mode 100644 index 000000000..2a9e72a76 --- /dev/null +++ b/api/urls.py @@ -0,0 +1,16 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +from api import views +from api.utils.common import Url + + +urlpatterns = [ + Url('/yardstick/test/action', views.Test, 'test'), + Url('/yardstick/result/action', views.Result, 'result') +] diff --git a/api/utils/__init__.py b/api/utils/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/api/utils/__init__.py diff --git a/api/utils/common.py b/api/utils/common.py new file mode 100644 index 000000000..04a6fe0d6 --- /dev/null +++ b/api/utils/common.py @@ -0,0 +1,70 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import collections +import logging +import json + +from api.utils.daemonthread import DaemonThread +from yardstick.cmd.cli import YardstickCLI + +logger = logging.getLogger(__name__) + + +def translate_to_str(object): + if isinstance(object, collections.Mapping): + return {str(k): translate_to_str(v) for k, v in object.items()} + elif isinstance(object, list): + return [translate_to_str(ele) for ele in object] + elif isinstance(object, unicode): + return str(object) + return object + + +def get_command_list(command_list, opts, args): + + command_list.append(args) + + command_list.extend(('--{}'.format(k) for k in opts if 'task-args' != k)) + + task_args = opts.get('task-args', '') + if task_args: + command_list.extend(['--task-args', task_args]) + + return command_list + + +def exec_command_task(command_list, task_id): # pragma: no cover + daemonthread = DaemonThread(YardstickCLI().api, (command_list, task_id)) + daemonthread.start() + + +def error_handler(message): + logger.debug(message) + result = { + 'status': 'error', + 'message': message + } + return json.dumps(result) + + +def result_handler(status, data): + result = { + 'status': status, + 'result': data + } + return json.dumps(result) + + +class Url(object): + + def __init__(self, url, resource, endpoint): + super(Url, self).__init__() + self.url = url + self.resource = resource + self.endpoint = endpoint diff --git a/api/utils/daemonthread.py b/api/utils/daemonthread.py new file mode 100644 index 000000000..47c0b9108 --- /dev/null +++ b/api/utils/daemonthread.py @@ -0,0 +1,44 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import threading +import os +import datetime +import errno + +from api import conf +from api.utils.influx import write_data_tasklist + + +class DaemonThread(threading.Thread): + + def __init__(self, method, args): + super(DaemonThread, self).__init__(target=method, args=args) + self.method = method + self.command_list = args[0] + self.task_id = args[1] + + def run(self): + timestamp = datetime.datetime.now() + + try: + write_data_tasklist(self.task_id, timestamp, 0) + self.method(self.command_list, self.task_id) + write_data_tasklist(self.task_id, timestamp, 1) + except Exception as e: + write_data_tasklist(self.task_id, timestamp, 2, error=str(e)) + finally: + _handle_testsuite_file(self.task_id) + + +def _handle_testsuite_file(task_id): + try: + os.remove(os.path.join(conf.TEST_SUITE_PATH, task_id + '.yaml')) + except OSError as e: + if e.errno != errno.ENOENT: + raise diff --git a/api/utils/influx.py b/api/utils/influx.py new file mode 100644 index 000000000..9366ed3e9 --- /dev/null +++ b/api/utils/influx.py @@ -0,0 +1,73 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import logging +from urlparse import urlsplit + +from influxdb import InfluxDBClient +import ConfigParser + +from api import conf + +logger = logging.getLogger(__name__) + + +def get_data_db_client(): + parser = ConfigParser.ConfigParser() + try: + parser.read(conf.OUTPUT_CONFIG_FILE_PATH) + dispatcher = parser.get('DEFAULT', 'dispatcher') + + if 'influxdb' != dispatcher: + raise RuntimeError + + ip = _get_ip(parser.get('dispatcher_influxdb', 'target')) + username = parser.get('dispatcher_influxdb', 'username') + password = parser.get('dispatcher_influxdb', 'password') + db_name = parser.get('dispatcher_influxdb', 'db_name') + return InfluxDBClient(ip, conf.PORT, username, password, db_name) + except ConfigParser.NoOptionError: + logger.error('can not find the key') + raise + + +def _get_ip(url): + return urlsplit(url).hostname + + +def _write_data(measurement, field, timestamp, tags): + point = { + 'measurement': measurement, + 'fields': field, + 'time': timestamp, + 'tags': tags + } + + try: + client = get_data_db_client() + + logger.debug('Start to write data: %s', point) + client.write_points([point]) + except RuntimeError: + logger.debug('dispatcher is not influxdb') + + +def write_data_tasklist(task_id, timestamp, status, error=''): + field = {'status': status, 'error': error} + tags = {'task_id': task_id} + _write_data('tasklist', field, timestamp, tags) + + +def query(query_sql): + try: + client = get_data_db_client() + logger.debug('Start to query: %s', query_sql) + return list(client.query(query_sql).get_points()) + except RuntimeError: + logger.error('dispatcher is not influxdb') + raise diff --git a/api/views.py b/api/views.py new file mode 100644 index 000000000..e78389f5a --- /dev/null +++ b/api/views.py @@ -0,0 +1,42 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import logging + +from flask import request +from flask_restful import Resource + +from api.utils import common as common_utils +from api.actions import test as test_action +from api.actions import result as result_action + +logger = logging.getLogger(__name__) + + +class Test(Resource): + def post(self): + action = common_utils.translate_to_str(request.json.get('action', '')) + args = common_utils.translate_to_str(request.json.get('args', {})) + logger.debug('Input args is: action: %s, args: %s', action, args) + + try: + return getattr(test_action, action)(args) + except AttributeError: + return common_utils.error_handler('Wrong action') + + +class Result(Resource): + def get(self): + args = common_utils.translate_to_str(request.args) + action = args.get('action', '') + logger.debug('Input args is: action: %s, args: %s', action, args) + + try: + return getattr(result_action, action)(args) + except AttributeError: + return common_utils.error_handler('Wrong action') diff --git a/api/yardstick.ini b/api/yardstick.ini new file mode 100644 index 000000000..535022960 --- /dev/null +++ b/api/yardstick.ini @@ -0,0 +1,16 @@ +[uwsgi] +master = true +debug = true +chdir = /home/opnfv/repos/yardstick/api +module = server +plugins = python +processes = 10 +threads = 5 +async = true +max-requests = 5000 +chmod-socket = 666 +callable = app +enable-threads = true +close-on-exec = 1 +daemonize=/home/kklt/kklt/api/uwsgi.log +socket = /home/opnfv/repos/yardstick/api/yardstick.sock diff --git a/api/yardstick.sock b/api/yardstick.sock new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/api/yardstick.sock diff --git a/docker/Dockerfile b/docker/Dockerfile index fba6e2067..36db2bb13 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -43,6 +43,9 @@ RUN apt-get update && apt-get install -y \ python-dev \ libxml2-dev \ libxslt1-dev \ + nginx \ + uwsgi \ + uwsgi-plugin-python \ python-setuptools && \ easy_install -U setuptools @@ -60,6 +63,10 @@ RUN cd ${YARDSTICK_REPO_DIR} && easy_install -U pip RUN cd ${YARDSTICK_REPO_DIR} && pip install -r requirements.txt RUN cd ${YARDSTICK_REPO_DIR} && pip install . +RUN ${YARDSTICK_REPO_DIR}/api/api-prepare.sh + +EXPOSE 5000 + ADD http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img /home/opnfv/images/ ADD http://cloud-images.ubuntu.com/trusty/current/trusty-server-cloudimg-amd64-disk1.img /home/opnfv/images/ diff --git a/docs/release/release-notes.rst b/docs/release/release-notes.rst index 72f263c2d..8df0776df 100644 --- a/docs/release/release-notes.rst +++ b/docs/release/release-notes.rst @@ -38,7 +38,10 @@ Version History | *Date* | *Version* | *Comment* | | | | | +----------------+--------------------+---------------------------------+ -| Oct 27nd, 2016 | 2.0 | Yardstick for Colorado release | +| Dec 5th, 2016 | 3.0 | Yardstick for Colorado release | +| | | | ++----------------+--------------------+---------------------------------+ +| Oct 27th, 2016 | 2.0 | Yardstick for Colorado release | | | | | +----------------+--------------------+---------------------------------+ | Aug 22nd, 2016 | 1.0 | Yardstick for Colorado release | @@ -132,19 +135,19 @@ Release Data | **Project** | Yardstick | | | | +--------------------------------------+--------------------------------------+ -| **Repo/tag** | yardstick/colorado.2.0 | +| **Repo/tag** | yardstick/colorado.3.0 | | | | +--------------------------------------+--------------------------------------+ -| **Yardstick Docker image tag** | colorado.2.0 | +| **Yardstick Docker image tag** | colorado.3.0 | | | | +--------------------------------------+--------------------------------------+ | **Release designation** | Colorado | | | | +--------------------------------------+--------------------------------------+ -| **Release date** | October 27 2016 | +| **Release date** | December 5th, 2016 | | | | +--------------------------------------+--------------------------------------+ -| **Purpose of the delivery** | OPNFV Colorado release 2.0 | +| **Purpose of the delivery** | OPNFV Colorado release 3.0 | | | | +--------------------------------------+--------------------------------------+ @@ -163,22 +166,22 @@ Documents Software Deliverables --------------------- -**Yardstick framework source code <colorado.2.0>** +**Yardstick framework source code <colorado.3.0>** +--------------------------------------+--------------------------------------+ | **Project** | Yardstick | | | | +--------------------------------------+--------------------------------------+ -| **Repo/tag** | yardstick/colorado.2.0 | +| **Repo/tag** | yardstick/colorado.3.0 | | | | +--------------------------------------+--------------------------------------+ -| **Yardstick Docker image tag** | colorado.2.0 | +| **Yardstick Docker image tag** | colorado.3.0 | | | | +--------------------------------------+--------------------------------------+ | **Release designation** | Colorado | | | | +--------------------------------------+--------------------------------------+ -| **Release date** | October 27th, 2016 | +| **Release date** | December 5th, 2016 | | | | +--------------------------------------+--------------------------------------+ | **Purpose of the delivery** | OPNFV Colorado release | @@ -502,7 +505,7 @@ Feature additions Scenario Matrix =============== -For Colorado 2.0, Yardstick was tested on the following scenarios: +For Colorado 3.0, Yardstick was tested on the following scenarios: +-------------------------+---------+---------+---------+---------+ | Scenario | Apex | Compass | Fuel | Joid | @@ -585,6 +588,21 @@ Known Issues/Faults Corrected Faults ---------------- +Colorado.3.0: + ++----------------------------+------------------------------------------------+ +| **JIRA REFERENCE** | **SLOGAN** | +| | | ++----------------------------+------------------------------------------------+ +| JIRA: YARDSTICK-239 | Define process for working with Yardstick | +| | Grafana dashboard. | +| | | ++----------------------------+------------------------------------------------+ +| JIRA: YARDSTICK-373 | Add os-odl_l2-fdio-ha scenario support. | +| | | ++----------------------------+------------------------------------------------+ + + Colorado.2.0: +----------------------------+------------------------------------------------+ @@ -621,7 +639,7 @@ Colorado.2.0: +----------------------------+------------------------------------------------+ -Colorado 2.0 known restrictions/issues +Colorado 3.0 known restrictions/issues ================================== +-----------+-----------+----------------------------------------------+ | Installer | Scenario | Issue | @@ -656,6 +674,8 @@ Useful links - Yardstick IRC chanel: #opnfv-yardstick +.. _`YARDSTICK-239` : https://jira.opnfv.org/browse/YARDSTICK-239 + .. _`YARDSTICK-325` : https://jira.opnfv.org/browse/YARDSTICK-325 .. _`YARDSTICK-358` : https://jira.opnfv.org/browse/YARDSTICK-358 @@ -669,3 +689,5 @@ Useful links .. _`YARDSTICK-371` : https://jira.opnfv.org/browse/YARDSTICK-371 .. _`YARDSTICK-372` : https://jira.opnfv.org/browse/YARDSTICK-372 + +.. _`YARDSTICK-373` : https://jira.opnfv.org/browse/YARDSTICK-373 diff --git a/install.sh b/install.sh index 80fc1e523..8fdd07569 100755 --- a/install.sh +++ b/install.sh @@ -13,6 +13,9 @@ apt-get update && apt-get install -y \ python-dev \ libxml2-dev \ libxslt1-dev \ + nginx \ + uswgi \ + uwsgi-plugin-python \ python-setuptools && \ easy_install -U setuptools diff --git a/requirements.txt b/requirements.txt index 4d1a16993..ab20c7541 100644 --- a/requirements.txt +++ b/requirements.txt @@ -77,3 +77,7 @@ unicodecsv==0.14.1 unittest2==1.1.0 warlock==1.2.0 wrapt==1.10.6 +flask==0.11.1 +flask-restful==0.3.5 +influxdb==3.0.0 +pyroute2==0.4.10 diff --git a/samples/background-task.yaml b/samples/background-task.yaml index a844c2d7f..11cfdd567 100644 --- a/samples/background-task.yaml +++ b/samples/background-task.yaml @@ -39,7 +39,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/cachestat.yaml b/samples/cachestat.yaml index 5786efa38..d736793e3 100644 --- a/samples/cachestat.yaml +++ b/samples/cachestat.yaml @@ -18,7 +18,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/cyclictest.yaml b/samples/cyclictest.yaml index cb85decb1..eaf74893e 100644 --- a/samples/cyclictest.yaml +++ b/samples/cyclictest.yaml @@ -33,7 +33,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu servers: diff --git a/samples/fio-template.yaml b/samples/fio-template.yaml index ba710d95f..00c35ce23 100644 --- a/samples/fio-template.yaml +++ b/samples/fio-template.yaml @@ -28,7 +28,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu servers: diff --git a/samples/fio.yaml b/samples/fio.yaml index e1f5e6d2d..5ccbc1954 100644 --- a/samples/fio.yaml +++ b/samples/fio.yaml @@ -37,7 +37,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu servers: diff --git a/samples/iperf3-jitter.yaml b/samples/iperf3-jitter.yaml index c211571d0..366a57152 100644 --- a/samples/iperf3-jitter.yaml +++ b/samples/iperf3-jitter.yaml @@ -23,7 +23,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/iperf3.yaml b/samples/iperf3.yaml index 72f260942..6741c767e 100644 --- a/samples/iperf3.yaml +++ b/samples/iperf3.yaml @@ -21,7 +21,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/lmbench.yaml b/samples/lmbench.yaml index 311770c42..595a393b7 100644 --- a/samples/lmbench.yaml +++ b/samples/lmbench.yaml @@ -48,7 +48,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/lmbench_cache.yaml b/samples/lmbench_cache.yaml index 7a22cf15f..bf5086b3c 100644 --- a/samples/lmbench_cache.yaml +++ b/samples/lmbench_cache.yaml @@ -26,7 +26,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/memload.yaml b/samples/memload.yaml index 87d727707..5e988986a 100644 --- a/samples/memload.yaml +++ b/samples/memload.yaml @@ -20,7 +20,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/netperf.yaml b/samples/netperf.yaml index 4d7f7a798..0dd56348b 100755 --- a/samples/netperf.yaml +++ b/samples/netperf.yaml @@ -46,7 +46,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/netperf_bottlenecks.yaml b/samples/netperf_bottlenecks.yaml new file mode 100644 index 000000000..4b6348109 --- /dev/null +++ b/samples/netperf_bottlenecks.yaml @@ -0,0 +1,43 @@ +--- +# measure network latency and throughput using netperf +# This test case is suite for bottlenecks project. +# This test case is from TC073 +# we have did some parameters support + +schema: "yardstick:task:0.1" + +{% set host = host or "node1.LF" %} +{% set target = target or "node2.LF" %} +{% set pod_info = pod_info or "etc/yardstick/nodes/compass_sclab_virtual/pod.yaml" %} +{% set tx_msg_size = tx_msg_size or "65536" %} +{% set rx_msg_size = rx_msg_size or "87380" %} +{% set test_time = test_time or "20" %} +{% set out_opt = out_opt or "THROUGHPUT,THROUGHPUT_UNITS,MEAN_LATENCY,LOCAL_CPU_UTIL,REMOTE_CPU_UTIL,LOCAL_TRANSPORT_RETRANS" %} + +scenarios: +- + type: NetperfNode + options: + testname: 'TCP_STREAM' + send_msg_size: {{tx_msg_size}} + recv_msg_size: {{rx_msg_size}} + duration: {{test_time}} + output_opt: {{out_opt}} + + host: {{host}} + target: {{target}} + + runner: + type: Iteration + iterations: 1 + interval: 1 + run_step: 'setup,run' + + sla: + mean_latency: 100 + action: monitor + +context: + type: Node + name: LF + file: {{pod_info}} diff --git a/samples/netutilization.yaml b/samples/netutilization.yaml index 598a5af15..794342d29 100644 --- a/samples/netutilization.yaml +++ b/samples/netutilization.yaml @@ -19,7 +19,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/perf.yaml b/samples/perf.yaml index 541f846e7..b8979b511 100644 --- a/samples/perf.yaml +++ b/samples/perf.yaml @@ -30,7 +30,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/pktgen.yaml b/samples/pktgen.yaml index ddafb27bd..6acb8ab92 100644 --- a/samples/pktgen.yaml +++ b/samples/pktgen.yaml @@ -38,7 +38,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/ramspeed.yaml b/samples/ramspeed.yaml index 7e1b1aa8c..e754fc9fa 100644 --- a/samples/ramspeed.yaml +++ b/samples/ramspeed.yaml @@ -25,7 +25,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/samples/unixbench.yaml b/samples/unixbench.yaml index 825fd767f..b7ab88190 100644 --- a/samples/unixbench.yaml +++ b/samples/unixbench.yaml @@ -21,7 +21,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/ci/clean_images.sh b/tests/ci/clean_images.sh index 05f68a7ed..b1942160b 100755 --- a/tests/ci/clean_images.sh +++ b/tests/ci/clean_images.sh @@ -19,7 +19,7 @@ cleanup() return fi - for image in $(glance image-list | grep -e cirros-0.3.3 -e yardstick-trusty-server -e Ubuntu-14.04 \ + for image in $(glance image-list | grep -e cirros-0.3.3 -e yardstick-image -e Ubuntu-14.04 \ -e yardstick-vivid-kernel | awk '{print $2}'); do echo "Deleting image $image..." glance image-delete $image || true diff --git a/tests/ci/load_images.sh b/tests/ci/load_images.sh index 49b972777..54a145fd3 100755 --- a/tests/ci/load_images.sh +++ b/tests/ci/load_images.sh @@ -90,14 +90,14 @@ load_yardstick_image() if [[ "$DEPLOY_SCENARIO" == *"-lxd-"* ]]; then output=$(eval glance --os-image-api-version 1 image-create \ - --name yardstick-trusty-server \ + --name yardstick-image \ --is-public true --disk-format root-tar \ --container-format bare \ $EXTRA_PARAMS \ --file $RAW_IMAGE) else output=$(eval glance --os-image-api-version 1 image-create \ - --name yardstick-trusty-server \ + --name yardstick-image \ --is-public true --disk-format qcow2 \ --container-format bare \ $EXTRA_PARAMS \ @@ -203,8 +203,8 @@ create_nova_flavor() main() { - QCOW_IMAGE="/tmp/workspace/yardstick/yardstick-trusty-server.img" - RAW_IMAGE="/tmp/workspace/yardstick/yardstick-trusty-server.tar.gz" + QCOW_IMAGE="/tmp/workspace/yardstick/yardstick-image.img" + RAW_IMAGE="/tmp/workspace/yardstick/yardstick-image.tar.gz" build_yardstick_image load_yardstick_image diff --git a/tests/ci/yardstick-verify b/tests/ci/yardstick-verify index 2b7ec9d34..1a6682f85 100755 --- a/tests/ci/yardstick-verify +++ b/tests/ci/yardstick-verify @@ -160,7 +160,7 @@ run_test() mkdir -p /etc/yardstick - cat << EOF >> /etc/yardstick/yardstick.conf + cat << EOF > /etc/yardstick/yardstick.conf [DEFAULT] debug = True dispatcher = ${DISPATCHER_TYPE} diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc001.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc001.yaml index 899ee963c..aa2980f69 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc001.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc001.yaml @@ -31,7 +31,7 @@ scenarios: context: name: yardstick - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc005.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc005.yaml index 6e50157fc..732d73af7 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc005.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc005.yaml @@ -35,7 +35,7 @@ scenarios: context: name: yardstick-TC005 - image: yardstick-trusty-server + image: yardstick-image flavor: m1.small user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc008.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc008.yaml index 1cec80ff6..a2f5f3adc 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc008.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc008.yaml @@ -37,7 +37,7 @@ scenarios: context: name: yardstick-TC008 - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc009.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc009.yaml index 82a55d751..f9fa1b778 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc009.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc009.yaml @@ -32,7 +32,7 @@ scenarios: context: name: yardstick-TC009 - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc010.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc010.yaml index aeb18543e..f64968cb1 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc010.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc010.yaml @@ -25,7 +25,7 @@ scenarios: context: name: yardstick-TC010 - image: yardstick-trusty-server + image: yardstick-image flavor: m1.small user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc011.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc011.yaml index 5d21e2814..4cd3119bb 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc011.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc011.yaml @@ -23,7 +23,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc012.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc012.yaml index 3bdb8cb9a..a86943a51 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc012.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc012.yaml @@ -26,7 +26,7 @@ scenarios: context: name: demo - image: yardstick-trusty-server + image: yardstick-image flavor: m1.small user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc014.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc014.yaml index 648657f22..1ac0f2961 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc014.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc014.yaml @@ -19,7 +19,7 @@ scenarios: context: name: yardstick-TC014 - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu @@ -29,4 +29,4 @@ context: networks: test: - cidr: '10.0.1.0/24'
\ No newline at end of file + cidr: '10.0.1.0/24' diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml index 5e2177a6e..cd42098d2 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml @@ -64,7 +64,7 @@ scenarios: context: name: yardstick-TC037 - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc038.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc038.yaml index 128f94045..c2e5b4028 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc038.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc038.yaml @@ -64,7 +64,7 @@ scenarios: context: name: yardstick-TC038 - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml index 637e160c6..dcc34d80d 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml @@ -25,7 +25,7 @@ scenarios: context: name: yardstick-TC069 - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc070.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc070.yaml index 28b28b9ab..931587b5b 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc070.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc070.yaml @@ -66,7 +66,7 @@ scenarios: context: name: yardstick-TC070 - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml index 644010916..6f006eeaf 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml @@ -64,7 +64,7 @@ scenarios: context: name: yardstick-TC071 - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml b/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml index f3e6d4c40..e1fa33173 100644 --- a/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml +++ b/tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml @@ -66,7 +66,7 @@ scenarios: context: name: yardstick-TC072 - image: yardstick-trusty-server + image: yardstick-image flavor: yardstick-flavor user: ubuntu diff --git a/tests/unit/api/actions/test_result.py b/tests/unit/api/actions/test_result.py new file mode 100644 index 000000000..168631905 --- /dev/null +++ b/tests/unit/api/actions/test_result.py @@ -0,0 +1,29 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import unittest +import json + +from api.actions import result + + +class GetResultTestCase(unittest.TestCase): + + def test_getResult_with_no_taskid_arg(self): + args = {} + output = json.loads(result.getResult(args)) + + self.assertEqual('error', output['status']) + + +def main(): + unittest.main() + + +if __name__ == '__main__': + main() diff --git a/tests/unit/api/actions/test_test.py b/tests/unit/api/actions/test_test.py new file mode 100644 index 000000000..7ebe9fc24 --- /dev/null +++ b/tests/unit/api/actions/test_test.py @@ -0,0 +1,29 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import unittest +import json + +from api.actions import test + + +class RunTestCase(unittest.TestCase): + + def test_runTestCase_with_no_testcase_arg(self): + args = {} + output = json.loads(test.runTestCase(args)) + + self.assertEqual('error', output['status']) + + +def main(): + unittest.main() + + +if __name__ == '__main__': + main() diff --git a/tests/unit/api/test_views.py b/tests/unit/api/test_views.py new file mode 100644 index 000000000..e57ec08a4 --- /dev/null +++ b/tests/unit/api/test_views.py @@ -0,0 +1,45 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import unittest +import mock +import json + +from api.views import Test +from api.views import Result + + +class TestTestCase(unittest.TestCase): + + @mock.patch('api.views.request') + def test_post(self, mock_request): + mock_request.json.get.side_effect = ['hello', {}] + + result = json.loads(Test().post()) + + self.assertEqual('error', result['status']) + + +class ResultTestCase(unittest.TestCase): + + @mock.patch('api.views.request') + def test_get(self, mock_request): + mock_request.args.get.return_value = 'hello' + + print Result().get() + result = json.loads(Result().get()) + + self.assertEqual('error', result['status']) + + +def main(): + unittest.main() + + +if __name__ == '__main__': + main() diff --git a/tests/unit/api/utils/test_common.py b/tests/unit/api/utils/test_common.py new file mode 100644 index 000000000..9e050c714 --- /dev/null +++ b/tests/unit/api/utils/test_common.py @@ -0,0 +1,95 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import unittest +import json + +from api.utils import common + + +class TranslateToStrTestCase(unittest.TestCase): + + def test_translate_to_str_unicode(self): + input_str = u'hello' + output_str = common.translate_to_str(input_str) + + result = 'hello' + self.assertEqual(result, output_str) + + def test_translate_to_str_dict_list_unicode(self): + input_str = { + u'hello': {u'hello': [u'world']} + } + output_str = common.translate_to_str(input_str) + + result = { + 'hello': {'hello': ['world']} + } + self.assertEqual(result, output_str) + + +class GetCommandListTestCase(unittest.TestCase): + + def test_get_command_list_no_opts(self): + command_list = ['a'] + opts = {} + args = 'b' + output_list = common.get_command_list(command_list, opts, args) + + result_list = ['a', 'b'] + self.assertEqual(result_list, output_list) + + def test_get_command_list_with_opts_args(self): + command_list = ['a'] + opts = { + 'b': 'c', + 'task-args': 'd' + } + args = 'e' + + output_list = common.get_command_list(command_list, opts, args) + + result_list = ['a', 'e', '--b', '--task-args', 'd'] + self.assertEqual(result_list, output_list) + + +class ErrorHandlerTestCase(unittest.TestCase): + + def test_error_handler(self): + message = 'hello world' + output_dict = json.loads(common.error_handler(message)) + + result = { + 'status': 'error', + 'message': message + } + + self.assertEqual(result, output_dict) + + +class ResultHandlerTestCase(unittest.TestCase): + + def test_result_handler(self): + status = 1 + data = ['hello world'] + output_dict = json.loads(common.result_handler(status, data)) + + result = { + 'status': status, + 'result': data + } + + self.assertEqual(result, output_dict) + + +def main(): + unittest.main() + + +if __name__ == '__main__': + main() diff --git a/tests/unit/api/utils/test_daemonthread.py b/tests/unit/api/utils/test_daemonthread.py new file mode 100644 index 000000000..f07f0fede --- /dev/null +++ b/tests/unit/api/utils/test_daemonthread.py @@ -0,0 +1,37 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import unittest +import mock + +from api.utils.daemonthread import DaemonThread + + +class DaemonThreadTestCase(unittest.TestCase): + + @mock.patch('api.utils.daemonthread.os') + def test_run(self, mock_os): + def func(common_list, task_id): + return task_id + + common_list = [] + task_id = '1234' + thread = DaemonThread(func, (common_list, task_id)) + thread.run() + + mock_os.path.exist.return_value = True + pre_path = '../tests/opnfv/test_suites/' + mock_os.remove.assert_called_with(pre_path + '1234.yaml') + + +def main(): + unittest.main() + + +if __name__ == '__main__': + main() diff --git a/tests/unit/api/utils/test_influx.py b/tests/unit/api/utils/test_influx.py new file mode 100644 index 000000000..0852da2dd --- /dev/null +++ b/tests/unit/api/utils/test_influx.py @@ -0,0 +1,82 @@ +############################################################################## +# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import unittest +import mock +import uuid +import datetime + +from api.utils import influx + + +class GetDataDbClientTestCase(unittest.TestCase): + + @mock.patch('api.utils.influx.ConfigParser') + def test_get_data_db_client_dispatcher_not_influxdb(self, mock_parser): + mock_parser.ConfigParser().get.return_value = 'file' + try: + influx.get_data_db_client() + except Exception as e: + self.assertIsInstance(e, RuntimeError) + + +class GetIpTestCase(unittest.TestCase): + + def test_get_url(self): + url = 'http://localhost:8086/hello' + output = influx._get_ip(url) + + result = 'localhost' + self.assertEqual(result, output) + + +class WriteDataTestCase(unittest.TestCase): + + @mock.patch('api.utils.influx.get_data_db_client') + def test_write_data(self, mock_get_client): + measurement = 'tasklist' + field = {'status': 1} + timestamp = datetime.datetime.now() + tags = {'task_id': str(uuid.uuid4())} + + influx._write_data(measurement, field, timestamp, tags) + mock_get_client.assert_called_with() + + +class WriteDataTasklistTestCase(unittest.TestCase): + + @mock.patch('api.utils.influx._write_data') + def test_write_data_tasklist(self, mock_write_data): + task_id = str(uuid.uuid4()) + timestamp = datetime.datetime.now() + status = 1 + influx.write_data_tasklist(task_id, timestamp, status) + + field = {'status': status, 'error': ''} + tags = {'task_id': task_id} + mock_write_data.assert_called_with('tasklist', field, timestamp, tags) + + +class QueryTestCase(unittest.TestCase): + + @mock.patch('api.utils.influx.ConfigParser') + def test_query_dispatcher_not_influxdb(self, mock_parser): + mock_parser.ConfigParser().get.return_value = 'file' + try: + sql = 'select * form tasklist' + influx.query(sql) + except Exception as e: + self.assertIsInstance(e, RuntimeError) + + +def main(): + unittest.main() + + +if __name__ == '__main__': + main() diff --git a/tools/yardstick-img-lxd-modify b/tools/yardstick-img-lxd-modify index 31194554c..4ca4eb489 100755 --- a/tools/yardstick-img-lxd-modify +++ b/tools/yardstick-img-lxd-modify @@ -32,21 +32,22 @@ die() { exit 1 } -test $# -eq 1 || die "no image specific script as argument" +test $# -eq 1 -o $# -eq 2 || die "no image specific script as argument" test $(id -u) -eq 0 || die "should invoke using sudo" cmd=$1 +RELEASE=$2 test -x $cmd mountdir="/mnt/yardstick" workspace=${WORKSPACE:-"/tmp/workspace/yardstick"} host=${HOST:-"cloud-images.ubuntu.com"} -release=${RELEASE:-"trusty"} +release=${RELEASE:-"xenial"} image_path="${release}/current/${release}-server-cloudimg-amd64-root.tar.gz" image_url=${IMAGE_URL:-"https://${host}/${image_path}"} md5sums_path="${release}/current/MD5SUMS" md5sums_url=${MD5SUMS_URL:-"https://${host}/${md5sums_path}"} -imgfile="${workspace}/yardstick-${release}-server.tar.gz" +imgfile="${workspace}/yardstick-image.tar.gz" filename=$(basename $image_url) # download and checksum base image, conditionally if local copy is outdated diff --git a/tools/yardstick-img-modify b/tools/yardstick-img-modify index 07f10b3ce..c28e2ad59 100755 --- a/tools/yardstick-img-modify +++ b/tools/yardstick-img-modify @@ -32,21 +32,22 @@ die() { exit 1 } -test $# -eq 1 || die "no image specific script as argument" +test $# -eq 1 -o $# -eq 2 || die "no image specific script as argument" test $(id -u) -eq 0 || die "should invoke using sudo" cmd=$1 +RELEASE=$2 test -x $cmd mountdir="/mnt/yardstick" workspace=${WORKSPACE:-"/tmp/workspace/yardstick"} host=${HOST:-"cloud-images.ubuntu.com"} -release=${RELEASE:-"trusty"} +release=${RELEASE:-"xenial"} image_path="${release}/current/${release}-server-cloudimg-${YARD_IMG_ARCH}-disk1.img" image_url=${IMAGE_URL:-"https://${host}/${image_path}"} md5sums_path="${release}/current/MD5SUMS" md5sums_url=${MD5SUMS_URL:-"https://${host}/${md5sums_path}"} -imgfile="${workspace}/yardstick-${release}-server.img" +imgfile="${workspace}/yardstick-image.img" raw_imgfile="${workspace}/yardstick-${release}-server.raw" filename=$(basename $image_url) diff --git a/yardstick/benchmark/contexts/node.py b/yardstick/benchmark/contexts/node.py index c4e603a46..67db442d2 100644 --- a/yardstick/benchmark/contexts/node.py +++ b/yardstick/benchmark/contexts/node.py @@ -35,9 +35,9 @@ class NodeContext(Context): def init(self, attrs): '''initializes itself from the supplied arguments''' self.name = attrs["name"] - self.file_path = attrs.get("file", "") + self.file_path = attrs.get("file", "pod.yaml") if not os.path.exists(self.file_path): - self.file_path = YARDSTICK_ROOT_PATH + self.file_path + self.file_path = os.path.join(YARDSTICK_ROOT_PATH, self.file_path) LOG.info("Parsing pod file: %s", self.file_path) diff --git a/yardstick/cmd/cli.py b/yardstick/cmd/cli.py index f2406bf08..ee8d1c529 100644 --- a/yardstick/cmd/cli.py +++ b/yardstick/cmd/cli.py @@ -66,6 +66,7 @@ class YardstickCLI(): } def __init__(self): + self.opts = [] self._version = 'yardstick version %s ' % \ get_distribution('yardstick').version @@ -111,7 +112,12 @@ class YardstickCLI(): title="Command categories", help="Available categories", handler=parser) - CONF.register_cli_opt(category_opt) + self._register_opt(category_opt) + + def _register_opt(self, opt): + + CONF.register_cli_opt(opt) + self.opts.append(opt) def _load_cli_config(self, argv): @@ -137,11 +143,16 @@ class YardstickCLI(): func = CONF.category.func func(CONF.category) - def _dispath_func_task(self, task_id, timestamp): + def _dispath_func_task(self, task_id): # dispatch to category parser func = CONF.category.func - func(CONF.category, task_id=task_id, timestamp=timestamp) + func(CONF.category, task_id=task_id) + + def _clear_config_opts(self): + + CONF.clear() + CONF.unregister_opts(self.opts) def main(self, argv): # pragma: no cover '''run the command line interface''' @@ -153,7 +164,9 @@ class YardstickCLI(): self._dispath_func_notask() - def api(self, argv, task_id, timestamp): # pragma: no cover + self._clear_config_opts() + + def api(self, argv, task_id): # pragma: no cover '''run the api interface''' self._register_cli_opt() @@ -161,4 +174,6 @@ class YardstickCLI(): self._handle_global_opts() - self._dispath_func_task(task_id, timestamp) + self._dispath_func_task(task_id) + + self._clear_config_opts() diff --git a/yardstick/cmd/commands/task.py b/yardstick/cmd/commands/task.py index a10a2a8a3..47fb2ee60 100644 --- a/yardstick/cmd/commands/task.py +++ b/yardstick/cmd/commands/task.py @@ -56,6 +56,8 @@ class TaskCommands(object): atexit.register(atexit_handler) + self.task_id = kwargs.get('task_id', str(uuid.uuid4())) + total_start_time = time.time() parser = TaskParser(args.inputfile[0]) @@ -81,7 +83,7 @@ class TaskCommands(object): one_task_start_time = time.time() parser.path = task_files[i] scenarios, run_in_parallel, meet_precondition = parser.parse_task( - task_args[i], task_args_fnames[i]) + self.task_id, task_args[i], task_args_fnames[i]) if not meet_precondition: LOG.info("meet_precondition is %s, please check envrionment", @@ -232,7 +234,7 @@ class TaskParser(object): return valid_task_files, valid_task_args, valid_task_args_fnames - def parse_task(self, task_args=None, task_args_file=None): + def parse_task(self, task_id, task_args=None, task_args_file=None): '''parses the task file and return an context and scenario instances''' print "Parsing task config:", self.path @@ -291,7 +293,6 @@ class TaskParser(object): run_in_parallel = cfg.get("run_in_parallel", False) # add tc and task id for influxdb extended tags - task_id = str(uuid.uuid4()) for scenario in cfg["scenarios"]: task_name = os.path.splitext(os.path.basename(self.path))[0] scenario["tc"] = task_name |