from .task import Task from aws.base import Base class Service(Base): def __init__(self, client, cluster_arn, service_arn, launch_type='FARGATE'): super().__init__(client) self.cluster_arn = cluster_arn self.service_arn = service_arn self.launch_type = launch_type self.resource_id = f'service/{cluster_arn.split("/")[-1]}/{service_arn.split("/")[-1]}' def get_service_name(self) -> str: return self.service_arn.split('/')[-1] def get_tasks(self) -> list: client = self.get_client() paginator = client.get_paginator('list_tasks') page_iterator = paginator.paginate(cluster=self.cluster_arn, serviceName=self.service_arn, launchType=self.launch_type) return [Task(client, self.cluster_arn, item) for sublist in page_iterator for item in sublist.get('taskArns', [])] def get_desire_count(self) -> int: result = self.describe() services = result.get('services') if len(services) == 0: return 0 return services[0].get('desireCount', 0) def get_load_balancers(self) -> list: result = self.describe() services = result.get('services', []) if len(services) == 0: return [] return services[0].get('loadBalancers', []) def get_min_count(self, client) -> int: result = client.describe_scalable_targets( ResourceIds=[self.resource_id], ScalableDimension='ecs:service:DesiredCount', ServiceNamespace='ecs', ) if len(result.get('ScalableTargets', [])) > 0: scalable_targets = result['ScalableTargets'][0] return scalable_targets['MinCapacity'] return 0 def get_max_count(self, client) -> int: result = client.describe_scalable_targets( ResourceIds=[self.resource_id], ScalableDimension='ecs:service:DesiredCount', ServiceNamespace='ecs', ) if len(result.get('ScalableTargets', [])) > 0: scalable_targets = result['ScalableTargets'][0] return scalable_targets['MaxCapacity'] return 0 def describe(self): return self.get_client().describe_services(cluster=self.cluster_arn, services=[self.service_arn])