Pass source to project instantiations

So that we can store the canonical hostname.  Also use this to
find and store the connection name to keep the initializer signature
small.

Story: 2000953
Change-Id: Ie10f86ff3412016b411bcc511b4d9ad3af163d61
This commit is contained in:
James E. Blair 2017-03-29 13:22:16 -07:00
parent f4a5f02aa8
commit 0a89975543
7 changed files with 45 additions and 27 deletions

View File

@ -22,6 +22,7 @@ except ImportError:
import tests.base
from tests.base import BaseTestCase
from zuul.driver.gerrit import GerritDriver
from zuul.driver.gerrit.gerritconnection import GerritConnection
FIXTURE_DIR = os.path.join(tests.base.FIXTURE_DIR, 'gerrit')
@ -53,7 +54,8 @@ class TestGerrit(BaseTestCase):
'user': 'gerrit',
'server': 'localhost',
}
gerrit = GerritConnection(None, 'review_gerrit', gerrit_config)
driver = GerritDriver()
gerrit = GerritConnection(driver, 'review_gerrit', gerrit_config)
calls, values = read_fixtures(files)
_ssh_mock.side_effect = values

View File

@ -27,19 +27,22 @@ from zuul.lib import yamlutil as yaml
from tests.base import BaseTestCase, FIXTURE_DIR
class FakeSource(object):
def __init__(self, name):
self.name = name
class Dummy(object):
def __init__(self, **kw):
for k, v in kw.items():
setattr(self, k, v)
class TestJob(BaseTestCase):
def setUp(self):
super(TestJob, self).setUp()
self.connection = Dummy(connection_name='dummy_connection')
self.source = Dummy(canonical_hostname='git.example.com',
name='dummy_connection', # TODOv3(jeblair): remove
connection=self.connection)
self.tenant = model.Tenant('tenant')
self.layout = model.Layout()
self.project = model.Project('project', 'connection')
self.source = FakeSource('connection')
self.project = model.Project('project', self.source)
self.tenant.addProjectRepo(self.source, self.project)
self.pipeline = model.Pipeline('gate', self.layout)
self.layout.addPipeline(self.pipeline)
@ -162,7 +165,7 @@ class TestJob(BaseTestCase):
pipeline = model.Pipeline('gate', layout)
layout.addPipeline(pipeline)
queue = model.ChangeQueue(pipeline)
project = model.Project('project', None)
project = model.Project('project', self.source)
base = configloader.JobParser.fromYaml(tenant, layout, {
'_source_context': self.context,
@ -508,7 +511,7 @@ class TestJob(BaseTestCase):
pipeline = model.Pipeline('gate', layout)
layout.addPipeline(pipeline)
queue = model.ChangeQueue(pipeline)
project = model.Project('project', None)
project = model.Project('project', self.source)
base = configloader.JobParser.fromYaml(tenant, layout, {
'_source_context': self.context,
@ -554,7 +557,7 @@ class TestJob(BaseTestCase):
def test_job_source_project(self):
tenant = model.Tenant('tenant')
layout = model.Layout()
base_project = model.Project('base_project', None)
base_project = model.Project('base_project', self.source)
base_context = model.SourceContext(base_project, 'master',
'test', True)
@ -565,7 +568,7 @@ class TestJob(BaseTestCase):
})
layout.addJob(base)
other_project = model.Project('other_project', None)
other_project = model.Project('other_project', self.source)
other_context = model.SourceContext(other_project, 'master',
'test', True)
base2 = configloader.JobParser.fromYaml(tenant, layout, {
@ -588,7 +591,7 @@ class TestJob(BaseTestCase):
})
self.layout.addJob(job)
project2 = model.Project('project2', None)
project2 = model.Project('project2', self.source)
context2 = model.SourceContext(project2, 'master',
'test', True)

View File

@ -26,7 +26,7 @@ import pprint
import voluptuous as v
from zuul.connection import BaseConnection
from zuul.model import TriggerEvent, Project, Change, Ref
from zuul.model import TriggerEvent, Change, Ref
from zuul import exceptions
@ -268,11 +268,13 @@ class GerritConnection(BaseConnection):
self._change_cache = {}
self.projects = {}
self.gerrit_event_connector = None
self.source = driver.getSource(self)
def getProject(self, name):
if name not in self.projects:
self.projects[name] = Project(name, self.connection_name)
return self.projects[name]
return self.projects.get(name)
def addProject(self, project):
self.projects[project.name] = project
def maintainCache(self, relevant):
# This lets the user supply a list of change objects that are
@ -290,14 +292,14 @@ class GerritConnection(BaseConnection):
change = self._getChange(event.change_number, event.patch_number,
refresh=refresh)
elif event.ref:
project = self.getProject(event.project_name)
project = self.source.getProject(event.project_name)
change = Ref(project)
change.ref = event.ref
change.oldrev = event.oldrev
change.newrev = event.newrev
change.url = self._getGitwebUrl(project, sha=event.newrev)
else:
project = self.getProject(event.project_name)
project = self.source.getProject(event.project_name)
change = Ref(project)
branch = event.branch or 'master'
change.ref = 'refs/heads/%s' % branch
@ -375,7 +377,7 @@ class GerritConnection(BaseConnection):
if 'project' not in data:
raise exceptions.ChangeNotFound(change.number, change.patchset)
change.project = self.getProject(data['project'])
change.project = self.source.getProject(data['project'])
change.branch = data['branch']
change.url = data['url']
max_ps = 0

View File

@ -14,6 +14,7 @@
import logging
from zuul.source import BaseSource
from zuul.model import Project
class GerritSource(BaseSource):
@ -41,7 +42,11 @@ class GerritSource(BaseSource):
return self.connection.getChange(event, refresh)
def getProject(self, name):
return self.connection.getProject(name)
p = self.connection.getProject(name)
if not p:
p = Project(name, self)
self.connection.addProject(p)
return p
def getProjectOpenChanges(self, project):
return self.connection.getProjectOpenChanges(project)

View File

@ -19,7 +19,6 @@ from six.moves import urllib
import voluptuous as v
from zuul.connection import BaseConnection
from zuul.model import Project
class GitConnection(BaseConnection):
@ -44,9 +43,10 @@ class GitConnection(BaseConnection):
self.projects = {}
def getProject(self, name):
if name not in self.projects:
self.projects[name] = Project(name, self.connection_name)
return self.projects[name]
return self.projects.get(name)
def addProject(self, project):
self.projects[project.name] = project
def getProjectBranches(self, project):
# TODO(jeblair): implement; this will need to handle local or

View File

@ -14,6 +14,7 @@
import logging
from zuul.source import BaseSource
from zuul.model import Project
class GitSource(BaseSource):
@ -38,7 +39,11 @@ class GitSource(BaseSource):
raise NotImplemented()
def getProject(self, name):
return self.connection.getProject(name)
p = self.connection.getProject(name)
if not p:
p = Project(name, self)
self.connection.addProject(p)
return p
def getProjectBranches(self, project):
return self.connection.getProjectBranches(project)

View File

@ -351,9 +351,10 @@ class Project(object):
# This makes a Project instance a unique identifier for a given
# project from a given source.
def __init__(self, name, connection_name, foreign=False):
def __init__(self, name, source, foreign=False):
self.name = name
self.connection_name = connection_name
self.connection_name = source.connection.connection_name
self.canonical_hostname = source.canonical_hostname
# foreign projects are those referenced in dependencies
# of layout projects, this should matter
# when deciding whether to enqueue their changes