in perfkitbenchmarker/providers/aws/aws_virtual_machine.py [0:0]
def __init__(self, vm_spec):
"""Initialize a AWS virtual machine.
Args:
vm_spec: virtual_machine.BaseVirtualMachineSpec object of the vm.
Raises:
ValueError: If an incompatible vm_spec is passed.
"""
super().__init__(vm_spec)
assert isinstance(self.zone, str)
self.region = util.GetRegionFromZone(self.zone)
self.user_name = FLAGS.aws_user_name or self.DEFAULT_USER_NAME
if self.machine_type in aws_disk.NUM_LOCAL_VOLUMES:
self.max_local_disks = aws_disk.NUM_LOCAL_VOLUMES[self.machine_type]
if self.boot_startup_script:
self.user_data = f'file://{self.boot_startup_script}'
else:
self.user_data = None
self.network = aws_network.AwsNetwork.GetNetwork(self)
self.network_eni_count = aws_network.AWS_ENI_COUNT.value
self.network_card_count = aws_network.AWS_NETWORK_CARD_COUNT.value
if (
(self.network_eni_count > 1)
and (self.network_card_count > 1)
and (self.machine_type not in aws_network.DUAL_NETWORK_CARD_MACHINES)
):
logging.warning(
'%s does not support %s network cards. Using 1 instead.',
self.machine_type,
self.network_card_count,
)
self.network_eni_count = 1
self.network_card_count = 1
self.placement_group = self.network.placement_group
self.firewall = aws_network.AwsFirewall.GetFirewall()
self.use_dedicated_host = vm_spec.use_dedicated_host
self.num_vms_per_host = vm_spec.num_vms_per_host
self.use_spot_instance = vm_spec.use_spot_instance
self.spot_price = vm_spec.spot_price
self.spot_block_duration_minutes = vm_spec.spot_block_duration_minutes
self.boot_disk_size = vm_spec.boot_disk_size
self.client_token = str(uuid.uuid4())
self.num_hosts = None
self.host = None
self.id = None
self.metadata.update({
'spot_instance': self.use_spot_instance,
'spot_price': self.spot_price,
'spot_block_duration_minutes': self.spot_block_duration_minutes,
'placement_group_strategy': (
self.placement_group.strategy
if self.placement_group
else placement_group.PLACEMENT_GROUP_NONE
),
'partition_count': (
self.placement_group.partition_count if self.placement_group else 0
),
'aws_credit_specification': (
FLAGS.aws_credit_specification
if FLAGS.aws_credit_specification
else 'none'
),
})
self.spot_early_termination = False
self.spot_status_code = None
# See:
# https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking-os.html
self._smp_affinity_script = 'smp_affinity.sh'
self.create_cmd = None
arm_arch = GetArmArchitecture(self.machine_type)
if arm_arch:
self.host_arch = arm_arch
self.is_aarch64 = True
if self.use_dedicated_host and util.IsRegion(self.zone):
raise ValueError(
'In order to use dedicated hosts, you must specify an availability '
'zone, not a region ("zone" was %s).'
% self.zone
)
if self.use_dedicated_host and self.use_spot_instance:
raise ValueError('Tenancy=host is not supported for Spot Instances')
self.allocation_id = None
self.association_id = None
self.aws_tags = {}
# this maps the deterministic order
# of this device in the VM's disk_spec to the device name
# both disk_spec order and device name are assigned by pkb.
self.device_by_disk_spec_id = {}
# this is a mapping of known device name to AWS-side identifiers.
# AWS-side identifiers are assigned by AWS at creation time.
self.disk_identifiers_by_device = {}
self.create_disk_strategy = aws_disk_strategies.GetCreateDiskStrategy(
self, None, 0
)
self.instance_profile = aws_flags.AWS_EC2_INSTANCE_PROFILE.value