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  }