def test_execute(self): build = self.create_build(self.create_project()) job = self.create_job(build) buildstep = self.get_buildstep() buildstep.execute(job) step = job.phases[0].steps[0] assert step.data['release'] == DEFAULT_RELEASE assert step.status == Status.pending_allocation commands = step.commands assert len(commands) == 2 assert commands[0].script == 'echo "hello world 2"' assert commands[0].cwd == '/usr/test/1' assert commands[0].type == CommandType.setup assert tuple(commands[0].artifacts) == ('artifact1.txt', 'artifact2.txt') assert commands[0].env['PATH'] == '/usr/test/1' for k, v in DEFAULT_ENV.items(): if k != 'PATH': assert commands[0].env[k] == v assert commands[1].script == 'echo "hello world 1"' assert commands[1].cwd == DEFAULT_PATH assert commands[1].type == CommandType.default assert tuple(commands[1].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[1].env == DEFAULT_ENV
def test_create_replacement_jobstep(self): build = self.create_build(self.create_project()) job = self.create_job(build) buildstep = self.get_buildstep(cluster='foo') buildstep.execute(job) oldstep = job.phases[0].steps[0] oldstep.result = Result.infra_failed oldstep.status = Status.finished oldstep.node = self.create_node(label='ip-127-0-0-1') db.session.add(oldstep) db.session.commit() step = buildstep.create_replacement_jobstep(oldstep) # new jobstep should still be part of same job/phase assert step.job == job assert step.phase == oldstep.phase # make sure .steps actually includes the new jobstep assert len(oldstep.phase.steps) == 2 # make sure replacement id is correctly set assert oldstep.replacement_id == step.id assert step.data['avoid_node'] == 'ip-127-0-0-1' # we want the retried jobstep to have the exact same attributes the # original jobstep would be expected to after execute() assert step.data['release'] == DEFAULT_RELEASE assert step.status == Status.pending_allocation assert step.cluster == 'foo' commands = step.commands assert len(commands) == 3 # skip blacklist removal command idx = 1 assert commands[idx].script == 'echo "hello world 2"' assert commands[idx].cwd == '/usr/test/1' assert commands[idx].type == CommandType.setup assert tuple(commands[idx].artifacts) == ('artifact1.txt', 'artifact2.txt') assert commands[idx].env['PATH'] == '/usr/test/1' for k, v in DEFAULT_ENV.items(): if k != 'PATH': assert commands[idx].env[k] == v idx += 1 assert commands[idx].script == 'echo "hello world 1"' assert commands[idx].cwd == DEFAULT_PATH assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV
def test_execute(self): build = self.create_build(self.create_project(name='foo'), label='buildlabel') job = self.create_job(build) buildstep = self.get_buildstep(cluster='foo', repo_path='source', path='tests') buildstep.execute(job) assert job.phases[0].label == 'buildlabel' step = job.phases[0].steps[0] assert step.data['release'] == 'trusty' assert step.status == Status.pending_allocation assert step.cluster == 'foo' assert step.label == 'buildlabel' commands = step.commands assert len(commands) == 3 idx = 0 # blacklist remove command assert commands[ idx].script == '/var/changes/input/blacklist-remove "foo.yaml"' assert commands[idx].cwd == 'source' assert commands[idx].type == CommandType.infra_setup assert commands[idx].artifacts == [] assert commands[idx].env == DEFAULT_ENV assert commands[idx].order == idx idx += 1 assert commands[idx].script == 'echo "hello world 2"' assert commands[idx].cwd == '/usr/test/1' assert commands[idx].type == CommandType.setup assert tuple(commands[idx].artifacts) == ('artifact1.txt', 'artifact2.txt') assert commands[idx].env['PATH'] == '/usr/test/1' for k, v in DEFAULT_ENV.items(): if k != 'PATH': assert commands[idx].env[k] == v idx += 1 assert commands[idx].script == 'echo "hello world 1"' assert commands[idx].cwd == 'source/tests' assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV
def test_execute(self): build = self.create_build(self.create_project(name='foo'), label='buildlabel') job = self.create_job(build) buildstep = self.get_buildstep(cluster='foo', repo_path='source', path='tests') buildstep.execute(job) assert job.phases[0].label == 'buildlabel' step = job.phases[0].steps[0] assert step.data['release'] == DEFAULT_RELEASE assert step.status == Status.pending_allocation assert step.cluster == 'foo' assert step.label == 'buildlabel' commands = step.commands assert len(commands) == 3 idx = 0 # blacklist remove command assert commands[idx].script == 'blacklist-remove "foo.yaml"' assert commands[idx].cwd == 'source' assert commands[idx].type == CommandType.infra_setup assert commands[idx].artifacts == [] assert commands[idx].env == DEFAULT_ENV assert commands[idx].order == idx idx += 1 assert commands[idx].script == 'echo "hello world 2"' assert commands[idx].cwd == '/usr/test/1' assert commands[idx].type == CommandType.setup assert tuple(commands[idx].artifacts) == ('artifact1.txt', 'artifact2.txt') assert commands[idx].env['PATH'] == '/usr/test/1' for k, v in DEFAULT_ENV.items(): if k != 'PATH': assert commands[idx].env[k] == v idx += 1 assert commands[idx].script == 'echo "hello world 1"' assert commands[idx].cwd == 'source/tests' assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV
def test_create_replacement_jobstep_expanded(self, get_vcs): build = self.create_build(self.create_project()) job = self.create_job(build) jobphase = self.create_jobphase(job, label='foo') jobstep = self.create_jobstep(jobphase) new_jobphase = self.create_jobphase(job, label='bar') vcs = mock.Mock(spec=Vcs) vcs.get_buildstep_clone.return_value = 'git clone https://example.com' get_vcs.return_value = vcs future_jobstep = FutureJobStep( label='test', commands=[ FutureCommand('echo 1'), FutureCommand('echo "foo"\necho "bar"', path='subdir'), ], data={'weight': 1, 'forceInfraFailure': True, 'targets': ['//A:test', '//B:test']}, ) buildstep = self.get_buildstep(cluster='foo') fail_jobstep = buildstep.create_expanded_jobstep( jobstep, new_jobphase, future_jobstep) fail_jobstep.result = Result.infra_failed fail_jobstep.status = Status.finished fail_jobstep.node = self.create_node(label='ip-127-0-0-1') db.session.add(fail_jobstep) db.session.commit() new_jobstep = buildstep.create_replacement_jobstep(fail_jobstep) # new jobstep should still be part of same job/phase assert new_jobstep.job == job assert new_jobstep.phase == fail_jobstep.phase # make sure .steps actually includes the new jobstep assert len(fail_jobstep.phase.steps) == 2 # make sure replacement id is correctly set assert fail_jobstep.replacement_id == new_jobstep.id assert new_jobstep.data['avoid_node'] == 'ip-127-0-0-1' # make sure targets are copied over assert len(new_jobstep.targets) == 2 assert set([t.name for t in new_jobstep.targets]) == set(['//A:test', '//B:test']) # we want the replacement jobstep to have the same attributes the # original jobstep would be expected to after expand_jobstep() assert new_jobstep.data['expanded'] is True assert new_jobstep.data['weight'] == 1 assert new_jobstep.cluster == 'foo' # make sure non-whitelisted attributes aren't copied over assert 'forceInfraFailure' not in new_jobstep.data commands = new_jobstep.commands assert len(commands) == 5 idx = 0 assert commands[idx].script == 'git clone https://example.com' assert commands[idx].cwd == '' assert commands[idx].type == CommandType.infra_setup assert commands[idx].artifacts == [] assert commands[idx].env == DEFAULT_ENV assert commands[idx].order == idx # skip blacklist removal command idx += 1 idx += 1 assert commands[idx].script == 'echo "hello world 2"' assert commands[idx].cwd == '/usr/test/1' assert commands[idx].type == CommandType.setup assert tuple(commands[idx].artifacts) == ('artifact1.txt', 'artifact2.txt') assert commands[idx].env['PATH'] == '/usr/test/1' for k, v in DEFAULT_ENV.items(): if k != 'PATH': assert commands[idx].env[k] == v assert commands[idx].order == idx idx += 1 assert commands[idx].label == 'echo 1' assert commands[idx].script == 'echo 1' assert commands[idx].order == idx assert commands[idx].cwd == DEFAULT_PATH assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV idx += 1 assert commands[idx].label == 'echo "foo"' assert commands[idx].script == 'echo "foo"\necho "bar"' assert commands[idx].order == idx assert commands[idx].cwd == './source/subdir' assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV
def test_create_expanded_jobstep(self, get_vcs): build = self.create_build(self.create_project()) job = self.create_job(build) jobphase = self.create_jobphase(job, label='foo') jobstep = self.create_jobstep(jobphase) new_jobphase = self.create_jobphase(job, label='bar') vcs = mock.Mock(spec=Vcs) vcs.get_buildstep_clone.return_value = 'git clone https://example.com' get_vcs.return_value = vcs future_jobstep = FutureJobStep( label='test', commands=[ FutureCommand('echo 1'), FutureCommand('echo "foo"\necho "bar"', path='subdir'), ], ) buildstep = self.get_buildstep(cluster='foo') with mock.patch.object(buildstep, '_create_targets_for_jobstep') as mock_create_targets: new_jobstep = buildstep.create_expanded_jobstep( jobstep, new_jobphase, future_jobstep) mock_create_targets.assert_called_once_with(new_jobstep) db.session.flush() assert new_jobstep.data['expanded'] is True assert new_jobstep.cluster == 'foo' commands = new_jobstep.commands assert len(commands) == 5 idx = 0 assert commands[idx].script == 'git clone https://example.com' assert commands[idx].cwd == '' assert commands[idx].type == CommandType.infra_setup assert commands[idx].artifacts == [] assert commands[idx].env == DEFAULT_ENV assert commands[idx].order == idx # skip blacklist removal command idx += 1 idx += 1 assert commands[idx].script == 'echo "hello world 2"' assert commands[idx].cwd == '/usr/test/1' assert commands[idx].type == CommandType.setup assert tuple(commands[idx].artifacts) == ('artifact1.txt', 'artifact2.txt') assert commands[idx].env['PATH'] == '/usr/test/1' for k, v in DEFAULT_ENV.items(): if k != 'PATH': assert commands[idx].env[k] == v assert commands[idx].order == idx idx += 1 assert commands[idx].label == 'echo 1' assert commands[idx].script == 'echo 1' assert commands[idx].order == idx assert commands[idx].cwd == DEFAULT_PATH assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV idx += 1 assert commands[idx].label == 'echo "foo"' assert commands[idx].script == 'echo "foo"\necho "bar"' assert commands[idx].order == idx assert commands[idx].cwd == './source/subdir' assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV
def test_create_replacement_jobstep_expanded(self, get_vcs): build = self.create_build(self.create_project()) job = self.create_job(build) jobphase = self.create_jobphase(job, label='foo') jobstep = self.create_jobstep(jobphase) new_jobphase = self.create_jobphase(job, label='bar') vcs = mock.Mock(spec=Vcs) vcs.get_buildstep_clone.return_value = 'git clone https://example.com' get_vcs.return_value = vcs future_jobstep = FutureJobStep( label='test', commands=[ FutureCommand('echo 1'), FutureCommand('echo "foo"\necho "bar"', path='subdir'), ], data={ 'weight': 1, 'forceInfraFailure': True, 'targets': ['//A:test', '//B:test'] }, ) buildstep = self.get_buildstep(cluster='foo') fail_jobstep = buildstep.create_expanded_jobstep( jobstep, new_jobphase, future_jobstep) fail_jobstep.result = Result.infra_failed fail_jobstep.status = Status.finished fail_jobstep.node = self.create_node(label='ip-127-0-0-1') db.session.add(fail_jobstep) db.session.commit() new_jobstep = buildstep.create_replacement_jobstep(fail_jobstep) # new jobstep should still be part of same job/phase assert new_jobstep.job == job assert new_jobstep.phase == fail_jobstep.phase # make sure .steps actually includes the new jobstep assert len(fail_jobstep.phase.steps) == 2 # make sure replacement id is correctly set assert fail_jobstep.replacement_id == new_jobstep.id assert new_jobstep.data['avoid_node'] == 'ip-127-0-0-1' # make sure targets are copied over assert len(new_jobstep.targets) == 2 assert set([t.name for t in new_jobstep.targets ]) == set(['//A:test', '//B:test']) # we want the replacement jobstep to have the same attributes the # original jobstep would be expected to after expand_jobstep() assert new_jobstep.data['expanded'] is True assert new_jobstep.data['weight'] == 1 assert new_jobstep.cluster == 'foo' # make sure non-whitelisted attributes aren't copied over assert 'forceInfraFailure' not in new_jobstep.data commands = new_jobstep.commands assert len(commands) == 5 idx = 0 assert commands[idx].script == 'git clone https://example.com' assert commands[idx].cwd == '' assert commands[idx].type == CommandType.infra_setup assert commands[idx].artifacts == [] assert commands[idx].env == DEFAULT_ENV assert commands[idx].order == idx # skip blacklist removal command idx += 1 idx += 1 assert commands[idx].script == 'echo "hello world 2"' assert commands[idx].cwd == '/usr/test/1' assert commands[idx].type == CommandType.setup assert tuple(commands[idx].artifacts) == ('artifact1.txt', 'artifact2.txt') assert commands[idx].env['PATH'] == '/usr/test/1' for k, v in DEFAULT_ENV.items(): if k != 'PATH': assert commands[idx].env[k] == v assert commands[idx].order == idx idx += 1 assert commands[idx].label == 'echo 1' assert commands[idx].script == 'echo 1' assert commands[idx].order == idx assert commands[idx].cwd == DEFAULT_PATH assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV idx += 1 assert commands[idx].label == 'echo "foo"' assert commands[idx].script == 'echo "foo"\necho "bar"' assert commands[idx].order == idx assert commands[idx].cwd == './source/subdir' assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV
def test_create_expanded_jobstep(self, get_vcs): build = self.create_build(self.create_project()) job = self.create_job(build) jobphase = self.create_jobphase(job, label='foo') jobstep = self.create_jobstep(jobphase) new_jobphase = self.create_jobphase(job, label='bar') vcs = mock.Mock(spec=Vcs) vcs.get_buildstep_clone.return_value = 'git clone https://example.com' get_vcs.return_value = vcs future_jobstep = FutureJobStep( label='test', commands=[ FutureCommand('echo 1'), FutureCommand('echo "foo"\necho "bar"', path='subdir'), ], ) buildstep = self.get_buildstep(cluster='foo') with mock.patch.object( buildstep, '_create_targets_for_jobstep') as mock_create_targets: new_jobstep = buildstep.create_expanded_jobstep( jobstep, new_jobphase, future_jobstep) mock_create_targets.assert_called_once_with(new_jobstep) db.session.flush() assert new_jobstep.data['expanded'] is True assert new_jobstep.cluster == 'foo' commands = new_jobstep.commands assert len(commands) == 5 idx = 0 assert commands[idx].script == 'git clone https://example.com' assert commands[idx].cwd == '' assert commands[idx].type == CommandType.infra_setup assert commands[idx].artifacts == [] assert commands[idx].env == DEFAULT_ENV assert commands[idx].order == idx # skip blacklist removal command idx += 1 idx += 1 assert commands[idx].script == 'echo "hello world 2"' assert commands[idx].cwd == '/usr/test/1' assert commands[idx].type == CommandType.setup assert tuple(commands[idx].artifacts) == ('artifact1.txt', 'artifact2.txt') assert commands[idx].env['PATH'] == '/usr/test/1' for k, v in DEFAULT_ENV.items(): if k != 'PATH': assert commands[idx].env[k] == v assert commands[idx].order == idx idx += 1 assert commands[idx].label == 'echo 1' assert commands[idx].script == 'echo 1' assert commands[idx].order == idx assert commands[idx].cwd == DEFAULT_PATH assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV idx += 1 assert commands[idx].label == 'echo "foo"' assert commands[idx].script == 'echo "foo"\necho "bar"' assert commands[idx].order == idx assert commands[idx].cwd == './source/subdir' assert commands[idx].type == CommandType.default assert tuple(commands[idx].artifacts) == tuple(DEFAULT_ARTIFACTS) assert commands[idx].env == DEFAULT_ENV