in integration-test/aws-api-ec2/src/it/scala/org/apache/pekko/cluster/bootstrap/IntegrationTest.scala [96:168]
override def beforeAll(): Unit = {
log.info("setting up infrastructure using CloudFormation")
val template = readTemplateFromResourceFolder("CloudFormation/pekko-cluster.json")
val myIp: String = s"$getMyIp/32"
val createStackRequest = new CreateStackRequest()
.withCapabilities("CAPABILITY_IAM")
.withStackName(stackName)
.withTemplateBody(template)
.withParameters(
new Parameter()
.withParameterKey("Build")
.withParameterValue(s"https://s3.amazonaws.com/$bucket/$buildId/app.zip"),
new Parameter().withParameterKey("SSHLocation").withParameterValue(myIp),
new Parameter().withParameterKey("InstanceCount").withParameterValue(instanceCount.toString),
new Parameter().withParameterKey("InstanceType").withParameterValue("m3.xlarge"),
new Parameter().withParameterKey("KeyPair").withParameterValue("none"),
new Parameter().withParameterKey("Purpose").withParameterValue(s"demo-$buildId"))
awsCfClient.createStack(createStackRequest)
val describeStacksRequest = new DescribeStacksRequest().withStackName(stackName)
var dsr: DescribeStacksResult = null
def conditions: Boolean = (dsr.getStacks.size() == 1) && {
val stack = dsr.getStacks.get(0)
stack.getStackStatus == StackStatus.CREATE_COMPLETE.toString &&
stack.getOutputs.size() >= 1 &&
stack.getOutputs.asScala.exists(_.getOutputKey == "AutoScalingGroupName")
}
implicit val patienceConfig: PatienceConfig = createStackPatience
eventually {
log.info("CloudFormation stack name is {}, waiting for a CREATE_COMPLETE", stackName)
dsr = awsCfClient.describeStacks(describeStacksRequest)
conditions shouldBe true
}
if (conditions) {
log.info("got CREATE_COMPLETE, trying to obtain IPs of EC2 instances launched")
val asgName =
dsr.getStacks.get(0).getOutputs.asScala.find(_.getOutputKey == "AutoScalingGroupName").get.getOutputValue
val ips: List[(String, String)] = awsEc2Client
.describeInstances(new DescribeInstancesRequest()
.withFilters(new Filter("tag:aws:autoscaling:groupName", List(asgName).asJava)))
.getReservations
.asScala
.flatMap((r: Reservation) =>
r.getInstances.asScala.map(instance => (instance.getPublicIpAddress, instance.getPrivateIpAddress)))
.toList
.filter(ips =>
ips._1 != null && ips._2 != null) // TODO: investigate whether there are edge cases that may makes this necessary
clusterPublicIps = ips.map(_._1)
clusterPrivateIps = ips.map(_._2)
log.info("EC2 instances launched have the following public IPs {}", clusterPublicIps.mkString(", "))
}
}