in perfkitbenchmarker/providers/aws/aws_virtual_machine.py [0:0]
def _WaitUntilRunning(self):
"""Waits until the VM is running.
This method waits until the VM is no longer pending.
Raises:
AwsUnknownStatusError: If an unknown status is returned from AWS.
AwsTransitionalVmRetryableError: If the VM is pending. This is retried.
AwsVmNotCreatedError: If the VM does not have a create_start_time by the
time it reaches this phase of provisioning.
"""
response = self._RunDescribeInstancesCommand()
reservations = response['Reservations']
if not reservations or len(reservations) != 1:
if not self.create_start_time:
logging.info(
'VM does not have a create_start_time; provisioning failed.'
)
raise AwsVmNotCreatedError()
logging.info(
'describe-instances did not return exactly one reservation. '
'This sometimes shows up immediately after a successful '
'run-instances command. Retrying describe-instances '
'command.'
)
raise AwsTransitionalVmRetryableError()
instances = reservations[0]['Instances']
if not instances or len(instances) != 1:
logging.info(
'describe-instances did not return exactly one instance. '
'Retrying describe-instances command.'
)
raise AwsTransitionalVmRetryableError()
status = instances[0]['State']['Name']
self.id = instances[0]['InstanceId']
if self.use_spot_instance:
self.spot_instance_request_id = instances[0]['SpotInstanceRequestId']
if status in INSTANCE_TRANSITIONAL_STATUSES:
logging.info(
'VM has status %s; retrying describe-instances command.', status
)
raise AwsTransitionalVmRetryableError()
# In this path run-instances succeeded, a pending instance was created, but
# not fulfilled so it moved to terminated.
elif (
status == TERMINATED
and instances[0]['StateReason']['Code']
== 'Server.InsufficientInstanceCapacity'
):
raise errors.Benchmarks.InsufficientCapacityCloudFailure(
instances[0]['StateReason']['Message']
)
# In this path run-instances succeeded, a pending instance was created, but
# instance is shutting down due to internal server error. This is a
# retryable command for run-instance.
# Client token needs to be refreshed for idempotency.
elif (
status == SHUTTING_DOWN
and instances[0]['StateReason']['Code'] == 'Server.InternalError'
):
self.client_token = str(uuid.uuid4())
# Set the running time
elif status == RUNNING:
if not self.is_running_time:
self.is_running_time = time.time()
# TODO(user): Adjust this function to properly handle ALL potential
# VM statuses. In the meantime, just retry if the VM is not yet running.
else:
raise AwsUnknownStatusError(
f'Unknown status: {status}; retrying describe-instances command'
)