diff --git a/fuelclient/client.py b/fuelclient/client.py index 7c14b5c..533d8b4 100644 --- a/fuelclient/client.py +++ b/fuelclient/client.py @@ -14,14 +14,14 @@ import json import logging -import os import requests +from keystoneclient.v2_0 import client as auth_client +from six.moves.urllib import parse as urlparse import yaml -from keystoneclient.v2_0 import client as auth_client - from fuelclient.cli.error import exceptions_decorator +from fuelclient import fuelclient_settings from fuelclient.logs import NullHandler @@ -36,28 +36,17 @@ class Client(object): """ def __init__(self): + conf = fuelclient_settings.get_settings() + self.debug = False - path_to_config = "/etc/fuel/client/config.yaml" - defaults = { - "SERVER_ADDRESS": "127.0.0.1", - "LISTEN_PORT": "8000", - "KEYSTONE_USER": "admin", - "KEYSTONE_PASS": "admin", - } - if os.access(path_to_config, os.R_OK): - with open(path_to_config, "r") as fh: - config = yaml.load(fh.read()) - defaults.update(config) - defaults.update(os.environ) - self.root = "http://{SERVER_ADDRESS}:{LISTEN_PORT}".format(**defaults) - self.keystone_base = ( - "http://{SERVER_ADDRESS}:{LISTEN_PORT}/keystone/v2.0" - .format(**defaults) - ) - self.api_root = self.root + "/api/v1/" - self.ostf_root = self.root + "/ostf/" - self.user = defaults["KEYSTONE_USER"] - self.password = defaults["KEYSTONE_PASS"] + self.root = "http://{server}:{port}".format(server=conf.SERVER_ADDRESS, + port=conf.LISTEN_PORT) + + self.keystone_base = urlparse.urljoin(self.root, "/keystone/v2.0") + self.api_root = urlparse.urljoin(self.root, "/api/v1/") + self.ostf_root = urlparse.urljoin(self.root, "/ostf/") + self.user = conf.KEYSTONE_USER + self.password = conf.KEYSTONE_PASS self._keystone_client = None self._auth_required = None diff --git a/fuelclient/fuelclient_settings.py b/fuelclient/fuelclient_settings.py index 56aecdf..5cb10dc 100644 --- a/fuelclient/fuelclient_settings.py +++ b/fuelclient/fuelclient_settings.py @@ -15,7 +15,9 @@ # under the License. import os +import sys +import six import yaml from fuelclient.cli import error @@ -28,14 +30,15 @@ class FuelClientSettings(object): """Represents a model of Fuel Clients settings Default settigs file are distributed with the source code in - the /fuelclient_settings.yaml. + the /fuelclient_settings.yaml. Those settings can be + overriden by /etc/fuel/client/config.yaml file. User-specific settings may be stored in any YAML-formatted file the path to which should be supplied via the FUELCLIENT_CUSTOM_SETTINGS environment variable. Custom settins override the default ones. - NOTE: This is not to be confused with the API client settings which - requires a different configuration file. + Top level values may also be set as environment variables, e.g. + export SERVER_PORT=8080. """ def __init__(self): @@ -45,12 +48,24 @@ class FuelClientSettings(object): project_path = os.path.dirname(__file__) project_settings_file = os.path.join(project_path, 'fuelclient_settings.yaml') - settings_files.append(project_settings_file) + external_default_settings = '/etc/fuel/client/config.yaml' - # Check whether a user specified a custom settings file - test_config = os.environ.get('FUELCLIENT_CUSTOM_SETTINGS') - if test_config: - settings_files.append(test_config) + # NOTE(romcheg): when external default settings file is removed + # this deprecation warning should be removed as well. + if os.path.exists(external_default_settings): + six.print_('DEPRECATION WARNING: file {0} is found and will be ' + 'used as a source for settings. However, it deprecated ' + 'and will not be used by default in the ongoing ' + 'version of ' + 'python-fuelclient.'.format(external_default_settings), + file=sys.stderr) + + self._add_file_if_exists(project_settings_file, settings_files) + self._add_file_if_exists(external_default_settings, settings_files) + + # Add a custom settings file specified by user + self._add_file_if_exists(os.environ.get('FUELCLIENT_CUSTOM_SETTINGS'), + settings_files) self.config = {} for sf in settings_files: @@ -62,12 +77,23 @@ class FuelClientSettings(object): raise error.SettingsException(msg) + self._update_from_env() + + def _add_file_if_exists(self, path_to_file, file_list): + if path_to_file and os.access(path_to_file, os.R_OK): + file_list.append(path_to_file) + def _update_from_file(self, path): with open(path, 'r') as custom_config: self.config.update( yaml.load(custom_config.read()) ) + def _update_from_env(self): + for k in six.iterkeys(self.config): + if k in os.environ: + self.config[k] = os.environ[k] + def dump(self): return yaml.dump(self.config) diff --git a/fuelclient/fuelclient_settings.yaml b/fuelclient/fuelclient_settings.yaml index 59ab6db..e019188 100644 --- a/fuelclient/fuelclient_settings.yaml +++ b/fuelclient/fuelclient_settings.yaml @@ -1,4 +1,10 @@ -# performance tests settings +# Connection settings +SERVER_ADDRESS: "127.0.0.1" +LISTEN_PORT: "8000" +KEYSTONE_USER: "admin" +KEYSTONE_PASS: "admin" + +# Performance tests settings PERFORMANCE_PROFILING_TESTS: 0 PERF_TESTS_PATHS: perf_tests_base: "/tmp/fuelclient_performance_tests/tests/"