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  `