#!/usr/bin/env python """Flags for calling BigQuery.""" import enum import os from typing import Optional from absl import flags class AlphaFeatures(enum.Enum): """Enum for the different alpha features.""" # A value is always needed in this enum so this is included as a noop. NONE = 'none' QUERY_MAX_SLOTS = 'query_max_slots' RESERVATION_GROUPS = 'reservation_groups' ALPHA = flags.DEFINE_multi_enum_class( 'alpha', {}, AlphaFeatures, 'Naming an alpha feature with this flag will cause it be used.', ) APILOG = flags.DEFINE_string( 'apilog', None, ( 'Log all API requests and responses to the file or directory specified' ' by this flag. Also accepts "stdout" and "stderr". Specifying the' ' empty string will direct to stdout.' ), ) API: flags.FlagHolder[Optional[str]] = flags.DEFINE_string( 'api', 'https://bigquery.googleapis.com', 'API endpoint to talk to.' ) flags.register_validator( 'api', lambda val: val is None or not (val.startswith("'") or val.startswith('"')), message=( 'The parsed api flag value should not still be wrapped with quotes.' ), ) _ALLOWED_API_PREFIXES = ( [ 'https://', 'http://', ] ) def _validate_api_prefix(val: str) -> bool: if not val: return True for prefix in _ALLOWED_API_PREFIXES: if val.startswith(prefix): return True return False flags.register_validator( 'api', _validate_api_prefix, message=( 'The parsed api flag value must have a supported prefix:' f' {", ".join(_ALLOWED_API_PREFIXES)}' ), ) UNIVERSE_DOMAIN: flags.FlagHolder[Optional[str]] = flags.DEFINE_string( 'universe_domain', None, 'The universe domain to use in TPC domains.', ) REQUEST_REASON: flags.FlagHolder[Optional[str]] = flags.DEFINE_string( 'request_reason', None, 'A reason for making the request intended to be recorded in audit logging.', ) USE_GCLOUD_CONFIG = flags.DEFINE_boolean( 'use_gcloud_config', True, 'If true, use gcloud config to override default flag values.', ) API_VERSION = flags.DEFINE_string('api_version', 'v2', 'API version to use.') DEBUG_MODE = flags.DEFINE_boolean( 'debug_mode', False, 'Show tracebacks on Python exceptions.' ) TRACE = flags.DEFINE_string( 'trace', None, 'A tracing token ' 'to include in api requests.' ) HTTPLIB2_DEBUGLEVEL = flags.DEFINE_integer( 'httplib2_debuglevel', None, ( 'Instruct httplib2 to print debugging messages by setting debuglevel to' ' the given value.' ), ) BIGQUERYRC = flags.DEFINE_string( 'bigqueryrc', os.path.join(os.path.expanduser('~'), '.bigqueryrc'), ( 'Path to configuration file. The configuration file specifies new' ' defaults for any flags, and can be overridden by specifying the flag' ' on the command line. If the --bigqueryrc flag is not specified, the' ' BIGQUERYRC environment variable is used. If that is not specified,' ' the path "~/.bigqueryrc" is used.' ), ) BIGQUERY_DISCOVERY_API_KEY_FLAG = flags.DEFINE_string( 'bigquery_discovery_api_key', None, 'API key to use for discovery doc requests.', ) DISCOVERY_FILE = flags.DEFINE_string( 'discovery_file', '', ( 'Filename for JSON document to read for the base BigQuery ' 'API discovery, excluding Model, Routine, RowAccessPolicy, ' 'and IAMPolicy APIs.' ), ) DISABLE_SSL_VALIDATION = flags.DEFINE_boolean( 'disable_ssl_validation', False, 'Disables HTTPS certificates validation. This is off by default.', ) CA_CERTIFICATES_FILE = flags.DEFINE_string( 'ca_certificates_file', '', 'Location of CA certificates file.' ) PROXY_ADDRESS = flags.DEFINE_string( 'proxy_address', '', 'The name or IP address of the proxy host to use for connecting to GCP.', ) PROXY_PORT = flags.DEFINE_string( 'proxy_port', '', 'The port number to use to connect to the proxy host.' ) PROXY_USERNAME = flags.DEFINE_string( 'proxy_username', '', 'The user name to use when authenticating with proxy host.', ) PROXY_PASSWORD = flags.DEFINE_string( 'proxy_password', '', 'The password to use when authenticating with proxy host.', ) SYNCHRONOUS_MODE = flags.DEFINE_boolean( 'synchronous_mode', True, ( 'If True, wait for command completion before returning, and use the ' 'job completion status for error codes. If False, simply create the ' 'job, and use the success of job creation as the error code.' ), short_name='sync', ) PROJECT_ID: flags.FlagHolder[str] = flags.DEFINE_string( 'project_id', '', 'Default project to use for requests.' ) DATASET_ID = flags.DEFINE_string( 'dataset_id', '', ( 'Default dataset reference to use for requests (Ignored when not' ' applicable.). Can be set as "project:dataset" or "dataset". If' ' project is missing, the value of the project_id flag will be used.' ), ) LOCATION = flags.DEFINE_string( 'location', None, ( 'Default geographic location to use when creating datasets or' ' determining where jobs should run (Ignored when not applicable.)' ), ) # TODO(b/302038541): Define this flag more accurately or deprecate it. USE_REGIONAL_ENDPOINTS: flags.FlagHolder[bool] = flags.DEFINE_boolean( 'use_regional_endpoints', False, "Use a regional endpoint based on the operation's location.", ) USE_REP = flags.DEFINE_boolean( 'use_rep', False, "Use a REP endpoint based on the operation's location.", ) USE_LEP = flags.DEFINE_boolean( 'use_lep', False, "Use a LEP endpoint based on the operation's location.", ) # This flag is "hidden" at the global scope to avoid polluting help # text on individual commands for rarely used functionality. JOB_ID = flags.DEFINE_string( 'job_id', None, ( 'A unique job_id to use for the request. If not specified, this client ' 'will generate a job_id. Applies only to commands that launch jobs, ' 'such as cp, extract, load, and query.' ), ) FINGERPRINT_JOB_ID = flags.DEFINE_boolean( 'fingerprint_job_id', False, ( 'Whether to use a job id that is derived from a fingerprint of the job' ' configuration. This will prevent the same job from running multiple' ' times accidentally.' ), ) QUIET = flags.DEFINE_boolean( 'quiet', False, 'If True, ignore status updates while jobs are running.', short_name='q', ) HEADLESS = flags.DEFINE_boolean( 'headless', False, ( 'Whether this bq session is running without user interaction. This ' 'affects behavior that expects user interaction, like whether ' 'debug_mode will break into the debugger and lowers the frequency ' 'of informational printing.' ), ) FORMAT = flags.DEFINE_enum( 'format', None, ['none', 'json', 'prettyjson', 'csv', 'sparse', 'pretty'], ( 'Format for command output. Options include:' '\n pretty: formatted table output' '\n sparse: simpler table output' '\n prettyjson: easy-to-read JSON format' '\n json: maximally compact JSON' '\n csv: csv format with header' '\nThe first three are intended to be human-readable, and the latter ' 'three are for passing to another program. If no format is selected, ' 'one will be chosen based on the command run.' ), ) JOB_PROPERTY = flags.DEFINE_multi_string( 'job_property', None, ( 'Additional key-value pairs to include in the properties field of ' 'the job configuration' ), ) # No period: Multistring adds flagspec suffix. ENABLE_RESUMABLE_UPLOADS = flags.DEFINE_boolean( 'enable_resumable_uploads', None, 'Enables resumable uploads over HTTP (Only applies to load jobs that load ' 'data from local files.). Defaults to True.' ) MAX_ROWS_PER_REQUEST = flags.DEFINE_integer( 'max_rows_per_request', None, 'Specifies the max number of rows to return per read.', ) JOBS_QUERY_USE_RESULTS_FROM_RESPONSE = flags.DEFINE_boolean( 'jobs_query_use_results_from_response', True, 'If true, results from jobs.query response are used.', ) JOBS_QUERY_USE_REQUEST_ID = flags.DEFINE_boolean( 'jobs_query_use_request_id', False, 'If true, sends request_id in jobs.query request.', ) ENABLE_GDRIVE = flags.DEFINE_boolean( 'enable_gdrive', True, ( 'When set to true, requests new OAuth token with GDrive scope. When set' ' to false, requests new OAuth token without GDrive scope. Unless' ' authenticated with a service account, to use this flag, the' ' use_google_auth flag must be set to false.' ), ) MTLS: flags.FlagHolder[bool] = flags.DEFINE_boolean( 'mtls', False, 'If set will use mtls client certificate on connections to BigQuery.', )