Add API to update openrc variable 07/34807/6
authorchenjiankun <chenjiankun1@huawei.com>
Tue, 16 May 2017 01:59:06 +0000 (01:59 +0000)
committerchenjiankun <chenjiankun1@huawei.com>
Sat, 24 Jun 2017 02:16:10 +0000 (02:16 +0000)
JIRA: YARDSTICK-651

Currently we source openrc variable manually or use yardstick env
prepare to get openrc file.
We need API to update the openrc variable.

api: /yardstick/env/action
description: source environment variable
method: POST

parameters:
{
    'action': 'update_openrc',
    'args':{
        'openrc': {
            'OS_USERNAME': 'admin',
            'OS_PASSWORD': 'console',
            'OS_TENANT_NAME': 'admin',
            'OS_AUTH_URL': 'http://192.168.131.222:5000/v2.0',
            'EXTERNAL_NETWORK': 'ext-net'
        }
    }
}

Change-Id: I680a7249116c8ff0c1a9e7d5089538d935240c80
Signed-off-by: chenjiankun <chenjiankun1@huawei.com>
api/resources/env_action.py
yardstick/common/constants.py

index dd65665..42bef85 100644 (file)
@@ -16,6 +16,7 @@ import threading
 import time
 import uuid
 import glob
 import time
 import uuid
 import glob
+import collections
 
 from six.moves import configparser
 from oslo_serialization import jsonutils
 
 from six.moves import configparser
 from oslo_serialization import jsonutils
@@ -26,7 +27,7 @@ from api.database.handler import AsyncTaskHandler
 from api.utils import influx
 from api.utils.common import result_handler
 from yardstick.common import constants as consts
 from api.utils import influx
 from api.utils.common import result_handler
 from yardstick.common import constants as consts
-from yardstick.common import utils as yardstick_utils
+from yardstick.common import utils as common_utils
 from yardstick.common import openstack_utils
 from yardstick.common.httpClient import HttpClient
 
 from yardstick.common import openstack_utils
 from yardstick.common.httpClient import HttpClient
 
@@ -179,7 +180,7 @@ def _config_influxdb():
 
 
 def _change_output_to_influxdb():
 
 
 def _change_output_to_influxdb():
-    yardstick_utils.makedirs(consts.CONF_DIR)
+    common_utils.makedirs(consts.CONF_DIR)
 
     parser = configparser.ConfigParser()
     parser.read(consts.CONF_SAMPLE_FILE)
 
     parser = configparser.ConfigParser()
     parser.read(consts.CONF_SAMPLE_FILE)
@@ -235,11 +236,11 @@ def _prepare_env_daemon(task_id):
 
 
 def _create_directories():
 
 
 def _create_directories():
-    yardstick_utils.makedirs(consts.CONF_DIR)
+    common_utils.makedirs(consts.CONF_DIR)
 
 
 def _source_file(rc_file):
 
 
 def _source_file(rc_file):
-    yardstick_utils.source_env(rc_file)
+    common_utils.source_env(rc_file)
 
 
 def _get_remote_rc_file(rc_file, installer_ip, installer_type):
 
 
 def _get_remote_rc_file(rc_file, installer_ip, installer_type):
@@ -312,3 +313,33 @@ def _update_task_error(task_id, error):
     task = async_handler.get_task_by_taskid(task_id)
     async_handler.update_status(task, 2)
     async_handler.update_error(task, error)
     task = async_handler.get_task_by_taskid(task_id)
     async_handler.update_status(task, 2)
     async_handler.update_error(task, error)
+
+
+def update_openrc(args):
+    try:
+        openrc_vars = args['openrc']
+    except KeyError:
+        return result_handler(consts.API_ERROR, 'openrc must be provided')
+    else:
+        if not isinstance(openrc_vars, collections.Mapping):
+            return result_handler(consts.API_ERROR, 'args should be a dict')
+
+    lines = ['export {}={}\n'.format(k, v) for k, v in openrc_vars.items()]
+    logger.debug('Writing: %s', ''.join(lines))
+
+    logger.info('Writing openrc: Writing')
+    common_utils.makedirs(consts.CONF_DIR)
+
+    with open(consts.OPENRC, 'w') as f:
+        f.writelines(lines)
+    logger.info('Writing openrc: Done')
+
+    logger.info('Source openrc: Sourcing')
+    try:
+        _source_file(consts.OPENRC)
+    except Exception as e:
+        logger.exception('Failed to source openrc')
+        return result_handler(consts.API_ERROR, str(e))
+    logger.info('Source openrc: Done')
+
+    return result_handler(consts.API_SUCCESS, {'openrc': openrc_vars})
index cb98c35..4d65aff 100644 (file)
@@ -77,6 +77,9 @@ DOCKER_URL = 'unix://var/run/docker.sock'
 INSTALLERS = ['apex', 'compass', 'fuel', 'joid']
 SQLITE = 'sqlite:////tmp/yardstick.db'
 
 INSTALLERS = ['apex', 'compass', 'fuel', 'joid']
 SQLITE = 'sqlite:////tmp/yardstick.db'
 
+API_SUCCESS = 1
+API_ERROR = 2
+
 BASE_URL = 'http://localhost:5000'
 ENV_ACTION_API = BASE_URL + '/yardstick/env/action'
 ASYNC_TASK_API = BASE_URL + '/yardstick/asynctask'
 BASE_URL = 'http://localhost:5000'
 ENV_ACTION_API = BASE_URL + '/yardstick/env/action'
 ASYNC_TASK_API = BASE_URL + '/yardstick/asynctask'