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 }