hq/app/aws/cloudformation/CloudFormation.scala (40 lines of code) (raw):
package aws.cloudformation
import aws.{AwsClient, AwsClients}
import aws.AwsAsyncHandler.{asScala, handleAWSErrs}
import model.{AwsAccount, AwsStack}
import utils.attempt.{Attempt, FailedAttempt, Failure}
import scala.jdk.CollectionConverters._
import scala.concurrent.ExecutionContext
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.cloudformation.CloudFormationAsyncClient
import software.amazon.awssdk.services.cloudformation.model.{Stack, DescribeStacksRequest}
object CloudFormation {
private def getStackDescriptions(client: AwsClient[CloudFormationAsyncClient], account: AwsAccount, region: Region)(implicit ec: ExecutionContext): Attempt[List[Stack]] = {
val request = DescribeStacksRequest.builder.build()
handleAWSErrs(client)(asScala(client.client.describeStacks(request))).map(_.stacks.asScala.toList)
}
private def getStacks(account: AwsAccount, region: Region, cfnClients: AwsClients[CloudFormationAsyncClient])(implicit ec: ExecutionContext): Attempt[List[AwsStack]] = {
for {
cloudClient <- cfnClients.get(account, region)
stacks <- getStackDescriptions(cloudClient, account, region)
} yield parseStacks(stacks, region)
}
def getStacksFromAllRegions(
account: AwsAccount,
cfnClients: AwsClients[CloudFormationAsyncClient],
regions: List[Region]
)(implicit ec: ExecutionContext): Attempt[List[AwsStack]] = {
for {
stacks <- Attempt.flatTraverse(regions)(region => getStacks(account, region, cfnClients))
} yield stacks
}
private[cloudformation] def parseStacks(stacks: List[Stack], region: Region): List[AwsStack] = {
stacks.map { stack =>
AwsStack(
stack.stackId,
stack.stackName,
region.id
)
}
}
}