'Returns a full log for all instance usage audit tasks on all
computes.
:param context: Nova request context.
:param before: By default we look for the audit period most recently
completed before this datetime. Has no effect if both begin and end
are specified.'

def _get_audit_task_logs(self, context, before=None):

    (begin, end) = utils.last_completed_audit_period(before=before)
    task_logs = self.host_api.task_log_get_all(context, 'instance_usage_audit', begin, end)
    filters = {'topic': compute_rpcapi.RPC_TOPIC}
    services = self.host_api.service_get_all(context, filters=filters)
    hosts = set((serv['host'] for serv in services))
    seen_hosts = set()
    done_hosts = set()
    running_hosts = set()
    total_errors = 0
    total_items = 0
    for tlog in task_logs:
        seen_hosts.add(tlog['host'])
        if (tlog['state'] == 'DONE'):
            done_hosts.add(tlog['host'])
        if (tlog['state'] == 'RUNNING'):
            running_hosts.add(tlog['host'])
        total_errors += tlog['errors']
        total_items += tlog['task_items']
    log = {tl['host']: dict(state=tl['state'], instances=tl['task_items'], errors=tl['errors'], message=tl['message']) for tl in task_logs}
    missing_hosts = (hosts - seen_hosts)
    overall_status = ('%s    hosts    done.    %s    errors.' % (('ALL' if (len(done_hosts) == len(hosts)) else ('%s    of    %s' % (len(done_hosts), len(hosts)))), total_errors))
    return dict(period_beginning=str(begin), period_ending=str(end), num_hosts=len(hosts), num_hosts_done=len(done_hosts), num_hosts_running=len(running_hosts), num_hosts_not_run=len(missing_hosts), hosts_not_run=list(missing_hosts), total_instances=total_items, total_errors=total_errors, overall_status=overall_status, log=log)
