blob: 7fc8dfc3f8e2d9a93134eae901aa8e3d7e10f7c8 [file] [log] [blame]
Antoine Musso45dd2cb2014-01-29 17:17:43 +01001#!/usr/bin/env python
2
3# Copyright 2012 Hewlett-Packard Development Company, L.P.
4# Copyright 2014 Wikimedia Foundation Inc.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
18import logging
19import os
20import shutil
James E. Blair217b10d2015-01-08 16:25:28 -080021import time
Antoine Musso45dd2cb2014-01-29 17:17:43 +010022
23import git
24
25import zuul.lib.cloner
26
27from tests.base import ZuulTestCase
Antoine Musso45dd2cb2014-01-29 17:17:43 +010028
29logging.basicConfig(level=logging.DEBUG,
30 format='%(asctime)s %(name)-32s '
31 '%(levelname)-8s %(message)s')
32
33
34class TestCloner(ZuulTestCase):
35
36 log = logging.getLogger("zuul.test.cloner")
37 workspace_root = None
38
39 def setUp(self):
40 super(TestCloner, self).setUp()
41 self.workspace_root = os.path.join(self.test_root, 'workspace')
42
43 self.config.set('zuul', 'layout_config',
James E. Blair97d902e2014-08-21 13:25:56 -070044 'tests/fixtures/layout-cloner.yaml')
Antoine Musso45dd2cb2014-01-29 17:17:43 +010045 self.sched.reconfigure(self.config)
46 self.registerJobs()
47
James E. Blair97d902e2014-08-21 13:25:56 -070048 def getWorkspaceRepos(self, projects):
49 repos = {}
50 for project in projects:
51 repos[project] = git.Repo(
52 os.path.join(self.workspace_root, project))
53 return repos
54
55 def getUpstreamRepos(self, projects):
56 repos = {}
57 for project in projects:
58 repos[project] = git.Repo(
59 os.path.join(self.upstream_root, project))
60 return repos
61
James E. Blair48ff4d52014-08-25 15:07:21 -070062 def test_cache_dir(self):
63 projects = ['org/project1', 'org/project2']
64 cache_root = os.path.join(self.test_root, "cache")
65 for project in projects:
66 upstream_repo_path = os.path.join(self.upstream_root, project)
67 cache_repo_path = os.path.join(cache_root, project)
68 git.Repo.clone_from(upstream_repo_path, cache_repo_path)
69
70 self.worker.hold_jobs_in_build = True
71 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
72 A.addApproval('CRVW', 2)
73 self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
74
75 self.waitUntilSettled()
76
77 self.assertEquals(1, len(self.builds), "One build is running")
78
79 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
80 B.setMerged()
81
82 upstream = self.getUpstreamRepos(projects)
Joshua Hesketh29d99b72014-08-19 16:27:42 +100083 states = [{
84 'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
85 'org/project2': str(upstream['org/project2'].commit('master')),
86 }]
James E. Blair48ff4d52014-08-25 15:07:21 -070087
88 for number, build in enumerate(self.builds):
89 self.log.debug("Build parameters: %s", build.parameters)
90 cloner = zuul.lib.cloner.Cloner(
91 git_base_url=self.upstream_root,
92 projects=projects,
93 workspace=self.workspace_root,
James E. Blairbfd85fd2016-10-21 14:18:11 -070094 zuul_project=build.parameters.get('ZUUL_PROJECT', None),
James E. Blair48ff4d52014-08-25 15:07:21 -070095 zuul_branch=build.parameters['ZUUL_BRANCH'],
96 zuul_ref=build.parameters['ZUUL_REF'],
97 zuul_url=self.git_root,
98 cache_dir=cache_root,
Joshua Hesketh29d99b72014-08-19 16:27:42 +100099 )
James E. Blair48ff4d52014-08-25 15:07:21 -0700100 cloner.execute()
101 work = self.getWorkspaceRepos(projects)
102 state = states[number]
103
104 for project in projects:
105 self.assertEquals(state[project],
106 str(work[project].commit('HEAD')),
107 'Project %s commit for build %s should '
108 'be correct' % (project, number))
109
110 work = self.getWorkspaceRepos(projects)
111 upstream_repo_path = os.path.join(self.upstream_root, 'org/project1')
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000112 self.assertEquals(
113 work['org/project1'].remotes.origin.url,
114 upstream_repo_path,
115 'workspace repo origin should be upstream, not cache'
116 )
James E. Blair48ff4d52014-08-25 15:07:21 -0700117
118 self.worker.hold_jobs_in_build = False
119 self.worker.release()
120 self.waitUntilSettled()
121
James E. Blair97d902e2014-08-21 13:25:56 -0700122 def test_one_branch(self):
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100123 self.worker.hold_jobs_in_build = True
124
James E. Blair97d902e2014-08-21 13:25:56 -0700125 projects = ['org/project1', 'org/project2']
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100126 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
127 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100128 A.addApproval('CRVW', 2)
129 B.addApproval('CRVW', 2)
130 self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
131 self.fake_gerrit.addEvent(B.addApproval('APRV', 1))
132
133 self.waitUntilSettled()
134
135 self.assertEquals(2, len(self.builds), "Two builds are running")
136
James E. Blair97d902e2014-08-21 13:25:56 -0700137 upstream = self.getUpstreamRepos(projects)
138 states = [
139 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
140 'org/project2': str(upstream['org/project2'].commit('master')),
141 },
142 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
143 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'],
144 },
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000145 ]
James E. Blair97d902e2014-08-21 13:25:56 -0700146
147 for number, build in enumerate(self.builds):
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100148 self.log.debug("Build parameters: %s", build.parameters)
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100149 cloner = zuul.lib.cloner.Cloner(
150 git_base_url=self.upstream_root,
James E. Blair97d902e2014-08-21 13:25:56 -0700151 projects=projects,
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100152 workspace=self.workspace_root,
James E. Blairbfd85fd2016-10-21 14:18:11 -0700153 zuul_project=build.parameters.get('ZUUL_PROJECT', None),
James E. Blair97d902e2014-08-21 13:25:56 -0700154 zuul_branch=build.parameters['ZUUL_BRANCH'],
James E. Blair82318922014-08-21 11:05:32 -0700155 zuul_ref=build.parameters['ZUUL_REF'],
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100156 zuul_url=self.git_root,
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000157 )
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100158 cloner.execute()
James E. Blair97d902e2014-08-21 13:25:56 -0700159 work = self.getWorkspaceRepos(projects)
160 state = states[number]
161
162 for project in projects:
163 self.assertEquals(state[project],
164 str(work[project].commit('HEAD')),
165 'Project %s commit for build %s should '
166 'be correct' % (project, number))
167
168 shutil.rmtree(self.workspace_root)
169
170 self.worker.hold_jobs_in_build = False
171 self.worker.release()
172 self.waitUntilSettled()
173
174 def test_multi_branch(self):
175 self.worker.hold_jobs_in_build = True
176 projects = ['org/project1', 'org/project2',
177 'org/project3', 'org/project4']
178
179 self.create_branch('org/project2', 'stable/havana')
180 self.create_branch('org/project4', 'stable/havana')
181 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000182 B = self.fake_gerrit.addFakeChange('org/project2', 'stable/havana',
183 'B')
James E. Blair97d902e2014-08-21 13:25:56 -0700184 C = self.fake_gerrit.addFakeChange('org/project3', 'master', 'C')
185 A.addApproval('CRVW', 2)
186 B.addApproval('CRVW', 2)
187 C.addApproval('CRVW', 2)
188 self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
189 self.fake_gerrit.addEvent(B.addApproval('APRV', 1))
190 self.fake_gerrit.addEvent(C.addApproval('APRV', 1))
191
192 self.waitUntilSettled()
193
194 self.assertEquals(3, len(self.builds), "Three builds are running")
195
196 upstream = self.getUpstreamRepos(projects)
197 states = [
198 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
199 'org/project2': str(upstream['org/project2'].commit('master')),
200 'org/project3': str(upstream['org/project3'].commit('master')),
201 'org/project4': str(upstream['org/project4'].
202 commit('master')),
203 },
204 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
205 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'],
206 'org/project3': str(upstream['org/project3'].commit('master')),
207 'org/project4': str(upstream['org/project4'].
208 commit('stable/havana')),
209 },
210 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
211 'org/project2': str(upstream['org/project2'].commit('master')),
212 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'],
213 'org/project4': str(upstream['org/project4'].
214 commit('master')),
215 },
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000216 ]
James E. Blair97d902e2014-08-21 13:25:56 -0700217
218 for number, build in enumerate(self.builds):
219 self.log.debug("Build parameters: %s", build.parameters)
220 cloner = zuul.lib.cloner.Cloner(
221 git_base_url=self.upstream_root,
222 projects=projects,
223 workspace=self.workspace_root,
James E. Blairbfd85fd2016-10-21 14:18:11 -0700224 zuul_project=build.parameters.get('ZUUL_PROJECT', None),
James E. Blair97d902e2014-08-21 13:25:56 -0700225 zuul_branch=build.parameters['ZUUL_BRANCH'],
226 zuul_ref=build.parameters['ZUUL_REF'],
227 zuul_url=self.git_root,
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000228 )
James E. Blair97d902e2014-08-21 13:25:56 -0700229 cloner.execute()
230 work = self.getWorkspaceRepos(projects)
231 state = states[number]
232
233 for project in projects:
234 self.assertEquals(state[project],
235 str(work[project].commit('HEAD')),
236 'Project %s commit for build %s should '
237 'be correct' % (project, number))
Antoine Musso45dd2cb2014-01-29 17:17:43 +0100238 shutil.rmtree(self.workspace_root)
James E. Blair82318922014-08-21 11:05:32 -0700239
240 self.worker.hold_jobs_in_build = False
241 self.worker.release()
242 self.waitUntilSettled()
James E. Blairbce35e12014-08-21 14:31:17 -0700243
244 def test_upgrade(self):
245 # Simulates an upgrade test
246 self.worker.hold_jobs_in_build = True
247 projects = ['org/project1', 'org/project2', 'org/project3',
248 'org/project4', 'org/project5', 'org/project6']
249
250 self.create_branch('org/project2', 'stable/havana')
251 self.create_branch('org/project3', 'stable/havana')
252 self.create_branch('org/project4', 'stable/havana')
253 self.create_branch('org/project5', 'stable/havana')
254 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
255 B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000256 C = self.fake_gerrit.addFakeChange('org/project3', 'stable/havana',
257 'C')
James E. Blairbce35e12014-08-21 14:31:17 -0700258 D = self.fake_gerrit.addFakeChange('org/project3', 'master', 'D')
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000259 E = self.fake_gerrit.addFakeChange('org/project4', 'stable/havana',
260 'E')
James E. Blairbce35e12014-08-21 14:31:17 -0700261 A.addApproval('CRVW', 2)
262 B.addApproval('CRVW', 2)
263 C.addApproval('CRVW', 2)
264 D.addApproval('CRVW', 2)
265 E.addApproval('CRVW', 2)
266 self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
267 self.fake_gerrit.addEvent(B.addApproval('APRV', 1))
268 self.fake_gerrit.addEvent(C.addApproval('APRV', 1))
269 self.fake_gerrit.addEvent(D.addApproval('APRV', 1))
270 self.fake_gerrit.addEvent(E.addApproval('APRV', 1))
271
272 self.waitUntilSettled()
273
274 self.assertEquals(5, len(self.builds), "Five builds are running")
275
276 # Check the old side of the upgrade first
277 upstream = self.getUpstreamRepos(projects)
278 states = [
279 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000280 'org/project2': str(upstream['org/project2'].commit(
281 'stable/havana')),
282 'org/project3': str(upstream['org/project3'].commit(
283 'stable/havana')),
284 'org/project4': str(upstream['org/project4'].commit(
285 'stable/havana')),
286 'org/project5': str(upstream['org/project5'].commit(
287 'stable/havana')),
James E. Blairbce35e12014-08-21 14:31:17 -0700288 'org/project6': str(upstream['org/project6'].commit('master')),
289 },
290 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000291 'org/project2': str(upstream['org/project2'].commit(
292 'stable/havana')),
293 'org/project3': str(upstream['org/project3'].commit(
294 'stable/havana')),
295 'org/project4': str(upstream['org/project4'].commit(
296 'stable/havana')),
297 'org/project5': str(upstream['org/project5'].commit(
298 'stable/havana')),
James E. Blairbce35e12014-08-21 14:31:17 -0700299 'org/project6': str(upstream['org/project6'].commit('master')),
300 },
301 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000302 'org/project2': str(upstream['org/project2'].commit(
303 'stable/havana')),
James E. Blairbce35e12014-08-21 14:31:17 -0700304 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'],
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000305 'org/project4': str(upstream['org/project4'].commit(
306 'stable/havana')),
James E. Blairbce35e12014-08-21 14:31:17 -0700307
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000308 'org/project5': str(upstream['org/project5'].commit(
309 'stable/havana')),
James E. Blairbce35e12014-08-21 14:31:17 -0700310 'org/project6': str(upstream['org/project6'].commit('master')),
311 },
312 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000313 'org/project2': str(upstream['org/project2'].commit(
314 'stable/havana')),
James E. Blairbce35e12014-08-21 14:31:17 -0700315 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'],
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000316 'org/project4': str(upstream['org/project4'].commit(
317 'stable/havana')),
318 'org/project5': str(upstream['org/project5'].commit(
319 'stable/havana')),
James E. Blairbce35e12014-08-21 14:31:17 -0700320 'org/project6': str(upstream['org/project6'].commit('master')),
321 },
322 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000323 'org/project2': str(upstream['org/project2'].commit(
324 'stable/havana')),
James E. Blairbce35e12014-08-21 14:31:17 -0700325 'org/project3': self.builds[2].parameters['ZUUL_COMMIT'],
326 'org/project4': self.builds[4].parameters['ZUUL_COMMIT'],
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000327 'org/project5': str(upstream['org/project5'].commit(
328 'stable/havana')),
James E. Blairbce35e12014-08-21 14:31:17 -0700329 'org/project6': str(upstream['org/project6'].commit('master')),
330 },
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000331 ]
James E. Blairbce35e12014-08-21 14:31:17 -0700332
333 for number, build in enumerate(self.builds):
334 self.log.debug("Build parameters: %s", build.parameters)
James E. Blairbce35e12014-08-21 14:31:17 -0700335 cloner = zuul.lib.cloner.Cloner(
336 git_base_url=self.upstream_root,
337 projects=projects,
338 workspace=self.workspace_root,
James E. Blairbfd85fd2016-10-21 14:18:11 -0700339 zuul_project=build.parameters.get('ZUUL_PROJECT', None),
James E. Blairbce35e12014-08-21 14:31:17 -0700340 zuul_branch=build.parameters['ZUUL_BRANCH'],
341 zuul_ref=build.parameters['ZUUL_REF'],
342 zuul_url=self.git_root,
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000343 branch='stable/havana', # Old branch for upgrade
344 )
James E. Blairbce35e12014-08-21 14:31:17 -0700345 cloner.execute()
346 work = self.getWorkspaceRepos(projects)
347 state = states[number]
348
349 for project in projects:
350 self.assertEquals(state[project],
351 str(work[project].commit('HEAD')),
352 'Project %s commit for build %s should '
353 'be correct on old side of upgrade' %
354 (project, number))
355 shutil.rmtree(self.workspace_root)
356
357 # Check the new side of the upgrade
358 states = [
359 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
360 'org/project2': str(upstream['org/project2'].commit('master')),
361 'org/project3': str(upstream['org/project3'].commit('master')),
362 'org/project4': str(upstream['org/project4'].commit('master')),
363 'org/project5': str(upstream['org/project5'].commit('master')),
364 'org/project6': str(upstream['org/project6'].commit('master')),
365 },
366 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
367 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'],
368 'org/project3': str(upstream['org/project3'].commit('master')),
369 'org/project4': str(upstream['org/project4'].commit('master')),
370 'org/project5': str(upstream['org/project5'].commit('master')),
371 'org/project6': str(upstream['org/project6'].commit('master')),
372 },
373 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
374 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'],
375 'org/project3': str(upstream['org/project3'].commit('master')),
376 'org/project4': str(upstream['org/project4'].commit('master')),
377 'org/project5': str(upstream['org/project5'].commit('master')),
378 'org/project6': str(upstream['org/project6'].commit('master')),
379 },
380 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
381 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'],
382 'org/project3': self.builds[3].parameters['ZUUL_COMMIT'],
383 'org/project4': str(upstream['org/project4'].commit('master')),
384 'org/project5': str(upstream['org/project5'].commit('master')),
385 'org/project6': str(upstream['org/project6'].commit('master')),
386 },
387 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
388 'org/project2': self.builds[1].parameters['ZUUL_COMMIT'],
389 'org/project3': self.builds[3].parameters['ZUUL_COMMIT'],
390 'org/project4': str(upstream['org/project4'].commit('master')),
391 'org/project5': str(upstream['org/project5'].commit('master')),
392 'org/project6': str(upstream['org/project6'].commit('master')),
393 },
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000394 ]
James E. Blairbce35e12014-08-21 14:31:17 -0700395
396 for number, build in enumerate(self.builds):
397 self.log.debug("Build parameters: %s", build.parameters)
James E. Blairbce35e12014-08-21 14:31:17 -0700398 cloner = zuul.lib.cloner.Cloner(
399 git_base_url=self.upstream_root,
400 projects=projects,
401 workspace=self.workspace_root,
James E. Blairbfd85fd2016-10-21 14:18:11 -0700402 zuul_project=build.parameters.get('ZUUL_PROJECT', None),
James E. Blairbce35e12014-08-21 14:31:17 -0700403 zuul_branch=build.parameters['ZUUL_BRANCH'],
404 zuul_ref=build.parameters['ZUUL_REF'],
405 zuul_url=self.git_root,
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000406 branch='master', # New branch for upgrade
407 )
James E. Blairbce35e12014-08-21 14:31:17 -0700408 cloner.execute()
409 work = self.getWorkspaceRepos(projects)
410 state = states[number]
411
412 for project in projects:
413 self.assertEquals(state[project],
414 str(work[project].commit('HEAD')),
415 'Project %s commit for build %s should '
416 'be correct on old side of upgrade' %
417 (project, number))
418 shutil.rmtree(self.workspace_root)
419
420 self.worker.hold_jobs_in_build = False
421 self.worker.release()
422 self.waitUntilSettled()
James E. Blairf0420222014-08-21 16:02:17 -0700423
424 def test_project_override(self):
425 self.worker.hold_jobs_in_build = True
426 projects = ['org/project1', 'org/project2', 'org/project3',
427 'org/project4', 'org/project5', 'org/project6']
428
429 self.create_branch('org/project3', 'stable/havana')
430 self.create_branch('org/project4', 'stable/havana')
431 self.create_branch('org/project6', 'stable/havana')
432 A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
433 B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
434 C = self.fake_gerrit.addFakeChange('org/project2', 'master', 'C')
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000435 D = self.fake_gerrit.addFakeChange('org/project3', 'stable/havana',
436 'D')
James E. Blairf0420222014-08-21 16:02:17 -0700437 A.addApproval('CRVW', 2)
438 B.addApproval('CRVW', 2)
439 C.addApproval('CRVW', 2)
440 D.addApproval('CRVW', 2)
441 self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
442 self.fake_gerrit.addEvent(B.addApproval('APRV', 1))
443 self.fake_gerrit.addEvent(C.addApproval('APRV', 1))
444 self.fake_gerrit.addEvent(D.addApproval('APRV', 1))
445
446 self.waitUntilSettled()
447
448 self.assertEquals(4, len(self.builds), "Four builds are running")
449
450 upstream = self.getUpstreamRepos(projects)
451 states = [
452 {'org/project1': self.builds[0].parameters['ZUUL_COMMIT'],
453 'org/project2': str(upstream['org/project2'].commit('master')),
454 'org/project3': str(upstream['org/project3'].commit('master')),
455 'org/project4': str(upstream['org/project4'].commit('master')),
456 'org/project5': str(upstream['org/project5'].commit('master')),
457 'org/project6': str(upstream['org/project6'].commit('master')),
458 },
459 {'org/project1': self.builds[1].parameters['ZUUL_COMMIT'],
460 'org/project2': str(upstream['org/project2'].commit('master')),
461 'org/project3': str(upstream['org/project3'].commit('master')),
462 'org/project4': str(upstream['org/project4'].commit('master')),
463 'org/project5': str(upstream['org/project5'].commit('master')),
464 'org/project6': str(upstream['org/project6'].commit('master')),
465 },
466 {'org/project1': self.builds[1].parameters['ZUUL_COMMIT'],
467 'org/project2': self.builds[2].parameters['ZUUL_COMMIT'],
468 'org/project3': str(upstream['org/project3'].commit('master')),
469 'org/project4': str(upstream['org/project4'].commit('master')),
470 'org/project5': str(upstream['org/project5'].commit('master')),
471 'org/project6': str(upstream['org/project6'].commit('master')),
472 },
473 {'org/project1': self.builds[1].parameters['ZUUL_COMMIT'],
474 'org/project2': self.builds[2].parameters['ZUUL_COMMIT'],
475 'org/project3': self.builds[3].parameters['ZUUL_COMMIT'],
476 'org/project4': str(upstream['org/project4'].commit('master')),
477 'org/project5': str(upstream['org/project5'].commit('master')),
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000478 'org/project6': str(upstream['org/project6'].commit(
479 'stable/havana')),
James E. Blairf0420222014-08-21 16:02:17 -0700480 },
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000481 ]
James E. Blairf0420222014-08-21 16:02:17 -0700482
483 for number, build in enumerate(self.builds):
484 self.log.debug("Build parameters: %s", build.parameters)
James E. Blairf0420222014-08-21 16:02:17 -0700485 cloner = zuul.lib.cloner.Cloner(
486 git_base_url=self.upstream_root,
487 projects=projects,
488 workspace=self.workspace_root,
James E. Blairbfd85fd2016-10-21 14:18:11 -0700489 zuul_project=build.parameters.get('ZUUL_PROJECT', None),
James E. Blairf0420222014-08-21 16:02:17 -0700490 zuul_branch=build.parameters['ZUUL_BRANCH'],
491 zuul_ref=build.parameters['ZUUL_REF'],
492 zuul_url=self.git_root,
493 project_branches={'org/project4': 'master'},
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000494 )
James E. Blairf0420222014-08-21 16:02:17 -0700495 cloner.execute()
496 work = self.getWorkspaceRepos(projects)
497 state = states[number]
498
499 for project in projects:
500 self.assertEquals(state[project],
501 str(work[project].commit('HEAD')),
502 'Project %s commit for build %s should '
503 'be correct' % (project, number))
504 shutil.rmtree(self.workspace_root)
505
506 self.worker.hold_jobs_in_build = False
507 self.worker.release()
508 self.waitUntilSettled()
James E. Blair217b10d2015-01-08 16:25:28 -0800509
510 def test_periodic(self):
511 self.worker.hold_jobs_in_build = True
512 self.create_branch('org/project', 'stable/havana')
513 self.config.set('zuul', 'layout_config',
514 'tests/fixtures/layout-timer.yaml')
515 self.sched.reconfigure(self.config)
516 self.registerJobs()
517
518 # The pipeline triggers every second, so we should have seen
519 # several by now.
520 time.sleep(5)
521 self.waitUntilSettled()
522
523 builds = self.builds[:]
524
525 self.worker.hold_jobs_in_build = False
526 # Stop queuing timer triggered jobs so that the assertions
527 # below don't race against more jobs being queued.
528 self.config.set('zuul', 'layout_config',
529 'tests/fixtures/layout-no-timer.yaml')
530 self.sched.reconfigure(self.config)
531 self.registerJobs()
532 self.worker.release()
533 self.waitUntilSettled()
534
535 projects = ['org/project']
536
537 self.assertEquals(2, len(builds), "Two builds are running")
538
539 upstream = self.getUpstreamRepos(projects)
540 states = [
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000541 {'org/project':
542 str(upstream['org/project'].commit('stable/havana')),
James E. Blair217b10d2015-01-08 16:25:28 -0800543 },
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000544 {'org/project':
545 str(upstream['org/project'].commit('stable/havana')),
James E. Blair217b10d2015-01-08 16:25:28 -0800546 },
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000547 ]
James E. Blair217b10d2015-01-08 16:25:28 -0800548
549 for number, build in enumerate(builds):
550 self.log.debug("Build parameters: %s", build.parameters)
551 cloner = zuul.lib.cloner.Cloner(
552 git_base_url=self.upstream_root,
553 projects=projects,
554 workspace=self.workspace_root,
James E. Blairbfd85fd2016-10-21 14:18:11 -0700555 zuul_project=build.parameters.get('ZUUL_PROJECT', None),
James E. Blair217b10d2015-01-08 16:25:28 -0800556 zuul_branch=build.parameters.get('ZUUL_BRANCH', None),
557 zuul_ref=build.parameters.get('ZUUL_REF', None),
558 zuul_url=self.git_root,
559 branch='stable/havana',
Joshua Hesketh29d99b72014-08-19 16:27:42 +1000560 )
James E. Blair217b10d2015-01-08 16:25:28 -0800561 cloner.execute()
562 work = self.getWorkspaceRepos(projects)
563 state = states[number]
564
565 for project in projects:
566 self.assertEquals(state[project],
567 str(work[project].commit('HEAD')),
568 'Project %s commit for build %s should '
569 'be correct' % (project, number))
570
571 shutil.rmtree(self.workspace_root)
572
573 self.worker.hold_jobs_in_build = False
574 self.worker.release()
575 self.waitUntilSettled()
Sachi King9f16d522016-03-16 12:20:45 +1100576
James E. Blairbfd85fd2016-10-21 14:18:11 -0700577 def test_periodic_update(self):
578 # Test that the merger correctly updates its local repository
579 # before running a periodic job.
580
581 # Prime the merger with the current state
582 A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
583 self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
584 self.waitUntilSettled()
585
586 # Merge a different change
587 B = self.fake_gerrit.addFakeChange('org/project', 'master', 'B')
588 B.setMerged()
589
590 # Start a periodic job
591 self.worker.hold_jobs_in_build = True
592 self.launcher.negative_function_cache_ttl = 0
593 self.config.set('zuul', 'layout_config',
594 'tests/fixtures/layout-timer.yaml')
595 self.sched.reconfigure(self.config)
596 self.registerJobs()
597
598 # The pipeline triggers every second, so we should have seen
599 # several by now.
600 time.sleep(5)
601 self.waitUntilSettled()
602
603 builds = self.builds[:]
604
605 self.worker.hold_jobs_in_build = False
606 # Stop queuing timer triggered jobs so that the assertions
607 # below don't race against more jobs being queued.
608 self.config.set('zuul', 'layout_config',
609 'tests/fixtures/layout-no-timer.yaml')
610 self.sched.reconfigure(self.config)
611 self.registerJobs()
612 self.worker.release()
613 self.waitUntilSettled()
614
615 projects = ['org/project']
616
617 self.assertEquals(2, len(builds), "Two builds are running")
618
619 upstream = self.getUpstreamRepos(projects)
620 self.assertEqual(upstream['org/project'].commit('master').hexsha,
621 B.patchsets[0]['revision'])
622 states = [
623 {'org/project':
624 str(upstream['org/project'].commit('master')),
625 },
626 {'org/project':
627 str(upstream['org/project'].commit('master')),
628 },
629 ]
630
631 for number, build in enumerate(builds):
632 self.log.debug("Build parameters: %s", build.parameters)
633 cloner = zuul.lib.cloner.Cloner(
634 git_base_url=self.upstream_root,
635 projects=projects,
636 workspace=self.workspace_root,
637 zuul_project=build.parameters.get('ZUUL_PROJECT', None),
638 zuul_branch=build.parameters.get('ZUUL_BRANCH', None),
639 zuul_ref=build.parameters.get('ZUUL_REF', None),
640 zuul_url=self.git_root,
641 )
642 cloner.execute()
643 work = self.getWorkspaceRepos(projects)
644 state = states[number]
645
646 for project in projects:
647 self.assertEquals(state[project],
648 str(work[project].commit('HEAD')),
649 'Project %s commit for build %s should '
650 'be correct' % (project, number))
651
652 shutil.rmtree(self.workspace_root)
653
654 self.worker.hold_jobs_in_build = False
655 self.worker.release()
656 self.waitUntilSettled()
657
Sachi King9f16d522016-03-16 12:20:45 +1100658 def test_post_checkout(self):
659 project = "org/project"
660 path = os.path.join(self.upstream_root, project)
661 repo = git.Repo(path)
662 repo.head.reference = repo.heads['master']
663 commits = []
664 for i in range(0, 3):
665 commits.append(self.create_commit(project))
666 newRev = commits[1]
667
668 cloner = zuul.lib.cloner.Cloner(
669 git_base_url=self.upstream_root,
670 projects=[project],
671 workspace=self.workspace_root,
James E. Blairbfd85fd2016-10-21 14:18:11 -0700672 zuul_project='org/project',
Sachi King9f16d522016-03-16 12:20:45 +1100673 zuul_branch=None,
674 zuul_ref='master',
675 zuul_url=self.git_root,
Sachi King9f16d522016-03-16 12:20:45 +1100676 zuul_newrev=newRev,
677 )
678 cloner.execute()
679 repos = self.getWorkspaceRepos([project])
680 cloned_sha = repos[project].rev_parse('HEAD').hexsha
681 self.assertEqual(newRev, cloned_sha)
682
683 def test_post_and_master_checkout(self):
684 project = "org/project1"
685 master_project = "org/project2"
686 path = os.path.join(self.upstream_root, project)
687 repo = git.Repo(path)
688 repo.head.reference = repo.heads['master']
689 commits = []
690 for i in range(0, 3):
691 commits.append(self.create_commit(project))
692 newRev = commits[1]
693
694 cloner = zuul.lib.cloner.Cloner(
695 git_base_url=self.upstream_root,
696 projects=[project, master_project],
697 workspace=self.workspace_root,
James E. Blairbfd85fd2016-10-21 14:18:11 -0700698 zuul_project='org/project1',
Sachi King9f16d522016-03-16 12:20:45 +1100699 zuul_branch=None,
700 zuul_ref='master',
701 zuul_url=self.git_root,
Sachi King9f16d522016-03-16 12:20:45 +1100702 zuul_newrev=newRev
703 )
704 cloner.execute()
705 repos = self.getWorkspaceRepos([project, master_project])
706 cloned_sha = repos[project].rev_parse('HEAD').hexsha
707 self.assertEqual(newRev, cloned_sha)
708 self.assertEqual(
709 repos[master_project].rev_parse('HEAD').hexsha,
710 repos[master_project].rev_parse('master').hexsha)