github.com/joshgarnett/terraform@v0.5.4-0.20160219181435-92dc20bb3594/builtin/providers/google/resource_compute_vpn_tunnel.go (about)

     1  package google
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  
     9  	"google.golang.org/api/compute/v1"
    10  	"google.golang.org/api/googleapi"
    11  )
    12  
    13  func resourceComputeVpnTunnel() *schema.Resource {
    14  	return &schema.Resource{
    15  		// Unfortunately, the VPNTunnelService does not support update
    16  		// operations. This is why everything is marked forcenew
    17  		Create: resourceComputeVpnTunnelCreate,
    18  		Read:   resourceComputeVpnTunnelRead,
    19  		Delete: resourceComputeVpnTunnelDelete,
    20  
    21  		Schema: map[string]*schema.Schema{
    22  			"name": &schema.Schema{
    23  				Type:     schema.TypeString,
    24  				Required: true,
    25  				ForceNew: true,
    26  			},
    27  			"description": &schema.Schema{
    28  				Type:     schema.TypeString,
    29  				Optional: true,
    30  				ForceNew: true,
    31  			},
    32  			"region": &schema.Schema{
    33  				Type:     schema.TypeString,
    34  				Optional: true,
    35  				ForceNew: true,
    36  			},
    37  			"peer_ip": &schema.Schema{
    38  				Type:     schema.TypeString,
    39  				Required: true,
    40  				ForceNew: true,
    41  			},
    42  			"shared_secret": &schema.Schema{
    43  				Type:     schema.TypeString,
    44  				Required: true,
    45  				ForceNew: true,
    46  			},
    47  			"target_vpn_gateway": &schema.Schema{
    48  				Type:     schema.TypeString,
    49  				Required: true,
    50  				ForceNew: true,
    51  			},
    52  			"ike_version": &schema.Schema{
    53  				Type:     schema.TypeInt,
    54  				Optional: true,
    55  				Default:  2,
    56  				ForceNew: true,
    57  			},
    58  			"local_traffic_selector": &schema.Schema{
    59  				Type:     schema.TypeSet,
    60  				Optional: true,
    61  				ForceNew: true,
    62  				Elem:     &schema.Schema{Type: schema.TypeString},
    63  				Set:      schema.HashString,
    64  			},
    65  			"detailed_status": &schema.Schema{
    66  				Type:     schema.TypeString,
    67  				Computed: true,
    68  			},
    69  			"self_link": &schema.Schema{
    70  				Type:     schema.TypeString,
    71  				Computed: true,
    72  			},
    73  		},
    74  	}
    75  }
    76  
    77  func resourceComputeVpnTunnelCreate(d *schema.ResourceData, meta interface{}) error {
    78  	config := meta.(*Config)
    79  
    80  	name := d.Get("name").(string)
    81  	region := getOptionalRegion(d, config)
    82  	peerIp := d.Get("peer_ip").(string)
    83  	sharedSecret := d.Get("shared_secret").(string)
    84  	targetVpnGateway := d.Get("target_vpn_gateway").(string)
    85  	ikeVersion := d.Get("ike_version").(int)
    86  	project := config.Project
    87  
    88  	if ikeVersion < 1 || ikeVersion > 2 {
    89  		return fmt.Errorf("Only IKE version 1 or 2 supported, not %d", ikeVersion)
    90  	}
    91  
    92  	// Build up the list of sources
    93  	var localTrafficSelectors []string
    94  	if v := d.Get("local_traffic_selector").(*schema.Set); v.Len() > 0 {
    95  		localTrafficSelectors = make([]string, v.Len())
    96  		for i, v := range v.List() {
    97  			localTrafficSelectors[i] = v.(string)
    98  		}
    99  	}
   100  
   101  	vpnTunnelsService := compute.NewVpnTunnelsService(config.clientCompute)
   102  
   103  	vpnTunnel := &compute.VpnTunnel{
   104  		Name:                 name,
   105  		PeerIp:               peerIp,
   106  		SharedSecret:         sharedSecret,
   107  		TargetVpnGateway:     targetVpnGateway,
   108  		IkeVersion:           int64(ikeVersion),
   109  		LocalTrafficSelector: localTrafficSelectors,
   110  	}
   111  
   112  	if v, ok := d.GetOk("description"); ok {
   113  		vpnTunnel.Description = v.(string)
   114  	}
   115  
   116  	op, err := vpnTunnelsService.Insert(project, region, vpnTunnel).Do()
   117  	if err != nil {
   118  		return fmt.Errorf("Error Inserting VPN Tunnel %s : %s", name, err)
   119  	}
   120  
   121  	err = computeOperationWaitRegion(config, op, region, "Inserting VPN Tunnel")
   122  	if err != nil {
   123  		return fmt.Errorf("Error Waiting to Insert VPN Tunnel %s: %s", name, err)
   124  	}
   125  
   126  	return resourceComputeVpnTunnelRead(d, meta)
   127  }
   128  
   129  func resourceComputeVpnTunnelRead(d *schema.ResourceData, meta interface{}) error {
   130  	config := meta.(*Config)
   131  
   132  	name := d.Get("name").(string)
   133  	region := getOptionalRegion(d, config)
   134  	project := config.Project
   135  
   136  	vpnTunnelsService := compute.NewVpnTunnelsService(config.clientCompute)
   137  
   138  	vpnTunnel, err := vpnTunnelsService.Get(project, region, name).Do()
   139  	if err != nil {
   140  		if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
   141  			log.Printf("[WARN] Removing VPN Tunnel %q because it's gone", d.Get("name").(string))
   142  			// The resource doesn't exist anymore
   143  			d.SetId("")
   144  
   145  			return nil
   146  		}
   147  
   148  		return fmt.Errorf("Error Reading VPN Tunnel %s: %s", name, err)
   149  	}
   150  
   151  	d.Set("detailed_status", vpnTunnel.DetailedStatus)
   152  	d.Set("self_link", vpnTunnel.SelfLink)
   153  
   154  	d.SetId(name)
   155  
   156  	return nil
   157  }
   158  
   159  func resourceComputeVpnTunnelDelete(d *schema.ResourceData, meta interface{}) error {
   160  	config := meta.(*Config)
   161  
   162  	name := d.Get("name").(string)
   163  	region := getOptionalRegion(d, config)
   164  	project := config.Project
   165  
   166  	vpnTunnelsService := compute.NewVpnTunnelsService(config.clientCompute)
   167  
   168  	op, err := vpnTunnelsService.Delete(project, region, name).Do()
   169  	if err != nil {
   170  		return fmt.Errorf("Error Reading VPN Tunnel %s: %s", name, err)
   171  	}
   172  
   173  	err = computeOperationWaitRegion(config, op, region, "Deleting VPN Tunnel")
   174  	if err != nil {
   175  		return fmt.Errorf("Error Waiting to Delete VPN Tunnel %s: %s", name, err)
   176  	}
   177  
   178  	return nil
   179  }