mirror of
https://github.com/letic/terraform-provider-google.git
synced 2024-10-01 16:21:06 +00:00
Add post-create for VpnTunnels Labels (#3277)
Signed-off-by: Modular Magician <magic-modules@google.com>
This commit is contained in:
parent
7bb31825b4
commit
a7b7c4f9dd
@ -133,7 +133,6 @@ func resourceComputeVpnTunnel() *schema.Resource {
|
|||||||
return &schema.Resource{
|
return &schema.Resource{
|
||||||
Create: resourceComputeVpnTunnelCreate,
|
Create: resourceComputeVpnTunnelCreate,
|
||||||
Read: resourceComputeVpnTunnelRead,
|
Read: resourceComputeVpnTunnelRead,
|
||||||
Update: resourceComputeVpnTunnelUpdate,
|
|
||||||
Delete: resourceComputeVpnTunnelDelete,
|
Delete: resourceComputeVpnTunnelDelete,
|
||||||
|
|
||||||
Importer: &schema.ResourceImporter{
|
Importer: &schema.ResourceImporter{
|
||||||
@ -142,7 +141,6 @@ func resourceComputeVpnTunnel() *schema.Resource {
|
|||||||
|
|
||||||
Timeouts: &schema.ResourceTimeout{
|
Timeouts: &schema.ResourceTimeout{
|
||||||
Create: schema.DefaultTimeout(240 * time.Second),
|
Create: schema.DefaultTimeout(240 * time.Second),
|
||||||
Update: schema.DefaultTimeout(240 * time.Second),
|
|
||||||
Delete: schema.DefaultTimeout(240 * time.Second),
|
Delete: schema.DefaultTimeout(240 * time.Second),
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -181,11 +179,6 @@ func resourceComputeVpnTunnel() *schema.Resource {
|
|||||||
ForceNew: true,
|
ForceNew: true,
|
||||||
Default: 2,
|
Default: 2,
|
||||||
},
|
},
|
||||||
"labels": {
|
|
||||||
Type: schema.TypeMap,
|
|
||||||
Optional: true,
|
|
||||||
Elem: &schema.Schema{Type: schema.TypeString},
|
|
||||||
},
|
|
||||||
"local_traffic_selector": {
|
"local_traffic_selector": {
|
||||||
Type: schema.TypeSet,
|
Type: schema.TypeSet,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
@ -227,10 +220,6 @@ func resourceComputeVpnTunnel() *schema.Resource {
|
|||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
"label_fingerprint": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Computed: true,
|
|
||||||
},
|
|
||||||
"shared_secret_hash": {
|
"shared_secret_hash": {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Computed: true,
|
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)) {
|
} else if v, ok := d.GetOkExists("remote_traffic_selector"); !isEmptyValue(reflect.ValueOf(remoteTrafficSelectorProp)) && (ok || !reflect.DeepEqual(v, remoteTrafficSelectorProp)) {
|
||||||
obj["remoteTrafficSelector"] = 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)
|
regionProp, err := expandComputeVpnTunnelRegion(d.Get("region"), d, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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 {
|
if err := d.Set("remote_traffic_selector", flattenComputeVpnTunnelRemoteTrafficSelector(res["remoteTrafficSelector"], d)); err != nil {
|
||||||
return fmt.Errorf("Error reading VpnTunnel: %s", err)
|
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 {
|
if err := d.Set("detailed_status", flattenComputeVpnTunnelDetailedStatus(res["detailedStatus"], d)); err != nil {
|
||||||
return fmt.Errorf("Error reading VpnTunnel: %s", err)
|
return fmt.Errorf("Error reading VpnTunnel: %s", err)
|
||||||
}
|
}
|
||||||
@ -444,62 +415,6 @@ func resourceComputeVpnTunnelRead(d *schema.ResourceData, meta interface{}) erro
|
|||||||
return nil
|
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 {
|
func resourceComputeVpnTunnelDelete(d *schema.ResourceData, meta interface{}) error {
|
||||||
config := meta.(*Config)
|
config := meta.(*Config)
|
||||||
|
|
||||||
@ -611,14 +526,6 @@ func flattenComputeVpnTunnelRemoteTrafficSelector(v interface{}, d *schema.Resou
|
|||||||
return schema.NewSet(schema.HashString, v.([]interface{}))
|
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{} {
|
func flattenComputeVpnTunnelDetailedStatus(v interface{}, d *schema.ResourceData) interface{} {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
@ -679,21 +586,6 @@ func expandComputeVpnTunnelRemoteTrafficSelector(v interface{}, d TerraformResou
|
|||||||
return v, nil
|
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) {
|
func expandComputeVpnTunnelRegion(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
|
||||||
f, err := parseGlobalFieldValue("regions", v.(string), "project", d, config, true)
|
f, err := parseGlobalFieldValue("regions", v.(string), "project", d, config, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -103,6 +103,91 @@ resource "google_compute_route" "route1" {
|
|||||||
next_hop_vpn_tunnel = "${google_compute_vpn_tunnel.tunnel1.self_link}"
|
next_hop_vpn_tunnel = "${google_compute_vpn_tunnel.tunnel1.self_link}"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
|
||||||
|
<a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_working_dir=vpn_tunnel_beta&cloudshell_image=gcr.io%2Fgraphite-cloud-shell-images%2Fterraform%3Alatest&open_in_editor=main.tf&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md" target="_blank">
|
||||||
|
<img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
## 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
|
## Argument Reference
|
||||||
|
|
||||||
@ -165,10 +250,6 @@ The following arguments are supported:
|
|||||||
for example `192.168.0.0/16`. The ranges should be disjoint.
|
for example `192.168.0.0/16`. The ranges should be disjoint.
|
||||||
Only IPv4 is supported.
|
Only IPv4 is supported.
|
||||||
|
|
||||||
* `labels` -
|
|
||||||
(Optional)
|
|
||||||
Labels to apply to this VpnTunnel.
|
|
||||||
|
|
||||||
* `region` -
|
* `region` -
|
||||||
(Optional)
|
(Optional)
|
||||||
The region where the tunnel is located. If unset, is set to the region of `target_vpn_gateway`.
|
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` -
|
* `shared_secret_hash` -
|
||||||
Hash of the shared secret.
|
Hash of the shared secret.
|
||||||
|
|
||||||
* `label_fingerprint` -
|
|
||||||
The fingerprint used for optimistic locking of this resource. Used
|
|
||||||
internally during updates.
|
|
||||||
|
|
||||||
* `detailed_status` -
|
* `detailed_status` -
|
||||||
Detailed status message for the VPN tunnel.
|
Detailed status message for the VPN tunnel.
|
||||||
* `self_link` - The URI of the created resource.
|
* `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:
|
[Timeouts](/docs/configuration/resources.html#timeouts) configuration options:
|
||||||
|
|
||||||
- `create` - Default is 4 minutes.
|
- `create` - Default is 4 minutes.
|
||||||
- `update` - Default is 4 minutes.
|
|
||||||
- `delete` - Default is 4 minutes.
|
- `delete` - Default is 4 minutes.
|
||||||
|
|
||||||
## Import
|
## Import
|
||||||
|
Loading…
Reference in New Issue
Block a user