package com.sequenceiq.cloudbreak.cloud.aws; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.inject.Inject; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.amazonaws.services.autoscaling.AmazonAutoScalingClient; import com.amazonaws.services.autoscaling.model.DescribeAutoScalingGroupsRequest; import com.amazonaws.services.autoscaling.model.DescribeAutoScalingGroupsResult; import com.amazonaws.services.autoscaling.model.Instance; import com.amazonaws.services.cloudformation.AmazonCloudFormationClient; import com.amazonaws.services.cloudformation.model.DescribeStackResourceRequest; import com.amazonaws.services.cloudformation.model.DescribeStackResourceResult; import com.amazonaws.services.ec2.model.DescribeInstancesRequest; import com.google.common.base.Splitter; import com.sequenceiq.cloudbreak.cloud.aws.view.AwsCredentialView; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; @Service public class CloudFormationStackUtil { @Value("${cb.max.aws.resource.name.length:}") private int maxResourceNameLength; @Inject private AwsClient awsClient; public String getAutoscalingGroupName(AuthenticatedContext ac, String instanceGroup, String region) { AmazonCloudFormationClient amazonCfClient = awsClient.createCloudFormationClient(new AwsCredentialView(ac.getCloudCredential()), region); return getAutoscalingGroupName(ac, amazonCfClient, instanceGroup); } public String getAutoscalingGroupName(AuthenticatedContext ac, AmazonCloudFormationClient amazonCFClient, String instanceGroup) { String cFStackName = getCfStackName(ac); DescribeStackResourceResult asGroupResource = amazonCFClient.describeStackResource(new DescribeStackResourceRequest() .withStackName(cFStackName) .withLogicalResourceId(String.format("AmbariNodes%s", instanceGroup.replaceAll("_", "")))); return asGroupResource.getStackResourceDetail().getPhysicalResourceId(); } public String getCfStackName(AuthenticatedContext ac) { return String.format("%s-%s", Splitter.fixedLength(maxResourceNameLength - (ac.getCloudContext().getId().toString().length() + 1)) .splitToList(ac.getCloudContext().getName()).get(0), ac.getCloudContext().getId()); } public List<String> getInstanceIds(AmazonAutoScalingClient amazonASClient, String asGroupName) { DescribeAutoScalingGroupsResult describeAutoScalingGroupsResult = amazonASClient .describeAutoScalingGroups(new DescribeAutoScalingGroupsRequest().withAutoScalingGroupNames(asGroupName)); List<String> instanceIds = new ArrayList<>(); if (describeAutoScalingGroupsResult.getAutoScalingGroups().get(0).getInstances() != null) { for (Instance instance : describeAutoScalingGroupsResult.getAutoScalingGroups().get(0).getInstances()) { if (instance.getLifecycleState().equals("InService")) { instanceIds.add(instance.getInstanceId()); } } } return instanceIds; } public DescribeInstancesRequest createDescribeInstancesRequest(Collection<String> instanceIds) { return new DescribeInstancesRequest().withInstanceIds(instanceIds); } }