|  | @@ -32,6 +32,8 @@ import (
 | 
	
		
			
				|  |  |  	"github.com/aws/aws-sdk-go/aws"
 | 
	
		
			
				|  |  |  	"github.com/aws/aws-sdk-go/aws/request"
 | 
	
		
			
				|  |  |  	"github.com/aws/aws-sdk-go/aws/session"
 | 
	
		
			
				|  |  | +	"github.com/aws/aws-sdk-go/service/autoscaling"
 | 
	
		
			
				|  |  | +	"github.com/aws/aws-sdk-go/service/autoscaling/autoscalingiface"
 | 
	
		
			
				|  |  |  	"github.com/aws/aws-sdk-go/service/cloudformation"
 | 
	
		
			
				|  |  |  	"github.com/aws/aws-sdk-go/service/cloudformation/cloudformationiface"
 | 
	
		
			
				|  |  |  	"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
 | 
	
	
		
			
				|  | @@ -48,6 +50,7 @@ import (
 | 
	
		
			
				|  |  |  	"github.com/aws/aws-sdk-go/service/iam/iamiface"
 | 
	
		
			
				|  |  |  	"github.com/aws/aws-sdk-go/service/secretsmanager"
 | 
	
		
			
				|  |  |  	"github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface"
 | 
	
		
			
				|  |  | +	"github.com/hashicorp/go-multierror"
 | 
	
		
			
				|  |  |  	"github.com/sirupsen/logrus"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -61,6 +64,7 @@ type sdk struct {
 | 
	
		
			
				|  |  |  	CF  cloudformationiface.CloudFormationAPI
 | 
	
		
			
				|  |  |  	SM  secretsmanageriface.SecretsManagerAPI
 | 
	
		
			
				|  |  |  	SSM ssmiface.SSMAPI
 | 
	
		
			
				|  |  | +	AG  autoscalingiface.AutoScalingAPI
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func newSDK(sess *session.Session) sdk {
 | 
	
	
		
			
				|  | @@ -77,6 +81,7 @@ func newSDK(sess *session.Session) sdk {
 | 
	
		
			
				|  |  |  		CF:  cloudformation.New(sess),
 | 
	
		
			
				|  |  |  		SM:  secretsmanager.New(sess),
 | 
	
		
			
				|  |  |  		SSM: ssm.New(sess),
 | 
	
		
			
				|  |  | +		AG:  autoscaling.New(sess),
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -364,7 +369,24 @@ type stackResource struct {
 | 
	
		
			
				|  |  |  	Status    string
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func (s sdk) ListStackResources(ctx context.Context, name string) ([]stackResource, error) {
 | 
	
		
			
				|  |  | +type stackResourceFn func(r stackResource) error
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type stackResources []stackResource
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (resources stackResources) apply(awsType string, fn stackResourceFn) error {
 | 
	
		
			
				|  |  | +	var errs *multierror.Error
 | 
	
		
			
				|  |  | +	for _, r := range resources {
 | 
	
		
			
				|  |  | +		if r.Type == awsType {
 | 
	
		
			
				|  |  | +			err := fn(r)
 | 
	
		
			
				|  |  | +			if err != nil {
 | 
	
		
			
				|  |  | +				errs = multierror.Append(err)
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return errs.ErrorOrNil()
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (s sdk) ListStackResources(ctx context.Context, name string) (stackResources, error) {
 | 
	
		
			
				|  |  |  	// FIXME handle pagination
 | 
	
		
			
				|  |  |  	res, err := s.CF.ListStackResourcesWithContext(ctx, &cloudformation.ListStackResourcesInput{
 | 
	
		
			
				|  |  |  		StackName: aws.String(name),
 | 
	
	
		
			
				|  | @@ -373,7 +395,7 @@ func (s sdk) ListStackResources(ctx context.Context, name string) ([]stackResour
 | 
	
		
			
				|  |  |  		return nil, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	resources := []stackResource{}
 | 
	
		
			
				|  |  | +	resources := stackResources{}
 | 
	
		
			
				|  |  |  	for _, r := range res.StackResourceSummaries {
 | 
	
		
			
				|  |  |  		resources = append(resources, stackResource{
 | 
	
		
			
				|  |  |  			LogicalID: aws.StringValue(r.LogicalResourceId),
 | 
	
	
		
			
				|  | @@ -714,3 +736,18 @@ func (s sdk) SecurityGroupExists(ctx context.Context, sg string) (bool, error) {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	return len(desc.SecurityGroups) > 0, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (s sdk) DeleteCapacityProvider(ctx context.Context, arn string) error {
 | 
	
		
			
				|  |  | +	_, err := s.ECS.DeleteCapacityProvider(&ecs.DeleteCapacityProviderInput{
 | 
	
		
			
				|  |  | +		CapacityProvider: aws.String(arn),
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +	return err
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (s sdk) DeleteAutoscalingGroup(ctx context.Context, arn string) error {
 | 
	
		
			
				|  |  | +	_, err := s.AG.DeleteAutoScalingGroup(&autoscaling.DeleteAutoScalingGroupInput{
 | 
	
		
			
				|  |  | +		AutoScalingGroupName: aws.String(arn),
 | 
	
		
			
				|  |  | +		ForceDelete:          aws.Bool(true),
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +	return err
 | 
	
		
			
				|  |  | +}
 |