From 11698c4a17e14893d933a3ef37d0e9a4e11a634d Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Aug 03 2017 05:34:05 +0000 Subject: Fix bugs found during dev deployment, add documentation of available handlers. --- diff --git a/MANIFEST.in b/MANIFEST.in index 52e84af..f966807 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -8,3 +8,4 @@ recursive-include docs *.txt *.rst *.md recursive-include freshmaker * recursive-include fedmsg.d * recursive-include tests * +recursive-include contrib * diff --git a/README.md b/README.md index 39376c5..a7f72bd 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,22 @@ The example flow for the modulemd yaml change in dist-git is following: Handlers can be turned on/off in config file. +## List of Freshmaker handlers + +Following is the list of all available HANDLERS: + +* `freshmaker.handlers.koji:KojiTaskStateChangeHandler` +* `freshmaker.handlers.mbs:MBSModuleStateChangeHandler` + * Depends on: MBS, PDC +* `freshmaker.handlers.git:GitRPMSpecChangeHandler` + * Depends on: PDC +* `freshmaker.handlers.brew:BrewSignRPMHandler` + * Depends on: Errata, LightBlue, Pulp, Koji +* `freshmaker.handlers.git:GitDockerfileChangeHandler` +* `freshmaker.handlers.git:GitModuleMetadataChangeHandler` +* `freshmaker.handlers.bodhi:BodhiUpdateCompleteStableHandler` + * Depends on: PDC, Koji + ## Testing ``` diff --git a/conf/configrh.py b/conf/configrh.py index 8da3dcb..0922d7e 100644 --- a/conf/configrh.py +++ b/conf/configrh.py @@ -25,7 +25,7 @@ class BaseConfiguration(config.BaseConfiguration): ] HANDLERS = [ - 'freshmaker.handlers.brew:BrewSignRPMHanlder', + 'freshmaker.handlers.brew:BrewSignRPMHandler', ] KOJI_PROFILE = 'brew' diff --git a/freshmaker/handlers/brew/__init__.py b/freshmaker/handlers/brew/__init__.py index fe210f2..23428e4 100644 --- a/freshmaker/handlers/brew/__init__.py +++ b/freshmaker/handlers/brew/__init__.py @@ -19,4 +19,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -from .sign_rpm import BrewSignRPMHanlder # noqa +from .sign_rpm import BrewSignRPMHandler # noqa diff --git a/freshmaker/handlers/brew/sign_rpm.py b/freshmaker/handlers/brew/sign_rpm.py index 36fd38f..09bab75 100644 --- a/freshmaker/handlers/brew/sign_rpm.py +++ b/freshmaker/handlers/brew/sign_rpm.py @@ -36,7 +36,7 @@ from freshmaker.types import ArtifactType, ArtifactBuildState import json -class BrewSignRPMHanlder(BaseHandler): +class BrewSignRPMHandler(BaseHandler): """Rebuild docker images when a RPM is signed in Brew""" name = 'BrewSignRPMHandler' diff --git a/freshmaker/manage.py b/freshmaker/manage.py index ade4cc7..42f6898 100644 --- a/freshmaker/manage.py +++ b/freshmaker/manage.py @@ -33,7 +33,9 @@ from freshmaker import models manager = Manager(app) help_args = ('-?', '--help') manager.help_args = help_args -migrate = flask_migrate.Migrate(app, db) +migrations_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)), + 'migrations') +migrate = flask_migrate.Migrate(app, db, directory=migrations_dir) manager.add_command('db', flask_migrate.MigrateCommand) diff --git a/freshmaker/pdc.py b/freshmaker/pdc.py index dc7778c..7b716e8 100644 --- a/freshmaker/pdc.py +++ b/freshmaker/pdc.py @@ -69,7 +69,7 @@ class PDC(object): latest_modules.append(sorted(mods, key=lambda x: x['variant_release']).pop()) return list(filter(lambda x: x in latest_modules, modules)) - @freshmaker.utils.retry(wait_on=(requests.ConnectTimeout, requests.ConnectionError), logger=freshmaker.log) + @freshmaker.utils.retry(wait_on=(requests.Timeout, requests.ConnectionError), logger=freshmaker.log) def get_modules(self, **kwargs): """ Query PDC with specified query parameters and return a list of modules. @@ -80,12 +80,12 @@ class PDC(object): modules = self.session['unreleasedvariants'](page_size=-1, **kwargs) return modules - @freshmaker.utils.retry(wait_on=(requests.ConnectTimeout, requests.ConnectionError), logger=freshmaker.log) + @freshmaker.utils.retry(wait_on=(requests.Timeout, requests.ConnectionError), logger=freshmaker.log) def find_containers_by_rpm_name(self, rpm_name): rels = self.session['release-component-relationships'](type='ContainerIncludesRPM', to_component_name=rpm_name) return [rel['from_component'] for rel in rels['results']] - @freshmaker.utils.retry(wait_on=(requests.ConnectTimeout, requests.ConnectionError), logger=freshmaker.log) + @freshmaker.utils.retry(wait_on=(requests.Timeout, requests.ConnectionError), logger=freshmaker.log) def get_release_component_by_id(self, id): return self.session['release-components/{}/'.format(id)]() diff --git a/scripts/print_handlers_md.py b/scripts/print_handlers_md.py new file mode 100644 index 0000000..285fbd2 --- /dev/null +++ b/scripts/print_handlers_md.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2017 Red Hat, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +# +# Prints all the available handlers and their dependencies on other services +# in Markdown format. +# It is intended to be called from the top-level Freshmaker git repository. +# + +from __future__ import print_function +import os +import sys + +# Set the PYTHON_PATH to top level Freshmaker directory and also set +# the FRESHMAKER_DEVELOPER_ENV to 1. +sys.path.append(os.getcwd()) +os.environ["FRESHMAKER_DEVELOPER_ENV"] = "1" + + +def load_module(mod_name): + """ Take a string of the form 'fedmsg.consumers.ircbot' + and return the ircbot module. + """ + __import__(mod_name) + + try: + return sys.modules[mod_name] + except AttributeError: + raise ImportError("%r not found" % (mod_name)) + + +# Key is the name of handler, value is list of dependencies. +handlers = {} + +# Iterate over all directories in the ./freshmaker/handlers directory +# and in each of them, try to find out handlers. +handlers_path = "./freshmaker/handlers/" +for name in os.listdir(handlers_path): + if not os.path.isdir(handlers_path + name) or name in ["__pycache__"]: + continue + mod = load_module("freshmaker.handlers." + name) + for submod_name in dir(mod): + try: + submod = getattr(mod, submod_name) + except: + continue + key = None + deps = [] + for cls in dir(submod): + if cls.endswith("Handler"): + key = "freshmaker.handlers." + name + ":" + cls + elif cls in ["PDC", "MBS", "Pulp", "Errata", "LightBlue"]: + deps.append(cls) + elif cls == "koji_service": + deps.append("Koji") + + if key: + handlers[key] = deps + +print("## List of Freshmaker handlers") +print("") +print("Following is the list of all available HANDLERS:") +print("") + +for name, deps in handlers.items(): + print("* `%s`" % name) + if deps: + print(" * Depends on: %s" % (", ".join(deps))) diff --git a/tests/test_brew_sign_rpm_handler.py b/tests/test_brew_sign_rpm_handler.py index 4afc2c6..87cbd2b 100644 --- a/tests/test_brew_sign_rpm_handler.py +++ b/tests/test_brew_sign_rpm_handler.py @@ -28,7 +28,7 @@ import json from mock import patch, MagicMock, PropertyMock -from freshmaker.handlers.brew.sign_rpm import BrewSignRPMHanlder +from freshmaker.handlers.brew.sign_rpm import BrewSignRPMHandler from freshmaker.errata import ErrataAdvisory from freshmaker import db, events @@ -38,7 +38,7 @@ from freshmaker.types import ArtifactBuildState, ArtifactType @pytest.mark.skipif(six.PY3, reason='koji does not work in Python 3') class TestFindBuildSrpmName(unittest.TestCase): - """Test BrewSignRPMHanlder._find_build_srpm_name""" + """Test BrewSignRPMHandler._find_build_srpm_name""" @patch('koji.ClientSession') def test_find_srpm_name(self, ClientSession): @@ -55,7 +55,7 @@ class TestFindBuildSrpmName(unittest.TestCase): 'nvr': 'bind-dyndb-ldap-2.3-8.el6', }] - handler = BrewSignRPMHanlder() + handler = BrewSignRPMHandler() srpm_name = handler._find_build_srpm_name('bind-dyndb-ldap-2.3-8.el6') session.getBuild.assert_called_once_with('bind-dyndb-ldap-2.3-8.el6') @@ -73,7 +73,7 @@ class TestFindBuildSrpmName(unittest.TestCase): } session.listRPMs.return_value = [] - handler = BrewSignRPMHanlder() + handler = BrewSignRPMHandler() self.assertRaisesRegexp( ValueError, @@ -87,7 +87,7 @@ class TestFindBuildSrpmName(unittest.TestCase): class TestAllowBuild(unittest.TestCase): - """Test BrewSignRPMHanlder.allow_build""" + """Test BrewSignRPMHandler.allow_build""" @patch('freshmaker.errata.Errata.advisories_from_event') @patch('freshmaker.errata.Errata.builds_signed') @@ -104,7 +104,7 @@ class TestAllowBuild(unittest.TestCase): builds_signed.return_value = False event = MagicMock() - handler = BrewSignRPMHanlder() + handler = BrewSignRPMHandler() handler.handle(event) builds_signed.assert_not_called() @@ -125,7 +125,7 @@ class TestAllowBuild(unittest.TestCase): builds_signed.return_value = False event = MagicMock() - handler = BrewSignRPMHanlder() + handler = BrewSignRPMHandler() handler.handle(event) builds_signed.assert_called_once() @@ -181,7 +181,7 @@ class TestBatches(unittest.TestCase): # Record the batches. event = events.BrewSignRPMEvent("123", "openssl-1.1.0-1") - handler = BrewSignRPMHanlder() + handler = BrewSignRPMHandler() handler._record_batches(batches, event) # Check that the images have proper data in proper db columns.