Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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