python/dataproc_templates/util/argument_parsing.py (68 lines of code) (raw):
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import Optional, Sequence, Union
import argparse
import dataproc_templates.util.template_constants as constants
from dataproc_templates import TemplateName
def get_template_name(args: Optional[Sequence[str]] = None) -> TemplateName:
"""
Parses the template name option from the program arguments.
This will print the command help and exit if the --template
argument is missing.
Args:
args (Optional[Sequence[str]]): The program arguments.
By default, command line arguments will be used.
Returns:
str: The value of the --template argument
"""
parser: argparse.ArgumentParser = argparse.ArgumentParser(
add_help=False
)
parser.add_argument(
'--template',
dest='template_name',
type=str,
required=False,
default=None,
choices=TemplateName.choices(),
help='The name of the template to run'
)
known_args: argparse.Namespace
known_args, _ = parser.parse_known_args(args=args)
if known_args.template_name is None:
parser.print_help()
parser.exit()
return TemplateName.from_string(known_args.template_name)
def get_log_level(args: Optional[Sequence[str]] = None) -> str:
"""
Parses the log level option from the program arguments.
INFO is the default log level
This will exit if the log level in an invalid choice.
Args:
args (Optional[Sequence[str]]): The program arguments.
By default, command line arguments will be used.
Returns:
str: The value of the --log_level argument
"""
parser: argparse.ArgumentParser = argparse.ArgumentParser(
add_help=False
)
parser.add_argument(
'--log_level',
dest='log_level',
type=str,
required=False,
default="INFO",
choices=["ALL", "DEBUG", "ERROR", "FATAL", "INFO", "OFF", "TRACE", "WARN"],
help='Spark Context Log Level'
)
known_args: argparse.Namespace
known_args, _ = parser.parse_known_args(args=args)
return known_args.log_level
def add_spark_options(parser: argparse.ArgumentParser, template_to_spark_option_map: dict, read_options: bool = True) -> None:
if not template_to_spark_option_map:
return
for option_name, spark_option_name in template_to_spark_option_map.items():
if read_options:
help_text = (constants.SPARK_OPTIONS[spark_option_name].get(constants.OPTION_READ_HELP, "")
or constants.SPARK_OPTIONS[spark_option_name].get(constants.OPTION_HELP, ""))
else:
help_text = (constants.SPARK_OPTIONS[spark_option_name].get(constants.OPTION_WRITE_HELP, "")
or constants.SPARK_OPTIONS[spark_option_name].get(constants.OPTION_HELP, ""))
parser.add_argument(
f'--{option_name}',
dest=option_name,
required=False,
default=constants.SPARK_OPTIONS[spark_option_name].get(constants.OPTION_DEFAULT, ""),
help=help_text
)
def add_es_spark_connector_options(parser: argparse.ArgumentParser, template_to_es_spark_reader_option_map: dict) -> None:
if not template_to_es_spark_reader_option_map:
return
for option_name, es_spark_reader_option_name in template_to_es_spark_reader_option_map.items():
help_text = constants.ES_SPARK_READER_OPTIONS[es_spark_reader_option_name].get(constants.OPTION_HELP, "")
parser.add_argument(
f'--{option_name}',
dest=option_name,
required=False,
default=constants.ES_SPARK_READER_OPTIONS[es_spark_reader_option_name].get(constants.OPTION_DEFAULT, ""),
help=help_text
)