def parse_args()

in tools/gmon/gmon/cli.py [0:0]


def parse_args(args):
    """Parse CLI arguments.

    Args:
        args (list): List of args passed from CLI.

    Returns:
        tuple: A tuple (parser, args) after parsing with ArgumentParser.
    """
    # Main parser
    parser = argparse.ArgumentParser(prog='gmon',
                                     description='Cloud Operations CLI')
    subparsers = parser.add_subparsers(title='Endpoints', dest='parser')

    # Accounts parser
    accounts = subparsers.add_parser('accounts',
                                     help='Cloud Operations Account operations')
    accounts_sub = accounts.add_subparsers(dest='operation')
    accounts_get = accounts_sub.add_parser(
        'get', help='Get a Cloud Operations Account details')
    accounts_create = accounts_sub.add_parser(
        'create', help='Create a Cloud Operations Account')
    accounts_link = accounts_sub.add_parser(
        'link', help='Link a project to a Cloud Operations Account')
    # accounts_sub.add_parser('list', help='List Cloud Operations Accounts')

    # TODO: Uncomment this when `delete` and `projects.delete`
    # operations are available.
    # accounts_delete = accounts_sub.add_parser(
    #     'delete', help='Delete a Cloud Operations Account')
    # accounts_unlink = accounts_sub.add_parser(
    # 'unlink', help='Unlink a project from a SD Account')
    # accounts_unlink.add_argument('project', help='Project id to unlink')

    accounts_link.add_argument('project_id', help='Project id to link')
    for p in [accounts_get, accounts_create, accounts_link]:
        p.add_argument('--project',
                       '-p',
                       help='Cloud Monitoring host project id.',
                       required=True)
        p.add_argument('--no-poll',
                       help='Do not poll operations to completion',
                       action='store_true',
                       required=False)

    # Metrics parser
    metrics = subparsers.add_parser('metrics',
                                    help='Cloud Monitoring metrics operations')
    metrics_sub = metrics.add_subparsers(dest='operation')
    metrics_list = metrics_sub.add_parser('list',
                                          help='List Cloud Monitoring metrics')
    metrics_get = metrics_sub.add_parser(
        'get', help='Get Cloud Monitoring metric descriptor')
    metrics_inspect = metrics_sub.add_parser(
        'inspect', help='Inspect Cloud Monitoring metrics (last timeseries)')
    metrics_create = metrics_sub.add_parser(
        'create', help='Create a Cloud Monitoring metric descriptor')
    metrics_delete = metrics_sub.add_parser(
        'delete', help='Delete a Cloud Monitoring metric descriptor')
    metrics_delete_unused = metrics_sub.add_parser(
        'delete_unused', help='Delete unused Cloud Monitoring metrics')

    metrics_create.add_argument('--description',
                                help='Metric description',
                                required=False)
    metrics_create.add_argument('--metric-kind',
                                help='Metric metric-kind',
                                default='GAUGE',
                                required=False)
    metrics_create.add_argument('--value-type',
                                help='Metric value-type',
                                default='DOUBLE',
                                required=False)
    metrics_inspect.add_argument('--window',
                                 '-w',
                                 type=int,
                                 help='Window to query (in seconds)',
                                 required=False,
                                 default=60)
    metrics_inspect.add_argument('--filters',
                                 '-f',
                                 nargs='+',
                                 help='Filter on nested fields.',
                                 required=False,
                                 default=[])
    metrics_inspect.add_argument('--fields',
                                 type=str,
                                 nargs='+',
                                 help='Fields to keep in response.',
                                 required=False,
                                 default=[])
    metrics_list.add_argument('--fields',
                              type=str,
                              nargs='+',
                              help='Fields to keep in response.',
                              required=False,
                              default=['type'])
    metrics_list.add_argument('--limit',
                              '-n',
                              type=int,
                              help='Number of results to show.',
                              required=False,
                              default=None)
    metrics_list.add_argument('--filters',
                              '-f',
                              nargs='+',
                              help='Filter on nested fields.',
                              required=False,
                              default=[])
    metrics_delete_unused.add_argument('--window',
                                       '-w',
                                       type=int,
                                       help='Window to query (in days)',
                                       required=False,
                                       default=1)

    for p in [metrics_list, metrics_delete_unused]:
        p.add_argument('regex',
                       nargs='?',
                       type=str,
                       help='Filter metric descriptors using a regex.',
                       default=None)
    for p in [
            metrics_list, metrics_get, metrics_create, metrics_inspect,
            metrics_delete, metrics_delete_unused
    ]:
        p.add_argument('--project',
                       '-p',
                       help='Cloud Monitoring host project id.',
                       required=True)
    for p in [metrics_get, metrics_create, metrics_inspect, metrics_delete]:
        p.add_argument(
            'metric-type',
            help='Metric descriptor type (e.g: "{SAMPLE_METRIC_TYPE}") or '
            'partial match')

    # Service Monitoring
    # Services
    sm_service = subparsers.add_parser(
        'services', help='Cloud Monitoring Service Monitoring services')
    sm_service_sub = sm_service.add_subparsers(dest='operation')
    sm_service_get = sm_service_sub.add_parser(
        'get', help='Get a Cloud Monitoring Service Monitoring service')
    sm_service_create = sm_service_sub.add_parser(
        'create', help='Create a Cloud Monitoring Service Monitoring service')
    sm_service_update = sm_service_sub.add_parser(
        'update', help='Update a Cloud Monitoring Service Monitoring service')
    sm_service_delete = sm_service_sub.add_parser(
        'delete', help='Delete a Cloud Monitoring Service Monitoring service')
    sm_service_list = sm_service_sub.add_parser(
        'list', help='List a Cloud Monitoring Service Monitoring service')

    for p in [
            sm_service_list, sm_service_get, sm_service_create,
            sm_service_update, sm_service_delete
    ]:
        p.add_argument('--project',
                       '-p',
                       help='Cloud Monitoring host project id.',
                       required=True)
    for p in [sm_service_get, sm_service_create, sm_service_delete]:
        p.add_argument('service_id', help='Cloud Monitoring service id')

    sm_service_create.add_argument('--config',
                                   help='Path to service config.',
                                   required=True)

    # SLOs
    sm_slo = subparsers.add_parser(
        'slos', help='Cloud Monitoring Service Monitoring SLOs')
    sm_slo_sub = sm_slo.add_subparsers(dest='operation')
    sm_slo_get = sm_slo_sub.add_parser(
        'get', help='Get a Cloud Monitoring Service Monitoring SLO')
    sm_slo_create = sm_slo_sub.add_parser(
        'create', help='Create a Cloud Monitoring Service Monitoring SLO')
    sm_slo_update = sm_slo_sub.add_parser(
        'update', help='Update a Cloud Monitoring Service Monitoring SLO')
    sm_slo_delete = sm_slo_sub.add_parser(
        'delete', help='Delete a Cloud Monitoring Service Monitoring SLO')
    sm_slo_list = sm_slo_sub.add_parser(
        'list', help='List Cloud Monitoring Service Monitoring SLOs')

    for p in [
            sm_slo_list, sm_slo_get, sm_slo_update, sm_slo_create, sm_slo_delete
    ]:
        p.add_argument('--project',
                       '-p',
                       help='Cloud Monitoring host project id.',
                       required=True)
        p.add_argument('service_id', help='Cloud Monitoring service id')

    for p in [sm_slo_get, sm_slo_update, sm_slo_delete]:
        p.add_argument('slo_id', help='SLO id.')

    sm_slo_create.add_argument('--config',
                               help='Path to service config.',
                               required=True)

    parsers = {
        'root': parser,
        'accounts': accounts,
        'metrics': metrics,
        'services': sm_service,
        'slos': sm_slo
    }
    return parsers, parser.parse_args(args)