summaryrefslogtreecommitdiff
path: root/tests/unit/test_configloader.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/test_configloader.py')
-rw-r--r--tests/unit/test_configloader.py208
1 files changed, 207 insertions, 1 deletions
diff --git a/tests/unit/test_configloader.py b/tests/unit/test_configloader.py
index 47bf0d69a..571df7550 100644
--- a/tests/unit/test_configloader.py
+++ b/tests/unit/test_configloader.py
@@ -27,7 +27,7 @@ from zuul.configloader import (
from zuul.model import Abide, MergeRequest, SourceContext
from zuul.zk.locks import tenant_read_lock
-from tests.base import ZuulTestCase
+from tests.base import iterate_timeout, ZuulTestCase
class TestConfigLoader(ZuulTestCase):
@@ -107,6 +107,135 @@ class TestTenantSimple(TenantParserTestCase):
self.assertTrue('project2-job' in
project2_config[1].pipelines['check'].job_list.jobs)
+ def test_cache(self):
+ # A full reconfiguration should issue cat jobs for all repos
+ with self.assertLogs('zuul.TenantParser', level='DEBUG') as full_logs:
+ self.scheds.execute(lambda app: app.sched.reconfigure(app.config))
+ self.waitUntilSettled()
+ self.log.debug("Full reconfigure logs:")
+ for x in full_logs.output:
+ self.log.debug(x)
+ self.assertRegexInList(
+ r'Submitting cat job (.*?) for gerrit common-config master',
+ full_logs.output)
+ self.assertRegexInList(
+ r'Submitting cat job (.*?) for gerrit org/project1 master',
+ full_logs.output)
+ self.assertRegexInList(
+ r'Submitting cat job (.*?) for gerrit org/project2 master',
+ full_logs.output)
+ self.assertRegexNotInList(
+ r'Using files from cache',
+ full_logs.output)
+
+ first = self.scheds.first
+ second = self.createScheduler()
+ second.start()
+ self.assertEqual(len(self.scheds), 2)
+ for _ in iterate_timeout(10, "until priming is complete"):
+ state_one = first.sched.local_layout_state.get("tenant-one")
+ if state_one:
+ break
+
+ for _ in iterate_timeout(
+ 10, "all schedulers to have the same layout state"):
+ if (second.sched.local_layout_state.get(
+ "tenant-one") == state_one):
+ break
+
+ self.log.debug("Freeze scheduler-1")
+ # Start the log context manager for the update test below now,
+ # so that it's already in place when we release the second
+ # scheduler lock.
+ with self.assertLogs('zuul.TenantParser', level='DEBUG'
+ ) as update_logs:
+ lock1 = second.sched.layout_update_lock
+ lock2 = second.sched.run_handler_lock
+ with lock1, lock2:
+ # A tenant reconfiguration should use the cache except for the
+ # updated project.
+ file_dict = {'zuul.d/test.yaml': ''}
+
+ # Now start a second log context manager just for the
+ # tenant reconfig test
+ with self.assertLogs('zuul.TenantParser', level='DEBUG') \
+ as tenant_logs:
+ A = self.fake_gerrit.addFakeChange(
+ 'org/project1', 'master', 'A',
+ files=file_dict)
+ A.setMerged()
+ self.fake_gerrit.addEvent(A.getChangeMergedEvent())
+ self.waitUntilSettled(matcher=[first])
+ self.log.debug("Tenant reconfigure logs:")
+ for x in tenant_logs.output:
+ self.log.debug(x)
+
+ self.assertRegexNotInList(
+ r'Submitting cat job (.*?) for '
+ r'gerrit common-config master',
+ tenant_logs.output)
+ self.assertRegexInList(
+ r'Submitting cat job (.*?) for '
+ r'gerrit org/project1 master',
+ tenant_logs.output)
+ self.assertRegexNotInList(
+ r'Submitting cat job (.*?) for '
+ r'gerrit org/project2 master',
+ tenant_logs.output)
+ self.assertRegexNotInList(
+ r'Using files from cache',
+ tenant_logs.output)
+
+ # A layout update should use the unparsed config cache
+ # except for what needs to be refreshed from the files
+ # cache in ZK.
+ self.log.debug("Thaw scheduler-1")
+ self.waitUntilSettled()
+ self.log.debug("Layout update logs:")
+ for x in update_logs.output:
+ self.log.debug(x)
+
+ self.assertRegexNotInList(
+ r'Submitting cat job',
+ update_logs.output)
+ self.assertRegexNotInList(
+ r'Using files from cache for project '
+ r'review.example.com/common-config @master.*',
+ update_logs.output)
+ self.assertRegexInList(
+ r'Using files from cache for project '
+ r'review.example.com/org/project1 @master.*',
+ update_logs.output)
+ self.assertRegexNotInList(
+ r'Using files from cache for project '
+ r'review.example.com/org/project2 @master.*',
+ update_logs.output)
+
+ def test_cache_new_branch(self):
+ first = self.scheds.first
+ lock1 = first.sched.layout_update_lock
+ lock2_ = first.sched.run_handler_lock
+ with lock1, lock2_:
+ self.create_branch('org/project1', 'stable')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project1', 'stable'))
+
+ second = self.createScheduler()
+ second.start()
+ self.assertEqual(len(self.scheds), 2)
+ for _ in iterate_timeout(10, "until priming is complete"):
+ state_one = first.sched.local_layout_state.get("tenant-one")
+ if state_one:
+ break
+
+ for _ in iterate_timeout(
+ 10, "all schedulers to have the same layout state"):
+ if (second.sched.local_layout_state.get(
+ "tenant-one") == state_one):
+ break
+ self.waitUntilSettled()
+
def test_variant_description(self):
tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
job = tenant.layout.jobs.get("project2-job")
@@ -430,6 +559,58 @@ class TestTenantUnprotectedBranches(TenantParserTestCase):
self.assertIsNone(tpc[project_name].exclude_unprotected_branches)
+class TestTenantIncludeBranches(TenantParserTestCase):
+ tenant_config_file = 'config/tenant-parser/include-branches.yaml'
+
+ def test_tenant_branches(self):
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+
+ self.assertEqual(['common-config'],
+ [x.name for x in tenant.config_projects])
+ self.assertEqual(['org/project1', 'org/project2'],
+ [x.name for x in tenant.untrusted_projects])
+
+ tpc = tenant.project_configs
+ project_name = tenant.config_projects[0].canonical_name
+ self.assertEqual(['master'], tpc[project_name].branches)
+
+ # No branches pass the filter at the start
+ project_name = tenant.untrusted_projects[0].canonical_name
+ self.assertEqual([], tpc[project_name].branches)
+
+ # Create the foo branch
+ self.create_branch('org/project1', 'foo')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project1', 'foo'))
+ self.waitUntilSettled()
+
+ # It should pass the filter
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ tpc = tenant.project_configs
+ project_name = tenant.untrusted_projects[0].canonical_name
+ self.assertEqual(['foo'], tpc[project_name].branches)
+
+ # Create the baz branch
+ self.create_branch('org/project1', 'baz')
+ self.fake_gerrit.addEvent(
+ self.fake_gerrit.getFakeBranchCreatedEvent(
+ 'org/project1', 'baz'))
+ self.waitUntilSettled()
+
+ # It should not pass the filter
+ tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
+ tpc = tenant.project_configs
+ project_name = tenant.untrusted_projects[0].canonical_name
+ self.assertEqual(['foo'], tpc[project_name].branches)
+
+
+class TestTenantExcludeBranches(TestTenantIncludeBranches):
+ tenant_config_file = 'config/tenant-parser/exclude-branches.yaml'
+
+ # Same test results as include-branches
+
+
class TestTenantExcludeAll(TenantParserTestCase):
tenant_config_file = 'config/tenant-parser/exclude-all.yaml'
@@ -891,6 +1072,7 @@ class TestTenantExtra(TenantParserTestCase):
tenant = self.scheds.first.sched.abide.tenants.get('tenant-one')
self.assertTrue('project2-extra-file' in tenant.layout.jobs)
self.assertTrue('project2-extra-dir' in tenant.layout.jobs)
+ self.assertTrue('project6-extra-dir' in tenant.layout.jobs)
def test_dynamic_extra(self):
in_repo_conf = textwrap.dedent(
@@ -914,6 +1096,30 @@ class TestTenantExtra(TenantParserTestCase):
dict(name='project2-extra-file2', result='SUCCESS', changes='1,1'),
], ordered=False)
+ def test_dynamic_extra_dir(self):
+ in_repo_conf = textwrap.dedent(
+ """
+ - job:
+ name: project6-extra-dir2
+ parent: common-config-job
+ - project:
+ check:
+ jobs:
+ - project6-extra-dir
+ - project6-extra-dir2
+ """)
+ file_dict = {
+ 'other/extra.d/new/extra.yaml': in_repo_conf,
+ }
+ A = self.fake_gerrit.addFakeChange('org/project6', 'master', 'A',
+ files=file_dict)
+ self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+ self.waitUntilSettled()
+ self.assertHistory([
+ dict(name='project6-extra-dir', result='SUCCESS', changes='1,1'),
+ dict(name='project6-extra-dir2', result='SUCCESS', changes='1,1'),
+ ], ordered=False)
+
def test_extra_reconfigure(self):
in_repo_conf = textwrap.dedent(
"""