Cleanup module_build_service/__init__.py

Most of the code are moved to dedicated subpackages, but some others
can't due to the cycle dependencies.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
This commit is contained in:
Chenxiong Qi
2020-01-19 10:30:03 +08:00
committed by mprahl
parent 1e5ed864c9
commit 1c0715662a
81 changed files with 235 additions and 221 deletions

View File

@@ -19,22 +19,14 @@ for a number of tasks:
"""
from __future__ import absolute_import
from logging import getLogger
from celery import Celery
import gi # noqa
gi.require_version("Modulemd", "2.0") # noqa
from gi.repository import Modulemd # noqa
import pkg_resources
from flask import Flask, has_app_context, url_for
from flask_sqlalchemy import SQLAlchemy
import pkg_resources
from sqlalchemy.pool import StaticPool
from module_build_service.common.config import init_config
from module_build_service.common.errors import (
ValidationError, Unauthorized, UnprocessableEntity, Conflict, NotFound,
Forbidden, json_error)
from module_build_service.common.logger import init_logging, ModuleBuildLogs, level_flags, MBSLogger
from module_build_service.common.config import config_section
from module_build_service.web.proxy import ReverseProxy
try:
@@ -43,22 +35,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)
app.config.from_object(config_section)
celery_app = Celery("module-build-service")
# Convert config names specific for Celery like this:
# celery_broker_url -> broker_url
celery_configs = {
name[7:]: getattr(conf, name)
for name in dir(conf) if name.startswith("celery_")
}
# Only allow a single process so that tasks are always serial per worker
celery_configs["worker_concurrency"] = 1
celery_app.conf.update(**celery_configs)
class MBSSQLAlchemy(SQLAlchemy):
"""
@@ -83,73 +63,6 @@ class MBSSQLAlchemy(SQLAlchemy):
db = MBSSQLAlchemy(app)
def create_app(debug=False, verbose=False, quiet=False):
# logging (intended for flask-script, see manage.py)
log = getLogger(__name__)
if debug:
log.setLevel(level_flags["debug"])
elif verbose:
log.setLevel(level_flags["verbose"])
elif quiet:
log.setLevel(level_flags["quiet"])
return app
def load_views():
from module_build_service.web import views
assert views
@app.errorhandler(ValidationError)
def validationerror_error(e):
"""Flask error handler for ValidationError exceptions"""
return json_error(400, "Bad Request", str(e))
@app.errorhandler(Unauthorized)
def unauthorized_error(e):
"""Flask error handler for NotAuthorized exceptions"""
return json_error(401, "Unauthorized", str(e))
@app.errorhandler(Forbidden)
def forbidden_error(e):
"""Flask error handler for Forbidden exceptions"""
return json_error(403, "Forbidden", str(e))
@app.errorhandler(RuntimeError)
def runtimeerror_error(e):
"""Flask error handler for RuntimeError exceptions"""
log.exception("RuntimeError exception raised")
return json_error(500, "Internal Server Error", str(e))
@app.errorhandler(UnprocessableEntity)
def unprocessableentity_error(e):
"""Flask error handler for UnprocessableEntity exceptions"""
return json_error(422, "Unprocessable Entity", str(e))
@app.errorhandler(Conflict)
def conflict_error(e):
"""Flask error handler for Conflict exceptions"""
return json_error(409, "Conflict", str(e))
@app.errorhandler(NotFound)
def notfound_error(e):
"""Flask error handler for Conflict exceptions"""
return json_error(404, "Not Found", str(e))
init_logging(conf)
log = MBSLogger()
build_logs = ModuleBuildLogs(conf.build_logs_dir, conf.build_logs_name_format, conf.log_level)
def get_url_for(*args, **kwargs):
"""
flask.url_for wrapper which creates the app_context on-the-fly.
@@ -161,6 +74,7 @@ def get_url_for(*args, **kwargs):
# system as the web views.
app.config["SERVER_NAME"] = "localhost"
with app.app_context():
from module_build_service.common import log
log.debug(
"WARNING: get_url_for() has been called without the Flask "
"app_context. That can lead to SQLAlchemy errors caused by "
@@ -169,4 +83,10 @@ def get_url_for(*args, **kwargs):
return url_for(*args, **kwargs)
def load_views():
from module_build_service.web import views
assert views
load_views()

View File

@@ -21,7 +21,8 @@ import koji
import pungi.arch
from six import text_type
from module_build_service import conf, log, build_logs, Modulemd
from module_build_service.common.modulemd import Modulemd
from module_build_service.common import conf, log, build_logs
from module_build_service.common.koji import get_session, koji_retrying_multicall_map
from module_build_service.common.scm import SCM
from module_build_service.common.utils import load_mmd, mmd_to_str, to_text_type

View File

@@ -22,11 +22,10 @@ import koji
import kobo.rpmlib
from OpenSSL.SSL import SysCallError
from module_build_service import log, conf
from module_build_service.builder import GenericBuilder
from module_build_service.builder.KojiContentGenerator import KojiContentGenerator
from module_build_service.builder.utils import execute_cmd, get_rpm_release, validate_koji_tag
from module_build_service.common import models
from module_build_service.common import log, conf, models
from module_build_service.common.koji import (
get_session, koji_multicall_map, koji_retrying_multicall_map,
)

View File

@@ -13,7 +13,6 @@ import koji
import kobo.rpmlib
import platform
from module_build_service import conf, log, Modulemd
from module_build_service.builder import GenericBuilder
from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder
from module_build_service.builder.utils import (
@@ -23,8 +22,9 @@ from module_build_service.builder.utils import (
get_koji_config,
validate_koji_tag,
)
from module_build_service.common import models
from module_build_service.common import conf, log, models
from module_build_service.common.koji import get_session
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.utils import import_mmd, load_mmd_file, mmd_to_str
from module_build_service.scheduler import events
from module_build_service.scheduler.db_session import db_session

View File

@@ -9,8 +9,7 @@ import dogpile.cache
from requests.exceptions import ConnectionError
import six
from module_build_service import conf, log
from module_build_service.common import models
from module_build_service.common import conf, log, models
from module_build_service.common.models import BUILD_STATES
from module_build_service.common.retry import retry
from module_build_service.resolver import GenericResolver

View File

@@ -13,8 +13,7 @@ import subprocess
import munch
import requests
from module_build_service import conf, log
from module_build_service.common import models
from module_build_service.common import conf, log, models
from module_build_service.common.errors import ValidationError, ProgrammingError

View File

@@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: MIT
from module_build_service.common.config import conf
from module_build_service.common import logger
__all__ = ('conf', 'log', 'build_logs')
logger.init_logging(conf)
log = logger.MBSLogger()
build_logs = logger.ModuleBuildLogs(
conf.build_logs_dir, conf.build_logs_name_format, conf.log_level)

View File

@@ -989,3 +989,6 @@ class Config(object):
if i < 1:
raise ValueError("NUM_THREADS_FOR_BUILD_SUBMISSIONS must be >= 1")
self._num_threads_for_build_submissions = i
conf, config_section = init_config()

View File

@@ -4,8 +4,6 @@
from __future__ import absolute_import
from flask import jsonify
class ValidationError(ValueError):
pass
@@ -43,11 +41,5 @@ class GreenwaveError(RuntimeError):
pass
def json_error(status, error, message):
response = jsonify({"status": status, "error": error, "message": message})
response.status_code = status
return response
class IgnoreMessage(Exception):
"""Raise if message received from message bus should be ignored"""

View File

@@ -7,7 +7,7 @@ import koji
import munch
import six.moves.xmlrpc_client as xmlrpclib
from module_build_service import log
from module_build_service.common import log
from module_build_service.common.retry import retry
from module_build_service.common.errors import ProgrammingError

View File

@@ -7,7 +7,7 @@ from __future__ import absolute_import
import pkg_resources
import six.moves.queue
from module_build_service import conf, log
from module_build_service.common import conf, log
from module_build_service.scheduler.parser import FedmsgMessageParser
# A queue containing message body that should be sent after

View File

@@ -19,7 +19,8 @@ from sqlalchemy.orm import validates, load_only
from sqlalchemy.schema import Index
from module_build_service import db, log, get_url_for, conf
from module_build_service import db, get_url_for
from module_build_service.common import conf, log
from module_build_service.common.errors import UnprocessableEntity
from module_build_service.common.messaging import module_build_state_change_out_queue
from module_build_service.common.messaging import notify_on_module_state_change

View File

@@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: MIT
import gi
gi.require_version("Modulemd", "2.0")
from gi.repository import Modulemd # noqa
__all__ = ['Modulemd']

View File

@@ -2,7 +2,7 @@
# SPDX-License-Identifier: MIT
from __future__ import absolute_import
from module_build_service import conf
from module_build_service.common.config import conf
from module_build_service.common.errors import StreamAmbigous
from module_build_service.resolver import GenericResolver

View File

@@ -4,7 +4,7 @@ from __future__ import absolute_import
import functools
import time
from module_build_service import conf, log
from module_build_service.common import conf, log
def retry(timeout=conf.net_timeout, interval=conf.net_retry_interval, wait_on=Exception):

View File

@@ -10,7 +10,7 @@ import re
import shutil
import tempfile
from module_build_service import log, conf
from module_build_service.common import log, conf
from module_build_service.common.errors import (
Forbidden,
ValidationError,

View File

@@ -7,7 +7,7 @@ import tempfile
import requests
import module_build_service.common.scm
from module_build_service import conf, log
from module_build_service.common import conf, log
from module_build_service.common.errors import ValidationError
from module_build_service.common.utils import load_mmd_file

View File

@@ -8,8 +8,9 @@ import os
from gi.repository.GLib import Error as ModuleMDError
from six import string_types, text_type
from module_build_service import conf, log, Modulemd
from module_build_service.common import conf, log
from module_build_service.common.errors import UnprocessableEntity
from module_build_service.common.modulemd import Modulemd
def to_text_type(s):

View File

@@ -11,12 +11,13 @@ import flask_migrate
from flask_script import Manager, prompt_bool
from werkzeug.datastructures import FileStorage
from module_build_service import app, conf, create_app, db
from module_build_service import app, db
from module_build_service.builder.MockModuleBuilder import (
import_builds_from_local_dnf_repos, load_local_builds
)
from module_build_service.common import models
from module_build_service.common import conf, models
from module_build_service.common.errors import StreamAmbigous
from module_build_service.common.logger import level_flags
from module_build_service.common.utils import load_mmd_file, import_mmd
import module_build_service.scheduler.consumer
from module_build_service.scheduler.db_session import db_session
@@ -24,6 +25,19 @@ import module_build_service.scheduler.local
from module_build_service.web.submit import submit_module_build_from_yaml
def create_app(debug=False, verbose=False, quiet=False):
# logging (intended for flask-script, see manage.py)
log = logging.getLogger(__name__)
if debug:
log.setLevel(level_flags["debug"])
elif verbose:
log.setLevel(level_flags["verbose"])
elif quiet:
log.setLevel(level_flags["quiet"])
return app
manager = Manager(create_app)
help_args = ("-?", "--help")
manager.help_args = help_args

View File

@@ -14,8 +14,9 @@ from alembic import op
import sqlalchemy as sa
# Data migration imports
from module_build_service import Modulemd, conf
from module_build_service.common import conf
from module_build_service.common.models import ModuleBuild
from module_build_service.common.modulemd import Modulemd
# Data migration tables
mb = sa.Table(

View File

@@ -16,7 +16,8 @@ from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
# Data migration imports
from module_build_service import Modulemd, conf
from module_build_service.common import conf
from module_build_service.common.modulemd import Modulemd
Base = declarative_base()

View File

@@ -14,8 +14,8 @@ from alembic import op
import sqlalchemy as sa
# Data migration imports
from module_build_service import Modulemd
import hashlib
from module_build_service.common.modulemd import Modulemd
modulebuild = sa.Table(

View File

@@ -14,7 +14,7 @@ from alembic import op
import sqlalchemy as sa
# Data migration imports
from module_build_service import Modulemd
from module_build_service.common.modulemd import Modulemd
import hashlib
import json
from collections import OrderedDict

View File

@@ -12,8 +12,8 @@ down_revision = "1817e62719f9"
from alembic import op
import sqlalchemy as sa
from module_build_service import Modulemd
from module_build_service.common.models import ModuleBuild
from module_build_service.common.modulemd import Modulemd
modulebuild = sa.Table(

View File

@@ -14,7 +14,7 @@ from alembic import op
import sqlalchemy as sa
# Data migration imports
from module_build_service import Modulemd
from module_build_service.common.modulemd import Modulemd
import hashlib
import json
from collections import OrderedDict

View File

@@ -5,8 +5,7 @@ from __future__ import absolute_import
import sqlalchemy
from sqlalchemy.orm import aliased
from module_build_service import log
from module_build_service.common import models
from module_build_service.common import log, models
from module_build_service.common.errors import UnprocessableEntity
from module_build_service.common.utils import load_mmd
from module_build_service.resolver.base import GenericResolver

View File

@@ -3,8 +3,7 @@
from __future__ import absolute_import
from itertools import groupby
from module_build_service import conf, log
from module_build_service.common import models
from module_build_service.common import conf, log, models
from module_build_service.common.koji import get_session, koji_multicall_map
from module_build_service.resolver.DBResolver import DBResolver

View File

@@ -7,8 +7,8 @@ import logging
import kobo.rpmlib
from module_build_service import conf
from module_build_service.common import models
from module_build_service.common.config import conf
from module_build_service.common.errors import UnprocessableEntity
from module_build_service.common.request_utils import requests_session
from module_build_service.common.utils import load_mmd, import_mmd

View File

@@ -7,8 +7,7 @@ from __future__ import absolute_import
from abc import ABCMeta, abstractmethod
import six
from module_build_service import conf
import module_build_service.common.config as cfg
from module_build_service.common.config import conf, SUPPORTED_RESOLVERS
class GenericResolver(six.with_metaclass(ABCMeta)):
@@ -16,7 +15,7 @@ class GenericResolver(six.with_metaclass(ABCMeta)):
External Api for resolvers
"""
_resolvers = cfg.SUPPORTED_RESOLVERS
_resolvers = SUPPORTED_RESOLVERS
# Resolver name. Each subclass of GenericResolver must set its own name.
backend = "generic"

View File

@@ -1,3 +1,18 @@
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: MIT
""" This is a sub-module for backend/scheduler functionality. """
from celery import Celery
from module_build_service.common.config import conf
celery_app = Celery("module-build-service")
# Convert config names specific for Celery like this:
# celery_broker_url -> broker_url
celery_configs = {
name[7:]: getattr(conf, name)
for name in dir(conf) if name.startswith("celery_")
}
# Only allow a single process so that tasks are always serial per worker
celery_configs["worker_concurrency"] = 1
celery_app.conf.update(**celery_configs)

View File

@@ -4,8 +4,7 @@ from __future__ import absolute_import
import concurrent.futures
import threading
from module_build_service import conf, log
from module_build_service.common import models
from module_build_service.common import conf, log, models
from module_build_service.scheduler import events
from module_build_service.scheduler.db_session import db_session
from module_build_service.scheduler.reuse import get_reusable_components, reuse_component

View File

@@ -20,8 +20,7 @@ import fedmsg.consumers
import moksha.hub
import sqlalchemy.exc
from module_build_service import log, conf
from module_build_service.common import models
from module_build_service.common import log, conf, models
from module_build_service.common.errors import IgnoreMessage
import module_build_service.common.messaging
from module_build_service.common.messaging import default_messaging_backend

View File

@@ -6,9 +6,10 @@ import sqlalchemy.event
from sqlalchemy.pool import NullPool
from sqlalchemy.orm import scoped_session, sessionmaker
from module_build_service import conf
from module_build_service.common.models import send_message_after_module_build_state_change
from module_build_service.common.models import session_before_commit_handlers
from module_build_service.common.config import conf
from module_build_service.common.models import (
session_before_commit_handlers, send_message_after_module_build_state_change
)
__all__ = ("db_session",)

View File

@@ -11,10 +11,10 @@ import kobo.rpmlib
import koji
import six.moves.xmlrpc_client as xmlrpclib
from module_build_service import conf, log, Modulemd
from module_build_service.common import models, scm
from module_build_service.common import conf, log, models, scm
from module_build_service.common.errors import UnprocessableEntity
from module_build_service.common.koji import get_session, koji_retrying_multicall_map
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.resolve import (
expand_single_mse_streams, get_compatible_base_module_mmds
)

View File

@@ -17,7 +17,7 @@ from functools import wraps
import sched
import time
from module_build_service import log
from module_build_service.common import log
KOJI_BUILD_CHANGE = "koji_build_change"

View File

@@ -6,7 +6,7 @@ import json
import requests
from module_build_service import log, conf
from module_build_service.common import log, conf
from module_build_service.common.errors import GreenwaveError

View File

@@ -7,12 +7,11 @@ import logging
import koji
from module_build_service import celery_app, conf, log
from module_build_service.builder import GenericBuilder
from module_build_service.common import models
from module_build_service.common import conf, log, models
from module_build_service.common.koji import get_session
from module_build_service.common.utils import mmd_to_str
from module_build_service.scheduler import events
from module_build_service.scheduler import celery_app, events
from module_build_service.scheduler.batches import continue_batch_build
from module_build_service.scheduler.db_session import db_session

View File

@@ -2,11 +2,11 @@
# SPDX-License-Identifier: MIT
from __future__ import absolute_import
from module_build_service import celery_app, conf, log
from module_build_service.common import conf, log
from module_build_service.common.koji import get_session
from module_build_service.common.models import ModuleBuild, BUILD_STATES
from module_build_service.scheduler.db_session import db_session
from module_build_service.scheduler import events
from module_build_service.scheduler import celery_app, events
def get_corresponding_module_build(nvr):

View File

@@ -11,11 +11,11 @@ import koji
from requests.exceptions import ConnectionError
import six.moves.xmlrpc_client as xmlrpclib
from module_build_service import celery_app, conf, log, build_logs
from module_build_service.builder import GenericBuilder
from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder
from module_build_service.builder.utils import get_rpm_release
from module_build_service.common import models
from module_build_service.common import build_logs, conf, log
from module_build_service.common.errors import UnprocessableEntity, Forbidden, ValidationError
from module_build_service.common.utils import mmd_to_str
from module_build_service.common.retry import retry
@@ -25,7 +25,7 @@ from module_build_service.scheduler.submit import (
record_filtered_rpms,
record_module_build_arches
)
from module_build_service.scheduler import events
from module_build_service.scheduler import celery_app, events
from module_build_service.scheduler.db_session import db_session
from module_build_service.scheduler.default_modules import (
add_default_modules, handle_collisions_with_base_module_rpms)

View File

@@ -6,10 +6,9 @@ from __future__ import absolute_import
from datetime import datetime
import logging
from module_build_service import celery_app, conf, log
from module_build_service.builder import GenericBuilder
from module_build_service.common import models
from module_build_service.scheduler import events
from module_build_service.common import conf, log, models
from module_build_service.scheduler import celery_app, events
from module_build_service.scheduler.batches import start_next_batch_build
from module_build_service.scheduler.db_session import db_session

View File

@@ -7,10 +7,9 @@ import logging
import koji
from module_build_service import celery_app, conf, log
from module_build_service.builder import GenericBuilder
from module_build_service.common import models
from module_build_service.scheduler import events
from module_build_service.common import conf, log, models
from module_build_service.scheduler import celery_app, events
from module_build_service.scheduler.db_session import db_session
logging.basicConfig(level=logging.DEBUG)

View File

@@ -3,7 +3,7 @@
from __future__ import absolute_import
import re
from module_build_service import log
from module_build_service.common import log
from module_build_service.common.errors import IgnoreMessage
from module_build_service.scheduler import events

View File

@@ -8,12 +8,12 @@ import koji
from sqlalchemy.orm import lazyload, load_only
from module_build_service import celery_app, conf, log
from module_build_service.common import conf, log, models
from module_build_service.builder import GenericBuilder
from module_build_service.common import models
from module_build_service.common.koji import get_session
import module_build_service.scheduler
import module_build_service.scheduler.consumer
from module_build_service.scheduler import celery_app
from module_build_service.scheduler.consumer import ON_MODULE_CHANGE_HANDLERS
from module_build_service.scheduler.batches import (
at_concurrent_component_threshold,

View File

@@ -4,8 +4,7 @@ from __future__ import absolute_import
import kobo.rpmlib
from module_build_service import log, conf
from module_build_service.common import models
from module_build_service.common import log, conf, models
from module_build_service.common.resolve import get_base_module_mmds
from module_build_service.resolver import GenericResolver
from module_build_service.scheduler import events

View File

@@ -5,8 +5,7 @@
from __future__ import absolute_import
import inspect
from module_build_service import conf, log
from module_build_service.common import models
from module_build_service.common import conf, log, models
from module_build_service.scheduler.db_session import db_session
from module_build_service.scheduler.handlers.greenwave import get_corresponding_module_build

View File

@@ -8,10 +8,10 @@ import os
import kobo.rpmlib
from module_build_service import conf, log, Modulemd
from module_build_service.common import models
from module_build_service.common.errors import ValidationError, UnprocessableEntity, Forbidden
import module_build_service.common.scm
from module_build_service.common import conf, log, models
from module_build_service.common.errors import ValidationError, UnprocessableEntity, Forbidden
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.submit import fetch_mmd
from module_build_service.common.utils import to_text_type
from module_build_service.scheduler.db_session import db_session

View File

@@ -3,7 +3,7 @@
from __future__ import absolute_import
import re
from module_build_service import conf, log
from module_build_service.common import conf, log
from module_build_service.common.koji import get_session
from module_build_service.resolver import GenericResolver
from module_build_service.scheduler.db_session import db_session

View File

@@ -10,7 +10,8 @@ from dogpile.cache import make_region
from flask import g
import requests
from module_build_service import app, log, conf
from module_build_service import app
from module_build_service.common import conf, log
from module_build_service.common.errors import Unauthorized, Forbidden

View File

@@ -5,7 +5,7 @@ from __future__ import absolute_import
from flask import request
from flask.json import dumps
import module_build_service
from module_build_service import app
def jsonify(*args, **kwargs):
@@ -16,7 +16,7 @@ def jsonify(*args, **kwargs):
indent = None
separators = (",", ":")
if module_build_service.app.config["JSONIFY_PRETTYPRINT_REGULAR"] and not request.is_xhr:
if app.config["JSONIFY_PRETTYPRINT_REGULAR"] and not request.is_xhr:
indent = 2
separators = (", ", ": ")
@@ -31,6 +31,6 @@ def jsonify(*args, **kwargs):
# Note that we add '\n' to end of response
# (see https://github.com/mitsuhiko/flask/pull/1262)
rv = module_build_service.app.response_class(
rv = app.response_class(
(dumps(data, indent=indent, separators=separators), "\n"), mimetype="application/json")
return rv

View File

@@ -6,8 +6,7 @@ import itertools
import solv
from module_build_service import log, conf
from module_build_service.common.models import ModuleBuild
from module_build_service.common import log, conf, models
class MMDResolver(object):
@@ -144,7 +143,8 @@ class MMDResolver(object):
# In case x.y.z versioning is not used for this base module, do not
# use versions solv.Dep.
stream_version_str = str(
ModuleBuild.get_stream_version(stream_for_version, right_pad=False))
models.ModuleBuild.get_stream_version(
stream_for_version, right_pad=False))
if len(stream_version_str) < 5:
req_pos = rel_or_dep(
req_pos, solv.REL_OR, self.module_dep(name, stream))
@@ -173,7 +173,7 @@ class MMDResolver(object):
op = solv.REL_EQ
if not exact_versions:
op |= solv.REL_GT
version = ModuleBuild.get_stream_version(
version = models.ModuleBuild.get_stream_version(
stream_for_version, right_pad=False
)
req_pos = rel_or_dep(
@@ -223,7 +223,8 @@ class MMDResolver(object):
# and so on. We therefore need to convert the stream and version of base module to
# integer representation and add "module($name:$stream) = $stream_based_version"
# to Provides.
stream_version = ModuleBuild.get_stream_version(mmd.get_stream_name(), right_pad=False)
stream_version = models.ModuleBuild.get_stream_version(
mmd.get_stream_name(), right_pad=False)
if stream_version:
base_stream_ver = True
self.solvable_provides(

View File

@@ -2,9 +2,9 @@
# SPDX-License-Identifier: MIT
from __future__ import absolute_import
from module_build_service import log, Modulemd, conf
from module_build_service.common import models
from module_build_service.common import conf, log, models
from module_build_service.common.errors import StreamAmbigous, UnprocessableEntity
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.resolve import expand_single_mse_streams, get_base_module_mmds
from module_build_service.common.utils import mmd_to_str
from module_build_service.resolver import GenericResolver

View File

@@ -11,10 +11,10 @@ import time
from gi.repository import GLib
import requests
from module_build_service import conf, log, Modulemd
from module_build_service.common import models
from module_build_service.common import conf, log, models
from module_build_service.common.errors import Conflict, Forbidden, ValidationError
from module_build_service.common.messaging import notify_on_module_state_change
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.submit import fetch_mmd
from module_build_service.common.utils import load_mmd, mmd_to_str, to_text_type
from module_build_service.web.mse import generate_expanded_mmds

View File

@@ -11,8 +11,8 @@ import sqlalchemy
from sqlalchemy.orm import aliased
from sqlalchemy.sql.sqltypes import Boolean as sqlalchemy_boolean
from module_build_service import api_version, conf, db
from module_build_service.common import models
from module_build_service import api_version, db
from module_build_service.common import conf, models
from module_build_service.common.errors import ValidationError, NotFound
from module_build_service.common.scm import scm_url_schemes

View File

@@ -14,10 +14,11 @@ from flask.views import MethodView
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
from six import string_types
from module_build_service import app, conf, log, db, version, api_version as max_api_version
from module_build_service.common import models
from module_build_service import app, db, version, api_version as max_api_version
from module_build_service.common import conf, log, models
from module_build_service.common.errors import (
ValidationError, Forbidden, NotFound, ProgrammingError
ValidationError, Forbidden, NotFound, ProgrammingError,
Unauthorized, UnprocessableEntity, Conflict
)
from module_build_service.common.models import send_message_after_module_build_state_change
from module_build_service.common.monitor import registry
@@ -569,6 +570,55 @@ def register_api():
register_api()
def json_error(status, error, message):
response = jsonify({"status": status, "error": error, "message": message})
response.status_code = status
return response
@app.errorhandler(ValidationError)
def validationerror_error(e):
"""Flask error handler for ValidationError exceptions"""
return json_error(400, "Bad Request", str(e))
@app.errorhandler(Unauthorized)
def unauthorized_error(e):
"""Flask error handler for NotAuthorized exceptions"""
return json_error(401, "Unauthorized", str(e))
@app.errorhandler(Forbidden)
def forbidden_error(e):
"""Flask error handler for Forbidden exceptions"""
return json_error(403, "Forbidden", str(e))
@app.errorhandler(RuntimeError)
def runtimeerror_error(e):
"""Flask error handler for RuntimeError exceptions"""
log.exception("RuntimeError exception raised")
return json_error(500, "Internal Server Error", str(e))
@app.errorhandler(UnprocessableEntity)
def unprocessableentity_error(e):
"""Flask error handler for UnprocessableEntity exceptions"""
return json_error(422, "Unprocessable Entity", str(e))
@app.errorhandler(Conflict)
def conflict_error(e):
"""Flask error handler for Conflict exceptions"""
return json_error(409, "Conflict", str(e))
@app.errorhandler(NotFound)
def notfound_error(e):
"""Flask error handler for Conflict exceptions"""
return json_error(404, "Not Found", str(e))
# Ensure the event handler is called on db.session
sqlalchemy.event.listen(
db.session, "after_commit", send_message_after_module_build_state_change)

View File

@@ -16,7 +16,7 @@ from mock import patch
from six import string_types
import module_build_service
from module_build_service import db, Modulemd
from module_build_service import db
from module_build_service.builder.utils import get_rpm_release
from module_build_service.common.models import (
BUILD_STATES,
@@ -25,6 +25,7 @@ from module_build_service.common.models import (
ModuleBuild,
VirtualStream,
)
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.utils import load_mmd, import_mmd, mmd_to_str, to_text_type
from module_build_service.scheduler.db_session import db_session

View File

@@ -390,10 +390,10 @@ def cleanup_build_logs(request):
"""
def _cleanup_build_logs():
build_ids = list(module_build_service.build_logs.handlers.keys())
build_ids = list(module_build_service.common.build_logs.handlers.keys())
for build_id in build_ids:
mock_build = mock.Mock()
mock_build.id = build_id
module_build_service.build_logs.stop(mock_build)
module_build_service.common.build_logs.stop(mock_build)
request.addfinalizer(_cleanup_build_logs)

View File

@@ -21,12 +21,12 @@ import moksha.hub
import pytest
from werkzeug.datastructures import FileStorage
from module_build_service import app, conf, build_logs, log
from module_build_service import app
from module_build_service.builder import GenericBuilder
from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder
from module_build_service.builder.MockModuleBuilder import load_local_builds
from module_build_service.builder.utils import get_rpm_release, validate_koji_tag
from module_build_service.common import models
from module_build_service.common import conf, log, build_logs, models
from module_build_service.common.errors import Forbidden
from module_build_service.common.utils import load_mmd, import_mmd
from module_build_service.scheduler import events

View File

@@ -7,9 +7,9 @@ import tempfile
from mock import call, MagicMock, Mock, patch, PropertyMock
import pytest
from module_build_service import conf
from module_build_service.builder import utils
from module_build_service.common import models
from module_build_service.common.config import conf
from module_build_service.common.errors import ProgrammingError, ValidationError
from module_build_service.common.utils import load_mmd, import_mmd, mmd_to_str
from module_build_service.scheduler.db_session import db_session

View File

@@ -11,9 +11,9 @@ import koji
from mock import patch, Mock, call, mock_open
import pytest
from module_build_service import conf, build_logs, Modulemd
from module_build_service.builder.KojiContentGenerator import KojiContentGenerator
from module_build_service.common import models
from module_build_service.common import conf, build_logs, models
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.utils import load_mmd, load_mmd_file, mmd_to_str
from module_build_service.scheduler.db_session import db_session
from tests import init_data

View File

@@ -11,10 +11,11 @@ import mock
from mock import patch, MagicMock
import pytest
from module_build_service import conf, Modulemd
from module_build_service.builder import GenericBuilder
from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder
import module_build_service.common.models
from module_build_service.common.config import conf
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.utils import mmd_to_str
from module_build_service.scheduler import events
from module_build_service.scheduler.db_session import db_session

View File

@@ -11,7 +11,7 @@ import koji
import mock
import pytest
from module_build_service import conf
from module_build_service.common.config import conf
from module_build_service.builder.MockModuleBuilder import (
import_fake_base_module,
import_builds_from_local_dnf_repos,
@@ -122,7 +122,7 @@ class TestMockModuleBuilder:
return module
@mock.patch("module_build_service.conf.system", new="mock")
@mock.patch("module_build_service.common.conf.system", new="mock")
def test_createrepo_filter_last_batch(self):
module = self._create_module_with_filters(db_session, 3, koji.BUILD_STATES["COMPLETE"])
@@ -149,7 +149,7 @@ class TestMockModuleBuilder:
rpm_names = [kobo.rpmlib.parse_nvr(rpm)["name"] for rpm in pkglist.split("\n")]
assert "ed" not in rpm_names
@mock.patch("module_build_service.conf.system", new="mock")
@mock.patch("module_build_service.common.conf.system", new="mock")
def test_createrepo_not_last_batch(self):
module = self._create_module_with_filters(db_session, 2, koji.BUILD_STATES["COMPLETE"])
@@ -174,7 +174,7 @@ class TestMockModuleBuilder:
rpm_names = [kobo.rpmlib.parse_nvr(rpm)["name"] for rpm in pkglist.split("\n")]
assert "ed" in rpm_names
@mock.patch("module_build_service.conf.system", new="mock")
@mock.patch("module_build_service.common.conf.system", new="mock")
def test_createrepo_empty_rmp_list(self):
module = self._create_module_with_filters(db_session, 3, koji.BUILD_STATES["COMPLETE"])
@@ -194,7 +194,7 @@ class TestMockModuleBuilderAddRepos:
def setup_method(self, test_method):
clean_database(add_platform_module=False)
@mock.patch("module_build_service.conf.system", new="mock")
@mock.patch("module_build_service.common.conf.system", new="mock")
@mock.patch(
"module_build_service.common.config.Config.base_module_repofiles",
new_callable=mock.PropertyMock,

View File

@@ -3,7 +3,7 @@
from __future__ import absolute_import
import os.path
from module_build_service import conf
from module_build_service.common.config import conf
class TestConfig:

View File

@@ -6,8 +6,7 @@ from os import path
import shutil
import tempfile
from module_build_service import log
from module_build_service.common import models
from module_build_service.common import log, models
from module_build_service.common.logger import ModuleBuildLogs
from module_build_service.scheduler.consumer import MBSConsumer
from module_build_service.scheduler.db_session import db_session

View File

@@ -5,7 +5,7 @@ from __future__ import absolute_import
from mock import patch
import pytest
from module_build_service import conf
from module_build_service.common.config import conf
from module_build_service.common.models import ComponentBuild, ComponentBuildTrace, ModuleBuild
from module_build_service.common.utils import load_mmd, mmd_to_str
from module_build_service.scheduler.db_session import db_session

View File

@@ -8,8 +8,8 @@ import pytest
import requests
from six.moves import reload_module
from module_build_service import app, conf
from module_build_service.common import models
from module_build_service import app
from module_build_service.common import conf, models
import module_build_service.common.monitor
from module_build_service.scheduler.db_session import db_session
from tests import clean_database, init_data, make_module_in_db

View File

@@ -5,8 +5,8 @@ from __future__ import absolute_import
from mock import patch, PropertyMock
import pytest
from module_build_service import Modulemd
from module_build_service.common import models
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.utils import load_mmd
from module_build_service.common.resolve import get_base_module_mmds
from module_build_service.scheduler.db_session import db_session

View File

@@ -7,11 +7,12 @@ from datetime import datetime
from mock import patch, PropertyMock
import pytest
from module_build_service import conf, Modulemd
from module_build_service.builder.MockModuleBuilder import load_local_builds
from module_build_service.common import models
from module_build_service.common.config import conf
from module_build_service.common.errors import UnprocessableEntity
from module_build_service.common.models import ModuleBuild
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.utils import import_mmd, load_mmd, mmd_to_str
import module_build_service.resolver as mbs_resolver
from module_build_service.scheduler.db_session import db_session

View File

@@ -6,7 +6,7 @@ from datetime import datetime
from mock import patch, MagicMock
import pytest
from module_build_service import conf
from module_build_service.common.config import conf
from module_build_service.common.models import ModuleBuild, BUILD_STATES
from module_build_service.common.utils import import_mmd, load_mmd, mmd_to_str
import module_build_service.resolver as mbs_resolver

View File

@@ -5,7 +5,7 @@ from datetime import datetime
import pytest
from module_build_service import conf
from module_build_service.common.config import conf
from module_build_service.common.models import ModuleBuild
from module_build_service.common.utils import import_mmd, load_mmd, mmd_to_str
from module_build_service.scheduler.db_session import db_session

View File

@@ -4,9 +4,10 @@ from __future__ import absolute_import
from mock import patch, PropertyMock, Mock, call
from module_build_service import app, conf
from module_build_service import app
from module_build_service.builder.MockModuleBuilder import load_local_builds
import module_build_service.common.models
from module_build_service.common import conf
from module_build_service.common.utils import load_mmd, mmd_to_str
import module_build_service.resolver as mbs_resolver
from module_build_service.scheduler.db_session import db_session

View File

@@ -7,7 +7,7 @@ import mock
from mock import patch
import pytest
from module_build_service import conf
from module_build_service.common.config import conf
from module_build_service.builder import GenericBuilder
from module_build_service.builder.KojiModuleBuilder import KojiModuleBuilder
from module_build_service.builder.utils import validate_koji_tag

View File

@@ -4,7 +4,8 @@ from __future__ import absolute_import
import mock
from module_build_service import celery_app, conf
from module_build_service.common.config import conf
from module_build_service.scheduler import celery_app
from module_build_service.scheduler.handlers import components, greenwave, modules, repos, tags
from module_build_service.scheduler.producer import fail_lost_builds
from tests import scheduler_init_data

View File

@@ -3,8 +3,8 @@
from mock import patch
from module_build_service import conf
from module_build_service.common import models
from module_build_service.common.config import conf
from module_build_service.scheduler.db_session import db_session
from tests import clean_database, make_module_in_db

View File

@@ -8,7 +8,7 @@ import dnf
from mock import call, Mock, patch, PropertyMock
import pytest
from module_build_service import conf
from module_build_service.common.config import conf
from module_build_service.common.errors import UnprocessableEntity
from module_build_service.common.models import ModuleBuild
from module_build_service.common.utils import import_mmd, load_mmd, mmd_to_str

View File

@@ -7,7 +7,7 @@ import pytest
from sqlalchemy import func
from module_build_service import conf
from module_build_service.common.config import conf
import module_build_service.common.config
from module_build_service.common.models import BUILD_STATES, ModuleBuild
from module_build_service.scheduler.consumer import MBSConsumer

View File

@@ -5,7 +5,7 @@ import os
from mock import patch, PropertyMock
from module_build_service import build_logs, conf
from module_build_service.common import build_logs, conf
from module_build_service.common.models import BUILD_STATES, ModuleBuild
from module_build_service.common.utils import load_mmd, mmd_to_str
from module_build_service.scheduler.db_session import db_session

View File

@@ -8,8 +8,9 @@ import mock
from mock import patch
import pytest
from module_build_service import build_logs, conf, Modulemd
from module_build_service.common import build_logs, conf
from module_build_service.common.models import ComponentBuild, ModuleBuild
from module_build_service.common.modulemd import Modulemd
import module_build_service.resolver
from module_build_service.scheduler.db_session import db_session
import module_build_service.scheduler.handlers.modules

View File

@@ -9,7 +9,7 @@ import mock
from mock import call, patch
import pytest
from module_build_service import conf
from module_build_service.common.config import conf
from module_build_service.common import models
from module_build_service.scheduler import producer
from module_build_service.scheduler.db_session import db_session

View File

@@ -6,8 +6,8 @@ import mock
import pytest
from sqlalchemy.orm.session import make_transient
from module_build_service import Modulemd
from module_build_service.common import models
from module_build_service.common.modulemd import Modulemd
from module_build_service.common.utils import import_mmd, load_mmd, mmd_to_str
from module_build_service.scheduler.db_session import db_session
from module_build_service.scheduler.reuse import get_reusable_component, get_reusable_module

View File

@@ -6,8 +6,8 @@ from datetime import datetime
import mock
import pytest
from module_build_service import app, conf
from module_build_service.common import models
from module_build_service import app
from module_build_service.common import conf, models
from module_build_service.common.errors import UnprocessableEntity
from module_build_service.common.utils import load_mmd, load_mmd_file, mmd_to_str
from module_build_service.scheduler.db_session import db_session

View File

@@ -4,7 +4,7 @@ from __future__ import absolute_import
from mock import patch, Mock
from module_build_service import conf
from module_build_service.common.config import conf
from module_build_service.scheduler import ursine
from tests import make_module, make_module_in_db, clean_database