aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/actions/env.py85
-rw-r--r--api/actions/result.py20
-rwxr-xr-xapi/api-prepare.sh40
-rw-r--r--api/urls.py3
-rw-r--r--api/utils/common.py2
-rw-r--r--api/views.py13
-rw-r--r--api/yardstick.ini2
-rw-r--r--docker/Dockerfile2
-rwxr-xr-xinstall.sh2
-rw-r--r--requirements.txt1
-rw-r--r--samples/netperf_bottlenecks.yaml43
-rwxr-xr-xtests/ci/load_images.sh12
-rwxr-xr-xtests/ci/prepare_env.sh10
-rw-r--r--tests/ci/requirements.txt79
-rw-r--r--tests/unit/api/actions/test_env.py50
-rw-r--r--tests/unit/api/test_views.py12
-rw-r--r--tests/unit/cmd/commands/test_env.py29
-rw-r--r--tests/unit/common/test_httpClient.py33
-rw-r--r--yardstick/benchmark/contexts/node.py4
-rw-r--r--yardstick/cmd/cli.py21
-rw-r--r--yardstick/cmd/commands/env.py17
-rw-r--r--yardstick/common/constants.py7
-rw-r--r--yardstick/common/httpClient.py27
-rw-r--r--yardstick/common/utils.py9
24 files changed, 388 insertions, 135 deletions
diff --git a/api/actions/env.py b/api/actions/env.py
new file mode 100644
index 000000000..321649940
--- /dev/null
+++ b/api/actions/env.py
@@ -0,0 +1,85 @@
+##############################################################################
+# 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
+import threading
+import time
+
+from docker import Client
+
+from yardstick.common import constants as config
+from yardstick.common import utils as yardstick_utils
+from api import conf as api_conf
+from api.utils import common as common_utils
+from api.utils import influx
+
+logger = logging.getLogger(__name__)
+
+
+def createInfluxDBContainer(args):
+ try:
+ container = _create_influxdb_container()
+ _config_output_file()
+ thread = threading.Thread(target=_config_influxdb)
+ thread.start()
+ return common_utils.result_handler('success', container)
+ except Exception as e:
+ message = 'Failed to create influxdb container: %s' % e
+ return common_utils.error_handler(message)
+
+
+def _create_influxdb_container():
+ client = Client(base_url=config.DOCKER_URL)
+
+ ports = [8083, 8086]
+ port_bindings = {k: k for k in ports}
+ host_config = client.create_host_config(port_bindings=port_bindings)
+
+ container = client.create_container(image='tutum/influxdb',
+ ports=ports,
+ detach=True,
+ tty=True,
+ host_config=host_config)
+ client.start(container)
+ return container
+
+
+def _config_influxdb():
+ time.sleep(20)
+ try:
+ client = influx.get_data_db_client()
+ client.create_user(config.USER, config.PASSWORD, config.DATABASE)
+ client.create_database(config.DATABASE)
+ logger.info('Success to config influxDB')
+ except Exception as e:
+ logger.debug('Failed to config influxDB: %s', e)
+
+
+def _config_output_file():
+ yardstick_utils.makedirs('/etc/yardstick')
+ with open('/etc/yardstick/yardstick.conf', 'w') as f:
+ f.write("""\
+[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://%s:8086
+db_name = yardstick
+username = root
+password = root
+"""
+ % api_conf.GATEWAY_IP)
diff --git a/api/actions/result.py b/api/actions/result.py
index 9f606d2cb..10112ac68 100644
--- a/api/actions/result.py
+++ b/api/actions/result.py
@@ -7,6 +7,8 @@
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
import logging
+import uuid
+import re
from api.utils import influx as influx_utils
from api.utils import common as common_utils
@@ -19,23 +21,27 @@ def getResult(args):
try:
measurement = args['measurement']
task_id = args['task_id']
+
+ if re.search("[^a-zA-Z0-9_-]", measurement):
+ raise ValueError('invalid measurement parameter')
+
+ uuid.UUID(task_id)
except KeyError:
- message = 'measurement and task_id must be needed'
+ message = 'measurement and task_id must be provided'
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))
+ query_template = "select * from %s where task_id='%s'"
+ query_sql = query_template % ('tasklist', task_id)
+ data = common_utils.translate_to_str(influx_utils.query(query_sql))
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))
+ query_sql = query_template % (measurement, task_id)
+ data = common_utils.translate_to_str(influx_utils.query(query_sql))
return common_utils.result_handler(1, data)
diff --git a/api/api-prepare.sh b/api/api-prepare.sh
index 075d7875c..c05dbb5ff 100755
--- a/api/api-prepare.sh
+++ b/api/api-prepare.sh
@@ -1,41 +1,19 @@
#!/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
+##############################################################################
+# 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
+##############################################################################
# nginx config
nginx_config='/etc/nginx/conf.d/yardstick.conf'
if [[ ! -e "${nginx_config}" ]];then
- cat << EOF >> "${nginx_config}"
+ cat << EOF > "${nginx_config}"
server {
listen 5000;
server_name localhost;
diff --git a/api/urls.py b/api/urls.py
index 2a9e72a76..eaaf8b6d1 100644
--- a/api/urls.py
+++ b/api/urls.py
@@ -12,5 +12,6 @@ from api.utils.common import Url
urlpatterns = [
Url('/yardstick/test/action', views.Test, 'test'),
- Url('/yardstick/result/action', views.Result, 'result')
+ Url('/yardstick/result/action', views.Result, 'result'),
+ Url('/yardstick/env/action', views.Env, 'env')
]
diff --git a/api/utils/common.py b/api/utils/common.py
index 04a6fe0d6..09cfc04d4 100644
--- a/api/utils/common.py
+++ b/api/utils/common.py
@@ -34,7 +34,7 @@ def get_command_list(command_list, opts, args):
task_args = opts.get('task-args', '')
if task_args:
- command_list.extend(['--task-args', task_args])
+ command_list.extend(['--task-args', str(task_args)])
return command_list
diff --git a/api/views.py b/api/views.py
index e78389f5a..7357625e0 100644
--- a/api/views.py
+++ b/api/views.py
@@ -14,6 +14,7 @@ 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
+from api.actions import env as env_action
logger = logging.getLogger(__name__)
@@ -40,3 +41,15 @@ class Result(Resource):
return getattr(result_action, action)(args)
except AttributeError:
return common_utils.error_handler('Wrong action')
+
+
+class Env(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(env_action, action)(args)
+ except AttributeError:
+ return common_utils.error_handler('Wrong action')
diff --git a/api/yardstick.ini b/api/yardstick.ini
index 535022960..01025c2ef 100644
--- a/api/yardstick.ini
+++ b/api/yardstick.ini
@@ -12,5 +12,5 @@ chmod-socket = 666
callable = app
enable-threads = true
close-on-exec = 1
-daemonize=/home/kklt/kklt/api/uwsgi.log
+daemonize=/home/opnfv/repos/yardstick/api/uwsgi.log
socket = /home/opnfv/repos/yardstick/api/yardstick.sock
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 36db2bb13..fb8625e50 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -11,6 +11,8 @@ FROM ubuntu:14.04
LABEL image=opnfv/yardstick
+ARG BRANCH=master
+
# GIT repo directory
ENV REPOS_DIR /home/opnfv/repos
diff --git a/install.sh b/install.sh
index 8fdd07569..afb735195 100755
--- a/install.sh
+++ b/install.sh
@@ -14,7 +14,7 @@ apt-get update && apt-get install -y \
libxml2-dev \
libxslt1-dev \
nginx \
- uswgi \
+ uwsgi \
uwsgi-plugin-python \
python-setuptools && \
easy_install -U setuptools
diff --git a/requirements.txt b/requirements.txt
index ab20c7541..b47951e0a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -81,3 +81,4 @@ flask==0.11.1
flask-restful==0.3.5
influxdb==3.0.0
pyroute2==0.4.10
+docker-py==1.10.6
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/tests/ci/load_images.sh b/tests/ci/load_images.sh
index 54a145fd3..405d72076 100755
--- a/tests/ci/load_images.sh
+++ b/tests/ci/load_images.sh
@@ -12,6 +12,18 @@
set -e
+YARD_IMG_ARCH=amd64
+export YARD_IMG_ARCH
+
+if ! grep -q "Defaults env_keep += \"YARD_IMG_ARCH\"" "/etc/sudoers"; then
+ sudo echo "Defaults env_keep += \"YARD_IMG_ARCH YARDSTICK_REPO_DIR\"" >> /etc/sudoers
+fi
+
+ARCH_SCRIPT="test -f /etc/fuel_openstack_arch && grep -q arm64 /etc/fuel_openstack_arch"
+if [ "$INSTALLER_TYPE" == "fuel" ]; then
+ sshpass -p r00tme ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -l root $INSTALLER_IP "${ARCH_SCRIPT}" && YARD_IMG_ARCH=arm64
+fi
+
UCA_HOST="cloud-images.ubuntu.com"
if [ $YARD_IMG_ARCH = "arm64" ]; then
export VIVID_IMG_URL="http://${UCA_HOST}/vivid/current/vivid-server-cloudimg-arm64.tar.gz"
diff --git a/tests/ci/prepare_env.sh b/tests/ci/prepare_env.sh
index 130969fa1..be59b7f37 100755
--- a/tests/ci/prepare_env.sh
+++ b/tests/ci/prepare_env.sh
@@ -74,13 +74,6 @@ verify_connectivity() {
error "Can not talk to $ip."
}
-YARD_IMG_ARCH=amd64
-export YARD_IMG_ARCH
-
-if ! grep -q "Defaults env_keep += \"YARD_IMG_ARCH\"" "/etc/sudoers"; then
- sudo echo "Defaults env_keep += \"YARD_IMG_ARCH YARDSTICK_REPO_DIR\"" >> /etc/sudoers
-fi
-
ssh_options="-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no"
if [ "$INSTALLER_TYPE" == "fuel" ]; then
@@ -90,9 +83,6 @@ if [ "$INSTALLER_TYPE" == "fuel" ]; then
sshpass -p r00tme scp 2>/dev/null $ssh_options \
root@${INSTALLER_IP}:~/.ssh/id_rsa /root/.ssh/id_rsa &> /dev/null
- ARCH_SCRIPT="test -f /etc/fuel_openstack_arch && grep -q arm64 /etc/fuel_openstack_arch"
- sshpass -p r00tme ssh $ssh_options -l root $INSTALLER_IP "${ARCH_SCRIPT}" && YARD_IMG_ARCH=arm64
-
sshpass -p r00tme ssh 2>/dev/null $ssh_options \
root@${INSTALLER_IP} fuel node>fuel_node
diff --git a/tests/ci/requirements.txt b/tests/ci/requirements.txt
deleted file mode 100644
index 4d1a16993..000000000
--- a/tests/ci/requirements.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-##############################################################################
-# Copyright (c) 2015 Ericsson AB 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
-##############################################################################
-
-appdirs==1.4.0
-Babel==2.2.0
-backport-ipaddress==0.1
-cliff==2.0.0
-cmd2==0.6.8
-coverage==4.1b2
-debtcollector==1.3.0
-ecdsa==0.13
-extras==0.0.3
-fixtures==1.4.0
-flake8==2.5.4
-funcsigs==0.4
-functools32==3.2.3.post2
-futures==3.0.5
-iso8601==0.1.11
-Jinja2==2.8
-jsonpatch==1.13
-jsonpointer==1.10
-jsonschema==2.5.1
-keystoneauth1==2.3.0
-linecache2==1.0.0
-lxml==3.5.0
-MarkupSafe==0.23
-mccabe==0.4.0
-mock==1.3.0
-monotonic==1.0
-msgpack-python==0.4.7
-netaddr==0.7.18
-netifaces==0.10.4
-nose==1.3.7
-openstacksdk==0.8.1
-os-client-config==1.16.0
-oslo.config==3.9.0
-oslo.i18n==3.4.0
-oslo.serialization==2.4.0
-oslo.utils==3.7.0
-paramiko==1.16.0
-pbr==1.8.1
-pep8==1.7.0
-positional==1.0.1
-prettytable==0.7.2
-pycrypto==2.6.1
-pyflakes==1.0.0
-pyparsing==2.1.0
-pyrsistent==0.11.12
-python-cinderclient==1.6.0
-python-glanceclient==2.0.0
-python-heatclient==1.0.0
-python-keystoneclient==2.3.1
-python-mimeparse==1.5.1
-python-neutronclient==4.1.1
-python-novaclient==3.3.0
-python-openstackclient==2.2.0
-python-subunit==1.2.0
-python-swiftclient==3.0.0
-pytz==2015.7
-PyYAML==3.11
-requests==2.9.1
-requestsexceptions==1.1.3
-scp==0.10.2
-simplejson==3.8.2
-six==1.10.0
-stevedore==1.12.0
-testrepository==0.0.20
-testtools==2.0.0
-traceback2==1.4.0
-unicodecsv==0.14.1
-unittest2==1.1.0
-warlock==1.2.0
-wrapt==1.10.6
diff --git a/tests/unit/api/actions/test_env.py b/tests/unit/api/actions/test_env.py
new file mode 100644
index 000000000..e674d73d2
--- /dev/null
+++ b/tests/unit/api/actions/test_env.py
@@ -0,0 +1,50 @@
+##############################################################################
+# 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.actions import env
+
+
+class CreateInfluxDBContainerTestCase(unittest.TestCase):
+
+ @mock.patch('api.actions.env._create_influxdb_container')
+ def test_create_influxdb_container(self, mock_create_container):
+ env.createInfluxDBContainer({})
+ mock_create_container.assert_called_with()
+
+
+class CreateInfluxdbContainerTestCase(unittest.TestCase):
+
+ @mock.patch('api.actions.env.Client')
+ def test_create_influxdb_container(self, mock_influx_client):
+ env._create_influxdb_container()
+ self.assertFalse(mock_influx_client()._create_container.called)
+
+
+class ConfigInfluxdbTestCase(unittest.TestCase):
+
+ @mock.patch('api.actions.env.influx.get_data_db_client')
+ def test_config_influxdb(self, mock_influx_client):
+ env._config_influxdb()
+ mock_influx_client.assert_called_with()
+
+
+class ConfigOutputFile(unittest.TestCase):
+
+ def test_config_output_file(self):
+ pass
+
+
+def main():
+ unittest.main()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/unit/api/test_views.py b/tests/unit/api/test_views.py
index e57ec08a4..b83556713 100644
--- a/tests/unit/api/test_views.py
+++ b/tests/unit/api/test_views.py
@@ -12,6 +12,7 @@ import json
from api.views import Test
from api.views import Result
+from api.views import Env
class TestTestCase(unittest.TestCase):
@@ -37,6 +38,17 @@ class ResultTestCase(unittest.TestCase):
self.assertEqual('error', result['status'])
+class EnvTestCase(unittest.TestCase):
+
+ @mock.patch('api.views.request')
+ def test_post(self, mock_request):
+ mock_request.json.get.side_effect = ['hello', {}]
+
+ result = json.loads(Env().post())
+
+ self.assertEqual('error', result['status'])
+
+
def main():
unittest.main()
diff --git a/tests/unit/cmd/commands/test_env.py b/tests/unit/cmd/commands/test_env.py
new file mode 100644
index 000000000..af1ab8030
--- /dev/null
+++ b/tests/unit/cmd/commands/test_env.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 mock
+
+from yardstick.cmd.commands.env import EnvCommand
+
+
+class EnvCommandTestCase(unittest.TestCase):
+
+ @mock.patch('yardstick.cmd.commands.env.HttpClient')
+ def test_do_influxdb(self, mock_http_client):
+ env = EnvCommand()
+ env.do_influxdb({})
+ self.assertTrue(mock_http_client().post.called)
+
+
+def main():
+ unittest.main()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/unit/common/test_httpClient.py b/tests/unit/common/test_httpClient.py
new file mode 100644
index 000000000..b39dc2332
--- /dev/null
+++ b/tests/unit/common/test_httpClient.py
@@ -0,0 +1,33 @@
+##############################################################################
+# 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 yardstick.common import httpClient
+
+
+class HttpClientTestCase(unittest.TestCase):
+
+ @mock.patch('yardstick.common.httpClient.requests')
+ def test_post(self, mock_requests):
+ url = 'http://localhost:5000/hello'
+ data = {'hello': 'world'}
+ headers = {'Content-Type': 'application/json'}
+ httpClient.HttpClient().post(url, data)
+ mock_requests.post.assert_called_with(url, data=json.dumps(data),
+ headers=headers)
+
+
+def main():
+ unittest.main()
+
+
+if __name__ == '__main__':
+ main()
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 3896ce47c..d141731e1 100644
--- a/yardstick/cmd/cli.py
+++ b/yardstick/cmd/cli.py
@@ -24,6 +24,7 @@ from yardstick.cmd.commands import runner
from yardstick.cmd.commands import scenario
from yardstick.cmd.commands import testcase
from yardstick.cmd.commands import plugin
+from yardstick.cmd.commands import env
CONF = cfg.CONF
cli_opts = [
@@ -62,10 +63,12 @@ class YardstickCLI():
'runner': runner.RunnerCommands,
'scenario': scenario.ScenarioCommands,
'testcase': testcase.TestcaseCommands,
- 'plugin': plugin.PluginCommands
+ 'plugin': plugin.PluginCommands,
+ 'env': env.EnvCommand
}
def __init__(self):
+ self.opts = []
self._version = 'yardstick version %s ' % \
get_distribution('yardstick').version
@@ -111,7 +114,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):
@@ -143,6 +151,11 @@ class YardstickCLI():
func = CONF.category.func
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'''
self._register_cli_opt()
@@ -153,6 +166,8 @@ class YardstickCLI():
self._dispath_func_notask()
+ self._clear_config_opts()
+
def api(self, argv, task_id): # pragma: no cover
'''run the api interface'''
self._register_cli_opt()
@@ -162,3 +177,5 @@ class YardstickCLI():
self._handle_global_opts()
self._dispath_func_task(task_id)
+
+ self._clear_config_opts()
diff --git a/yardstick/cmd/commands/env.py b/yardstick/cmd/commands/env.py
new file mode 100644
index 000000000..d9c0c0a3f
--- /dev/null
+++ b/yardstick/cmd/commands/env.py
@@ -0,0 +1,17 @@
+##############################################################################
+# 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 yardstick.common.httpClient import HttpClient
+
+
+class EnvCommand(object):
+
+ def do_influxdb(self, args):
+ url = 'http://localhost:5000/yardstick/env/action'
+ data = {'action': 'createInfluxDBContainer'}
+ HttpClient().post(url, data)
diff --git a/yardstick/common/constants.py b/yardstick/common/constants.py
index 40b29a717..8fbc82f0e 100644
--- a/yardstick/common/constants.py
+++ b/yardstick/common/constants.py
@@ -1,3 +1,10 @@
CONFIG_SAMPLE = '/etc/yardstick/config.yaml'
RELENG_DIR = 'releng.dir'
+
+DOCKER_URL = 'unix://var/run/docker.sock'
+
+# database config
+USER = 'root'
+PASSWORD = 'root'
+DATABASE = 'yardstick'
diff --git a/yardstick/common/httpClient.py b/yardstick/common/httpClient.py
new file mode 100644
index 000000000..b6959b400
--- /dev/null
+++ b/yardstick/common/httpClient.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 json
+import logging
+
+import requests
+
+logger = logging.getLogger(__name__)
+
+
+class HttpClient(object):
+
+ def post(self, url, data):
+ data = json.dumps(data)
+ headers = {'Content-Type': 'application/json'}
+ try:
+ response = requests.post(url, data=data, headers=headers)
+ result = response.json()
+ logger.debug('The result is: %s', result)
+ except Exception as e:
+ logger.debug('Failed: %s', e)
diff --git a/yardstick/common/utils.py b/yardstick/common/utils.py
index d639fb66a..afbe4e8ec 100644
--- a/yardstick/common/utils.py
+++ b/yardstick/common/utils.py
@@ -18,6 +18,7 @@
import os
import sys
import yaml
+import errno
from oslo_utils import importutils
import yardstick
@@ -91,3 +92,11 @@ def get_para_from_yaml(file_path, args):
else:
print 'file not exist'
return None
+
+
+def makedirs(d):
+ try:
+ os.makedirs(d)
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise