github.com/ndarilek/terraform@v0.3.8-0.20150320140257-d3135c1b2bac/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_InstanceAttaching(t *testing.T) {
    57  	var conf elb.LoadBalancerDescription
    58  
    59  	testCheckInstanceAttached := func(count int) resource.TestCheckFunc {
    60  		return func(*terraform.State) error {
    61  			if len(conf.Instances) != count {
    62  				return fmt.Errorf("instance count does not match")
    63  			}
    64  			return nil
    65  		}
    66  	}
    67  
    68  	resource.Test(t, resource.TestCase{
    69  		PreCheck:     func() { testAccPreCheck(t) },
    70  		Providers:    testAccProviders,
    71  		CheckDestroy: testAccCheckAWSELBDestroy,
    72  		Steps: []resource.TestStep{
    73  			resource.TestStep{
    74  				Config: testAccAWSELBConfig,
    75  				Check: resource.ComposeTestCheckFunc(
    76  					testAccCheckAWSELBExists("aws_elb.bar", &conf),
    77  					testAccCheckAWSELBAttributes(&conf),
    78  				),
    79  			},
    80  
    81  			resource.TestStep{
    82  				Config: testAccAWSELBConfigNewInstance,
    83  				Check: resource.ComposeTestCheckFunc(
    84  					testAccCheckAWSELBExists("aws_elb.bar", &conf),
    85  					testCheckInstanceAttached(1),
    86  				),
    87  			},
    88  		},
    89  	})
    90  }
    91  
    92  func TestAccAWSELB_HealthCheck(t *testing.T) {
    93  	var conf elb.LoadBalancerDescription
    94  
    95  	resource.Test(t, resource.TestCase{
    96  		PreCheck:     func() { testAccPreCheck(t) },
    97  		Providers:    testAccProviders,
    98  		CheckDestroy: testAccCheckAWSELBDestroy,
    99  		Steps: []resource.TestStep{
   100  			resource.TestStep{
   101  				Config: testAccAWSELBConfigHealthCheck,
   102  				Check: resource.ComposeTestCheckFunc(
   103  					testAccCheckAWSELBExists("aws_elb.bar", &conf),
   104  					testAccCheckAWSELBAttributesHealthCheck(&conf),
   105  					resource.TestCheckResourceAttr(
   106  						"aws_elb.bar", "health_check.3484319807.healthy_threshold", "5"),
   107  					resource.TestCheckResourceAttr(
   108  						"aws_elb.bar", "health_check.3484319807.unhealthy_threshold", "5"),
   109  					resource.TestCheckResourceAttr(
   110  						"aws_elb.bar", "health_check.3484319807.target", "HTTP:8000/"),
   111  					resource.TestCheckResourceAttr(
   112  						"aws_elb.bar", "health_check.3484319807.timeout", "30"),
   113  					resource.TestCheckResourceAttr(
   114  						"aws_elb.bar", "health_check.3484319807.interval", "60"),
   115  				),
   116  			},
   117  		},
   118  	})
   119  }
   120  
   121  func TestAccAWSELBUpdate_HealthCheck(t *testing.T) {
   122  	resource.Test(t, resource.TestCase{
   123  		PreCheck:     func() { testAccPreCheck(t) },
   124  		Providers:    testAccProviders,
   125  		CheckDestroy: testAccCheckAWSELBDestroy,
   126  		Steps: []resource.TestStep{
   127  			resource.TestStep{
   128  				Config: testAccAWSELBConfigHealthCheck,
   129  				Check: resource.ComposeTestCheckFunc(
   130  					resource.TestCheckResourceAttr(
   131  						"aws_elb.bar", "health_check.3484319807.healthy_threshold", "5"),
   132  				),
   133  			},
   134  			resource.TestStep{
   135  				Config: testAccAWSELBConfigHealthCheck_update,
   136  				Check: resource.ComposeTestCheckFunc(
   137  					resource.TestCheckResourceAttr(
   138  						"aws_elb.bar", "health_check.2648756019.healthy_threshold", "10"),
   139  				),
   140  			},
   141  		},
   142  	})
   143  }
   144  
   145  func testAccCheckAWSELBDestroy(s *terraform.State) error {
   146  	conn := testAccProvider.Meta().(*AWSClient).elbconn
   147  
   148  	for _, rs := range s.RootModule().Resources {
   149  		if rs.Type != "aws_elb" {
   150  			continue
   151  		}
   152  
   153  		describe, err := conn.DescribeLoadBalancers(&elb.DescribeAccessPointsInput{
   154  			LoadBalancerNames: []string{rs.Primary.ID},
   155  		})
   156  
   157  		if err == nil {
   158  			if len(describe.LoadBalancerDescriptions) != 0 &&
   159  				*describe.LoadBalancerDescriptions[0].LoadBalancerName == rs.Primary.ID {
   160  				return fmt.Errorf("ELB still exists")
   161  			}
   162  		}
   163  
   164  		// Verify the error
   165  		providerErr, ok := err.(aws.APIError)
   166  		if !ok {
   167  			return err
   168  		}
   169  
   170  		if providerErr.Code != "InvalidLoadBalancerName.NotFound" {
   171  			return fmt.Errorf("Unexpected error: %s", err)
   172  		}
   173  	}
   174  
   175  	return nil
   176  }
   177  
   178  func testAccCheckAWSELBAttributes(conf *elb.LoadBalancerDescription) resource.TestCheckFunc {
   179  	return func(s *terraform.State) error {
   180  		zones := []string{"us-west-2a", "us-west-2b", "us-west-2c"}
   181  		sort.StringSlice(conf.AvailabilityZones).Sort()
   182  		if !reflect.DeepEqual(conf.AvailabilityZones, zones) {
   183  			return fmt.Errorf("bad availability_zones")
   184  		}
   185  
   186  		if *conf.LoadBalancerName != "foobar-terraform-test" {
   187  			return fmt.Errorf("bad name")
   188  		}
   189  
   190  		l := elb.Listener{
   191  			InstancePort:     aws.Integer(8000),
   192  			InstanceProtocol: aws.String("HTTP"),
   193  			LoadBalancerPort: aws.Integer(80),
   194  			Protocol:         aws.String("HTTP"),
   195  		}
   196  
   197  		if !reflect.DeepEqual(conf.ListenerDescriptions[0].Listener, &l) {
   198  			return fmt.Errorf(
   199  				"Got:\n\n%#v\n\nExpected:\n\n%#v\n",
   200  				conf.ListenerDescriptions[0].Listener,
   201  				l)
   202  		}
   203  
   204  		if *conf.DNSName == "" {
   205  			return fmt.Errorf("empty dns_name")
   206  		}
   207  
   208  		return nil
   209  	}
   210  }
   211  
   212  func testAccCheckAWSELBAttributesHealthCheck(conf *elb.LoadBalancerDescription) resource.TestCheckFunc {
   213  	return func(s *terraform.State) error {
   214  		zones := []string{"us-west-2a", "us-west-2b", "us-west-2c"}
   215  		sort.StringSlice(conf.AvailabilityZones).Sort()
   216  		if !reflect.DeepEqual(conf.AvailabilityZones, zones) {
   217  			return fmt.Errorf("bad availability_zones")
   218  		}
   219  
   220  		if *conf.LoadBalancerName != "foobar-terraform-test" {
   221  			return fmt.Errorf("bad name")
   222  		}
   223  
   224  		check := elb.HealthCheck{
   225  			Timeout:            aws.Integer(30),
   226  			UnhealthyThreshold: aws.Integer(5),
   227  			HealthyThreshold:   aws.Integer(5),
   228  			Interval:           aws.Integer(60),
   229  			Target:             aws.String("HTTP:8000/"),
   230  		}
   231  
   232  		if !reflect.DeepEqual(conf.HealthCheck, &check) {
   233  			return fmt.Errorf(
   234  				"Got:\n\n%#v\n\nExpected:\n\n%#v\n",
   235  				conf.HealthCheck,
   236  				check)
   237  		}
   238  
   239  		if *conf.DNSName == "" {
   240  			return fmt.Errorf("empty dns_name")
   241  		}
   242  
   243  		return nil
   244  	}
   245  }
   246  
   247  func testAccCheckAWSELBExists(n string, res *elb.LoadBalancerDescription) resource.TestCheckFunc {
   248  	return func(s *terraform.State) error {
   249  		rs, ok := s.RootModule().Resources[n]
   250  		if !ok {
   251  			return fmt.Errorf("Not found: %s", n)
   252  		}
   253  
   254  		if rs.Primary.ID == "" {
   255  			return fmt.Errorf("No ELB ID is set")
   256  		}
   257  
   258  		conn := testAccProvider.Meta().(*AWSClient).elbconn
   259  
   260  		describe, err := conn.DescribeLoadBalancers(&elb.DescribeAccessPointsInput{
   261  			LoadBalancerNames: []string{rs.Primary.ID},
   262  		})
   263  
   264  		if err != nil {
   265  			return err
   266  		}
   267  
   268  		if len(describe.LoadBalancerDescriptions) != 1 ||
   269  			*describe.LoadBalancerDescriptions[0].LoadBalancerName != rs.Primary.ID {
   270  			return fmt.Errorf("ELB not found")
   271  		}
   272  
   273  		*res = describe.LoadBalancerDescriptions[0]
   274  
   275  		return nil
   276  	}
   277  }
   278  
   279  const testAccAWSELBConfig = `
   280  resource "aws_elb" "bar" {
   281    name = "foobar-terraform-test"
   282    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   283  
   284    listener {
   285      instance_port = 8000
   286      instance_protocol = "http"
   287      lb_port = 80
   288      lb_protocol = "http"
   289    }
   290  
   291    cross_zone_load_balancing = true
   292  }
   293  `
   294  
   295  const testAccAWSELBConfigNewInstance = `
   296  resource "aws_elb" "bar" {
   297    name = "foobar-terraform-test"
   298    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   299  
   300    listener {
   301      instance_port = 8000
   302      instance_protocol = "http"
   303      lb_port = 80
   304      lb_protocol = "http"
   305    }
   306  
   307    instances = ["${aws_instance.foo.id}"]
   308  }
   309  
   310  resource "aws_instance" "foo" {
   311  	# us-west-2
   312  	ami = "ami-043a5034"
   313  	instance_type = "t1.micro"
   314  }
   315  `
   316  
   317  const testAccAWSELBConfigListenerSSLCertificateId = `
   318  resource "aws_elb" "bar" {
   319    name = "foobar-terraform-test"
   320    availability_zones = ["us-west-2a"]
   321  
   322    listener {
   323      instance_port = 8000
   324      instance_protocol = "http"
   325      ssl_certificate_id = "%s"
   326      lb_port = 443
   327      lb_protocol = "https"
   328    }
   329  }
   330  `
   331  
   332  const testAccAWSELBConfigHealthCheck = `
   333  resource "aws_elb" "bar" {
   334    name = "foobar-terraform-test"
   335    availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"]
   336  
   337    listener {
   338      instance_port = 8000
   339      instance_protocol = "http"
   340      lb_port = 80
   341      lb_protocol = "http"
   342    }
   343  
   344    health_check {
   345      healthy_threshold = 5
   346      unhealthy_threshold = 5
   347      target = "HTTP:8000/"
   348      interval = 60
   349      timeout = 30
   350    }
   351  }
   352  `
   353  
   354  const testAccAWSELBConfigHealthCheck_update = `
   355  resource "aws_elb" "bar" {
   356    name = "foobar-terraform-test"
   357    availability_zones = ["us-west-2a"]
   358  
   359    listener {
   360      instance_port = 8000
   361      instance_protocol = "http"
   362      lb_port = 80
   363      lb_protocol = "http"
   364    }
   365  
   366    health_check {
   367      healthy_threshold = 10
   368      unhealthy_threshold = 5
   369      target = "HTTP:8000/"
   370      interval = 60
   371      timeout = 30
   372    }
   373  }
   374  `