Add API to upload pod.yaml file
[yardstick.git] / api / resources / env_action.py
index f6f43e5..3536559 100644 (file)
@@ -16,6 +16,8 @@ import threading
 import time
 import uuid
 import glob
+import yaml
+import collections
 
 from six.moves import configparser
 from oslo_serialization import jsonutils
@@ -25,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 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
 
@@ -98,7 +100,9 @@ def _create_data_source():
 def _create_grafana_container(client):
     ports = [3000]
     port_bindings = {k: k for k in ports}
-    host_config = client.create_host_config(port_bindings=port_bindings)
+    restart_policy = {"MaximumRetryCount": 0, "Name": "always"}
+    host_config = client.create_host_config(port_bindings=port_bindings,
+                                            restart_policy=restart_policy)
 
     container = client.create_container(image='%s:%s' % (consts.GRAFANA_IMAGE,
                                                          consts.GRAFANA_TAG),
@@ -150,7 +154,9 @@ def _create_influxdb_container(client):
 
     ports = [8083, 8086]
     port_bindings = {k: k for k in ports}
-    host_config = client.create_host_config(port_bindings=port_bindings)
+    restart_policy = {"MaximumRetryCount": 0, "Name": "always"}
+    host_config = client.create_host_config(port_bindings=port_bindings,
+                                            restart_policy=restart_policy)
 
     container = client.create_container(image='%s:%s' % (consts.INFLUXDB_IMAGE,
                                                          consts.INFLUXDB_TAG),
@@ -174,7 +180,7 @@ def _config_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)
@@ -199,30 +205,25 @@ def prepareYardstickEnv(args):
 def _already_source_openrc():
     """Check if openrc is sourced already"""
     return all(os.environ.get(k) for k in ['OS_AUTH_URL', 'OS_USERNAME',
-                                           'OS_PASSWORD', 'OS_TENANT_NAME',
-                                           'EXTERNAL_NETWORK'])
+                                           'OS_PASSWORD', 'EXTERNAL_NETWORK'])
 
 
 def _prepare_env_daemon(task_id):
     _create_task(task_id)
 
-    installer_ip = os.environ.get('INSTALLER_IP', 'undefined')
-    installer_type = os.environ.get('INSTALLER_TYPE', 'undefined')
-
     try:
-        _check_variables(installer_ip, installer_type)
-
         _create_directories()
 
         rc_file = consts.OPENRC
 
         if not _already_source_openrc():
-            _get_remote_rc_file(rc_file, installer_ip, installer_type)
+            if not os.path.exists(rc_file):
+                installer_ip = os.environ.get('INSTALLER_IP', '192.168.200.2')
+                installer_type = os.environ.get('INSTALLER_TYPE', 'compass')
+                _get_remote_rc_file(rc_file, installer_ip, installer_type)
+                _source_file(rc_file)
+                _append_external_network(rc_file)
             _source_file(rc_file)
-            _append_external_network(rc_file)
-
-        # update the external_network
-        _source_file(rc_file)
 
         _clean_images()
 
@@ -234,23 +235,12 @@ def _prepare_env_daemon(task_id):
         logger.debug('Error: %s', e)
 
 
-def _check_variables(installer_ip, installer_type):
-
-    if installer_ip == 'undefined':
-        raise SystemExit('Missing INSTALLER_IP')
-
-    if installer_type == 'undefined':
-        raise SystemExit('Missing INSTALLER_TYPE')
-    elif installer_type not in consts.INSTALLERS:
-        raise SystemExit('INSTALLER_TYPE is not correct')
-
-
 def _create_directories():
-    yardstick_utils.makedirs(consts.CONF_DIR)
+    common_utils.makedirs(consts.CONF_DIR)
 
 
 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):
@@ -323,3 +313,52 @@ 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)
+
+
+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})
+
+
+def upload_pod_file(args):
+    try:
+        pod_file = args['file']
+    except KeyError:
+        return result_handler(consts.API_ERROR, 'file must be provided')
+
+    logger.info('Checking file')
+    data = yaml.load(pod_file.read())
+    if not isinstance(data, collections.Mapping):
+        return result_handler(consts.API_ERROR, 'invalid yaml file')
+
+    logger.info('Writing file')
+    with open(consts.POD_FILE, 'w') as f:
+        yaml.dump(data, f, default_flow_style=False)
+    logger.info('Writing finished')
+
+    return result_handler(consts.API_SUCCESS, {'pod_info': data})