app/collectors/loadBalancers.scala (76 lines of code) (raw):

package collectors import agent._ import software.amazon.awssdk.services.elasticloadbalancing.ElasticLoadBalancingClient import software.amazon.awssdk.services.elasticloadbalancing.model.{ DescribeLoadBalancersRequest, LoadBalancerDescription } import conf.AWS import controllers.routes import play.api.mvc.Call import utils.Logging import scala.jdk.CollectionConverters._ import scala.language.postfixOps class LoadBalancerCollectorSet(accounts: Accounts) extends CollectorSet[LoadBalancer]( ResourceType("loadBalancers"), accounts, Some(Regional) ) { val lookupCollector: PartialFunction[Origin, Collector[LoadBalancer]] = { case amazon: AmazonOrigin => LoadBalancerCollector(amazon, resource, amazon.crawlRate(resource.name)) } } case class LoadBalancerCollector( origin: AmazonOrigin, resource: ResourceType, crawlRate: CrawlRate ) extends Collector[LoadBalancer] with Logging { val client = ElasticLoadBalancingClient.builder .credentialsProvider(origin.credentials.provider) .region(origin.awsRegionV2) .overrideConfiguration(AWS.clientConfig) .build def crawl: Iterable[LoadBalancer] = { client .describeLoadBalancersPaginator( DescribeLoadBalancersRequest.builder.build ) .loadBalancerDescriptions .asScala .map { elb => LoadBalancer.fromApiData(elb, origin) } } } object LoadBalancer { def fromApiData( loadBalancer: LoadBalancerDescription, origin: AmazonOrigin ): LoadBalancer = { LoadBalancer( arn = s"arn:aws:elasticloadbalancing:${origin.region}:${origin.accountNumber .getOrElse("")}:loadbalancer/${loadBalancer.loadBalancerName}", name = loadBalancer.loadBalancerName, dnsName = loadBalancer.dnsName, vpcId = Option(loadBalancer.vpcId), scheme = Option(loadBalancer.scheme), availabilityZones = loadBalancer.availabilityZones.asScala.toList, subnets = loadBalancer.subnets.asScala.toList ) } } case class LoadBalancer( arn: String, name: String, dnsName: String, vpcId: Option[String], scheme: Option[String], availabilityZones: List[String], subnets: List[String] ) extends IndexedItem { def callFromArn: (String) => Call = arn => routes.Api.elb(arn) }