Listen on correct fedmsgs so that rpmlint is triggered only on completed
build and depcheck/upgradepath on updates-(testing-)pending on x86_64.
Fixes: T278
| tflink |
Listen on correct fedmsgs so that rpmlint is triggered only on completed
build and depcheck/upgradepath on updates-(testing-)pending on x86_64.
Fixes: T278
Run fedmg-hub and tests amended. It works according to my testing.
| Lint Skipped |
| Unit Tests Skipped |
Looks good to me. Had some trouble getting it to work locally but it was all PEBKAC errors. If you've tested this locally and it worked, go ahead and push the code
| Path | Packages | |||
|---|---|---|---|---|
| M | conf/trigger.cfg.example (8 lines) | |||
| M | fedmsg.d/taskotron-trigger.py (4 lines) | |||
| M | jobtriggers/__init__.py (4 lines) | |||
| D | M | jobtriggers/bodhi_msg.py (74 lines) | ||
| M | jobtriggers/config.py (16 lines) | |||
| V | jobtriggers/{koji_build_msg.py ← koji_msg.py} (17 lines) | |||
| V | jobtriggers/{koji_msg.py → koji_build_msg.py} | |||
| A | M | jobtriggers/koji_tag_msg.py (52 lines) | ||
| M | setup.py (4 lines) | |||
| M | testing/functest_cli.py (8 lines) | |||
| D | M | testing/test_bodhi_trigger.py (117 lines) | ||
| A | M | testing/test_koji_build_trigger.py (79 lines) | ||
| V | testing/{test_koji_tag_trigger.py ← test_koji_trigger.py} (58 lines) | |||
| V | testing/{test_koji_trigger.py → test_koji_tag_trigger.py} |
| Commit | Tree | Parents | Author | Summary | Date |
|---|---|---|---|---|---|
| cb3484d97fce | 3eb65df3c30f | 6f7feb774272 | Martin Krizek | Fix tasks triggering (Show More…) | Jul 9 2014, 2:08 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_tasks = rpmlint | 5 | koji_build_completed_tasks = rpmlint | ||
| 6 | bodhi_to_koji_tag_tasks = upgradepath,depcheck | 6 | koji_tag_changed_tasks = upgradepath,depcheck | ||
| 7 | bodhi_tasks = examplebodhi | | |||
| 8 | valid_arches = i386,i686,x86_64,noarch | 7 | valid_arches = i386,i686,x86_64,noarch | ||
| 9 | koji_url = http://koji.fedoraproject.org/kojihub | 8 | koji_url = http://koji.fedoraproject.org/kojihub | ||
| 10 | type = StreamTrigger | 9 | type = StreamTrigger | ||
| 11 | blacklist_releases = el5,el6 | 10 | blacklist_releases = el5,el6,el7 | ||
| 12 | job_logging = False | 11 | job_logging = False | ||
| 13 | joblog_file = /var/log/taskotron-trigger/jobs.csv | 12 | joblog_file = /var/log/taskotron-trigger/jobs.csv | ||
| 14 | fuse_delay = 1000 ; seconds | 13 | fuse_delay = 1000 ; seconds | ||
| 15 | x86_64_only = depcheck | | |||
| 1 | config = { | 1 | config = { | ||
|---|---|---|---|---|---|
| 2 | 'taskotron.kojijobtrigger.enabled': True, | 2 | 'taskotron.kojitagchangedjobtrigger.enabled': True, | ||
| 3 | 'taskotron.bodhijobtrigger.enabled': True, | 3 | 'taskotron.kojibuildcompletedjobtrigger.enabled': True, | ||
| 4 | } | 4 | } | ||
| 1 | import fedmsg.consumers | 1 | import fedmsg.consumers | ||
|---|---|---|---|---|---|
| 2 | 2 | | |||
| 3 | from . import config, triggers, utils | 3 | from . import config, triggers, utils | ||
| 4 | 4 | | |||
| 5 | class JobTrigger(fedmsg.consumers.FedmsgConsumer): | 5 | class JobTrigger(fedmsg.consumers.FedmsgConsumer): | ||
| 6 | def __init__(self, *args, **kw): | 6 | def __init__(self, *args, **kw): | ||
| 7 | super(JobTrigger, self).__init__(*args, **kw) | 7 | super(JobTrigger, self).__init__(*args, **kw) | ||
| 8 | self.trigger = triggers.get_trigger(config.trigger_type) | 8 | self.trigger = triggers.get_trigger(config.trigger_type) | ||
| 9 | 9 | | |||
| 10 | def trigger_tasks(self, item, item_type, tasks, arches): | 10 | def trigger_tasks(self, item, item_type, tasks, arches): | ||
| 11 | for task in tasks: | 11 | for task in tasks: | ||
| 12 | for arch in arches: | 12 | for arch in arches: | ||
| 13 | # XXX hack T256 | | |||
| 14 | if task in config.x86_64_only and arch != "x86_64": | | |||
| 15 | continue | | |||
| 16 | | ||||
| 17 | self.log.info('triggering %s for %s on %s', task, item, arch) | 13 | self.log.info('triggering %s for %s on %s', task, item, arch) | ||
| 18 | 14 | | |||
| 19 | if config.job_logging: | 15 | if config.job_logging: | ||
| 20 | try: | 16 | try: | ||
| 21 | utils.log_job(config.joblog_file, item, item_type, task, arch) | 17 | utils.log_job(config.joblog_file, item, item_type, task, arch) | ||
| 22 | except IOError, e: | 18 | except IOError, e: | ||
| 23 | self.log.warning('Cannot log a job into %s', config.joblog_file) | 19 | self.log.warning('Cannot log a job into %s', config.joblog_file) | ||
| 24 | 20 | | |||
| 25 | output = self.trigger.trigger_job(item, item_type, task, arch) | 21 | output = self.trigger.trigger_job(item, item_type, task, arch) | ||
| 26 | for line in output: | 22 | for line in output: | ||
| 27 | self.log.info(line) | 23 | self.log.info(line) | ||
| 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_tasks = rpmlint | 9 | koji_build_completed_tasks = rpmlint | ||
| 10 | bodhi_to_koji_tag_tasks = upgradepath,depcheck | 10 | koji_tag_changed_tasks = upgradepath,depcheck | ||
| 11 | bodhi_tasks = examplebodhi | | |||
| 12 | valid_arches = i386,i686,x86_64,noarch | 11 | valid_arches = i386,i686,x86_64,noarch | ||
| 13 | koji_url = http://koji.fedoraproject.org/kojihub | 12 | koji_url = http://koji.fedoraproject.org/kojihub | ||
| 14 | type = StreamTrigger | 13 | type = StreamTrigger | ||
| 15 | blacklist_releases = el5,el6 | 14 | blacklist_releases = el5,el6,el7 | ||
| 16 | job_logging = False | 15 | job_logging = False | ||
| 17 | joblog_file = /var/log/taskotron-trigger/jobs.cvs | 16 | joblog_file = /var/log/taskotron-trigger/jobs.cvs | ||
| 18 | fuse_delay = 1000 ; seconds | 17 | fuse_delay = 1000 ; seconds | ||
| 19 | x86_64_only = depcheck | | |||
| 20 | """ | 18 | """ | ||
| 21 | 19 | | |||
| 22 | config = ConfigParser.ConfigParser() | 20 | config = ConfigParser.ConfigParser() | ||
| 23 | config.readfp(io.BytesIO(defaults)) | 21 | config.readfp(io.BytesIO(defaults)) | ||
| 24 | config.read(['/etc/taskotron/trigger.cfg', './conf/trigger.cfg']) | 22 | config.read(['/etc/taskotron/trigger.cfg', './conf/trigger.cfg']) | ||
| 25 | 23 | | |||
| 26 | 24 | | |||
| 27 | buildbot_username = config.get('buildbot', 'username') | | |||
| 28 | buildbot_password = config.get('buildbot', 'password') | | |||
| 29 | buildbot_url = config.get('buildbot', 'url') | 25 | buildbot_url = config.get('buildbot', 'url') | ||
| 30 | 26 | | |||
| 31 | koji_tasks = [e.strip() for e in config.get('trigger', 'koji_tasks').split(',')] | 27 | koji_build_completed_tasks = [e.strip() for e in config.get('trigger', 'koji_build_completed_tasks').split(',')] | ||
| 32 | bodhi_to_koji_tag_tasks = [e.strip() for e in config.get('trigger', 'bodhi_to_koji_tag_tasks').split(',')] | 28 | koji_tag_changed_tasks = [e.strip() for e in config.get('trigger', 'koji_tag_changed_tasks').split(',')] | ||
| 33 | bodhi_tasks = [e.strip() for e in config.get('trigger', 'bodhi_tasks').split(',')] | | |||
| 34 | valid_arches = [e.strip() for e in config.get('trigger', 'valid_arches').split(',')] | 29 | valid_arches = [e.strip() for e in config.get('trigger', 'valid_arches').split(',')] | ||
| 35 | koji_url = config.get('trigger', 'koji_url') | 30 | koji_url = config.get('trigger', 'koji_url') | ||
| 36 | trigger_type = config.get('trigger', 'type') | 31 | trigger_type = config.get('trigger', 'type') | ||
| 37 | blacklist_releases = [e.strip() for e in config.get('trigger', 'blacklist_releases').split(',')] | 32 | blacklist_releases = [e.strip() for e in config.get('trigger', 'blacklist_releases').split(',')] | ||
| 38 | job_logging = True if config.get('trigger', 'job_logging') == 'True' else False | 33 | job_logging = True if config.get('trigger', 'job_logging') == 'True' else False | ||
| 39 | joblog_file = config.get('trigger', 'joblog_file') | 34 | joblog_file = config.get('trigger', 'joblog_file') | ||
| 40 | fuse_delay = int(config.get('trigger', 'fuse_delay')) # seconds | 35 | fuse_delay = int(config.get('trigger', 'fuse_delay')) # seconds | ||
| 41 | x86_64_only = [e.strip() for e in config.get('trigger', 'x86_64_only').split(',')] | | |||
| 1 | import koji | ||||
|---|---|---|---|---|---|
| 1 | import fedmsg | 2 | import fedmsg | ||
| 2 | import fedmsg.encoding | 3 | import fedmsg.encoding | ||
| 3 | 4 | | |||
| 4 | from . import utils, config | 5 | from . import utils, config | ||
| 5 | from . import JobTrigger | 6 | from . import JobTrigger | ||
| 6 | 7 | | |||
| 7 | ITEM_TYPE = 'koji_build' | 8 | ITEM_TYPE = 'koji_build' | ||
| 8 | 9 | | |||
| 9 | class KojiJobTrigger(JobTrigger): | 10 | class KojiBuildCompletedJobTrigger(JobTrigger): | ||
| 10 | topic = "org.fedoraproject.prod.buildsys.tag" | 11 | topic = "org.fedoraproject.prod.buildsys.build.state.change" | ||
| 11 | jsonify = False | 12 | jsonify = False | ||
| 12 | config_key = 'taskotron.kojijobtrigger.enabled' | 13 | config_key = 'taskotron.kojibuildcompletedjobtrigger.enabled' | ||
| 13 | 14 | | |||
| 14 | def __init__(self, *args, **kw): | 15 | def __init__(self, *args, **kw): | ||
| 15 | super(KojiJobTrigger, self).__init__(*args, **kw) | 16 | super(KojiBuildCompletedJobTrigger, self).__init__(*args, **kw) | ||
| 16 | 17 | | |||
| 17 | def consume(self, message): | 18 | def consume(self, message): | ||
| 18 | usable_message = fedmsg.encoding.loads(message.body) | 19 | usable_message = fedmsg.encoding.loads(message.body) | ||
| 19 | 20 | | |||
| 20 | tag = usable_message['msg']['tag'] | | |||
| 21 | release = usable_message['msg']['release'] | 21 | release = usable_message['msg']['release'] | ||
| 22 | state = usable_message['msg']['new'] | ||||
| 22 | 23 | | |||
| 23 | # we look only for pending builds | 24 | # we only look for successfuly completed builds | ||
| 24 | if not tag.endswith('pending'): | 25 | if state != koji.BUILD_STATES['COMPLETE']: | ||
| 25 | return | 26 | return | ||
| 26 | 27 | | |||
| 27 | # do not schledule jobs for blacklisted releases | 28 | # do not schledule jobs for blacklisted releases | ||
| 28 | if release.endswith(tuple(config.blacklist_releases)): | 29 | if release.endswith(tuple(config.blacklist_releases)): | ||
| 29 | return | 30 | return | ||
| 30 | 31 | | |||
| 31 | name = usable_message['msg']['name'] | 32 | name = usable_message['msg']['name'] | ||
| 32 | version = usable_message['msg']['version'] | 33 | version = usable_message['msg']['version'] | ||
| 33 | buildid = usable_message['msg']['build_id'] | 34 | buildid = usable_message['msg']['build_id'] | ||
| 34 | 35 | | |||
| 35 | envr = "%s-%s-%s" % (name, version, release) | 36 | envr = "%s-%s-%s" % (name, version, release) | ||
| 36 | 37 | | |||
| 37 | arches = utils.get_arches(buildid=buildid) | 38 | arches = utils.get_arches(buildid=buildid) | ||
| 38 | 39 | | |||
| 39 | self.trigger_tasks(envr, ITEM_TYPE, config.koji_tasks, arches) | 40 | self.trigger_tasks(envr, ITEM_TYPE, config.koji_build_completed_tasks, arches) | ||
| 1 | import fedmsg | ||||
|---|---|---|---|---|---|
| 2 | import fedmsg.encoding | ||||
| 3 | import moksha.hub.reactor | ||||
| 4 | | ||||
| 5 | from twisted.internet.task import LoopingCall | ||||
| 6 | | ||||
| 7 | from . import config | ||||
| 8 | from . import JobTrigger | ||||
| 9 | | ||||
| 10 | ITEM_TYPE = 'koji_tag' | ||||
| 11 | | ||||
| 12 | class KojiTagChangedJobTrigger(JobTrigger): | ||||
| 13 | topic = "org.fedoraproject.prod.buildsys.tag" | ||||
| 14 | jsonify = False | ||||
| 15 | config_key = 'taskotron.kojitagchangedjobtrigger.enabled' | ||||
| 16 | | ||||
| 17 | def __init__(self, *args, **kw): | ||||
| 18 | super(KojiTagChangedJobTrigger, self).__init__(*args, **kw) | ||||
| 19 | | ||||
| 20 | self.queued_tags = set() | ||||
| 21 | | ||||
| 22 | # check for bodhi_to_koji_tags tasks queue every config.fuse_delay seconds | ||||
| 23 | lc = LoopingCall(self.delayed_consume) | ||||
| 24 | lc.start(config.fuse_delay) | ||||
| 25 | | ||||
| 26 | def delayed_consume(self): | ||||
| 27 | if self.queued_tags: | ||||
| 28 | try: | ||||
| 29 | for tag in self.queued_tags: | ||||
| 30 | # it is sufficient to run depcheck and upgradepath only on one arch | ||||
| 31 | # XXX hardcoding X86_64 | ||||
| 32 | self.trigger_tasks(tag, ITEM_TYPE, config.koji_tag_changed_tasks, ['x86_64']) | ||||
| 33 | finally: | ||||
| 34 | self.queued_tags = set() | ||||
| 35 | else: | ||||
| 36 | self.log.debug("Woke up, but there were no messages.") | ||||
| 37 | | ||||
| 38 | def consume(self, message): | ||||
| 39 | usable_message = fedmsg.encoding.loads(message.body) | ||||
| 40 | | ||||
| 41 | koji_tag = usable_message['msg']['tag'] | ||||
| 42 | | ||||
| 43 | # we want only pending tags | ||||
| 44 | if not koji_tag.endswith('pending'): | ||||
| 45 | return | ||||
| 46 | | ||||
| 47 | if not len(self.queued_tags): | ||||
| 48 | self.log.info('setting fuse (%d seconds) for koji_tag %s', config.fuse_delay, koji_tag) | ||||
| 49 | else: | ||||
| 50 | self.log.info('adding koji_tag %s to the fuse queue', koji_tag) | ||||
| 51 | | ||||
| 52 | self.queued_tags.add(koji_tag) | ||||
| Show All 18 Lines | 15 | setup( | |||
|---|---|---|---|---|---|
| 19 | author='Tim Flink', | 19 | author='Tim Flink', | ||
| 20 | author_email='tflink@fedoraproject.org', | 20 | author_email='tflink@fedoraproject.org', | ||
| 21 | license='GPLv2+', | 21 | license='GPLv2+', | ||
| 22 | url='https://fedorahosted.org/fedora-qa', | 22 | url='https://fedorahosted.org/fedora-qa', | ||
| 23 | packages=['jobtriggers'], | 23 | packages=['jobtriggers'], | ||
| 24 | entry_points={ | 24 | entry_points={ | ||
| 25 | 'console_scripts': ['jobrunner=jobtriggers.jobrunner:main'], | 25 | 'console_scripts': ['jobrunner=jobtriggers.jobrunner:main'], | ||
| 26 | 'moksha.consumer': ( | 26 | 'moksha.consumer': ( | ||
| 27 | 'kojijobtrigger = jobtriggers.koji_msg:KojiJobTrigger', | 27 | 'kojibuildcompletedjobtrigger = jobtriggers.koji_build_msg:KojiBuildCompletedJobTrigger', | ||
| 28 | 'bodhijobtrigger = jobtriggers.bodhi_msg:BodhiJobTrigger', | 28 | 'kojitagchangedjobtrigger = jobtriggers.koji_tag_msg:KojiTagChangedJobTrigger', | ||
| 29 | ), | 29 | ), | ||
| 30 | }, | 30 | }, | ||
| 31 | include_package_data=True, | 31 | include_package_data=True, | ||
| 32 | install_requires=[ | 32 | install_requires=[ | ||
| 33 | 'moksha.hub', | 33 | 'moksha.hub', | ||
| 34 | 'fedmsg', | 34 | 'fedmsg', | ||
| 35 | 'requests', | 35 | 'requests', | ||
| 36 | ], | 36 | ], | ||
| 37 | cmdclass={'test': PyTest} | 37 | cmdclass={'test': PyTest} | ||
| 38 | ) | 38 | ) | ||
| 1 | import pytest | 1 | import pytest | ||
|---|---|---|---|---|---|
| 2 | from dingus import Dingus | 2 | from dingus import Dingus | ||
| 3 | 3 | | |||
| 4 | import jobtriggers.cli | 4 | import jobtriggers.jobrunner | ||
| 5 | from jobtriggers.utils import log_job | 5 | from jobtriggers.utils import log_job | ||
| 6 | 6 | | |||
| 7 | 7 | | |||
| 8 | class TestCli(): | 8 | class TestCli(): | ||
| 9 | def setup_method(self, method): | 9 | def setup_method(self, method): | ||
| 10 | self.ref_tests = ['rpmlint', 'upgradepath'] | 10 | self.ref_tests = ['rpmlint', 'upgradepath'] | ||
| 11 | self.ref_unit_types = ['koji_build', 'bodhi_id'] | 11 | self.ref_unit_types = ['koji_build', 'bodhi_id'] | ||
| 12 | self.ref_nvr = 'xchat-2.8.8-21.fc20' | 12 | self.ref_nvr = 'xchat-2.8.8-21.fc20' | ||
| 13 | self.ref_arch = 'x86_64' | 13 | self.ref_arch = 'x86_64' | ||
| 14 | 14 | | |||
| 15 | def test_run_jobs(self, tmpdir, monkeypatch): | 15 | def test_run_jobs(self, tmpdir, monkeypatch): | ||
| 16 | f = tmpdir.join('jobs.csv') | 16 | f = tmpdir.join('jobs.csv') | ||
| 17 | filename = str(f.realpath()) | 17 | filename = str(f.realpath()) | ||
| 18 | 18 | | |||
| 19 | monkeypatch.setattr(jobtriggers.cli, 'TRIGGER', Dingus()) | 19 | monkeypatch.setattr(jobtriggers.jobrunner, 'TRIGGER', Dingus()) | ||
| 20 | 20 | | |||
| 21 | log_job(filename, self.ref_tests[0], self.ref_unit_types[0], self.ref_nvr, self.ref_arch) | 21 | log_job(filename, self.ref_tests[0], self.ref_unit_types[0], self.ref_nvr, self.ref_arch) | ||
| 22 | log_job(filename, self.ref_tests[1], self.ref_unit_types[1], self.ref_nvr, self.ref_arch) | 22 | log_job(filename, self.ref_tests[1], self.ref_unit_types[1], self.ref_nvr, self.ref_arch) | ||
| 23 | 23 | | |||
| 24 | jobtriggers.cli.run_jobs(filename) | 24 | jobtriggers.jobrunner.run_jobs(filename) | ||
| 25 | 25 | | |||
| 26 | trigger_calls = jobtriggers.cli.TRIGGER.trigger_job.calls() | 26 | trigger_calls = jobtriggers.jobrunner.TRIGGER.trigger_job.calls() | ||
| 27 | 27 | | |||
| 28 | assert len(trigger_calls) == 2 | 28 | assert len(trigger_calls) == 2 | ||
| 29 | 29 | | |||
| 30 | assert trigger_calls[0][1] == (self.ref_tests[0], self.ref_unit_types[0], self.ref_nvr, self.ref_arch) | 30 | assert trigger_calls[0][1] == (self.ref_tests[0], self.ref_unit_types[0], self.ref_nvr, self.ref_arch) | ||
| 31 | assert trigger_calls[1][1] == (self.ref_tests[1], self.ref_unit_types[1], self.ref_nvr, self.ref_arch) | 31 | assert trigger_calls[1][1] == (self.ref_tests[1], self.ref_unit_types[1], self.ref_nvr, self.ref_arch) | ||
| This file was completely deleted. Show File Contents |
| 1 | import koji | ||||
|---|---|---|---|---|---|
| 2 | import pytest | ||||
| 3 | from dingus import Dingus | ||||
| 4 | from bunch import Bunch | ||||
| 5 | | ||||
| 6 | from jobtriggers import koji_build_msg | ||||
| 7 | | ||||
| 8 | | ||||
| 9 | @pytest.mark.usefixtures('prepare') | ||||
| 10 | class TestKojiBuildCompletedJobTrigger(): | ||||
| 11 | @pytest.fixture | ||||
| 12 | def prepare(self, monkeypatch): | ||||
| 13 | self.ref_new = koji.BUILD_STATES['COMPLETE'] | ||||
| 14 | self.ref_name = 'stage' | ||||
| 15 | self.ref_version = '4.1.1' | ||||
| 16 | self.ref_release = '3.fc18' | ||||
| 17 | self.ref_nvr = '%s-%s-%s' % (self.ref_name, self.ref_version, self.ref_release) | ||||
| 18 | | ||||
| 19 | self._create_msg(self.ref_new, self.ref_name, self.ref_release, self.ref_version) | ||||
| 20 | | ||||
| 21 | self.ref_tasks = ['koji_build_task1', 'koji_build_task2'] | ||||
| 22 | self.ref_validarches = ['i386', 'x86_64'] | ||||
| 23 | self.ref_blacklist_releases= ['el5', 'el6'] | ||||
| 24 | | ||||
| 25 | stub_hub = Bunch(config=Bunch(get=0)) | ||||
| 26 | | ||||
| 27 | self.helper = koji_build_msg.KojiBuildCompletedJobTrigger(stub_hub) | ||||
| 28 | self.helper.trigger = Dingus() | ||||
| 29 | | ||||
| 30 | monkeypatch.setattr(koji_build_msg.utils, 'get_arches', lambda *a, **k: self.ref_validarches) | ||||
| 31 | | ||||
| 32 | koji_build_msg.config.koji_build_completed_tasks = self.ref_tasks | ||||
| 33 | koji_build_msg.config.valid_arches = self.ref_validarches | ||||
| 34 | koji_build_msg.config.blacklist_releases = self.ref_blacklist_releases | ||||
| 35 | koji_build_msg.config.job_logging = False | ||||
| 36 | | ||||
| 37 | def _create_msg(self, ref_new, ref_name, ref_release, ref_version): | ||||
| 38 | self.ref_message = Bunch(body='{"i": 1,\ | ||||
| 39 | "msg": {"build_id": 221146,\ | ||||
| 40 | "new": %d,\ | ||||
| 41 | "name": "%s",\ | ||||
| 42 | "release": "%s",\ | ||||
| 43 | "version": "%s"},\ | ||||
| 44 | "timestamp": 1359603469.21164,\ | ||||
| 45 | "topic": "org.fedoraproject.prod.buildsys.build.state.change",\ | ||||
| 46 | "username": "apache"}' % | ||||
| 47 | (ref_new, ref_name, ref_release, ref_version)) | ||||
| 48 | | ||||
| 49 | def test_consume(self): | ||||
| 50 | self.helper.consume(self.ref_message) | ||||
| 51 | | ||||
| 52 | trigger_calls = self.helper.trigger.trigger_job.calls() | ||||
| 53 | | ||||
| 54 | assert len(trigger_calls) == 4 | ||||
| 55 | | ||||
| 56 | assert trigger_calls[0][1] == (self.ref_nvr, koji_build_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_validarches[0]) | ||||
| 57 | assert trigger_calls[1][1] == (self.ref_nvr, koji_build_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_validarches[1]) | ||||
| 58 | assert trigger_calls[2][1] == (self.ref_nvr, koji_build_msg.ITEM_TYPE, self.ref_tasks[1], self.ref_validarches[0]) | ||||
| 59 | assert trigger_calls[3][1] == (self.ref_nvr, koji_build_msg.ITEM_TYPE, self.ref_tasks[1], self.ref_validarches[1]) | ||||
| 60 | | ||||
| 61 | def test_consume_notcomplete_state(self): | ||||
| 62 | ref_new = koji.BUILD_STATES['BUILDING'] | ||||
| 63 | self._create_msg(ref_new, self.ref_name, self.ref_release, self.ref_version) | ||||
| 64 | | ||||
| 65 | self.helper.consume(self.ref_message) | ||||
| 66 | | ||||
| 67 | trigger_calls = self.helper.trigger.trigger_job.calls() | ||||
| 68 | | ||||
| 69 | assert trigger_calls == [] | ||||
| 70 | | ||||
| 71 | def test_consume_blacklisted_release(self): | ||||
| 72 | ref_release = '3.el5' | ||||
| 73 | self._create_msg(self.ref_new, self.ref_name, ref_release, self.ref_version) | ||||
| 74 | | ||||
| 75 | self.helper.consume(self.ref_message) | ||||
| 76 | | ||||
| 77 | trigger_calls = self.helper.trigger.trigger_job.calls() | ||||
| 78 | | ||||
| 79 | assert trigger_calls == [] | ||||
| 1 | import pytest | 1 | import pytest | ||
|---|---|---|---|---|---|
| 2 | from dingus import Dingus | 2 | from dingus import Dingus | ||
| 3 | from bunch import Bunch | 3 | from bunch import Bunch | ||
| 4 | 4 | | |||
| 5 | from jobtriggers import koji_msg | 5 | from jobtriggers import koji_tag_msg | ||
| 6 | 6 | | |||
| 7 | 7 | | |||
| 8 | @pytest.mark.usefixtures('prepare') | 8 | @pytest.mark.usefixtures('prepare') | ||
| 9 | class TestKojiJobTrigger(): | 9 | class TestKojiTagChangedJobTrigger(): | ||
| 10 | @pytest.fixture | 10 | @pytest.fixture | ||
| 11 | def prepare(self, monkeypatch): | 11 | def prepare(self, monkeypatch): | ||
| 12 | self.ref_name = 'stage' | 12 | self.ref_name = 'stage' | ||
| 13 | self.ref_version = '4.1.1' | 13 | self.ref_version = '4.1.1' | ||
| 14 | self.ref_release = '3.fc18' | 14 | self.ref_release = '3.fc18' | ||
| 15 | self.ref_nvr = '%s-%s-%s' % (self.ref_name, self.ref_version, self.ref_release) | | |||
| 16 | self.ref_tag = 'f18-updates-testing-pending' | 15 | self.ref_tag = 'f18-updates-testing-pending' | ||
| 16 | self.ref_nvr = '%s-%s-%s' % (self.ref_name, self.ref_version, self.ref_release) | ||||
| 17 | 17 | | |||
| 18 | self._create_msg(self.ref_name, self.ref_release, self.ref_tag, self.ref_version) | 18 | self.ref_tasks = ['koji_tag_task1', 'koji_tag_task2'] | ||
| 19 | 19 | self.ref_arch = 'x86_64' | |||
| 20 | self.ref_tasks = ['koji_task1', 'koji_task2'] | | |||
| 21 | self.ref_validarches = ['i386', 'x86_64'] | | |||
| 22 | self.ref_blacklist_releases= ['el5', 'el6'] | 20 | self.ref_blacklist_releases= ['el5', 'el6'] | ||
| 23 | 21 | | |||
| 22 | self._create_msg(self.ref_name, self.ref_release, self.ref_tag, self.ref_version) | ||||
| 23 | | ||||
| 24 | stub_hub = Bunch(config=Bunch(get=0)) | 24 | stub_hub = Bunch(config=Bunch(get=0)) | ||
| 25 | self.helper = koji_tag_msg.KojiTagChangedJobTrigger(stub_hub) | ||||
| 25 | 26 | | |||
| 26 | self.helper = koji_msg.KojiJobTrigger(stub_hub) | | |||
| 27 | self.helper.trigger = Dingus() | 27 | self.helper.trigger = Dingus() | ||
| 28 | 28 | | |||
| 29 | monkeypatch.setattr(koji_msg.utils, 'get_arches', lambda *a, **k: self.ref_validarches) | 29 | koji_tag_msg.config.koji_tag_changed_tasks = self.ref_tasks | ||
| 30 | 30 | koji_tag_msg.config.job_logging = False | |||
| 31 | koji_msg.config.koji_tasks = self.ref_tasks | | |||
| 32 | koji_msg.config.valid_arches = self.ref_validarches | | |||
| 33 | koji_msg.config.blacklist_releases = self.ref_blacklist_releases | | |||
| 34 | koji_msg.config.job_logging = False | | |||
| 35 | 31 | | |||
| 36 | def _create_msg(self, ref_name, ref_release, ref_tag, ref_version): | 32 | def _create_msg(self, ref_name, ref_release, ref_tag, ref_version): | ||
| 37 | self.ref_message = Bunch(body='{"i": 1,\ | 33 | self.ref_message = Bunch(body='{"i": 1,\ | ||
| 38 | "msg": {"build_id": 221146,\ | 34 | "msg": {"build_id": 221146,\ | ||
| 39 | "name": "%s",\ | 35 | "name": "%s",\ | ||
| 40 | "owner": "ralph",\ | 36 | "owner": "ralph",\ | ||
| 41 | "release": "%s",\ | 37 | "release": "%s",\ | ||
| 42 | "tag": "%s",\ | 38 | "tag": "%s",\ | ||
| 43 | "tag_id": 216,\ | 39 | "tag_id": 216,\ | ||
| 44 | "user": "bodhi",\ | 40 | "user": "bodhi",\ | ||
| 45 | "version": "%s"},\ | 41 | "version": "%s"},\ | ||
| 46 | "timestamp": 1359603469.21164,\ | 42 | "timestamp": 1359603469.21164,\ | ||
| 47 | "topic": "org.fedoraproject.prod.buildsys.tag",\ | 43 | "topic": "org.fedoraproject.prod.buildsys.tag",\ | ||
| 48 | "username": "apache"}' % | 44 | "username": "apache"}' % | ||
| 49 | (ref_name, ref_release, ref_tag, ref_version)) | 45 | (ref_name, ref_release, ref_tag, ref_version)) | ||
| 50 | 46 | | |||
| 51 | def test_consume(self): | 47 | def test_delayed_queue(self): | ||
| 52 | self.helper.consume(self.ref_message) | 48 | self.helper.consume(self.ref_message) | ||
| 53 | 49 | | |||
| 54 | trigger_calls = self.helper.trigger.trigger_job.calls() | 50 | assert self.helper.queued_tags == set([self.ref_tag]) | ||
| 55 | | ||||
| 56 | assert len(trigger_calls) == 4 | | |||
| 57 | | ||||
| 58 | assert trigger_calls[0][1] == (self.ref_nvr, koji_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_validarches[0]) | | |||
| 59 | assert trigger_calls[1][1] == (self.ref_nvr, koji_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_validarches[1]) | | |||
| 60 | assert trigger_calls[2][1] == (self.ref_nvr, koji_msg.ITEM_TYPE, self.ref_tasks[1], self.ref_validarches[0]) | | |||
| 61 | assert trigger_calls[3][1] == (self.ref_nvr, koji_msg.ITEM_TYPE, self.ref_tasks[1], self.ref_validarches[1]) | | |||
| 62 | 51 | | |||
| 63 | def test_consume_notwatched_tag(self): | 52 | def test_delayed_consume(self): | ||
| 64 | ref_tag = 'f18-randomtag' | 53 | self.helper.queued_tags = [self.ref_tag] | ||
| 65 | self._create_msg(self.ref_name, self.ref_release, ref_tag, self.ref_version) | | |||
| 66 | 54 | | |||
| 67 | self.helper.consume(self.ref_message) | 55 | self.helper.delayed_consume() | ||
| 68 | 56 | | |||
| 69 | trigger_calls = self.helper.trigger.trigger_job.calls() | 57 | trigger_calls = self.helper.trigger.trigger_job.calls() | ||
| 70 | 58 | | |||
| 71 | assert trigger_calls == [] | 59 | assert len(trigger_calls) == 2 | ||
| 72 | 60 | | |||
| 73 | def test_consume_blacklisted_release(self): | 61 | assert trigger_calls[0][1] == (self.ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[0], self.ref_arch) | ||
| 74 | ref_release = '3.el5' | 62 | assert trigger_calls[1][1] == (self.ref_tag, koji_tag_msg.ITEM_TYPE, self.ref_tasks[1], self.ref_arch) | ||
| 75 | self._create_msg(self.ref_name, ref_release, self.ref_tag, self.ref_version) | | |||
| 76 | 63 | | |||
| 77 | self.helper.consume(self.ref_message) | 64 | assert self.helper.queued_tags == set() | ||
| 78 | 65 | | |||
| 79 | trigger_calls = self.helper.trigger.trigger_job.calls() | 66 | def test_consume_kojitag_not_pending(self): | ||
| 67 | ref_tag = 'f18-updates-testing' | ||||
| 68 | self._create_msg(self.ref_name, self.ref_release, ref_tag, self.ref_version) | ||||
| 69 | self.helper.consume(self.ref_message) | ||||
| 80 | 70 | | |||
| 81 | assert trigger_calls == [] | 71 | assert self.helper.queued_tags == set() | ||