github.com/tarrant/terraform@v0.3.8-0.20150402012457-f68c9eee638e/builtin/providers/aws/resource_aws_elb_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"reflect"
     7  	"sort"
     8  	"testing"
     9  
    10  	"github.com/hashicorp/aws-sdk-go/aws"
    11  	"github.com/hashicorp/aws-sdk-go/gen/elb"
    12  	"github.com/hashicorp/terraform/helper/resource"
    13  	"github.com/hashicorp/terraform/terraform"
    14  )
    15  
    16  func TestAccAWSELB_basic(t *testing.T) {
    17  	var conf elb.LoadBalancerDescription
    18  	ssl_certificate_id := os.Getenv("AWS_SSL_CERTIFICATE_ID")
    19  
    20  	resource.Test(t, resource.TestCase{
    21  		PreCheck:     func() { testAccPreCheck(t) },
    22  		Providers:    testAccProviders,
    23  		CheckDestroy: testAccCheckAWSELBDestroy,
    24  		Steps: []resource.TestStep{
    25  			resource.TestStep{
    26  				Config: testAccAWSELBConfig,
    27  				Check: resource.ComposeTestCheckFunc(
    28  					testAccCheckAWSELBExists("aws_elb.bar", &conf),
    29  					testAccCheckAWSELBAttributes(&conf),
    30  					resource.TestCheckResourceAttr(
    31  						"aws_elb.bar", "name", "foobar-terraform-test"),
    32  					resource.TestCheckResourceAttr(
    33  						"aws_elb.bar", "availability_zones.2487133097", "us-west-2a"),
    34  					resource.TestCheckResourceAttr(
    35  						"aws_elb.bar", "availability_zones.221770259", "us-west-2b"),
    36  					resource.TestCheckResourceAttr(
    37  						"aws_elb.bar", "availability_zones.2050015877", "us-west-2c"),
    38  					resource.TestCheckResourceAttr(
    39  						"aws_elb.bar", "listener.206423021.instance_port", "8000"),
    40  					resource.TestCheckResourceAttr(
    41  						"aws_elb.bar", "listener.206423021.instance_protocol", "http"),
    42  					resource.TestCheckResourceAttr(
    43  						"aws_elb.bar", "listener.206423021.ssl_certificate_id", ssl_certificate_id),
    44  					resource.TestCheckResourceAttr(
    45  						"aws_elb.bar", "listener.206423021.lb_port", "80"),
    46  					resource.TestCheckResourceAttr(
    47  						"aws_elb.bar", "listener.206423021.lb_protocol", "http"),
    48  					resource.TestCheckResourceAttr(
    49  						"aws_elb.bar", "cross_zone_load_balancing", "true"),
    50  				),
    51  			},
    52  		},
    53  	})
    54  }
    55  
    56  func TestAccAWSELB_tags(t *testing.T) {
    57  	var conf elb.LoadBalancerDescription
    58  	var td elb.TagDescription
    59  
    60  	resource.Test(t, resource.TestCase{
    61  		PreCheck:     func() { testAccPreCheck(t) },
    62  		Providers:    testAccProviders,
    63  		CheckDestroy: testAccCheckAWSELBDestroy,
    64  		Steps: []resource.TestStep{
    65  			resource.TestStep{
    66  				Config: testAccAWSELBConfig,
    67  				Check: resource.ComposeTestCheckFunc(
    68  					testAccCheckAWSELBExists("aws_elb.bar", &conf),
    69  					testAccCheckAWSELBAttributes(&conf),
    70  					resource.TestCheckResourceAttr(
    71  						"aws_elb.bar", "name", "foobar-terraform-test"),
    72  					testAccLoadTags(&conf, &td),
    73  					testAccCheckELBTags(&td.Tags, "bar", "baz"),
    74  				),
    75  			},
    76  
    77  			resource.TestStep{
    78  				Config: testAccAWSELBConfig_TagUpdate,
    79  				Check: resource.ComposeTestCheckFunc(
    80  					testAccCheckAWSELBExists("aws_elb.bar", &conf),
    81  					testAccCheckAWSELBAttributes(&conf),
    82  					resource.TestCheckResourceAttr(
    83  						"aws_elb.bar", "name", "foobar-terraform-test"),
    84  					testAccLoadTags(&conf, &td),
    85  					testAccCheckELBTags(&td.Tags, "foo", "bar"),
    86  					testAccCheckELBTags(&td.Tags, "new", "type"),
    87  				),
    88  			},
    89  		},
    90  	})
    91  }
    92  
    93  func testAccLoadTags(conf *elb.LoadBalancerDescription, td *elb.TagDescription) resource.TestCheckFunc {
    94  	return func(s *terraform.State) error {
    95  		conn := testAccProvider.Meta().(*AWSClient).elbconn
    96  
    97  		describe, err := conn.DescribeTags(&elb.DescribeTagsInput{
    98  			LoadBalancerNames: []string{*conf.LoadBalancerName},
    99  		})
   100  
   101  		if err != nil {
   102  			return err
   103  		}
   104  		if len(describe.TagDescriptions) > 0 {
   105  			*td = describe.TagDescriptions[0]
   106  		}
   107  		return nil
   108  	}
   109  }
   110  
   111  func TestAccAWSELB_InstanceAttaching(t *testing.T) {
   112  	var conf elb.LoadBalancerDescription
   113  
   114  	testCheckInstanceAttached := func(count int) resource.TestCheckFunc {
   115  		return func(*terraform.State) error {
   116  			if len(conf.Instances) != count {
   117  				return fmt.Errorf("instance count does not match")
   118  			}
   119  			return nil
   120  		}
   121  	}
   122  
   123  	resource.Test(t, resource.TestCase{
   124  		PreCheck:     func() { testAccPreCheck(t) },
   125  		Providers:    testAccProviders,
   126  		CheckDestroy: testAccCheckAWSELBDestroy,
   127  		Steps: []resource.TestStep{
   128  			resource.TestStep{
   129  				Config: testAccAWSELBConfig,
   130  				Check: resource.ComposeTestCheckFunc(
   131  					testAccCheckAWSELBExists("aws_elb.bar", &conf),
   132  					testAccCheckAWSELBAttributes(&conf),
   133  				),
   134  			},
   135  
   136  			resource.TestStep{
   137  				Config: testAccAWSELBConfigNewInstance,
   138  				Check: resource.ComposeTestCheckFunc(
   139  					testAccCheckAWSELBExists("aws_elb.bar", &conf),
   140  					testCheckInstanceAttached(1),
   141  				),
   142  			},
   143  		},
   144  	})
   145  }
   146  
   147  func TestAccAWSELB_HealthCheck(t *testing.T) {
   148  	var conf elb.LoadBalancerDescription
   149  
   150  	resource.Test(t, resource.TestCase{
   151  		PreCheck:     func() { testAccPreCheck(t) },
   152  		Providers:    testAccProviders,
   153  		CheckDestroy: testAccCheckAWSELBDestroy,
   154  		Steps: []resource.TestStep{
   155  			resource.TestStep{
   156  				Config: testAccAWSELBConfigHealthCheck,
   157  				Check: resource.ComposeTestCheckFunc(
   158  					testAccCheckAWSELBExists("aws_elb.bar", &conf),
   159  					testAccCheckAWSELBAttributesHealthCheck(&conf),
   160  					resource.TestCheckResourceAttr(
   161  						"aws_elb.bar", "health_check.3484319807.healthy_threshold", "5"),
   162  					resource.TestCheckResourceAttr(
   163  						"aws_elb.bar", "health_check.3484319807.unhealthy_threshold", "5"),
   164  					resource.TestCheckResourceAttr(
   165  						"aws_elb.bar", "health_check.3484319807.target", "HTTP:8000/"),
   166  					resource.TestCheckResourceAttr(
   167  						"aws_elb.bar", "health_check.3484319807.timeout", "30"),
   168  					resource.TestCheckResourceAttr(
   169  						"aws_elb.bar", "health_check.3484319807.interval", "60"),
   170  				),
   171  			},
   172  		},
   173  	})
   174  }
   175  
   176  func TestAccAWSELBUpdate_HealthCheck(t *testing.T) {
   177  	resource.Test(t, resource.TestCase{
   178  		PreCheck:     func() { testAccPreCheck(t) },
   179  		Providers:    testAccProviders,
   180  		CheckDestroy: testAccCheckAWSELBDestroy,
   181  		Steps: []resource.TestStep{
   182  			resource.TestStep{
   183  				Config: testAccAWSELBConfigHealthCheck,
   184  				Check: resource.ComposeTestCheckFunc(
   185  					resource.TestCheckResourceAttr(
   186  						"aws_elb.bar", "health_check.3484319807.healthy_threshold", "5"),
   187  				),
   188  			},
   189  			resource.TestStep{
   190  				Config: testAccAWSELBConfigHealthCheck_update,
   191  				Check: resource.ComposeTestCheckFunc(
   192  					resource.TestCheckResourceAttr(
   193  						"aws_elb.bar", "health_check.2648756019.healthy_threshold", "10"),
   194  				),
   195  			},
   196  		},
   197  	})
   198  }
   199  
   200  func testAccCheckAWSELBDestroy(s *terraform.State) error {
   201  	conn := testAccProvider.Meta().(*AWSClient).elbconn
   202  
   203  	for _, rs := range s.RootModule().Resources {
   204  		if rs.Type != "aws_elb" {
   205  			continue
   206  		}
   207  
   208  		describe, err := conn.DescribeLoadBalancers(&elb.DescribeAccessPointsInput{
   209  			LoadBalancerNames: []string{rs.Primary.ID},
   210  		})
   211  
   212  		if err == nil {
   213  			if len(describe.LoadBalancerDescriptions) != 0 &&
   214  				*describe.LoadBalancerDescriptions[0].LoadBalancerName == rs.Primary.ID {
   215  				return fmt.Errorf("ELB still exists")
   216  			}
   217  		}
   218  
   219  		// Verify the error
   220  		providerErr, ok := err.(aws.APIError)
   221  		if !ok {
   222  			return err
   223  		}
   224  
   225  		if providerErr.Code != "InvalidLoadBalancerName.NotFound" {
   226  			return fmt.Errorf("Unexpected error: %s", err)
   227  		}
   228  	}
   229  
   230  	return nil
   231  }
   232  
   233  func testAccCheckAWSELBAttributes(conf *elb.LoadBalancerDescription) resource.TestCheckFunc {
   234  	return func(s *terraform.State) error {
   235  		zones := []string{"us-west-2a", "us-west-2b", "us-west-2c"}
   236  		sort.StringSlice(conf.AvailabilityZones).Sort()
   237  		if !reflect.DeepEqual(conf.AvailabilityZones, zones) {
   238  			return fmt.Errorf("bad availability_zones")
   239  		}
   240  
   241  		if *conf.LoadBalancerName != "foobar-terraform-test" {
   242  			return fmt.Errorf("bad name")
   243  		}
   244  
   245  		l := elb.Listener{
   246  			InstancePort:     aws.Integer(8000),
   247  			InstanceProtocol: aws.String("HTTP"),
   248  			LoadBalancerPort: aws.Integer(80),
   249  			Protocol:         aws.String("HTTP"),
   250  		}
   251  
   252  		if !reflect.DeepEqual(conf.ListenerDescriptions[0].Listener, &l) {
   253  			return fmt.Errorf(
   254  				"Got:\n\n%#v\n\nExpected:\n\n%#v\n",
   255  				conf.ListenerDescriptions[0].Listener,
   256  				l)
   257  		}
   258  
   259  		if *conf.DNSName == "" {
   260  			return fmt.Errorf("empty dns_name")
   261  		}
   262  
   263  		return nil
   264  	}
   265  }
   266  
   267  func testAccCheckAWSELBAttributesHealthCheck(conf *elb.LoadBalancerDescription) resource.TestCheckFunc {
   268  	return func(s *terraform.State) error {
   269  		zones := []string{"us-west-2a", "us-west-2b", "us-west-2c"}
   270  		sort.StringSlice(conf.AvailabilityZones).Sort()
   271  		if !reflect.DeepEqual(conf.AvailabilityZones, zones) {
   272  			return fmt.Errorf("bad availability_zones")
   273  		}
   274  
   275  		if *conf.LoadBalancerName != "foobar-terraform-test" {
   276  			return fmt.Errorf("bad name")
   277  		}
   278  
   279  		check := elb.HealthCheck{
   280  			Timeout:            aws.Integer(30),
   281  			UnhealthyThreshold: aws.Integer(5),
   282  			HealthyThreshold:   aws.Integer(5),
   283  			Interval:           aws.Integer(60),
   284  			Target:             aws.String("HTTP:8000/"),
   285  		}
   286  
   287  		if !reflect.DeepEqual(conf.HealthCheck, &check) {
   288  			return fmt.Errorf(
   289  				"Got:\n\n%#v\n\nExpected:\n\n%#v\n",
   290  				conf.HealthCheck,
   291  				check)
   292  		}
   293  
   294  		if *conf.DNSName == "" {
   295  			return fmt.Errorf("empty dns_name")
   296  		}
   297  
   298  		return nil
   299  	}
   300  }
   301  
   302  func testAccCheckAWSELBExists(n string, res *elb.LoadBalancerDescription) resource.TestCheckFunc {
   303  	return func(s *terraform.State) error {
   304  		rs, ok := s.RootModule().Resources[n]
   305  		if !ok {
   306  			return fmt.Errorf("Not found: %s", n)
   307  		}
   308  
   309  		if rs.Primary.ID == "" {
   310  			return fmt.Errorf("No ELB ID is set")
   311  		}
   312  
   313  		conn := testAccProvider.Meta().(*AWSClient).elbconn
   314  
   315  		describe, err := conn.DescribeLoadBalancers(&elb.DescribeAccessPointsInput{
   316  			LoadBalancerNames: []string{rs.Primary.ID},
   317  		})
   318  
   319  		if err != nil {
   320  			return err
   321  		}
   322  
   323  		if len(describe.LoadBalancerDescriptions) != 1 ||
   324  			*describe.LoadBalancerDescriptions[0].LoadBalancerName != rs.Primary.ID {
   325  			return fmt.Errorf("ELB not found")
   326  		}
   327  
   328  		*res = describe.LoadBalancerDescriptions[0]
   329  
   330  		return nil
   331  	}
   332  }
   333  
   334  const testAccAWSELBConfig = `
   335  resource "aws_elb" "bar" {
   336    name = "foobar-terraform-test"
   337    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   338  
   339    listener {
   340      instance_port = 8000
   341      instance_protocol = "http"
   342      lb_port = 80
   343      lb_protocol = "http"
   344    }
   345  
   346  	tags {
   347  		bar = "baz"
   348  	}
   349  
   350    cross_zone_load_balancing = true
   351  }
   352  `
   353  
   354  const testAccAWSELBConfig_TagUpdate = `
   355  resource "aws_elb" "bar" {
   356    name = "foobar-terraform-test"
   357    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   358  
   359    listener {
   360      instance_port = 8000
   361      instance_protocol = "http"
   362      lb_port = 80
   363      lb_protocol = "http"
   364    }
   365  
   366  	tags {
   367  		foo = "bar"
   368  		new = "type"
   369  	}
   370  
   371    cross_zone_load_balancing = true
   372  }
   373  `
   374  
   375  const testAccAWSELBConfigNewInstance = `
   376  resource "aws_elb" "bar" {
   377    name = "foobar-terraform-test"
   378    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   379  
   380    listener {
   381      instance_port = 8000
   382      instance_protocol = "http"
   383      lb_port = 80
   384      lb_protocol = "http"
   385    }
   386  
   387    instances = ["${aws_instance.foo.id}"]
   388  }
   389  
   390  resource "aws_instance" "foo" {
   391  	# us-west-2
   392  	ami = "ami-043a5034"
   393  	instance_type = "t1.micro"
   394  }
   395  `
   396  
   397  const testAccAWSELBConfigListenerSSLCertificateId = `
   398  resource "aws_elb" "bar" {
   399    name = "foobar-terraform-test"
   400    availability_zones = ["us-west-2a"]
   401  
   402    listener {
   403      instance_port = 8000
   404      instance_protocol = "http"
   405      ssl_certificate_id = "%s"
   406      lb_port = 443
   407      lb_protocol = "https"
   408    }
   409  }
   410  `
   411  
   412  const testAccAWSELBConfigHealthCheck = `
   413  resource "aws_elb" "bar" {
   414    name = "foobar-terraform-test"
   415    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   416  
   417    listener {
   418      instance_port = 8000
   419      instance_protocol = "http"
   420      lb_port = 80
   421      lb_protocol = "http"
   422    }
   423  
   424    health_check {
   425      healthy_threshold = 5
   426      unhealthy_threshold = 5
   427      target = "HTTP:8000/"
   428      interval = 60
   429      timeout = 30
   430    }
   431  }
   432  `
   433  
   434  const testAccAWSELBConfigHealthCheck_update = `
   435  resource "aws_elb" "bar" {
   436    name = "foobar-terraform-test"
   437    availability_zones = ["us-west-2a"]
   438  
   439    listener {
   440      instance_port = 8000
   441      instance_protocol = "http"
   442      lb_port = 80
   443      lb_protocol = "http"
   444    }
   445  
   446    health_check {
   447      healthy_threshold = 10
   448      unhealthy_threshold = 5
   449      target = "HTTP:8000/"
   450      interval = 60
   451      timeout = 30
   452    }
   453  }
   454  `