diff --git a/conf/config.py b/conf/config.py deleted file mode 100644 index ec83936c..00000000 --- a/conf/config.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -# SPDX-License-Identifier: MIT -from os import environ, path - -# FIXME: workaround for this moment till confdir, dbdir (installdir etc.) are -# declared properly somewhere/somehow -confdir = path.abspath(path.dirname(__file__)) -# use parent dir as dbdir else fallback to current dir -dbdir = path.abspath(path.join(confdir, "..")) if confdir.endswith("conf") else confdir - - -class BaseConfiguration(object): - DEBUG = False - # Make this random (used to generate session keys) - SECRET_KEY = "74d9e9f9cd40e66fc6c4c2e9987dce48df3ce98542529fd0" - SQLALCHEMY_DATABASE_URI = "sqlite:///{0}".format(path.join(dbdir, "module_build_service.db")) - SQLALCHEMY_TRACK_MODIFICATIONS = True - # Where we should run when running "manage.py run" directly. - HOST = "0.0.0.0" - PORT = 5000 - - -class TestConfiguration(BaseConfiguration): - LOG_LEVEL = "debug" - SQLALCHEMY_DATABASE_URI = environ.get( - "DATABASE_URI", "sqlite:///{0}".format(path.join(dbdir, "mbstest.db"))) - DEBUG = True - MESSAGING = "in_memory" - - # Global network-related values, in seconds - NET_TIMEOUT = 3 - NET_RETRY_INTERVAL = 1 - # SCM network-related values, in seconds - SCM_NET_TIMEOUT = 0.1 - SCM_NET_RETRY_INTERVAL = 0.1 - - KOJI_CONFIG = "./conf/koji.conf" - KOJI_PROFILE = "staging" - SERVER_NAME = "localhost" - - KOJI_REPOSITORY_URL = "https://kojipkgs.stg.fedoraproject.org/repos" - SCMURLS = ["https://src.stg.fedoraproject.org/modules/"] - - ALLOWED_GROUPS_TO_IMPORT_MODULE = {"mbs-import-module"} - - # Greenwave configuration - GREENWAVE_URL = "https://greenwave.example.local/api/v1.0/" - GREENWAVE_DECISION_CONTEXT = "test_dec_context" - GREENWAVE_SUBJECT_TYPE = "some-module" - - STREAM_SUFFIXES = {r"^el\d+\.\d+\.\d+\.z$": 0.1} - - # Ensures task.delay executes locally instead of scheduling a task to a queue. - CELERY_TASK_ALWAYS_EAGER = True - - -class ProdConfiguration(BaseConfiguration): - pass - - -class LocalBuildConfiguration(BaseConfiguration): - CACHE_DIR = "~/modulebuild/cache" - LOG_LEVEL = "debug" - MESSAGING = "in_memory" - - ALLOW_CUSTOM_SCMURLS = True - RESOLVER = "mbs" - RPMS_ALLOW_REPOSITORY = True - MODULES_ALLOW_REPOSITORY = True - - # Celery tasks will be executed locally for local builds - CELERY_TASK_ALWAYS_EAGER = True - - -class OfflineLocalBuildConfiguration(LocalBuildConfiguration): - RESOLVER = "local" - - -class DevConfiguration(LocalBuildConfiguration): - DEBUG = True diff --git a/module_build_service/__init__.py b/module_build_service/__init__.py index 2fa61b6a..2c7dbb29 100644 --- a/module_build_service/__init__.py +++ b/module_build_service/__init__.py @@ -43,10 +43,10 @@ except pkg_resources.DistributionNotFound: version = "unknown" api_version = 2 +conf, config_section = init_config() app = Flask(__name__) app.wsgi_app = ReverseProxy(app.wsgi_app) - -conf = init_config(app) +app.config.from_object(config_section) celery_app = Celery("module-build-service") # Convert config names specific for Celery like this: diff --git a/module_build_service/config.py b/module_build_service/config.py index 19866f1f..0e2c14ed 100644 --- a/module_build_service/config.py +++ b/module_build_service/config.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # SPDX-License-Identifier: MIT import imp +import logging import os import pkg_resources import re @@ -10,6 +11,8 @@ import tempfile from six import string_types from module_build_service import logger +# This avoids creating a circular import by importing log from module_build_service +log = logging.getLogger('module_build_service') # TODO: It'd be nice to reuse this from models.ModuleBuild.rebuild_strategies but models.py @@ -24,83 +27,124 @@ SUPPORTED_RESOLVERS = { } -def init_config(app): - """ Configure MBS and the Flask app +class BaseConfiguration(object): + DEBUG = False + SECRET_KEY = os.urandom(16) + SQLALCHEMY_DATABASE_URI = "sqlite:///{0}".format(os.path.join( + os.getcwd(), "module_build_service.db")) + SQLALCHEMY_TRACK_MODIFICATIONS = True + # Where we should run when running "manage.py run" directly. + HOST = "0.0.0.0" + PORT = 5000 + + +class TestConfiguration(BaseConfiguration): + LOG_LEVEL = "debug" + SQLALCHEMY_DATABASE_URI = os.environ.get( + "DATABASE_URI", "sqlite:///{0}".format(os.path.join(os.getcwd(), "mbstest.db"))) + DEBUG = True + MESSAGING = "in_memory" + PDC_URL = "https://pdc.fedoraproject.org/rest_api/v1" + + # Global network-related values, in seconds + NET_TIMEOUT = 3 + NET_RETRY_INTERVAL = 1 + # SCM network-related values, in seconds + SCM_NET_TIMEOUT = 0.1 + SCM_NET_RETRY_INTERVAL = 0.1 + + KOJI_CONFIG = "./conf/koji.conf" + KOJI_PROFILE = "staging" + SERVER_NAME = "localhost" + + KOJI_REPOSITORY_URL = "https://kojipkgs.stg.fedoraproject.org/repos" + SCMURLS = ["https://src.stg.fedoraproject.org/modules/"] + + ALLOWED_GROUPS_TO_IMPORT_MODULE = {"mbs-import-module"} + + # Greenwave configuration + GREENWAVE_URL = "https://greenwave.example.local/api/v1.0/" + GREENWAVE_DECISION_CONTEXT = "test_dec_context" + GREENWAVE_SUBJECT_TYPE = "some-module" + + STREAM_SUFFIXES = {r"^el\d+\.\d+\.\d+\.z$": 0.1} + + # Ensures task.delay executes locally instead of scheduling a task to a queue. + CELERY_TASK_ALWAYS_EAGER = True + + +class ProdConfiguration(BaseConfiguration): + pass + + +class LocalBuildConfiguration(BaseConfiguration): + CACHE_DIR = "~/modulebuild/cache" + LOG_LEVEL = "debug" + MESSAGING = "in_memory" + + ALLOW_CUSTOM_SCMURLS = True + RESOLVER = "mbs" + RPMS_ALLOW_REPOSITORY = True + MODULES_ALLOW_REPOSITORY = True + + # Celery tasks will be executed locally for local builds + CELERY_TASK_ALWAYS_EAGER = True + + +class OfflineLocalBuildConfiguration(LocalBuildConfiguration): + RESOLVER = "local" + + +class DevConfiguration(LocalBuildConfiguration): + DEBUG = True + + +def init_config(): """ - config_module = None - config_file = "/etc/module-build-service/config.py" - config_section = "DevConfiguration" + Create the global MBS configuration. - # automagically detect production environment: - # - existing and readable config_file presets ProdConfiguration + :return: a tuple with the first index being the configuration and second index as the + configuration class that was used to initialize the configuration. This can be useful + to configure Flask with. + :rtype: tuple(Config, object) + """ + config_file = os.environ.get("MBS_CONFIG_FILE", "/etc/module-build-service/config.py") + config_section = os.environ.get("MBS_CONFIG_SECTION", "ProdConfiguration") try: - with open(config_file): - config_section = "ProdConfiguration" + config_module = imp.load_source("mbs_runtime_config", config_file) + log.info("Using the configuration file at %s", config_file) except Exception: - pass - # - Flask app within mod_wsgi presets ProdConfiguration - flask_app_env = hasattr(app, "request") and hasattr(app.request, "environ") - if flask_app_env and any([var.startswith("mod_wsgi.") for var in app.request.environ]): - config_section = "ProdConfiguration" + log.warning("The configuration file at %s was not present", config_file) + # Default to this file as the configuration module + config_module = sys.modules[__name__] - # Load LocalBuildConfiguration section in case we are building modules - # locally. - if "build_module_locally" in sys.argv: + true_options = ("1", "on", "true", "y", "yes") + if any(["py.test" in arg or "pytest" in arg for arg in sys.argv]): + config_section = "TestConfiguration" + # Get the configuration from this module + config_module = sys.modules[__name__] + elif os.environ.get("MODULE_BUILD_SERVICE_DEVELOPER_ENV", "").lower() in true_options: + config_section = "DevConfiguration" + # Get the configuration from this module + config_module = sys.modules[__name__] + elif "build_module_locally" in sys.argv: if "--offline" in sys.argv: config_section = "OfflineLocalBuildConfiguration" else: config_section = "LocalBuildConfiguration" - # try getting config_file from os.environ - if "MBS_CONFIG_FILE" in os.environ: - config_file = os.environ["MBS_CONFIG_FILE"] - # try getting config_section from os.environ - if "MBS_CONFIG_SECTION" in os.environ: - config_section = os.environ["MBS_CONFIG_SECTION"] - # preferably get these values from Flask app - if flask_app_env: - # try getting config_file from Flask app - if "MBS_CONFIG_FILE" in app.request.environ: - config_file = app.request.environ["MBS_CONFIG_FILE"] - # try getting config_section from Flask app - if "MBS_CONFIG_SECTION" in app.request.environ: - config_section = app.request.environ["MBS_CONFIG_SECTION"] - - true_options = ("1", "on", "true", "y", "yes") - # TestConfiguration shall only be used for running tests, otherwise... - if any(["py.test" in arg or "pytest" in arg for arg in sys.argv]): - config_section = "TestConfiguration" - from conf import config - - config_module = config - # ...MODULE_BUILD_SERVICE_DEVELOPER_ENV has always the last word - # and overrides anything previously set before! - # Again, check Flask app (preferably) or fallback to os.environ. - # In any of the following cases, use configuration directly from MBS package - # -> /conf/config.py. - elif flask_app_env and "MODULE_BUILD_SERVICE_DEVELOPER_ENV" in app.request.environ: - if app.request.environ["MODULE_BUILD_SERVICE_DEVELOPER_ENV"].lower() in true_options: - config_section = "DevConfiguration" - from conf import config - - config_module = config - elif os.environ.get("MODULE_BUILD_SERVICE_DEVELOPER_ENV", "").lower() in true_options: - config_section = "DevConfiguration" - from conf import config - - config_module = config - # try loading configuration from file - if not config_module: - try: - config_module = imp.load_source("mbs_runtime_config", config_file) - except Exception: - raise SystemError("Configuration file {} was not found.".format(config_file)) - - # finally configure MBS and the Flask app - config_section_obj = getattr(config_module, config_section) + if hasattr(config_module, config_section): + log.info("Using the configuration section %s", config_section) + config_section_obj = getattr(config_module, config_section) + else: + log.error( + "The configuration class of %s is not present. Falling back to the default " + "ProdConfiguration class.", + config_section, + ) + config_section_obj = ProdConfiguration conf = Config(config_section_obj) - app.config.from_object(config_section_obj) - return conf + return conf, config_section_obj class Path: diff --git a/module_build_service/manage.py b/module_build_service/manage.py index fe111981..d88dc361 100755 --- a/module_build_service/manage.py +++ b/module_build_service/manage.py @@ -126,7 +126,7 @@ def build_module_locally( if "SERVER_NAME" not in app.config or not app.config["SERVER_NAME"]: app.config["SERVER_NAME"] = "localhost" - if app.config["RESOLVER"] == "db": + if conf.resolver == "db": raise ValueError( "Please set RESOLVER to 'mbs' in your configuration for local builds.") diff --git a/setup.py b/setup.py index 99c2f29c..ef665ce4 100644 --- a/setup.py +++ b/setup.py @@ -66,7 +66,6 @@ setup( "/etc/module-build-service/", [ "conf/cacert.pem", - "conf/config.py", "conf/koji.conf", "conf/mock.cfg", "conf/yum.conf", diff --git a/tests/__init__.py b/tests/__init__.py index ff9235c9..f8b8d062 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -14,7 +14,6 @@ import koji import module_build_service from module_build_service import db from module_build_service.utils import get_rpm_release, import_mmd, mmd_to_str -from module_build_service.config import init_config from module_build_service.models import ( ModuleBuild, ModuleArch, ComponentBuild, VirtualStream, BUILD_STATES, @@ -24,8 +23,6 @@ from module_build_service.db_session import db_session base_dir = os.path.dirname(__file__) -app = module_build_service.app -conf = init_config(app) def staged_data_filename(filename): diff --git a/tests/test_build/test_build.py b/tests/test_build/test_build.py index cdad44c0..42c820b4 100644 --- a/tests/test_build/test_build.py +++ b/tests/test_build/test_build.py @@ -18,7 +18,7 @@ import module_build_service.scheduler.consumer import module_build_service.scheduler.handlers.repos import module_build_service.utils from module_build_service.errors import Forbidden -from module_build_service import models, conf, build_logs, log +from module_build_service import app, models, conf, build_logs, log from module_build_service.db_session import db_session from module_build_service.scheduler import events from module_build_service.scheduler.handlers.tags import tagged as tagged_handler @@ -36,9 +36,7 @@ import itertools from module_build_service.builder import GenericBuilder from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder -from tests import ( - app, clean_database, read_staged_data, staged_data_filename -) +from tests import clean_database, read_staged_data, staged_data_filename base_dir = dirname(dirname(__file__)) diff --git a/tests/test_builder/test_builder_utils.py b/tests/test_builder/test_builder_utils.py index 52a110db..411d4ccc 100644 --- a/tests/test_builder/test_builder_utils.py +++ b/tests/test_builder/test_builder_utils.py @@ -5,8 +5,8 @@ import shutil from mock import patch, Mock, call +from module_build_service import conf from module_build_service.builder import utils -from tests import conf class TestBuilderUtils: diff --git a/tests/test_builder/test_koji.py b/tests/test_builder/test_koji.py index 8921d7b5..c5e631f9 100644 --- a/tests/test_builder/test_koji.py +++ b/tests/test_builder/test_koji.py @@ -13,7 +13,7 @@ from collections import OrderedDict import module_build_service.messaging import module_build_service.scheduler.handlers.repos import module_build_service.models -from module_build_service import Modulemd +from module_build_service import conf, Modulemd from module_build_service.db_session import db_session from module_build_service.builder import GenericBuilder from module_build_service.scheduler import events @@ -22,7 +22,7 @@ from module_build_service.utils.general import mmd_to_str import pytest from mock import patch, MagicMock -from tests import conf, init_data, clean_database, make_module_in_db +from tests import init_data, clean_database, make_module_in_db from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder diff --git a/tests/test_monitor.py b/tests/test_monitor.py index ff9e3228..b0de33bc 100644 --- a/tests/test_monitor.py +++ b/tests/test_monitor.py @@ -1,17 +1,16 @@ # -*- coding: utf-8 -*- # SPDX-License-Identifier: MIT import os + import pytest import requests import mock -import module_build_service.config as mbs_config -import module_build_service.monitor -from module_build_service import models -from module_build_service.db_session import db_session -from conf.config import TestConfiguration - from six.moves import reload_module -from tests import app, init_data, make_module_in_db + +import module_build_service.monitor +from module_build_service import app, conf, models +from module_build_service.db_session import db_session +from tests import init_data, make_module_in_db num_of_metrics = 18 @@ -51,7 +50,6 @@ def test_standalone_metrics_server(): @mock.patch("module_build_service.monitor.builder_failed_counter.labels") @mock.patch("module_build_service.monitor.builder_success_counter.inc") def test_monitor_state_changing_success(succ_cnt, failed_cnt): - conf = mbs_config.Config(TestConfiguration) b = make_module_in_db( "pkg:0.1:1:c1", [ @@ -73,7 +71,6 @@ def test_monitor_state_changing_success(succ_cnt, failed_cnt): @mock.patch("module_build_service.monitor.builder_success_counter.inc") def test_monitor_state_changing_failure(succ_cnt, failed_cnt): failure_type = "user" - conf = mbs_config.Config(TestConfiguration) b = make_module_in_db( "pkg:0.1:1:c1", [ diff --git a/tests/test_resolver/test_db.py b/tests/test_resolver/test_db.py index 7965c429..4258f63f 100644 --- a/tests/test_resolver/test_db.py +++ b/tests/test_resolver/test_db.py @@ -7,7 +7,7 @@ from mock import patch, PropertyMock import pytest import module_build_service.resolver as mbs_resolver -from module_build_service import models, utils, Modulemd +from module_build_service import conf, models, utils, Modulemd from module_build_service.utils import import_mmd, mmd_to_str, load_mmd from module_build_service.models import ModuleBuild from module_build_service.errors import UnprocessableEntity @@ -46,7 +46,7 @@ class TestDBModule: db_session.add(build) db_session.commit() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") result = resolver.get_buildrequired_modulemds( "testmodule", "master", platform_f300103.mmd()) nsvcs = {m.get_nsvc() for m in result} @@ -55,7 +55,7 @@ class TestDBModule: @pytest.mark.parametrize("stream_versions", [False, True]) def test_get_compatible_base_module_modulemds_stream_versions(self, stream_versions): tests.init_data(1, multiple_stream_versions=True) - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") platform = db_session.query(ModuleBuild).filter_by(name="platform", stream="f29.1.0").one() platform_mmd = platform.mmd() result = resolver.get_compatible_base_module_modulemds( @@ -89,7 +89,7 @@ class TestDBModule: mmd.set_xmd(xmd) module.modulemd = mmd_to_str(mmd) db_session.commit() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") result = resolver.get_module_build_dependencies( "testmodule", "master", "20170109091357", "78e4a6fd").keys() assert set(result) == expected @@ -122,7 +122,7 @@ class TestDBModule: db_session.commit() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") result = resolver.get_module_build_dependencies( "testmodule2", "master", "20180123171545", "c40c156c").keys() assert set(result) == {"module-f28-build"} @@ -142,7 +142,7 @@ class TestDBModule: utils.load_local_builds(["platform", "parent", "child", "testmodule"]) build = models.ModuleBuild.local_modules(db_session, "child", "master") - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") result = resolver.get_module_build_dependencies(mmd=build[0].mmd()).keys() local_path = tests.staged_data_filename("local_builds") @@ -152,7 +152,7 @@ class TestDBModule: def test_resolve_requires(self): build = models.ModuleBuild.get_by_id(db_session, 2) - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") result = resolver.resolve_requires( [":".join([build.name, build.stream, build.version, build.context])] ) @@ -169,7 +169,7 @@ class TestDBModule: def test_resolve_requires_exception(self): build = models.ModuleBuild.get_by_id(db_session, 2) - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") with pytest.raises(UnprocessableEntity): resolver.resolve_requires( [":".join(["abcdefghi", build.stream, build.version, build.context])] @@ -177,7 +177,7 @@ class TestDBModule: def test_resolve_requires_siblings(self): tests.clean_database() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") mmd = load_mmd(tests.read_staged_data("formatted_testmodule")) for i in range(3): build = tests.module_build_from_modulemd(mmd_to_str(mmd)) @@ -207,7 +207,7 @@ class TestDBModule: Tests that the profiles get resolved recursively """ mmd = models.ModuleBuild.get_by_id(db_session, 2).mmd() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") result = resolver.resolve_profiles(mmd, ("buildroot", "srpm-buildroot")) expected = { "buildroot": { @@ -262,24 +262,24 @@ class TestDBModule: """ utils.load_local_builds(["platform"]) mmd = models.ModuleBuild.get_by_id(db_session, 2).mmd() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") result = resolver.resolve_profiles(mmd, ("buildroot", "srpm-buildroot")) expected = {"buildroot": {"foo"}, "srpm-buildroot": {"bar"}} assert result == expected def test_get_latest_with_virtual_stream(self): tests.init_data(1, multiple_stream_versions=True) - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") mmd = resolver.get_latest_with_virtual_stream("platform", "f29") assert mmd assert mmd.get_stream_name() == "f29.2.0" def test_get_latest_with_virtual_stream_none(self): - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") mmd = resolver.get_latest_with_virtual_stream("platform", "doesnotexist") assert not mmd def test_get_module_count(self): - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="db") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="db") count = resolver.get_module_count(name="platform", stream="f28") assert count == 1 diff --git a/tests/test_resolver/test_koji.py b/tests/test_resolver/test_koji.py index 6c886511..f86ccd8c 100644 --- a/tests/test_resolver/test_koji.py +++ b/tests/test_resolver/test_koji.py @@ -4,6 +4,7 @@ import pytest from mock import patch, MagicMock from datetime import datetime +from module_build_service import conf import module_build_service.resolver as mbs_resolver import tests from module_build_service.db_session import db_session @@ -56,7 +57,7 @@ class TestLocalResolverModule: self._create_test_modules(koji_tag_with_modules=None) platform = db_session.query(ModuleBuild).filter_by(stream="f30.1.3").one() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") result = resolver.get_buildrequired_modulemds("testmodule", "master", platform.mmd()) nsvcs = {m.get_nsvc() for m in result} @@ -75,7 +76,7 @@ class TestLocalResolverModule: self._create_test_modules() platform = db_session.query(ModuleBuild).filter_by(stream="f30.1.3").one() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") result = resolver.get_buildrequired_modulemds("testmodule", "master", platform.mmd()) assert result == [] @@ -102,7 +103,7 @@ class TestLocalResolverModule: self._create_test_modules() platform = db_session.query(ModuleBuild).filter_by(stream="f30.1.3").one() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") result = resolver.get_buildrequired_modulemds("testmodule", "master", platform.mmd()) nsvcs = {m.get_nsvc() for m in result} @@ -129,7 +130,7 @@ class TestLocalResolverModule: self._create_test_modules() platform = db_session.query(ModuleBuild).filter_by(stream="f30.1.3").one() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") expected_error = ("Module testmodule:2:820181219174508:9edba152 is tagged in the " "foo-test Koji tag, but does not exist in MBS DB.") with pytest.raises(ValueError, match=expected_error): @@ -164,7 +165,7 @@ class TestLocalResolverModule: self._create_test_modules() platform = db_session.query(ModuleBuild).filter_by(stream="f30.1.3").one() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") result = resolver.get_buildrequired_modulemds("testmodule", "master", platform.mmd()) nsvcs = {m.get_nsvc() for m in result} @@ -192,7 +193,7 @@ class TestLocalResolverModule: self._create_test_modules() platform = db_session.query(ModuleBuild).filter_by(stream="f30.1.3").one() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") result = resolver.get_buildrequired_modules("testmodule", "master", platform.mmd()) nvrs = {m.nvr_string for m in result} @@ -221,7 +222,7 @@ class TestLocalResolverModule: "release": "20180109091357.7c29193d", "tag_name": "foo-test-parent" }] - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") new_builds = resolver._filter_inherited(koji_session, builds, "foo-test", {"id": 123}) nvrs = {"{name}-{version}-{release}".format(**b) for b in new_builds} @@ -246,7 +247,7 @@ class TestLocalResolverModule: {"build_id": 127, "name": "testmodule", "version": "foo_test"}, ] - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") new_builds = resolver._filter_based_on_real_stream_name(koji_session, builds, "foo-test") build_ids = {b["build_id"] for b in new_builds} @@ -262,13 +263,13 @@ class TestLocalResolverModule: ] expected_error = "Error during Koji multicall when filtering KojiResolver builds." - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") with pytest.raises(RuntimeError, match=expected_error): resolver._filter_based_on_real_stream_name(koji_session, builds, "foo-test") def test_get_compatible_base_module_modulemds_fallback_to_dbresolver(self): tests.init_data(1, multiple_stream_versions=True) - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") platform = db_session.query(ModuleBuild).filter_by(name="platform", stream="f29.1.0").one() platform_mmd = platform.mmd() result = resolver.get_compatible_base_module_modulemds( @@ -279,7 +280,7 @@ class TestLocalResolverModule: def test_get_compatible_base_module_modulemds(self): tests.init_data(1, multiple_stream_versions=True) - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="koji") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="koji") platform = db_session.query(ModuleBuild).filter_by(name="platform", stream="f29.1.0").one() platform_mmd = platform.mmd() diff --git a/tests/test_resolver/test_local.py b/tests/test_resolver/test_local.py index 56a669a0..824f83c6 100644 --- a/tests/test_resolver/test_local.py +++ b/tests/test_resolver/test_local.py @@ -3,6 +3,7 @@ import pytest from datetime import datetime +from module_build_service import conf import module_build_service.resolver as mbs_resolver from module_build_service.db_session import db_session from module_build_service.models import ModuleBuild @@ -41,7 +42,7 @@ class TestLocalResolverModule: db_session.add(build) db_session.commit() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="local") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="local") result = resolver.get_buildrequired_modulemds( "testmodule", "master", platform_f8.mmd().get_nsvc()) nsvcs = {m.get_nsvc() for m in result} diff --git a/tests/test_resolver/test_mbs.py b/tests/test_resolver/test_mbs.py index ea093071..25bd610e 100644 --- a/tests/test_resolver/test_mbs.py +++ b/tests/test_resolver/test_mbs.py @@ -2,6 +2,7 @@ # SPDX-License-Identifier: MIT from mock import patch, PropertyMock, Mock, call +from module_build_service import app, conf import module_build_service.resolver as mbs_resolver import module_build_service.utils from module_build_service.db_session import db_session @@ -31,13 +32,13 @@ class TestMBSModule: mock_session.get.return_value = mock_res - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") module_mmds = resolver.get_module_modulemds( "testmodule", "master", "20180205135154", "9c690d0e", virtual_streams=["f28"] ) nsvcs = set(m.get_nsvc() for m in module_mmds) expected = {"testmodule:master:20180205135154:9c690d0e"} - mbs_url = tests.conf.mbs_url + mbs_url = conf.mbs_url expected_query = { "name": "testmodule", "stream": "master", @@ -84,14 +85,14 @@ class TestMBSModule: } mock_session.get.return_value = mock_res - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") ret = resolver.get_module_modulemds("testmodule", "master", version) nsvcs = set(m.get_nsvc() for m in ret) expected = { "testmodule:master:20180205135154:9c690d0e", "testmodule:master:20180205135154:c2c572ed", } - mbs_url = tests.conf.mbs_url + mbs_url = conf.mbs_url expected_query = { "name": "testmodule", "stream": "master", @@ -144,7 +145,7 @@ class TestMBSModule: mock_session.get.return_value = mock_res expected = {"module-f28-build"} - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") result = resolver.get_module_build_dependencies( "testmodule", "master", "20180205135154", "9c690d0e").keys() @@ -173,7 +174,7 @@ class TestMBSModule: }, ] - mbs_url = tests.conf.mbs_url + mbs_url = conf.mbs_url expected_calls = [ call(mbs_url, params=expected_queries[0]), call(mbs_url, params=expected_queries[1]), @@ -217,11 +218,11 @@ class TestMBSModule: expected = set() - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") result = resolver.get_module_build_dependencies( "testmodule", "master", "20180205135154", "9c690d0e" ).keys() - mbs_url = tests.conf.mbs_url + mbs_url = conf.mbs_url expected_query = { "name": "testmodule", "stream": "master", @@ -257,7 +258,7 @@ class TestMBSModule: } mock_session.get.return_value = mock_res - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") result = resolver.resolve_profiles( formatted_testmodule_mmd, ("buildroot", "srpm-buildroot") ) @@ -299,7 +300,7 @@ class TestMBSModule: }, } - mbs_url = tests.conf.mbs_url + mbs_url = conf.mbs_url expected_query = { "name": "platform", "stream": "f28", @@ -329,7 +330,7 @@ class TestMBSModule: tests.clean_database() module_build_service.utils.load_local_builds(["platform"]) - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") result = resolver.resolve_profiles( formatted_testmodule_mmd, ("buildroot", "srpm-buildroot")) expected = {"buildroot": {"foo"}, "srpm-buildroot": {"bar"}} @@ -337,7 +338,7 @@ class TestMBSModule: @patch("module_build_service.resolver.MBSResolver.requests_session") def test_get_empty_buildrequired_modulemds(self, request_session): - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") request_session.get.return_value = Mock(ok=True) request_session.get.return_value.json.return_value = {"items": [], "meta": {"next": None}} @@ -347,7 +348,7 @@ class TestMBSModule: @patch("module_build_service.resolver.MBSResolver.requests_session") def test_get_buildrequired_modulemds(self, mock_session): - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") mock_session.get.return_value = Mock(ok=True) mock_session.get.return_value.json.return_value = { "items": [ @@ -393,7 +394,7 @@ class TestMBSModule: } mock_session.get.return_value = mock_res - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") count = resolver.get_module_count(name="platform", stream="f28") assert count == 5 @@ -420,7 +421,7 @@ class TestMBSModule: } mock_session.get.return_value = mock_res - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") mmd = resolver.get_latest_with_virtual_stream("platform", "virtualf28") assert mmd.get_module_name() == "platform" @@ -448,10 +449,10 @@ class TestMBSModule: self, local_builds, conf_system ): tests.clean_database() - with tests.app.app_context(): + with app.app_context(): module_build_service.utils.load_local_builds(["testmodule"]) - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") result = resolver.get_buildrequired_modulemds( "testmodule", "master", "platform:f28:1:00000000") assert 1 == len(result) @@ -483,7 +484,7 @@ class TestMBSModule: "meta": {"next": None}, } - resolver = mbs_resolver.GenericResolver.create(db_session, tests.conf, backend="mbs") + resolver = mbs_resolver.GenericResolver.create(db_session, conf, backend="mbs") platform = db_session.query( module_build_service.models.ModuleBuild).filter_by(id=1).one() diff --git a/tests/test_scheduler/test_default_modules.py b/tests/test_scheduler/test_default_modules.py index cf33bd3c..28bbfd07 100644 --- a/tests/test_scheduler/test_default_modules.py +++ b/tests/test_scheduler/test_default_modules.py @@ -7,12 +7,13 @@ import dnf from mock import call, Mock, patch, PropertyMock import pytest +from module_build_service import conf from module_build_service.db_session import db_session from module_build_service.errors import UnprocessableEntity from module_build_service.models import ModuleBuild from module_build_service.scheduler import default_modules from module_build_service.utils.general import load_mmd, mmd_to_str -from tests import clean_database, conf, make_module_in_db, read_staged_data, import_mmd +from tests import clean_database, make_module_in_db, read_staged_data, import_mmd @patch("module_build_service.scheduler.default_modules.handle_collisions_with_base_module_rpms") diff --git a/tests/test_scheduler/test_module_init.py b/tests/test_scheduler/test_module_init.py index 18295ee7..1b605fd7 100644 --- a/tests/test_scheduler/test_module_init.py +++ b/tests/test_scheduler/test_module_init.py @@ -4,11 +4,11 @@ import os from mock import patch, PropertyMock -from tests import conf, clean_database, read_staged_data +from tests import clean_database, read_staged_data from tests.test_views.test_views import FakeSCM import module_build_service.messaging import module_build_service.scheduler.handlers.modules -from module_build_service import build_logs +from module_build_service import build_logs, conf from module_build_service.db_session import db_session from module_build_service.models import ModuleBuild from module_build_service.utils.general import mmd_to_str, load_mmd diff --git a/tests/test_scheduler/test_module_wait.py b/tests/test_scheduler/test_module_wait.py index c9cbaf09..3aaa3b99 100644 --- a/tests/test_scheduler/test_module_wait.py +++ b/tests/test_scheduler/test_module_wait.py @@ -7,9 +7,9 @@ import module_build_service.scheduler.handlers.modules import os import koji import pytest -from tests import conf, scheduler_init_data +from tests import scheduler_init_data import module_build_service.resolver -from module_build_service import build_logs, Modulemd +from module_build_service import build_logs, conf, Modulemd from module_build_service.db_session import db_session from module_build_service.models import ComponentBuild, ModuleBuild diff --git a/tests/test_utils/test_utils.py b/tests/test_utils/test_utils.py index 8b9499ce..e787fc3a 100644 --- a/tests/test_utils/test_utils.py +++ b/tests/test_utils/test_utils.py @@ -32,8 +32,7 @@ from module_build_service.db_session import db_session from module_build_service.builder import GenericBuilder from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder from module_build_service.scheduler import events -from module_build_service import Modulemd -from tests import app +from module_build_service import app, Modulemd BASE_DIR = path.abspath(path.dirname(__file__)) diff --git a/tests/test_views/test_views.py b/tests/test_views/test_views.py index 921073d4..ac3a80a7 100644 --- a/tests/test_views/test_views.py +++ b/tests/test_views/test_views.py @@ -18,13 +18,19 @@ import pytest import re import sqlalchemy -from tests import app, init_data, clean_database, staged_data_filename, make_module_in_db -from tests import read_staged_data, time_assert +from tests import ( + init_data, + clean_database, + make_module_in_db, + read_staged_data, + staged_data_filename, + time_assert, +) from tests.test_scm import base_dir as scm_base_dir from module_build_service.db_session import db_session from module_build_service.errors import UnprocessableEntity from module_build_service.models import ModuleBuild, BUILD_STATES, ComponentBuild -from module_build_service import version +from module_build_service import app, version import module_build_service.config as mbs_config import module_build_service.utils.submit from module_build_service.utils.general import (