Back to home page

EIC code displayed by LXR

 
 

    


Warning, /iDDS/client/bin/idds is written in an unsupported language. File is not indexed.

0001 #!/usr/bin/env python
0002 #
0003 # Licensed under the Apache License, Version 2.0 (the "License");
0004 # You may not use this file except in compliance with the License.
0005 # You may obtain a copy of the License at
0006 # http://www.apache.org/licenses/LICENSE-2.0OA
0007 #
0008 # Authors:
0009 # - Wen Guan, <wen.guan@cern.ch>, 2020 - 2023
0010 
0011 """
0012 iDDS CLI
0013 """
0014 
0015 from __future__ import print_function
0016 
0017 import argparse
0018 import argcomplete
0019 # import json
0020 import logging
0021 import os
0022 import sys
0023 import time
0024 # import traceback
0025 
0026 from idds.client.version import release_version
0027 from idds.client.clientmanager import ClientManager
0028 
0029 
0030 def setup(args):
0031     cm = ClientManager(host=args.host, setup_client=False)
0032     cm.setup_local_configuration(local_config_root=args.local_config_root,
0033                                  config=args.config, host=args.host,
0034                                  auth_type=args.auth_type,
0035                                  x509_proxy=args.x509_proxy,
0036                                  vo=args.vo,
0037                                  oidc_token=args.oidc_token)
0038     return cm
0039 
0040 
0041 def setup_oidc_token(args):
0042     cm = ClientManager(host=args.host, setup_client=True)
0043     cm.setup_oidc_token()
0044 
0045 def setup_oidc_client_token(args):
0046     cm = ClientManager(host=args.host, setup_client=True)
0047     cm.setup_oidc_client_token(issuer=args.oidc_issuer, client_id=args.oidc_client_id,
0048                                client_secret=args.oidc_client_secret, scope=args.oidc_scope,
0049                                audience=args.oidc_audience)
0050 
0051 def clean_oidc_token(args):
0052     cm = ClientManager(host=args.host, setup_client=False)
0053     cm.clean_oidc_token()
0054 
0055 
0056 def check_oidc_token_status(args):
0057     cm = ClientManager(host=args.host, setup_client=False)
0058     cm.check_oidc_token_status()
0059 
0060 
0061 def refresh_oidc_token(args):
0062     cm = ClientManager(host=args.host, setup_client=False)
0063     cm.refresh_oidc_token()
0064 
0065 
0066 def ping(args):
0067     cm = ClientManager(host=args.host, setup_client=False)
0068     status = cm.ping()
0069     print(status)
0070 
0071 
0072 def get_requests_status(args):
0073     wm = ClientManager(host=args.host, setup_client=True)
0074     ret = wm.get_status(request_id=args.request_id, workload_id=args.workload_id, with_detail=args.with_detail)
0075     print(ret)
0076 
0077 
0078 def abort_requests(args):
0079     wm = ClientManager(host=args.host, setup_client=True)
0080     ret = wm.abort(request_id=args.request_id, workload_id=args.workload_id)
0081     print(ret)
0082 
0083 
0084 def abort_tasks(args):
0085     wm = ClientManager(host=args.host, setup_client=True)
0086     ret = wm.abort_task(request_id=args.request_id, workload_id=args.workload_id, task_id=args.task_id)
0087     print(ret)
0088 
0089 
0090 def retry_requests(args):
0091     wm = ClientManager(host=args.host, setup_client=True)
0092     ret = wm.retry(request_id=args.request_id, workload_id=args.workload_id)
0093     print(ret)
0094 
0095 
0096 def download_logs(args):
0097     wm = ClientManager(host=args.host, setup_client=True)
0098     wm.download_logs(request_id=args.request_id, workload_id=args.workload_id, dest_dir=args.dest_dir, filename=args.dest_filename)
0099 
0100 
0101 def upload_to_cacher(args):
0102     wm = ClientManager(host=args.host, setup_client=True)
0103     wm.upload_to_cacher(args.filename)
0104 
0105 
0106 def download_from_cacher(args):
0107     wm = ClientManager(host=args.host, setup_client=True)
0108     wm.download_from_cacher(args.filename)
0109 
0110 
0111 def get_hyperparameters(args):
0112     wm = ClientManager(host=args.host, setup_client=True)
0113     ret = wm.get_hyperparameters(workload_id=args.workload_id, request_id=args.request_id, id=args.id, status=args.status, limit=args.limit)
0114     # print(json.dumps(ret, sort_keys=True, indent=4))
0115     for k in ret:
0116         print(k)
0117 
0118 
0119 def update_hyperparameter(args):
0120     wm = ClientManager(host=args.host, setup_client=True)
0121     ret = wm.update_hyperparameter(workload_id=args.workload_id, request_id=args.request_id, id=args.id, loss=args.loss)
0122     print(ret)
0123 
0124 
0125 def get_messages(args):
0126     wm = ClientManager(host=args.host, setup_client=True)
0127     ret = wm.get_messages(request_id=args.request_id, workload_id=args.workload_id)
0128     status, msgs = ret
0129     print("status: %s" % status)
0130     print("messages: %s" % str(msgs))
0131 
0132 
0133 def get_parser():
0134     """
0135     Return the argparse parser.
0136     """
0137     oparser = argparse.ArgumentParser(prog=os.path.basename(sys.argv[0]), add_help=True)
0138     subparsers = oparser.add_subparsers()
0139 
0140     # common items
0141     oparser.add_argument('--version', action='version', version='%(prog)s ' + release_version)
0142     oparser.add_argument('--local_config_root', dest="local_config_root", default=None, help="The root path of local configurations. Default is ~/.idds/.")
0143     oparser.add_argument('--config', dest=None, help="The iDDS configuration file to use. Default is ~/.idds/idds.cfg.")
0144     oparser.add_argument('--verbose', '-v', default=False, action='store_true', help="Print more verbose output.")
0145     oparser.add_argument('-H', '--host', dest="host", metavar="ADDRESS", help="The iDDS Rest host. For example: https://hostname:443/idds")
0146 
0147     # setup
0148     setup_parser = subparsers.add_parser('setup', help='Setup local configuration')
0149     setup_parser.set_defaults(function=setup)
0150     setup_parser.add_argument('--host', dest="host", metavar="ADDRESS", help="The iDDS Rest host. For example: https://hostname:443/idds")
0151     setup_parser.add_argument('--auth_type', dest='auth_type', action='store', choices=['x509_proxy', 'oidc'], default=None, help='The auth_type in [x509_proxy, oidc]. Default is x509_proxy.')
0152     setup_parser.add_argument('--x509_proxy', dest='x509_proxy', action='store', default=None, help='The x509 proxy path. Default is /tmp/x509up_u%d.' % os.geteuid())
0153     setup_parser.add_argument('--vo', dest='vo', action='store', default=None, help='The virtual organization for authentication.')
0154     setup_parser.add_argument('--oidc_token', dest='oidc_token', default=None, help='The oidc token path. Default is {local_config_root}/.oidc_token.')
0155 
0156     # setup token
0157     token_setup_parser = subparsers.add_parser('setup_oidc_token', help='Setup authentication token')
0158     token_setup_parser.set_defaults(function=setup_oidc_token)
0159     # token_setup_parser.add_argument('--oidc_audience', dest='oidc_audience', default=None, help='The oidc audience')
0160     # token_setup_parser.add_argument('--oidc_scope', dest='oidc_scope', default=None, help='The oidc scope')
0161 
0162     # token_setup_parser.add_argument('--oidc_refresh_lifetime', dest='oidc_refresh_lifetime', default=None, help='The oidc refresh lifetime')
0163     # token_setup_parser.add_argument('--oidc_issuer', dest='oidc_issuer', default=None, help='The oidc issuer')
0164     # token_setup_parser.add_argument('--oidc_audience', dest='oidc_audience', default=None, help='The oidc audience')
0165     # token_setup_parser.add_argument('--oidc_token', dest='oidc_token', default=None, help='The oidc token path. Default is {local_config_root}/.oidc_token.')
0166     # token_setup_parser.add_argument('--oidc_auto', dest='oidc_auto', default=False, action='store_true', help='Get oidc token automatically, requiring oidc_username and oidc_password')
0167     # token_setup_parser.add_argument('--oidc_username', dest='oidc_username', default=None, help='The oidc username for getting oidc token, with --oidc_auto')
0168     # token_setup_parser.add_argument('--oidc_password', dest='oidc_password', default=None, help='The oidc password for getting oidc token, with --oidc_auto')
0169     # token_setup_parser.add_argument('--oidc_scope', dest='oidc_scope', default=None, help='The oidc scope. Default is openid profile.')
0170     # token_setup_parser.add_argument('--oidc_polling', dest='oidc_polling', default=False, help='whether polling oidc')
0171     # token_setup_parser.add_argument('--saml_username', dest='saml_username', default=None, help='The SAML username')
0172     # token_setup_parser.add_argument('--saml_password', dest='saml_password', default=None, help='The saml password')
0173 
0174     token_setup_parser = subparsers.add_parser('setup_oidc_client_token', help='Setup authentication client token')
0175     token_setup_parser.set_defaults(function=setup_oidc_client_token)
0176     token_setup_parser.add_argument('--oidc_issuer', dest='oidc_issuer', default=None, help='The oidc issuer')
0177     token_setup_parser.add_argument('--oidc_client_id', dest='oidc_client_id', default=None, help='The oidc client id')
0178     token_setup_parser.add_argument('--oidc_client_secret', dest='oidc_client_secret', default=None, help='The oidc client secret')
0179     token_setup_parser.add_argument('--oidc_audience', dest='oidc_audience', default=None, help='The oidc audience')
0180     token_setup_parser.add_argument('--oidc_scope', dest='oidc_scope', default=None, help='The oidc scope')
0181 
0182     # clean token
0183     token_clean_parser = subparsers.add_parser('clean_oidc_token', help='Clean authentication token')
0184     token_clean_parser.set_defaults(function=clean_oidc_token)
0185 
0186     # check token status
0187     token_check_parser = subparsers.add_parser('get_oidc_token_info', help='Check authentication token information')
0188     token_check_parser.set_defaults(function=check_oidc_token_status)
0189 
0190     # refresh token
0191     token_refresh_parser = subparsers.add_parser('refresh_oidc_token', help='Refresh authentication token')
0192     token_refresh_parser.set_defaults(function=refresh_oidc_token)
0193 
0194     # ping
0195     ping_parser = subparsers.add_parser('ping', help='Ping idds server')
0196     ping_parser.set_defaults(function=ping)
0197 
0198     # get request status
0199     req_status_parser = subparsers.add_parser('get_requests_status', help='Get the requests status')
0200     req_status_parser.set_defaults(function=get_requests_status)
0201     req_status_parser.add_argument('--request_id', dest='request_id', action='store', type=int, help='The request id')
0202     req_status_parser.add_argument('--workload_id', dest='workload_id', action='store', type=int, help='The workload id')
0203     req_status_parser.add_argument('--with_detail', dest='with_detail', default=False, action='store_true', help='To show detail status')
0204 
0205     # abort requests
0206     abort_parser = subparsers.add_parser('abort_requests', help='Abort requests')
0207     abort_parser.set_defaults(function=abort_requests)
0208     abort_parser.add_argument('--request_id', dest='request_id', action='store', type=int, help='The request id')
0209     abort_parser.add_argument('--workload_id', dest='workload_id', action='store', type=int, help='The workload id')
0210 
0211     # abort tasks
0212     abort_tasks_parser = subparsers.add_parser('abort_tasks', help='Abort tasks')
0213     abort_tasks_parser.set_defaults(function=abort_tasks)
0214     abort_tasks_parser.add_argument('--request_id', dest='request_id', action='store', type=int, help='The request id')
0215     abort_tasks_parser.add_argument('--workload_id', dest='workload_id', action='store', type=int, help='The workload id')
0216     abort_tasks_parser.add_argument('--task_id', dest='task_id', action='store', type=int, help='The task id')
0217 
0218     # retry requests
0219     retry_parser = subparsers.add_parser('retry_requests', help='Retry requests')
0220     retry_parser.set_defaults(function=retry_requests)
0221     retry_parser.add_argument('--request_id', dest='request_id', action='store', type=int, help='The request id')
0222     retry_parser.add_argument('--workload_id', dest='workload_id', action='store', type=int, help='The workload id')
0223 
0224     # download logs
0225     log_parser = subparsers.add_parser('download_logs', help='Download logs')
0226     log_parser.set_defaults(function=download_logs)
0227     log_parser.add_argument('--request_id', dest='request_id', action='store', type=int, help='The request id')
0228     log_parser.add_argument('--workload_id', dest='workload_id', action='store', type=int, help='The workload id')
0229     log_parser.add_argument('--dest_dir', dest='dest_dir', action='store', default='./', help='The destination directory')
0230     log_parser.add_argument('--dest_filename', dest='dest_filename', action='store', default=None, help='The destination filename')
0231 
0232     # upload a file to the cacher
0233     upload_parser = subparsers.add_parser('upload_to_cacher', help='Upload a file to the iDDS cacher on the server')
0234     upload_parser.set_defaults(function=upload_to_cacher)
0235     upload_parser.add_argument('--filename', dest='filename', action='store', default=None, help='The source filename. The destination filename on the server will be the base name of the file')
0236 
0237     # download a file from the cacher
0238     download_parser = subparsers.add_parser('download_from_cacher', help='Download a file from the iDDS cacher on the server')
0239     download_parser.set_defaults(function=download_from_cacher)
0240     download_parser.add_argument('--filename', dest='filename', action='store', default=None, help='The destination filename. The source filename on the server will be the base name of the file')
0241 
0242     # get hyperparameters
0243     hp_get_parser = subparsers.add_parser('get_hyperparameters', help='Get hyperparameters')
0244     hp_get_parser.set_defaults(function=get_hyperparameters)
0245     hp_get_parser.add_argument('--request_id', dest='request_id', action='store', type=int, help='The request id')
0246     hp_get_parser.add_argument('--workload_id', dest='workload_id', action='store', type=int, help='The workload id')
0247     hp_get_parser.add_argument('--id', dest='id', action='store', type=int, help='The id of the hyperparameter')
0248     hp_get_parser.add_argument('--status', dest='status', action='store', help='Retrieve hyperparameters with defined status')
0249     hp_get_parser.add_argument('--limit', dest='limit', action='store', type=int, help='Limit number of hyperparameters')
0250 
0251     # update hyperparameter
0252     hp_update_parser = subparsers.add_parser('update_hyperparameter', help='Update the hyperparameter result')
0253     hp_update_parser.set_defaults(function=update_hyperparameter)
0254     hp_update_parser.add_argument('--request_id', dest='request_id', action='store', type=int, help='The request id')
0255     hp_update_parser.add_argument('--workload_id', dest='workload_id', action='store', type=int, help='The workload id')
0256     hp_update_parser.add_argument('--id', dest='id', action='store', type=int, help='The id of the hyperparameter')
0257     hp_update_parser.add_argument('--loss', dest='loss', action='store', type=float, help='The loss result to be updated')
0258 
0259     # get messages
0260     get_messages_parser = subparsers.add_parser('get_messages', help='Get messages')
0261     get_messages_parser.set_defaults(function=get_messages)
0262     get_messages_parser.add_argument('--request_id', dest='request_id', action='store', type=int, help='The request id')
0263     get_messages_parser.add_argument('--workload_id', dest='workload_id', action='store', type=int, help='The workload id')
0264 
0265     return oparser
0266 
0267 
0268 if __name__ == '__main__':
0269     arguments = sys.argv[1:]
0270     # set the configuration before anything else, if the config parameter is present
0271     for argi in range(len(arguments)):
0272         if arguments[argi] == '--config' and (argi + 1) < len(arguments):
0273             os.environ['IDDS_CONFIG'] = arguments[argi + 1]
0274 
0275     oparser = get_parser()
0276     argcomplete.autocomplete(oparser)
0277 
0278     if len(sys.argv) == 1:
0279         oparser.print_help()
0280         sys.exit(-1)
0281 
0282     args = oparser.parse_args(arguments)
0283 
0284     try:
0285         if args.verbose:
0286             logging.getLogger().setLevel(logging.DEBUG)
0287         start_time = time.time()
0288 
0289         result = args.function(args)
0290         end_time = time.time()
0291         if args.verbose:
0292             print("Completed in %-0.4f sec." % (end_time - start_time))
0293         sys.exit(0)
0294     except Exception as error:
0295         logging.error("Strange error: {0}".format(error))
0296         # logging.error(traceback.format_exc())
0297         sys.exit(-1)