Merge "Fix setting autoholds through API with change supplied"

This commit is contained in:
Zuul 2023-06-08 22:46:47 +00:00 committed by Gerrit Code Review
commit 2bdc98b6d3
2 changed files with 64 additions and 10 deletions

View File

@ -2220,14 +2220,7 @@ class TestTenantScopedWebApi(BaseTestWeb):
headers={'Authorization': 'Bearer %s' % token})
self.assertEqual(403, resp.status_code)
def test_autohold(self):
"""Test that autohold can be set through the admin web interface"""
args = {"reason": "some reason",
"count": 1,
'job': 'project-test2',
'change': None,
'ref': None,
'node_hold_expiration': None}
def _test_autohold(self, args, code=200):
authz = {'iss': 'zuul_operator',
'aud': 'zuul.example.com',
'sub': 'testuser',
@ -2241,7 +2234,9 @@ class TestTenantScopedWebApi(BaseTestWeb):
'api/tenant/tenant-one/project/org/project/autohold',
headers={'Authorization': 'Bearer %s' % token},
json=args)
self.assertEqual(200, req.status_code, req.text)
self.assertEqual(code, req.status_code, req.text)
if code != 200:
return
data = req.json()
self.assertEqual(True, data)
@ -2253,6 +2248,18 @@ class TestTenantScopedWebApi(BaseTestWeb):
self.assertNotEqual([], autohold_requests)
self.assertEqual(1, len(autohold_requests))
request = autohold_requests[0]
return request
def test_autohold_default_ref(self):
"""Test that autohold can be set through the admin web interface
with default ref values"""
args = {"reason": "some reason",
"count": 1,
'job': 'project-test2',
'change': None,
'ref': None,
'node_hold_expiration': None}
request = self._test_autohold(args)
self.assertEqual('tenant-one', request['tenant'])
# The matcher expects a canonical project name
self.assertEqual('review.example.com/org/project', request['project'])
@ -2261,6 +2268,53 @@ class TestTenantScopedWebApi(BaseTestWeb):
self.assertEqual("some reason", request['reason'])
self.assertEqual(1, request['max_count'])
def test_autohold_change(self):
"""Test that autohold can be set through the admin web interface
with a change supplied"""
args = {"reason": "some reason",
"count": 1,
'job': 'project-test2',
'change': '1',
'ref': None,
'node_hold_expiration': None}
request = self._test_autohold(args)
self.assertEqual('tenant-one', request['tenant'])
# The matcher expects a canonical project name
self.assertEqual('review.example.com/org/project', request['project'])
self.assertEqual('project-test2', request['job'])
self.assertEqual("refs/changes/01/1/.*", request['ref_filter'])
self.assertEqual("some reason", request['reason'])
self.assertEqual(1, request['max_count'])
def test_autohold_ref(self):
"""Test that autohold can be set through the admin web interface
with a change supplied"""
args = {"reason": "some reason",
"count": 1,
'job': 'project-test2',
'change': None,
'ref': 'refs/tags/foo',
'node_hold_expiration': None}
request = self._test_autohold(args)
self.assertEqual('tenant-one', request['tenant'])
# The matcher expects a canonical project name
self.assertEqual('review.example.com/org/project', request['project'])
self.assertEqual('project-test2', request['job'])
self.assertEqual("refs/tags/foo", request['ref_filter'])
self.assertEqual("some reason", request['reason'])
self.assertEqual(1, request['max_count'])
def test_autohold_change_and_ref(self):
"""Test that autohold can be set through the admin web interface
with a change supplied"""
args = {"reason": "some reason",
"count": 1,
'job': 'project-test2',
'change': '1',
'ref': 'refs/tags/foo',
'node_hold_expiration': None}
self._test_autohold(args, code=400)
def _init_autohold_delete(self, authz):
token = jwt.encode(authz, key='NoDanaOnlyZuul',
algorithm='HS256')

View File

@ -684,7 +684,7 @@ class ZuulWebAPI(object):
if jbody['change']:
ref_filter = project.source.getRefForChange(jbody['change'])
if jbody['ref']:
elif jbody['ref']:
ref_filter = str(jbody['ref'])
else:
ref_filter = ".*"