test/automated-robot-suite/Config/config.py
Jose Perez Carranza 4ee20f9e40 [robot] Add configs and environment setup
Enable different configurations and setup requirements for deployment
environments as well as pip requirements.

- Config : Serie of configuration files to be used on deployment
        as well as exposed to the framework in order to use the values
        on the test cases.
- Qemu : All artifacts needed to deploy the virtual
        machines that simulate the nodes on libvirt/qemu
- Baremetal : Series of configuration files used
        to setup a deployment on a baremetal environment
- requirements.txt, test-requirements.txt : series of packages needed by
            the suite to work on a python virtualenv.

Depends-On: I796dcaf71089424dd37a050691fd0ee003ad3176
Change-Id: I34dfe1c01b27e5e8ce046de3305dd78c7f9d1383
Signed-off-by: Jose Perez Carranza <jose.perez.carranza@intel.com>
2019-08-21 14:44:51 +00:00

145 lines
4.8 KiB
Python

"""Config file parser and config file generator.
Configuration values will be read from a file called <CONFIG_FILE>.
A config file with default values can be generated by running this module as a
script and using the --generate option.
The config file is a standard INI file that contains [sections] and options.
Variables that are between %(option)s are interpolated automatically by the
ConfigParser (with the caveat that they have to be in the same section).
Variables that are between ${section:option} will be interpolated with the
value from the appropriate section (similar to the way ConfigParse from
Python3 works).
Example of a config file:
E.g.
[Section1]
key_1 = value 1
key_2 = value 2
country = mexico
[section2]
name = John
lastname = Doe
fullname = %(name)s %(lastname)s
country = ${Section1:country}
To access config values from other modules follow this approach:
import Config.config as CONF
full_name = CONF.get('section2', 'fullname')
"""
from __future__ import print_function
import argparse
import configparser
import os
import re
CONFIG_FILE = os.path.join(os.path.dirname(__file__), 'config.ini')
CONFIG = configparser.SafeConfigParser()
def get(section, option, raw=False, variables=None):
"""Wrapper function to mimic behavior of ConfigParse (Python3).
Python3 uses a ConfigParse that is different than the Python2 ConfigParser,
it has some additional functionality. One of the biggest differences is
that with ConfigParse you can interpolate variables from one section into
another section of the config file. This functionality is not included in
the ConfigParse. Since it is very useful, this function wraps the original
get function from ConfigParser so it includes the missing interpolation.
:param section: the section where the option to be gotten is
:param option: the option to look for in the config file
:param raw: all the '%' interpolations are expanded in the return values,
unless the raw argument is true.
:param variables: the option is looked up in variables (if provided)
:return: the specified value from the config file
"""
# ensure file readed is up to date always
CONFIG.read(CONFIG_FILE)
original_option = CONFIG.get(section, option, raw=raw, vars=variables)
# find all matches that have the following pattern: ${something}
matches = re.findall(r'\$\{(.*?)\}', original_option)
new_value = original_option
for match in matches:
# interpolate matches found with ${something} with the referenced
# option from the appropriate section
pattern = '${' + match + '}'
value = match.split(':')
foreign_value = CONFIG.get(value[0], value[1])
new_value = new_value.replace(pattern, foreign_value)
if original_option != new_value:
CONFIG.set(section, option, new_value)
# return the interpolated value
return CONFIG.get(section, option, raw=raw, vars=variables)
def getint(section, option):
"""Wrapper that returns the value as an integer.
:param section: the section where the option to be gotten is
:param option: the option to look for in the config file
:return: the specified value from the config file
"""
return int(CONFIG.get(section, option))
def getfloat(section, option):
"""Wrapper that returns the value as a float.
:param section: the section where the option to be gotten is
:param option: the option to look for in the config file
:return: the specified value from the config file
"""
return float(CONFIG.get(section, option))
def getboolean(section, option):
"""Wrapper that returns the value as a boolean.
:param section: the section where the option to be gotten is
:param option: the option to look for in the config file
:return: the specified value from the config file
"""
value = CONFIG.get(section, option)
return value.lower() == 'true'
def _unload_current_values():
"""Removes current sections from the existing config object"""
for section in CONFIG.sections():
CONFIG.remove_section(section)
def create_config():
"""Creates the config file in the current directory"""
if os.path.isfile(CONFIG_FILE):
os.remove(CONFIG_FILE)
with open(CONFIG_FILE, 'wb') as configfile:
_unload_current_values()
CONFIG.write(configfile)
def parse_arguments():
"""Parses arguments from the command line"""
parser = argparse.ArgumentParser(
description='Config file generator')
parser.add_argument(
'--generate', action='store_true',
help='Generates a config file with default values')
return parser.parse_args()
if __name__ == '__main__':
ARGUMENTS = parse_arguments()
if ARGUMENTS.generate:
create_config()
print('Config file created at: {name}'.format(name=CONFIG_FILE))