diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-09-02 18:08:16 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-09-02 18:08:16 +0000 |
commit | 0c9d3e9b788cfed796137f8a3a9d8c5aea4e032d (patch) | |
tree | d03c708eae54987f2a4b3f0a57c68973100e4ecd | |
parent | 46075786b689f18a0018e336417462f943338b71 (diff) | |
parent | 97d902e21df004fd4a9ffec52a6356d5c34b7208 (diff) | |
download | zuul-0c9d3e9b788cfed796137f8a3a9d8c5aea4e032d.tar.gz |
Merge "Cloner: default to ZUUL_BRANCH"
-rwxr-xr-x | tests/base.py | 32 | ||||
-rw-r--r-- | tests/fixtures/layout-cloner.yaml (renamed from tests/fixtures/layout-gating.yaml) | 12 | ||||
-rw-r--r-- | tests/test_cloner.py | 131 | ||||
-rw-r--r-- | zuul/lib/cloner.py | 28 |
4 files changed, 156 insertions, 47 deletions
diff --git a/tests/base.py b/tests/base.py index 753bc5e60..4ba88fb23 100755 --- a/tests/base.py +++ b/tests/base.py @@ -56,6 +56,7 @@ import zuul.trigger.zuultrigger FIXTURE_DIR = os.path.join(os.path.dirname(__file__), 'fixtures') +USE_TEMPDIR = True logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)-32s ' @@ -165,7 +166,7 @@ class FakeChange(object): if files: fn = files[0] else: - fn = '%s-%s' % (self.branch, self.number) + fn = '%s-%s' % (self.branch.replace('/', '_'), self.number) msg = self.subject + '-' + str(self.latest_patchset) c = self.add_fake_change_to_repo(msg, fn, large) ps_files = [{'file': '/COMMIT_MSG', @@ -821,8 +822,11 @@ class ZuulTestCase(testtools.TestCase): level=logging.DEBUG, format='%(asctime)s %(name)-32s ' '%(levelname)-8s %(message)s')) - tmp_root = self.useFixture(fixtures.TempDir( - rootdir=os.environ.get("ZUUL_TEST_ROOT"))).path + if USE_TEMPDIR: + tmp_root = self.useFixture(fixtures.TempDir( + rootdir=os.environ.get("ZUUL_TEST_ROOT"))).path + else: + tmp_root = os.environ.get("ZUUL_TEST_ROOT") self.test_root = os.path.join(tmp_root, "zuul-test") self.upstream_root = os.path.join(self.test_root, "upstream") self.git_root = os.path.join(self.test_root, "git") @@ -844,6 +848,7 @@ class ZuulTestCase(testtools.TestCase): self.init_repo("org/project1") self.init_repo("org/project2") self.init_repo("org/project3") + self.init_repo("org/project4") self.init_repo("org/one-job-project") self.init_repo("org/nonvoting-project") self.init_repo("org/templated-project") @@ -998,15 +1003,26 @@ class ZuulTestCase(testtools.TestCase): master = repo.create_head('master') repo.create_tag('init') - mp = repo.create_head('mp') - repo.head.reference = mp + repo.head.reference = master + repo.head.reset(index=True, working_tree=True) + repo.git.clean('-x', '-f', '-d') + + self.create_branch(project, 'mp') + + def create_branch(self, project, branch): + path = os.path.join(self.upstream_root, project) + repo = git.Repo.init(path) + fn = os.path.join(path, 'README') + + branch_head = repo.create_head(branch) + repo.head.reference = branch_head f = open(fn, 'a') - f.write("test mp\n") + f.write("test %s\n" % branch) f.close() repo.index.add([fn]) - repo.index.commit('mp commit') + repo.index.commit('%s commit' % branch) - repo.head.reference = master + repo.head.reference = repo.heads['master'] repo.head.reset(index=True, working_tree=True) repo.git.clean('-x', '-f', '-d') diff --git a/tests/fixtures/layout-gating.yaml b/tests/fixtures/layout-cloner.yaml index a544a80f8..258c6c1f9 100644 --- a/tests/fixtures/layout-gating.yaml +++ b/tests/fixtures/layout-cloner.yaml @@ -22,8 +22,16 @@ projects: - name: org/project1 gate: - - project1-project2-integration + - integration - name: org/project2 gate: - - project1-project2-integration + - integration + + - name: org/project3 + gate: + - integration + + - name: org/project4 + gate: + - integration diff --git a/tests/test_cloner.py b/tests/test_cloner.py index 1a4ce88c1..6f24ff5f7 100644 --- a/tests/test_cloner.py +++ b/tests/test_cloner.py @@ -41,13 +41,28 @@ class TestCloner(ZuulTestCase): self.workspace_root = os.path.join(self.test_root, 'workspace') self.config.set('zuul', 'layout_config', - 'tests/fixtures/layout-gating.yaml') + 'tests/fixtures/layout-cloner.yaml') self.sched.reconfigure(self.config) self.registerJobs() - def test_cloner(self): + def getWorkspaceRepos(self, projects): + repos = {} + for project in projects: + repos[project] = git.Repo( + os.path.join(self.workspace_root, project)) + return repos + + def getUpstreamRepos(self, projects): + repos = {} + for project in projects: + repos[project] = git.Repo( + os.path.join(self.upstream_root, project)) + return repos + + 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) @@ -59,34 +74,104 @@ class TestCloner(ZuulTestCase): self.assertEquals(2, len(self.builds), "Two builds are running") - for build in self.builds: + 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) - change_number = int(build.parameters['ZUUL_CHANGE']) cloner = zuul.lib.cloner.Cloner( git_base_url=self.upstream_root, - projects=['org/project1', 'org/project2'], + projects=projects, workspace=self.workspace_root, - zuul_branch='master', + zuul_branch=build.parameters['ZUUL_BRANCH'], zuul_ref=build.parameters['ZUUL_REF'], zuul_url=self.git_root, - branch='master', - ) + ) cloner.execute() - work_repo1 = git.Repo(os.path.join(self.workspace_root, - 'org/project1')) - work_repo2 = git.Repo(os.path.join(self.workspace_root, - 'org/project2')) - if change_number >= 1: - self.assertEquals( - self.builds[0].parameters['ZUUL_COMMIT'], - str(work_repo1.commit('HEAD'))) - if change_number >= 2: - self.assertEquals( - self.builds[1].parameters['ZUUL_COMMIT'], - str(work_repo2.commit('HEAD'))) - else: - self.assertEquals(str(work_repo2.commit('master')), - str(work_repo2.commit('HEAD'))) + 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_multi_branch(self): + self.worker.hold_jobs_in_build = True + projects = ['org/project1', 'org/project2', + 'org/project3', 'org/project4'] + + self.create_branch('org/project2', 'stable/havana') + self.create_branch('org/project4', 'stable/havana') + A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A') + B = self.fake_gerrit.addFakeChange('org/project2', 'stable/havana', 'B') + C = self.fake_gerrit.addFakeChange('org/project3', 'master', 'C') + A.addApproval('CRVW', 2) + B.addApproval('CRVW', 2) + C.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.waitUntilSettled() + + self.assertEquals(3, len(self.builds), "Three 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/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('stable/havana')), + }, + {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'], + 'org/project2': str(upstream['org/project2'].commit('master')), + 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'], + 'org/project4': str(upstream['org/project4']. + 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, + ) + 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 diff --git a/zuul/lib/cloner.py b/zuul/lib/cloner.py index 0961eb44d..a38281c64 100644 --- a/zuul/lib/cloner.py +++ b/zuul/lib/cloner.py @@ -106,22 +106,22 @@ class Cloner(object): # Ensure that we don't have stale remotes around repo.prune() - override_zuul_ref = self.zuul_ref - # FIXME should be origin HEAD branch which might not be 'master' - fallback_branch = 'master' - fallback_zuul_ref = re.sub(self.zuul_branch, fallback_branch, + indicated_branch = self.branch or self.zuul_branch + + override_zuul_ref = re.sub(self.zuul_branch, indicated_branch, self.zuul_ref) - if self.branch: - override_zuul_ref = re.sub(self.zuul_branch, self.branch, - self.zuul_ref) - if repo.hasBranch(self.branch): - self.log.debug("upstream repo has branch %s", self.branch) - fallback_branch = self.branch - fallback_zuul_ref = self.zuul_ref - else: - self.log.exception("upstream repo is missing branch %s", - self.branch) + if repo.hasBranch(indicated_branch): + self.log.debug("upstream repo has branch %s", indicated_branch) + fallback_branch = indicated_branch + else: + self.log.debug("upstream repo is missing branch %s", + self.branch) + # FIXME should be origin HEAD branch which might not be 'master' + fallback_branch = 'master' + + fallback_zuul_ref = re.sub(self.zuul_branch, fallback_branch, + self.zuul_ref) if (self.fetchFromZuul(repo, project, override_zuul_ref) or (fallback_zuul_ref != override_zuul_ref and |