github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/resource_aws_eip_association_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/aws/aws-sdk-go/aws" 8 "github.com/aws/aws-sdk-go/service/ec2" 9 "github.com/hashicorp/terraform/helper/resource" 10 "github.com/hashicorp/terraform/terraform" 11 ) 12 13 func TestAccAWSEIPAssociation_basic(t *testing.T) { 14 var a ec2.Address 15 16 resource.Test(t, resource.TestCase{ 17 PreCheck: func() { testAccPreCheck(t) }, 18 Providers: testAccProviders, 19 CheckDestroy: testAccCheckAWSEIPAssociationDestroy, 20 Steps: []resource.TestStep{ 21 { 22 Config: testAccAWSEIPAssociationConfig, 23 Check: resource.ComposeTestCheckFunc( 24 testAccCheckAWSEIPExists( 25 "aws_eip.bar.0", &a), 26 testAccCheckAWSEIPAssociationExists( 27 "aws_eip_association.by_allocation_id", &a), 28 testAccCheckAWSEIPExists( 29 "aws_eip.bar.1", &a), 30 testAccCheckAWSEIPAssociationExists( 31 "aws_eip_association.by_public_ip", &a), 32 testAccCheckAWSEIPExists( 33 "aws_eip.bar.2", &a), 34 testAccCheckAWSEIPAssociationExists( 35 "aws_eip_association.to_eni", &a), 36 ), 37 }, 38 }, 39 }) 40 } 41 42 func TestAccAWSEIPAssociation_disappears(t *testing.T) { 43 var a ec2.Address 44 45 resource.Test(t, resource.TestCase{ 46 PreCheck: func() { testAccPreCheck(t) }, 47 Providers: testAccProviders, 48 CheckDestroy: testAccCheckAWSEIPAssociationDestroy, 49 Steps: []resource.TestStep{ 50 { 51 Config: testAccAWSEIPAssociationConfigDisappears, 52 Check: resource.ComposeTestCheckFunc( 53 testAccCheckAWSEIPExists( 54 "aws_eip.bar", &a), 55 testAccCheckAWSEIPAssociationExists( 56 "aws_eip_association.by_allocation_id", &a), 57 testAccCheckEIPAssociationDisappears(&a), 58 ), 59 ExpectNonEmptyPlan: true, 60 }, 61 }, 62 }) 63 } 64 65 func testAccCheckEIPAssociationDisappears(address *ec2.Address) resource.TestCheckFunc { 66 return func(s *terraform.State) error { 67 conn := testAccProvider.Meta().(*AWSClient).ec2conn 68 opts := &ec2.DisassociateAddressInput{ 69 AssociationId: address.AssociationId, 70 } 71 if _, err := conn.DisassociateAddress(opts); err != nil { 72 return err 73 } 74 return nil 75 } 76 } 77 78 func testAccCheckAWSEIPAssociationExists(name string, res *ec2.Address) resource.TestCheckFunc { 79 return func(s *terraform.State) error { 80 rs, ok := s.RootModule().Resources[name] 81 if !ok { 82 return fmt.Errorf("Not found: %s", name) 83 } 84 85 if rs.Primary.ID == "" { 86 return fmt.Errorf("No EIP Association ID is set") 87 } 88 89 conn := testAccProvider.Meta().(*AWSClient).ec2conn 90 91 request := &ec2.DescribeAddressesInput{ 92 Filters: []*ec2.Filter{ 93 &ec2.Filter{ 94 Name: aws.String("association-id"), 95 Values: []*string{res.AssociationId}, 96 }, 97 }, 98 } 99 describe, err := conn.DescribeAddresses(request) 100 if err != nil { 101 return err 102 } 103 104 if len(describe.Addresses) != 1 || 105 *describe.Addresses[0].AssociationId != *res.AssociationId { 106 return fmt.Errorf("EIP Association not found") 107 } 108 109 return nil 110 } 111 } 112 113 func testAccCheckAWSEIPAssociationDestroy(s *terraform.State) error { 114 for _, rs := range s.RootModule().Resources { 115 if rs.Type != "aws_eip_association" { 116 continue 117 } 118 119 if rs.Primary.ID == "" { 120 return fmt.Errorf("No EIP Association ID is set") 121 } 122 123 conn := testAccProvider.Meta().(*AWSClient).ec2conn 124 125 request := &ec2.DescribeAddressesInput{ 126 Filters: []*ec2.Filter{ 127 &ec2.Filter{ 128 Name: aws.String("association-id"), 129 Values: []*string{aws.String(rs.Primary.ID)}, 130 }, 131 }, 132 } 133 describe, err := conn.DescribeAddresses(request) 134 if err != nil { 135 return err 136 } 137 138 if len(describe.Addresses) > 0 { 139 return fmt.Errorf("EIP Association still exists") 140 } 141 } 142 return nil 143 } 144 145 const testAccAWSEIPAssociationConfig = ` 146 resource "aws_vpc" "main" { 147 cidr_block = "192.168.0.0/24" 148 } 149 resource "aws_subnet" "sub" { 150 vpc_id = "${aws_vpc.main.id}" 151 cidr_block = "192.168.0.0/25" 152 availability_zone = "us-west-2a" 153 } 154 resource "aws_internet_gateway" "igw" { 155 vpc_id = "${aws_vpc.main.id}" 156 } 157 resource "aws_instance" "foo" { 158 count = 2 159 ami = "ami-21f78e11" 160 availability_zone = "us-west-2a" 161 instance_type = "t1.micro" 162 subnet_id = "${aws_subnet.sub.id}" 163 } 164 resource "aws_eip" "bar" { 165 count = 3 166 vpc = true 167 } 168 resource "aws_eip_association" "by_allocation_id" { 169 allocation_id = "${aws_eip.bar.0.id}" 170 instance_id = "${aws_instance.foo.0.id}" 171 depends_on = ["aws_instance.foo"] 172 } 173 resource "aws_eip_association" "by_public_ip" { 174 public_ip = "${aws_eip.bar.1.public_ip}" 175 instance_id = "${aws_instance.foo.1.id}" 176 depends_on = ["aws_instance.foo"] 177 } 178 resource "aws_eip_association" "to_eni" { 179 allocation_id = "${aws_eip.bar.2.id}" 180 network_interface_id = "${aws_network_interface.baz.id}" 181 } 182 resource "aws_network_interface" "baz" { 183 subnet_id = "${aws_subnet.sub.id}" 184 private_ips = ["192.168.0.10"] 185 depends_on = ["aws_instance.foo"] 186 attachment { 187 instance = "${aws_instance.foo.0.id}" 188 device_index = 1 189 } 190 } 191 ` 192 193 const testAccAWSEIPAssociationConfigDisappears = ` 194 resource "aws_vpc" "main" { 195 cidr_block = "192.168.0.0/24" 196 } 197 resource "aws_subnet" "sub" { 198 vpc_id = "${aws_vpc.main.id}" 199 cidr_block = "192.168.0.0/25" 200 availability_zone = "us-west-2a" 201 } 202 resource "aws_internet_gateway" "igw" { 203 vpc_id = "${aws_vpc.main.id}" 204 } 205 resource "aws_instance" "foo" { 206 ami = "ami-21f78e11" 207 availability_zone = "us-west-2a" 208 instance_type = "t1.micro" 209 subnet_id = "${aws_subnet.sub.id}" 210 } 211 resource "aws_eip" "bar" { 212 vpc = true 213 } 214 resource "aws_eip_association" "by_allocation_id" { 215 allocation_id = "${aws_eip.bar.id}" 216 instance_id = "${aws_instance.foo.id}" 217 }`