github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/aws/resource_aws_vpn_connection_test.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/aws/awserr"
     9  	"github.com/aws/aws-sdk-go/service/ec2"
    10  
    11  	"github.com/hashicorp/terraform/helper/resource"
    12  	"github.com/hashicorp/terraform/terraform"
    13  )
    14  
    15  func TestAccAWSVpnConnection_basic(t *testing.T) {
    16  	resource.Test(t, resource.TestCase{
    17  		PreCheck:      func() { testAccPreCheck(t) },
    18  		IDRefreshName: "aws_vpn_connection.foo",
    19  		Providers:     testAccProviders,
    20  		CheckDestroy:  testAccAwsVpnConnectionDestroy,
    21  		Steps: []resource.TestStep{
    22  			{
    23  				Config: testAccAwsVpnConnectionConfig,
    24  				Check: resource.ComposeTestCheckFunc(
    25  					testAccAwsVpnConnection(
    26  						"aws_vpc.vpc",
    27  						"aws_vpn_gateway.vpn_gateway",
    28  						"aws_customer_gateway.customer_gateway",
    29  						"aws_vpn_connection.foo",
    30  					),
    31  				),
    32  			},
    33  			{
    34  				Config: testAccAwsVpnConnectionConfigUpdate,
    35  				Check: resource.ComposeTestCheckFunc(
    36  					testAccAwsVpnConnection(
    37  						"aws_vpc.vpc",
    38  						"aws_vpn_gateway.vpn_gateway",
    39  						"aws_customer_gateway.customer_gateway",
    40  						"aws_vpn_connection.foo",
    41  					),
    42  				),
    43  			},
    44  		},
    45  	})
    46  }
    47  
    48  func TestAccAWSVpnConnection_withoutStaticRoutes(t *testing.T) {
    49  	resource.Test(t, resource.TestCase{
    50  		PreCheck:      func() { testAccPreCheck(t) },
    51  		IDRefreshName: "aws_vpn_connection.foo",
    52  		Providers:     testAccProviders,
    53  		CheckDestroy:  testAccAwsVpnConnectionDestroy,
    54  		Steps: []resource.TestStep{
    55  			{
    56  				Config: testAccAwsVpnConnectionConfigUpdate,
    57  				Check: resource.ComposeTestCheckFunc(
    58  					testAccAwsVpnConnection(
    59  						"aws_vpc.vpc",
    60  						"aws_vpn_gateway.vpn_gateway",
    61  						"aws_customer_gateway.customer_gateway",
    62  						"aws_vpn_connection.foo",
    63  					),
    64  					resource.TestCheckResourceAttr("aws_vpn_connection.foo", "static_routes_only", "false"),
    65  				),
    66  			},
    67  		},
    68  	})
    69  }
    70  
    71  func testAccAwsVpnConnectionDestroy(s *terraform.State) error {
    72  	conn := testAccProvider.Meta().(*AWSClient).ec2conn
    73  	for _, rs := range s.RootModule().Resources {
    74  		if rs.Type != "aws_vpn_connection" {
    75  			continue
    76  		}
    77  
    78  		resp, err := conn.DescribeVpnConnections(&ec2.DescribeVpnConnectionsInput{
    79  			VpnConnectionIds: []*string{aws.String(rs.Primary.ID)},
    80  		})
    81  
    82  		if err != nil {
    83  			if ec2err, ok := err.(awserr.Error); ok && ec2err.Code() == "InvalidVpnConnectionID.NotFound" {
    84  				// not found
    85  				return nil
    86  			}
    87  			return err
    88  		}
    89  
    90  		var vpn *ec2.VpnConnection
    91  		for _, v := range resp.VpnConnections {
    92  			if v.VpnConnectionId != nil && *v.VpnConnectionId == rs.Primary.ID {
    93  				vpn = v
    94  			}
    95  		}
    96  
    97  		if vpn == nil {
    98  			// vpn connection not found
    99  			return nil
   100  		}
   101  
   102  		if vpn.State != nil && *vpn.State == "deleted" {
   103  			return nil
   104  		}
   105  
   106  	}
   107  
   108  	return nil
   109  }
   110  
   111  func testAccAwsVpnConnection(
   112  	vpcResource string,
   113  	vpnGatewayResource string,
   114  	customerGatewayResource string,
   115  	vpnConnectionResource string) resource.TestCheckFunc {
   116  	return func(s *terraform.State) error {
   117  		rs, ok := s.RootModule().Resources[vpnConnectionResource]
   118  		if !ok {
   119  			return fmt.Errorf("Not found: %s", vpnConnectionResource)
   120  		}
   121  
   122  		if rs.Primary.ID == "" {
   123  			return fmt.Errorf("No ID is set")
   124  		}
   125  		connection, ok := s.RootModule().Resources[vpnConnectionResource]
   126  		if !ok {
   127  			return fmt.Errorf("Not found: %s", vpnConnectionResource)
   128  		}
   129  
   130  		ec2conn := testAccProvider.Meta().(*AWSClient).ec2conn
   131  
   132  		_, err := ec2conn.DescribeVpnConnections(&ec2.DescribeVpnConnectionsInput{
   133  			VpnConnectionIds: []*string{aws.String(connection.Primary.ID)},
   134  		})
   135  
   136  		if err != nil {
   137  			return err
   138  		}
   139  
   140  		return nil
   141  	}
   142  }
   143  
   144  func TestAWSVpnConnection_xmlconfig(t *testing.T) {
   145  	tunnelInfo, err := xmlConfigToTunnelInfo(testAccAwsVpnTunnelInfoXML)
   146  	if err != nil {
   147  		t.Fatalf("Error unmarshalling XML: %s", err)
   148  	}
   149  	if tunnelInfo.Tunnel1Address != "FIRST_ADDRESS" {
   150  		t.Fatalf("First address from tunnel XML was incorrect.")
   151  	}
   152  	if tunnelInfo.Tunnel1PreSharedKey != "FIRST_KEY" {
   153  		t.Fatalf("First key from tunnel XML was incorrect.")
   154  	}
   155  	if tunnelInfo.Tunnel2Address != "SECOND_ADDRESS" {
   156  		t.Fatalf("Second address from tunnel XML was incorrect.")
   157  	}
   158  	if tunnelInfo.Tunnel2PreSharedKey != "SECOND_KEY" {
   159  		t.Fatalf("Second key from tunnel XML was incorrect.")
   160  	}
   161  }
   162  
   163  const testAccAwsVpnConnectionConfig = `
   164  resource "aws_vpn_gateway" "vpn_gateway" {
   165    tags {
   166      Name = "vpn_gateway"
   167    }
   168  }
   169  
   170  resource "aws_customer_gateway" "customer_gateway" {
   171    bgp_asn = 65000
   172    ip_address = "178.0.0.1"
   173    type = "ipsec.1"
   174  }
   175  
   176  resource "aws_vpn_connection" "foo" {
   177    vpn_gateway_id = "${aws_vpn_gateway.vpn_gateway.id}"
   178    customer_gateway_id = "${aws_customer_gateway.customer_gateway.id}"
   179    type = "ipsec.1"
   180    static_routes_only = true
   181  }
   182  `
   183  
   184  // Change static_routes_only to be false, forcing a refresh.
   185  const testAccAwsVpnConnectionConfigUpdate = `
   186  resource "aws_vpn_gateway" "vpn_gateway" {
   187    tags {
   188      Name = "vpn_gateway"
   189    }
   190  }
   191  
   192  resource "aws_customer_gateway" "customer_gateway" {
   193    bgp_asn = 65000
   194    ip_address = "178.0.0.1"
   195    type = "ipsec.1"
   196  }
   197  
   198  resource "aws_vpn_connection" "foo" {
   199    vpn_gateway_id = "${aws_vpn_gateway.vpn_gateway.id}"
   200    customer_gateway_id = "${aws_customer_gateway.customer_gateway.id}"
   201    type = "ipsec.1"
   202    static_routes_only = false
   203  }
   204  `
   205  
   206  // Test our VPN tunnel config XML parsing
   207  const testAccAwsVpnTunnelInfoXML = `
   208  <vpn_connection id="vpn-abc123">
   209    <ipsec_tunnel>
   210      <vpn_gateway>
   211        <tunnel_outside_address>
   212          <ip_address>SECOND_ADDRESS</ip_address>
   213        </tunnel_outside_address>
   214      </vpn_gateway>
   215      <ike>
   216        <pre_shared_key>SECOND_KEY</pre_shared_key>
   217      </ike>
   218    </ipsec_tunnel>
   219    <ipsec_tunnel>
   220      <vpn_gateway>
   221        <tunnel_outside_address>
   222          <ip_address>FIRST_ADDRESS</ip_address>
   223        </tunnel_outside_address>
   224      </vpn_gateway>
   225      <ike>
   226        <pre_shared_key>FIRST_KEY</pre_shared_key>
   227      </ike>
   228    </ipsec_tunnel>
   229  </vpn_connection>
   230  `