Get Job Executions in Rundeck
1 min read

Get Job Executions in Rundeck

Get Job Executions in Rundeck

Following the previous articles, we are now in position to query job executions. The query is done via API as well. As a job can have an arbitrary number of executions, it's advisable to use pagination.

The code follows the same lines as the one in the previous entries:

# API call to get the list of the executions for a Job.
SIZE = 100
def getExecutionsForAJob(server, port, api_key, job_id, page=0, size=SIZE):
    url =  server +':'+port + \
        '/api/1/job/'+job_id + \
        '/executions?max='+('%d' % size) + \
        '&offset='+('%d' % (page * size))
    log.info(url)
    headers = {'Content-Type': 'application/json','X-RunDeck-Auth-Token': api_key }
    r = requests.get(url, headers=headers, verify=False)
    return r.text.encode('utf-8')

This function builds the URL for the call and returns an XML string. Its parameters are:

  • server - the rundeck server
  • port - the rundeck server's port
  • api_key - the api key for rundeck
  • job_id - one of the job IDs obtained by calling functions described here (or hardcoded)
  • page - the page we want to retrieve (offset is size * pages)
  • size - the page size (aka the max number of executions we want to retrieve at once)

We can go a step further with a wrapper:

MAXCOUNT=1000
PAGE=0

def getAllExecutionsForAJob(server, port, api_key, jobid, maxCount=sys.maxsize):
    executions = {}
    count = 1
    page = PAGE
    while count and page < maxCount + PAGE:
        batch = getExecutionDate(getExecutionsForAJob(
            server, port, api_key, jobid, page))
        count = len(batch)
        offset += count
        if count:
            executions.update(batch)
    return executions

...which would build a list of maximum MAXCOUNT * SIZE executions.

As the end objective is to remove old jobs, we need to retrieve the date for each execution. In effect we only need the execution ID and date:

# Returns a dict
# {
#   'execution_id01': 'execution_date01',
#   'execution_id02': 'execution_date02',
#   ...
# }
def getExecutionDate(executionsinfo_xml):
    execid_dates = {}
    root = ET.fromstring(executionsinfo_xml)
    for executions in root:
        for execution in executions.findall('execution'):
            execution_id = execution.get('id')
            for date in execution.findall('date-ended'):
                execution_date = date.get('unixtime')
            execid_dates[execution_id] = execution_date
    return execid_dates

In order to retrieve the executions with dates we'd need to call something like:

getExecutionDate(
  getExecutionsForAJob(server, port, api_key, jobid, page)
)

HTH,