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)