Back to home page

EIC code displayed by LXR

 
 

    


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())