コード例 #1
0
    def a(self):
        parser = ArgumentParser(
            auto_env_var_prefix=ENV_VAR_PREFIX,
            allow_abbrev=False,
            formatter_class=argparse.ArgumentDefaultsHelpFormatter)
        parser.add_argument('--user',
                            required=False,
                            type=pwd.getpwnam,
                            help='Change process UID')

        group = parser.add_argument_group('API Options')
        group.add_argument('--api-address',
                           default='0.0.0.0',
                           help='IPv4/IPv6 address API server would listen on')
        group.add_argument('--api-port',
                           type=int,
                           default=8081,
                           help='TCP port API server would listen on')

        group = parser.add_argument_group('Logging options')
        group.add_argument('--log-level',
                           default='info',
                           choices=('debug', 'info', 'warning', 'error',
                                    'fatal'))
        group.add_argument('--log-format',
                           choices=LogFormat.choices(),
                           default='color')
コード例 #2
0
def load_argument_groups(parser: ArgumentParser, *groups: Type[ArgumentGroup]):
    """Log a set of argument groups into a parser.

    Returns:
        A callable to convert loaded arguments into a settings dictionary

    """
    group_inst = []
    for group in groups:
        g_parser = parser.add_argument_group(group.GROUP_NAME)
        inst = group()
        inst.add_arguments(g_parser)
        group_inst.append(inst)

    def get_settings(args: Namespace):
        settings = {}
        try:
            for group in group_inst:
                settings.update(group.get_settings(args))
        except ArgsParseError as e:
            parser.print_help()
            raise e
        return settings

    return get_settings
コード例 #3
0
def parse_arguments():
    parser = ArgumentParser(description='Arguments For edge2vec')

    group = parser.add_argument_group('Base Configs')
    group.add_argument('-i',
                       '--input',
                       help='path to the input graph file',
                       type=str,
                       required=True)
    # group.add_argument('-o', '--output', help='path to the output embedding file', type=str, required=True)
    group.add_argument('-m',
                       '--model',
                       help='the output directory of model files',
                       type=str,
                       required=True)
    group.add_argument('-n',
                       '--num',
                       help='the maximum num of the node',
                       type=int,
                       required=True)
    group.add_argument('-s',
                       '--sample',
                       help='the num of negative samples',
                       type=int,
                       required=True)

    args = parser.parse_args()
    return args
コード例 #4
0
def add_authentication_group(parser: configargparse.ArgumentParser):
    auth_group = parser.add_argument_group(
        title="Authentication",
        description=clr_extra(
            "Authentication details are configured (and can be copied from) AppStore Connect->Users & Access->Keys."
        ),
    )
    auth_group.add_argument("--issuer-id", required=True, help="Issuer ID.")
    auth_group.add_argument("--key-id", required=True, help="Key ID.")
    key_group = auth_group.add_mutually_exclusive_group(required=True)
    key_group.add_argument("--key", help="Private Key as a string.")
    key_group.add_argument(
        "--key-file",
        type=configargparse.FileType(mode="r"),
        help="Private Key from a filepath.",
    )
コード例 #5
0
def add_app_id_group(parser: configargparse.ArgumentParser):
    app_group = parser.add_argument_group(
        title="App ID",
        description=clr_extra(
            "App can either be identified by App ID (integer) or Bundle ID (string)."
        ),
    )
    key_group = app_group.add_mutually_exclusive_group(required=True)
    key_group.add_argument(
        "--app-id",
        type=int,
        help="The integer App ID assigned by the appstore.",
    )
    key_group.add_argument(
        "--bundle-id",
        help='The App\'s Bundle ID in the form "com.example.myapp".',
    )
コード例 #6
0
def add_version_filters_group(parser: configargparse.ArgumentParser):
    filter_group = parser.add_argument_group(title="Result filters", )
    add_platform_filter_argument(filter_group)
    add_editable_filter_argument(filter_group)
    add_live_filter_argument(filter_group)
    add_version_state_filter_argument(filter_group)
コード例 #7
0
def add_global_group(parser: configargparse.ArgumentParser):
    global_group = parser.add_argument_group(title="General", )
    add_help_argument(global_group)
    add_version_argument(global_group)
    add_config_argument(global_group)
    add_log_level_argument(global_group)
コード例 #8
0
ファイル: __main__.py プロジェクト: zer0nka/backendschool2019
from analyzer.api.app import create_app
from analyzer.utils.argparse import clear_environ, positive_int
from analyzer.utils.pg import DEFAULT_PG_URL

ENV_VAR_PREFIX = 'ANALYZER_'

parser = ArgumentParser(auto_env_var_prefix=ENV_VAR_PREFIX,
                        allow_abbrev=False,
                        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--user',
                    required=False,
                    type=pwd.getpwnam,
                    help='Change process UID')

group = parser.add_argument_group('API Options')
group.add_argument('--api-address',
                   default='0.0.0.0',
                   help='IPv4/IPv6 address API server would listen on')
group.add_argument('--api-port',
                   type=positive_int,
                   default=8081,
                   help='TCP port API server would listen on')

group = parser.add_argument_group('PostgreSQL options')
group.add_argument('--pg-url',
                   type=URL,
                   default=URL(DEFAULT_PG_URL),
                   help='URL to use to connect to the database')
group.add_argument('--pg-pool-min-size',
                   type=int,
コード例 #9
0
parser = ArgumentParser(auto_env_var_prefix="APP_")

parser.add_argument('-f', '--forks', type=int, default=4)
parser.add_argument('-D', '--debug', action='store_true')

parser.add_argument('--log-level',
                    default='info',
                    choices=('debug', 'info', 'warning', 'error', 'fatal'))

parser.add_argument('--log-format',
                    choices=LogFormat.choices(),
                    default='color')

parser.add_argument('--pool-size', default=4, type=int)

group = parser.add_argument_group('HTTP settings')
group.add_argument('--http-address', type=str, default='0.0.0.0')
group.add_argument('--http-port', type=int, default=8081)
group.add_argument('-S', '--http-secret', type=str, required=True)

group = parser.add_argument_group('Carbon settings')
group.add_argument('-H',
                   '--carbon-host',
                   type=str,
                   required=True,
                   help="TCP protocol host")

group.add_argument('-P',
                   '--carbon-port',
                   type=int,
                   default=2003,
コード例 #10
0
                    type=pwd.getpwnam)
parser.add_argument("-D", "--debug", action="store_true")

parser.add_argument(
    "--log-level",
    default="info",
    choices=("debug", "info", "warning", "error", "fatal"),
)

parser.add_argument("--log-format",
                    choices=LogFormat.choices(),
                    default="color")

parser.add_argument("--pool-size", default=4, type=int)

group = parser.add_argument_group("HTTP settings")
group.add_argument("--http-address", type=str, default="0.0.0.0")
group.add_argument("--http-port", type=int, default=8080)
group.add_argument("--http-password", type=str, required=True)
group.add_argument("--http-login", type=str, default="admin")

group = parser.add_argument_group("Jaeger settings")
group.add_argument("--jaeger-route", type=URL, required=True)

group = parser.add_argument_group("Sender settings")
parser.add_argument("--sender-interval",
                    default=1,
                    type=float,
                    help="interval to send in seconds")

コード例 #11
0
log = logging.getLogger()
parser = ArgumentParser(auto_env_var_prefix="APP_")

parser.add_argument('-f', '--forks', type=int, default=4)
parser.add_argument('--pool-size', default=4, type=int)
parser.add_argument('-D', '--debug', action='store_true')

parser.add_argument('--log-level',
                    default='info',
                    choices=('debug', 'info', 'warning', 'error', 'fatal'))

parser.add_argument('--log-format',
                    choices=LogFormat.choices(),
                    default='color')

group = parser.add_argument_group('TCP receiver settings')
group.add_argument('--tcp-listen', type=str, default='0.0.0.0')
group.add_argument('--tcp-port', type=int, default=2003)

group = parser.add_argument_group('UDP receiver settings')
group.add_argument('--udp-listen', type=str, default='0.0.0.0')
group.add_argument('--udp-port', type=int, default=2003)

group = parser.add_argument_group('Pickle receiver settings')
group.add_argument('--pickle-listen', type=str, default='0.0.0.0')
group.add_argument('--pickle-port', type=int, default=2004)

group = parser.add_argument_group('Carbon proxy server settings')
group.add_argument('-U', '--carbon-proxy-url', type=URL, required=True)
group.add_argument('-S', '--carbon-proxy-secret', type=str, required=True)
コード例 #12
0
    validate
from file_loader.daemon import AbstractDaemon

ENV_VAR_PREFIX = 'FILE_LOADER_'
BASE_STORAGE_DIR \
    = pathlib.Path(__file__).resolve().parent.parent / 'file_loader_storage'

parser = ArgumentParser(auto_env_var_prefix=ENV_VAR_PREFIX,
                        allow_abbrev=False,
                        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--user',
                    required=False,
                    type=pwd.getpwnam,
                    help='Change process UID')

group = parser.add_argument_group('API Options')
group.add_argument('--api-address',
                   default='0.0.0.0',
                   help='IPv4/IPv6 address API server would listen on')
group.add_argument('--api-port',
                   type=positive_int,
                   default=8081,
                   help='TCP port API server would listen on')

group = parser.add_argument_group('Logging options')
group.add_argument('--log-level',
                   default='INFO',
                   choices=('DEBUG', 'INFO', 'WARNING', 'ERROR', 'FATAL'))

group = parser.add_argument_group('Daemon options')
group.add_argument('--working_directory',
コード例 #13
0
ファイル: __main__.py プロジェクト: stefanhipfel/powerfulseal
def main(argv):
    """
        The main function to invoke the powerfulseal cli
    """

    # Describe our configuration.
    prog = ArgumentParser(
        config_file_parser_class=YAMLConfigFileParser,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        default_config_files=['~/.config/seal', '~/.seal'],
        description=textwrap.dedent("""\
            PowerfulSeal
        """),
    )
    # general settings
    prog.add_argument(
        '-c', '--config',
        is_config_file=True,
        env_var="CONFIG",
        help='Config file path',
    )
    prog.add_argument('-v', '--verbose',
        action='count',
        help='Verbose logging.'
    )

    # inventory related config
    inventory_options = prog.add_mutually_exclusive_group(required=True)
    inventory_options.add_argument('-i', '--inventory-file',
        default=os.environ.get("INVENTORY_FILE"),
        help='the inventory file of group of hosts to test'
    )
    inventory_options.add_argument('--inventory-kubernetes',
        default=os.environ.get("INVENTORY_KUBERNETES"),
        help='will read all cluster nodes as inventory',
        action='store_true',
    )

    # ssh related options
    args_ssh = prog.add_argument_group('SSH settings')
    args_ssh.add_argument(
        '--remote-user',
        default=os.environ.get("PS_REMOTE_USER", "cloud-user"),
        help="the of the user for the ssh connections",
    )
    args_ssh.add_argument(
        '--ssh-allow-missing-host-keys',
        default=False,
        action='store_true',
        help='Allow connection to hosts not present in known_hosts',
    )
    args_ssh.add_argument(
        '--ssh-path-to-private-key',
        default=os.environ.get("PS_PRIVATE_KEY"),
        help='Path to ssh private key',
    )

    # cloud driver related config
    cloud_options = prog.add_mutually_exclusive_group(required=True)
    cloud_options.add_argument('--open-stack-cloud',
        default=os.environ.get("OPENSTACK_CLOUD"),
        action='store_true',
        help="use OpenStack cloud provider",
    )
    cloud_options.add_argument('--aws-cloud',
        default=os.environ.get("AWS_CLOUD"),
        action='store_true',
        help="use AWS cloud provider",
    )
    cloud_options.add_argument('--no-cloud',
        default=os.environ.get("NO_CLOUD"),
        action='store_true',
        help="don't use cloud provider",
    )
    prog.add_argument('--open-stack-cloud-name',
        default=os.environ.get("OPENSTACK_CLOUD_NAME"),
        help="the name of the open stack cloud from your config file to use (if using config file)",
    )

    # KUBERNETES CONFIG
    args_kubernetes = prog.add_argument_group('Kubernetes settings')
    args_kubernetes.add_argument(
        '--kube-config',
        default=None,
        help='Location of kube-config file',
    )

    # policy-related settings
    policy_options = prog.add_mutually_exclusive_group(required=True)
    policy_options.add_argument('--validate-policy-file',
        help='reads the policy file, validates the schema, returns'
    )
    policy_options.add_argument('--run-policy-file',
        default=os.environ.get("POLICY_FILE"),
        help='location of the policy file to read',
    )
    policy_options.add_argument('--interactive',
        help='will start the seal in interactive mode',
        action='store_true',
    )

    args = prog.parse_args(args=argv)

    # Configure logging
    if not args.verbose:
        log_level = logging.ERROR
    elif args.verbose == 1:
        log_level = logging.WARNING
    elif args.verbose == 2:
        log_level = logging.INFO
    else:
        log_level = logging.DEBUG
    logging.basicConfig(
        stream=sys.stdout,
        level=log_level
    )
    logger = logging.getLogger(__name__)
    logger.setLevel(log_level)

    # build cloud provider driver
    logger.debug("Building the driver")
    if args.open_stack_cloud:
        logger.info("Building OpenStack driver")
        driver = OpenStackDriver(
            cloud=args.open_stack_cloud_name,
        )
    elif args.aws_cloud:
        logger.info("Building AWS driver")
        driver = AWSDriver()
    else:
        logger.info("No driver - some functionality disabled")
        driver = NoCloudDriver()


    # build a k8s client
    kube_config = args.kube_config
    logger.debug("Creating kubernetes client with config %d", kube_config)
    k8s_client = K8sClient(kube_config=kube_config)
    k8s_inventory = K8sInventory(k8s_client=k8s_client)

    # read the local inventory
    logger.debug("Fetching the inventory")
    if args.inventory_file:
        groups_to_restrict_to = read_inventory_file_to_dict(
            args.inventory_file
        )
    else:
        logger.info("Attempting to read the inventory from kubernetes")
        groups_to_restrict_to = k8s_client.get_nodes_groups()

    logger.debug("Restricting inventory to %s" % groups_to_restrict_to)

    inventory = NodeInventory(
        driver=driver,
        restrict_to_groups=groups_to_restrict_to,
    )
    inventory.sync()

    # create an executor
    executor = RemoteExecutor(
        user=args.remote_user,
        ssh_allow_missing_host_keys=args.ssh_allow_missing_host_keys,
        ssh_path_to_private_key=args.ssh_path_to_private_key,
    )

    if args.interactive:
        # create a command parser
        cmd = PSCmd(
            inventory=inventory,
            driver=driver,
            executor=executor,
            k8s_inventory=k8s_inventory,
        )
        while True:
            try:
                cmd.cmdloop()
            except KeyboardInterrupt:
                print()
                print("Ctrl-c again to quit")
            try:
                input()
            except KeyboardInterrupt:
                sys.exit(0)
    elif args.validate_policy_file:
        PolicyRunner.validate_file(args.validate_policy_file)
        print("All good, captain")
    elif args.run_policy_file:
        policy = PolicyRunner.validate_file(args.run_policy_file)
        PolicyRunner.run(policy, inventory, k8s_inventory, driver, executor)
コード例 #14
0
from aiomisc.log import LogFormat, basic_config
from configargparse import ArgumentParser, ArgumentDefaultsHelpFormatter
from yarl import URL

from analyzer.api.app import create_app
from analyzer.utils.consts import ENV_VAR_PREFIX, DEFAULT_PG_URL

parser = ArgumentParser(
    # Парсер будет искать переменные окружения с префиксом ANALYZER_,
    # например ANALYZER_API_ADDRESS и ANALYZER_API_PORT
    auto_env_var_prefix=ENV_VAR_PREFIX,
    # Покажет значения параметров по умолчанию
    formatter_class=ArgumentDefaultsHelpFormatter,
)

group = parser.add_argument_group("API Options")
group.add_argument(
    "--api-address",
    default="0.0.0.0",
    help="IPv4/IPv6 address API server would listen on",
)
group.add_argument("--api-port",
                   type=int,
                   default=8081,
                   help="TCP port API server would listen on")

group = parser.add_argument_group("PostgreSQL options")
group.add_argument(
    "--pg-url",
    type=URL,
    default=URL(DEFAULT_PG_URL),
コード例 #15
0
ファイル: main.py プロジェクト: iclementine/paddle-cookbook
 def add_arg(parser: ArgumentParser):
     g = parser.add_argument_group("My Model config")
     g.add_argument("--num_layers", type=int, help="number of layers")
     g.add_argument("--hidden_size", type=int, help="size of hidden layers")
コード例 #16
0
ファイル: __init__.py プロジェクト: victormf2/locust-plugins
def add_checks_arguments(parser: configargparse.ArgumentParser):
    checks = parser.add_argument_group(
        "locust-plugins - Checks",
        "Sets locust's exit code to 3 if any of these thresholds were not met",
    )
    checks.add_argument(
        "--check-rps",
        type=float,
        help="Requests per second",
        env_var="LOCUST_CHECK_RPS",
        default=0.0,
    )
    checks.add_argument(
        "--check-fail-ratio",
        type=float,
        help="Ratio of failed requests (0.0-1.0)",
        env_var="LOCUST_CHECK_FAIL_RATIO",
        default=1.0,
    )
    checks.add_argument(
        "--check-avg-response-time",
        type=float,
        help="Average response time",
        env_var="LOCUST_CHECK_AVG_RESPONSE_TIME",
        default=float("inf"),
    )
    run_info = parser.add_argument_group(
        "locust-plugins - Run info",
        "Extra run info for listeners",
    )
    run_info.add_argument(
        "--test-env",
        type=str,
        help='Name of target system/environment (e.g. "staging")',
        env_var="LOCUST_TEST_ENV",
        default="",
    )
    run_info.add_argument(
        "--test-version",
        type=str,
        help=
        "Identifier for version of the loadtest/system under test (typically a git hash or GUID)",
        env_var="LOCUST_TEST_VERSION",
        default=None,
    )
    run_info.add_argument(
        "--grafana-url",
        type=str,
        help="URL to Grafana dashboard (used by TimescaleListener)",
        env_var="LOCUST_GRAFANA_URL",
        default=None,
    )
    other = parser.add_argument_group("locust-plugins - Extras", )
    # fix for https://github.com/locustio/locust/issues/1085
    other.add_argument(
        "-i",
        "--iterations",
        type=int,
        help=
        "Dont run more than this number of task iterations and terminate once they have finished",
        env_var="LOCUST_ITERATIONS",
        default=0,
    )
    other.add_argument(
        "--console-stats-interval",
        type=int,
        help="Interval at which to print locust stats to command line",
        env_var="LOCUST_CONSOLE_STATS_INTERVAL",
        default=locust.stats.CONSOLE_STATS_INTERVAL_SEC,
    )
コード例 #17
0
def add_checks_arguments(parser: configargparse.ArgumentParser):
    checks = parser.add_argument_group(
        "locust-plugins - Checks",
        "Sets locust's exit code to 3 if any of these thresholds were not met",
    )
    checks.add_argument(
        "--check-rps",
        type=float,
        help="Requests per second",
        env_var="LOCUST_CHECK_RPS",
        default=0.0,
    )
    checks.add_argument(
        "--check-fail-ratio",
        type=float,
        help="Ratio of failed requests (0.0-1.0)",
        env_var="LOCUST_CHECK_FAIL_RATIO",
        default=1.0,
    )
    checks.add_argument(
        "--check-avg-response-time",
        type=float,
        help="Average response time",
        env_var="LOCUST_CHECK_AVG_RESPONSE_TIME",
        default=-1,
    )
    locust_dashboards = parser.add_argument_group(
        "locust-plugins - Locust Dashboards",
        "Timescale + Grafana Dashboards",
    )
    locust_dashboards.add_argument(
        "--timescale",
        action="store_true",
        help="Enable Timescale logging https://github.com/SvenskaSpel/locust-plugins/blob/master/locust_plugins/timescale/",
        env_var="LOCUST_TIMESCALE",
        default=False,
    )
    locust_dashboards.add_argument(
        "--grafana-url",
        type=str,
        help="URL to Grafana dashboard (used by Timescale listener)",
        env_var="LOCUST_GRAFANA_URL",
        default="http://localhost:3000/d/qjIIww4Zz?",
    )
    locust_dashboards.add_argument(
        "--pghost",
        type=str,
        help="",
        env_var="PGHOST",
        default="localhost",
    )
    locust_dashboards.add_argument(
        "--pgport",
        type=str,
        help="",
        env_var="PGPORT",
        default="",
    )
    locust_dashboards.add_argument(
        "--pgpassword",
        type=str,
        help="",
        env_var="PGPASSWORD",
        default="",
    )
    locust_dashboards.add_argument(
        "--pguser",
        type=str,
        help="",
        env_var="PGUSER",
        default="",
    )
    locust_dashboards.add_argument(
        "--pgdatabase",
        type=str,
        help="",
        env_var="PGDATABASE",
        default="",
    )
    run_info = parser.add_argument_group(
        "locust-plugins - Run info",
        "Extra run info for listeners",
    )
    run_info.add_argument(
        "--test-env",
        type=str,
        help='Name of target system/environment (e.g. "staging")',
        env_var="LOCUST_TEST_ENV",
        default="",
    )
    run_info.add_argument(
        "--profile",
        type=str,
        help="Load profile (a user-configurable string, like any config value it can be accessed using environment.parsed_options.profile)",
        env_var="LOCUST_PROFILE",
        default="",
    )
    run_info.add_argument(
        "--test-version",
        type=str,
        help="Identifier for version of the loadtest/system under test (typically a git hash or GUID)",
        env_var="LOCUST_TEST_VERSION",
        default="",
    )
    run_info.add_argument(
        "--description",
        type=str,
        env_var="LOCUST_DESCRIPTION",
        default="",
        help="Description of the test being run",
    )
    run_info.add_argument(
        "--run-id",
        type=str,
        help=configargparse.SUPPRESS,  # generated by locust-swarm, so it should not be set manually
        env_var="LOCUST_RUN_ID",
        default="",
    )
    run_info.add_argument(
        "--override-plan-name",
        type=str,
        help="Override test plan name in Timescale, default is to use locustfile file name",
        env_var="LOCUST_OVERRIDE_PLAN_NAME",
        default="",
    )
    other = parser.add_argument_group(
        "locust-plugins - Extras",
    )
    # fix for https://github.com/locustio/locust/issues/1085
    other.add_argument(
        "-i",
        "--iterations",
        type=int,
        help="Run at most this number of task iterations and terminate once they have finished",
        env_var="LOCUST_ITERATIONS",
        default=0,
    )
    other.add_argument(
        "--console-stats-interval",
        type=int,
        help="Interval at which to print locust stats to command line",
        env_var="LOCUST_CONSOLE_STATS_INTERVAL",
        default=locust.stats.CONSOLE_STATS_INTERVAL_SEC,
    )
    other.add_argument(
        "--ips",
        type=float,
        help="Replace all wait_time:s with global iterations-per-second limiter",
        env_var="LOCUST_IPS",
        default=0,
    )
コード例 #18
0
from experiment_collection_core import service_pb2_grpc
from experiment_collection_server.db.storage_postgresql import StoragePostgresql
from experiment_collection_server.db.storage_sqlite import StorageSQLite
from experiment_collection_server.service import Servicer

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)

ENV_VAR_PREFIX = 'EXPERIMENT_'

parser = ArgumentParser(
    auto_env_var_prefix=ENV_VAR_PREFIX, allow_abbrev=False,
    formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
group = parser.add_argument_group('Storage Options')
group.add_argument('--storage-type', type=str, help='Storage type (sqlite/postgres)')
group.add_argument('--sqlite-path', type=str, help='sqlite database path')
group.add_argument('--postgres-dsn', type=str, help='postgres connection string')
group = parser.add_argument_group('Server Options')
group.add_argument('--workers', type=int, default=1, help='Number of workers')
group.add_argument('--port', type=str, help='server port')
group = parser.add_argument_group('Token Options')
group.add_argument('--token', type=str, help='Token to create')
parser.add_argument('--action', type=str, help='Type of task (run/token)')


def _get_storage(args):
    if args.storage_type == 'sqlite':
        return StorageSQLite(args.sqlite_path)
    if args.storage_type == 'postgres':
コード例 #19
0
def parse_args(args):
    prog = ArgumentParser(
        config_file_parser_class=YAMLConfigFileParser,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        default_config_files=['~/.config/seal', '~/.seal'],
        description=textwrap.dedent("""\
            PowerfulSeal
        """),
    )

    # General settings
    prog.add_argument(
        '-c',
        '--config',
        is_config_file=True,
        env_var="CONFIG",
        help='Config file path',
    )
    prog.add_argument('-v',
                      '--verbose',
                      action='count',
                      help='Verbose logging.')

    # Policy
    # If --validate-policy-file is set, the other arguments are not used
    policy_options = prog.add_mutually_exclusive_group(required=True)
    policy_options.add_argument(
        '--validate-policy-file',
        help='reads the policy file, validates the schema, returns')
    policy_options.add_argument(
        '--run-policy-file',
        default=os.environ.get("POLICY_FILE"),
        help='location of the policy file to read',
    )
    policy_options.add_argument(
        '--interactive',
        help='will start the seal in interactive mode',
        action='store_true',
    )
    policy_options.add_argument(
        '--label',
        help='starts the seal in label mode',
        action='store_true',
    )
    policy_options.add_argument('--demo',
                                help='starts the demo mode',
                                action='store_true')

    is_validate_policy_file_set = '--validate-policy-file' in args

    # Demo mode
    demo_options = prog.add_argument_group()
    demo_options.add_argument(
        '--heapster-path', help='Base path of Heapster without trailing slash')
    demo_options.add_argument('--aggressiveness',
                              help='Aggressiveness of demo mode (default: 3)',
                              default=3,
                              type=int)

    # Arguments for both label and demo mode
    prog.add_argument(
        '--namespace',
        default='default',
        help='Namespace to use for label and demo mode, defaults to the default '
        'namespace (set to blank for all namespaces)')
    prog.add_argument('--min-seconds-between-runs',
                      help='Minimum number of seconds between runs',
                      default=0,
                      type=int)
    prog.add_argument('--max-seconds-between-runs',
                      help='Maximum number of seconds between runs',
                      default=300,
                      type=int)

    # Web
    prog.add_argument('--server',
                      help='Start PowerfulSeal in web server mode',
                      action='store_true')
    prog.add_argument('--server-host',
                      help='Specify host for the PowerfulSeal web server')
    prog.add_argument('--server-port',
                      help='Specify port for the PowerfulSeal web server')

    # Inventory
    inventory_options = prog.add_mutually_exclusive_group(
        required=not is_validate_policy_file_set)
    inventory_options.add_argument(
        '-i',
        '--inventory-file',
        default=os.environ.get("INVENTORY_FILE"),
        help='the inventory file of group of hosts to test')
    inventory_options.add_argument(
        '--inventory-kubernetes',
        default=os.environ.get("INVENTORY_KUBERNETES"),
        help='will read all cluster nodes as inventory',
        action='store_true',
    )

    # SSH
    args_ssh = prog.add_argument_group('SSH settings')
    args_ssh.add_argument(
        '--remote-user',
        default=os.environ.get("PS_REMOTE_USER", "cloud-user"),
        help="the of the user for the ssh connections",
    )
    args_ssh.add_argument(
        '--ssh-allow-missing-host-keys',
        default=False,
        action='store_true',
        help='Allow connection to hosts not present in known_hosts',
    )
    args_ssh.add_argument(
        '--ssh-path-to-private-key',
        default=os.environ.get("PS_PRIVATE_KEY"),
        help='Path to ssh private key',
    )

    # Cloud Driver
    cloud_options = prog.add_mutually_exclusive_group(
        required=not is_validate_policy_file_set)
    cloud_options.add_argument(
        '--open-stack-cloud',
        default=os.environ.get("OPENSTACK_CLOUD"),
        action='store_true',
        help="use OpenStack cloud provider",
    )
    cloud_options.add_argument(
        '--aws-cloud',
        default=os.environ.get("AWS_CLOUD"),
        action='store_true',
        help="use AWS cloud provider",
    )
    cloud_options.add_argument(
        '--no-cloud',
        default=os.environ.get("NO_CLOUD"),
        action='store_true',
        help="don't use cloud provider",
    )
    prog.add_argument(
        '--open-stack-cloud-name',
        default=os.environ.get("OPENSTACK_CLOUD_NAME"),
        help=
        "the name of the open stack cloud from your config file to use (if using config file)",
    )

    # Metric Collector
    metric_options = prog.add_mutually_exclusive_group(required=False)
    metric_options.add_argument('--stdout-collector',
                                default=os.environ.get("STDOUT_COLLECTOR"),
                                action='store_true',
                                help="print metrics collected to stdout")
    metric_options.add_argument(
        '--prometheus-collector',
        default=os.environ.get("PROMETHEUS_COLLECTOR"),
        action='store_true',
        help="store metrics in Prometheus and expose metrics over a HTTP server"
    )

    def check_valid_port(value):
        parsed = int(value)
        min_port = 0
        max_port = 65535
        if parsed < min_port or parsed > max_port:
            raise argparse.ArgumentTypeError("%s is an invalid port number" %
                                             value)
        return parsed

    args_prometheus = prog.add_argument_group('Prometheus settings')
    args_prometheus.add_argument(
        '--prometheus-host',
        default='127.0.0.1',
        help=
        'Host to expose Prometheus metrics via the HTTP server when using the --prometheus-collector flag'
    )
    args_prometheus.add_argument(
        '--prometheus-port',
        default=8000,
        help=
        'Port to expose Prometheus metrics via the HTTP server when using the --prometheus-collector flag',
        type=check_valid_port)

    # Kubernetes
    args_kubernetes = prog.add_argument_group('Kubernetes settings')
    args_kubernetes.add_argument(
        '--kube-config',
        default=None,
        help='Location of kube-config file',
    )

    return prog.parse_args(args=args)
コード例 #20
0
def make_cli():
    """Create the ConfigArgParser that matches target NumpyClassRecursiveParse.
    Note that this is not the complete ConfigArgParser if using docstr CLI, but
    rather the subparser that is able to be used through docstr CLI `docstr
    run`.

    This is to be th expected ConfigArgParser from the python call to parse
    ```
    cap = docstr.parse(
        tests.numpy_example_docstrings.NumpyDocClassRecursiveParse,
        'numpy',
        whitelist={'tests.numpy_example_docstrings.NumpyDocClass'},
    ).get_cli(main='NumpyDocClassRecursiveParse.run')
    ```
    """
    cli = ArgumentParser(
        prog='NumpyDocClassRecursiveParse',
        description='A class with objects to be parsed.',
        #\n __init__: \n' + examples.NumpyDocClassRecursiveParse.__init__.__doc__,
        config_file_parser_class=YAMLConfigFileParser,
    )

    #cli.add_argument(
    #    '--config',
    #    #type=yaml.safe_load, # TODO note C Safe loader for yaml.
    #    #required=True,
    #    is_config_file=True,
    #    help="Configuration file path",
    #)

    cli.add_argument(
        '--docstr_type',
        type=type,
        help='docstr internal argument to enable NestedNamespace.init()',
        default=examples.NumpyDocClassRecursiveParse,
    )

    # TODO Create a sub/hierarchical ConfigArgParser
    #nested_parsers = cli.add_nested_parsers()

    sub_cli = cli.add_argument_group(
        'very_useful_class',
        #'NumpyDocClass',
        """NumpyDocClass: This is an example class with Numpy docstrings. Short description ends. This is the beginning of the long descriptions, which can essentially be arbitrary text until the next section/field occurs.\n# TODO include MathTex/LaTeX math here to ensure parsing works with it. I don't think I can use the $ character to delimit docstr linking as MathTex may use it! So I need to ensure the character I use is commonly NOT used by other things wrt docstrings. Perhaps I could just use the markdown for hyperlinking, but use some indication of namespace / within code linking.\n# TODO Include example of hyperlinking in long description""",
    )

    sub_cli.add_argument(
        '--very_useful_class.docstr_type',
        type=type,
        help='docstr internal argument to enable NestedNamespace.init()',
        default=examples.NumpyDocClass,
    )

    # TODO If possible, rather than having to chain `dest` params with the
    # NestedNamespace's path from root cli to this cli appeneded by dots '.', I
    # want to be able to access nested args through contexts, meaning, to get
    # to this sub_cli, in the cli, I could write --cli `--name 'Name' ...` and
    # chain more args that way within the context of going to this sub_cli
    sub_cli.add_argument(
        '--very_useful_class.name',
        help='The name associated with the object instance.',
    )
    sub_cli.add_argument(
        '--very_useful_class.a',
        type=MultiType(frozenset({int, float})),
        help='First number in summation.',
    )
    sub_cli.add_argument(
        '--very_useful_class.b',
        type=MultiType(frozenset({int, float})),
        help='Second number in summation.',
    )
    sub_cli.add_argument(
        '--very_useful_class.x',
        type=MultiType(frozenset({int, float})),
        default=8,
        help='First number in multiplication.',
    )
    sub_cli.add_argument(
        '--very_useful_class.y',
        type=MultiType(frozenset({int, float})),
        default=11,
        help=
        'Second number in multiplication. This is an example of alternative specification of default. This support is included in order to be more inclusive of pre-existing standards used by others so that docstr could be applied to these cases. Docstr is intended to allow modifcation to their parsing regexes such that custom support for niche user cases may be handled by the user.',
    )
    sub_cli.add_argument(
        '--very_useful_class.z',
        type=float,
        default=3.14159,
        help=
        'An example of an attribute with a default value, typically set in init.',
    )

    sub_cli.add_argument(
        '--very_useful_class.ok',
        type=cast_bool_str,
        default=False,
        help=
        """A bool attribute test for configargparse. There were issues before in
the prototype where any non-empty str input including "False" and
"True" were cast to True, whether in config or cli args.""",
    )

    # TODO add the sub/hierarchical ConfigArgParser as an argument
    #cli.add_nested_parser(
    #    'very_useful_class',
    #    'Truly, a very useful class instance.',
    #    sub_cli,
    #)

    # TODO add a function/Callable argument
    cli.add_argument(
        '--func_2',
        type=get_module_object,
        #type=Callable, # TODO handle get function from str
        # Enable getting from the docstr namespace w/ fallback to global import.
        #type=partial(docstr.parsing.get_namespace_obj(docstr_namespace))
        #type=partial(docstr.parsing.get_module_object) # For full qual names
        default=examples.func_defaults,
        help="A function to be called throughout the class' use.")
    return cli