From 40a3448dcac1c873765af2da568c2473f630fba4 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Wed, 13 Jul 2016 16:55:51 -0400 Subject: [PATCH] Some handlers and one test. --- rida/scheduler/handlers/__init__.py | 0 rida/scheduler/handlers/modules.py | 67 +++++++++++++++++++ test-requirements.txt | 2 + tests/__init__.py | 0 tests/test_scheduler/__init__.py | 0 tests/test_scheduler/test_modules/__init__.py | 0 .../test_scheduler/test_modules/test_init.py | 55 +++++++++++++++ 7 files changed, 124 insertions(+) create mode 100644 rida/scheduler/handlers/__init__.py create mode 100644 rida/scheduler/handlers/modules.py create mode 100644 test-requirements.txt create mode 100644 tests/__init__.py create mode 100644 tests/test_scheduler/__init__.py create mode 100644 tests/test_scheduler/test_modules/__init__.py create mode 100644 tests/test_scheduler/test_modules/test_init.py diff --git a/rida/scheduler/handlers/__init__.py b/rida/scheduler/handlers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/rida/scheduler/handlers/modules.py b/rida/scheduler/handlers/modules.py new file mode 100644 index 00000000..8df6342e --- /dev/null +++ b/rida/scheduler/handlers/modules.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2016 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. +# +# Written by Ralph Bean + +""" Handlers for module change events on the message bus. """ + +import rida.builder +import rida.database +import rida.pdc + + +def init(config, session, msg): + """ Called whenever a module enters the 'init' state. + + We usually transition to this state when the modulebuild is first requested. + + All we do here is request preparation of the buildroot. + """ + build = rida.database.ModuleBuild.from_fedmsg(session, msg) + pdc = rida.pdc.get_pdc_client_session(config) + module_info = build.to_pdc_module_info() + tag = rida.pdc.get_module_tag(pdc, module_info) + dependencies = rida.pdc.get_module_dependencies(pdc, module_info) + builder = rida.builder.KojiModuleBuilder(build.name, config) + builder.buildroot_add_dependency(dependencies) + build.buildroot_task_id = builder.buildroot_prep() + build.state = "wait" # Wait for the buildroot to be ready. + + +def build(config, session, msg): + """ Called whenever a module enters the "build" state. + + We usually transition to this state once the buildroot is ready. + + All we do here is kick off builds of all our components. + """ + module_build = rida.database.ModuleBuild.from_fedmsg(session, msg) + for component_build in module_build.component_builds: + scmurl = "{dist_git}/rpms/{package}?#{gitref}".format( + dist_git=config.dist_git_url, + package=component_build.package, + gitref=component_build.gitref, # This is the update stream + ) + artifact_name = 'TODO' + component_build.task = builder.build(artifact_name, scmurl) + component_build.state = koji.BUILD_STATES['BUILDING'] + + build.state = "build" # Now wait for all of those to finish. diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 00000000..a6786964 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,2 @@ +nose +mock diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_scheduler/__init__.py b/tests/test_scheduler/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_scheduler/test_modules/__init__.py b/tests/test_scheduler/test_modules/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_scheduler/test_modules/test_init.py b/tests/test_scheduler/test_modules/test_init.py new file mode 100644 index 00000000..294e1be8 --- /dev/null +++ b/tests/test_scheduler/test_modules/test_init.py @@ -0,0 +1,55 @@ +# Copyright (c) 2016 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. +# +# Written by Ralph Bean + +import unittest +import mock + +import rida.scheduler.handlers.modules + + +class TestInit(unittest.TestCase): + + def setUp(self): + self.config = mock.Mock() + self.session = mock.Mock() + self.fn = rida.scheduler.handlers.modules.init + + @mock.patch('rida.builder.KojiModuleBuilder') + @mock.patch('rida.database.ModuleBuild.from_fedmsg') + @mock.patch('rida.pdc.get_pdc_client_session') + def test_init_basic(self, pdc, from_fedmsg, KojiModuleBuilder): + builder = mock.Mock() + KojiModuleBuilder.return_value = builder + mocked_module_build = mock.Mock() + mocked_module_build.to_pdc_module_info.return_value = { + 'name': 'foo', + 'version': 1, + } + from_fedmsg.return_value = mocked_module_build + + msg = { + 'topic': 'org.fedoraproject.prod.rida.module.state.change', + 'msg': { + 'id': 1, + }, + } + self.fn(config=self.config, session=self.session, msg=msg)