[PATCH] Add the hub plugin that accompanies the kojid runroot plugin.

Ralph Bean rbean at redhat.com
Sat Jun 6 15:57:10 UTC 2015


---
 plugins/runroot_hub.py | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)
 create mode 100644 plugins/runroot_hub.py

diff --git a/plugins/runroot_hub.py b/plugins/runroot_hub.py
new file mode 100644
index 0000000..a666919
--- /dev/null
+++ b/plugins/runroot_hub.py
@@ -0,0 +1,61 @@
+#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
+
+ at 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)
+
-- 
2.4.2



More information about the buildsys mailing list