in app/model/ASG.scala [60:130]
private def fromInstancesWithAutoscalingGroupName(autoScalingGroupNameOpt: Option[String], instances: Seq[ec2.model.Instance])
(implicit conn: AmazonConnection, ws: WSClient): Future[ASG] = {
val tags = instances.flatMap(i => i.getTags.asScala.toList.map(t => t.getKey -> t.getValue)).toMap
val asgFtO = for {
asgName <- FutureO.toFut(autoScalingGroupNameOpt)
asg <- FutureO(EstateInstances.fetchAsgByName(asgName))
} yield asg
val awsAsgInstances = for {
asg <- asgFtO
} yield asg.getInstances.asScala.toList
val elbOptFt: FutureO[ELB] = for {
asg <- asgFtO
elbName <- FutureO.toFut(asg.getLoadBalancerNames.asScala.headOption)
elb <- FutureO.toOpt(ELB.forName(elbName))
} yield elb
val recentActivity = for {
asg <- asgFtO
actions <- FutureO.toOpt(ScalingAction.forGroup(asg.getAutoScalingGroupName))
} yield actions filter (_.isRecent)
val cpuFtO = for {
asg <- asgFtO
stats <- FutureO.toOpt(AWS.futureOf(conn.cloudWatch.getMetricStatisticsAsync, new GetMetricStatisticsRequest()
.withDimensions(new Dimension().withName("AutoScalingGroupName").withValue(asg.getAutoScalingGroupName))
.withMetricName("CPUUtilization").withNamespace("AWS/EC2").withPeriod(60)
.withStatistics(Maximum, Average)
.withStartTime(DateTime.now().minusHours(3).toDate).withEndTime(DateTime.now().toDate)
))
} yield stats.getDatapoints.asScala.toList.sortBy(_.getTimestamp)
val suspendedProcesses = for {
asg <- asgFtO
processes = asg.getSuspendedProcesses.asScala.toList.map(_.getProcessName).sorted
} yield processes
for {
elbOpt <- elbOptFt.futureOption
membersOfElb = elbOpt.map(_.members).getOrElse(Nil)
membersOfASGOpt <- awsAsgInstances.futureOption
membersOfASG = membersOfASGOpt.getOrElse(Nil)
clusterMembers = Future.sequence(instances.map(i => Instance.from(i, cost).map(i => ASGMember.from(i, membersOfASG.find(_.getInstanceId == i.id), membersOfElb.find(_.id == i.id)))))
members <- clusterMembers
activities <- recentActivity.futureOption
cpu <- cpuFtO.futureOption
susPro <- suspendedProcesses.futureOption
} yield {
val moreDetailsLink = ManagementTag(tags.get("Management")).flatMap { t =>
if (t.format == Some("elasticsearch")) {
autoScalingGroupNameOpt.map(name => (routes.Application.es(name).url))
} else None
}
ASG(
name = autoScalingGroupNameOpt,
stage = tags.get("Stage"),
app = tags.get("App") orElse tags.get("Role"),
stack = tags.get("Stack"),
elb = elbOpt,
members = members.sortBy(_.instance.availabilityZone),
recentActivity = activities.getOrElse(Nil),
cpu = cpu.getOrElse(Nil),
suspendedActivities = susPro.getOrElse(Nil),
approxMonthlyCost = Try(members.flatMap(_.instance.approxMonthlyCost).sum).toOption,
moreDetailsLink = moreDetailsLink,
hint = ASG.hintProvider.lift(tags)
)
}
}