mirror of
https://pagure.io/fm-orchestrator.git
synced 2026-02-03 05:03:43 +08:00
Simplify how MBS is configured
This merges the configuration from conf/config.py to module_build_service/config.py. This also greatly simplifies the logic in `init_config`. Additionally, `init_config` is no longer aware of Flask. This will allow us to eventually break up the configuration between the API and the backend.
This commit is contained in:
@@ -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
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.")
|
||||
|
||||
|
||||
1
setup.py
1
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",
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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__))
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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",
|
||||
[
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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__))
|
||||
|
||||
|
||||
@@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user