diff options
-rw-r--r-- | api/actions/env.py | 85 | ||||
-rw-r--r-- | api/actions/result.py | 20 | ||||
-rwxr-xr-x | api/api-prepare.sh | 40 | ||||
-rw-r--r-- | api/urls.py | 3 | ||||
-rw-r--r-- | api/utils/common.py | 2 | ||||
-rw-r--r-- | api/views.py | 13 | ||||
-rw-r--r-- | api/yardstick.ini | 2 | ||||
-rw-r--r-- | docker/Dockerfile | 2 | ||||
-rwxr-xr-x | install.sh | 2 | ||||
-rw-r--r-- | requirements.txt | 1 | ||||
-rw-r--r-- | samples/netperf_bottlenecks.yaml | 43 | ||||
-rwxr-xr-x | tests/ci/load_images.sh | 12 | ||||
-rwxr-xr-x | tests/ci/prepare_env.sh | 10 | ||||
-rw-r--r-- | tests/ci/requirements.txt | 79 | ||||
-rw-r--r-- | tests/unit/api/actions/test_env.py | 50 | ||||
-rw-r--r-- | tests/unit/api/test_views.py | 12 | ||||
-rw-r--r-- | tests/unit/cmd/commands/test_env.py | 29 | ||||
-rw-r--r-- | tests/unit/common/test_httpClient.py | 33 | ||||
-rw-r--r-- | yardstick/benchmark/contexts/node.py | 4 | ||||
-rw-r--r-- | yardstick/cmd/cli.py | 21 | ||||
-rw-r--r-- | yardstick/cmd/commands/env.py | 17 | ||||
-rw-r--r-- | yardstick/common/constants.py | 7 | ||||
-rw-r--r-- | yardstick/common/httpClient.py | 27 | ||||
-rw-r--r-- | yardstick/common/utils.py | 9 |
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 |