#!/usr/bin/python

import os
import random
import sys
import threading
import time

import koji
import koji_cli.lib

"""
Attempting to replicate Koji issue#788
https://pagure.io/koji/issue/788
"""

PROFILE = 'lkoji'  # adjust to your needs


def main():
    # set up our session
    config = koji.read_config(PROFILE)
    sopts = koji.grab_session_options(config)
    for name in 'topdir', 'cert', 'serverca':
        if name in config:
            config[name] = os.path.expanduser(config[name])
    session = koji.ClientSession(config['server'], sopts)
    koji_cli.lib.activate_session(session, config)

    # make a fake repo
    repo = 'fake_i788'
    if not session.getExternalRepo(repo):
        url = 'https://example.com/%s' % repo
        session.createExternalRepo(repo, url)

    # find a new fake rpm name
    random.seed()
    limit = 999999999
    for i in range(8192):
        num = random.randint(0, limit/2)
        pname = 'fake_i788_%i' % num
        if not session.search('%s-*' % pname, 'rpm', 'glob'):
            break

    # prep the rpminfo
    baseinfo = {
            'name': pname,
            'version': '1.0.1',
            'release': '1',
            'epoch': None,
            'arch': 'noarch',
            'payloadhash': 'mindyourownbusiness',
            'size': 999,
            'buildtime': 0,
            }

    # make a reasonably long list
    data = []
    for i in range(16):
        info = baseinfo.copy()
        info['release'] = str(i)
        data.append(info)

    # make subsessions
    sub1 = session.subsession()
    sub2 = session.subsession()

    sync = threading.Event()

    d1 = data
    d2 = list(data)
    # random.shuffle(d2)  # <-- gives me a deadlock if ucommented
    t1 = threading.Thread(target=add_ext_rpms, args=(sub1, sync, d1, repo))
    t2 = threading.Thread(target=add_ext_rpms, args=(sub2, sync, d2, repo))
    t1.start()
    t2.start()

    time.sleep(2)
    sync.set()

    t1.join()
    t2.join()



def add_ext_rpms(session, sync, rpms, repo):
    # set up the multicall
    session.multicall = True
    for rinfo in rpms:
        session.addExternalRPM(rinfo, repo)
    sync.wait()
    session.multiCall(strict=True)



if __name__ == '__main__':
    main()
