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