Fix new depends-on format matching for prefixed gerrit ui

This patch aims to fix issue where such a depends-on won't match.

Depends-On: https://sftests2.com/r/#/c/1/

Indeed here Gerrit is hosted behind a reverse proxy under /r.
The regexp matching fail. Also the connection source lookup
may fail if Gerrit web interface is not connection.server or
connection.canonical_hostname so this path defines connection.baseurl
as a new lookup condition.

connection.baseurl is then used to build the regexp in order
to set the path prefix of the Gerrit ui.

Story: 2002080

Co-Authored-By: Nicolas Hicher <nhicher@redhat.com>

Change-Id: Ie764bfc814b821636d447f82147a7d76e0511d2f
This commit is contained in:
Fabien Boucher 2018-05-22 18:06:38 +02:00
parent 9dee755bb1
commit b5496fa672
4 changed files with 62 additions and 3 deletions

View File

@ -178,7 +178,7 @@ class FakeGerritChange(object):
'status': status,
'subject': subject,
'submitRecords': [],
'url': 'https://%s/%s' % (self.gerrit.server, number)}
'url': '%s/%s' % (self.gerrit.baseurl.rstrip('/'), number)}
self.upstream_root = upstream_root
self.addPatchset(files=files, parent=parent)

View File

@ -686,3 +686,52 @@ class TestGerritCRD(ZuulTestCase):
self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(2))
self.waitUntilSettled()
self.assertEqual(B.reported, 2)
class TestGerritCRDAltBaseUrl(ZuulTestCase):
tenant_config_file = 'config/single-tenant/main.yaml'
def setup_config(self):
super().setup_config()
self.baseurl = 'https://review.example.com/prefixed_gerrit_ui/'
self.config.set(
'connection gerrit',
'baseurl', self.baseurl)
def test_basic_crd_check(self):
"Test basic cross-repo dependencies with an alternate gerrit baseurl"
self.executor_server.hold_jobs_in_build = True
self.gearman_server.hold_jobs_in_queue = True
A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
self.assertEqual(B.data['url'], '%s/2' % self.baseurl.rstrip('/'))
# A Depends-On: B
A.data['commitMessage'] = '%s\n\nDepends-On: %s\n' % (
A.subject, B.data['url'])
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
self.gearman_server.hold_jobs_in_queue = False
self.gearman_server.release()
self.waitUntilSettled()
self.executor_server.release('.*-merge')
self.waitUntilSettled()
self.assertTrue(self.builds[0].hasChanges(A, B))
self.executor_server.hold_jobs_in_build = False
self.executor_server.release()
self.waitUntilSettled()
self.assertEqual(A.data['status'], 'NEW')
self.assertEqual(B.data['status'], 'NEW')
self.assertEqual(A.reported, 1)
self.assertEqual(B.reported, 0)
self.assertEqual(self.history[0].changes, '2,1 1,1')
tenant = self.sched.abide.tenants.get('tenant-one')
self.assertEqual(len(tenant.layout.pipelines['check'].queues), 0)

View File

@ -16,6 +16,7 @@ import re
import urllib
import logging
import voluptuous as vs
from urllib.parse import urlparse
from zuul.source import BaseSource
from zuul.model import Project
from zuul.driver.gerrit.gerritmodel import GerritRefFilter
@ -31,6 +32,13 @@ class GerritSource(BaseSource):
hostname = connection.canonical_hostname
super(GerritSource, self).__init__(driver, connection,
hostname, config)
prefix_ui = urlparse(self.connection.baseurl).path
if prefix_ui:
prefix_ui = prefix_ui.lstrip('/').rstrip('/')
prefix_ui += '/'
self.change_re = re.compile(
r"/%s(\#\/c\/)?(\d+)[\w]*" % prefix_ui)
def getRefSha(self, project, ref):
return self.connection.getRefSha(project, ref)
@ -47,8 +55,6 @@ class GerritSource(BaseSource):
def getChange(self, event, refresh=False):
return self.connection.getChange(event, refresh)
change_re = re.compile(r"/(\#\/c\/)?(\d+)[\w]*")
def getChangeByURL(self, url):
try:
parsed = urllib.parse.urlparse(url)

View File

@ -15,6 +15,7 @@
import logging
import re
from collections import OrderedDict
from urllib.parse import urlparse
import zuul.driver.zuul
import zuul.driver.gerrit
@ -171,6 +172,9 @@ class ConnectionRegistry(object):
if hasattr(connection, 'server'):
if connection.server == hostname:
return self.getSource(connection.connection_name)
if hasattr(connection, 'baseurl'):
if urlparse(connection.baseurl).hostname == hostname:
return self.getSource(connection.connection_name)
return None
def getSourceByCanonicalHostname(self, canonical_hostname):