#!/usr/bin/env python """Script for submitting Galaxy job information to the Galactic Radio Telescope. See doc/source/admin/grt.rst for more detailed usage information. """ import argparse import logging import os import sys import requests import yaml sample_config = os.path.abspath(os.path.join(os.path.dirname(__file__), 'grt.yml.sample')) default_config = os.path.abspath(os.path.join(os.path.dirname(__file__), 'grt.yml')) def main(argv): parser = argparse.ArgumentParser() parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('-r', '--report-directory', help='Directory in which reports are stored', default=os.path.abspath(os.path.join('.', 'reports'))) parser.add_argument('-g', '--grt-config', help='Path to GRT config file', default=default_config) parser.add_argument("-l", "--loglevel", choices=['debug', 'info', 'warning', 'error', 'critical'], help="Set the logging level", default='warning') args = parser.parse_args() logging.getLogger().setLevel(getattr(logging, args.loglevel.upper())) logging.info('Loading GRT configuration...') try: with open(args.grt_config) as handle: config = yaml.safe_load(handle) except Exception: logging.warning('Using default GRT configuration') with open(sample_config) as handle: config = yaml.safe_load(handle) REPORT_DIR = args.report_directory GRT_URL = config['grt']['url'].rstrip('/') + '/' GRT_INSTANCE_ID = config['grt']['instance_id'] GRT_API_KEY = config['grt']['api_key'] # Contact the server and check auth details. headers = { 'AUTHORIZATION': '%s:%s' % (GRT_INSTANCE_ID, GRT_API_KEY) } r = requests.post(GRT_URL + 'api/whoami', headers=headers) data = r.json() # Get back some information about which reports had previously been uploaded. remote_reports = data['uploaded_reports'] logging.debug("Remote reports: %s", remote_reports) local_reports = [x.strip('.json') for x in os.listdir(REPORT_DIR) if x.endswith('.json')] logging.debug("Local reports: %s", local_reports) # Now we know which to send. for report_id in local_reports: if report_id not in remote_reports: logging.info("Uploading %s", report_id) files = { 'meta': open(os.path.join(REPORT_DIR, report_id + '.json'), 'rb'), 'data': open(os.path.join(REPORT_DIR, report_id + '.tar.gz'), 'rb') } data = { 'identifier': report_id } r = requests.post(GRT_URL + 'api/v2/upload', files=files, headers=headers, data=data) if r.ok: logging.info("Uploaded successfully %s", report_id) else: logging.critical("Non-OK response: %s", r.status_code) if __name__ == '__main__': main(sys.argv)