Warning, /swf-monitor/scripts/pcs-task-cmd is written in an unsupported language. File is not indexed.
0001 #!/usr/bin/env python3
0002 """
0003 pcs-task-cmd — fetch a PCS ProdTask's submission artifact.
0004
0005 Thin HTTP client over swf-monitor's REST API. No Django, no DB access.
0006 The server regenerates from current PCS state on every call, so what
0007 you print here reflects the task + dataset + config as they exist now.
0008
0009 Usage:
0010 pcs-task-cmd <name> --format {condor|panda|jedi|dump}
0011
0012 # condor: bash one-liner (env-prefixed submit_csv.sh)
0013 # panda: prun command
0014 # jedi: JSON taskParamMap for Client.insertTaskParams()
0015 # dump: full JSON view of the task + dataset + tags + config
0016
0017 Env:
0018 SWFMON_URL base URL, default https://epic-devcloud.org/prod
0019 SWFMON_TOKEN optional DRF token (only needed for non-public endpoints)
0020 """
0021 import argparse
0022 import os
0023 import sys
0024 import urllib.parse
0025 import urllib.request
0026
0027
0028 DEFAULT_URL = os.environ.get('SWFMON_URL', 'https://epic-devcloud.org/prod')
0029
0030
0031 def main() -> int:
0032 ap = argparse.ArgumentParser(description=__doc__.strip().splitlines()[0])
0033 ap.add_argument('name', help='ProdTask name')
0034 ap.add_argument('--format', required=True,
0035 choices=['condor', 'panda', 'jedi', 'dump'],
0036 help='output format')
0037 ap.add_argument('--url', default=DEFAULT_URL,
0038 help=f'swf-monitor base URL (default: {DEFAULT_URL})')
0039 args = ap.parse_args()
0040
0041 qs = urllib.parse.urlencode({'name': args.name, 'fmt': args.format})
0042 url = f'{args.url.rstrip("/")}/pcs/api/prod-tasks/command/?{qs}'
0043
0044 req = urllib.request.Request(url)
0045 token = os.environ.get('SWFMON_TOKEN')
0046 if token:
0047 req.add_header('Authorization', f'Token {token}')
0048
0049 try:
0050 with urllib.request.urlopen(req) as resp:
0051 sys.stdout.write(resp.read().decode())
0052 if not sys.stdout.isatty():
0053 pass
0054 else:
0055 sys.stdout.write('\n')
0056 return 0
0057 except urllib.error.HTTPError as e:
0058 body = e.read().decode(errors='replace')
0059 sys.stderr.write(f'HTTP {e.code}: {body}\n')
0060 return 1
0061 except urllib.error.URLError as e:
0062 sys.stderr.write(f'Request failed: {e.reason}\n')
0063 return 1
0064
0065
0066 if __name__ == '__main__':
0067 sys.exit(main())