Details
Details
Tests pass. Ran locally, works for me.
Diff Detail
Diff Detail
- Repository
- rTRGR taskotron-trigger
- Lint
Lint Skipped - Unit
Unit Tests Skipped
Tests pass. Ran locally, works for me.
Lint Skipped |
Unit Tests Skipped |
Path | Packages | |||
---|---|---|---|---|
M | conf/trigger.cfg.example (2 lines) | |||
M | jobtriggers/config.py (2 lines) | |||
M | jobtriggers/koji_build_msg.py (23 lines) | |||
M | jobtriggers/koji_tag_msg.py (13 lines) | |||
M | jobtriggers/utils.py (18 lines) | |||
M | testing/test_koji_build_trigger.py (2 lines) | |||
M | testing/test_koji_tag_trigger.py (16 lines) | |||
M | testing/test_utils.py (19 lines) |
Commit | Tree | Parents | Author | Summary | Date |
---|---|---|---|---|---|
cd6e74c62753 | 5fab708e28d9 | a2fb580212b6 | Martin Krizek | Remove querying koji for rpm's arches. (Show More…) | Sep 30 2014, 2:18 PM |
1 | [buildbot] | 1 | [buildbot] | ||
---|---|---|---|---|---|
2 | url = http://localhost:8080/buildbot/change_hook | 2 | url = http://localhost:8080/buildbot/change_hook | ||
3 | 3 | | |||
4 | [trigger] | 4 | [trigger] | ||
5 | koji_build_completed_tasks = rpmlint | 5 | koji_build_completed_tasks = rpmlint | ||
6 | koji_tag_changed_tasks = upgradepath,depcheck | 6 | koji_tag_changed_tasks = upgradepath,depcheck | ||
7 | valid_arches = i386,i686,x86_64,noarch | 7 | valid_arches = x86_64 | ||
8 | koji_url = http://koji.fedoraproject.org/kojihub | 8 | koji_url = http://koji.fedoraproject.org/kojihub | ||
9 | type = StreamTrigger | 9 | type = StreamTrigger | ||
10 | blacklist_releases = el5,el6,el7 | 10 | blacklist_releases = el5,el6,el7 | ||
11 | job_logging = False | 11 | job_logging = False | ||
12 | joblog_file = /var/log/taskotron-trigger/jobs.csv | 12 | joblog_file = /var/log/taskotron-trigger/jobs.csv | ||
13 | fuse_delay = 1000 ; seconds | 13 | fuse_delay = 1000 ; seconds |
1 | import ConfigParser | 1 | import ConfigParser | ||
---|---|---|---|---|---|
2 | import io | 2 | import io | ||
3 | 3 | | |||
4 | defaults = """ | 4 | defaults = """ | ||
5 | [buildbot] | 5 | [buildbot] | ||
6 | url = http://localhost:8080/buildbot/change_hook | 6 | url = http://localhost:8080/buildbot/change_hook | ||
7 | 7 | | |||
8 | [trigger] | 8 | [trigger] | ||
9 | koji_build_completed_tasks = rpmlint | 9 | koji_build_completed_tasks = rpmlint | ||
10 | koji_tag_changed_tasks = upgradepath,depcheck | 10 | koji_tag_changed_tasks = upgradepath,depcheck | ||
11 | valid_arches = i386,i686,x86_64,noarch | 11 | valid_arches = x86_64 | ||
12 | koji_url = http://koji.fedoraproject.org/kojihub | 12 | koji_url = http://koji.fedoraproject.org/kojihub | ||
13 | type = StreamTrigger | 13 | type = StreamTrigger | ||
14 | blacklist_releases = el5,el6,el7 | 14 | blacklist_releases = el5,el6,el7 | ||
15 | job_logging = False | 15 | job_logging = False | ||
16 | joblog_file = /var/log/taskotron-trigger/jobs.cvs | 16 | joblog_file = /var/log/taskotron-trigger/jobs.cvs | ||
17 | fuse_delay = 1000 ; seconds | 17 | fuse_delay = 1000 ; seconds | ||
18 | """ | 18 | """ | ||
19 | 19 | | |||
Show All 16 Lines |
Show All 16 Lines | 10 | class KojiBuildCompletedJobTrigger(JobTrigger): | |||
---|---|---|---|---|---|
17 | 17 | | |||
18 | def consume(self, message): | 18 | def consume(self, message): | ||
19 | usable_message = fedmsg.encoding.loads(message.body) | 19 | usable_message = fedmsg.encoding.loads(message.body) | ||
20 | 20 | | |||
21 | release = usable_message['msg']['release'] | 21 | release = usable_message['msg']['release'] | ||
22 | state = usable_message['msg']['new'] | 22 | state = usable_message['msg']['new'] | ||
23 | instance = usable_message['msg']['instance'] | 23 | instance = usable_message['msg']['instance'] | ||
24 | 24 | | |||
25 | if not instance == 'primary': | | |||
26 | return | | |||
27 | | ||||
28 | # filter builds | | |||
29 | if state != koji.BUILD_STATES['COMPLETE'] or utils.blacklist_releases(release): | | |||
30 | return | | |||
31 | | ||||
32 | name = usable_message['msg']['name'] | 25 | name = usable_message['msg']['name'] | ||
33 | version = usable_message['msg']['version'] | 26 | version = usable_message['msg']['version'] | ||
34 | buildid = usable_message['msg']['build_id'] | 27 | buildid = usable_message['msg']['build_id'] | ||
35 | 28 | | |||
36 | envr = "%s-%s-%s" % (name, version, release) | 29 | envr = "%s-%s-%s" % (name, version, release) | ||
37 | 30 | | |||
38 | arches = utils.get_arches(buildid=buildid) | 31 | if not instance == 'primary': | ||
32 | self.log.debug('rejecting message not from primary koji instance (%s from %s)' % (envr, instance)) | ||||
33 | return | ||||
34 | | ||||
35 | if state != koji.BUILD_STATES['COMPLETE']: | ||||
36 | self.log.debug('rejecting message for not being a build complete message (%s, status %s)' % (envr, state)) | ||||
37 | return | ||||
38 | | ||||
39 | if utils.blacklist_releases(release): | ||||
40 | self.log.debug('rejecting message from blacklisted release (%s)' % envr) | ||||
41 | return | ||||
42 | | ||||
43 | self.log.debug('should be scheduling job for %s' % envr) | ||||
39 | 44 | | |||
40 | self.trigger_tasks(envr, ITEM_TYPE, config.koji_build_completed_tasks, arches) | 45 | self.trigger_tasks(envr, ITEM_TYPE, config.koji_build_completed_tasks, config.valid_arches) |
Show All 27 Lines | 14 | class KojiTagChangedJobTrigger(JobTrigger): | |||
---|---|---|---|---|---|
28 | def delayed_consume(self): | 28 | def delayed_consume(self): | ||
29 | if self.queued_tags: | 29 | if self.queued_tags: | ||
30 | try: | 30 | try: | ||
31 | for tag in self.queued_tags: | 31 | for tag in self.queued_tags: | ||
32 | # XXX ugly: do not schedule upgradepath for updates-testing-pending | 32 | # XXX ugly: do not schedule upgradepath for updates-testing-pending | ||
33 | tasks = deepcopy(config.koji_tag_changed_tasks) | 33 | tasks = deepcopy(config.koji_tag_changed_tasks) | ||
34 | if tag.endswith('testing-pending'): | 34 | if tag.endswith('testing-pending'): | ||
35 | tasks.remove('upgradepath') | 35 | tasks.remove('upgradepath') | ||
36 | # it is sufficient to run depcheck and upgradepath only on one arch | 36 | self.trigger_tasks(tag, ITEM_TYPE, tasks, config.valid_arches) | ||
37 | # XXX hardcoding X86_64 | | |||
38 | self.trigger_tasks(tag, ITEM_TYPE, tasks, ['x86_64']) | | |||
39 | finally: | 37 | finally: | ||
40 | self.queued_tags = set() | 38 | self.queued_tags = set() | ||
41 | else: | 39 | else: | ||
42 | self.log.debug("Woke up, but there were no messages.") | 40 | self.log.debug("Woke up, but there were no messages.") | ||
43 | 41 | | |||
44 | def consume(self, message): | 42 | def consume(self, message): | ||
45 | usable_message = fedmsg.encoding.loads(message.body) | 43 | usable_message = fedmsg.encoding.loads(message.body) | ||
46 | 44 | | |||
47 | koji_tag = usable_message['msg']['tag'] | 45 | koji_tag = usable_message['msg']['tag'] | ||
48 | release = usable_message['msg']['release'] | 46 | release = usable_message['msg']['release'] | ||
49 | instance = usable_message['msg']['instance'] | 47 | instance = usable_message['msg']['instance'] | ||
50 | 48 | | |||
51 | if not instance == 'primary': | 49 | if not instance == 'primary': | ||
50 | self.log.debug('rejecting message not from primary koji instance (%s from %s)' % (koji_tag, instance)) | ||||
52 | return | 51 | return | ||
53 | 52 | | |||
54 | # filter tags | 53 | if not koji_tag.endswith('pending'): | ||
55 | if not koji_tag.endswith('pending') or utils.blacklist_releases(release): | 54 | self.log.debug('rejecting message for not being a pending tag (%s)' % koji_tag) | ||
55 | return | ||||
56 | | ||||
57 | if utils.blacklist_releases(release): | ||||
58 | self.log.debug('rejecting message from blacklisted release (%s)' % koji_tag) | ||||
56 | return | 59 | return | ||
57 | 60 | | |||
58 | if not len(self.queued_tags): | 61 | if not len(self.queued_tags): | ||
59 | self.log.info('setting fuse (%d seconds) for koji_tag %s', config.fuse_delay, koji_tag) | 62 | self.log.info('setting fuse (%d seconds) for koji_tag %s', config.fuse_delay, koji_tag) | ||
60 | elif koji_tag not in self.queued_tags: | 63 | elif koji_tag not in self.queued_tags: | ||
61 | self.log.info('adding koji_tag %s to the fuse queue', koji_tag) | 64 | self.log.info('adding koji_tag %s to the fuse queue', koji_tag) | ||
62 | 65 | | |||
63 | self.queued_tags.add(koji_tag) | 66 | self.queued_tags.add(koji_tag) |
1 | import csv | 1 | import csv | ||
---|---|---|---|---|---|
2 | import datetime | 2 | import datetime | ||
3 | import koji | | |||
4 | 3 | | |||
5 | from . import config | 4 | from . import config | ||
6 | 5 | | |||
7 | koji_client = koji.ClientSession(config.koji_url) | | |||
8 | | ||||
9 | | ||||
10 | def get_arches(buildid=None, nvr=None): | | |||
11 | if buildid is None: | | |||
12 | info = koji_client.getBuild(nvr) | | |||
13 | buildid = info['id'] | | |||
14 | | ||||
15 | arches = set([rpm['arch'] for rpm in koji_client.listRPMs(buildid) if rpm['arch'] in config.valid_arches]) | | |||
16 | | ||||
17 | if 'i686' in arches: | | |||
18 | arches.remove('i686') | | |||
19 | arches.add('i386') | | |||
20 | | ||||
21 | return arches | | |||
22 | | ||||
23 | | ||||
24 | def log_job(logname, item, item_type, task, arch): | 6 | def log_job(logname, item, item_type, task, arch): | ||
25 | now = datetime.datetime.now() | 7 | now = datetime.datetime.now() | ||
26 | 8 | | |||
27 | with open(logname, 'a') as csvfile: | 9 | with open(logname, 'a') as csvfile: | ||
28 | writer = csv.writer(csvfile, delimiter=';') | 10 | writer = csv.writer(csvfile, delimiter=';') | ||
29 | writer.writerow([now, item, item_type, task, arch]) | 11 | writer.writerow([now, item, item_type, task, arch]) | ||
30 | 12 | | |||
31 | def blacklist_releases(release): | 13 | def blacklist_releases(release): | ||
32 | return any(b in release for b in config.blacklist_releases) | 14 | return any(b in release for b in config.blacklist_releases) |
Show All 22 Lines | 12 | def prepare(self, monkeypatch): | |||
---|---|---|---|---|---|
23 | self.ref_validarches = ['i386', 'x86_64'] | 23 | self.ref_validarches = ['i386', 'x86_64'] | ||
24 | self.ref_blacklist_releases= ['el5', 'el6'] | 24 | self.ref_blacklist_releases= ['el5', 'el6'] | ||
25 | 25 | | |||
26 | stub_hub = Bunch(config=Bunch(get=0)) | 26 | stub_hub = Bunch(config=Bunch(get=0)) | ||
27 | 27 | | |||
28 | self.helper = koji_build_msg.KojiBuildCompletedJobTrigger(stub_hub) | 28 | self.helper = koji_build_msg.KojiBuildCompletedJobTrigger(stub_hub) | ||
29 | self.helper.trigger = Dingus() | 29 | self.helper.trigger = Dingus() | ||
30 | 30 | | |||
31 | monkeypatch.setattr(koji_build_msg.utils, 'get_arches', lambda *a, **k: self.ref_validarches) | | |||
32 | | ||||
33 | koji_build_msg.config.koji_build_completed_tasks = self.ref_tasks | 31 | koji_build_msg.config.koji_build_completed_tasks = self.ref_tasks | ||
34 | koji_build_msg.config.valid_arches = self.ref_validarches | 32 | koji_build_msg.config.valid_arches = self.ref_validarches | ||
35 | koji_build_msg.config.blacklist_releases = self.ref_blacklist_releases | 33 | koji_build_msg.config.blacklist_releases = self.ref_blacklist_releases | ||
36 | koji_build_msg.config.job_logging = False | 34 | koji_build_msg.config.job_logging = False | ||
37 | 35 | | |||
38 | def _create_msg(self, ref_instance, ref_new, ref_name, ref_release, ref_version): | 36 | def _create_msg(self, ref_instance, ref_new, ref_name, ref_release, ref_version): | ||
39 | self.ref_message = Bunch(body='{"i": 1,\ | 37 | self.ref_message = Bunch(body='{"i": 1,\ | ||
40 | "msg": {"build_id": 221146,\ | 38 | "msg": {"build_id": 221146,\ | ||
▲ Show 20 Lines • Show All 51 Lines • Show Last 20 Lines |
Show All 11 Lines | 11 | def prepare(self, monkeypatch): | |||
---|---|---|---|---|---|
12 | self.ref_instance = 'primary' | 12 | self.ref_instance = 'primary' | ||
13 | self.ref_name = 'stage' | 13 | self.ref_name = 'stage' | ||
14 | self.ref_version = '4.1.1' | 14 | self.ref_version = '4.1.1' | ||
15 | self.ref_release = '3.fc18' | 15 | self.ref_release = '3.fc18' | ||
16 | self.ref_tag = 'f18-updates-pending' | 16 | self.ref_tag = 'f18-updates-pending' | ||
17 | self.ref_nvr = '%s-%s-%s' % (self.ref_name, self.ref_version, self.ref_release) | 17 | self.ref_nvr = '%s-%s-%s' % (self.ref_name, self.ref_version, self.ref_release) | ||
18 | 18 | | |||
19 | self.ref_tasks = ['depcheck', 'upgradepath'] | 19 | self.ref_tasks = ['depcheck', 'upgradepath'] | ||
20 | self.ref_arch = 'x86_64' | 20 | self.ref_validarches = ['i386', 'x86_64'] | ||
21 | self.ref_blacklist_releases= ['el5', 'el6'] | 21 | self.ref_blacklist_releases= ['el5', 'el6'] | ||
22 | 22 | | |||
23 | self._create_msg(self.ref_instance, self.ref_name, self.ref_release, self.ref_tag, self.ref_version) | 23 | self._create_msg(self.ref_instance, self.ref_name, self.ref_release, self.ref_tag, self.ref_version) | ||
24 | 24 | | |||
25 | stub_hub = Bunch(config=Bunch(get=0)) | 25 | stub_hub = Bunch(config=Bunch(get=0)) | ||
26 | self.helper = koji_tag_msg.KojiTagChangedJobTrigger(stub_hub) | 26 | self.helper = koji_tag_msg.KojiTagChangedJobTrigger(stub_hub) | ||
27 | 27 | | |||
28 | self.helper.trigger = Dingus() | 28 | self.helper.trigger = Dingus() | ||
29 | 29 | | |||
30 | koji_tag_msg.config.koji_tag_changed_tasks = self.ref_tasks | 30 | koji_tag_msg.config.koji_tag_changed_tasks = self.ref_tasks | ||
31 | koji_tag_msg.config.valid_arches = self.ref_validarches | ||||
31 | koji_tag_msg.config.job_logging = False | 32 | koji_tag_msg.config.job_logging = False | ||
32 | 33 | | |||
33 | def _create_msg(self, ref_instance, ref_name, ref_release, ref_tag, ref_version): | 34 | def _create_msg(self, ref_instance, ref_name, ref_release, ref_tag, ref_version): | ||
34 | self.ref_message = Bunch(body='{"i": 1,\ | 35 | self.ref_message = Bunch(body='{"i": 1,\ | ||
35 | "msg": {"build_id": 221146,\ | 36 | "msg": {"build_id": 221146,\ | ||
36 | "instance": "%s",\ | 37 | "instance": "%s",\ | ||
37 | "name": "%s",\ | 38 | "name": "%s",\ | ||
38 | "owner": "ralph",\ | 39 | "owner": "ralph",\ | ||
Show All 14 Lines | |||||
53 | 54 | | |||
54 | def test_delayed_consume(self): | 55 | def test_delayed_consume(self): | ||
55 | self.helper.queued_tags = [self.ref_tag] | 56 | self.helper.queued_tags = [self.ref_tag] | ||
56 | 57 | | |||
57 | self.helper.delayed_consume() | 58 | self.helper.delayed_consume() | ||
58 | 59 | | |||
59 | trigger_calls = self.helper.trigger.trigger_job.calls() | 60 | trigger_calls = self.helper.trigger.trigger_job.calls() | ||
60 | 61 | | |||
61 | assert len(trigger_calls) == 2 | 62 | assert len(trigger_calls) == 4 | ||
62 | 63 | | |||
63 | assert trigger_calls[0][1] == (self.ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_arch) | 64 | assert trigger_calls[0][1] == (self.ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_validarches[0]) | ||
64 | assert trigger_calls[1][1] == (self.ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[1], self.ref_arch) | 65 | assert trigger_calls[1][1] == (self.ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_validarches[1]) | ||
66 | assert trigger_calls[2][1] == (self.ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[1], self.ref_validarches[0]) | ||||
67 | assert trigger_calls[3][1] == (self.ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[1], self.ref_validarches[1]) | ||||
65 | 68 | | |||
66 | assert self.helper.queued_tags == set() | 69 | assert self.helper.queued_tags == set() | ||
67 | 70 | | |||
68 | def test_consume_not_primary_instance(self): | 71 | def test_consume_not_primary_instance(self): | ||
69 | ref_instance = 'ppc' | 72 | ref_instance = 'ppc' | ||
70 | self._create_msg(ref_instance, self.ref_name, self.ref_release, self.ref_tag, self.ref_version) | 73 | self._create_msg(ref_instance, self.ref_name, self.ref_release, self.ref_tag, self.ref_version) | ||
71 | 74 | | |||
72 | self.helper.consume(self.ref_message) | 75 | self.helper.consume(self.ref_message) | ||
Show All 12 Lines | |||||
85 | def test_delayed_consume_upgradepath(self): | 88 | def test_delayed_consume_upgradepath(self): | ||
86 | ref_tag = 'f18-updates-testing-pending' | 89 | ref_tag = 'f18-updates-testing-pending' | ||
87 | self.helper.queued_tags = [ref_tag] | 90 | self.helper.queued_tags = [ref_tag] | ||
88 | 91 | | |||
89 | self.helper.delayed_consume() | 92 | self.helper.delayed_consume() | ||
90 | 93 | | |||
91 | trigger_calls = self.helper.trigger.trigger_job.calls() | 94 | trigger_calls = self.helper.trigger.trigger_job.calls() | ||
92 | 95 | | |||
93 | assert len(trigger_calls) == 1 | 96 | assert len(trigger_calls) == 2 | ||
94 | 97 | | |||
95 | assert trigger_calls[0][1] == (ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_arch) | 98 | assert trigger_calls[0][1] == (ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_validarches[0]) | ||
99 | assert trigger_calls[1][1] == (ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_validarches[1]) | ||||
96 | 100 | | |||
97 | assert self.helper.queued_tags == set() | 101 | assert self.helper.queued_tags == set() | ||
98 | 102 | | |||
99 | def test_consume_blacklisted_release(self): | 103 | def test_consume_blacklisted_release(self): | ||
100 | ref_release = '3.el5.1' | 104 | ref_release = '3.el5.1' | ||
101 | self._create_msg(self.ref_instance, self.ref_name, ref_release, self.ref_tag, self.ref_version) | 105 | self._create_msg(self.ref_instance, self.ref_name, ref_release, self.ref_tag, self.ref_version) | ||
102 | 106 | | |||
103 | self.helper.consume(self.ref_message) | 107 | self.helper.consume(self.ref_message) | ||
104 | 108 | | |||
105 | assert self.helper.queued_tags == set([]) | 109 | assert self.helper.queued_tags == set([]) |
1 | from dingus import Dingus | 1 | from dingus import Dingus | ||
---|---|---|---|---|---|
2 | 2 | | |||
3 | from jobtriggers import utils, config | 3 | from jobtriggers import utils, config | ||
4 | 4 | | |||
5 | 5 | | |||
6 | class TestBodhiJobTrigger(): | 6 | class TestBodhiJobTrigger(): | ||
7 | def setup_method(self, method): | 7 | def setup_method(self, method): | ||
8 | self.ref_validarches = ['i386', 'x86_64'] | | |||
9 | self.ref_nvr = 'foo' | | |||
10 | self.ref_buildid = 1 | | |||
11 | self.ref_rpmarches = [{'arch': 'i386'}, {'arch': 'x86_64'}] | | |||
12 | self.ref_build = {'id': self.ref_buildid} | | |||
13 | self.ref_release = '3.el6' | 8 | self.ref_release = '3.el6' | ||
14 | 9 | | |||
15 | def test_get_arches_by_buildid(self, monkeypatch): | | |||
16 | monkeypatch.setattr(utils, 'koji_client', Dingus(listRPMs__returns=self.ref_rpmarches)) | | |||
17 | | ||||
18 | res = utils.get_arches(buildid=self.ref_buildid) | | |||
19 | | ||||
20 | assert res == set(self.ref_validarches) | | |||
21 | | ||||
22 | def test_get_arches_by_nvr(self, monkeypatch): | | |||
23 | monkeypatch.setattr(utils, 'koji_client', Dingus(listRPMs__returns=self.ref_rpmarches, getBuild__returns=self.ref_build)) | | |||
24 | | ||||
25 | res = utils.get_arches(nvr=self.ref_nvr) | | |||
26 | | ||||
27 | assert res == set(self.ref_validarches) | | |||
28 | | ||||
29 | def test_blacklist_releases_true(self): | 10 | def test_blacklist_releases_true(self): | ||
30 | config.blacklist_releases = ['el6', 'el7'] | 11 | config.blacklist_releases = ['el6', 'el7'] | ||
31 | res = utils.blacklist_releases(self.ref_release) | 12 | res = utils.blacklist_releases(self.ref_release) | ||
32 | 13 | | |||
33 | assert res | 14 | assert res | ||
34 | 15 | | |||
35 | def test_blacklist_releases_false(self): | 16 | def test_blacklist_releases_false(self): | ||
36 | config.blacklist_releases = ['fc20'] | 17 | config.blacklist_releases = ['fc20'] | ||
37 | res = utils.blacklist_releases(self.ref_release) | 18 | res = utils.blacklist_releases(self.ref_release) | ||
38 | 19 | | |||
39 | assert not res | 20 | assert not res |