github.com/i0n/terraform@v0.4.3-0.20150506151324-010a39a58ec1/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/awslabs/aws-sdk-go/aws" 9 "github.com/awslabs/aws-sdk-go/service/ec2" 10 "github.com/hashicorp/terraform/helper/resource" 11 "github.com/hashicorp/terraform/terraform" 12 ) 13 14 func TestAccAWSEIP_normal(t *testing.T) { 15 var conf ec2.Address 16 17 resource.Test(t, resource.TestCase{ 18 PreCheck: func() { testAccPreCheck(t) }, 19 Providers: testAccProviders, 20 CheckDestroy: testAccCheckAWSEIPDestroy, 21 Steps: []resource.TestStep{ 22 resource.TestStep{ 23 Config: testAccAWSEIPConfig, 24 Check: resource.ComposeTestCheckFunc( 25 testAccCheckAWSEIPExists("aws_eip.bar", &conf), 26 testAccCheckAWSEIPAttributes(&conf), 27 ), 28 }, 29 }, 30 }) 31 } 32 33 func TestAccAWSEIP_instance(t *testing.T) { 34 var conf ec2.Address 35 36 resource.Test(t, resource.TestCase{ 37 PreCheck: func() { testAccPreCheck(t) }, 38 Providers: testAccProviders, 39 CheckDestroy: testAccCheckAWSEIPDestroy, 40 Steps: []resource.TestStep{ 41 resource.TestStep{ 42 Config: testAccAWSEIPInstanceConfig, 43 Check: resource.ComposeTestCheckFunc( 44 testAccCheckAWSEIPExists("aws_eip.bar", &conf), 45 testAccCheckAWSEIPAttributes(&conf), 46 ), 47 }, 48 49 resource.TestStep{ 50 Config: testAccAWSEIPInstanceConfig2, 51 Check: resource.ComposeTestCheckFunc( 52 testAccCheckAWSEIPExists("aws_eip.bar", &conf), 53 testAccCheckAWSEIPAttributes(&conf), 54 ), 55 }, 56 }, 57 }) 58 } 59 60 func TestAccAWSEIP_network_interface(t *testing.T) { 61 var conf ec2.Address 62 63 resource.Test(t, resource.TestCase{ 64 PreCheck: func() { testAccPreCheck(t) }, 65 Providers: testAccProviders, 66 CheckDestroy: testAccCheckAWSEIPDestroy, 67 Steps: []resource.TestStep{ 68 resource.TestStep{ 69 Config: testAccAWSEIPNetworkInterfaceConfig, 70 Check: resource.ComposeTestCheckFunc( 71 testAccCheckAWSEIPExists("aws_eip.bar", &conf), 72 testAccCheckAWSEIPAttributes(&conf), 73 testAccCheckAWSEIPAssociated(&conf), 74 ), 75 }, 76 }, 77 }) 78 } 79 80 func testAccCheckAWSEIPDestroy(s *terraform.State) error { 81 conn := testAccProvider.Meta().(*AWSClient).ec2conn 82 83 for _, rs := range s.RootModule().Resources { 84 if rs.Type != "aws_eip" { 85 continue 86 } 87 88 req := &ec2.DescribeAddressesInput{ 89 PublicIPs: []*string{aws.String(rs.Primary.ID)}, 90 } 91 describe, err := conn.DescribeAddresses(req) 92 93 if err == nil { 94 if len(describe.Addresses) != 0 && 95 *describe.Addresses[0].PublicIP == rs.Primary.ID { 96 return fmt.Errorf("EIP still exists") 97 } 98 } 99 100 // Verify the error 101 providerErr, ok := err.(aws.APIError) 102 if !ok { 103 return err 104 } 105 106 if providerErr.Code != "InvalidAllocationID.NotFound" { 107 return fmt.Errorf("Unexpected error: %s", err) 108 } 109 } 110 111 return nil 112 } 113 114 func testAccCheckAWSEIPAttributes(conf *ec2.Address) resource.TestCheckFunc { 115 return func(s *terraform.State) error { 116 if *conf.PublicIP == "" { 117 return fmt.Errorf("empty public_ip") 118 } 119 120 return nil 121 } 122 } 123 124 func testAccCheckAWSEIPAssociated(conf *ec2.Address) resource.TestCheckFunc { 125 return func(s *terraform.State) error { 126 if *conf.AssociationID == "" { 127 return fmt.Errorf("empty association_id") 128 } 129 130 return nil 131 } 132 } 133 134 func testAccCheckAWSEIPExists(n string, res *ec2.Address) resource.TestCheckFunc { 135 return func(s *terraform.State) error { 136 rs, ok := s.RootModule().Resources[n] 137 if !ok { 138 return fmt.Errorf("Not found: %s", n) 139 } 140 141 if rs.Primary.ID == "" { 142 return fmt.Errorf("No EIP ID is set") 143 } 144 145 conn := testAccProvider.Meta().(*AWSClient).ec2conn 146 147 if strings.Contains(rs.Primary.ID, "eipalloc") { 148 req := &ec2.DescribeAddressesInput{ 149 AllocationIDs: []*string{aws.String(rs.Primary.ID)}, 150 } 151 describe, err := conn.DescribeAddresses(req) 152 if err != nil { 153 return err 154 } 155 156 if len(describe.Addresses) != 1 || 157 *describe.Addresses[0].AllocationID != rs.Primary.ID { 158 return fmt.Errorf("EIP not found") 159 } 160 *res = *describe.Addresses[0] 161 162 } else { 163 req := &ec2.DescribeAddressesInput{ 164 PublicIPs: []*string{aws.String(rs.Primary.ID)}, 165 } 166 describe, err := conn.DescribeAddresses(req) 167 if err != nil { 168 return err 169 } 170 171 if len(describe.Addresses) != 1 || 172 *describe.Addresses[0].PublicIP != rs.Primary.ID { 173 return fmt.Errorf("EIP not found") 174 } 175 *res = *describe.Addresses[0] 176 } 177 178 return nil 179 } 180 } 181 182 const testAccAWSEIPConfig = ` 183 resource "aws_eip" "bar" { 184 } 185 ` 186 187 const testAccAWSEIPInstanceConfig = ` 188 resource "aws_instance" "foo" { 189 # us-west-2 190 ami = "ami-4fccb37f" 191 instance_type = "m1.small" 192 } 193 194 resource "aws_eip" "bar" { 195 instance = "${aws_instance.foo.id}" 196 } 197 ` 198 199 const testAccAWSEIPInstanceConfig2 = ` 200 resource "aws_instance" "bar" { 201 # us-west-2 202 ami = "ami-4fccb37f" 203 instance_type = "m1.small" 204 } 205 206 resource "aws_eip" "bar" { 207 instance = "${aws_instance.bar.id}" 208 } 209 ` 210 const testAccAWSEIPNetworkInterfaceConfig = ` 211 resource "aws_vpc" "bar" { 212 cidr_block = "10.0.0.0/24" 213 } 214 resource "aws_internet_gateway" "bar" { 215 vpc_id = "${aws_vpc.bar.id}" 216 } 217 resource "aws_subnet" "bar" { 218 vpc_id = "${aws_vpc.bar.id}" 219 availability_zone = "us-west-2a" 220 cidr_block = "10.0.0.0/24" 221 } 222 resource "aws_network_interface" "bar" { 223 subnet_id = "${aws_subnet.bar.id}" 224 private_ips = ["10.0.0.10"] 225 security_groups = [ "${aws_vpc.bar.default_security_group_id}" ] 226 } 227 resource "aws_eip" "bar" { 228 vpc = "true" 229 network_interface = "${aws_network_interface.bar.id}" 230 } 231 `