Skip to content

Commit db5f577

Browse files
committed
@pcrespov review: improve message and exception handling
1 parent 1764ea4 commit db5f577

File tree

4 files changed

+30
-12
lines changed

4 files changed

+30
-12
lines changed

packages/aws-library/src/aws_library/ec2/_client.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
check_max_number_of_instances_not_exceeded,
3737
compose_user_data,
3838
ec2_instance_data_from_aws_instance,
39+
get_subnet_azs,
3940
get_subnet_capacity,
4041
)
4142

@@ -169,7 +170,7 @@ async def launch_instances(
169170
# and also allows to circumvent a moto bug that does not raise
170171
# InsufficientInstanceCapacity when a subnet is full
171172
subnet_id_to_available_ips = await get_subnet_capacity(
172-
self, subnet_ids=instance_config.subnet_ids
173+
self.client, subnet_ids=instance_config.subnet_ids
173174
)
174175

175176
total_available_ips = sum(subnet_id_to_available_ips.values())
@@ -244,14 +245,11 @@ async def launch_instances(
244245
raise
245246

246247
else:
247-
# All subnets failed with capacity errors
248-
_logger.error(
249-
"All subnets failed with insufficient capacity for instance type %s",
250-
instance_config.type.name,
248+
subnet_zones = await get_subnet_azs(
249+
self.client, subnet_ids=subnet_ids_with_capacity
251250
)
252-
253251
raise EC2InsufficientCapacityError(
254-
subnet_ids=instance_config.subnet_ids,
252+
availability_zones=subnet_zones,
255253
instance_type=instance_config.type.name,
256254
)
257255
instance_ids = [

packages/aws-library/src/aws_library/ec2/_error_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def _map_botocore_client_exception(
6868
availability_zone = match.group("failed_az")
6969

7070
raise EC2InsufficientCapacityError(
71-
availability_zone=availability_zone, instance_type=instance_type
71+
availability_zones=availability_zone, instance_type=instance_type
7272
)
7373
case _:
7474
return EC2AccessError(

packages/aws-library/src/aws_library/ec2/_errors.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class EC2TooManyInstancesError(EC2AccessError):
4040

4141
class EC2InsufficientCapacityError(EC2AccessError):
4242
msg_template: str = (
43-
"Insufficient capacity in {availability_zone} for {instance_type}"
43+
"Insufficient capacity in {availability_zones} for {instance_type}"
4444
)
4545

4646

packages/aws-library/src/aws_library/ec2/_utils.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from textwrap import dedent
22
from typing import TYPE_CHECKING, cast
33

4+
from types_aiobotocore_ec2 import EC2Client
45
from types_aiobotocore_ec2.type_defs import (
56
InstanceTypeDef,
67
SubnetTypeDef,
@@ -67,10 +68,9 @@ async def check_max_number_of_instances_not_exceeded(
6768

6869

6970
async def get_subnet_capacity(
70-
ec2_client: "SimcoreEC2API", *, subnet_ids: list[str]
71+
aioboto_ec2_client: EC2Client, *, subnet_ids: list[str]
7172
) -> dict[str, int]:
72-
73-
subnets = await ec2_client.client.describe_subnets(SubnetIds=subnet_ids)
73+
subnets = await aioboto_ec2_client.describe_subnets(SubnetIds=subnet_ids)
7474
assert "Subnets" in subnets # nosec
7575
subnet_id_to_subnet_map: dict[str, SubnetTypeDef] = {
7676
subnet["SubnetId"]: subnet # pyright: ignore[reportTypedDictNotRequiredAccess]
@@ -85,3 +85,23 @@ async def get_subnet_capacity(
8585
for subnet_id in subnet_ids
8686
}
8787
return subnet_id_to_available_ips
88+
89+
90+
async def get_subnet_azs(
91+
aioboto_ec2_client: EC2Client, *, subnet_ids: list[str]
92+
) -> list[str]:
93+
subnets = await aioboto_ec2_client.describe_subnets(SubnetIds=subnet_ids)
94+
assert "Subnets" in subnets # nosec
95+
subnet_id_to_subnet_map: dict[str, SubnetTypeDef] = {
96+
subnet["SubnetId"]: subnet # pyright: ignore[reportTypedDictNotRequiredAccess]
97+
for subnet in subnets["Subnets"]
98+
}
99+
# preserve the order of instance_config.subnet_ids
100+
101+
subnet_azs: list[str] = [
102+
subnet_id_to_subnet_map[subnet_id][
103+
"AvailabilityZone"
104+
] # pyright: ignore[reportTypedDictNotRequiredAccess]
105+
for subnet_id in subnet_ids
106+
]
107+
return subnet_azs

0 commit comments

Comments
 (0)