in magenta-lib/src/main/scala/magenta/tasks/AWS.scala [956:1005]
def describeStackEvents(name: String, client: CloudFormationClient) =
client.describeStackEvents(
DescribeStackEventsRequest.builder().stackName(name).build()
)
def findStackByTags(
tags: Map[String, String],
reporter: DeployReporter,
client: CloudFormationClient
): Option[AmazonStack] = {
def tagsMatch(stack: AmazonStack): Boolean =
tags.forall { case (key, value) =>
stack.tags.asScala.exists(t => t.key == key && t.value == value)
}
@tailrec
def recur(
nextToken: Option[String] = None,
existingStacks: List[AmazonStack] = Nil
): List[AmazonStack] = {
val request =
DescribeStacksRequest.builder().nextToken(nextToken.orNull).build()
val response = client.describeStacks(request)
val stacks = response.stacks.asScala.foldLeft(existingStacks) {
case (agg, stack) if tagsMatch(stack) => stack :: agg
case (agg, _) => agg
}
Option(response.nextToken) match {
case None => stacks
case token => recur(token, stacks)
}
}
recur() match {
case cfnStack :: Nil =>
reporter.verbose(
s"Found stack ${cfnStack.stackName} (${cfnStack.stackId})"
)
Some(cfnStack)
case Nil =>
None
case multipleStacks =>
reporter.fail(
s"More than one cloudformation stack match for $tags (matched ${multipleStacks.map(_.stackName).mkString(", ")}). Failing fast since this may be non-deterministic."
)
}
}