def test_periodic(self): self.worker.hold_jobs_in_build = True self.create_branch("org/project", "stable/havana") self.config.set("zuul", "layout_config", "tests/fixtures/layout-timer.yaml") self.sched.reconfigure(self.config) self.registerJobs() # The pipeline triggers every second, so we should have seen # several by now. time.sleep(5) self.waitUntilSettled() builds = self.builds[:] self.worker.hold_jobs_in_build = False # Stop queuing timer triggered jobs so that the assertions # below don't race against more jobs being queued. self.config.set("zuul", "layout_config", "tests/fixtures/layout-no-timer.yaml") self.sched.reconfigure(self.config) self.registerJobs() self.worker.release() self.waitUntilSettled() projects = ["org/project"] self.assertEquals(2, len(builds), "Two builds are running") upstream = self.getUpstreamRepos(projects) states = [ {"org/project": str(upstream["org/project"].commit("stable/havana"))}, {"org/project": str(upstream["org/project"].commit("stable/havana"))}, ] for number, build in enumerate(builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters.get("ZUUL_BRANCH", None), zuul_ref=build.parameters.get("ZUUL_REF", None), zuul_url=self.git_root, branch="stable/havana", ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit("HEAD")), "Project %s commit for build %s should " "be correct" % (project, number), ) shutil.rmtree(self.workspace_root) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_post_and_master_checkout(self): project = "org/project1" master_project = "org/project2" path = os.path.join(self.upstream_root, project) repo = git.Repo(path) repo.head.reference = repo.heads["master"] commits = [] for i in range(0, 3): commits.append(self.create_commit(project)) newRev = commits[1] cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=[project, master_project], workspace=self.workspace_root, zuul_branch=None, zuul_ref="master", zuul_url=self.git_root, zuul_project=project, zuul_newrev=newRev, ) cloner.execute() repos = self.getWorkspaceRepos([project, master_project]) cloned_sha = repos[project].rev_parse("HEAD").hexsha self.assertEqual(newRev, cloned_sha) self.assertEqual( repos[master_project].rev_parse("HEAD").hexsha, repos[master_project].rev_parse("master").hexsha )
def test_cache_dir(self): projects = ['org/project1', 'org/project2'] cache_root = os.path.join(self.test_root, "cache") for project in projects: upstream_repo_path = os.path.join(self.upstream_root, project) cache_repo_path = os.path.join(cache_root, project) git.Repo.clone_from(upstream_repo_path, cache_repo_path) self.worker.hold_jobs_in_build = True A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A') A.addApproval('CRVW', 2) self.fake_gerrit.addEvent(A.addApproval('APRV', 1)) self.waitUntilSettled() self.assertEquals(1, len(self.builds), "One build is running") B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B') B.setMerged() upstream = self.getUpstreamRepos(projects) states = [ {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('master')), }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters['ZUUL_BRANCH'], zuul_ref=build.parameters['ZUUL_REF'], zuul_url=self.git_root, cache_dir=cache_root, ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals(state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct' % (project, number)) work = self.getWorkspaceRepos(projects) upstream_repo_path = os.path.join(self.upstream_root, 'org/project1') self.assertEquals(work['org/project1'].remotes.origin.url, upstream_repo_path, 'workspace repo origin should be upstream, not cache') self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_cloner(self): self.worker.hold_jobs_in_build = True A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A') B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B') A.addPatchset(['project_one.txt']) B.addPatchset(['project_two.txt']) self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1)) self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1)) A.addApproval('CRVW', 2) B.addApproval('CRVW', 2) self.fake_gerrit.addEvent(A.addApproval('APRV', 1)) self.fake_gerrit.addEvent(B.addApproval('APRV', 1)) self.waitUntilSettled() self.assertEquals(2, len(self.builds), "Two builds are running") a_zuul_ref = b_zuul_ref = None for build in self.builds: self.log.debug("Build parameters: %s", build.parameters) if build.parameters['ZUUL_CHANGE'] == '1': a_zuul_ref = build.parameters['ZUUL_REF'] a_zuul_commit = build.parameters['ZUUL_COMMIT'] if build.parameters['ZUUL_CHANGE'] == '2': b_zuul_ref = build.parameters['ZUUL_REF'] b_zuul_commit = build.parameters['ZUUL_COMMIT'] self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled() # Repos setup, now test the cloner for zuul_ref in [a_zuul_ref, b_zuul_ref]: cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=['org/project1', 'org/project2'], workspace=self.workspace_root, zuul_branch='master', zuul_ref=zuul_ref, zuul_url=self.git_root, branch='master', clone_map_file=os.path.join(FIXTURE_DIR, 'clonemap.yaml') ) cloner.execute() work_repo1 = git.Repo(os.path.join(self.workspace_root, 'org/project1')) self.assertEquals(a_zuul_commit, str(work_repo1.commit('HEAD'))) work_repo2 = git.Repo(os.path.join(self.workspace_root, 'org/project2')) self.assertEquals(b_zuul_commit, str(work_repo2.commit('HEAD'))) shutil.rmtree(self.workspace_root)
def test_one_branch(self): self.worker.hold_jobs_in_build = True projects = ["org/project1", "org/project2"] A = self.fake_gerrit.addFakeChange("org/project1", "master", "A") B = self.fake_gerrit.addFakeChange("org/project2", "master", "B") A.addApproval("CRVW", 2) B.addApproval("CRVW", 2) self.fake_gerrit.addEvent(A.addApproval("APRV", 1)) self.fake_gerrit.addEvent(B.addApproval("APRV", 1)) self.waitUntilSettled() self.assertEquals(2, len(self.builds), "Two builds are running") upstream = self.getUpstreamRepos(projects) states = [ { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": str(upstream["org/project2"].commit("master")), }, { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": self.builds[1].parameters["ZUUL_COMMIT"], }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters["ZUUL_BRANCH"], zuul_ref=build.parameters["ZUUL_REF"], zuul_url=self.git_root, ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit("HEAD")), "Project %s commit for build %s should " "be correct" % (project, number), ) shutil.rmtree(self.workspace_root) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_one_branch(self): self.worker.hold_jobs_in_build = True projects = ['org/project1', 'org/project2'] A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A') B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B') A.addApproval('CRVW', 2) B.addApproval('CRVW', 2) self.fake_gerrit.addEvent(A.addApproval('APRV', 1)) self.fake_gerrit.addEvent(B.addApproval('APRV', 1)) self.waitUntilSettled() self.assertEquals(2, len(self.builds), "Two builds are running") upstream = self.getUpstreamRepos(projects) states = [ {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('master')), }, {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'], }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters['ZUUL_BRANCH'], zuul_ref=build.parameters['ZUUL_REF'], zuul_url=self.git_root, ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals(state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct' % (project, number)) shutil.rmtree(self.workspace_root) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def main(self): self.parse_arguments() self.setup_logging(color=self.args.color, verbose=self.args.verbose) cloner = zuul.lib.cloner.Cloner( git_base_url=self.args.git_base_url, projects=self.args.projects, workspace=self.args.workspace, zuul_branch=self.args.zuul_branch, zuul_ref=self.args.zuul_ref, zuul_url=self.args.zuul_url, branch=self.args.branch, clone_map_file=self.args.clone_map_file ) cloner.execute()
def main(self): self.parse_arguments() self.setup_logging(color=self.args.color, verbose=self.args.verbose) project_branches = {} if self.args.project_branch: for x in self.args.project_branch: project, branch = x[0].split('=') project_branches[project] = branch cloner = zuul.lib.cloner.Cloner( git_base_url=self.args.git_base_url, projects=self.args.projects, workspace=self.args.workspace, zuul_branch=self.args.zuul_branch, zuul_ref=self.args.zuul_ref, zuul_url=self.args.zuul_url, branch=self.args.branch, clone_map_file=self.args.clone_map_file, project_branches=project_branches, cache_dir=self.args.cache_dir, ) cloner.execute()
def test_cache_dir(self): projects = ["org/project1", "org/project2"] cache_root = os.path.join(self.test_root, "cache") for project in projects: upstream_repo_path = os.path.join(self.upstream_root, project) cache_repo_path = os.path.join(cache_root, project) git.Repo.clone_from(upstream_repo_path, cache_repo_path) self.worker.hold_jobs_in_build = True A = self.fake_gerrit.addFakeChange("org/project1", "master", "A") A.addApproval("CRVW", 2) self.fake_gerrit.addEvent(A.addApproval("APRV", 1)) self.waitUntilSettled() self.assertEquals(1, len(self.builds), "One build is running") B = self.fake_gerrit.addFakeChange("org/project2", "master", "B") B.setMerged() upstream = self.getUpstreamRepos(projects) states = [ { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": str(upstream["org/project2"].commit("master")), } ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters["ZUUL_BRANCH"], zuul_ref=build.parameters["ZUUL_REF"], zuul_url=self.git_root, cache_dir=cache_root, ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit("HEAD")), "Project %s commit for build %s should " "be correct" % (project, number), ) work = self.getWorkspaceRepos(projects) upstream_repo_path = os.path.join(self.upstream_root, "org/project1") self.assertEquals( work["org/project1"].remotes.origin.url, upstream_repo_path, "workspace repo origin should be upstream, not cache", ) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_upgrade(self): # Simulates an upgrade test self.worker.hold_jobs_in_build = True projects = ["org/project1", "org/project2", "org/project3", "org/project4", "org/project5", "org/project6"] self.create_branch("org/project2", "stable/havana") self.create_branch("org/project3", "stable/havana") self.create_branch("org/project4", "stable/havana") self.create_branch("org/project5", "stable/havana") A = self.fake_gerrit.addFakeChange("org/project1", "master", "A") B = self.fake_gerrit.addFakeChange("org/project2", "master", "B") C = self.fake_gerrit.addFakeChange("org/project3", "stable/havana", "C") D = self.fake_gerrit.addFakeChange("org/project3", "master", "D") E = self.fake_gerrit.addFakeChange("org/project4", "stable/havana", "E") A.addApproval("CRVW", 2) B.addApproval("CRVW", 2) C.addApproval("CRVW", 2) D.addApproval("CRVW", 2) E.addApproval("CRVW", 2) self.fake_gerrit.addEvent(A.addApproval("APRV", 1)) self.fake_gerrit.addEvent(B.addApproval("APRV", 1)) self.fake_gerrit.addEvent(C.addApproval("APRV", 1)) self.fake_gerrit.addEvent(D.addApproval("APRV", 1)) self.fake_gerrit.addEvent(E.addApproval("APRV", 1)) self.waitUntilSettled() self.assertEquals(5, len(self.builds), "Five builds are running") # Check the old side of the upgrade first upstream = self.getUpstreamRepos(projects) states = [ { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": str(upstream["org/project2"].commit("stable/havana")), "org/project3": str(upstream["org/project3"].commit("stable/havana")), "org/project4": str(upstream["org/project4"].commit("stable/havana")), "org/project5": str(upstream["org/project5"].commit("stable/havana")), "org/project6": str(upstream["org/project6"].commit("master")), }, { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": str(upstream["org/project2"].commit("stable/havana")), "org/project3": str(upstream["org/project3"].commit("stable/havana")), "org/project4": str(upstream["org/project4"].commit("stable/havana")), "org/project5": str(upstream["org/project5"].commit("stable/havana")), "org/project6": str(upstream["org/project6"].commit("master")), }, { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": str(upstream["org/project2"].commit("stable/havana")), "org/project3": self.builds[2].parameters["ZUUL_COMMIT"], "org/project4": str(upstream["org/project4"].commit("stable/havana")), "org/project5": str(upstream["org/project5"].commit("stable/havana")), "org/project6": str(upstream["org/project6"].commit("master")), }, { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": str(upstream["org/project2"].commit("stable/havana")), "org/project3": self.builds[2].parameters["ZUUL_COMMIT"], "org/project4": str(upstream["org/project4"].commit("stable/havana")), "org/project5": str(upstream["org/project5"].commit("stable/havana")), "org/project6": str(upstream["org/project6"].commit("master")), }, { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": str(upstream["org/project2"].commit("stable/havana")), "org/project3": self.builds[2].parameters["ZUUL_COMMIT"], "org/project4": self.builds[4].parameters["ZUUL_COMMIT"], "org/project5": str(upstream["org/project5"].commit("stable/havana")), "org/project6": str(upstream["org/project6"].commit("master")), }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters["ZUUL_BRANCH"], zuul_ref=build.parameters["ZUUL_REF"], zuul_url=self.git_root, branch="stable/havana", # Old branch for upgrade ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit("HEAD")), "Project %s commit for build %s should " "be correct on old side of upgrade" % (project, number), ) shutil.rmtree(self.workspace_root) # Check the new side of the upgrade states = [ { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": str(upstream["org/project2"].commit("master")), "org/project3": str(upstream["org/project3"].commit("master")), "org/project4": str(upstream["org/project4"].commit("master")), "org/project5": str(upstream["org/project5"].commit("master")), "org/project6": str(upstream["org/project6"].commit("master")), }, { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": self.builds[1].parameters["ZUUL_COMMIT"], "org/project3": str(upstream["org/project3"].commit("master")), "org/project4": str(upstream["org/project4"].commit("master")), "org/project5": str(upstream["org/project5"].commit("master")), "org/project6": str(upstream["org/project6"].commit("master")), }, { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": self.builds[1].parameters["ZUUL_COMMIT"], "org/project3": str(upstream["org/project3"].commit("master")), "org/project4": str(upstream["org/project4"].commit("master")), "org/project5": str(upstream["org/project5"].commit("master")), "org/project6": str(upstream["org/project6"].commit("master")), }, { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": self.builds[1].parameters["ZUUL_COMMIT"], "org/project3": self.builds[3].parameters["ZUUL_COMMIT"], "org/project4": str(upstream["org/project4"].commit("master")), "org/project5": str(upstream["org/project5"].commit("master")), "org/project6": str(upstream["org/project6"].commit("master")), }, { "org/project1": self.builds[0].parameters["ZUUL_COMMIT"], "org/project2": self.builds[1].parameters["ZUUL_COMMIT"], "org/project3": self.builds[3].parameters["ZUUL_COMMIT"], "org/project4": str(upstream["org/project4"].commit("master")), "org/project5": str(upstream["org/project5"].commit("master")), "org/project6": str(upstream["org/project6"].commit("master")), }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters["ZUUL_BRANCH"], zuul_ref=build.parameters["ZUUL_REF"], zuul_url=self.git_root, branch="master", # New branch for upgrade ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit("HEAD")), "Project %s commit for build %s should " "be correct on old side of upgrade" % (project, number), ) shutil.rmtree(self.workspace_root) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_periodic_update(self): # Test that the merger correctly updates its local repository # before running a periodic job. # Prime the merger with the current state A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A') self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1)) self.waitUntilSettled() # Merge a different change B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B') B.setMerged() # Start a periodic job self.worker.hold_jobs_in_build = True self.launcher.negative_function_cache_ttl = 0 self.config.set('zuul', 'layout_config', 'tests/fixtures/layout-timer.yaml') self.sched.reconfigure(self.config) self.registerJobs() # The pipeline triggers every second, so we should have seen # several by now. time.sleep(5) self.waitUntilSettled() builds = self.builds[:] self.worker.hold_jobs_in_build = False # Stop queuing timer triggered jobs so that the assertions # below don't race against more jobs being queued. self.config.set('zuul', 'layout_config', 'tests/fixtures/layout-no-timer.yaml') self.sched.reconfigure(self.config) self.registerJobs() self.worker.release() self.waitUntilSettled() projects = ['org/project'] self.assertEquals(2, len(builds), "Two builds are running") upstream = self.getUpstreamRepos(projects) self.assertEqual(upstream['org/project'].commit('master').hexsha, B.patchsets[0]['revision']) states = [ { 'org/project': str(upstream['org/project'].commit('master')), }, { 'org/project': str(upstream['org/project'].commit('master')), }, ] for number, build in enumerate(builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_project=build.parameters.get('ZUUL_PROJECT', None), zuul_branch=build.parameters.get('ZUUL_BRANCH', None), zuul_ref=build.parameters.get('ZUUL_REF', None), zuul_url=self.git_root, ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct' % (project, number)) shutil.rmtree(self.workspace_root) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_cache_dir(self): projects = ['org/project1', 'org/project2'] cache_root = os.path.join(self.test_root, "cache") for project in projects: upstream_repo_path = os.path.join(self.upstream_root, project) cache_repo_path = os.path.join(cache_root, project) git.Repo.clone_from(upstream_repo_path, cache_repo_path) self.worker.hold_jobs_in_build = True A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A') A.addApproval('CRVW', 2) self.fake_gerrit.addEvent(A.addApproval('APRV', 1)) self.waitUntilSettled() self.assertEquals(1, len(self.builds), "One build is running") B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B') B.setMerged() upstream = self.getUpstreamRepos(projects) states = [{ 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('master')), }] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_project=build.parameters.get('ZUUL_PROJECT', None), zuul_branch=build.parameters['ZUUL_BRANCH'], zuul_ref=build.parameters['ZUUL_REF'], zuul_url=self.git_root, cache_dir=cache_root, ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct' % (project, number)) work = self.getWorkspaceRepos(projects) # project1 is the zuul_project so the origin should be set to the # zuul_url since that is the most up to date. cache_repo_path = os.path.join(cache_root, 'org/project1') self.assertNotEqual(work['org/project1'].remotes.origin.url, cache_repo_path, 'workspace repo origin should not be the cache') zuul_url_repo_path = os.path.join(self.git_root, 'org/project1') self.assertEqual(work['org/project1'].remotes.origin.url, zuul_url_repo_path, 'workspace repo origin should be the zuul url') # project2 is not the zuul_project so the origin should be set # to upstream since that is the best we can do cache_repo_path = os.path.join(cache_root, 'org/project2') self.assertNotEqual(work['org/project2'].remotes.origin.url, cache_repo_path, 'workspace repo origin should not be the cache') upstream_repo_path = os.path.join(self.upstream_root, 'org/project2') self.assertEqual(work['org/project2'].remotes.origin.url, upstream_repo_path, 'workspace repo origin should be the upstream url') self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_periodic(self): self.worker.hold_jobs_in_build = True self.create_branch('org/project', 'stable/havana') self.config.set('zuul', 'layout_config', 'tests/fixtures/layout-timer.yaml') self.sched.reconfigure(self.config) self.registerJobs() # The pipeline triggers every second, so we should have seen # several by now. time.sleep(5) self.waitUntilSettled() builds = self.builds[:] self.worker.hold_jobs_in_build = False # Stop queuing timer triggered jobs so that the assertions # below don't race against more jobs being queued. self.config.set('zuul', 'layout_config', 'tests/fixtures/layout-no-timer.yaml') self.sched.reconfigure(self.config) self.registerJobs() self.worker.release() self.waitUntilSettled() projects = ['org/project'] self.assertEquals(2, len(builds), "Two builds are running") upstream = self.getUpstreamRepos(projects) states = [ { 'org/project': str(upstream['org/project'].commit('stable/havana')), }, { 'org/project': str(upstream['org/project'].commit('stable/havana')), }, ] for number, build in enumerate(builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_project=build.parameters.get('ZUUL_PROJECT', None), zuul_branch=build.parameters.get('ZUUL_BRANCH', None), zuul_ref=build.parameters.get('ZUUL_REF', None), zuul_url=self.git_root, branch='stable/havana', ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct' % (project, number)) shutil.rmtree(self.workspace_root) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_project_override(self): self.worker.hold_jobs_in_build = True projects = [ 'org/project1', 'org/project2', 'org/project3', 'org/project4', 'org/project5', 'org/project6' ] self.create_branch('org/project3', 'stable/havana') self.create_branch('org/project4', 'stable/havana') self.create_branch('org/project6', 'stable/havana') A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A') B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B') C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C') D = self.fake_gerrit.addFakeChange('org/project3', 'stable/havana', 'D') A.addApproval('CRVW', 2) B.addApproval('CRVW', 2) C.addApproval('CRVW', 2) D.addApproval('CRVW', 2) self.fake_gerrit.addEvent(A.addApproval('APRV', 1)) self.fake_gerrit.addEvent(B.addApproval('APRV', 1)) self.fake_gerrit.addEvent(C.addApproval('APRV', 1)) self.fake_gerrit.addEvent(D.addApproval('APRV', 1)) self.waitUntilSettled() self.assertEquals(4, len(self.builds), "Four builds are running") upstream = self.getUpstreamRepos(projects) states = [ { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('master')), 'org/project3': str(upstream['org/project3'].commit('master')), 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('master')), 'org/project3': str(upstream['org/project3'].commit('master')), 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[2].parameters['ZUUL_COMMIT'], 'org/project3': str(upstream['org/project3'].commit('master')), 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[2].parameters['ZUUL_COMMIT'], 'org/project3': self.builds[3].parameters['ZUUL_COMMIT'], 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('stable/havana')), }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_project=build.parameters.get('ZUUL_PROJECT', None), zuul_branch=build.parameters['ZUUL_BRANCH'], zuul_ref=build.parameters['ZUUL_REF'], zuul_url=self.git_root, project_branches={'org/project4': 'master'}, ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct' % (project, number)) shutil.rmtree(self.workspace_root) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_upgrade(self): # Simulates an upgrade test self.worker.hold_jobs_in_build = True projects = [ 'org/project1', 'org/project2', 'org/project3', 'org/project4', 'org/project5', 'org/project6' ] self.create_branch('org/project2', 'stable/havana') self.create_branch('org/project3', 'stable/havana') self.create_branch('org/project4', 'stable/havana') self.create_branch('org/project5', 'stable/havana') A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A') B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B') C = self.fake_gerrit.addFakeChange('org/project3', 'stable/havana', 'C') D = self.fake_gerrit.addFakeChange('org/project3', 'master', 'D') E = self.fake_gerrit.addFakeChange('org/project4', 'stable/havana', 'E') A.addApproval('CRVW', 2) B.addApproval('CRVW', 2) C.addApproval('CRVW', 2) D.addApproval('CRVW', 2) E.addApproval('CRVW', 2) self.fake_gerrit.addEvent(A.addApproval('APRV', 1)) self.fake_gerrit.addEvent(B.addApproval('APRV', 1)) self.fake_gerrit.addEvent(C.addApproval('APRV', 1)) self.fake_gerrit.addEvent(D.addApproval('APRV', 1)) self.fake_gerrit.addEvent(E.addApproval('APRV', 1)) self.waitUntilSettled() self.assertEquals(5, len(self.builds), "Five builds are running") # Check the old side of the upgrade first upstream = self.getUpstreamRepos(projects) states = [ { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': str(upstream['org/project3'].commit('stable/havana')), 'org/project4': str(upstream['org/project4'].commit('stable/havana')), 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': str(upstream['org/project3'].commit('stable/havana')), 'org/project4': str(upstream['org/project4'].commit('stable/havana')), 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'], 'org/project4': str(upstream['org/project4'].commit('stable/havana')), 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'], 'org/project4': str(upstream['org/project4'].commit('stable/havana')), 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'], 'org/project4': self.builds[4].parameters['ZUUL_COMMIT'], 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) change_number = int(build.parameters['ZUUL_CHANGE']) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters['ZUUL_BRANCH'], zuul_ref=build.parameters['ZUUL_REF'], zuul_url=self.git_root, branch='stable/havana', # Old branch for upgrade ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct on old side of upgrade' % (project, number)) shutil.rmtree(self.workspace_root) # Check the new side of the upgrade states = [ { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('master')), 'org/project3': str(upstream['org/project3'].commit('master')), 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project3': str(upstream['org/project3'].commit('master')), 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project3': str(upstream['org/project3'].commit('master')), 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project3': self.builds[3].parameters['ZUUL_COMMIT'], 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, { 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project3': self.builds[3].parameters['ZUUL_COMMIT'], 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) change_number = int(build.parameters['ZUUL_CHANGE']) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters['ZUUL_BRANCH'], zuul_ref=build.parameters['ZUUL_REF'], zuul_url=self.git_root, branch='master', # New branch for upgrade ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals( state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct on old side of upgrade' % (project, number)) shutil.rmtree(self.workspace_root) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()
def test_upgrade(self): # Simulates an upgrade test self.worker.hold_jobs_in_build = True projects = ['org/project1', 'org/project2', 'org/project3', 'org/project4', 'org/project5', 'org/project6'] self.create_branch('org/project2', 'stable/havana') self.create_branch('org/project3', 'stable/havana') self.create_branch('org/project4', 'stable/havana') self.create_branch('org/project5', 'stable/havana') A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A') B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B') C = self.fake_gerrit.addFakeChange('org/project3', 'stable/havana', 'C') D = self.fake_gerrit.addFakeChange('org/project3', 'master', 'D') E = self.fake_gerrit.addFakeChange('org/project4', 'stable/havana', 'E') A.addApproval('CRVW', 2) B.addApproval('CRVW', 2) C.addApproval('CRVW', 2) D.addApproval('CRVW', 2) E.addApproval('CRVW', 2) self.fake_gerrit.addEvent(A.addApproval('APRV', 1)) self.fake_gerrit.addEvent(B.addApproval('APRV', 1)) self.fake_gerrit.addEvent(C.addApproval('APRV', 1)) self.fake_gerrit.addEvent(D.addApproval('APRV', 1)) self.fake_gerrit.addEvent(E.addApproval('APRV', 1)) self.waitUntilSettled() self.assertEquals(5, len(self.builds), "Five builds are running") # Check the old side of the upgrade first upstream = self.getUpstreamRepos(projects) states = [ {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': str(upstream['org/project3'].commit('stable/havana')), 'org/project4': str(upstream['org/project4'].commit('stable/havana')), 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': str(upstream['org/project3'].commit('stable/havana')), 'org/project4': str(upstream['org/project4'].commit('stable/havana')), 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'], 'org/project4': str(upstream['org/project4'].commit('stable/havana')), 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'], 'org/project4': str(upstream['org/project4'].commit('stable/havana')), 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('stable/havana')), 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'], 'org/project4': self.builds[4].parameters['ZUUL_COMMIT'], 'org/project5': str(upstream['org/project5'].commit('stable/havana')), 'org/project6': str(upstream['org/project6'].commit('master')), }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) change_number = int(build.parameters['ZUUL_CHANGE']) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters['ZUUL_BRANCH'], zuul_ref=build.parameters['ZUUL_REF'], zuul_url=self.git_root, branch='stable/havana', # Old branch for upgrade ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals(state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct on old side of upgrade' % (project, number)) shutil.rmtree(self.workspace_root) # Check the new side of the upgrade states = [ {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': str(upstream['org/project2'].commit('master')), 'org/project3': str(upstream['org/project3'].commit('master')), 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project3': str(upstream['org/project3'].commit('master')), 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project3': str(upstream['org/project3'].commit('master')), 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project3': self.builds[3].parameters['ZUUL_COMMIT'], 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'], 'org/project3': self.builds[3].parameters['ZUUL_COMMIT'], 'org/project4': str(upstream['org/project4'].commit('master')), 'org/project5': str(upstream['org/project5'].commit('master')), 'org/project6': str(upstream['org/project6'].commit('master')), }, ] for number, build in enumerate(self.builds): self.log.debug("Build parameters: %s", build.parameters) change_number = int(build.parameters['ZUUL_CHANGE']) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, projects=projects, workspace=self.workspace_root, zuul_branch=build.parameters['ZUUL_BRANCH'], zuul_ref=build.parameters['ZUUL_REF'], zuul_url=self.git_root, branch='master', # New branch for upgrade ) cloner.execute() work = self.getWorkspaceRepos(projects) state = states[number] for project in projects: self.assertEquals(state[project], str(work[project].commit('HEAD')), 'Project %s commit for build %s should ' 'be correct on old side of upgrade' % (project, number)) shutil.rmtree(self.workspace_root) self.worker.hold_jobs_in_build = False self.worker.release() self.waitUntilSettled()