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