This is a different take at https://pagure.io/koji/pull-request/45 Instead of installing just the runroot builder plugin explicitly, here we separate the plugins out into hub and builder plugins explicitly and install each type in turn.
61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
#koji hub plugin
|
|
# There is a kojid plugin that goes with this hub plugin. The kojid builder
|
|
# plugin has a config file. This hub plugin has no config file.
|
|
|
|
|
|
from koji.context import context
|
|
from koji.plugin import export
|
|
import koji
|
|
import random
|
|
import sys
|
|
|
|
#XXX - have to import kojihub for mktask
|
|
sys.path.insert(0, '/usr/share/koji-hub/')
|
|
from kojihub import mktask, get_tag, get_all_arches
|
|
|
|
__all__ = ('runroot',)
|
|
|
|
|
|
def get_channel_arches(channel):
|
|
"""determine arches available in channel"""
|
|
chan = context.handlers.call('getChannel', channel, strict=True)
|
|
ret = {}
|
|
for host in context.handlers.call('listHosts', channelID=chan['id'], enabled=True):
|
|
for a in host['arches'].split():
|
|
ret[koji.canonArch(a)] = 1
|
|
return ret
|
|
|
|
@export
|
|
def runroot(tagInfo, arch, command, channel=None, **opts):
|
|
""" Create a runroot task """
|
|
context.session.assertPerm('runroot')
|
|
taskopts = {
|
|
'priority': 15,
|
|
'arch': arch,
|
|
}
|
|
|
|
taskopts['channel'] = channel or 'runroot'
|
|
|
|
if arch == 'noarch':
|
|
#not all arches can generate a proper buildroot for all tags
|
|
tag = get_tag(tagInfo)
|
|
if not tag['arches']:
|
|
raise koji.GenericError, 'no arches defined for tag %s' % tag['name']
|
|
|
|
#get all known arches for the system
|
|
fullarches = get_all_arches()
|
|
|
|
tagarches = tag['arches'].split()
|
|
|
|
# If our tag can't do all arches, then we need to
|
|
# specify one of the arches it can do.
|
|
if set(fullarches) - set(tagarches):
|
|
chanarches = get_channel_arches(taskopts['channel'])
|
|
choices = [x for x in tagarches if x in chanarches]
|
|
if not choices:
|
|
raise koji.GenericError, 'no common arches for tag/channel: %s/%s' \
|
|
% (tagInfo, taskopts['channel'])
|
|
taskopts['arch'] = koji.canonArch(random.choice(choices))
|
|
|
|
return mktask(taskopts,'runroot', tagInfo, arch, command, **opts)
|
|
|