From 5a36065d625891072a1c384e5ef1f493a3705aca Mon Sep 17 00:00:00 2001 From: Mike McLean Date: May 21 2019 15:15:29 +0000 Subject: [PATCH 1/3] delete_build: handle results of lazy build_references call Fixes: https://pagure.io/koji/issue/1441 --- diff --git a/hub/kojihub.py b/hub/kojihub.py index 5a391f2..f7c8fe2 100644 --- a/hub/kojihub.py +++ b/hub/kojihub.py @@ -7266,32 +7266,33 @@ def delete_build(build, strict=True, min_ref_age=604800): context.session.assertPerm('admin') binfo = get_build(build, strict=True) refs = build_references(binfo['id'], limit=10, lazy=True) - if refs['tags']: + if refs.get('tags'): if strict: raise koji.GenericError("Cannot delete build, tagged: %s" % refs['tags']) return False - if refs['rpms']: + if refs.get('rpms'): if strict: raise koji.GenericError("Cannot delete build, used in buildroots: %s" % refs['rpms']) return False - if refs['archives']: + if refs.get('archives'): if strict: raise koji.GenericError("Cannot delete build, used in archive buildroots: %s" % refs['archives']) return False - if refs['images']: + if refs.get('component_of'): if strict: - raise koji.GenericError("Cannot delete build, used in images: %r" % refs['images']) + raise koji.GenericError("Cannot delete build, used as component of: %r" % refs['component_of']) return False - if refs['last_used']: + if refs.get('last_used'): age = time.time() - refs['last_used'] if age < min_ref_age: if strict: raise koji.GenericError("Cannot delete build, used in recent buildroot") return False - #otherwise we can delete it + # otherwise we can delete it _delete_build(binfo) return True + def _delete_build(binfo): """Delete a build (no reference checks) From 41628eb5e35f8a73ecdb70e3d1f8514fedf18469 Mon Sep 17 00:00:00 2001 From: Mike McLean Date: May 21 2019 15:15:29 +0000 Subject: [PATCH 2/3] fix unit test --- diff --git a/tests/test_hub/test_delete_build.py b/tests/test_hub/test_delete_build.py index d4b79f8..42fc218 100644 --- a/tests/test_hub/test_delete_build.py +++ b/tests/test_hub/test_delete_build.py @@ -16,7 +16,7 @@ class TestDeleteBuild(unittest.TestCase): @mock.patch('kojihub.get_build') def test_delete_build_raise_error(self, build, context): context.session.assertPerm = mock.MagicMock() - references = ['tags', 'rpms', 'archives', 'images'] + references = ['tags', 'rpms', 'archives', 'component_of'] for ref in references: context = mock.MagicMock() context.session.return_value = context @@ -32,7 +32,7 @@ class TestDeleteBuild(unittest.TestCase): @mock.patch('kojihub.get_build') def test_delete_build_return_false(self, build, context): context.session.assertPerm = mock.MagicMock() - references = ['tags', 'rpms', 'archives', 'images'] + references = ['tags', 'rpms', 'archives', 'component_of'] for ref in references: context = mock.MagicMock() context.session.return_value = context @@ -48,7 +48,7 @@ class TestDeleteBuild(unittest.TestCase): @mock.patch('kojihub.get_build') def test_delete_build_check_last_used_raise_error(self, build, context): context.session.assertPerm = mock.MagicMock() - references = ['tags', 'rpms', 'archives', 'images', 'last_used'] + references = ['tags', 'rpms', 'archives', 'component_of', 'last_used'] for ref in references: context = mock.MagicMock() context.session.return_value = context From 05241bd391654852270b129bd675b2c05df68e17 Mon Sep 17 00:00:00 2001 From: Mike McLean Date: May 21 2019 15:15:29 +0000 Subject: [PATCH 3/3] additional unit test --- diff --git a/tests/test_hub/test_delete_build.py b/tests/test_hub/test_delete_build.py index 42fc218..83824cc 100644 --- a/tests/test_hub/test_delete_build.py +++ b/tests/test_hub/test_delete_build.py @@ -59,3 +59,18 @@ class TestDeleteBuild(unittest.TestCase): retval[ref] = time.time()+100 refs.return_value = retval self.assertFalse(kojihub.delete_build(build='', strict=False)) + + @mock.patch('kojihub._delete_build') + @mock.patch('kojihub.build_references') + @mock.patch('kojihub.context') + @mock.patch('kojihub.get_build') + def test_delete_build_lazy_refs(self, build, context, buildrefs, _delete): + '''Test that we can handle lazy return from build_references''' + context.session.assertPerm = mock.MagicMock() + buildrefs.return_value = {'tags': []} + binfo = {'id': 'BUILD ID'} + build.return_value = binfo + kojihub.delete_build(build=binfo, strict=True) + + # no build refs, so we should have called _delete_build + _delete.assert_called_with(binfo)