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,