Skip to content

Commit 0ffc3ba

Browse files
committed
fix: batch describe_services calls to handle >10 services
AWS ECS describe_services API has a limit of 10 services per call. Updated get_service_info() to batch service names into groups of 10 to avoid InvalidParameterException when clusters have more than 10 services.
1 parent 8efd663 commit 0ffc3ba

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

src/lazy_ecs/features/service/service.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from ...core.base import BaseAWSService
99
from ...core.types import ServiceEvent, ServiceInfo
10-
from ...core.utils import determine_service_status, extract_name_from_arn, paginate_aws_list
10+
from ...core.utils import batch_items, determine_service_status, extract_name_from_arn, paginate_aws_list
1111

1212
if TYPE_CHECKING:
1313
from typing import Any
@@ -31,9 +31,12 @@ def get_service_info(self, cluster_name: str) -> list[ServiceInfo]:
3131
if not service_names:
3232
return []
3333

34-
response = self.ecs_client.describe_services(cluster=cluster_name, services=service_names)
35-
services = response.get("services", [])
36-
return [_create_service_info(service) for service in services]
34+
all_services = []
35+
for batch in batch_items(service_names, 10):
36+
response = self.ecs_client.describe_services(cluster=cluster_name, services=batch)
37+
all_services.extend(response.get("services", []))
38+
39+
return [_create_service_info(service) for service in all_services]
3740

3841
def get_desired_task_definition_arn(self, cluster_name: str, service_name: str) -> str | None:
3942
response = self.ecs_client.describe_services(cluster=cluster_name, services=[service_name])

tests/test_aws_service.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,33 @@ def test_get_service_info(ecs_client_with_services) -> None:
268268
assert "pending_count" in info
269269

270270

271+
def test_get_service_info_with_more_than_10_services():
272+
with mock_aws():
273+
client = boto3.client("ecs", region_name="us-east-1")
274+
client.create_cluster(clusterName="production")
275+
276+
client.register_task_definition(
277+
family="app-task",
278+
containerDefinitions=[{"name": "app", "image": "nginx", "memory": 256}],
279+
)
280+
281+
for i in range(15):
282+
client.create_service(
283+
cluster="production",
284+
serviceName=f"service-{i:02d}",
285+
taskDefinition="app-task",
286+
desiredCount=2,
287+
)
288+
289+
service = ECSService(client)
290+
service_info = service.get_service_info("production")
291+
292+
assert len(service_info) == 15
293+
service_names = [info["name"] for info in service_info]
294+
for i in range(15):
295+
assert any(f"service-{i:02d}" in name for name in service_names)
296+
297+
271298
def test_get_tasks(ecs_client_with_tasks) -> None:
272299
service = ECSService(ecs_client_with_tasks)
273300
tasks = service.get_tasks("production", "web-api")

0 commit comments

Comments
 (0)