From c09780bbb57f9b0f401827f6fbbc093fc942bddd Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Tue, 2 Jul 2024 12:24:31 -0400 Subject: [PATCH] adjust handling for tags with no arches --- kojihub/scheduler.py | 8 +++++++- tests/test_hub/test_auto_arch_refuse.py | 27 +++++++++++++++++++++---- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/kojihub/scheduler.py b/kojihub/scheduler.py index e83996d2..c649827e 100644 --- a/kojihub/scheduler.py +++ b/kojihub/scheduler.py @@ -151,7 +151,13 @@ def _auto_arch_refuse(task_id): return # from here, we're basically doing checkHostArch() for all hosts in the channel - tag_arches = set([koji.canonArch(a) for a in taginfo['arches'].split()]) + buildconfig = context.handlers.call('getBuildConfig', taginfo['id']) + # getBuildConfig traverses inheritance to find arches if tag does not have them + tag_arches = set([koji.canonArch(a) for a in buildconfig['arches'].split()]) + if not tag_arches: + logger.warning("No arches for tag %(name)s [%(id)s]", taginfo) + # we don't error here, allowing the task itself to fail + return hosts = context.handlers.call('listHosts', channelID=info['channel_id'], enabled=True, queryOpts={'order': 'id'}) diff --git a/tests/test_hub/test_auto_arch_refuse.py b/tests/test_hub/test_auto_arch_refuse.py index 6e320f5e..674e393e 100644 --- a/tests/test_hub/test_auto_arch_refuse.py +++ b/tests/test_hub/test_auto_arch_refuse.py @@ -29,6 +29,11 @@ class AutoRefuseTest(unittest.TestCase): self.get_tag = mock.patch('kojihub.kojihub.get_tag').start() self.context = mock.patch('kojihub.scheduler.context').start() self.set_refusal = mock.patch('kojihub.scheduler.set_refusal').start() + self.handlers = { + 'getBuildConfig': mock.MagicMock(), + 'listHosts': mock.MagicMock(), + } + self.context.handlers.call.side_effect = self._my_handler_call self.set_base_data() def tearDown(self): @@ -51,8 +56,13 @@ class AutoRefuseTest(unittest.TestCase): } self.task.getInfo.return_value = self.taskinfo self.task.isFinished.return_value = False - self.get_tag.return_value = {'arches': 'x86_64 s390x ppc64le aarch64'} - self.context.handlers.call.return_value = [{'id': 'HOST', 'arches': 'x86_64 i686'}] + self.get_tag.return_value = {'id': 'TAGID', 'name': 'MYTAG'} + self.handlers['listHosts'].return_value = [{'id': 'HOST', 'arches': 'x86_64 i686'}] + self.handlers['getBuildConfig'].return_value = {'arches': 'x86_64 s390x ppc64le aarch64'} + + def _my_handler_call(self, method, *a, **kw): + handler = self.handlers[method] + return handler(*a, **kw) def test_arch_overlap(self): # we mostly test the underlying function to avoid masking errors @@ -63,20 +73,29 @@ class AutoRefuseTest(unittest.TestCase): self.set_refusal.assert_not_called() def test_arch_disjoint(self): - self.context.handlers.call.return_value = [{'id': 'HOST', 'arches': 'riscv128'}] + self.handlers['listHosts'].return_value = [{'id': 'HOST', 'arches': 'riscv128'}] scheduler._auto_arch_refuse(100) self.Task.assert_called_once_with(100) self.get_tag.assert_called_once_with('TAG_ID') self.set_refusal.assert_called_once() + def test_no_tag_arches(self): + self.handlers['getBuildConfig'].return_value = {'arches': ''} + scheduler._auto_arch_refuse(100) + + self.Task.assert_called_once_with(100) + self.get_tag.assert_called_once_with('TAG_ID') + self.handlers['listHosts'].assert_not_called() + self.set_refusal.assert_not_called() + def test_mixed_hosts(self): good1 = [{'id': n, 'arches': 'x86_64 i686'} for n in range(0,5)] bad1 = [{'id': n, 'arches': 'ia64'} for n in range(5,10)] good2 = [{'id': n, 'arches': 'aarch64'} for n in range(10,15)] bad2 = [{'id': n, 'arches': 'sparc64'} for n in range(15,20)] hosts = good1 + bad1 + good2 + bad2 - self.context.handlers.call.return_value = hosts + self.handlers['listHosts'].return_value = hosts scheduler._auto_arch_refuse(100) self.Task.assert_called_once_with(100)