override def execute()

in magenta-lib/src/main/scala/magenta/tasks/ChangeSetTasks.scala [174:289]


  override def execute(resources: DeploymentResources, stopFlag: => Boolean) =
    if (!stopFlag) {
      CloudFormation.withCfnClient(keyRing, region, resources) { cfnClient =>
        S3.withS3client(keyRing, region, resources = resources) { s3Client =>
          STS.withSTSclient(keyRing, region, resources) { stsClient =>
            ASG.withAsgClient(keyRing, region, resources) { asgClient =>
              val accountNumber = STS.getAccountNumber(stsClient)

              val templateString = templatePath
                .fetchContentAsString()
                .right
                .getOrElse(
                  resources.reporter.fail(
                    s"Unable to locate cloudformation template s3://${templatePath.bucket}/${templatePath.key}"
                  )
                )

              val (stackName, changeSetType, existingParameters, currentTags) =
                stackLookup.lookup(resources.reporter, cfnClient)

              val template = processTemplate(
                stackName,
                templateString,
                s3Client,
                stsClient,
                region,
                resources.reporter
              )
              val templateParameters = CloudFormation
                .validateTemplate(template, cfnClient)
                .parameters
                .asScala
                .toList
                .map(tp =>
                  TemplateParameter(
                    tp.parameterKey,
                    Option(tp.defaultValue).isDefined
                  )
                )

              val minInServiceParameters: Map[CfnParam, Int] =
                changeSetType match {
                  case ChangeSetType.UPDATE =>
                    val cfnStackNameTag = TagMatch(
                      "aws:cloudformation:stack-name",
                      stackName
                    )
                    unresolvedParameters.minInServiceParameterMap.map {
                      case (cfnParam, asgTagRequirements) =>
                        cfnParam -> ASG.getMinInstancesInService(
                          asgTagRequirements :+ cfnStackNameTag,
                          asgClient,
                          resources.reporter
                        )
                    }
                  case ChangeSetType.CREATE =>
                    resources.reporter.verbose(
                      s"Creating a new CFN stack; using minInService parameters from template."
                    )
                    Map.empty
                  case _ =>
                    // This code path should never be reached. See `CloudFormationStackMetadata.getChangeSetType`.
                    resources.reporter.fail(
                      s"Unsupported change set type: $changeSetType"
                    )
                }

              val parameters = CloudFormationParameters
                .resolve(
                  resources.reporter,
                  unresolvedParameters,
                  accountNumber,
                  templateParameters,
                  existingParameters,
                  minInServiceParameters
                )
                .fold(
                  resources.reporter.fail(_),
                  identity
                )

              val awsParameters =
                convertInputParametersToAwsAndLog(
                  resources.reporter,
                  parameters,
                  existingParameters
                )

              resources.reporter.info(
                s"Creating Cloudformation change set. CloudFormation stack=$stackName. Change set name=${stackLookup.changeSetName}"
              )

              val maybeExecutionRole = CloudFormation.getExecutionRole(keyRing)
              maybeExecutionRole.foreach(role =>
                resources.reporter.verbose(s"Using execution role $role")
              )

              val mergedTags = currentTags ++ stackTags
              resources.reporter.info("Tags: " + mergedTags.mkString(", "))

              CloudFormation.createChangeSet(
                resources.reporter,
                stackLookup.changeSetName,
                changeSetType,
                stackName,
                Some(mergedTags),
                template,
                awsParameters,
                maybeExecutionRole,
                cfnClient
              )
            }
          }
        }
      }
    }