github.com/andresvia/terraform@v0.6.15-0.20160412045437-d51c75946785/builtin/providers/aws/resource_aws_eip_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "strings" 6 "testing" 7 8 "github.com/aws/aws-sdk-go/aws" 9 "github.com/aws/aws-sdk-go/aws/awserr" 10 "github.com/aws/aws-sdk-go/service/ec2" 11 "github.com/hashicorp/terraform/helper/resource" 12 "github.com/hashicorp/terraform/terraform" 13 ) 14 15 func TestAccAWSEIP_basic(t *testing.T) { 16 var conf ec2.Address 17 18 resource.Test(t, resource.TestCase{ 19 PreCheck: func() { testAccPreCheck(t) }, 20 Providers: testAccProviders, 21 CheckDestroy: testAccCheckAWSEIPDestroy, 22 Steps: []resource.TestStep{ 23 resource.TestStep{ 24 Config: testAccAWSEIPConfig, 25 Check: resource.ComposeTestCheckFunc( 26 testAccCheckAWSEIPExists("aws_eip.bar", &conf), 27 testAccCheckAWSEIPAttributes(&conf), 28 ), 29 }, 30 }, 31 }) 32 } 33 34 func TestAccAWSEIP_instance(t *testing.T) { 35 var conf ec2.Address 36 37 resource.Test(t, resource.TestCase{ 38 PreCheck: func() { testAccPreCheck(t) }, 39 Providers: testAccProviders, 40 CheckDestroy: testAccCheckAWSEIPDestroy, 41 Steps: []resource.TestStep{ 42 resource.TestStep{ 43 Config: testAccAWSEIPInstanceConfig, 44 Check: resource.ComposeTestCheckFunc( 45 testAccCheckAWSEIPExists("aws_eip.bar", &conf), 46 testAccCheckAWSEIPAttributes(&conf), 47 ), 48 }, 49 50 resource.TestStep{ 51 Config: testAccAWSEIPInstanceConfig2, 52 Check: resource.ComposeTestCheckFunc( 53 testAccCheckAWSEIPExists("aws_eip.bar", &conf), 54 testAccCheckAWSEIPAttributes(&conf), 55 ), 56 }, 57 }, 58 }) 59 } 60 61 func TestAccAWSEIP_network_interface(t *testing.T) { 62 var conf ec2.Address 63 64 resource.Test(t, resource.TestCase{ 65 PreCheck: func() { testAccPreCheck(t) }, 66 Providers: testAccProviders, 67 CheckDestroy: testAccCheckAWSEIPDestroy, 68 Steps: []resource.TestStep{ 69 resource.TestStep{ 70 Config: testAccAWSEIPNetworkInterfaceConfig, 71 Check: resource.ComposeTestCheckFunc( 72 testAccCheckAWSEIPExists("aws_eip.bar", &conf), 73 testAccCheckAWSEIPAttributes(&conf), 74 testAccCheckAWSEIPAssociated(&conf), 75 ), 76 }, 77 }, 78 }) 79 } 80 81 func TestAccAWSEIP_twoEIPsOneNetworkInterface(t *testing.T) { 82 var one, two ec2.Address 83 84 resource.Test(t, resource.TestCase{ 85 PreCheck: func() { testAccPreCheck(t) }, 86 Providers: testAccProviders, 87 CheckDestroy: testAccCheckAWSEIPDestroy, 88 Steps: []resource.TestStep{ 89 resource.TestStep{ 90 Config: testAccAWSEIPMultiNetworkInterfaceConfig, 91 Check: resource.ComposeTestCheckFunc( 92 testAccCheckAWSEIPExists("aws_eip.one", &one), 93 testAccCheckAWSEIPAttributes(&one), 94 testAccCheckAWSEIPAssociated(&one), 95 testAccCheckAWSEIPExists("aws_eip.two", &two), 96 testAccCheckAWSEIPAttributes(&two), 97 testAccCheckAWSEIPAssociated(&two), 98 ), 99 }, 100 }, 101 }) 102 } 103 104 func testAccCheckAWSEIPDestroy(s *terraform.State) error { 105 conn := testAccProvider.Meta().(*AWSClient).ec2conn 106 107 for _, rs := range s.RootModule().Resources { 108 if rs.Type != "aws_eip" { 109 continue 110 } 111 112 if strings.Contains(rs.Primary.ID, "eipalloc") { 113 req := &ec2.DescribeAddressesInput{ 114 AllocationIds: []*string{aws.String(rs.Primary.ID)}, 115 } 116 describe, err := conn.DescribeAddresses(req) 117 if err != nil { 118 // Verify the error is what we want 119 if ae, ok := err.(awserr.Error); ok && ae.Code() == "InvalidAllocationID.NotFound" { 120 continue 121 } 122 return err 123 } 124 125 if len(describe.Addresses) > 0 { 126 return fmt.Errorf("still exists") 127 } 128 } else { 129 req := &ec2.DescribeAddressesInput{ 130 PublicIps: []*string{aws.String(rs.Primary.ID)}, 131 } 132 describe, err := conn.DescribeAddresses(req) 133 if err != nil { 134 // Verify the error is what we want 135 if ae, ok := err.(awserr.Error); ok && ae.Code() == "InvalidAllocationID.NotFound" { 136 continue 137 } 138 return err 139 } 140 141 if len(describe.Addresses) > 0 { 142 return fmt.Errorf("still exists") 143 } 144 } 145 } 146 147 return nil 148 } 149 150 func testAccCheckAWSEIPAttributes(conf *ec2.Address) resource.TestCheckFunc { 151 return func(s *terraform.State) error { 152 if *conf.PublicIp == "" { 153 return fmt.Errorf("empty public_ip") 154 } 155 156 return nil 157 } 158 } 159 160 func testAccCheckAWSEIPAssociated(conf *ec2.Address) resource.TestCheckFunc { 161 return func(s *terraform.State) error { 162 if conf.AssociationId == nil || *conf.AssociationId == "" { 163 return fmt.Errorf("empty association_id") 164 } 165 166 return nil 167 } 168 } 169 170 func testAccCheckAWSEIPExists(n string, res *ec2.Address) resource.TestCheckFunc { 171 return func(s *terraform.State) error { 172 rs, ok := s.RootModule().Resources[n] 173 if !ok { 174 return fmt.Errorf("Not found: %s", n) 175 } 176 177 if rs.Primary.ID == "" { 178 return fmt.Errorf("No EIP ID is set") 179 } 180 181 conn := testAccProvider.Meta().(*AWSClient).ec2conn 182 183 if strings.Contains(rs.Primary.ID, "eipalloc") { 184 req := &ec2.DescribeAddressesInput{ 185 AllocationIds: []*string{aws.String(rs.Primary.ID)}, 186 } 187 describe, err := conn.DescribeAddresses(req) 188 if err != nil { 189 return err 190 } 191 192 if len(describe.Addresses) != 1 || 193 *describe.Addresses[0].AllocationId != rs.Primary.ID { 194 return fmt.Errorf("EIP not found") 195 } 196 *res = *describe.Addresses[0] 197 198 } else { 199 req := &ec2.DescribeAddressesInput{ 200 PublicIps: []*string{aws.String(rs.Primary.ID)}, 201 } 202 describe, err := conn.DescribeAddresses(req) 203 if err != nil { 204 return err 205 } 206 207 if len(describe.Addresses) != 1 || 208 *describe.Addresses[0].PublicIp != rs.Primary.ID { 209 return fmt.Errorf("EIP not found") 210 } 211 *res = *describe.Addresses[0] 212 } 213 214 return nil 215 } 216 } 217 218 const testAccAWSEIPConfig = ` 219 resource "aws_eip" "bar" { 220 } 221 ` 222 223 const testAccAWSEIPInstanceConfig = ` 224 resource "aws_instance" "foo" { 225 # us-west-2 226 ami = "ami-4fccb37f" 227 instance_type = "m1.small" 228 } 229 230 resource "aws_eip" "bar" { 231 instance = "${aws_instance.foo.id}" 232 } 233 ` 234 235 const testAccAWSEIPInstanceConfig2 = ` 236 resource "aws_instance" "bar" { 237 # us-west-2 238 ami = "ami-4fccb37f" 239 instance_type = "m1.small" 240 } 241 242 resource "aws_eip" "bar" { 243 instance = "${aws_instance.bar.id}" 244 } 245 ` 246 247 const testAccAWSEIPNetworkInterfaceConfig = ` 248 resource "aws_vpc" "bar" { 249 cidr_block = "10.0.0.0/24" 250 } 251 resource "aws_internet_gateway" "bar" { 252 vpc_id = "${aws_vpc.bar.id}" 253 } 254 resource "aws_subnet" "bar" { 255 vpc_id = "${aws_vpc.bar.id}" 256 availability_zone = "us-west-2a" 257 cidr_block = "10.0.0.0/24" 258 } 259 resource "aws_network_interface" "bar" { 260 subnet_id = "${aws_subnet.bar.id}" 261 private_ips = ["10.0.0.10"] 262 security_groups = [ "${aws_vpc.bar.default_security_group_id}" ] 263 } 264 resource "aws_eip" "bar" { 265 vpc = "true" 266 network_interface = "${aws_network_interface.bar.id}" 267 } 268 ` 269 270 const testAccAWSEIPMultiNetworkInterfaceConfig = ` 271 resource "aws_vpc" "bar" { 272 cidr_block = "10.0.0.0/24" 273 } 274 resource "aws_internet_gateway" "bar" { 275 vpc_id = "${aws_vpc.bar.id}" 276 } 277 resource "aws_subnet" "bar" { 278 vpc_id = "${aws_vpc.bar.id}" 279 availability_zone = "us-west-2a" 280 cidr_block = "10.0.0.0/24" 281 } 282 resource "aws_network_interface" "bar" { 283 subnet_id = "${aws_subnet.bar.id}" 284 private_ips = ["10.0.0.10", "10.0.0.11"] 285 security_groups = [ "${aws_vpc.bar.default_security_group_id}" ] 286 } 287 resource "aws_eip" "one" { 288 vpc = "true" 289 network_interface = "${aws_network_interface.bar.id}" 290 private_ip = "10.0.0.10" 291 } 292 resource "aws_eip" "two" { 293 vpc = "true" 294 network_interface = "${aws_network_interface.bar.id}" 295 private_ip = "10.0.0.11" 296 } 297 `