diff options
Diffstat (limited to 'tests/unit/test_configloader.py')
-rw-r--r-- | tests/unit/test_configloader.py | 208 |
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( """ |