app/prism/Prism.scala (124 lines of code) (raw):
package prism
import config.AMIableConfig
import models._
import prism.JsonUtils._
import prism.Urls._
import utils.Percentiles
import scala.concurrent.ExecutionContext
object Prism {
import PrismLogic._
def getOwners(implicit
config: AMIableConfig,
ec: ExecutionContext
): Attempt[Owners] = {
val url = ownersUrl(config.prismUrl)
for {
response <- Http.response(
config.wsClient.url(url).get(),
"Unable to fetch Owners",
url
)
ownersJson <- ownersResponseJson(response)
owners <- extractOwners(ownersJson)
} yield owners
}
def getAMI(
arn: String
)(implicit config: AMIableConfig, ec: ExecutionContext): Attempt[AMI] = {
val url = amiUrl(arn, config.prismUrl)
for {
response <- Http.response(
config.wsClient.url(url).get(),
"Unable to fetch AMI",
url
)
json <- amiResponseJson(response)
ami <- extractAMI(json)
} yield ami
}
def getAMIs()(implicit
config: AMIableConfig,
ec: ExecutionContext
): Attempt[List[AMI]] = {
val url = amisUrl(config.prismUrl)
for {
response <- Http.response(
config.wsClient.url(url).get(),
"Unable to fetch AMIs",
url
)
jsons <- amisResponseJson(response)
amis <- Attempt.sequence(jsons.map(extractAMI))
} yield amis
}
def getInstances(stackStageApp: SSAA)(implicit
config: AMIableConfig,
ec: ExecutionContext
): Attempt[List[Instance]] = {
val url = instancesUrl(stackStageApp, config.prismUrl)
getInstancesFromUrl(url)
}
def imageUsage(image: AMI)(implicit
config: AMIableConfig,
ec: ExecutionContext
): Attempt[List[Instance]] = {
val url = imageInstancesUrl(image.imageId, config.prismUrl)
getInstancesFromUrl(url)
}
private def getInstancesFromUrl(url: String)(implicit
config: AMIableConfig,
ec: ExecutionContext
): Attempt[List[Instance]] = {
for {
response <- Http.response(
config.wsClient.url(url).get(),
"Unable to fetch instance",
url
)
jsons <- instancesResponseJson(response)
instances <- Attempt.sequence(jsons.map(extractInstance))
} yield instances
}
def instancesWithAmis(stackStageApp: SSAA)(implicit
config: AMIableConfig,
ec: ExecutionContext
): Attempt[List[(Instance, Option[AMI])]] = {
for {
prodInstances <- getInstances(stackStageApp)
amiAttempts = amiArns(prodInstances).map(getAMI)
amis <- Attempt.successfulAttempts(amiAttempts)
} yield instanceAmis(prodInstances, amis)
}
def launchConfigUsage(image: AMI)(implicit
config: AMIableConfig,
ec: ExecutionContext
): Attempt[List[LaunchConfiguration]] = {
val url = imageLaunchConfigUrl(image.imageId, config.prismUrl)
for {
response <- Http.response(
config.wsClient.url(url).get(),
"Unable to fetch launch configurations",
url
)
jsons <- launchConfigurationResponseJson(response)
launchConfigurations <- Attempt.sequence(
jsons.map(extractLaunchConfiguration)
)
} yield launchConfigurations
}
def getAccounts(implicit
config: AMIableConfig,
ec: ExecutionContext
): Attempt[List[AWSAccount]] = {
val url = s"${config.prismUrl}/sources/accounts"
for {
response <- Http.response(
config.wsClient.url(url).get(),
"Unable to fetch accounts list",
url
)
jsons <- accountsResponseJson(response)
accounts <- Attempt.sequence(jsons.map(extractAccounts))
} yield accounts
}
}