File: settings.py

package info (click to toggle)
lqa 20230104~git9be8db8ab65c-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 340 kB
  • sloc: python: 2,237; makefile: 7
file content (145 lines) | stat: -rw-r--r-- 5,875 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
###################################################################################
# LAVA QA tool
# Copyright (C) 2015  Luis Araujo <luis.araujo@collabora.co.uk>

# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.

# This library 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
# Lesser General Public License for more details.

# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  US
###################################################################################

import os
import yaml
import logging
import os.path
try:
    from urllib.parse import urlsplit, urlunsplit
except ImportError:
    from urlparse import urlsplit, urlunsplit
from lqa_api.exit_codes import APPLICATION_ERROR

CONFIG_PATH=os.getenv("HOME") + '/.config/'
LAVA_CONFIG='lqa.yaml'

lqa_logger = logging.getLogger('lqa')

class Settings(object):
    """Initialize settings for command objects.

    :param cmd: The command object to setup
    :param default_config_file: The default configuration file path"""

    def __init__(self):
        pass

    def load_config(self, config_file=None, log_file=None):
        # Set looger
        # Log to file using formatter if --log-file passed, otherwise to stderr
        if log_file:
            hdl = logging.FileHandler(filename=log_file)
            formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s '
                                          '- %(message)s')
            hdl.setFormatter(formatter)
        else:
            hdl = logging.StreamHandler()
        lqa_logger.addHandler(hdl)
        lqa_logger.setLevel(logging.DEBUG)

        # Check for the configuration file and retrieve values
        self.config_file = self.find_config_file(config_file)
        # Set yaml configuration
        try:
            with open(self.config_file) as conf_data:
                self.config = yaml.safe_load(conf_data)
        except EnvironmentError as e:
            lqa_logger.error(e)
            exit(APPLICATION_ERROR)
        except yaml.scanner.ScannerError as e:
            lqa_logger.error(e)
            exit(APPLICATION_ERROR)

        # After loading the configuration file, check the minimum required values
        # and set the rpc_url.
        self.check_config_fields(['user', 'auth-token', 'server'])
        self.rpc_url = self._build_rpc_api_url()

    def find_config_file(self, config_file = None):
        """Find the configuration file.

        It follows the priority:

         1) config file passed e.g. via -c/--config to the cli

         2) LQA_CONFIG_FILE environment variable value if it is set

         3) local 'CONF.yaml' file

         4) global CONF.yaml file from $HOME/.config/

        :param config: Optional override of the default

        :returns: The found and available configuration file in the system
        """
        default_config_path = os.path.join(CONFIG_PATH, LAVA_CONFIG)
        lqa_config_file = os.getenv("LQA_CONFIG_FILE")
        if config_file:
            if not os.path.isfile(config_file):
                lqa_logger.error("Configuration file '{}' not found"
                                 .format(config_file))
                exit(APPLICATION_ERROR)
        elif lqa_config_file:
            config_file = lqa_config_file
        elif os.path.isfile(os.path.join(os.getcwd(), LAVA_CONFIG)):
            config_file = os.path.join(os.getcwd(), LAVA_CONFIG)
        elif os.path.isfile(default_config_path):
            config_file = default_config_path
        else:
            # No config file?.. exit
            lqa_logger.error("Configuration file '{}' not found. Or use the "
                             "-c/--config flag to specify a different file"
                             .format(default_config_path))
            exit(APPLICATION_ERROR)
        return config_file

    def check_config_fields(self, config_fields):
        """Check that the configuration file has the required fields to proceed"""
        # Make sure config exists since it can be None if no yaml 
        # fields are defined.
        if self.config:
            for field in config_fields:
                if field not in self.config:
                    lqa_logger.error("Required field '{}' not found in "
                                     "configuration file {}"
                                     .format(field, self.config_file))
                    exit(APPLICATION_ERROR)
        else:
            lqa_logger.error("No configuration fields available in file {}"
                             .format(self.config_file))
            exit(APPLICATION_ERROR)

    def _build_rpc_api_url(self):
        (scheme, netloc, _, _, _) = urlsplit(self.config['server'])
        if not scheme or not netloc:
            lqa_logger.error("The syntax '{}' for server field is not valid at {}"
                             .format(self.config['server'],
                                     self.config_file))
            lqa_logger.error("Please use the form '[scheme]://[address]/' for the "
                             "server field")
            exit(APPLICATION_ERROR)

        return urlunsplit((scheme,
                           "{}:{}@{}".format(self.config['user'],
                                             self.config['auth-token'],
                                             netloc),
                           'RPC2', '', ''))

settings = Settings()