Fix requirements loop warning

When we changed the result of the fake build for a requirements
failure from "SKIPPED" we forgot to update a place that checks
for that in order to prevent loops.  We also should use "FAILURE"
for consistency.

Change-Id: Ifd35b18040dea6d995582c8848f159d448232bfb
Co-Authored-By: James E. Blair <jeblair@redhat.com>
This commit is contained in:
Tobias Henkel 2019-04-25 21:45:11 +02:00 committed by James E. Blair
parent b0252eef9d
commit eb003cdc99
3 changed files with 77 additions and 4 deletions

View File

@ -0,0 +1,42 @@
- pipeline:
name: check
manager: independent
trigger:
gerrit:
- event: patchset-created
success:
gerrit:
Verified: 1
resultsdb_mysql: null
resultsdb_postgresql: null
failure:
gerrit:
Verified: -1
resultsdb_mysql: null
resultsdb_postgresql: null
- job:
name: base
parent: null
run: playbooks/base.yaml
- job:
name: image-builder
provides: images
- job:
name: image-user
requires: images
dependencies:
- image-builder
- job:
name: hold
- project:
name: org/project1
check:
jobs:
- image-builder
- image-user
- hold

View File

@ -5836,8 +5836,39 @@ class TestProvidesRequires(ZuulDBTestCase):
dict(name='hold', result='SUCCESS', changes='1,1'),
dict(name='hold', result='SUCCESS', changes='1,1 2,1'),
], ordered=False)
self.assertIn('image-user : FAILED', B.messages[0])
self.assertIn('not met by build', B.messages[0])
self.assertIn('image-user : FAILURE', B.messages[0])
self.assertEqual(B.messages[0].count("not met by build"), 2)
@simple_layout('layouts/provides-requires-single-project.yaml')
def test_provides_requires_check_old_failure_single_project(self):
# Similar to above test, but has job dependencies which will
# cause the requirements check to potentially run multiple
# times as the queue processor runs repeatedly.
A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
self.executor_server.failJob('image-builder', A)
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
self.assertHistory([
dict(name='image-builder', result='FAILURE', changes='1,1'),
dict(name='hold', result='SUCCESS', changes='1,1'),
], ordered=False)
self.assertIn('image-user : SKIPPED', A.messages[0])
B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
B.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
B.subject, A.data['id'])
self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
self.assertHistory([
dict(name='image-builder', result='FAILURE', changes='1,1'),
dict(name='hold', result='SUCCESS', changes='1,1'),
dict(name='image-builder', result='FAILURE', changes='1,1 2,1'),
dict(name='hold', result='SUCCESS', changes='1,1 2,1'),
], ordered=False)
self.assertIn('image-user : FAILURE', B.messages[0])
self.assertEqual(B.messages[0].count("not met by build"), 1)
class TestForceMergeMissingTemplate(ZuulTestCase):

View File

@ -2382,7 +2382,7 @@ class QueueItem(object):
except RequirementsError as e:
self.warning(str(e))
fakebuild = Build(job, None)
fakebuild.result = 'FAILED'
fakebuild.result = 'FAILURE'
self.addBuild(fakebuild)
ret = True
return ret
@ -2466,7 +2466,7 @@ class QueueItem(object):
build = build_set.getBuild(job.name)
if build and (build.result == 'SUCCESS' or build.paused):
successful_job_names.add(job.name)
elif build and build.result == 'SKIPPED':
elif build and build.result in ('SKIPPED', 'FAILURE'):
pass
else:
nodeset = build_set.getJobNodeSet(job.name)