virtualbmc/virtualbmc/config.py
William Caban 0884014df2 Fix error triggered by reading intergers as string from virtualbmc.conf
Add validation to fix error of "'<' not supported between
instances of 'str' and 'int'" when defining server_response_timeout
value in virtualbmc.conf. The error is trigger because the
config parameters from the configuration file are read as strings
and everything else assume that value is an integer (as the default of 5000).

The patch also include validations for server_spawn_wait and server_port to
check the values are valid integers.

Updates test_config.test_validate for test coverage

Task: 37947
Story: 2007066

Change-Id: Ie4e74585d8e14bd73e5e30b21b4dd7bd7d88f13d
Signed-off-by: William Caban <william.caban@gmail.com>
2020-01-03 12:56:56 -05:00

101 lines
3.0 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import configparser
import os
from virtualbmc import utils
__all__ = ['get_config']
_CONFIG_FILE_PATHS = (
os.environ.get('VIRTUALBMC_CONFIG', ''),
os.path.join(os.path.expanduser('~'), '.vbmc', 'virtualbmc.conf'),
'/etc/virtualbmc/virtualbmc.conf')
CONFIG_FILE = next((x for x in _CONFIG_FILE_PATHS if os.path.exists(x)), '')
CONFIG = None
class VirtualBMCConfig(object):
DEFAULTS = {
'default': {
'show_passwords': 'false',
'config_dir': os.path.join(
os.path.expanduser('~'), '.vbmc'
),
'pid_file': os.path.join(
os.path.expanduser('~'), '.vbmc', 'master.pid'
),
'server_port': 50891,
'server_response_timeout': 5000, # milliseconds
'server_spawn_wait': 3000, # milliseconds
},
'log': {
'logfile': None,
'debug': 'false'
},
'ipmi': {
# Maximum time (in seconds) to wait for the data to come across
'session_timeout': 1
},
}
def initialize(self):
config = configparser.ConfigParser()
config.read(CONFIG_FILE)
self._conf_dict = self._as_dict(config)
self._validate()
def _as_dict(self, config):
conf_dict = self.DEFAULTS
for section in config.sections():
if section not in conf_dict:
conf_dict[section] = {}
for key, val in config.items(section):
conf_dict[section][key] = val
return conf_dict
def _validate(self):
self._conf_dict['log']['debug'] = utils.str2bool(
self._conf_dict['log']['debug'])
self._conf_dict['default']['show_passwords'] = utils.str2bool(
self._conf_dict['default']['show_passwords'])
self._conf_dict['default']['server_port'] = int(
self._conf_dict['default']['server_port'])
self._conf_dict['default']['server_spawn_wait'] = int(
self._conf_dict['default']['server_spawn_wait'])
self._conf_dict['default']['server_response_timeout'] = int(
self._conf_dict['default']['server_response_timeout'])
self._conf_dict['ipmi']['session_timeout'] = int(
self._conf_dict['ipmi']['session_timeout'])
def __getitem__(self, key):
return self._conf_dict[key]
def get_config():
global CONFIG
if CONFIG is None:
CONFIG = VirtualBMCConfig()
CONFIG.initialize()
return CONFIG