64 lines
2.2 KiB
Python
64 lines
2.2 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.
|
|
|
|
|
|
import random
|
|
import sys
|
|
|
|
import koji
|
|
from koji.context import context
|
|
from koji.plugin import export
|
|
# XXX - have to import kojihub for make_task
|
|
sys.path.insert(0, '/usr/share/koji-hub/')
|
|
import kojihub # noqa: E402
|
|
|
|
__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')
|
|
arch = koji.parse_arches(arch, strict=True, allow_none=False)
|
|
if not isinstance(command, (str, list)):
|
|
raise koji.GenericError(fr"Invalid type for value '{command}': {type(command)}")
|
|
taskopts = {
|
|
'priority': 15,
|
|
'arch': arch,
|
|
}
|
|
|
|
taskopts['channel'] = channel or 'runroot'
|
|
tag = kojihub.get_tag(tagInfo, strict=True)
|
|
if arch == 'noarch':
|
|
# not all arches can generate a proper buildroot for all tags
|
|
if not tag['arches']:
|
|
raise koji.GenericError('no arches defined for tag %s' % tag['name'])
|
|
|
|
# get all known arches for the system
|
|
fullarches = kojihub.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))
|
|
|
|
args = koji.encode_args(tagInfo, arch, command, **opts)
|
|
return kojihub.make_task('runroot', args, **taskopts)
|