package core.aws.remote.as;
import com.amazonaws.services.autoscaling.model.AutoScalingGroup;
import com.amazonaws.services.autoscaling.model.LaunchConfiguration;
import com.amazonaws.services.autoscaling.model.ScalingPolicy;
import core.aws.client.AWS;
import core.aws.env.Environment;
import core.aws.resource.Resources;
import core.aws.resource.as.ASGroup;
import core.aws.resource.as.AutoScalingPolicy;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author neo
*/
public class ASGroupLoader {
private final Resources resources;
private final Environment env;
public ASGroupLoader(Resources resources, Environment env) {
this.resources = resources;
this.env = env;
}
public void load() {
String prefix = env.name + "-";
// find all AS group with prefix
List<AutoScalingGroup> asGroups = AWS.as.listASGroups().stream()
.filter(group -> group.getAutoScalingGroupName().startsWith(prefix))
.collect(Collectors.toList());
if (asGroups.isEmpty()) return;
// load remote launch config in one request to maximize the speed
List<String> launchConfigNames = asGroups.stream().map(AutoScalingGroup::getLaunchConfigurationName).collect(Collectors.toList());
Map<String, LaunchConfiguration> configs = AWS.as.describeLaunchConfigs(launchConfigNames);
for (AutoScalingGroup remoteASGroup : asGroups) {
String asGroupName = remoteASGroup.getAutoScalingGroupName();
String asGroupId = asGroupName.substring(prefix.length());
ASGroup asGroup = resources.find(ASGroup.class, asGroupId)
.orElseGet(() -> resources.add(new ASGroup(asGroupId)));
asGroup.remoteASGroup = remoteASGroup;
asGroup.launchConfig.remoteLaunchConfig = configs.get(remoteASGroup.getLaunchConfigurationName());
asGroup.foundInRemote();
List<ScalingPolicy> remotePolicies = AWS.as.describeScalingPolicies(asGroupName);
for (ScalingPolicy remotePolicy : remotePolicies) {
String policyId = remotePolicy.getPolicyName();
AutoScalingPolicy policy = resources.find(AutoScalingPolicy.class, policyId)
.orElseGet(() -> resources.add(new AutoScalingPolicy(policyId)));
policy.remotePolicy = remotePolicy;
policy.foundInRemote();
}
}
}
}