From d9f32bff9da95f22287a0439351f1c893e3484a2 Mon Sep 17 00:00:00 2001 From: mprahl Date: Mar 03 2020 19:48:47 +0000 Subject: Move errors.py to common/errors.py --- diff --git a/docs/CONTRIBUTING.rst b/docs/CONTRIBUTING.rst index 2c02621..94df4c1 100644 --- a/docs/CONTRIBUTING.rst +++ b/docs/CONTRIBUTING.rst @@ -102,7 +102,7 @@ Additionally, the imports should be ordered by standard library, third-party, th import requests import module_build_service.web - from module_build_service.errors import ValidationError + from module_build_service.common.errors import ValidationError Lastly, hanging indentation should be avoided when possible. For example: diff --git a/module_build_service/__init__.py b/module_build_service/__init__.py index c7af037..69b0d34 100644 --- a/module_build_service/__init__.py +++ b/module_build_service/__init__.py @@ -31,7 +31,7 @@ from gi.repository import Modulemd # noqa from module_build_service.logger import init_logging, ModuleBuildLogs, level_flags, MBSLogger -from module_build_service.errors import ( +from module_build_service.common.errors import ( ValidationError, Unauthorized, UnprocessableEntity, Conflict, NotFound, Forbidden, json_error) from module_build_service.common.config import init_config diff --git a/module_build_service/builder/utils.py b/module_build_service/builder/utils.py index 081b9d5..7fc18dd 100644 --- a/module_build_service/builder/utils.py +++ b/module_build_service/builder/utils.py @@ -13,7 +13,7 @@ from multiprocessing.dummy import Pool as ThreadPool import requests from module_build_service import conf, log, models -from module_build_service.errors import ValidationError, ProgrammingError +from module_build_service.common.errors import ValidationError, ProgrammingError logging.basicConfig(level=logging.DEBUG) diff --git a/module_build_service/common/errors.py b/module_build_service/common/errors.py new file mode 100644 index 0000000..68f44dc --- /dev/null +++ b/module_build_service/common/errors.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# SPDX-License-Identifier: MIT +""" Defines custom exceptions and error handling functions """ +from flask import jsonify + + +class ValidationError(ValueError): + pass + + +class Unauthorized(ValueError): + pass + + +class Forbidden(ValueError): + pass + + +class UnprocessableEntity(ValueError): + pass + + +class Conflict(ValueError): + pass + + +class NotFound(ValueError): + pass + + +class ProgrammingError(ValueError): + pass + + +class StreamAmbigous(ValueError): + pass + + +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""" diff --git a/module_build_service/common/koji.py b/module_build_service/common/koji.py index 0c9bbcb..cf779d9 100644 --- a/module_build_service/common/koji.py +++ b/module_build_service/common/koji.py @@ -9,7 +9,7 @@ import six.moves.xmlrpc_client as xmlrpclib from module_build_service import log from module_build_service.common.retry import retry -from module_build_service.errors import ProgrammingError +from module_build_service.common.errors import ProgrammingError def koji_multicall_map(koji_session, koji_session_fnc, list_of_args=None, list_of_kwargs=None): diff --git a/module_build_service/common/resolve.py b/module_build_service/common/resolve.py index 2436c5f..81fff20 100644 --- a/module_build_service/common/resolve.py +++ b/module_build_service/common/resolve.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # SPDX-License-Identifier: MIT from module_build_service import conf -from module_build_service.errors import StreamAmbigous +from module_build_service.common.errors import StreamAmbigous from module_build_service.resolver import GenericResolver diff --git a/module_build_service/common/submit.py b/module_build_service/common/submit.py index ddab5b0..4d12849 100644 --- a/module_build_service/common/submit.py +++ b/module_build_service/common/submit.py @@ -8,7 +8,7 @@ import requests import module_build_service.scm from module_build_service import conf, log from module_build_service.common.utils import load_mmd_file -from module_build_service.errors import ValidationError +from module_build_service.common.errors import ValidationError def _is_eol_in_pdc(name, stream): diff --git a/module_build_service/common/utils.py b/module_build_service/common/utils.py index eb3f902..da053f4 100644 --- a/module_build_service/common/utils.py +++ b/module_build_service/common/utils.py @@ -8,7 +8,7 @@ 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.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity def to_text_type(s): diff --git a/module_build_service/errors.py b/module_build_service/errors.py deleted file mode 100644 index 68f44dc..0000000 --- a/module_build_service/errors.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# SPDX-License-Identifier: MIT -""" Defines custom exceptions and error handling functions """ -from flask import jsonify - - -class ValidationError(ValueError): - pass - - -class Unauthorized(ValueError): - pass - - -class Forbidden(ValueError): - pass - - -class UnprocessableEntity(ValueError): - pass - - -class Conflict(ValueError): - pass - - -class NotFound(ValueError): - pass - - -class ProgrammingError(ValueError): - pass - - -class StreamAmbigous(ValueError): - pass - - -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""" diff --git a/module_build_service/manage.py b/module_build_service/manage.py index b352a34..15d928c 100755 --- a/module_build_service/manage.py +++ b/module_build_service/manage.py @@ -16,7 +16,7 @@ from module_build_service.builder.MockModuleBuilder import ( ) from module_build_service.common.utils import load_mmd_file, import_mmd from module_build_service.scheduler.db_session import db_session -from module_build_service.errors import StreamAmbigous +from module_build_service.common.errors import StreamAmbigous import module_build_service.scheduler.consumer import module_build_service.scheduler.local from module_build_service.web.submit import submit_module_build_from_yaml diff --git a/module_build_service/models.py b/module_build_service/models.py index 60ed205..7024bfa 100644 --- a/module_build_service/models.py +++ b/module_build_service/models.py @@ -19,7 +19,7 @@ from sqlalchemy.orm import validates, load_only from module_build_service import db, log, get_url_for, conf import module_build_service.common.messaging from module_build_service.common.utils import load_mmd -from module_build_service.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity from module_build_service.scheduler import events DEFAULT_MODULE_CONTEXT = "00000000" diff --git a/module_build_service/resolver/DBResolver.py b/module_build_service/resolver/DBResolver.py index 66205f0..2372afe 100644 --- a/module_build_service/resolver/DBResolver.py +++ b/module_build_service/resolver/DBResolver.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import aliased from module_build_service import log, db from module_build_service.resolver.base import GenericResolver from module_build_service import models -from module_build_service.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity from module_build_service.common.utils import load_mmd import sqlalchemy diff --git a/module_build_service/resolver/MBSResolver.py b/module_build_service/resolver/MBSResolver.py index 01c1535..2aa9036 100644 --- a/module_build_service/resolver/MBSResolver.py +++ b/module_build_service/resolver/MBSResolver.py @@ -8,7 +8,7 @@ import kobo.rpmlib from module_build_service import conf from module_build_service import models from module_build_service.common.utils import load_mmd, import_mmd -from module_build_service.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity from module_build_service.resolver.KojiResolver import KojiResolver from module_build_service.common.request_utils import requests_session diff --git a/module_build_service/scheduler/consumer.py b/module_build_service/scheduler/consumer.py index 92e4357..9a6b9a5 100644 --- a/module_build_service/scheduler/consumer.py +++ b/module_build_service/scheduler/consumer.py @@ -23,7 +23,7 @@ import module_build_service.common.messaging import module_build_service.common.monitor as monitor from module_build_service import models, log, conf from module_build_service.scheduler.db_session import db_session -from module_build_service.errors import IgnoreMessage +from module_build_service.common.errors import IgnoreMessage from module_build_service.common.messaging import default_messaging_backend from module_build_service.scheduler import events from module_build_service.scheduler.handlers import components diff --git a/module_build_service/scheduler/default_modules.py b/module_build_service/scheduler/default_modules.py index 56b5ba3..7faa4d3 100644 --- a/module_build_service/scheduler/default_modules.py +++ b/module_build_service/scheduler/default_modules.py @@ -17,7 +17,7 @@ from module_build_service.common.resolve import ( ) from module_build_service.common.retry import retry from module_build_service.scheduler.db_session import db_session -from module_build_service.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity from module_build_service.resolver.base import GenericResolver diff --git a/module_build_service/scheduler/greenwave.py b/module_build_service/scheduler/greenwave.py index 1d2f52f..d43c85d 100644 --- a/module_build_service/scheduler/greenwave.py +++ b/module_build_service/scheduler/greenwave.py @@ -6,7 +6,7 @@ import json import requests from module_build_service import log, conf -from module_build_service.errors import GreenwaveError +from module_build_service.common.errors import GreenwaveError class Greenwave(object): diff --git a/module_build_service/scheduler/handlers/modules.py b/module_build_service/scheduler/handlers/modules.py index d22d9d5..81e849f 100644 --- a/module_build_service/scheduler/handlers/modules.py +++ b/module_build_service/scheduler/handlers/modules.py @@ -15,7 +15,7 @@ from module_build_service.scheduler.submit import ( ) from module_build_service.scheduler.db_session import db_session from module_build_service.builder import GenericBuilder -from module_build_service.errors import UnprocessableEntity, Forbidden, ValidationError +from module_build_service.common.errors import UnprocessableEntity, Forbidden, ValidationError from module_build_service.scheduler.default_modules import ( add_default_modules, handle_collisions_with_base_module_rpms) from module_build_service.scheduler.greenwave import greenwave diff --git a/module_build_service/scheduler/parser.py b/module_build_service/scheduler/parser.py index f7a1fe0..fe8ec4e 100644 --- a/module_build_service/scheduler/parser.py +++ b/module_build_service/scheduler/parser.py @@ -4,7 +4,7 @@ import re from module_build_service import log -from module_build_service.errors import IgnoreMessage +from module_build_service.common.errors import IgnoreMessage from module_build_service.scheduler import events diff --git a/module_build_service/scheduler/submit.py b/module_build_service/scheduler/submit.py index 75f737a..efb7288 100644 --- a/module_build_service/scheduler/submit.py +++ b/module_build_service/scheduler/submit.py @@ -11,7 +11,7 @@ from module_build_service import conf, log, models, 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 -from module_build_service.errors import ValidationError, UnprocessableEntity, Forbidden +from module_build_service.common.errors import ValidationError, UnprocessableEntity, Forbidden import module_build_service.scm diff --git a/module_build_service/scm.py b/module_build_service/scm.py index f54f8ae..00fb8b1 100644 --- a/module_build_service/scm.py +++ b/module_build_service/scm.py @@ -11,7 +11,7 @@ import datetime from module_build_service import log, conf from module_build_service.common.retry import retry -from module_build_service.errors import ( +from module_build_service.common.errors import ( Forbidden, ValidationError, UnprocessableEntity, diff --git a/module_build_service/views.py b/module_build_service/views.py index 134caac..c68e58d 100644 --- a/module_build_service/views.py +++ b/module_build_service/views.py @@ -13,7 +13,9 @@ from prometheus_client import generate_latest, CONTENT_TYPE_LATEST from module_build_service import app, conf, log, models, db, version, api_version as max_api_version from module_build_service.common.utils import import_mmd -from module_build_service.errors import ValidationError, Forbidden, NotFound, ProgrammingError +from module_build_service.common.errors import ( + ValidationError, Forbidden, NotFound, ProgrammingError +) from module_build_service.web.backports import jsonify from module_build_service.common.monitor import registry from module_build_service.common.submit import fetch_mmd diff --git a/module_build_service/web/auth.py b/module_build_service/web/auth.py index 2d92acd..43b0c52 100644 --- a/module_build_service/web/auth.py +++ b/module_build_service/web/auth.py @@ -9,7 +9,7 @@ from flask import g from dogpile.cache import make_region -from module_build_service.errors import Unauthorized, Forbidden +from module_build_service.common.errors import Unauthorized, Forbidden from module_build_service import app, log, conf try: diff --git a/module_build_service/web/mse.py b/module_build_service/web/mse.py index 82e2f6d..edb22de 100644 --- a/module_build_service/web/mse.py +++ b/module_build_service/web/mse.py @@ -3,8 +3,8 @@ from module_build_service import log, models, Modulemd, conf 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.errors import StreamAmbigous -from module_build_service.errors import UnprocessableEntity +from module_build_service.common.errors import StreamAmbigous +from module_build_service.common.errors import UnprocessableEntity from module_build_service.web.mmd_resolver import MMDResolver from module_build_service.web.utils import deps_to_dict from module_build_service.resolver import GenericResolver diff --git a/module_build_service/web/submit.py b/module_build_service/web/submit.py index 5eabfda..d61665c 100644 --- a/module_build_service/web/submit.py +++ b/module_build_service/web/submit.py @@ -13,7 +13,7 @@ import requests from module_build_service import conf, log, models, 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.errors import Conflict, Forbidden, ValidationError +from module_build_service.common.errors import Conflict, Forbidden, ValidationError from module_build_service.web.mse import generate_expanded_mmds from module_build_service.web.utils import deps_to_dict diff --git a/module_build_service/web/utils.py b/module_build_service/web/utils.py index 4243369..d2a48d9 100644 --- a/module_build_service/web/utils.py +++ b/module_build_service/web/utils.py @@ -11,7 +11,7 @@ from sqlalchemy.orm import aliased import sqlalchemy from module_build_service import models, api_version, conf, db -from module_build_service.errors import ValidationError, NotFound +from module_build_service.common.errors import ValidationError, NotFound from module_build_service.scm import scm_url_schemes diff --git a/tests/test_build/test_build.py b/tests/test_build/test_build.py index f4336f6..a065bf8 100644 --- a/tests/test_build/test_build.py +++ b/tests/test_build/test_build.py @@ -17,7 +17,7 @@ from module_build_service.builder.utils import get_rpm_release from module_build_service.common.utils import load_mmd, import_mmd import module_build_service.scheduler.consumer import module_build_service.scheduler.handlers.repos -from module_build_service.errors import Forbidden +from module_build_service.common.errors import Forbidden from module_build_service import app, models, conf, build_logs, log from module_build_service.scheduler.db_session import db_session from module_build_service.scheduler import events diff --git a/tests/test_builder/test_builder_utils.py b/tests/test_builder/test_builder_utils.py index 3c2ddda..f8ab62c 100644 --- a/tests/test_builder/test_builder_utils.py +++ b/tests/test_builder/test_builder_utils.py @@ -9,7 +9,7 @@ import pytest from module_build_service import conf, models from module_build_service.builder import utils from module_build_service.scheduler.db_session import db_session -from module_build_service.errors import ProgrammingError, ValidationError +from module_build_service.common.errors import ProgrammingError, ValidationError from module_build_service.common.utils import load_mmd, import_mmd, mmd_to_str from tests import init_data, read_staged_data, scheduler_init_data diff --git a/tests/test_common/test_utils.py b/tests/test_common/test_utils.py index 966a5ae..1dcf366 100644 --- a/tests/test_common/test_utils.py +++ b/tests/test_common/test_utils.py @@ -5,7 +5,7 @@ import pytest from module_build_service import models from module_build_service.common.utils import import_mmd, load_mmd from module_build_service.scheduler.db_session import db_session -from module_build_service.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity from tests import clean_database, read_staged_data diff --git a/tests/test_resolver/test_db.py b/tests/test_resolver/test_db.py index 697c5ea..f3ce952 100644 --- a/tests/test_resolver/test_db.py +++ b/tests/test_resolver/test_db.py @@ -10,7 +10,7 @@ import module_build_service.resolver as mbs_resolver from module_build_service import conf, models, Modulemd from module_build_service.common.utils import import_mmd, load_mmd, mmd_to_str from module_build_service.models import ModuleBuild -from module_build_service.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity from module_build_service.scheduler.db_session import db_session from module_build_service.builder.MockModuleBuilder import load_local_builds import tests diff --git a/tests/test_scheduler/test_default_modules.py b/tests/test_scheduler/test_default_modules.py index a348c8c..76f0550 100644 --- a/tests/test_scheduler/test_default_modules.py +++ b/tests/test_scheduler/test_default_modules.py @@ -10,7 +10,7 @@ import pytest from module_build_service import conf 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.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity from module_build_service.models import ModuleBuild from module_build_service.scheduler import default_modules from tests import clean_database, make_module_in_db, read_staged_data diff --git a/tests/test_scheduler/test_submit.py b/tests/test_scheduler/test_submit.py index 9f21d9a..97feca4 100644 --- a/tests/test_scheduler/test_submit.py +++ b/tests/test_scheduler/test_submit.py @@ -9,7 +9,7 @@ from module_build_service.common.utils import load_mmd, load_mmd_file, mmd_to_st from module_build_service.scheduler.db_session import db_session import module_build_service.scm from module_build_service import app, models, conf -from module_build_service.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity import module_build_service.scheduler.handlers.components from module_build_service.scheduler.submit import ( get_build_arches, format_mmd, record_component_builds, record_module_build_arches @@ -271,7 +271,7 @@ class TestSubmit: mmd = original_mmd.copy("testmodule", "master") - from module_build_service.errors import ValidationError + from module_build_service.common.errors import ValidationError with pytest.raises( ValidationError, match=r"Component build .+ of module build .+ already exists in database"): diff --git a/tests/test_scm.py b/tests/test_scm.py index 6529bad..52e0222 100644 --- a/tests/test_scm.py +++ b/tests/test_scm.py @@ -7,7 +7,7 @@ import tempfile import pytest import module_build_service.scm -from module_build_service.errors import ValidationError, UnprocessableEntity +from module_build_service.common.errors import ValidationError, UnprocessableEntity base_dir = os.path.join(os.path.dirname(__file__), "scm_data") repo_url = "file://" + base_dir + "/testrepo" diff --git a/tests/test_views/test_views.py b/tests/test_views/test_views.py index 5d53a13..499a125 100644 --- a/tests/test_views/test_views.py +++ b/tests/test_views/test_views.py @@ -30,7 +30,7 @@ from tests import ( ) from tests.test_scm import base_dir as scm_base_dir from module_build_service.scheduler.db_session import db_session -from module_build_service.errors import UnprocessableEntity +from module_build_service.common.errors import UnprocessableEntity from module_build_service.models import ModuleBuild, BUILD_STATES, ComponentBuild from module_build_service import app, version import module_build_service.common.config as mbs_config diff --git a/tests/test_web/test_auth.py b/tests/test_web/test_auth.py index 397930b..d7de461 100644 --- a/tests/test_web/test_auth.py +++ b/tests/test_web/test_auth.py @@ -8,7 +8,7 @@ import mock from mock import patch, PropertyMock, Mock import module_build_service.web.auth -import module_build_service.errors +import module_build_service.common.errors import module_build_service.common.config as mbs_config from module_build_service import app @@ -24,7 +24,7 @@ class TestAuthModule: request = mock.MagicMock() request.cookies.return_value = {} - with pytest.raises(module_build_service.errors.Unauthorized) as cm: + with pytest.raises(module_build_service.common.errors.Unauthorized) as cm: with app.app_context(): module_build_service.web.auth.get_user(request) assert str(cm.value) == "No 'authorization' header found." @@ -56,7 +56,7 @@ class TestAuthModule: request.headers.__setitem__.side_effect = headers.__setitem__ request.headers.__contains__.side_effect = headers.__contains__ - with pytest.raises(module_build_service.errors.Unauthorized) as cm: + with pytest.raises(module_build_service.common.errors.Unauthorized) as cm: with app.app_context(): module_build_service.web.auth.get_user(request) assert str(cm.value) == "OIDC token invalid or expired." @@ -88,7 +88,7 @@ class TestAuthModule: request.headers.__setitem__.side_effect = headers.__setitem__ request.headers.__contains__.side_effect = headers.__contains__ - with pytest.raises(module_build_service.errors.Unauthorized) as cm: + with pytest.raises(module_build_service.common.errors.Unauthorized) as cm: with app.app_context(): module_build_service.web.auth.get_user(request) assert str(cm.value) == "OpenIDC auth error: Cannot determine the user's groups" @@ -148,7 +148,7 @@ class TestAuthModule: @patch("module_build_service.web.auth.client_secrets", None) def test_misconfiguring_oidc_client_secrets_should_be_failed(self): request = mock.MagicMock() - with pytest.raises(module_build_service.errors.Forbidden) as cm: + with pytest.raises(module_build_service.common.errors.Forbidden) as cm: with app.app_context(): module_build_service.web.auth.get_user(request) assert str(cm.value) == "OIDC_CLIENT_SECRETS must be set in server config." @@ -180,7 +180,7 @@ class TestAuthModule: request.headers.__setitem__.side_effect = headers.__setitem__ request.headers.__contains__.side_effect = headers.__contains__ - with pytest.raises(module_build_service.errors.Unauthorized) as cm: + with pytest.raises(module_build_service.common.errors.Unauthorized) as cm: with app.app_context(): module_build_service.web.auth.get_user(request) assert str(cm.value) == ( @@ -212,7 +212,7 @@ class TestAuthModule: request.headers.__setitem__.side_effect = headers.__setitem__ request.headers.__contains__.side_effect = headers.__contains__ - with pytest.raises(module_build_service.errors.Forbidden) as cm: + with pytest.raises(module_build_service.common.errors.Forbidden) as cm: with app.app_context(): module_build_service.web.auth.get_user(request) assert str(cm.value) == "OIDC_REQUIRED_SCOPE must be set in server config." @@ -222,7 +222,7 @@ class TestAuthModule: request = Mock() request.environ.get.return_value = remote_name - with pytest.raises(module_build_service.errors.Unauthorized): + with pytest.raises(module_build_service.common.errors.Unauthorized): module_build_service.web.auth.get_user_kerberos(request) @patch.object(module_build_service.web.auth.conf, "allowed_users", new=["someone", "somebody"]) diff --git a/tests/test_web/test_mse.py b/tests/test_web/test_mse.py index 0e94ad4..5ad6d10 100644 --- a/tests/test_web/test_mse.py +++ b/tests/test_web/test_mse.py @@ -3,7 +3,7 @@ import pytest from module_build_service.scheduler.db_session import db_session -from module_build_service.errors import StreamAmbigous +from module_build_service.common.errors import StreamAmbigous from module_build_service.web.mse import ( expand_mse_streams, generate_expanded_mmds, get_mmds_required_by_module_recursively ) diff --git a/tests/test_web/test_submit.py b/tests/test_web/test_submit.py index 5bcb983..7d566d7 100644 --- a/tests/test_web/test_submit.py +++ b/tests/test_web/test_submit.py @@ -12,7 +12,7 @@ from werkzeug.datastructures import FileStorage from module_build_service import models from module_build_service.common.utils import mmd_to_str from module_build_service.scheduler.db_session import db_session -from module_build_service.errors import ValidationError +from module_build_service.common.errors import ValidationError from module_build_service.web.submit import ( get_prefixed_version, submit_module_build, submit_module_build_from_yaml )