From 8ec6f1e7d682a56c122f930febb28da1575b8ff8 Mon Sep 17 00:00:00 2001 From: SerenaFeng Date: Thu, 13 Jul 2017 20:09:10 +0800 Subject: decouple the mutual-dependence of config.py and server.py Currently server.py relies on CONF while starting the service, and config.py's config_fie is set in server.py, which is wrongly bi-depended this patch aims to let Config parse the sys.argv personally, just as oslo.config do, so that decouple the mutual-dependency Change-Id: I46887d122a98d478caebe9eeb7ab038941ce1f6b Signed-off-by: SerenaFeng --- testapi/opnfv_testapi/cmd/server.py | 19 +----------- testapi/opnfv_testapi/common/config.py | 36 ++++++++++++++++------ testapi/opnfv_testapi/resources/result_handlers.py | 4 +-- testapi/opnfv_testapi/router/url_mappings.py | 4 +-- .../opnfv_testapi/tests/unit/common/test_config.py | 27 ++++++++-------- testapi/opnfv_testapi/tests/unit/conftest.py | 8 +++++ .../tests/unit/resources/test_base.py | 19 ++++++------ .../tests/unit/resources/test_result.py | 16 +++++----- .../tests/unit/resources/test_token.py | 2 +- testapi/opnfv_testapi/ui/auth/sign.py | 4 +-- testapi/opnfv_testapi/ui/root.py | 4 +-- 11 files changed, 75 insertions(+), 68 deletions(-) create mode 100644 testapi/opnfv_testapi/tests/unit/conftest.py (limited to 'testapi') diff --git a/testapi/opnfv_testapi/cmd/server.py b/testapi/opnfv_testapi/cmd/server.py index 545d5e3..e640d5f 100644 --- a/testapi/opnfv_testapi/cmd/server.py +++ b/testapi/opnfv_testapi/cmd/server.py @@ -29,29 +29,13 @@ TODOs : """ -import argparse -import sys - import motor import tornado.ioloop -from opnfv_testapi.common import config +from opnfv_testapi.common.config import CONF from opnfv_testapi.router import url_mappings from opnfv_testapi.tornado_swagger import swagger -CONF = None - - -def parse_config(argv=[]): - global CONF - parser = argparse.ArgumentParser() - parser.add_argument("-c", "--config-file", dest='config_file', - help="Config file location") - args = parser.parse_args(argv) - if args.config_file: - config.Config.CONFIG = args.config_file - CONF = config.Config() - def get_db(): return motor.MotorClient(CONF.mongo_url)[CONF.mongo_dbname] @@ -70,7 +54,6 @@ def make_app(): def main(): - parse_config(sys.argv[1:]) application = make_app() application.listen(CONF.api_port) tornado.ioloop.IOLoop.current().start() diff --git a/testapi/opnfv_testapi/common/config.py b/testapi/opnfv_testapi/common/config.py index f73c0ab..4cd53c6 100644 --- a/testapi/opnfv_testapi/common/config.py +++ b/testapi/opnfv_testapi/common/config.py @@ -8,14 +8,16 @@ # feng.xiaowei@zte.com.cn remove prepare_put_request 5-30-2016 ############################################################################## import ConfigParser +import argparse import os +import sys class Config(object): - CONFIG = None def __init__(self): - self.file = self.CONFIG if self.CONFIG else self._default_config() + self.config_file = None + self._set_config_file() self._parse() self._parse_per_page() self.static_path = os.path.join( @@ -24,11 +26,11 @@ class Config(object): 'static') def _parse(self): - if not os.path.exists(self.file): - raise Exception("%s not found" % self.file) + if not os.path.exists(self.config_file): + raise Exception("%s not found" % self.config_file) config = ConfigParser.RawConfigParser() - config.read(self.file) + config.read(self.config_file) self._parse_section(config) def _parse_section(self, config): @@ -53,8 +55,24 @@ class Config(object): value = False return value - @staticmethod - def _default_config(): + def _set_config_file(self): + if not self._set_sys_config_file(): + self._set_default_config_file() + + def _set_sys_config_file(self): + parser = argparse.ArgumentParser() + parser.add_argument("-c", "--config-file", dest='config_file', + help="Config file location", metavar="FILE") + args, _ = parser.parse_known_args(sys.argv) + try: + self.config_file = args.config_file + finally: + return self.config_file is not None + + def _set_default_config_file(self): is_venv = os.getenv('VIRTUAL_ENV') - return os.path.join('/' if not is_venv else is_venv, - 'etc/opnfv_testapi/config.ini') + self.config_file = os.path.join('/' if not is_venv else is_venv, + 'etc/opnfv_testapi/config.ini') + + +CONF = Config() diff --git a/testapi/opnfv_testapi/resources/result_handlers.py b/testapi/opnfv_testapi/resources/result_handlers.py index 5eb1b92..1ccafd5 100644 --- a/testapi/opnfv_testapi/resources/result_handlers.py +++ b/testapi/opnfv_testapi/resources/result_handlers.py @@ -13,7 +13,7 @@ import json from bson import objectid -from opnfv_testapi.common import config +from opnfv_testapi.common.config import CONF from opnfv_testapi.common import message from opnfv_testapi.common import raises from opnfv_testapi.resources import handlers @@ -21,8 +21,6 @@ from opnfv_testapi.resources import result_models from opnfv_testapi.tornado_swagger import swagger from opnfv_testapi.ui.auth import constants as auth_const -CONF = config.Config() - class GenericResultHandler(handlers.GenericApiHandler): def __init__(self, application, request, **kwargs): diff --git a/testapi/opnfv_testapi/router/url_mappings.py b/testapi/opnfv_testapi/router/url_mappings.py index 37e719b..562fa5e 100644 --- a/testapi/opnfv_testapi/router/url_mappings.py +++ b/testapi/opnfv_testapi/router/url_mappings.py @@ -8,7 +8,7 @@ ############################################################################## import tornado.web -from opnfv_testapi.common import config +from opnfv_testapi.common.config import CONF from opnfv_testapi.resources import handlers from opnfv_testapi.resources import pod_handlers from opnfv_testapi.resources import project_handlers @@ -58,7 +58,7 @@ mappings = [ # static path (r'/(.*\.(css|png|gif|js|html|json|map|woff2|woff|ttf))', tornado.web.StaticFileHandler, - {'path': config.Config().static_path}), + {'path': CONF.static_path}), (r'/', root.RootHandler), (r'/api/v1/auth/signin', sign.SigninHandler), diff --git a/testapi/opnfv_testapi/tests/unit/common/test_config.py b/testapi/opnfv_testapi/tests/unit/common/test_config.py index 446b944..cc8743c 100644 --- a/testapi/opnfv_testapi/tests/unit/common/test_config.py +++ b/testapi/opnfv_testapi/tests/unit/common/test_config.py @@ -1,16 +1,15 @@ -import os +import argparse -from opnfv_testapi.common import config - -def test_config_success(): - 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 is True - assert conf.api_authenticate is False - assert conf.swagger_base_url == 'http://localhost:8000' +def test_config_normal(mocker, config_normal): + mocker.patch( + 'argparse.ArgumentParser.parse_known_args', + return_value=(argparse.Namespace(config_file=config_normal), None)) + from opnfv_testapi.common import config + 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 is True + assert CONF.api_authenticate is False + assert CONF.swagger_base_url == 'http://localhost:8000' diff --git a/testapi/opnfv_testapi/tests/unit/conftest.py b/testapi/opnfv_testapi/tests/unit/conftest.py new file mode 100644 index 0000000..feff1da --- /dev/null +++ b/testapi/opnfv_testapi/tests/unit/conftest.py @@ -0,0 +1,8 @@ +from os import path + +import pytest + + +@pytest.fixture +def config_normal(): + return path.join(path.dirname(__file__), 'common/normal.ini') diff --git a/testapi/opnfv_testapi/tests/unit/resources/test_base.py b/testapi/opnfv_testapi/tests/unit/resources/test_base.py index 6e4d454..67831f5 100644 --- a/testapi/opnfv_testapi/tests/unit/resources/test_base.py +++ b/testapi/opnfv_testapi/tests/unit/resources/test_base.py @@ -12,13 +12,9 @@ from os import path import mock from tornado import testing -from opnfv_testapi.common import config from opnfv_testapi.resources import models from opnfv_testapi.tests.unit import fake_pymongo -config.Config.CONFIG = path.join(path.dirname(__file__), - '../../../../etc/config.ini') - class TestBase(testing.AsyncHTTPTestCase): headers = {'Content-Type': 'application/json; charset=UTF-8'} @@ -37,17 +33,22 @@ class TestBase(testing.AsyncHTTPTestCase): def tearDown(self): self.db_patcher.stop() + self.config_patcher.stop() def _patch_server(self): - from opnfv_testapi.cmd import server - server.parse_config([ - '--config-file', - path.join(path.dirname(__file__), path.pardir, 'common/normal.ini') - ]) + import argparse + config = path.join(path.dirname(__file__), '../common/normal.ini') + self.config_patcher = mock.patch( + 'argparse.ArgumentParser.parse_known_args', + return_value=(argparse.Namespace(config_file=config), None)) self.db_patcher = mock.patch('opnfv_testapi.cmd.server.get_db', self._fake_pymongo) + self.config_patcher.start() self.db_patcher.start() + def set_config_file(self): + self.config_file = 'normal.ini' + @staticmethod def _fake_pymongo(): return fake_pymongo diff --git a/testapi/opnfv_testapi/tests/unit/resources/test_result.py b/testapi/opnfv_testapi/tests/unit/resources/test_result.py index f199bc7..1e83ed3 100644 --- a/testapi/opnfv_testapi/tests/unit/resources/test_result.py +++ b/testapi/opnfv_testapi/tests/unit/resources/test_result.py @@ -61,9 +61,9 @@ class TestResultBase(base.TestBase): self.scenario = 'odl-l2' self.criteria = 'passed' self.trust_indicator = result_models.TI(0.7) - self.start_date = "2016-05-23 07:16:09.477097" - self.stop_date = "2016-05-23 07:16:19.477097" - self.update_date = "2016-05-24 07:16:19.477097" + self.start_date = str(datetime.now()) + self.stop_date = str(datetime.now() + timedelta(minutes=1)) + self.update_date = str(datetime.now() + timedelta(days=1)) self.update_step = -0.05 super(TestResultBase, self).setUp() self.details = Details(timestart='0', duration='9s', status='OK') @@ -275,7 +275,7 @@ class TestResultGet(TestResultBase): @executor.query(httplib.OK, '_query_period_one', 1) def test_queryPeriodSuccess(self): - return self._set_query('period=11') + return self._set_query('period=5') @executor.query(httplib.BAD_REQUEST, message.must_int('last')) def test_queryLastNotInt(self): @@ -306,7 +306,7 @@ class TestResultGet(TestResultBase): 'scenario', 'trust_indicator', 'criteria', - 'period=11') + 'period=5') @executor.query(httplib.OK, '_query_success', 0) def test_notFound(self): @@ -324,10 +324,10 @@ class TestResultGet(TestResultBase): @executor.query(httplib.OK, '_query_success', 1) def test_filterErrorStartdate(self): self._create_error_start_date(None) - # self._create_error_start_date('None') + self._create_error_start_date('None') self._create_error_start_date('null') self._create_error_start_date('') - return self._set_query('period=11') + return self._set_query('period=5') def _query_success(self, body, number): self.assertEqual(number, len(body.results)) @@ -338,7 +338,7 @@ class TestResultGet(TestResultBase): def _query_period_one(self, body, number): self.assertEqual(number, len(body.results)) - self.assert_res(body.results[0], self.req_10d_before) + self.assert_res(body.results[0], self.req_d) def _create_error_start_date(self, start_date): req = copy.deepcopy(self.req_d) diff --git a/testapi/opnfv_testapi/tests/unit/resources/test_token.py b/testapi/opnfv_testapi/tests/unit/resources/test_token.py index b4ba887..940e256 100644 --- a/testapi/opnfv_testapi/tests/unit/resources/test_token.py +++ b/testapi/opnfv_testapi/tests/unit/resources/test_token.py @@ -10,7 +10,6 @@ from tornado import web from opnfv_testapi.common import message from opnfv_testapi.resources import project_models -from opnfv_testapi.router import url_mappings from opnfv_testapi.tests.unit import executor from opnfv_testapi.tests.unit import fake_pymongo from opnfv_testapi.tests.unit.resources import test_base as base @@ -18,6 +17,7 @@ from opnfv_testapi.tests.unit.resources import test_base as base class TestToken(base.TestBase): def get_app(self): + from opnfv_testapi.router import url_mappings return web.Application( url_mappings.mappings, db=fake_pymongo, diff --git a/testapi/opnfv_testapi/ui/auth/sign.py b/testapi/opnfv_testapi/ui/auth/sign.py index 5b36225..13762c9 100644 --- a/testapi/opnfv_testapi/ui/auth/sign.py +++ b/testapi/opnfv_testapi/ui/auth/sign.py @@ -3,11 +3,11 @@ from tornado import gen from tornado import web import logging -from opnfv_testapi.common import config +from opnfv_testapi.common.config import CONF from opnfv_testapi.ui.auth import base from opnfv_testapi.ui.auth import constants as const -CONF = config.Config() +# CONF = config.Config() class SigninHandler(base.BaseHandler): diff --git a/testapi/opnfv_testapi/ui/root.py b/testapi/opnfv_testapi/ui/root.py index bba7a86..5b2c922 100644 --- a/testapi/opnfv_testapi/ui/root.py +++ b/testapi/opnfv_testapi/ui/root.py @@ -1,10 +1,10 @@ from opnfv_testapi.resources.handlers import GenericApiHandler -from opnfv_testapi.common import config +from opnfv_testapi.common.config import CONF class RootHandler(GenericApiHandler): def get_template_path(self): - return config.Config().static_path + return CONF.static_path def get(self): self.render('testapi-ui/index.html') -- cgit 1.2.3-korg