From a7b7c4f9ddbd54f348693b4f6334d2a8db4c71fd Mon Sep 17 00:00:00 2001 From: The Magician Date: Wed, 20 Mar 2019 10:34:26 -0700 Subject: [PATCH] Add post-create for VpnTunnels Labels (#3277) Signed-off-by: Modular Magician --- google/resource_compute_vpn_tunnel.go | 108 ------------------ .../docs/r/compute_vpn_tunnel.html.markdown | 94 +++++++++++++-- 2 files changed, 85 insertions(+), 117 deletions(-) diff --git a/google/resource_compute_vpn_tunnel.go b/google/resource_compute_vpn_tunnel.go index 3270fb0c..c2ea0e19 100644 --- a/google/resource_compute_vpn_tunnel.go +++ b/google/resource_compute_vpn_tunnel.go @@ -133,7 +133,6 @@ func resourceComputeVpnTunnel() *schema.Resource { return &schema.Resource{ Create: resourceComputeVpnTunnelCreate, Read: resourceComputeVpnTunnelRead, - Update: resourceComputeVpnTunnelUpdate, Delete: resourceComputeVpnTunnelDelete, Importer: &schema.ResourceImporter{ @@ -142,7 +141,6 @@ func resourceComputeVpnTunnel() *schema.Resource { Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(240 * time.Second), - Update: schema.DefaultTimeout(240 * time.Second), Delete: schema.DefaultTimeout(240 * time.Second), }, @@ -181,11 +179,6 @@ func resourceComputeVpnTunnel() *schema.Resource { ForceNew: true, Default: 2, }, - "labels": { - Type: schema.TypeMap, - Optional: true, - Elem: &schema.Schema{Type: schema.TypeString}, - }, "local_traffic_selector": { Type: schema.TypeSet, Computed: true, @@ -227,10 +220,6 @@ func resourceComputeVpnTunnel() *schema.Resource { Type: schema.TypeString, Computed: true, }, - "label_fingerprint": { - Type: schema.TypeString, - Computed: true, - }, "shared_secret_hash": { Type: schema.TypeString, Computed: true, @@ -307,18 +296,6 @@ func resourceComputeVpnTunnelCreate(d *schema.ResourceData, meta interface{}) er } else if v, ok := d.GetOkExists("remote_traffic_selector"); !isEmptyValue(reflect.ValueOf(remoteTrafficSelectorProp)) && (ok || !reflect.DeepEqual(v, remoteTrafficSelectorProp)) { obj["remoteTrafficSelector"] = remoteTrafficSelectorProp } - labelsProp, err := expandComputeVpnTunnelLabels(d.Get("labels"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("labels"); !isEmptyValue(reflect.ValueOf(labelsProp)) && (ok || !reflect.DeepEqual(v, labelsProp)) { - obj["labels"] = labelsProp - } - labelFingerprintProp, err := expandComputeVpnTunnelLabelFingerprint(d.Get("label_fingerprint"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("label_fingerprint"); !isEmptyValue(reflect.ValueOf(labelFingerprintProp)) && (ok || !reflect.DeepEqual(v, labelFingerprintProp)) { - obj["labelFingerprint"] = labelFingerprintProp - } regionProp, err := expandComputeVpnTunnelRegion(d.Get("region"), d, config) if err != nil { return err @@ -425,12 +402,6 @@ func resourceComputeVpnTunnelRead(d *schema.ResourceData, meta interface{}) erro if err := d.Set("remote_traffic_selector", flattenComputeVpnTunnelRemoteTrafficSelector(res["remoteTrafficSelector"], d)); err != nil { return fmt.Errorf("Error reading VpnTunnel: %s", err) } - if err := d.Set("labels", flattenComputeVpnTunnelLabels(res["labels"], d)); err != nil { - return fmt.Errorf("Error reading VpnTunnel: %s", err) - } - if err := d.Set("label_fingerprint", flattenComputeVpnTunnelLabelFingerprint(res["labelFingerprint"], d)); err != nil { - return fmt.Errorf("Error reading VpnTunnel: %s", err) - } if err := d.Set("detailed_status", flattenComputeVpnTunnelDetailedStatus(res["detailedStatus"], d)); err != nil { return fmt.Errorf("Error reading VpnTunnel: %s", err) } @@ -444,62 +415,6 @@ func resourceComputeVpnTunnelRead(d *schema.ResourceData, meta interface{}) erro return nil } -func resourceComputeVpnTunnelUpdate(d *schema.ResourceData, meta interface{}) error { - config := meta.(*Config) - - d.Partial(true) - - if d.HasChange("labels") || d.HasChange("label_fingerprint") { - obj := make(map[string]interface{}) - labelsProp, err := expandComputeVpnTunnelLabels(d.Get("labels"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("labels"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) { - obj["labels"] = labelsProp - } - labelFingerprintProp, err := expandComputeVpnTunnelLabelFingerprint(d.Get("label_fingerprint"), d, config) - if err != nil { - return err - } else if v, ok := d.GetOkExists("label_fingerprint"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelFingerprintProp)) { - obj["labelFingerprint"] = labelFingerprintProp - } - - url, err := replaceVars(d, config, "https://www.googleapis.com/compute/v1/projects/{{project}}/regions/{{region}}/vpnTunnels/{{name}}/setLabels") - if err != nil { - return err - } - res, err := sendRequestWithTimeout(config, "POST", url, obj, d.Timeout(schema.TimeoutUpdate)) - if err != nil { - return fmt.Errorf("Error updating VpnTunnel %q: %s", d.Id(), err) - } - - project, err := getProject(d, config) - if err != nil { - return err - } - op := &compute.Operation{} - err = Convert(res, op) - if err != nil { - return err - } - - err = computeOperationWaitTime( - config.clientCompute, op, project, "Updating VpnTunnel", - int(d.Timeout(schema.TimeoutUpdate).Minutes())) - - if err != nil { - return err - } - - d.SetPartial("labels") - d.SetPartial("label_fingerprint") - } - - d.Partial(false) - - return resourceComputeVpnTunnelRead(d, meta) -} - func resourceComputeVpnTunnelDelete(d *schema.ResourceData, meta interface{}) error { config := meta.(*Config) @@ -611,14 +526,6 @@ func flattenComputeVpnTunnelRemoteTrafficSelector(v interface{}, d *schema.Resou return schema.NewSet(schema.HashString, v.([]interface{})) } -func flattenComputeVpnTunnelLabels(v interface{}, d *schema.ResourceData) interface{} { - return v -} - -func flattenComputeVpnTunnelLabelFingerprint(v interface{}, d *schema.ResourceData) interface{} { - return v -} - func flattenComputeVpnTunnelDetailedStatus(v interface{}, d *schema.ResourceData) interface{} { return v } @@ -679,21 +586,6 @@ func expandComputeVpnTunnelRemoteTrafficSelector(v interface{}, d TerraformResou return v, nil } -func expandComputeVpnTunnelLabels(v interface{}, d TerraformResourceData, config *Config) (map[string]string, error) { - if v == nil { - return map[string]string{}, nil - } - m := make(map[string]string) - for k, val := range v.(map[string]interface{}) { - m[k] = val.(string) - } - return m, nil -} - -func expandComputeVpnTunnelLabelFingerprint(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { - return v, nil -} - func expandComputeVpnTunnelRegion(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { f, err := parseGlobalFieldValue("regions", v.(string), "project", d, config, true) if err != nil { diff --git a/website/docs/r/compute_vpn_tunnel.html.markdown b/website/docs/r/compute_vpn_tunnel.html.markdown index d73283d3..95a2c6ce 100644 --- a/website/docs/r/compute_vpn_tunnel.html.markdown +++ b/website/docs/r/compute_vpn_tunnel.html.markdown @@ -103,6 +103,91 @@ resource "google_compute_route" "route1" { next_hop_vpn_tunnel = "${google_compute_vpn_tunnel.tunnel1.self_link}" } ``` + +## Example Usage - Vpn Tunnel Beta + + +```hcl +resource "google_compute_vpn_tunnel" "tunnel1" { + provider = "google-beta" + name = "tunnel1" + peer_ip = "15.0.0.120" + shared_secret = "a secret message" + + target_vpn_gateway = "${google_compute_vpn_gateway.target_gateway.self_link}" + + depends_on = [ + "google_compute_forwarding_rule.fr_esp", + "google_compute_forwarding_rule.fr_udp500", + "google_compute_forwarding_rule.fr_udp4500", + ] + + labels { + foo = "bar" + } +} + +resource "google_compute_vpn_gateway" "target_gateway" { + provider = "google-beta" + name = "vpn1" + network = "${google_compute_network.network1.self_link}" +} + +resource "google_compute_network" "network1" { + provider = "google-beta" + name = "network1" +} + +resource "google_compute_address" "vpn_static_ip" { + provider = "google-beta" + name = "vpn-static-ip" +} + +resource "google_compute_forwarding_rule" "fr_esp" { + provider = "google-beta" + name = "fr-esp" + ip_protocol = "ESP" + ip_address = "${google_compute_address.vpn_static_ip.address}" + target = "${google_compute_vpn_gateway.target_gateway.self_link}" +} + +resource "google_compute_forwarding_rule" "fr_udp500" { + provider = "google-beta" + name = "fr-udp500" + ip_protocol = "UDP" + port_range = "500" + ip_address = "${google_compute_address.vpn_static_ip.address}" + target = "${google_compute_vpn_gateway.target_gateway.self_link}" +} + +resource "google_compute_forwarding_rule" "fr_udp4500" { + provider = "google-beta" + name = "fr-udp4500" + ip_protocol = "UDP" + port_range = "4500" + ip_address = "${google_compute_address.vpn_static_ip.address}" + target = "${google_compute_vpn_gateway.target_gateway.self_link}" +} + +resource "google_compute_route" "route1" { + provider = "google-beta" + name = "route1" + network = "${google_compute_network.network1.name}" + dest_range = "15.0.0.0/24" + priority = 1000 + + next_hop_vpn_tunnel = "${google_compute_vpn_tunnel.tunnel1.self_link}" +} + +provider "google-beta"{ + region = "us-central1" + zone = "us-central1-a" +} +``` ## Argument Reference @@ -165,10 +250,6 @@ The following arguments are supported: for example `192.168.0.0/16`. The ranges should be disjoint. Only IPv4 is supported. -* `labels` - - (Optional) - Labels to apply to this VpnTunnel. - * `region` - (Optional) The region where the tunnel is located. If unset, is set to the region of `target_vpn_gateway`. @@ -187,10 +268,6 @@ In addition to the arguments listed above, the following computed attributes are * `shared_secret_hash` - Hash of the shared secret. -* `label_fingerprint` - - The fingerprint used for optimistic locking of this resource. Used - internally during updates. - * `detailed_status` - Detailed status message for the VPN tunnel. * `self_link` - The URI of the created resource. @@ -202,7 +279,6 @@ This resource provides the following [Timeouts](/docs/configuration/resources.html#timeouts) configuration options: - `create` - Default is 4 minutes. -- `update` - Default is 4 minutes. - `delete` - Default is 4 minutes. ## Import