github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_elastic_beanstalk_environment_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "regexp" 7 "testing" 8 9 "github.com/aws/aws-sdk-go/aws" 10 "github.com/aws/aws-sdk-go/aws/awserr" 11 "github.com/aws/aws-sdk-go/service/elasticbeanstalk" 12 "github.com/hashicorp/terraform/helper/acctest" 13 "github.com/hashicorp/terraform/helper/resource" 14 "github.com/hashicorp/terraform/terraform" 15 ) 16 17 func TestAccAWSBeanstalkEnv_basic(t *testing.T) { 18 var app elasticbeanstalk.EnvironmentDescription 19 20 resource.Test(t, resource.TestCase{ 21 PreCheck: func() { testAccPreCheck(t) }, 22 Providers: testAccProviders, 23 CheckDestroy: testAccCheckBeanstalkEnvDestroy, 24 Steps: []resource.TestStep{ 25 resource.TestStep{ 26 Config: testAccBeanstalkEnvConfig, 27 Check: resource.ComposeTestCheckFunc( 28 testAccCheckBeanstalkEnvExists("aws_elastic_beanstalk_environment.tfenvtest", &app), 29 ), 30 }, 31 }, 32 }) 33 } 34 35 func TestAccAWSBeanstalkEnv_tier(t *testing.T) { 36 var app elasticbeanstalk.EnvironmentDescription 37 beanstalkQueuesNameRegexp := regexp.MustCompile("https://sqs.+?awseb[^,]+") 38 39 resource.Test(t, resource.TestCase{ 40 PreCheck: func() { testAccPreCheck(t) }, 41 Providers: testAccProviders, 42 CheckDestroy: testAccCheckBeanstalkEnvDestroy, 43 Steps: []resource.TestStep{ 44 resource.TestStep{ 45 Config: testAccBeanstalkWorkerEnvConfig, 46 Check: resource.ComposeTestCheckFunc( 47 testAccCheckBeanstalkEnvTier("aws_elastic_beanstalk_environment.tfenvtest", &app), 48 resource.TestMatchResourceAttr( 49 "aws_elastic_beanstalk_environment.tfenvtest", "queues.0", beanstalkQueuesNameRegexp), 50 ), 51 }, 52 }, 53 }) 54 } 55 56 func TestAccAWSBeanstalkEnv_outputs(t *testing.T) { 57 var app elasticbeanstalk.EnvironmentDescription 58 beanstalkAsgNameRegexp := regexp.MustCompile("awseb.+?AutoScalingGroup[^,]+") 59 beanstalkElbNameRegexp := regexp.MustCompile("awseb.+?EBLoa[^,]+") 60 beanstalkInstancesNameRegexp := regexp.MustCompile("i-([0-9a-fA-F]{8}|[0-9a-fA-F]{17})") 61 beanstalkLcNameRegexp := regexp.MustCompile("awseb.+?AutoScalingLaunch[^,]+") 62 63 resource.Test(t, resource.TestCase{ 64 PreCheck: func() { testAccPreCheck(t) }, 65 Providers: testAccProviders, 66 CheckDestroy: testAccCheckBeanstalkEnvDestroy, 67 Steps: []resource.TestStep{ 68 resource.TestStep{ 69 Config: testAccBeanstalkEnvConfig, 70 Check: resource.ComposeTestCheckFunc( 71 testAccCheckBeanstalkEnvExists("aws_elastic_beanstalk_environment.tfenvtest", &app), 72 resource.TestMatchResourceAttr( 73 "aws_elastic_beanstalk_environment.tfenvtest", "autoscaling_groups.0", beanstalkAsgNameRegexp), 74 resource.TestMatchResourceAttr( 75 "aws_elastic_beanstalk_environment.tfenvtest", "load_balancers.0", beanstalkElbNameRegexp), 76 resource.TestMatchResourceAttr( 77 "aws_elastic_beanstalk_environment.tfenvtest", "instances.0", beanstalkInstancesNameRegexp), 78 resource.TestMatchResourceAttr( 79 "aws_elastic_beanstalk_environment.tfenvtest", "launch_configurations.0", beanstalkLcNameRegexp), 80 ), 81 }, 82 }, 83 }) 84 } 85 86 func TestAccAWSBeanstalkEnv_cname_prefix(t *testing.T) { 87 var app elasticbeanstalk.EnvironmentDescription 88 cnamePrefix := acctest.RandString(8) 89 beanstalkCnameRegexp := regexp.MustCompile("^" + cnamePrefix + ".+?elasticbeanstalk.com$") 90 91 resource.Test(t, resource.TestCase{ 92 PreCheck: func() { testAccPreCheck(t) }, 93 Providers: testAccProviders, 94 CheckDestroy: testAccCheckBeanstalkEnvDestroy, 95 Steps: []resource.TestStep{ 96 resource.TestStep{ 97 Config: testAccBeanstalkEnvCnamePrefixConfig(cnamePrefix), 98 Check: resource.ComposeTestCheckFunc( 99 testAccCheckBeanstalkEnvExists("aws_elastic_beanstalk_environment.tfenvtest", &app), 100 resource.TestMatchResourceAttr( 101 "aws_elastic_beanstalk_environment.tfenvtest", "cname", beanstalkCnameRegexp), 102 ), 103 }, 104 }, 105 }) 106 } 107 108 func testAccCheckBeanstalkEnvDestroy(s *terraform.State) error { 109 conn := testAccProvider.Meta().(*AWSClient).elasticbeanstalkconn 110 111 for _, rs := range s.RootModule().Resources { 112 if rs.Type != "aws_elastic_beanstalk_environment" { 113 continue 114 } 115 116 // Try to find the environment 117 describeBeanstalkEnvOpts := &elasticbeanstalk.DescribeEnvironmentsInput{ 118 EnvironmentIds: []*string{aws.String(rs.Primary.ID)}, 119 } 120 resp, err := conn.DescribeEnvironments(describeBeanstalkEnvOpts) 121 if err == nil { 122 switch { 123 case len(resp.Environments) > 1: 124 return fmt.Errorf("Error %d environments match, expected 1", len(resp.Environments)) 125 case len(resp.Environments) == 1: 126 if *resp.Environments[0].Status == "Terminated" { 127 return nil 128 } 129 return fmt.Errorf("Elastic Beanstalk ENV still exists.") 130 default: 131 return nil 132 } 133 } 134 135 // Verify the error is what we want 136 ec2err, ok := err.(awserr.Error) 137 if !ok { 138 return err 139 } 140 if ec2err.Code() != "InvalidBeanstalkEnvID.NotFound" { 141 return err 142 } 143 } 144 145 return nil 146 } 147 148 func testAccCheckBeanstalkEnvExists(n string, app *elasticbeanstalk.EnvironmentDescription) resource.TestCheckFunc { 149 return func(s *terraform.State) error { 150 rs, ok := s.RootModule().Resources[n] 151 if !ok { 152 return fmt.Errorf("Not found: %s", n) 153 } 154 155 if rs.Primary.ID == "" { 156 return fmt.Errorf("Elastic Beanstalk ENV is not set") 157 } 158 159 env, err := describeBeanstalkEnv(testAccProvider.Meta().(*AWSClient).elasticbeanstalkconn, aws.String(rs.Primary.ID)) 160 if err != nil { 161 return err 162 } 163 164 *app = *env 165 166 return nil 167 } 168 } 169 170 func testAccCheckBeanstalkEnvTier(n string, app *elasticbeanstalk.EnvironmentDescription) resource.TestCheckFunc { 171 return func(s *terraform.State) error { 172 rs, ok := s.RootModule().Resources[n] 173 if !ok { 174 return fmt.Errorf("Not found: %s", n) 175 } 176 177 if rs.Primary.ID == "" { 178 return fmt.Errorf("Elastic Beanstalk ENV is not set") 179 } 180 181 env, err := describeBeanstalkEnv(testAccProvider.Meta().(*AWSClient).elasticbeanstalkconn, aws.String(rs.Primary.ID)) 182 if err != nil { 183 return err 184 } 185 if *env.Tier.Name != "Worker" { 186 return fmt.Errorf("Beanstalk Environment tier is %s, expected Worker", *env.Tier.Name) 187 } 188 189 *app = *env 190 191 return nil 192 } 193 } 194 195 func describeBeanstalkEnv(conn *elasticbeanstalk.ElasticBeanstalk, 196 envID *string) (*elasticbeanstalk.EnvironmentDescription, error) { 197 describeBeanstalkEnvOpts := &elasticbeanstalk.DescribeEnvironmentsInput{ 198 EnvironmentIds: []*string{envID}, 199 } 200 201 log.Printf("[DEBUG] Elastic Beanstalk Environment TEST describe opts: %s", describeBeanstalkEnvOpts) 202 203 resp, err := conn.DescribeEnvironments(describeBeanstalkEnvOpts) 204 if err != nil { 205 return &elasticbeanstalk.EnvironmentDescription{}, err 206 } 207 if len(resp.Environments) == 0 { 208 return &elasticbeanstalk.EnvironmentDescription{}, fmt.Errorf("Elastic Beanstalk ENV not found.") 209 } 210 if len(resp.Environments) > 1 { 211 return &elasticbeanstalk.EnvironmentDescription{}, fmt.Errorf("Found %d environments, expected 1.", len(resp.Environments)) 212 } 213 return resp.Environments[0], nil 214 } 215 216 const testAccBeanstalkEnvConfig = ` 217 resource "aws_elastic_beanstalk_application" "tftest" { 218 name = "tf-test-name" 219 description = "tf-test-desc" 220 } 221 222 resource "aws_elastic_beanstalk_environment" "tfenvtest" { 223 name = "tf-test-name" 224 application = "${aws_elastic_beanstalk_application.tftest.name}" 225 solution_stack_name = "64bit Amazon Linux running Python" 226 } 227 ` 228 229 const testAccBeanstalkWorkerEnvConfig = ` 230 resource "aws_elastic_beanstalk_application" "tftest" { 231 name = "tf-test-name" 232 description = "tf-test-desc" 233 } 234 235 resource "aws_elastic_beanstalk_environment" "tfenvtest" { 236 name = "tf-test-name" 237 application = "${aws_elastic_beanstalk_application.tftest.name}" 238 tier = "Worker" 239 solution_stack_name = "64bit Amazon Linux running Python" 240 } 241 ` 242 243 func testAccBeanstalkEnvCnamePrefixConfig(randString string) string { 244 return fmt.Sprintf(` 245 resource "aws_elastic_beanstalk_application" "tftest" { 246 name = "tf-test-name" 247 description = "tf-test-desc" 248 } 249 250 resource "aws_elastic_beanstalk_environment" "tfenvtest" { 251 name = "tf-test-name" 252 application = "${aws_elastic_beanstalk_application.tftest.name}" 253 cname_prefix = "%s" 254 solution_stack_name = "64bit Amazon Linux running Python" 255 } 256 `, randString) 257 }