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  `