summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/__init__.py0
-rw-r--r--api/actions/__init__.py0
-rw-r--r--api/actions/result.py55
-rw-r--r--api/actions/test.py48
-rwxr-xr-xapi/api-prepare.sh59
-rw-r--r--api/conf.py25
-rw-r--r--api/server.py27
-rw-r--r--api/urls.py16
-rw-r--r--api/utils/__init__.py0
-rw-r--r--api/utils/common.py70
-rw-r--r--api/utils/daemonthread.py44
-rw-r--r--api/utils/influx.py73
-rw-r--r--api/views.py42
-rw-r--r--api/yardstick.ini16
-rw-r--r--api/yardstick.sock0
-rw-r--r--docker/Dockerfile7
-rw-r--r--docs/release/release-notes.rst44
-rwxr-xr-xinstall.sh3
-rw-r--r--requirements.txt4
-rw-r--r--samples/background-task.yaml2
-rw-r--r--samples/cachestat.yaml2
-rw-r--r--samples/cyclictest.yaml2
-rw-r--r--samples/fio-template.yaml2
-rw-r--r--samples/fio.yaml2
-rw-r--r--samples/iperf3-jitter.yaml2
-rw-r--r--samples/iperf3.yaml2
-rw-r--r--samples/lmbench.yaml2
-rw-r--r--samples/lmbench_cache.yaml2
-rw-r--r--samples/memload.yaml2
-rwxr-xr-xsamples/netperf.yaml2
-rw-r--r--samples/netperf_bottlenecks.yaml43
-rw-r--r--samples/netutilization.yaml2
-rw-r--r--samples/perf.yaml2
-rw-r--r--samples/pktgen.yaml2
-rw-r--r--samples/ramspeed.yaml2
-rw-r--r--samples/unixbench.yaml2
-rwxr-xr-xtests/ci/clean_images.sh2
-rwxr-xr-xtests/ci/load_images.sh8
-rwxr-xr-xtests/ci/yardstick-verify2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc001.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc005.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc008.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc009.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc010.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc011.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc012.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc014.yaml4
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc037.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc038.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc069.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc070.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc071.yaml2
-rw-r--r--tests/opnfv/test_cases/opnfv_yardstick_tc072.yaml2
-rw-r--r--tests/unit/api/actions/test_result.py29
-rw-r--r--tests/unit/api/actions/test_test.py29
-rw-r--r--tests/unit/api/test_views.py45
-rw-r--r--tests/unit/api/utils/test_common.py95
-rw-r--r--tests/unit/api/utils/test_daemonthread.py37
-rw-r--r--tests/unit/api/utils/test_influx.py82
-rwxr-xr-xtools/yardstick-img-lxd-modify7
-rwxr-xr-xtools/yardstick-img-modify7
-rw-r--r--yardstick/benchmark/contexts/node.py4
-rw-r--r--yardstick/cmd/cli.py25
-rw-r--r--yardstick/cmd/commands/task.py7
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