github.com/darmach/terratest@v0.34.8-0.20210517103231-80931f95e3ff/modules/aws/ecs.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/aws/aws-sdk-go/aws"
     7  	"github.com/aws/aws-sdk-go/service/ecs"
     8  	"github.com/gruntwork-io/terratest/modules/testing"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  // GetEcsCluster fetches information about specified ECS cluster.
    13  func GetEcsCluster(t testing.TestingT, region string, name string) *ecs.Cluster {
    14  	cluster, err := GetEcsClusterE(t, region, name)
    15  	require.NoError(t, err)
    16  	return cluster
    17  }
    18  
    19  // GetEcsClusterE fetches information about specified ECS cluster.
    20  func GetEcsClusterE(t testing.TestingT, region string, name string) (*ecs.Cluster, error) {
    21  	return GetEcsClusterWithIncludeE(t, region, name, []string{})
    22  }
    23  
    24  // GetEcsClusterWithInclude fetches extended information about specified ECS cluster.
    25  // The `include` parameter specifies a list of `ecs.ClusterField*` constants, such as `ecs.ClusterFieldTags`.
    26  func GetEcsClusterWithInclude(t testing.TestingT, region string, name string, include []string) *ecs.Cluster {
    27  	clusterInfo, err := GetEcsClusterWithIncludeE(t, region, name, include)
    28  	require.NoError(t, err)
    29  	return clusterInfo
    30  }
    31  
    32  // GetEcsClusterWithIncludeE fetches extended information about specified ECS cluster.
    33  // The `include` parameter specifies a list of `ecs.ClusterField*` constants, such as `ecs.ClusterFieldTags`.
    34  func GetEcsClusterWithIncludeE(t testing.TestingT, region string, name string, include []string) (*ecs.Cluster, error) {
    35  	client, err := NewEcsClientE(t, region)
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  	input := &ecs.DescribeClustersInput{
    40  		Clusters: []*string{
    41  			aws.String(name),
    42  		},
    43  		Include: aws.StringSlice(include),
    44  	}
    45  	output, err := client.DescribeClusters(input)
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  
    50  	numClusters := len(output.Clusters)
    51  	if numClusters != 1 {
    52  		return nil, fmt.Errorf("Expected to find 1 ECS cluster named '%s' in region '%v', but found '%d'",
    53  			name, region, numClusters)
    54  	}
    55  
    56  	return output.Clusters[0], nil
    57  }
    58  
    59  // GetDefaultEcsClusterE fetches information about default ECS cluster.
    60  func GetDefaultEcsClusterE(t testing.TestingT, region string) (*ecs.Cluster, error) {
    61  	return GetEcsClusterE(t, region, "default")
    62  }
    63  
    64  // GetDefaultEcsCluster fetches information about default ECS cluster.
    65  func GetDefaultEcsCluster(t testing.TestingT, region string) *ecs.Cluster {
    66  	return GetEcsCluster(t, region, "default")
    67  }
    68  
    69  // CreateEcsCluster creates ECS cluster in the given region under the given name.
    70  func CreateEcsCluster(t testing.TestingT, region string, name string) *ecs.Cluster {
    71  	cluster, err := CreateEcsClusterE(t, region, name)
    72  	require.NoError(t, err)
    73  	return cluster
    74  }
    75  
    76  // CreateEcsClusterE creates ECS cluster in the given region under the given name.
    77  func CreateEcsClusterE(t testing.TestingT, region string, name string) (*ecs.Cluster, error) {
    78  	client := NewEcsClient(t, region)
    79  	cluster, err := client.CreateCluster(&ecs.CreateClusterInput{
    80  		ClusterName: aws.String(name),
    81  	})
    82  	if err != nil {
    83  		return nil, err
    84  	}
    85  	return cluster.Cluster, nil
    86  }
    87  
    88  func DeleteEcsCluster(t testing.TestingT, region string, cluster *ecs.Cluster) {
    89  	err := DeleteEcsClusterE(t, region, cluster)
    90  	require.NoError(t, err)
    91  }
    92  
    93  // DeleteEcsClusterE deletes existing ECS cluster in the given region.
    94  func DeleteEcsClusterE(t testing.TestingT, region string, cluster *ecs.Cluster) error {
    95  	client := NewEcsClient(t, region)
    96  	_, err := client.DeleteCluster(&ecs.DeleteClusterInput{
    97  		Cluster: aws.String(*cluster.ClusterName),
    98  	})
    99  	return err
   100  }
   101  
   102  // GetEcsService fetches information about specified ECS service.
   103  func GetEcsService(t testing.TestingT, region string, clusterName string, serviceName string) *ecs.Service {
   104  	service, err := GetEcsServiceE(t, region, clusterName, serviceName)
   105  	require.NoError(t, err)
   106  	return service
   107  }
   108  
   109  // GetEcsServiceE fetches information about specified ECS service.
   110  func GetEcsServiceE(t testing.TestingT, region string, clusterName string, serviceName string) (*ecs.Service, error) {
   111  	output, err := NewEcsClient(t, region).DescribeServices(&ecs.DescribeServicesInput{
   112  		Cluster: aws.String(clusterName),
   113  		Services: []*string{
   114  			aws.String(serviceName),
   115  		},
   116  	})
   117  	if err != nil {
   118  		return nil, err
   119  	}
   120  
   121  	numServices := len(output.Services)
   122  	if numServices != 1 {
   123  		return nil, fmt.Errorf(
   124  			"Expected to find 1 ECS service named '%s' in cluster '%s' in region '%v', but found '%d'",
   125  			serviceName, clusterName, region, numServices)
   126  	}
   127  	return output.Services[0], nil
   128  }
   129  
   130  // GetEcsTaskDefinition fetches information about specified ECS task definition.
   131  func GetEcsTaskDefinition(t testing.TestingT, region string, taskDefinition string) *ecs.TaskDefinition {
   132  	task, err := GetEcsTaskDefinitionE(t, region, taskDefinition)
   133  	require.NoError(t, err)
   134  	return task
   135  }
   136  
   137  // GetEcsTaskDefinitionE fetches information about specified ECS task definition.
   138  func GetEcsTaskDefinitionE(t testing.TestingT, region string, taskDefinition string) (*ecs.TaskDefinition, error) {
   139  	output, err := NewEcsClient(t, region).DescribeTaskDefinition(&ecs.DescribeTaskDefinitionInput{
   140  		TaskDefinition: aws.String(taskDefinition),
   141  	})
   142  	if err != nil {
   143  		return nil, err
   144  	}
   145  	return output.TaskDefinition, nil
   146  }
   147  
   148  // NewEcsClient creates en ECS client.
   149  func NewEcsClient(t testing.TestingT, region string) *ecs.ECS {
   150  	client, err := NewEcsClientE(t, region)
   151  	require.NoError(t, err)
   152  	return client
   153  }
   154  
   155  // NewEcsClientE creates an ECS client.
   156  func NewEcsClientE(t testing.TestingT, region string) (*ecs.ECS, error) {
   157  	sess, err := NewAuthenticatedSession(region)
   158  	if err != nil {
   159  		return nil, err
   160  	}
   161  	return ecs.New(sess), nil
   162  }