From aed51dfae1b01af6a128b8e2fd4c9c2f5a4abc4b Mon Sep 17 00:00:00 2001 From: Valerij Maljulin Date: Jan 10 2019 14:22:37 +0000 Subject: [PATCH 1/3] Adding exception handling while doing import This fixes #1068 Signed-off-by: Valerij Maljulin --- diff --git a/module_build_service/builder/KojiContentGenerator.py b/module_build_service/builder/KojiContentGenerator.py index d616ea1..138e11c 100644 --- a/module_build_service/builder/KojiContentGenerator.py +++ b/module_build_service/builder/KojiContentGenerator.py @@ -871,16 +871,23 @@ class KojiContentGenerator(object): metadata = self._get_content_generator_metadata(file_dir) try: serverdir = self._upload_outputs(session, metadata, file_dir) - build_info = session.CGImport(metadata, serverdir) + try: + build_info = session.CGImport(metadata, serverdir) + except koji.GenericError as e: + if "Build already exists" not in str(e): + raise + log.warning('Failed to import content generator') + build_info = None if conf.koji_cg_tag_build: self._tag_cg_build() - log.info("Content generator import done.") - log.debug(json.dumps(build_info, sort_keys=True, indent=4)) - - # Only remove the logs if CG import was successful. If it fails, - # then we want to keep them around for debugging. - log.info("Removing %r" % file_dir) - shutil.rmtree(file_dir) + if build_info is not None: + log.info("Content generator import done.") + log.debug(json.dumps(build_info, sort_keys=True, indent=4)) + + # Only remove the logs if CG import was successful. If it fails, + # then we want to keep them around for debugging. + log.info("Removing %r", file_dir) + shutil.rmtree(file_dir) except Exception as e: log.exception("Content generator import failed: %s", e) raise e From 51a98923982d6a7956e5dc5f77a326eebe96aa5a Mon Sep 17 00:00:00 2001 From: Valerij Maljulin Date: Jan 10 2019 14:22:37 +0000 Subject: [PATCH 2/3] Unit tests for koji_import Signed-off-by: Valerij Maljulin --- diff --git a/tests/test_content_generator.py b/tests/test_content_generator.py index 04f1e2d..2231ba4 100644 --- a/tests/test_content_generator.py +++ b/tests/test_content_generator.py @@ -37,6 +37,8 @@ import kobo.rpmlib from tests import init_data from tests.test_views.test_views import FakeSCM +import koji + from module_build_service.builder.KojiContentGenerator import KojiContentGenerator GET_USER_RV = { @@ -869,3 +871,24 @@ class TestBuild: for stream in streams.get(): requires.append("%s:%s" % (name, stream)) assert "%s:%s" % (mmd.get_name(), mmd.get_stream()) in requires + + @patch("module_build_service.builder.KojiModuleBuilder.KojiClientSession") + @patch("module_build_service.builder.KojiContentGenerator.KojiContentGenerator._check_upload", + return_value='mbs/123456789-1234') + def test_upload_outputs(self, upload_checker, cl_session): + ''' Tests whether _upload_outputs function return already existing directory + if there's one ''' + rv = self.cg._upload_outputs(cl_session.return_value, dict(), '') + assert rv == upload_checker.return_value + + @patch("module_build_service.builder.KojiModuleBuilder.KojiClientSession") + @patch("module_build_service.builder.KojiContentGenerator.KojiContentGenerator._check_upload", + return_value='mbs/123456789-1234') + @patch("module_build_service.builder.KojiContentGenerator.KojiContentGenerator._tag_cg_build") + @patch("module_build_service.builder.KojiContentGenerator.KojiContentGenerator._load_koji_tag") + def test_koji_cg_koji_import(self, tag_loader, tagger, upload_checker, cl_session): + ''' Tests whether build is still tagged even if there's an exception in CGImport ''' + cl_session.return_value.CGImport = Mock( + side_effect=koji.GenericError('Build already exists asdv')) + self.cg.koji_import() + tagger.assert_called() From 436e0bef3f56baaaef076766b796b36dfccc31cd Mon Sep 17 00:00:00 2001 From: Valerij Maljulin Date: Jan 10 2019 14:22:37 +0000 Subject: [PATCH 3/3] Fix for the test test_all_builds_in_batch_fail Signed-off-by: Valerij Maljulin --- diff --git a/tests/test_build/test_build.py b/tests/test_build/test_build.py index d8bd0dc..8e505ff 100644 --- a/tests/test_build/test_build.py +++ b/tests/test_build/test_build.py @@ -22,6 +22,7 @@ import koji import os +import re from os import path, mkdir from os.path import dirname from shutil import copyfile @@ -750,8 +751,9 @@ class TestBuild: # Whole module should be failed. assert c.module_build.state == models.BUILD_STATES['failed'] - assert c.module_build.state_reason == \ - "Component(s) perl-Tangerine, perl-List-Compare failed to build." + assert re.match(r'Component\(s\) (perl-Tangerine|perl-List-Compare), ' + '(perl-Tangerine|perl-List-Compare) failed to build.', + c.module_build.state_reason) # We should end up with batch 2 and never start batch 3, because # there were failed components in batch 2.