def execute(argv: Sequence[str] = None): """Execute the help command.""" from . import available_commands, load_command, PROG parser = ArgumentParser(prog=PROG) parser.add_argument( "-v", "--version", action="store_true", help="print application version and exit", ) subparsers = parser.add_subparsers() for cmd in available_commands(): if cmd["name"] == "help": continue module = load_command(cmd["name"]) subparser = subparsers.add_parser(cmd["name"], help=cmd["summary"]) module.init_argument_parser(subparser) args = parser.parse_args(argv) if args.version: print(__version__) else: parser.print_help()
def parse_args(args): parser = ArgumentParser( config_file_parser_class=YAMLConfigFileParser, formatter_class=argparse.RawDescriptionHelpFormatter, default_config_files=['~/.config/seal', '~/.seal'], description=textwrap.dedent("""\ PowerfulSeal The Chaos Engineering tool for Kubernetes """), ) # General settings parser.add_argument( '-c', '--config', is_config_file=True, env_var="CONFIG", help='Config file path', ) parser.add_argument('-v', '--verbose', action='count', help='Verbose logging.') parser.add_argument('-s', '--silent', action='count', help='Silent logging.') parser.add_argument( '-V', '--version', action='version', version='%(prog)s {version}'.format( version=powerfulseal.version.__version__), help='Version.', ) # subparsers subparsers = parser.add_subparsers( title='MODES OF OPERATION', description=( 'Pick one of the following options to start the Seal in the ' 'specified mode. Learn more at ' 'https://github.com/bloomberg/powerfulseal#introduction'), dest='mode') ########################################################################## # INTERACTIVE MODE ########################################################################## parser_interactive = subparsers.add_parser( 'interactive', help=( 'Starts an interactive CLI, which allows to manually issue ' 'commands on pods and nodes and provides a sweet autocomplete. ' 'If you\'re reading this for the first time, you should probably ' 'start here. '), ) add_common_options(parser_interactive) ########################################################################## # AUTONOMOUS MODE ########################################################################## parser_autonomous = subparsers.add_parser( 'autonomous', help= ('This is the main mode of operation. It reads the policy file and executes it.' ), ) add_common_options(parser_autonomous) add_policy_options(parser_autonomous) add_metrics_options(parser_autonomous) # web ui settings web_args = parser_autonomous.add_argument_group(title='Web UI settings') web_args.add_argument('--headless', help='Doesn\'t start the UI, just runs the policy', action='store_true') web_args.add_argument('--host', help='Specify host for the PowerfulSeal web server', default=os.environ.get('HOST', '0.0.0.0')) web_args.add_argument('--port', help='Specify port for the PowerfulSeal web server', default=int(os.environ.get('PORT', '8000')), type=check_valid_port) web_args.add_argument( '--accept-proxy-headers', help='Set this flag for the webserver to accept X-Forwarded-* headers', action='store_true') ########################################################################## # LABEL MODE ########################################################################## parser_label = subparsers.add_parser( 'label', help=('Starts in label mode. ' 'It reads Kubernetes pods in a specified namespace, and checks ' ' their \'seal/*\' labels to decide which ones to kill.' 'There is no policy needed in this mode. ' 'To learn about supported labels, read more at ' 'https://github.com/bloomberg/powerfulseal/ '), ) add_common_options(parser_label) add_namespace_options(parser_label) add_run_options(parser_label) add_metrics_options(parser_label) ########################################################################## # VALIDATE POLICY MODE ########################################################################## parser_validate_policy = subparsers.add_parser( 'validate', help=('Validates any file against the policy schema, returns.' 'You can use this to check that your policy is correct, ' 'before using it in autonomous mode.')) add_policy_options(parser_validate_policy) return parser.parse_args(args=args)
def parse_args(args): parser = ArgumentParser( config_file_parser_class=YAMLConfigFileParser, formatter_class=argparse.RawDescriptionHelpFormatter, default_config_files=['~/.config/seal', '~/.seal'], description=textwrap.dedent("""\ PowerfulSeal The Chaos Engineering tool for Kubernetes """), ) # General settings parser.add_argument( '-c', '--config', is_config_file=True, env_var="CONFIG", help='Config file path', ) parser.add_argument('-v', '--verbose', action='count', help='Verbose logging.') # subparsers subparsers = parser.add_subparsers( title='MODES OF OPERATION', description=( 'Pick one of the following options to start the Seal in the ' 'specified mode. Learn more at ' 'https://github.com/bloomberg/powerfulseal#introduction'), dest='mode') ########################################################################## # INTERACTIVE MODE ########################################################################## parser_interactive = subparsers.add_parser( 'interactive', help=( 'Starts an interactive CLI, which allows to manually issue ' 'commands on pods and nodes and provides a sweet autocomplete. ' 'If you\'re reading this for the first time, you should probably ' 'start here. ' 'This is a DAEMONLESS mode of operation.'), ) add_common_options(parser_interactive) ########################################################################## # AUTONOMOUS MODE ########################################################################## parser_autonomous = subparsers.add_parser( 'autonomous', help=('Starts in autonomous mode. ' 'This is the main mode of operation. The Seal reads the policy ' 'file and executes it indefinitely. ' 'It works on nodes and pods. ' 'This is a DAEMONLESS mode of operation.'), ) add_common_options(parser_autonomous) add_policy_options(parser_autonomous) add_metrics_options(parser_autonomous) # web ui settings web_args = parser_autonomous.add_argument_group(title='Web UI settings') web_args.add_argument('--headless', help='Doesn\'t start the UI, just runs the policy', action='store_true') web_args.add_argument('--host', help='Specify host for the PowerfulSeal web server', default=os.environ.get('HOST', '127.0.0.1')) web_args.add_argument('--port', help='Specify port for the PowerfulSeal web server', default=int(os.environ.get('PORT', '8080')), type=check_valid_port) ########################################################################## # LABEL MODE ########################################################################## parser_label = subparsers.add_parser( 'label', help=('Starts in label mode. ' 'It reads Kubernetes pods in a specified namespace, and checks ' ' their \'seal/*\' labels to decide which ones to kill.' 'There is no policy needed in this mode. ' 'To learn about supported labels, read more at ' 'https://github.com/bloomberg/powerfulseal/ ' 'This is a DAEMONLESS mode of operation. '), ) add_common_options(parser_label) add_namespace_options(parser_label) add_run_options(parser_label) add_metrics_options(parser_label) ########################################################################## # DEMO MODE ########################################################################## parser_demo = subparsers.add_parser( 'demo', help=('Starts in demo mode. ' 'It reads Kubernetes pods in specified namespaces, and reads ' 'HEAPSTER metrics to guess what\'s worth killing. ' 'This is a DAEMONLESS mode of operation. '), ) add_common_options(parser_demo) add_namespace_options(parser_demo) add_run_options(parser_demo) add_metrics_options(parser_demo) demo_options = parser_demo.add_argument_group(title='Heapster settings') demo_options.add_argument( '--heapster-path', help='Base path of Heapster without trailing slash', required=True) demo_options.add_argument('--aggressiveness', help='Aggressiveness of demo mode (default: 3)', default=3, type=int) ########################################################################## # VALIDATE POLICY MODE ########################################################################## parser_validate_policy = subparsers.add_parser( 'validate', help=('Validates any file against the policy schema, returns.' 'You can use this to check that your policy is correct, ' 'before using it in autonomous mode.')) add_policy_options(parser_validate_policy) return parser.parse_args(args=args)
def main(debug=False, options_flag=False): parser = ArgumentParser() parser.add( "-V", "--version", action="version", version=f"layout-generator version: {__version__}", ) subparsers = parser.add_subparsers(title="commands") generate_parser = subparsers.add_parser( "generate", help="generate discrete layout data") generate_parser = get_parser_discrete(generate_parser) generate_parser.set_defaults(handle=handle_generate, parser=generate_parser) generate_c_parser = subparsers.add_parser( "generate_c", help="generate continuous layout data") generate_c_parser = get_parser_continuous(generate_c_parser) generate_c_parser.set_defaults(handle=handle_generate_c, parser=generate_c_parser) generate_c_power_parser = subparsers.add_parser( "generate_c_power", help="generate continuous layout data with sampling component powers", ) generate_c_power_parser = get_parser_continuous_power( generate_c_power_parser) generate_c_power_parser.set_defaults(handle=handle_generate_c_power, parser=generate_c_power_parser) plot_parser = subparsers.add_parser("plot", help="plot layout data") plot_parser = get_plot_parser(plot_parser) plot_parser.set_defaults(handle=handle_plot) convert_parser = subparsers.add_parser("convert", help="convert layout data") convert_parser = get_convert_parser(convert_parser) convert_parser.set_defaults(handle=handle_convert) makeconfig_parser = subparsers.add_parser("makeconfig", help="make template config") makeconfig_parser = get_parser_makeconfig(makeconfig_parser) makeconfig_parser.set_defaults(handle=handle_makeconfig) options, _ = parser.parse_known_args() if hasattr(options, "test") and options.test: # 仅测试,输出参数 print(parser.format_values()) print(options) # print(sys.argv) parser.exit() if debug: del_parser(options) return parser, options if hasattr(options, "handle"): options.handle(options) if options_flag: return options