def scanJob()

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


def scanJob(KibbleBit, source, job, creds):
    """ Scans a single job for activity """
    NOW = int(datetime.datetime.utcnow().timestamp())
    dhash = hashlib.sha224( ("%s-%s-%s" % (source['organisation'], source['sourceID'], job) ).encode('ascii', errors='replace')).hexdigest()
    found = True
    doc= None
    parseIt = False
    found = KibbleBit.exists('cijob', dhash)
    
    jobURL = "%s/api/v2/builders/%s/builds" % (source['sourceURL'], job)
    KibbleBit.pprint(jobURL)
    jobjson = plugins.utils.jsonapi.get(jobURL, auth = creds)
    
    # If valid JSON, ...
    if jobjson:
        for buildno, data in jobjson.items():
            buildhash = hashlib.sha224( ("%s-%s-%s-%s" % (source['organisation'], source['sourceID'], job, buildno) ).encode('ascii', errors='replace')).hexdigest()
            builddoc = None
            try:
                builddoc = KibbleBit.get('ci_build', buildhash)
            except:
                pass
            
            # If this build already completed, no need to parse it again
            if builddoc and builddoc.get('completed', False):
                continue
            
            KibbleBit.pprint("[%s-%s] This is new or pending, analyzing..." % (job, buildno))
            
            completed = True if 'currentStep' in data else False
            
            
            # Get build status (success, failed, canceled etc)
            status = 'building'
            if 'successful' in data.get('text', []):
                status = 'success'
            if 'failed' in data.get('text', []):
                status = 'failed'
            if 'exception' in data.get('text', []):
                status = 'aborted'
            
            DUR = 0
            # Calc when the build finished
            if completed and len(data.get('times', [])) == 2 and data['times'][1]:
                FIN = data['times'][1]
                DUR = FIN  - data['times'][0]
            else:
                FIN = 0
                
            doc = {
                # Build specific data
                'id': buildhash,
                'date': time.strftime("%Y/%m/%d %H:%M:%S", time.gmtime(FIN)),
                'buildID': buildno,
                'completed': completed,
                'duration': DUR*1000,  # Buildbot does seconds, not milis
                'job': job,
                'jobURL': "%s/builders/%s" % (source['sourceURL'], job),
                'status': status,
                'started': int(data['times'][0]),
                'ci': 'buildbot',
                
                # Standard docs values
                'sourceID': source['sourceID'],
                'organisation': source['organisation'],
                'upsert': True,
            }
            KibbleBit.append('ci_build', doc)
        # Yay, it worked!
        return True
    
    # Boo, it failed!
    KibbleBit.pprint("Fetching job data failed!")
    return False