perfkitbenchmarker/providers/aws/flags.py (255 lines of code) (raw):
# Copyright 2015 PerfKitBenchmarker Authors. All rights reserved.
#
# 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
#
# http://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.
"""Module containing flags applicable across benchmark run on AWS."""
from typing import Any
from absl import flags
flags.DEFINE_string(
'aws_user_name',
'',
'This determines the user name that Perfkit will '
'attempt to use. Defaults are OS specific.',
)
flags.DEFINE_integer(
'aws_provisioned_iops',
None,
'IOPS for Provisioned IOPS (SSD) volumes in AWS.',
)
flags.DEFINE_integer(
'aws_provisioned_throughput',
None,
'Provisioned throughput (MB/s) for (SSD) volumes in AWS.',
)
AWS_NIC_QUEUE_COUNTS = flags.DEFINE_list(
'aws_nic_queue_counts',
None,
'The queue count of each NIC. Specify a list of key=value pairs, where key'
' is the network device name and value is the queue count.',
)
flags.DEFINE_string(
'aws_dax_node_type',
'dax.r4.large',
'The node type used for creating AWS DAX cluster.',
)
flags.DEFINE_integer(
'aws_dax_replication_factor',
3,
'The replication factor of AWS DAX cluster.',
)
flags.DEFINE_string(
'aws_emr_loguri',
None,
'The log-uri parameter to pass to AWS when creating a '
'cluster. If not set, a bucket will be created.',
)
flags.DEFINE_integer(
'aws_emr_job_wait_time',
18000,
'The time to wait for an EMR job to finish, in seconds',
)
flags.DEFINE_boolean(
'aws_spot_instances',
False,
'Whether to use AWS spot instances for any AWS VMs.',
)
flags.DEFINE_float(
'aws_spot_price',
None,
'The spot price to bid for AWS spot instances. Defaults '
'to on-demand price when left as None.',
)
flags.DEFINE_enum(
'aws_spot_block_duration_minutes',
None,
['60', '120', '180', '240', '300', '360'],
'The required '
'duration for the Spot Instances (also known as Spot blocks),'
' in minutes. This value must be a multiple of 60.',
)
flags.DEFINE_integer(
'aws_boot_disk_size', None, 'The boot disk size in GiB for AWS VMs.'
)
flags.DEFINE_string('kops', 'kops', 'The path to the kops binary.')
flags.DEFINE_string(
'aws_image_name_filter',
None,
'The filter to use when searching for an image for a VM. '
'See usage details in aws_virtual_machine.py around '
'IMAGE_NAME_FILTER.',
)
flags.DEFINE_string(
'aws_image_name_regex',
None,
'The Python regex to use to further filter images for a '
'VM. This applies after the aws_image_name_filter. See '
'usage details in aws_virtual_machine.py around '
'IMAGE_NAME_REGEX.',
)
AWS_PREPROVISIONED_DATA_BUCKET = flags.DEFINE_string(
'aws_preprovisioned_data_bucket',
None,
'AWS bucket where pre-provisioned data has been copied. '
'Requires --aws_ec2_instance_profile to be set.',
)
ELASTICACHE_NODE_TYPE = flags.DEFINE_string(
'elasticache_node_type',
'cache.m4.large',
'The AWS cache node type to use for elasticache clusters.',
)
ELASTICACHE_FAILOVER_ZONE = flags.DEFINE_string(
'elasticache_failover_zone', None, 'AWS elasticache failover zone'
)
flags.DEFINE_string(
'aws_efs_token',
None,
'The creation token used to create the EFS resource. '
'If the file system already exists, it will use that '
'instead of creating a new one.',
)
flags.DEFINE_boolean(
'aws_delete_file_system', True, 'Whether to delete the EFS file system.'
)
flags.DEFINE_enum(
'efs_throughput_mode',
'provisioned',
['provisioned', 'bursting'],
'The throughput mode to use for EFS.',
)
flags.DEFINE_float(
'efs_provisioned_throughput',
1024.0,
'The throughput limit of EFS (in MiB/s) when run in provisioned mode.',
)
flags.DEFINE_boolean(
'provision_athena', False, 'Whether to provision the Athena database.'
)
flags.DEFINE_boolean(
'teardown_athena', True, 'Whether to teardown the Athena database.'
)
flags.DEFINE_string(
'athena_output_location_prefix',
'athena-cli-results',
'Prefix of the S3 bucket name for Athena Query Output. Suffix will be the '
'region and the run URI, and the bucket will be dynamically created and '
'deleted during the test.',
)
flags.DEFINE_string('eksctl', 'eksctl', 'Path to eksctl.')
flags.DEFINE_enum(
'redshift_client_interface',
'JDBC',
['JDBC'],
'The Runtime Interface used when interacting with Redshift.',
)
flags.DEFINE_enum(
'athena_client_interface',
'JAVA',
['JAVA'],
'The Runtime Interface used when interacting with Athena.',
)
flags.DEFINE_string('athena_query_timeout', '600', 'Query timeout in seconds.')
flags.DEFINE_string(
'athena_workgroup',
'',
'Use athena workgroup to separate applications and choose '
'execution configuration like the engine version.',
)
flags.DEFINE_boolean(
'athena_metrics_collection',
False,
'Should the cloud watch metrics be collected for Athena query executions.',
)
flags.DEFINE_boolean(
'athena_workgroup_delete',
True,
'Should the dedicated athena workgroups be deleted or kept alive for'
' investigations.',
)
flags.DEFINE_enum(
'aws_credit_specification',
None,
['CpuCredits=unlimited', 'CpuCredits=standard'],
'Credit specification for burstable vms.',
)
flags.DEFINE_boolean(
'aws_vm_hibernate',
False,
'Whether to hibernate(suspend) an aws vminstance.',
)
flags.DEFINE_string(
'aws_glue_crawler_role',
None,
"Role's ARN to be used by the crawler. Must have policies that grant "
'permission for using AWS Glue and read access to S3.',
)
flags.DEFINE_string(
'aws_glue_job_role',
None,
"Role's ARN to be used by Glue Jobs. Must have policies that grant "
'permission for using AWS Glue and read access to S3.',
)
flags.DEFINE_string(
'aws_emr_serverless_role',
None,
"Role's ARN to be used by AWS EMR Serverless Jobs. Must have policies that "
'grant AWS Serverless read & write S3 access.',
)
flags.DEFINE_integer(
'aws_glue_crawler_sample_size',
None,
'Sets how many files will be crawled in each leaf directory. If left '
'unset, all the files will be crawled. May range from 1 to 249.',
1,
249,
)
AWS_CAPACITY_BLOCK_RESERVATION_ID = flags.DEFINE_string(
'aws_capacity_block_reservation_id',
None, 'Reservation id for capacity block.')
AWS_CREATE_DISKS_WITH_VM = flags.DEFINE_boolean(
'aws_create_disks_with_vm',
True,
'Whether to create disks at VM creation time. Defaults to True.',
)
# TODO(user): Create a spec for aurora.
AURORA_STORAGE_TYPE = flags.DEFINE_enum(
'aws_aurora_storage_type',
'aurora',
['aurora', 'aurora-iopt1'],
'Aurora storage type to use, corresponds to different modes of billing. See'
' https://aws.amazon.com/rds/aurora/pricing/.',
)
AWS_EC2_INSTANCE_PROFILE = flags.DEFINE_string(
'aws_ec2_instance_profile',
None,
'The instance profile to use for EC2 instances. '
'Allows calling APIs on the instance.',
)
AWS_EKS_POD_IDENTITY_ROLE = flags.DEFINE_string(
'aws_eks_pod_identity_role',
None,
'The IAM role to associate with the pod identity for EKS clusters.',
)
PCLUSTER_PATH = flags.DEFINE_string(
'pcluster_path',
'pcluster',
'The path for the pcluster (parallel-cluster) utility.',
)
@flags.multi_flags_validator(
[
AWS_PREPROVISIONED_DATA_BUCKET.name,
AWS_EC2_INSTANCE_PROFILE.name,
AWS_EKS_POD_IDENTITY_ROLE.name,
],
message=(
'--aws_ec2_instance_profile or --aws_eks_pod_identity_role must be '
'set if --aws_preprovisioned_data_bucket is set.'
),
)
def _ValidatePreprovisionedDataAccess(flag_values: dict[str, Any]) -> bool:
"""Validates that an auth flag is set if preprovisioned data is used."""
return bool(
not flag_values[AWS_PREPROVISIONED_DATA_BUCKET.name]
or flag_values[AWS_EC2_INSTANCE_PROFILE.name]
or flag_values[AWS_EKS_POD_IDENTITY_ROLE.name]
)
# MemoryDB Flags
MEMORYDB_NODE_TYPE = flags.DEFINE_string(
'aws_memorydb_node_type',
'db.r7g.large',
'The AWS node type to use for MemoryDB clusters.',
)
MEMORYDB_FAILOVER_ZONE = flags.DEFINE_string(
'aws_memorydb_failover_zone', None, 'AWS MemoryDB failover zone'
)