in app/prism/RecipeUsage.scala [78:122]
def apply(
bakes: Iterable[Bake]
)(implicit prismAgents: PrismData): RecipeUsage = {
val bakedAmiLookupMap = bakes.flatMap(b => b.amiId.map(_ -> b)).toMap
val bakedAmiIds = bakedAmiLookupMap.keys.toList
val copiedAmis = prismAgents.copiedImages(bakedAmiIds.toSet).values.flatten
val copiedAmiIds = copiedAmis.map(_.imageId)
val amiIds = bakedAmiIds ++ copiedAmiIds
val instances = prismAgents.allInstances.filter(instance =>
amiIds.contains(instance.imageId)
)
val launchConfigurations = prismAgents.allLaunchConfigurations.filter(lc =>
amiIds.contains(lc.imageId)
)
val launchTemplates =
prismAgents.allLaunchTemplates.filter(lt => amiIds.contains(lt.imageId))
val amis =
(instances.map(_.imageId) ++ launchConfigurations.map(
_.imageId
) ++ launchTemplates.map(_.imageId)).distinct
val copiedAmiLookupMap = copiedAmis.map { image =>
image.imageId -> image
}.toMap
val bakeUsage = amis.map { ami =>
val maybeDirectBake = bakedAmiLookupMap.get(ami)
val maybeCopy = copiedAmiLookupMap.get(ami)
val bake = (maybeDirectBake, maybeCopy) match {
case (Some(directBake), None) => directBake
case (None, Some(copy)) => bakedAmiLookupMap(copy.copiedFromAMI)
case _ =>
throw new IllegalArgumentException(
"AMI ID provided neither direct nor copied"
)
}
val amiInstances = instances.filter(_.imageId == ami)
val amiLc = launchConfigurations.filter(_.imageId == ami)
val amiLt = launchTemplates.filter(_.imageId == ami)
BakeUsage(ami, bake, maybeCopy, amiInstances, amiLc, amiLt)
}
RecipeUsage(instances, launchConfigurations, launchTemplates, bakeUsage)
}