ara/ara/config.py

172 lines
6.9 KiB
Python

# Copyright (c) 2017 Red Hat, Inc.
#
# This file is part of ARA: Ansible Run Analysis.
#
# ARA is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ARA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ARA. If not, see <http://www.gnu.org/licenses/>.
import os
import xstatic.main
import xstatic.pkg.bootstrap_scss
import xstatic.pkg.datatables
import xstatic.pkg.jquery
import xstatic.pkg.patternfly
import xstatic.pkg.patternfly_bootstrap_treeview
from ansible import __version__ as ansible_version
from ansible.constants import get_config
try:
from ansible.constants import load_config_file
except ImportError:
# Ansible 2.4 no longer provides load_config_file, this is handled further
# down
from ansible.config.manager import find_ini_config_file
# Also, don't scream deprecated things at us
import ansible.constants
ansible.constants._deprecated = lambda *args: None
from distutils.version import LooseVersion
from six.moves import configparser
def _ara_config(config, key, env_var, default=None, section='ara',
value_type=None):
"""
Wrapper around Ansible's get_config backward/forward compatibility
"""
if default is None:
try:
# We're using env_var as keys in the DEFAULTS dict
default = DEFAULTS.get(env_var)
except KeyError as e:
msg = 'There is no default value for {0}: {1}'.format(key, str(e))
raise KeyError(msg)
# >= 2.3.0.0 (NOTE: Ansible trunk versioning scheme has 3 digits, not 4)
if LooseVersion(ansible_version) >= LooseVersion('2.3.0'):
return get_config(config, section, key, env_var, default,
value_type=value_type)
# < 2.3.0.0 compatibility
if value_type is None:
return get_config(config, section, key, env_var, default)
args = {
'boolean': dict(boolean=True),
'integer': dict(integer=True),
'list': dict(islist=True),
'tmppath': dict(istmppath=True)
}
return get_config(config, section, key, env_var, default,
**args[value_type])
DEFAULTS = {
'ARA_AUTOCREATE_DATABASE': True,
'ARA_DIR': os.path.expanduser('~/.ara'),
'ARA_ENABLE_DEBUG_VIEW': False,
'ARA_HOST': '127.0.0.1',
'ARA_IGNORE_EMPTY_GENERATION': True,
'ARA_IGNORE_MIMETYPE_WARNINGS': True,
'ARA_IGNORE_PARAMETERS': ['extra_vars'],
'ARA_LOG_CONFIG': None,
'ARA_LOG_FORMAT': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
'ARA_LOG_LEVEL': 'INFO',
'ARA_PATH_MAX': 40,
'ARA_PLAYBOOK_OVERRIDE': None,
'ARA_PLAYBOOK_PER_PAGE': 10,
'ARA_PORT': '9191',
'ARA_RESULT_PER_PAGE': 25,
'ARA_SQL_DEBUG': False,
'ARA_TMP_DIR': os.path.expanduser('~/.ansible/tmp')
}
# Bootstrap Ansible configuration
# Ansible >=2.4 takes care of loading the configuration file itself
if LooseVersion(ansible_version) < LooseVersion('2.4.0'):
config, path = load_config_file()
else:
path = find_ini_config_file()
config = configparser.ConfigParser()
if path is not None:
config.read(path)
# Some defaults need to be based on top of a "processed" ARA_DIR
ARA_DIR = _ara_config(config, 'dir', 'ARA_DIR')
database_path = os.path.join(ARA_DIR, 'ansible.sqlite')
DEFAULTS.update({
'ARA_LOG_FILE': os.path.join(ARA_DIR, 'ara.log'),
'ARA_DATABASE': 'sqlite:///{}'.format(database_path)
})
ARA_AUTOCREATE_DATABASE = _ara_config(config, 'autocreate_database',
'ARA_AUTOCREATE_DATABASE',
value_type='boolean')
ARA_ENABLE_DEBUG_VIEW = _ara_config(config, 'enable_debug_view',
'ARA_ENABLE_DEBUG_VIEW',
value_type='boolean')
ARA_HOST = _ara_config(config, 'host', 'ARA_HOST')
ARA_IGNORE_PARAMETERS = _ara_config(config, 'ignore_parameters',
'ARA_IGNORE_PARAMETERS',
value_type='list')
ARA_LOG_CONFIG = _ara_config(config, 'logconfig', 'ARA_LOG_CONFIG')
ARA_LOG_FILE = _ara_config(config, 'logfile', 'ARA_LOG_FILE')
ARA_LOG_FORMAT = _ara_config(config, 'logformat', 'ARA_LOG_FORMAT')
ARA_LOG_LEVEL = _ara_config(config, 'loglevel', 'ARA_LOG_LEVEL')
ARA_PLAYBOOK_OVERRIDE = _ara_config(config, 'playbook_override',
'ARA_PLAYBOOK_OVERRIDE',
value_type='list')
ARA_PLAYBOOK_PER_PAGE = _ara_config(config, 'playbook_per_page',
'ARA_PLAYBOOK_PER_PAGE',
value_type='integer')
ARA_PORT = _ara_config(config, 'port', 'ARA_PORT')
ARA_RESULT_PER_PAGE = _ara_config(config, 'result_per_page',
'ARA_RESULT_PER_PAGE',
value_type='integer')
ARA_TMP_DIR = _ara_config(config, 'local_tmp', 'ANSIBLE_LOCAL_TEMP',
default=DEFAULTS['ARA_TMP_DIR'],
section='defaults',
value_type='tmppath')
# Static generation with flask-frozen
ARA_IGNORE_EMPTY_GENERATION = _ara_config(config,
'ignore_empty_generation',
'ARA_IGNORE_EMPTY_GENERATION',
value_type='boolean')
FREEZER_DEFAULT_MIMETYPE = 'text/html'
FREEZER_IGNORE_MIMETYPE_WARNINGS = _ara_config(config,
'ignore_mimetype_warnings',
'ARA_IGNORE_MIMETYPE_WARNINGS',
value_type='boolean')
FREEZER_RELATIVE_URLS = True
FREEZER_IGNORE_404_NOT_FOUND = True
# SQLAlchemy/Alembic settings
SQLALCHEMY_DATABASE_URI = _ara_config(config, 'database', 'ARA_DATABASE')
SQLALCHEMY_ECHO = _ara_config(config, 'sqldebug',
'ARA_SQL_DEBUG',
value_type='boolean')
SQLALCHEMY_TRACK_MODIFICATIONS = False
INSTALL_PATH = os.path.dirname(os.path.realpath(__file__))
DB_MIGRATIONS = os.path.join(INSTALL_PATH, 'db')
# Xstatic configuration
treeview = xstatic.pkg.patternfly_bootstrap_treeview
XSTATIC = dict(
bootstrap=xstatic.main.XStatic(xstatic.pkg.bootstrap_scss).base_dir,
datatables=xstatic.main.XStatic(xstatic.pkg.datatables).base_dir,
jquery=xstatic.main.XStatic(xstatic.pkg.jquery).base_dir,
patternfly=xstatic.main.XStatic(xstatic.pkg.patternfly).base_dir,
patternfly_bootstrap_treeview=xstatic.main.XStatic(treeview).base_dir,
)