summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerenaFeng <feng.xiaowei@zte.com.cn>2017-05-12 17:02:35 +0800
committerSerenaFeng <feng.xiaowei@zte.com.cn>2017-05-12 17:07:47 +0800
commite401fd7efbf74c7cdc5334c380c79b45ad9271e0 (patch)
treec94c4147b3ee71479abbec8be7165367734a4781
parent909be5b53a6141f84480dc29eb5dbfffe5c35fad (diff)
refactor config parser to facilitate adding new configs
refactor hardcoded config.py to facilitate adding new configurations come along with web portal and Authentication features Change-Id: Ibc16166ade0d6e730bb4c9d81e9b9bc9b297faa1 Signed-off-by: SerenaFeng <feng.xiaowei@zte.com.cn>
-rw-r--r--testapi/opnfv_testapi/cmd/server.py8
-rw-r--r--testapi/opnfv_testapi/common/config.py100
-rw-r--r--testapi/opnfv_testapi/tests/unit/common/test_config.py32
3 files changed, 40 insertions, 100 deletions
diff --git a/testapi/opnfv_testapi/cmd/server.py b/testapi/opnfv_testapi/cmd/server.py
index fa2b722..8b092b8 100644
--- a/testapi/opnfv_testapi/cmd/server.py
+++ b/testapi/opnfv_testapi/cmd/server.py
@@ -48,7 +48,9 @@ def parse_config(argv=[]):
parser.add_argument("-c", "--config-file", dest='config_file',
help="Config file location")
args = parser.parse_args(argv)
- CONF = config.APIConfig().parse(args.config_file)
+ if args.config_file:
+ config.Config.CONFIG = args.config_file
+ CONF = config.Config()
def get_db():
@@ -60,8 +62,8 @@ def make_app():
return swagger.Application(
url_mappings.mappings,
db=get_db(),
- debug=CONF.api_debug_on,
- auth=CONF.api_authenticate_on
+ debug=CONF.api_debug,
+ auth=CONF.api_authenticate
)
diff --git a/testapi/opnfv_testapi/common/config.py b/testapi/opnfv_testapi/common/config.py
index 362fca6..70d7bd6 100644
--- a/testapi/opnfv_testapi/common/config.py
+++ b/testapi/opnfv_testapi/common/config.py
@@ -11,83 +11,41 @@ import ConfigParser
import os
-class ParseError(Exception):
- """
- Custom exception class for config file
- """
-
- def __init__(self, message):
- self.msg = message
-
- def __str__(self):
- return 'error parsing config file : %s' % self.msg
-
-
-class APIConfig(object):
- """
- The purpose of this class is to load values correctly from the config file.
- Each key is declared as an attribute in __init__() and linked in parse()
- """
+class Config(object):
+ CONFIG = None
def __init__(self):
- self._set_default_config()
- self.mongo_url = None
- self.mongo_dbname = None
- self.api_port = None
- self.api_debug_on = None
- self.api_authenticate_on = None
- self._parser = None
- self.swagger_base_url = None
+ self.file = self.CONFIG if self.CONFIG else self._default_config()
+ self._parse()
- def _set_default_config(self):
- venv = os.getenv('VIRTUAL_ENV')
- self._default_config = os.path.join('/' if not venv else venv,
- 'etc/opnfv_testapi/config.ini')
+ def _parse(self):
+ if not os.path.exists(self.file):
+ raise Exception("%s not found" % self.file)
- def _get_parameter(self, section, param):
- try:
- return self._parser.get(section, param)
- except ConfigParser.NoOptionError:
- raise ParseError("No parameter: [%s.%s]" % (section, param))
-
- def _get_int_parameter(self, section, param):
- try:
- return int(self._get_parameter(section, param))
- except ValueError:
- raise ParseError("Not int: [%s.%s]" % (section, param))
+ config = ConfigParser.RawConfigParser()
+ config.read(self.file)
+ self._parse_section(config)
- def _get_bool_parameter(self, section, param):
- result = self._get_parameter(section, param)
- if str(result).lower() == 'true':
- return True
- if str(result).lower() == 'false':
- return False
+ def _parse_section(self, config):
+ [self._parse_item(config, section) for section in (config.sections())]
- raise ParseError(
- "Not boolean: [%s.%s : %s]" % (section, param, result))
+ def _parse_item(self, config, section):
+ [setattr(self, '{}_{}'.format(section, k), self._parse_value(v))
+ for k, v in config.items(section)]
@staticmethod
- def parse(config_location=None):
- obj = APIConfig()
-
- if config_location is None:
- config_location = obj._default_config
-
- if not os.path.exists(config_location):
- raise ParseError("%s not found" % config_location)
-
- obj._parser = ConfigParser.SafeConfigParser()
- obj._parser.read(config_location)
-
- # Linking attributes to keys from file with their sections
- obj.mongo_url = obj._get_parameter("mongo", "url")
- obj.mongo_dbname = obj._get_parameter("mongo", "dbname")
-
- obj.api_port = obj._get_int_parameter("api", "port")
- obj.api_debug_on = obj._get_bool_parameter("api", "debug")
- obj.api_authenticate_on = obj._get_bool_parameter("api",
- "authenticate")
-
- obj.swagger_base_url = obj._get_parameter("swagger", "base_url")
+ def _parse_value(value):
+ try:
+ value = int(value)
+ except:
+ if str(value).lower() == 'true':
+ value = True
+ elif str(value).lower() == 'false':
+ value = False
+ return value
- return obj
+ @staticmethod
+ def _default_config():
+ is_venv = os.getenv('VIRTUAL_ENV')
+ return os.path.join('/' if not is_venv else is_venv,
+ 'etc/opnfv_testapi/config.ini')
diff --git a/testapi/opnfv_testapi/tests/unit/common/test_config.py b/testapi/opnfv_testapi/tests/unit/common/test_config.py
index aaff6bb..446b944 100644
--- a/testapi/opnfv_testapi/tests/unit/common/test_config.py
+++ b/testapi/opnfv_testapi/tests/unit/common/test_config.py
@@ -1,36 +1,16 @@
-import ConfigParser
import os
-import pytest
-
from opnfv_testapi.common import config
-@pytest.fixture()
-def config_dir():
- return os.path.dirname(__file__)
-
-
-@pytest.mark.parametrize('exception, config_file, excepted', [
- (config.ParseError, None, '/etc/opnfv_testapi/config.ini not found'),
- (ConfigParser.NoSectionError, 'nosection.ini', 'No section:'),
- (config.ParseError, 'noparam.ini', 'No parameter:'),
- (config.ParseError, 'notint.ini', 'Not int:'),
- (config.ParseError, 'notboolean.ini', 'Not boolean:')])
-def pytest_config_exceptions(config_dir, exception, config_file, excepted):
- file = '{}/{}'.format(config_dir, config_file) if config_file else None
- with pytest.raises(exception) as error:
- config.APIConfig().parse(file)
- assert excepted in str(error.value)
-
-
def test_config_success():
- config_dir = os.path.join(os.path.dirname(__file__),
- '../../../../etc/config.ini')
- conf = config.APIConfig().parse(config_dir)
+ config_file = os.path.join(os.path.dirname(__file__),
+ '../../../../etc/config.ini')
+ config.Config.CONFIG = config_file
+ conf = config.Config()
assert conf.mongo_url == 'mongodb://127.0.0.1:27017/'
assert conf.mongo_dbname == 'test_results_collection'
assert conf.api_port == 8000
- assert conf.api_debug_on is True
- assert conf.api_authenticate_on is False
+ assert conf.api_debug is True
+ assert conf.api_authenticate is False
assert conf.swagger_base_url == 'http://localhost:8000'