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 }