From eafa93037ffe0235569e0cdce70e8cd9080645cd Mon Sep 17 00:00:00 2001 From: Valerij Maljulin Date: Feb 15 2019 14:19:59 +0000 Subject: Make finalization before changing state to done Signed-off-by: Valerij Maljulin --- diff --git a/module_build_service/builder/KojiModuleBuilder.py b/module_build_service/builder/KojiModuleBuilder.py index b461150..8d8f569 100644 --- a/module_build_service/builder/KojiModuleBuilder.py +++ b/module_build_service/builder/KojiModuleBuilder.py @@ -1205,8 +1205,9 @@ chmod 644 %buildroot/etc/rpm/macros.zz-modules return list(nvrs) def finalize(self): - # Only import to koji CG if the module is "done". - if self.config.koji_enable_content_generator and self.module.state == 3: + # Only import to koji CG if the module is "build". + if self.config.koji_enable_content_generator and \ + self.module.state == models.BUILD_STATES['build']: cg = KojiContentGenerator(self.module, self.config) cg.koji_import() if conf.koji_cg_devel_module: diff --git a/module_build_service/scheduler/handlers/modules.py b/module_build_service/scheduler/handlers/modules.py index f18f43d..284cd0f 100644 --- a/module_build_service/scheduler/handlers/modules.py +++ b/module_build_service/scheduler/handlers/modules.py @@ -128,12 +128,6 @@ def done(config, session, msg): # This is ok.. it's a race condition we can ignore. pass - builder = module_build_service.builder.GenericBuilder.create_from_module( - session, build, config) - - # Tell the external buildsystem to wrap up (CG import, createrepo, etc.) - builder.finalize() - build.transition(config, state="ready") session.commit() diff --git a/module_build_service/scheduler/handlers/repos.py b/module_build_service/scheduler/handlers/repos.py index d04a3c9..be9e9a2 100644 --- a/module_build_service/scheduler/handlers/repos.py +++ b/module_build_service/scheduler/handlers/repos.py @@ -120,13 +120,9 @@ def done(config, session, msg): # So now we can either start a new batch if there are still some to build # or, if everything is built successfully, then we can bless the module as # complete. - has_unbuilt_components = False - has_failed_components = False - for c in module_build.component_builds: - if c.state in [None, koji.BUILD_STATES['BUILDING']]: - has_unbuilt_components = True - elif (c.state in failed_states): - has_failed_components = True + has_unbuilt_components = any(c.state in [None, koji.BUILD_STATES['BUILDING']] + for c in module_build.component_builds) + has_failed_components = any(c.state in failed_states for c in module_build.component_builds) further_work = [] if has_unbuilt_components and not has_failed_components: @@ -152,6 +148,9 @@ def done(config, session, msg): state=models.BUILD_STATES['failed'], state_reason=state_reason) else: + # Tell the external buildsystem to wrap up (CG import, createrepo, etc.) + builder.finalize() + module_build.transition(config, state=models.BUILD_STATES['done']) session.commit() diff --git a/tests/test_builder/test_koji.py b/tests/test_builder/test_koji.py index b461995..49569b0 100644 --- a/tests/test_builder/test_koji.py +++ b/tests/test_builder/test_koji.py @@ -666,7 +666,7 @@ class TestKojiBuilder: ]) @mock.patch('module_build_service.builder.KojiModuleBuilder.KojiContentGenerator') def test_finalize(self, mock_koji_cg_cls, cg_enabled, cg_devel_enabled): - self.module.state = 3 + self.module.state = 2 with patch('module_build_service.config.Config.koji_enable_content_generator', new_callable=mock.PropertyMock, return_value=cg_enabled): with patch('module_build_service.config.Config.koji_cg_devel_module', diff --git a/tests/test_scheduler/test_repo_done.py b/tests/test_scheduler/test_repo_done.py index 673426d..b916464 100644 --- a/tests/test_scheduler/test_repo_done.py +++ b/tests/test_scheduler/test_repo_done.py @@ -76,6 +76,39 @@ class TestRepoDone: '#fbed359411a1baa08d4a88e0d12d426fbf8f602c')) @mock.patch('module_build_service.builder.KojiModuleBuilder.' + 'KojiModuleBuilder.finalize') + @mock.patch('module_build_service.builder.KojiModuleBuilder.' + 'KojiModuleBuilder.recover_orphaned_artifact', return_value=[]) + @mock.patch('module_build_service.builder.KojiModuleBuilder.' + 'KojiModuleBuilder.get_average_build_time', + return_value=0.0) + @mock.patch('module_build_service.builder.KojiModuleBuilder.' + 'KojiModuleBuilder.list_tasks_for_components', + return_value=[]) + @mock.patch('module_build_service.builder.KojiModuleBuilder.' + 'KojiModuleBuilder.buildroot_ready', return_value=True) + @mock.patch('module_build_service.builder.KojiModuleBuilder.' + 'KojiModuleBuilder.get_session') + @mock.patch('module_build_service.builder.KojiModuleBuilder.' + 'KojiModuleBuilder.build') + @mock.patch('module_build_service.builder.KojiModuleBuilder.' + 'KojiModuleBuilder.buildroot_connect') + def test_a_single_match_finalize(self, connect, build_fn, get_session, ready, list_tasks_fn, + mock_gabt, mock_uea, finalizer): + """ Test that when a repo msg hits us and we have a single match. + """ + scheduler_init_data(tangerine_state=1) + get_session.return_value = mock.Mock(), 'development' + build_fn.return_value = 1234, 1, '', None + + msg = module_build_service.messaging.KojiRepoChange( + 'some_msg_id', 'module-testmodule-master-20170109091357-7c29193d-build') + module_build_service.scheduler.handlers.repos.done( + config=conf, session=db.session, msg=msg) + + finalizer.assert_called_once() + + @mock.patch('module_build_service.builder.KojiModuleBuilder.' 'KojiModuleBuilder.recover_orphaned_artifact', return_value=[]) @mock.patch('module_build_service.builder.KojiModuleBuilder.' 'KojiModuleBuilder.get_average_build_time',