def scan()

in src/plugins/scanners/buildbot.py [0:0]


def scan(KibbleBit, source):
    # Simple URL check
    buildbot = re.match(r"(https?://.+)", source['sourceURL'])
    if buildbot:
        
        source['steps']['ci'] = {
            'time': time.time(),
            'status': 'Parsing Buildbot job changes...',
            'running': True,
            'good': True
        }
        KibbleBit.updateSource(source)
        
        badOnes = 0
        pendingJobs = []
        KibbleBit.pprint("Parsing Buildbot activity at %s" % source['sourceURL'])
        source['steps']['ci'] = {
            'time': time.time(),
            'status': 'Downloading changeset',
            'running': True,
            'good': True
        }
        KibbleBit.updateSource(source)
        
        # Buildbot may neeed credentials
        creds = None
        if source['creds'] and 'username' in source['creds'] and source['creds']['username'] and len(source['creds']['username']) > 0:
            creds = "%s:%s" % (source['creds']['username'], source['creds']['password'])
            
        # Get the job list
        sURL = source['sourceURL']
        KibbleBit.pprint("Getting job list...")
        builders = plugins.utils.jsonapi.get("%s/api/v2/builders" % sURL , auth = creds)
        
        # Save queue snapshot
        NOW = int(datetime.datetime.utcnow().timestamp())
        queuehash = hashlib.sha224( ("%s-%s-queue-%s" % (source['organisation'], source['sourceID'], int(time.time())) ).encode('ascii', errors='replace')).hexdigest()
        
        
        # Scan queue items
        blocked = 0
        stuck = 0
        totalqueuetime = 0
        labelQueuedBuilds = {}
        queueSize = 0
        actualQueueSize = 0
        building = 0
        jobs = []
        
        for builder, data in builders.items():
            jobs.append(builder)
            if data['state'] == 'building':
                building += 1
            if data.get('pendingBuilds', 0) > 0:
                # All queued items, even offlined builders
                actualQueueSize += data.get('pendingBuilds', 0)
                # Only queues with an online builder (actually waiting stuff)
                if data['state'] == 'building':
                    queueSize += data.get('pendingBuilds', 0)
                    blocked += data.get('pendingBuilds', 0) # Blocked by running builds
                # Stuck builds (iow no builder available)
                if data['state'] == 'offline':
                    stuck += data.get('pendingBuilds', 0)
            
        
        # Write up a queue doc
        queuedoc = {
            'id': queuehash,
            'date': time.strftime("%Y/%m/%d %H:%M:%S", time.gmtime(NOW)),
            'time': NOW,
            'size': queueSize,
            'blocked': blocked,
            'stuck': stuck,
            'building': building,
            'ci': 'buildbot',
            
            # Standard docs values
            'sourceID': source['sourceID'],
            'organisation': source['organisation'],
            'upsert': True,
        }
        KibbleBit.append('ci_queue', queuedoc)
        
        KibbleBit.pprint("Found %u builders in Buildbot" % len(jobs))
        
        threads = []
        block = threading.Lock()
        KibbleBit.pprint("Scanning jobs using 4 sub-threads")
        for i in range(0,4):
            t = buildbotThread(block, KibbleBit, source, creds, jobs)
            threads.append(t)
            t.start()
        
        for t in threads:
            t.join()

        # We're all done, yaay        
        KibbleBit.pprint("Done scanning %s" % source['sourceURL'])

        source['steps']['ci'] = {
            'time': time.time(),
            'status': 'Buildbot successfully scanned at ' + time.strftime("%Y/%m/%d %H:%M:%S", time.gmtime(time.time())),
            'running': False,
            'good': True
        }
        KibbleBit.updateSource(source)