package com.sequenceiq.cloudbreak.cloud.aws.task; import java.util.ArrayList; import java.util.List; import java.util.Optional; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import com.amazonaws.AmazonServiceException; import com.amazonaws.services.autoscaling.AmazonAutoScalingClient; import com.amazonaws.services.autoscaling.model.Activity; import com.amazonaws.services.autoscaling.model.DescribeScalingActivitiesRequest; import com.amazonaws.services.cloudformation.AmazonCloudFormationClient; import com.amazonaws.services.cloudformation.model.Stack; import com.amazonaws.services.cloudformation.model.StackEvent; import com.amazonaws.services.cloudformation.model.StackStatus; import com.google.common.base.Joiner; import com.sequenceiq.cloudbreak.cloud.context.AuthenticatedContext; import com.sequenceiq.cloudbreak.cloud.exception.CloudConnectorException; @Component(AwsCreateStackStatusCheckerTask.NAME) @Scope(value = "prototype") public class AwsCreateStackStatusCheckerTask extends AbstractAwsStackStatusCheckerTask { public static final String NAME = "awsCreateStackStatusCheckerTask"; private final AmazonAutoScalingClient asClient; public AwsCreateStackStatusCheckerTask(AuthenticatedContext authenticatedContext, AmazonCloudFormationClient cfClient, AmazonAutoScalingClient asClient, StackStatus successStatus, StackStatus errorStatus, List<StackStatus> stackErrorStatuses, String cloudFormationStackName) { super(authenticatedContext, cfClient, successStatus, errorStatus, stackErrorStatuses, cloudFormationStackName, true); this.asClient = asClient; } @Override protected boolean doCheck(Stack cfStack, List<StackEvent> stackEvents) { if (!stackEvents.isEmpty()) { final List<Activity> failedActivities = new ArrayList<>(); stackEvents.stream().filter(e -> e.getResourceType().equals("AWS::AutoScaling::AutoScalingGroup") && !e.getPhysicalResourceId().isEmpty()) .map(StackEvent::getPhysicalResourceId).forEach(id -> { DescribeScalingActivitiesRequest activitiesRequest = new DescribeScalingActivitiesRequest().withAutoScalingGroupName(id); Optional<Activity> activity = asClient.describeScalingActivities(activitiesRequest).getActivities().stream() .filter(a -> "Cancelled,Failed".contains(a.getStatusCode())).findFirst(); if (activity.isPresent()) { failedActivities.add(activity.get()); } }); if (!failedActivities.isEmpty()) { String errors = Joiner.on("], [").join(failedActivities.stream() .map(a -> String.format("%s: %s", a.getAutoScalingGroupName(), a.getStatusMessage())).toArray()); throw new CloudConnectorException(String.format("AWS AutoScaling groups creation went fail: [%s]", errors)); } } return isSuccess(cfStack, stackEvents); } @Override protected boolean handleError(AmazonServiceException e) { throw new CloudConnectorException(getErrorMessage(e.getErrorCode(), e.getErrorMessage())); } }