Yardstick virtualenv support
[yardstick.git] / yardstick / common / utils.py
index d639fb6..7035f33 100644 (file)
 
 # yardstick comment: this is a modified copy of rally/rally/common/utils.py
 
+from __future__ import absolute_import
+from __future__ import print_function
+
+import errno
+import logging
 import os
+import subprocess
 import sys
+from functools import reduce
+
 import yaml
+from six.moves import configparser
 from oslo_utils import importutils
+from oslo_serialization import jsonutils
 
 import yardstick
 
+logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
+
 
 # Decorator for cli-args
 def cliargs(*args, **kwargs):
@@ -71,23 +84,86 @@ def import_modules_from_package(package):
             try_append_module(module_name, sys.modules)
 
 
-def get_para_from_yaml(file_path, args):
-
-    def func(a, b):
-        if a is None:
-            return None
-        return a.get(b)
-
-    if os.path.exists(file_path):
+def parse_yaml(file_path):
+    try:
         with open(file_path) as f:
             value = yaml.safe_load(f)
-            value = reduce(func, args.split('.'), value)
+    except IOError:
+        return {}
+    except OSError as e:
+        if e.errno != errno.EEXIST:
+            raise
+    else:
+        return value
 
-            if value is None:
-                print 'parameter not found'
-                return None
 
-            return value
-    else:
-        print 'file not exist'
-        return None
+def get_param(key, default=''):
+
+    conf_file = os.environ.get('CONF_FILE', '/etc/yardstick/yardstick.yaml')
+
+    conf = parse_yaml(conf_file)
+    try:
+        return reduce(lambda a, b: a[b], key.split('.'), conf)
+    except KeyError:
+        if not default:
+            raise
+        return default
+
+
+def makedirs(d):
+    try:
+        os.makedirs(d)
+    except OSError as e:
+        if e.errno != errno.EEXIST:
+            raise
+
+
+def execute_command(cmd):
+    exec_msg = "Executing command: '%s'" % cmd
+    logger.debug(exec_msg)
+
+    output = subprocess.check_output(cmd.split()).split(os.linesep)
+
+    return output
+
+
+def source_env(env_file):
+    p = subprocess.Popen(". %s; env" % env_file, stdout=subprocess.PIPE,
+                         shell=True)
+    output = p.communicate()[0]
+    env = dict((line.split('=', 1) for line in output.splitlines()))
+    os.environ.update(env)
+    return env
+
+
+def read_json_from_file(path):
+    with open(path, 'r') as f:
+        j = f.read()
+    # don't use jsonutils.load() it conflicts with already decoded input
+    return jsonutils.loads(j)
+
+
+def write_json_to_file(path, data, mode='w'):
+    with open(path, mode) as f:
+        jsonutils.dump(data, f)
+
+
+def write_file(path, data, mode='w'):
+    with open(path, mode) as f:
+        f.write(data)
+
+
+def parse_ini_file(path):
+    parser = configparser.ConfigParser()
+    parser.read(path)
+
+    try:
+        default = {k: v for k, v in parser.items('DEFAULT')}
+    except configparser.NoSectionError:
+        default = {}
+
+    config = dict(DEFAULT=default,
+                  **{s: {k: v for k, v in parser.items(
+                      s)} for s in parser.sections()})
+
+    return config