Select Git revision
demo4-2-scale-out-add-worker.py
Forked from
Sebastian Rieger / cloud-computing-msc-ai-examples
Source project has a limited visibility.
cli.py 3.69 KiB
import argparse
import logging
from pathlib import Path
import sys
from rmmd.update import AbortedByUser, UpdateOptions, update
from rmmd.validate import RmmdValidationError, validate_rmmd
def _add_validate_args(parser: argparse.ArgumentParser):
parser.add_argument(
'--schema',
help='Path to schema file',
metavar='SCHEMA',
required=True,
type=Path)
parser.add_argument(
'rmmd',
help='Path to RMMD file to validate',
metavar='RMMD',
type=Path)
def _add_update_args(parser: argparse.ArgumentParser):
parser.add_argument(
'source',
help='File to take data from',
metavar='SOURCE',
type=Path)
parser.add_argument(
'target',
help='File to update (will be overwritten!)',
metavar='TARGET',
type=Path)
parser.add_argument(
'--root',
help='Root directory of the project. Default: current working directory.',
metavar='ROOT',
type=Path,
default=Path.cwd()
)
parser.add_argument(
'--species',
help='Path to JSON/YAML file containing species information',
metavar='SPECIES_FILE',
type=Path,
default=None
)
## mutually exclusive group:
backup_grp = parser.add_mutually_exclusive_group()
backup_grp.add_argument(
'--backup',
help='Create a backup of the target file',
action='store_true',
dest='backup',
default=True
)
backup_grp.add_argument(
'--no-backup',
help='Do not create a backup of the target file',
action='store_false',
dest='backup',
default=True
)
def _parent_parser() -> argparse.ArgumentParser:
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument(
'-v', '--verbose',
help='Enable verbose logging',
action='store_true'
)
return parent_parser
def main():
logger = logging.getLogger()
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(message)s')
# use sdtout as logging.INFO is used as standard output for user
handler = logging.StreamHandler(stream=sys.stdout)
handler.setFormatter(formatter)
logger.addHandler(handler)
parent = _parent_parser() # contains arguments that should always be there
parser = argparse.ArgumentParser(parents=[parent])
subparsers = parser.add_subparsers(dest='_cmd_')
validate_parser = subparsers.add_parser('validate', parents= [parent])
_add_validate_args(validate_parser)
update_parser = subparsers.add_parser('update', parents= [parent])
_add_update_args(update_parser)
args = parser.parse_args()
if args.verbose:
logger.setLevel(logging.DEBUG)
if args._cmd_ == 'validate':
try:
validate_rmmd(args.rmmd, args.schema)
except RmmdValidationError as err:
logging.error(err)
exit(1)
except Exception as err:
logging.error(err)
logging.debug('An error occurred.', exc_info=err)
exit(1)
else:
logging.info('Validation successful.')
elif args._cmd_ == 'update':
try:
opts = UpdateOptions(
root=args.root,
species_json=args.species,
backup=args.backup
)
update(args.source, args.target, opts)
except AbortedByUser as err:
logging.info(err)
exit(0)
except Exception as err:
logging.error(err)
logging.debug('An error occurred.', exc_info=err)
exit(1)
else:
parser.print_help()
if __name__ == '__main__':
main()