in export.py [0:0]
def poll_exports(dir_name):
done = []
for agent_id in exporting_agents:
logging.info("Trying to export data for " + agent_id + " from " + str(exporting_agents[agent_id][0]))
export_response = client.describe_export_tasks(exportIds=[exporting_agents[agent_id][2]], filters=[{'name': 'agentIds', 'values': [agent_id], 'condition': 'EQUALS'}])
if len(export_response['exportsInfo']) > 0:
exports_info = export_response['exportsInfo'][0]
else:
continue
# Extract data on successful export task
if exports_info['exportStatus'] in ["SUCCEEDED", "FAILED"]:
logging.info(str.format(" export {}", exports_info['exportStatus']))
if exports_info['exportStatus'] == "SUCCEEDED":
(actual_start, actual_end) = extract_exports(exports_info, agent_id, dir_name)
else:
logging.info(str.format("exportId {}: {} - {}", exports_info['exportId'], exports_info['exportStatus'], exports_info['statusMessage']))
actual_end = exports_info['requestedEndTime'] if 'requestedEndTime' in exports_info else None
# Set new start time to be end time of completed export
exporting_agents[agent_id][0] = actual_end
# If actual end time past final end time or start/end times equal, export is done for agent
if exports_info['exportStatus'] == "FAILED" or actual_end == actual_start or actual_end >= exporting_agents[agent_id][1]:
logging.info("Finished exporting agent " + agent_id)
done.append(agent_id)
# Otherwise, go to next export
else:
next_start_time = actual_end
next_end_time = min(next_start_time + datetime.timedelta(days=3), exporting_agents[agent_id][1])
logging.info(str.format("Next export for agent {} will continue at {} and end at {}", agent_id, next_start_time, next_end_time))
try:
response = client.start_export_task(filters=[{'name': 'agentIds', 'values': [agent_id], 'condition': 'EQUALS'}],
startTime = next_start_time, endTime = next_end_time)
exporting_agents[agent_id][2] = response['exportId']
# If successful export already exists, use exportId of existing export
except Exception as e:
if (type(e).__name__ == "OperationNotPermittedException"):
last_word = e.message.split()[-1]
if (last_word == "another."): # Too many concurrent exports
logging.info("poll_exports - Maximum number of concurrent exports exceeded. Waiting...")
time.sleep(8)
else: # Export already exists
logging.info(str.format("poll_exports - OperationNotPermittedException for agent {}: {}", agent_id, e.message))
exporting_agents[agent_id][2] = last_word
else:
raise(e)
elif exports_info['exportStatus'] == "IN_PROGRESS":
logging.info(" In progress; waiting...")
else:
logging.info(str.format("ERROR: Unknown status for exportId {}: {} - {}", exports_info['exportId'], exports_info['exportStatus'], exports_info['statusMessage']))
for agent_id in done:
del exporting_agents[agent_id]
logging.debug(str.format("Exiting poll_exports - {} agents were done exporting, {} still exporting", len(done), len(exporting_agents)))