github.com/erriapo/terraform@v0.6.12-0.20160203182612-0340ea72354f/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  			"detailed_status": &schema.Schema{
    59  				Type:     schema.TypeString,
    60  				Computed: true,
    61  			},
    62  			"self_link": &schema.Schema{
    63  				Type:     schema.TypeString,
    64  				Computed: true,
    65  			},
    66  		},
    67  	}
    68  }
    69  
    70  func resourceComputeVpnTunnelCreate(d *schema.ResourceData, meta interface{}) error {
    71  	config := meta.(*Config)
    72  
    73  	name := d.Get("name").(string)
    74  	region := getOptionalRegion(d, config)
    75  	peerIp := d.Get("peer_ip").(string)
    76  	sharedSecret := d.Get("shared_secret").(string)
    77  	targetVpnGateway := d.Get("target_vpn_gateway").(string)
    78  	ikeVersion := d.Get("ike_version").(int)
    79  	project := config.Project
    80  
    81  	if ikeVersion < 1 || ikeVersion > 2 {
    82  		return fmt.Errorf("Only IKE version 1 or 2 supported, not %d", ikeVersion)
    83  	}
    84  
    85  	vpnTunnelsService := compute.NewVpnTunnelsService(config.clientCompute)
    86  
    87  	vpnTunnel := &compute.VpnTunnel{
    88  		Name:             name,
    89  		PeerIp:           peerIp,
    90  		SharedSecret:     sharedSecret,
    91  		TargetVpnGateway: targetVpnGateway,
    92  		IkeVersion:       int64(ikeVersion),
    93  	}
    94  
    95  	if v, ok := d.GetOk("description"); ok {
    96  		vpnTunnel.Description = v.(string)
    97  	}
    98  
    99  	op, err := vpnTunnelsService.Insert(project, region, vpnTunnel).Do()
   100  	if err != nil {
   101  		return fmt.Errorf("Error Inserting VPN Tunnel %s : %s", name, err)
   102  	}
   103  
   104  	err = computeOperationWaitRegion(config, op, region, "Inserting VPN Tunnel")
   105  	if err != nil {
   106  		return fmt.Errorf("Error Waiting to Insert VPN Tunnel %s: %s", name, err)
   107  	}
   108  
   109  	return resourceComputeVpnTunnelRead(d, meta)
   110  }
   111  
   112  func resourceComputeVpnTunnelRead(d *schema.ResourceData, meta interface{}) error {
   113  	config := meta.(*Config)
   114  
   115  	name := d.Get("name").(string)
   116  	region := d.Get("region").(string)
   117  	project := config.Project
   118  
   119  	vpnTunnelsService := compute.NewVpnTunnelsService(config.clientCompute)
   120  
   121  	vpnTunnel, err := vpnTunnelsService.Get(project, region, name).Do()
   122  	if err != nil {
   123  		if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 {
   124  			log.Printf("[WARN] Removing VPN Tunnel %q because it's gone", d.Get("name").(string))
   125  			// The resource doesn't exist anymore
   126  			d.SetId("")
   127  
   128  			return nil
   129  		}
   130  
   131  		return fmt.Errorf("Error Reading VPN Tunnel %s: %s", name, err)
   132  	}
   133  
   134  	d.Set("detailed_status", vpnTunnel.DetailedStatus)
   135  	d.Set("self_link", vpnTunnel.SelfLink)
   136  
   137  	d.SetId(name)
   138  
   139  	return nil
   140  }
   141  
   142  func resourceComputeVpnTunnelDelete(d *schema.ResourceData, meta interface{}) error {
   143  	config := meta.(*Config)
   144  
   145  	name := d.Get("name").(string)
   146  	region := d.Get("region").(string)
   147  	project := config.Project
   148  
   149  	vpnTunnelsService := compute.NewVpnTunnelsService(config.clientCompute)
   150  
   151  	op, err := vpnTunnelsService.Delete(project, region, name).Do()
   152  	if err != nil {
   153  		return fmt.Errorf("Error Reading VPN Tunnel %s: %s", name, err)
   154  	}
   155  
   156  	err = computeOperationWaitRegion(config, op, region, "Deleting VPN Tunnel")
   157  	if err != nil {
   158  		return fmt.Errorf("Error Waiting to Delete VPN Tunnel %s: %s", name, err)
   159  	}
   160  
   161  	return nil
   162  }