github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_elb_attachment_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "log" 6 "testing" 7 8 "github.com/aws/aws-sdk-go/service/elb" 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 ) 12 13 func TestAccAWSELBAttachment_basic(t *testing.T) { 14 var conf elb.LoadBalancerDescription 15 16 testCheckInstanceAttached := func(count int) resource.TestCheckFunc { 17 return func(*terraform.State) error { 18 if len(conf.Instances) != count { 19 return fmt.Errorf("instance count does not match") 20 } 21 return nil 22 } 23 } 24 25 resource.Test(t, resource.TestCase{ 26 PreCheck: func() { testAccPreCheck(t) }, 27 IDRefreshName: "aws_elb.bar", 28 Providers: testAccProviders, 29 CheckDestroy: testAccCheckAWSELBDestroy, 30 Steps: []resource.TestStep{ 31 resource.TestStep{ 32 Config: testAccAWSELBAttachmentConfig1, 33 Check: resource.ComposeTestCheckFunc( 34 testAccCheckAWSELBExists("aws_elb.bar", &conf), 35 testCheckInstanceAttached(1), 36 ), 37 }, 38 39 resource.TestStep{ 40 Config: testAccAWSELBAttachmentConfig2, 41 Check: resource.ComposeTestCheckFunc( 42 testAccCheckAWSELBExists("aws_elb.bar", &conf), 43 testCheckInstanceAttached(2), 44 ), 45 }, 46 47 resource.TestStep{ 48 Config: testAccAWSELBAttachmentConfig3, 49 Check: resource.ComposeTestCheckFunc( 50 testAccCheckAWSELBExists("aws_elb.bar", &conf), 51 testCheckInstanceAttached(2), 52 ), 53 }, 54 55 resource.TestStep{ 56 Config: testAccAWSELBAttachmentConfig4, 57 Check: resource.ComposeTestCheckFunc( 58 testAccCheckAWSELBExists("aws_elb.bar", &conf), 59 testCheckInstanceAttached(0), 60 ), 61 }, 62 }, 63 }) 64 } 65 66 // remove and instance and check that it's correctly re-attached. 67 func TestAccAWSELBAttachment_drift(t *testing.T) { 68 var conf elb.LoadBalancerDescription 69 70 deregInstance := func() { 71 conn := testAccProvider.Meta().(*AWSClient).elbconn 72 73 deRegisterInstancesOpts := elb.DeregisterInstancesFromLoadBalancerInput{ 74 LoadBalancerName: conf.LoadBalancerName, 75 Instances: conf.Instances, 76 } 77 78 log.Printf("[DEBUG] deregistering instance %v from ELB", *conf.Instances[0].InstanceId) 79 80 _, err := conn.DeregisterInstancesFromLoadBalancer(&deRegisterInstancesOpts) 81 if err != nil { 82 t.Fatalf("Failure deregistering instances from ELB: %s", err) 83 } 84 85 } 86 87 testCheckInstanceAttached := func(count int) resource.TestCheckFunc { 88 return func(*terraform.State) error { 89 if len(conf.Instances) != count { 90 return fmt.Errorf("instance count does not match") 91 } 92 return nil 93 } 94 } 95 96 resource.Test(t, resource.TestCase{ 97 PreCheck: func() { testAccPreCheck(t) }, 98 IDRefreshName: "aws_elb.bar", 99 Providers: testAccProviders, 100 CheckDestroy: testAccCheckAWSELBDestroy, 101 Steps: []resource.TestStep{ 102 resource.TestStep{ 103 Config: testAccAWSELBAttachmentConfig1, 104 Check: resource.ComposeTestCheckFunc( 105 testAccCheckAWSELBExists("aws_elb.bar", &conf), 106 testCheckInstanceAttached(1), 107 ), 108 }, 109 110 // remove an instance from the ELB, and make sure it gets re-added 111 resource.TestStep{ 112 Config: testAccAWSELBAttachmentConfig1, 113 PreConfig: deregInstance, 114 Check: resource.ComposeTestCheckFunc( 115 testAccCheckAWSELBExists("aws_elb.bar", &conf), 116 testCheckInstanceAttached(1), 117 ), 118 }, 119 }, 120 }) 121 } 122 123 // add one attachment 124 const testAccAWSELBAttachmentConfig1 = ` 125 resource "aws_elb" "bar" { 126 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 127 128 listener { 129 instance_port = 8000 130 instance_protocol = "http" 131 lb_port = 80 132 lb_protocol = "http" 133 } 134 } 135 136 resource "aws_instance" "foo1" { 137 # us-west-2 138 ami = "ami-043a5034" 139 instance_type = "t1.micro" 140 } 141 142 resource "aws_elb_attachment" "foo1" { 143 elb = "${aws_elb.bar.id}" 144 instance = "${aws_instance.foo1.id}" 145 } 146 ` 147 148 // add a second attachment 149 const testAccAWSELBAttachmentConfig2 = ` 150 resource "aws_elb" "bar" { 151 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 152 153 listener { 154 instance_port = 8000 155 instance_protocol = "http" 156 lb_port = 80 157 lb_protocol = "http" 158 } 159 } 160 161 resource "aws_instance" "foo1" { 162 # us-west-2 163 ami = "ami-043a5034" 164 instance_type = "t1.micro" 165 } 166 167 resource "aws_instance" "foo2" { 168 # us-west-2 169 ami = "ami-043a5034" 170 instance_type = "t1.micro" 171 } 172 173 resource "aws_elb_attachment" "foo1" { 174 elb = "${aws_elb.bar.id}" 175 instance = "${aws_instance.foo1.id}" 176 } 177 178 resource "aws_elb_attachment" "foo2" { 179 elb = "${aws_elb.bar.id}" 180 instance = "${aws_instance.foo2.id}" 181 } 182 ` 183 184 // swap attachments between resources 185 const testAccAWSELBAttachmentConfig3 = ` 186 resource "aws_elb" "bar" { 187 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 188 189 listener { 190 instance_port = 8000 191 instance_protocol = "http" 192 lb_port = 80 193 lb_protocol = "http" 194 } 195 } 196 197 resource "aws_instance" "foo1" { 198 # us-west-2 199 ami = "ami-043a5034" 200 instance_type = "t1.micro" 201 } 202 203 resource "aws_instance" "foo2" { 204 # us-west-2 205 ami = "ami-043a5034" 206 instance_type = "t1.micro" 207 } 208 209 resource "aws_elb_attachment" "foo1" { 210 elb = "${aws_elb.bar.id}" 211 instance = "${aws_instance.foo2.id}" 212 } 213 214 resource "aws_elb_attachment" "foo2" { 215 elb = "${aws_elb.bar.id}" 216 instance = "${aws_instance.foo1.id}" 217 } 218 ` 219 220 // destroy attachments 221 const testAccAWSELBAttachmentConfig4 = ` 222 resource "aws_elb" "bar" { 223 availability_zones = ["us-west-2a", "us-west-2b", "us-west-2c"] 224 225 listener { 226 instance_port = 8000 227 instance_protocol = "http" 228 lb_port = 80 229 lb_protocol = "http" 230 } 231 } 232 `