Skip to content
Snippets Groups Projects
update_mdc.py 2.81 KiB
import argparse
from pathlib import Path

from metadata_client.metadata_client import MetadataClient

from .config import webservice as config

def parse_int_range(s):
    try:
        return [int(s)]
    except ValueError:
        parts = s.split('-')
        if len(parts) != 2:
            raise ValueError(f"Range ({s!r}) not like '6' or '5-10'")
        return list(range(int(parts[0]), int(parts[1]) + 1))

parser = argparse.ArgumentParser(
    description='Update run status at MDC for a given run id.')
#  TODO: unify configuration argument names across the project
parser.add_argument('--conf-file', type=str, help='Path to webservice config',
                    default=None)
parser.add_argument('--flg', type=str, choices=["NA", "R", "A"], required=True,
                    help='Status flag for MDC request: NA - not available, R - running, A - available.')  # noqa
parser.add_argument('--proposal', type=int, help="Proposal number")
parser.add_argument('--runs', type=parse_int_range,
                    help="Run number or inclusive range, e.g. '90-96'")
parser.add_argument('--rid', type=int, help='Run id from MDC')
parser.add_argument('--msg', type=str, help='Message string to MDC',
                    default='Error while job submission')
parser.add_argument('--really', help="Actually make changes (otherwise dry-run)")
args = parser.parse_args()

if args.conf_file is not None:
    config.configure(includes_for_dynaconf=[Path(args.conf_file).absolute()])

mdconf = config['metadata-client']
client_conn = MetadataClient(client_id=mdconf['user-id'],
                             client_secret=mdconf['user-secret'],
                             user_email=mdconf['user-email'],
                             token_url=mdconf['token-url'],
                             refresh_url=mdconf['refresh-url'],
                             auth_url=mdconf['auth-url'],
                             scope=mdconf['scope'],
                             base_api_url=mdconf['base-api-url'])

if args.rid:
    rids = [args.rid]
else:
    assert args.proposal and args.runs, "Specify --proposal and --runs, or --rid"
    resp = client_conn.get_runs_by_proposal_number_api(args.proposal)
    run_no_to_run_id = {r['run_number']: r['id'] for r in resp.json()['runs']}
    rids = [run_no_to_run_id[n] for n in args.runs if n in run_no_to_run_id]

for rid in rids:
    print(f"Updating run {rid} to status {args.flg} at {mdconf['base-api-url']}")
    if args.really:
        response = client_conn.update_run_api(rid, {
            'flg_cal_data_status': args.flg, 'cal_pipeline_reply': args.msg
        })

        if response.status_code == 200:
            print('Run is updated')
        else:
            print(f'Update failed {response}')

if not rids:
    print("No runs selected")
elif not args.really:
    print("Add --really to actually make these changes")