Add fedmsg and fedmsg koji plugin
This commit is contained in:
parent
b21b7ce546
commit
c2eaa4f2dc
3 changed files with 152 additions and 0 deletions
|
@ -37,6 +37,7 @@
|
|||
- nagios_client
|
||||
- fas_client
|
||||
- collectd/base
|
||||
- fedmsg/base
|
||||
- koji_hub
|
||||
|
||||
tasks:
|
||||
|
|
146
roles/koji_hub/files/fedmsg-koji-plugin.py
Normal file
146
roles/koji_hub/files/fedmsg-koji-plugin.py
Normal file
|
@ -0,0 +1,146 @@
|
|||
# Koji callback for sending notifications about events to the fedmsg messagebus
|
||||
# Copyright (c) 2009-2012 Red Hat, Inc.
|
||||
#
|
||||
# Authors:
|
||||
# Ralph Bean <rbean@redhat.com>
|
||||
# Mike Bonnet <mikeb@redhat.com>
|
||||
|
||||
from koji.plugin import callbacks
|
||||
from koji.plugin import callback
|
||||
from koji.plugin import ignore_error
|
||||
|
||||
import fedmsg
|
||||
import kojihub
|
||||
import re
|
||||
|
||||
import pprint
|
||||
|
||||
# Talk to the fedmsg-relay
|
||||
fedmsg.init(name='relay_inbound', cert_prefix='koji', active=True)
|
||||
|
||||
MAX_KEY_LENGTH = 255
|
||||
|
||||
|
||||
def camel_to_dots(name):
|
||||
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1.\2', name)
|
||||
return re.sub('([a-z0-9])([A-Z])', r'\1.\2', s1).lower()
|
||||
|
||||
|
||||
def get_message_body(topic, *args, **kws):
|
||||
msg = {}
|
||||
|
||||
if topic == 'package.list.change':
|
||||
msg['tag'] = kws['tag']['name']
|
||||
msg['package'] = kws['package']['name']
|
||||
elif topic == 'task.state.change':
|
||||
info = kws['info']
|
||||
|
||||
# Stuff in information about descendant tasks
|
||||
task = kojihub.Task(info['id'])
|
||||
info['children'] = task.getChildren()
|
||||
|
||||
# Send the whole info dict along because it might have useful info.
|
||||
# For instance, it contains the mention of what format createAppliance
|
||||
# is using (raw or qcow2).
|
||||
msg['info'] = info
|
||||
msg['method'] = kws['info']['method']
|
||||
msg['attribute'] = kws['attribute']
|
||||
msg['old'] = kws['old']
|
||||
msg['new'] = kws['new']
|
||||
msg['id'] = kws['info']['id']
|
||||
|
||||
# extract a useful identifier from the request string
|
||||
request = kws.get('info', {}).get('request', ['/'])
|
||||
msg['srpm'] = request[0].split('/')[-1]
|
||||
|
||||
if 'owner_name' in info:
|
||||
msg['owner'] = info['owner_name']
|
||||
elif 'owner_id' in info:
|
||||
msg['owner'] = kojihub.get_user(info['owner_id'])['name']
|
||||
elif 'owner' in info:
|
||||
msg['owner'] = kojihub.get_user(info['owner'])['name']
|
||||
else:
|
||||
msg['owner'] = None
|
||||
|
||||
elif topic == 'build.state.change':
|
||||
info = kws['info']
|
||||
msg['name'] = info['name']
|
||||
msg['version'] = info['version']
|
||||
msg['release'] = info['release']
|
||||
msg['attribute'] = kws['attribute']
|
||||
msg['old'] = kws['old']
|
||||
msg['new'] = kws['new']
|
||||
msg['build_id'] = info.get('id', None)
|
||||
msg['task_id'] = info.get('task_id', None)
|
||||
|
||||
if 'owner_name' in info:
|
||||
msg['owner'] = info['owner_name']
|
||||
elif 'owner_id' in info:
|
||||
msg['owner'] = kojihub.get_user(info['owner_id'])['name']
|
||||
elif 'owner' in info:
|
||||
msg['owner'] = kojihub.get_user(info['owner'])['name']
|
||||
else:
|
||||
msg['owner'] = None
|
||||
|
||||
elif topic == 'import':
|
||||
# TODO -- import is currently unused.
|
||||
# Should we remove it?
|
||||
msg['type'] = kws['type']
|
||||
elif topic in ('tag', 'untag'):
|
||||
msg['tag'] = kws['tag']['name']
|
||||
build = kws['build']
|
||||
msg['name'] = build['name']
|
||||
msg['version'] = build['version']
|
||||
msg['release'] = build['release']
|
||||
msg['user'] = kws['user']['name']
|
||||
msg['owner'] = kojihub.get_user(kws['build']['owner_id'])['name']
|
||||
msg['tag_id'] = kws['tag']['id']
|
||||
msg['build_id'] = kws['build']['id']
|
||||
elif topic == 'repo.init':
|
||||
msg['tag'] = kws['tag']['name']
|
||||
msg['tag_id'] = kws['tag']['id']
|
||||
msg['repo_id'] = kws['repo_id']
|
||||
elif topic == 'repo.done':
|
||||
msg['tag'] = kws['repo']['tag_name']
|
||||
msg['tag_id'] = kws['repo']['tag_id']
|
||||
msg['repo_id'] = kws['repo']['id']
|
||||
|
||||
return msg
|
||||
|
||||
|
||||
# This callback gets run for every koji event that starts with "post"
|
||||
@callback(*[
|
||||
c for c in callbacks.keys()
|
||||
if c.startswith('post') and c not in [
|
||||
'postImport', # This is kind of useless; also noisy.
|
||||
]
|
||||
])
|
||||
@ignore_error
|
||||
def send_message(cbtype, *args, **kws):
|
||||
if cbtype.startswith('post'):
|
||||
msgtype = cbtype[4:]
|
||||
else:
|
||||
msgtype = cbtype[3:]
|
||||
|
||||
# Short-circuit ourselves for task events. They are very spammy and we are
|
||||
# only interested in state changes to scratch builds (parent tasks).
|
||||
if cbtype == 'postTaskStateChange':
|
||||
# only state changes
|
||||
if not kws.get('attribute', None) == 'state':
|
||||
return
|
||||
# only parent tasks
|
||||
if kws.get('info', {}).get('parent'):
|
||||
return
|
||||
# only scratch builds
|
||||
request = kws.get('info', {}).get('request', [{}])[-1]
|
||||
if not isinstance(request, dict) or not request.get('scratch'):
|
||||
return
|
||||
|
||||
topic = camel_to_dots(msgtype)
|
||||
body = get_message_body(topic, *args, **kws)
|
||||
|
||||
# We need this to distinguish between messages from primary koji
|
||||
# and the secondary hubs off for s390 and ppc.
|
||||
body['instance'] = 'primary'
|
||||
|
||||
fedmsg.publish(topic=topic, msg=body, modname='buildsys')
|
|
@ -37,6 +37,11 @@
|
|||
- config
|
||||
notify: restart httpd
|
||||
|
||||
- name: koji fedmsg plugin
|
||||
copy: src=fedmsg-koji-plugin.py dest=/usr/lib/koji-hub-plugins/fedmsg-koji-plugin.py
|
||||
tags:
|
||||
- config
|
||||
|
||||
- name: init koji ca key file
|
||||
copy: src={{ puppet_private }}/koji/koji.stg_key.pem dest=/etc/pki/tls/private/koji.stg_key.pem
|
||||
tags:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue