def describeStackEvents()

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."
        )
    }
  }