admin/app/tools/LoadBalancer.scala (63 lines of code) (raw):
package tools
import common.{Box, GuLogging}
import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient
import scala.jdk.CollectionConverters._
case class LoadBalancer(
id: String,
name: String,
project: String,
url: Option[String] = None,
testPath: Option[String] = None,
// Application load balancers (v2) have target groups, classic load balancers (v1) do not
targetGroup: Option[String] = None,
)
object LoadBalancer extends GuLogging {
import conf.Configuration.aws.credentials
private val loadBalancers = Seq(
LoadBalancer("frontend-PROD-router-ELB", "Router", "frontend-router"),
LoadBalancer(
"frontend-PROD-article-ELB",
"Article",
"frontend-article",
testPath = Some("/uk-news/2014/jan/21/drax-protesters-convictions-quashed-police-spy-mark-kennedy"),
),
LoadBalancer("frontend-PROD-facia-ELB", "Front", "frontend-facia", testPath = Some("/uk")),
LoadBalancer("frontend-PROD-applications-ELB", "Applications", "frontend-applications", testPath = Some("/books")),
LoadBalancer(
"app/fronte-LoadB-xmdWiUUHyRUS/122c59735e8374bb",
"Discussion",
"frontend-discussion",
targetGroup = Some("targetgroup/fronte-Targe-JGOOGIGPNWQJ/187642c8eda54a4a"),
),
LoadBalancer("frontend-PROD-identity-ELB", "Identity", "frontend-identity"),
LoadBalancer(
"app/fronte-LoadB-t2NTzJp2RZFf/4119950dc35e5cb4",
"Sport",
"frontend-sport",
targetGroup = Some("targetgroup/fronte-Targe-LJMDWMGH5FPD/e777dd4276b0bf29"),
),
LoadBalancer("frontend-PROD-commercial-ELB", "Commercial", "frontend-commercial"),
LoadBalancer("frontend-PROD-onward-ELB", "Onward", "frontend-onward"),
LoadBalancer("frontend-PROD-archive-ELB", "Archive", "frontend-archive"),
LoadBalancer("frontend-PROD-rss-ELB", "Rss", "frontend-rss"),
)
private val agent = Box(loadBalancers)
def refresh(): Unit = {
log.info("starting refresh LoadBalancer ELB DNS names")
credentials.foreach { credentials =>
val client = AmazonElasticLoadBalancingClient
.builder()
.withCredentials(credentials)
.withRegion(conf.Configuration.aws.region)
.build()
val elbs = client.describeLoadBalancers().getLoadBalancerDescriptions
client.shutdown()
val newLoadBalancers = loadBalancers.map { lb =>
lb.copy(url = elbs.asScala.find(_.getLoadBalancerName == lb.id).map(_.getDNSName))
}
agent.send(newLoadBalancers)
}
log.info("finished refresh LoadBalancer ELB DNS names")
}
def all: Seq[LoadBalancer] = agent()
def apply(project: String): Option[LoadBalancer] = agent().find(_.project == project)
}