github.com/peterbale/terraform@v0.9.0-beta2.0.20170315142748-5723acd55547/builtin/providers/aws/resource_aws_customer_gateway_test.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "regexp" 6 "testing" 7 "time" 8 9 "github.com/aws/aws-sdk-go/aws" 10 "github.com/aws/aws-sdk-go/aws/awserr" 11 "github.com/aws/aws-sdk-go/service/ec2" 12 13 "github.com/hashicorp/terraform/helper/resource" 14 "github.com/hashicorp/terraform/terraform" 15 ) 16 17 func TestAccAWSCustomerGateway_basic(t *testing.T) { 18 var gateway ec2.CustomerGateway 19 resource.Test(t, resource.TestCase{ 20 PreCheck: func() { testAccPreCheck(t) }, 21 IDRefreshName: "aws_customer_gateway.foo", 22 Providers: testAccProviders, 23 CheckDestroy: testAccCheckCustomerGatewayDestroy, 24 Steps: []resource.TestStep{ 25 { 26 Config: testAccCustomerGatewayConfig, 27 Check: resource.ComposeTestCheckFunc( 28 testAccCheckCustomerGateway("aws_customer_gateway.foo", &gateway), 29 ), 30 }, 31 { 32 Config: testAccCustomerGatewayConfigUpdateTags, 33 Check: resource.ComposeTestCheckFunc( 34 testAccCheckCustomerGateway("aws_customer_gateway.foo", &gateway), 35 ), 36 }, 37 { 38 Config: testAccCustomerGatewayConfigForceReplace, 39 Check: resource.ComposeTestCheckFunc( 40 testAccCheckCustomerGateway("aws_customer_gateway.foo", &gateway), 41 ), 42 }, 43 }, 44 }) 45 } 46 47 func TestAccAWSCustomerGateway_similarAlreadyExists(t *testing.T) { 48 var gateway ec2.CustomerGateway 49 resource.Test(t, resource.TestCase{ 50 PreCheck: func() { testAccPreCheck(t) }, 51 IDRefreshName: "aws_customer_gateway.foo", 52 Providers: testAccProviders, 53 CheckDestroy: testAccCheckCustomerGatewayDestroy, 54 Steps: []resource.TestStep{ 55 { 56 Config: testAccCustomerGatewayConfig, 57 Check: resource.ComposeTestCheckFunc( 58 testAccCheckCustomerGateway("aws_customer_gateway.foo", &gateway), 59 ), 60 }, 61 { 62 Config: testAccCustomerGatewayConfigIdentical, 63 ExpectError: regexp.MustCompile("An existing customer gateway"), 64 }, 65 }, 66 }) 67 } 68 69 func TestAccAWSCustomerGateway_disappears(t *testing.T) { 70 var gateway ec2.CustomerGateway 71 resource.Test(t, resource.TestCase{ 72 PreCheck: func() { testAccPreCheck(t) }, 73 Providers: testAccProviders, 74 CheckDestroy: testAccCheckCustomerGatewayDestroy, 75 Steps: []resource.TestStep{ 76 { 77 Config: testAccCustomerGatewayConfig, 78 Check: resource.ComposeTestCheckFunc( 79 testAccCheckCustomerGateway("aws_customer_gateway.foo", &gateway), 80 testAccAWSCustomerGatewayDisappears(&gateway), 81 ), 82 ExpectNonEmptyPlan: true, 83 }, 84 }, 85 }) 86 } 87 88 func testAccAWSCustomerGatewayDisappears(gateway *ec2.CustomerGateway) resource.TestCheckFunc { 89 return func(s *terraform.State) error { 90 conn := testAccProvider.Meta().(*AWSClient).ec2conn 91 opts := &ec2.DeleteCustomerGatewayInput{ 92 CustomerGatewayId: gateway.CustomerGatewayId, 93 } 94 if _, err := conn.DeleteCustomerGateway(opts); err != nil { 95 return err 96 } 97 return resource.Retry(40*time.Minute, func() *resource.RetryError { 98 opts := &ec2.DescribeCustomerGatewaysInput{ 99 CustomerGatewayIds: []*string{gateway.CustomerGatewayId}, 100 } 101 resp, err := conn.DescribeCustomerGateways(opts) 102 if err != nil { 103 cgw, ok := err.(awserr.Error) 104 if ok && cgw.Code() == "InvalidCustomerGatewayID.NotFound" { 105 return nil 106 } 107 return resource.NonRetryableError( 108 fmt.Errorf("Error retrieving Customer Gateway: %s", err)) 109 } 110 if *resp.CustomerGateways[0].State == "deleted" { 111 return nil 112 } 113 return resource.RetryableError(fmt.Errorf( 114 "Waiting for Customer Gateway: %v", gateway.CustomerGatewayId)) 115 }) 116 } 117 } 118 119 func testAccCheckCustomerGatewayDestroy(s *terraform.State) error { 120 conn := testAccProvider.Meta().(*AWSClient).ec2conn 121 122 for _, rs := range s.RootModule().Resources { 123 if rs.Type != "aws_customer_gatewah" { 124 continue 125 } 126 127 gatewayFilter := &ec2.Filter{ 128 Name: aws.String("customer-gateway-id"), 129 Values: []*string{aws.String(rs.Primary.ID)}, 130 } 131 132 resp, err := conn.DescribeCustomerGateways(&ec2.DescribeCustomerGatewaysInput{ 133 Filters: []*ec2.Filter{gatewayFilter}, 134 }) 135 136 if ae, ok := err.(awserr.Error); ok && ae.Code() == "InvalidCustomerGatewayID.NotFound" { 137 continue 138 } 139 140 if err == nil { 141 if len(resp.CustomerGateways) > 0 { 142 return fmt.Errorf("Customer gateway still exists: %v", resp.CustomerGateways) 143 } 144 145 if *resp.CustomerGateways[0].State == "deleted" { 146 continue 147 } 148 } 149 150 return err 151 } 152 153 return nil 154 } 155 156 func testAccCheckCustomerGateway(gatewayResource string, cgw *ec2.CustomerGateway) resource.TestCheckFunc { 157 return func(s *terraform.State) error { 158 rs, ok := s.RootModule().Resources[gatewayResource] 159 if !ok { 160 return fmt.Errorf("Not found: %s", gatewayResource) 161 } 162 163 if rs.Primary.ID == "" { 164 return fmt.Errorf("No ID is set") 165 } 166 167 gateway, ok := s.RootModule().Resources[gatewayResource] 168 if !ok { 169 return fmt.Errorf("Not found: %s", gatewayResource) 170 } 171 172 ec2conn := testAccProvider.Meta().(*AWSClient).ec2conn 173 gatewayFilter := &ec2.Filter{ 174 Name: aws.String("customer-gateway-id"), 175 Values: []*string{aws.String(gateway.Primary.ID)}, 176 } 177 178 resp, err := ec2conn.DescribeCustomerGateways(&ec2.DescribeCustomerGatewaysInput{ 179 Filters: []*ec2.Filter{gatewayFilter}, 180 }) 181 182 if err != nil { 183 return err 184 } 185 186 respGateway := resp.CustomerGateways[0] 187 *cgw = *respGateway 188 189 return nil 190 } 191 } 192 193 const testAccCustomerGatewayConfig = ` 194 resource "aws_customer_gateway" "foo" { 195 bgp_asn = 65000 196 ip_address = "172.0.0.1" 197 type = "ipsec.1" 198 tags { 199 Name = "foo-gateway" 200 } 201 } 202 ` 203 204 const testAccCustomerGatewayConfigIdentical = ` 205 resource "aws_customer_gateway" "foo" { 206 bgp_asn = 65000 207 ip_address = "172.0.0.1" 208 type = "ipsec.1" 209 tags { 210 Name = "foo-gateway" 211 } 212 } 213 214 resource "aws_customer_gateway" "identical" { 215 bgp_asn = 65000 216 ip_address = "172.0.0.1" 217 type = "ipsec.1" 218 tags { 219 Name = "foo-gateway-identical" 220 } 221 } 222 ` 223 224 // Add the Another: "tag" tag. 225 const testAccCustomerGatewayConfigUpdateTags = ` 226 resource "aws_customer_gateway" "foo" { 227 bgp_asn = 65000 228 ip_address = "172.0.0.1" 229 type = "ipsec.1" 230 tags { 231 Name = "foo-gateway" 232 Another = "tag" 233 } 234 } 235 ` 236 237 // Change the ip_address. 238 const testAccCustomerGatewayConfigForceReplace = ` 239 resource "aws_customer_gateway" "foo" { 240 bgp_asn = 65000 241 ip_address = "172.10.10.1" 242 type = "ipsec.1" 243 tags { 244 Name = "foo-gateway" 245 Another = "tag" 246 } 247 } 248 `