Merge "Move test_model.test_job_inheritance_configloader" into feature/zuulv3
diff --git a/tests/base.py b/tests/base.py
index d3c5d62..2da4d47 100755
--- a/tests/base.py
+++ b/tests/base.py
@@ -67,6 +67,7 @@
import zuul.model
import zuul.nodepool
import zuul.zk
+import zuul.configloader
from zuul.exceptions import MergeFailure
FIXTURE_DIR = os.path.join(os.path.dirname(__file__),
@@ -2231,6 +2232,14 @@
if 'job' in item:
jobname = item['job']['name']
files['playbooks/%s.yaml' % jobname] = ''
+ if 'run' in item['job']:
+ files['%s.yaml' % item['job']['run']] = ''
+ for fn in zuul.configloader.as_list(
+ item['job'].get('pre-run', [])):
+ files['%s.yaml' % fn] = ''
+ for fn in zuul.configloader.as_list(
+ item['job'].get('post-run', [])):
+ files['%s.yaml' % fn] = ''
root = os.path.join(self.test_root, "config")
if not os.path.exists(root):
diff --git a/tests/fixtures/layouts/job-variants.yaml b/tests/fixtures/layouts/job-variants.yaml
new file mode 100644
index 0000000..de99e8a
--- /dev/null
+++ b/tests/fixtures/layouts/job-variants.yaml
@@ -0,0 +1,61 @@
+- pipeline:
+ name: check
+ manager: independent
+ trigger:
+ gerrit:
+ - event: patchset-created
+ success:
+ gerrit:
+ Verified: 1
+ failure:
+ gerrit:
+ Verified: -1
+
+- job:
+ name: base
+ parent: null
+ pre-run: base-pre
+ post-run: base-post
+ nodeset:
+ nodes:
+ - name: controller
+ label: base
+
+- job:
+ name: python27
+ parent: base
+ timeout: 40
+ pre-run: py27-pre
+ post-run:
+ - py27-post-a
+ - py27-post-b
+ nodeset:
+ nodes:
+ - name: controller
+ label: new
+
+- job:
+ name: python27
+ timeout: 50
+ branches:
+ - stable/diablo
+ pre-run: py27-diablo-pre
+ run: py27-diablo
+ post-run: py27-diablo-post
+ nodeset:
+ nodes:
+ - name: controller
+ label: old
+
+- job:
+ name: python27
+ branches:
+ - stable/essex
+ pre-run: py27-essex-pre
+ post-run: py27-essex-post
+
+- project:
+ name: org/project
+ check:
+ jobs:
+ - python27
diff --git a/tests/unit/test_model.py b/tests/unit/test_model.py
index 628a45c..63e9aaa 100644
--- a/tests/unit/test_model.py
+++ b/tests/unit/test_model.py
@@ -170,185 +170,6 @@
"Unable to modify final job"):
job.applyVariant(bad_final)
- def test_job_inheritance_configloader(self):
- # TODO(jeblair): move this to a configloader test
- tenant = model.Tenant('tenant')
- layout = model.Layout(tenant)
-
- pipeline = model.Pipeline('gate', layout)
- layout.addPipeline(pipeline)
- queue = model.ChangeQueue(pipeline)
- project = model.Project('project', self.source)
- tpc = model.TenantProjectConfig(project)
- tenant.addUntrustedProject(tpc)
-
- base = configloader.JobParser.fromYaml(tenant, layout, {
- '_source_context': self.context,
- '_start_mark': self.start_mark,
- 'name': 'base',
- 'parent': None,
- 'timeout': 30,
- 'pre-run': 'base-pre',
- 'post-run': 'base-post',
- 'nodeset': {
- 'nodes': [{
- 'name': 'controller',
- 'label': 'base',
- }],
- },
- })
- layout.addJob(base)
- python27 = configloader.JobParser.fromYaml(tenant, layout, {
- '_source_context': self.context,
- '_start_mark': self.start_mark,
- 'name': 'python27',
- 'parent': 'base',
- 'pre-run': 'py27-pre',
- 'post-run': ['py27-post-a', 'py27-post-b'],
- 'nodeset': {
- 'nodes': [{
- 'name': 'controller',
- 'label': 'new',
- }],
- },
- 'timeout': 40,
- })
- layout.addJob(python27)
- python27diablo = configloader.JobParser.fromYaml(tenant, layout, {
- '_source_context': self.context,
- '_start_mark': self.start_mark,
- 'name': 'python27',
- 'branches': [
- 'stable/diablo'
- ],
- 'pre-run': 'py27-diablo-pre',
- 'run': 'py27-diablo',
- 'post-run': 'py27-diablo-post',
- 'nodeset': {
- 'nodes': [{
- 'name': 'controller',
- 'label': 'old',
- }],
- },
- 'timeout': 50,
- })
- layout.addJob(python27diablo)
-
- python27essex = configloader.JobParser.fromYaml(tenant, layout, {
- '_source_context': self.context,
- '_start_mark': self.start_mark,
- 'name': 'python27',
- 'branches': [
- 'stable/essex'
- ],
- 'pre-run': 'py27-essex-pre',
- 'post-run': 'py27-essex-post',
- })
- layout.addJob(python27essex)
-
- project_template_parser = configloader.ProjectTemplateParser(
- tenant, layout)
- project_parser = configloader.ProjectParser(
- tenant, layout, project_template_parser)
- project_config = project_parser.fromYaml([{
- '_source_context': self.context,
- '_start_mark': self.start_mark,
- 'name': 'project',
- 'gate': {
- 'jobs': [
- 'python27'
- ]
- }
- }])
- layout.addProjectConfig(project_config)
-
- change = model.Change(project)
- # Test master
- change.branch = 'master'
- item = queue.enqueueChange(change)
- item.layout = layout
-
- self.assertTrue(base.changeMatches(change))
- self.assertTrue(python27.changeMatches(change))
- self.assertFalse(python27diablo.changeMatches(change))
- self.assertFalse(python27essex.changeMatches(change))
-
- item.freezeJobGraph()
- self.assertEqual(len(item.getJobs()), 1)
- job = item.getJobs()[0]
- self.assertEqual(job.name, 'python27')
- self.assertEqual(job.timeout, 40)
- nodes = job.nodeset.getNodes()
- self.assertEqual(len(nodes), 1)
- self.assertEqual(nodes[0].label, 'new')
- self.assertEqual([x.path for x in job.pre_run],
- ['base-pre',
- 'py27-pre'])
- self.assertEqual([x.path for x in job.post_run],
- ['py27-post-a',
- 'py27-post-b',
- 'base-post'])
- self.assertEqual([x.path for x in job.run],
- ['playbooks/python27',
- 'playbooks/base'])
-
- # Test diablo
- change.branch = 'stable/diablo'
- item = queue.enqueueChange(change)
- item.layout = layout
-
- self.assertTrue(base.changeMatches(change))
- self.assertTrue(python27.changeMatches(change))
- self.assertTrue(python27diablo.changeMatches(change))
- self.assertFalse(python27essex.changeMatches(change))
-
- item.freezeJobGraph()
- self.assertEqual(len(item.getJobs()), 1)
- job = item.getJobs()[0]
- self.assertEqual(job.name, 'python27')
- self.assertEqual(job.timeout, 50)
- nodes = job.nodeset.getNodes()
- self.assertEqual(len(nodes), 1)
- self.assertEqual(nodes[0].label, 'old')
- self.assertEqual([x.path for x in job.pre_run],
- ['base-pre',
- 'py27-pre',
- 'py27-diablo-pre'])
- self.assertEqual([x.path for x in job.post_run],
- ['py27-diablo-post',
- 'py27-post-a',
- 'py27-post-b',
- 'base-post'])
- self.assertEqual([x.path for x in job.run],
- ['py27-diablo']),
-
- # Test essex
- change.branch = 'stable/essex'
- item = queue.enqueueChange(change)
- item.layout = layout
-
- self.assertTrue(base.changeMatches(change))
- self.assertTrue(python27.changeMatches(change))
- self.assertFalse(python27diablo.changeMatches(change))
- self.assertTrue(python27essex.changeMatches(change))
-
- item.freezeJobGraph()
- self.assertEqual(len(item.getJobs()), 1)
- job = item.getJobs()[0]
- self.assertEqual(job.name, 'python27')
- self.assertEqual([x.path for x in job.pre_run],
- ['base-pre',
- 'py27-pre',
- 'py27-essex-pre'])
- self.assertEqual([x.path for x in job.post_run],
- ['py27-essex-post',
- 'py27-post-a',
- 'py27-post-b',
- 'base-post'])
- self.assertEqual([x.path for x in job.run],
- ['playbooks/python27',
- 'playbooks/base'])
-
def test_job_auth_inheritance(self):
tenant = self.tenant
layout = self.layout
diff --git a/tests/unit/test_scheduler.py b/tests/unit/test_scheduler.py
index a97e47e..22d1139 100755
--- a/tests/unit/test_scheduler.py
+++ b/tests/unit/test_scheduler.py
@@ -2430,6 +2430,62 @@
self.assertEqual(rp, set(['org/project', 'org/project0',
'org/project3']))
+ @simple_layout('layouts/job-variants.yaml')
+ def test_job_branch_variants(self):
+ self.create_branch('org/project', 'stable/diablo')
+ self.create_branch('org/project', 'stable/essex')
+ A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ B = self.fake_gerrit.addFakeChange('org/project', 'stable/diablo', 'B')
+ self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+
+ C = self.fake_gerrit.addFakeChange('org/project', 'stable/essex', 'C')
+ self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='python27', result='SUCCESS'),
+ dict(name='python27', result='SUCCESS'),
+ dict(name='python27', result='SUCCESS'),
+ ])
+
+ p = self.history[0].parameters
+ self.assertEqual(p['timeout'], 40)
+ self.assertEqual(len(p['nodes']), 1)
+ self.assertEqual(p['nodes'][0]['label'], 'new')
+ self.assertEqual([x['path'] for x in p['pre_playbooks']],
+ ['base-pre', 'py27-pre'])
+ self.assertEqual([x['path'] for x in p['post_playbooks']],
+ ['py27-post-a', 'py27-post-b', 'base-post'])
+ self.assertEqual([x['path'] for x in p['playbooks']],
+ ['playbooks/python27', 'playbooks/base'])
+
+ p = self.history[1].parameters
+ self.assertEqual(p['timeout'], 50)
+ self.assertEqual(len(p['nodes']), 1)
+ self.assertEqual(p['nodes'][0]['label'], 'old')
+ self.assertEqual([x['path'] for x in p['pre_playbooks']],
+ ['base-pre', 'py27-pre', 'py27-diablo-pre'])
+ self.assertEqual([x['path'] for x in p['post_playbooks']],
+ ['py27-diablo-post', 'py27-post-a', 'py27-post-b',
+ 'base-post'])
+ self.assertEqual([x['path'] for x in p['playbooks']],
+ ['py27-diablo'])
+
+ p = self.history[2].parameters
+ self.assertEqual(p['timeout'], 40)
+ self.assertEqual(len(p['nodes']), 1)
+ self.assertEqual(p['nodes'][0]['label'], 'new')
+ self.assertEqual([x['path'] for x in p['pre_playbooks']],
+ ['base-pre', 'py27-pre', 'py27-essex-pre'])
+ self.assertEqual([x['path'] for x in p['post_playbooks']],
+ ['py27-essex-post', 'py27-post-a', 'py27-post-b',
+ 'base-post'])
+ self.assertEqual([x['path'] for x in p['playbooks']],
+ ['playbooks/python27', 'playbooks/base'])
+
def test_queue_names(self):
"Test shared change queue names"
tenant = self.sched.abide.tenants.get('tenant-one')