Fix setting a change queue in a template

A recent change to late-bind project-templates omitted updating
the dependent pipeline manager to look at both project and
project-template objects when building shared queues.

Add a test for this and a helper method to collect all of the
project and project-template objects for a project.

Change-Id: Id43089dac79a3f523939c59b71c98879390597ad
This commit is contained in:
James E. Blair 2018-05-01 13:39:39 -07:00
parent 8c88420b04
commit 76ad900d17
4 changed files with 52 additions and 3 deletions

View File

@ -0,0 +1,26 @@
- pipeline:
name: gate
manager: dependent
trigger: {}
- job:
name: base
parent: null
run: playbooks/base.yaml
- project-template:
name: integrated-jobs
gate:
queue: integrated
jobs:
- base
- project:
name: org/project1
templates:
- integrated-jobs
- project:
name: org/project2
templates:
- integrated-jobs

View File

@ -2739,6 +2739,17 @@ class TestScheduler(ZuulTestCase):
self.assertEqual(q1.name, 'integrated')
self.assertEqual(q2.name, 'integrated')
@simple_layout("layouts/template-queue.yaml")
def test_template_queue(self):
"Test a shared queue can be constructed from a preject-template"
tenant = self.sched.abide.tenants.get('tenant-one')
(trusted, project1) = tenant.getProject('org/project1')
(trusted, project2) = tenant.getProject('org/project2')
q1 = tenant.layout.pipelines['gate'].getQueue(project1)
q2 = tenant.layout.pipelines['gate'].getQueue(project2)
self.assertEqual(q1.name, 'integrated')
self.assertEqual(q2.name, 'integrated')
def test_queue_precedence(self):
"Test that queue precedence works"

View File

@ -35,14 +35,15 @@ class DependentPipelineManager(PipelineManager):
def buildChangeQueues(self):
self.log.debug("Building shared change queues")
change_queues = {}
layout_project_configs = self.pipeline.layout.project_configs
tenant = self.pipeline.layout.tenant
layout = self.pipeline.layout
layout_project_configs = layout.project_configs
tenant = layout.tenant
for project_name, project_configs in layout_project_configs.items():
(trusted, project) = tenant.getProject(project_name)
queue_name = None
project_in_pipeline = False
for project_config in project_configs:
for project_config in layout.getAllProjectConfigs(project_name):
project_pipeline_config = project_config.pipelines.get(
self.pipeline.name)
if project_pipeline_config is None:

View File

@ -2952,6 +2952,17 @@ class Layout(object):
def getProjectConfigs(self, name):
return self.project_configs.get(name, [])
def getAllProjectConfigs(self, name):
# Get all the project configs (project and project-template
# stanzas) for a project.
ret = []
for pc in self.getProjectConfigs(name):
ret.append(pc)
for template_name in pc.templates:
templates = self.getProjectTemplates(template_name)
ret.extend(templates)
return ret
def getProjectMetadata(self, name):
if name in self.project_metadata:
return self.project_metadata[name]