package core.aws.task.as;
import com.amazonaws.services.autoscaling.model.BlockDeviceMapping;
import com.amazonaws.services.autoscaling.model.CreateLaunchConfigurationRequest;
import com.amazonaws.services.autoscaling.model.Ebs;
import com.amazonaws.services.autoscaling.model.Tag;
import core.aws.client.AWS;
import core.aws.env.Environment;
import core.aws.resource.as.ASGroup;
import core.aws.resource.as.LaunchConfig;
import core.aws.resource.ec2.EBS;
import core.aws.resource.vpc.SubnetType;
import core.aws.util.Encodings;
import core.aws.util.Randoms;
/**
* @author neo
*/
public class ASGroupHelper {
private final Environment env;
public ASGroupHelper(Environment env) {
this.env = env;
}
public void createLaunchConfig(ASGroup asGroup) throws Exception {
String launchConfigName = env.name + "-" + asGroup.id + "-" + Randoms.alphaNumeric(6);
LaunchConfig launchConfig = asGroup.launchConfig;
CreateLaunchConfigurationRequest request = new CreateLaunchConfigurationRequest()
.withLaunchConfigurationName(launchConfigName)
.withKeyName(launchConfig.keyPair.remoteKeyPair.getKeyName())
.withInstanceType(launchConfig.instanceType)
.withImageId(launchConfig.ami.imageId())
.withSecurityGroups(launchConfig.securityGroup.remoteSecurityGroup.getGroupId())
.withUserData(Encodings.base64(userData(asGroup)));
if (EBS.enableEBSOptimized(launchConfig.instanceType)) { // this is not necessary since m4/c4 are EBS optimized enable by default, but there is bug in AWS console, we need to set this in order to display correct value
request.withEbsOptimized(true);
}
if (asGroup.subnet.type == SubnetType.PUBLIC) {
request.withAssociatePublicIpAddress(true);
}
if (launchConfig.instanceProfile != null)
request.withIamInstanceProfile(launchConfig.instanceProfile.remoteInstanceProfile.getInstanceProfileName());
if (launchConfig.ebs.rootVolumeSize != null) {
request.getBlockDeviceMappings().add(new BlockDeviceMapping()
.withDeviceName("/dev/sda1")
.withEbs(new Ebs().withVolumeSize(launchConfig.ebs.rootVolumeSize).withVolumeType(launchConfig.ebs.type)));
}
launchConfig.remoteLaunchConfig = AWS.as.createLaunchConfig(request);
}
private String userData(ASGroup asGroup) {
return "env=" + env.name + '&'
+ "id=" + asGroup.id + '&'
+ "name=" + instanceName(asGroup);
}
Tag nameTag(ASGroup asGroup) {
return new Tag().withKey("Name").withValue(instanceName(asGroup)).withPropagateAtLaunch(true);
}
String instanceName(ASGroup asGroup) {
StringBuilder name = new StringBuilder().append(env.name).append(':').append(asGroup.id);
if (!asGroup.id.equals(asGroup.launchConfig.ami.id())) {
name.append(':').append(asGroup.launchConfig.ami.id());
}
asGroup.launchConfig.ami.version()
.ifPresent(version -> name.append(":v").append(version));
return name.toString();
}
}