Skip to content

Commit 095f157

Browse files
Move Globaladdress.Labels to GA (#11093) (#18646)
[upstream:d102e14626fdbc2e8bda31cb60a36c4681bdff9c] Signed-off-by: Modular Magician <[email protected]>
1 parent a54663d commit 095f157

File tree

3 files changed

+217
-3
lines changed

3 files changed

+217
-3
lines changed

.changelog/11093.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: move `labels` field on `google_compute_global_address` resource from Beta to GA
3+
```

google/services/compute/resource_compute_global_address.go

+213
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func ResourceComputeGlobalAddress() *schema.Resource {
3636
return &schema.Resource{
3737
Create: resourceComputeGlobalAddressCreate,
3838
Read: resourceComputeGlobalAddressRead,
39+
Update: resourceComputeGlobalAddressUpdate,
3940
Delete: resourceComputeGlobalAddressDelete,
4041

4142
Importer: &schema.ResourceImporter{
@@ -44,6 +45,7 @@ func ResourceComputeGlobalAddress() *schema.Resource {
4445

4546
Timeouts: &schema.ResourceTimeout{
4647
Create: schema.DefaultTimeout(20 * time.Minute),
48+
Update: schema.DefaultTimeout(20 * time.Minute),
4749
Delete: schema.DefaultTimeout(20 * time.Minute),
4850
},
4951

@@ -100,6 +102,16 @@ address or omitted to allow GCP to choose a valid one for you.`,
100102
DiffSuppressFunc: tpgresource.EmptyOrDefaultStringSuppress("IPV4"),
101103
Description: `The IP Version that will be used by this address. The default value is 'IPV4'. Possible values: ["IPV4", "IPV6"]`,
102104
},
105+
"labels": {
106+
Type: schema.TypeMap,
107+
Optional: true,
108+
Description: `Labels to apply to this address. A list of key->value pairs.
109+
110+
111+
**Note**: This field is non-authoritative, and will only manage the labels present in your configuration.
112+
Please refer to the field 'effective_labels' for all of the labels present on the resource.`,
113+
Elem: &schema.Schema{Type: schema.TypeString},
114+
},
103115
"network": {
104116
Type: schema.TypeString,
105117
Optional: true,
@@ -137,6 +149,19 @@ when purpose=PRIVATE_SERVICE_CONNECT`,
137149
Computed: true,
138150
Description: `Creation timestamp in RFC3339 text format.`,
139151
},
152+
"effective_labels": {
153+
Type: schema.TypeMap,
154+
Computed: true,
155+
Description: `All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.`,
156+
Elem: &schema.Schema{Type: schema.TypeString},
157+
},
158+
"terraform_labels": {
159+
Type: schema.TypeMap,
160+
Computed: true,
161+
Description: `The combination of labels configured directly on the resource
162+
and default labels configured on the provider.`,
163+
Elem: &schema.Schema{Type: schema.TypeString},
164+
},
140165
"project": {
141166
Type: schema.TypeString,
142167
Optional: true,
@@ -208,6 +233,12 @@ func resourceComputeGlobalAddressCreate(d *schema.ResourceData, meta interface{}
208233
} else if v, ok := d.GetOkExists("network"); !tpgresource.IsEmptyValue(reflect.ValueOf(networkProp)) && (ok || !reflect.DeepEqual(v, networkProp)) {
209234
obj["network"] = networkProp
210235
}
236+
labelsProp, err := expandComputeGlobalAddressEffectiveLabels(d.Get("effective_labels"), d, config)
237+
if err != nil {
238+
return err
239+
} else if v, ok := d.GetOkExists("effective_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(labelsProp)) && (ok || !reflect.DeepEqual(v, labelsProp)) {
240+
obj["labels"] = labelsProp
241+
}
211242

212243
url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/global/addresses")
213244
if err != nil {
@@ -265,6 +296,66 @@ func resourceComputeGlobalAddressCreate(d *schema.ResourceData, meta interface{}
265296
return fmt.Errorf("Error waiting to create GlobalAddress: %s", err)
266297
}
267298

299+
if v, ok := d.GetOkExists("effective_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) {
300+
labels := d.Get("labels")
301+
terraformLables := d.Get("terraform_labels")
302+
303+
// Labels cannot be set in a create. We'll have to set them here.
304+
err = resourceComputeGlobalAddressRead(d, meta)
305+
if err != nil {
306+
return err
307+
}
308+
309+
obj := make(map[string]interface{})
310+
// d.Get("effective_labels") will have been overridden by the Read call.
311+
labelsProp, err := expandComputeGlobalAddressEffectiveLabels(v, d, config)
312+
if err != nil {
313+
return err
314+
}
315+
obj["labels"] = labelsProp
316+
labelFingerprintProp := d.Get("label_fingerprint")
317+
obj["labelFingerprint"] = labelFingerprintProp
318+
319+
url, err = tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/global/addresses/{{name}}/setLabels")
320+
if err != nil {
321+
return err
322+
}
323+
res, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
324+
Config: config,
325+
Method: "POST",
326+
Project: project,
327+
RawURL: url,
328+
UserAgent: userAgent,
329+
Body: obj,
330+
})
331+
if err != nil {
332+
return fmt.Errorf("Error adding labels to ComputeGlobalAddress %q: %s", d.Id(), err)
333+
}
334+
335+
err = ComputeOperationWaitTime(
336+
config, res, project, "Updating ComputeGlobalAddress Labels", userAgent,
337+
d.Timeout(schema.TimeoutUpdate))
338+
339+
if err != nil {
340+
return err
341+
}
342+
343+
// Set back the labels field, as it is needed to decide the value of "labels" in the state in the read function.
344+
if err := d.Set("labels", labels); err != nil {
345+
return fmt.Errorf("Error setting back labels: %s", err)
346+
}
347+
348+
// Set back the terraform_labels field, as it is needed to decide the value of "terraform_labels" in the state in the read function.
349+
if err := d.Set("terraform_labels", terraformLables); err != nil {
350+
return fmt.Errorf("Error setting back terraform_labels: %s", err)
351+
}
352+
353+
// Set back the effective_labels field, as it is needed to decide the value of "effective_labels" in the state in the read function.
354+
if err := d.Set("effective_labels", v); err != nil {
355+
return fmt.Errorf("Error setting back effective_labels: %s", err)
356+
}
357+
}
358+
268359
log.Printf("[DEBUG] Finished creating GlobalAddress %q: %#v", d.Id(), res)
269360

270361
return resourceComputeGlobalAddressRead(d, meta)
@@ -324,6 +415,9 @@ func resourceComputeGlobalAddressRead(d *schema.ResourceData, meta interface{})
324415
if err := d.Set("name", flattenComputeGlobalAddressName(res["name"], d, config)); err != nil {
325416
return fmt.Errorf("Error reading GlobalAddress: %s", err)
326417
}
418+
if err := d.Set("labels", flattenComputeGlobalAddressLabels(res["labels"], d, config)); err != nil {
419+
return fmt.Errorf("Error reading GlobalAddress: %s", err)
420+
}
327421
if err := d.Set("ip_version", flattenComputeGlobalAddressIpVersion(res["ipVersion"], d, config)); err != nil {
328422
return fmt.Errorf("Error reading GlobalAddress: %s", err)
329423
}
@@ -339,13 +433,87 @@ func resourceComputeGlobalAddressRead(d *schema.ResourceData, meta interface{})
339433
if err := d.Set("network", flattenComputeGlobalAddressNetwork(res["network"], d, config)); err != nil {
340434
return fmt.Errorf("Error reading GlobalAddress: %s", err)
341435
}
436+
if err := d.Set("terraform_labels", flattenComputeGlobalAddressTerraformLabels(res["labels"], d, config)); err != nil {
437+
return fmt.Errorf("Error reading GlobalAddress: %s", err)
438+
}
439+
if err := d.Set("effective_labels", flattenComputeGlobalAddressEffectiveLabels(res["labels"], d, config)); err != nil {
440+
return fmt.Errorf("Error reading GlobalAddress: %s", err)
441+
}
342442
if err := d.Set("self_link", tpgresource.ConvertSelfLinkToV1(res["selfLink"].(string))); err != nil {
343443
return fmt.Errorf("Error reading GlobalAddress: %s", err)
344444
}
345445

346446
return nil
347447
}
348448

449+
func resourceComputeGlobalAddressUpdate(d *schema.ResourceData, meta interface{}) error {
450+
config := meta.(*transport_tpg.Config)
451+
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
452+
if err != nil {
453+
return err
454+
}
455+
456+
billingProject := ""
457+
458+
project, err := tpgresource.GetProject(d, config)
459+
if err != nil {
460+
return fmt.Errorf("Error fetching project for GlobalAddress: %s", err)
461+
}
462+
billingProject = project
463+
464+
d.Partial(true)
465+
466+
if d.HasChange("effective_labels") {
467+
obj := make(map[string]interface{})
468+
469+
labelsProp, err := expandComputeGlobalAddressEffectiveLabels(d.Get("effective_labels"), d, config)
470+
if err != nil {
471+
return err
472+
} else if v, ok := d.GetOkExists("effective_labels"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, labelsProp)) {
473+
obj["labels"] = labelsProp
474+
}
475+
476+
url, err := tpgresource.ReplaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/global/addresses/{{name}}/setLabels")
477+
if err != nil {
478+
return err
479+
}
480+
481+
headers := make(http.Header)
482+
483+
// err == nil indicates that the billing_project value was found
484+
if bp, err := tpgresource.GetBillingProject(d, config); err == nil {
485+
billingProject = bp
486+
}
487+
488+
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
489+
Config: config,
490+
Method: "POST",
491+
Project: billingProject,
492+
RawURL: url,
493+
UserAgent: userAgent,
494+
Body: obj,
495+
Timeout: d.Timeout(schema.TimeoutUpdate),
496+
Headers: headers,
497+
})
498+
if err != nil {
499+
return fmt.Errorf("Error updating GlobalAddress %q: %s", d.Id(), err)
500+
} else {
501+
log.Printf("[DEBUG] Finished updating GlobalAddress %q: %#v", d.Id(), res)
502+
}
503+
504+
err = ComputeOperationWaitTime(
505+
config, res, project, "Updating GlobalAddress", userAgent,
506+
d.Timeout(schema.TimeoutUpdate))
507+
if err != nil {
508+
return err
509+
}
510+
}
511+
512+
d.Partial(false)
513+
514+
return resourceComputeGlobalAddressRead(d, meta)
515+
}
516+
349517
func resourceComputeGlobalAddressDelete(d *schema.ResourceData, meta interface{}) error {
350518
config := meta.(*transport_tpg.Config)
351519
userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent)
@@ -438,6 +606,21 @@ func flattenComputeGlobalAddressName(v interface{}, d *schema.ResourceData, conf
438606
return v
439607
}
440608

609+
func flattenComputeGlobalAddressLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
610+
if v == nil {
611+
return v
612+
}
613+
614+
transformed := make(map[string]interface{})
615+
if l, ok := d.GetOkExists("labels"); ok {
616+
for k := range l.(map[string]interface{}) {
617+
transformed[k] = v.(map[string]interface{})[k]
618+
}
619+
}
620+
621+
return transformed
622+
}
623+
441624
func flattenComputeGlobalAddressIpVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
442625
return v
443626
}
@@ -474,6 +657,25 @@ func flattenComputeGlobalAddressNetwork(v interface{}, d *schema.ResourceData, c
474657
return tpgresource.ConvertSelfLinkToV1(v.(string))
475658
}
476659

660+
func flattenComputeGlobalAddressTerraformLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
661+
if v == nil {
662+
return v
663+
}
664+
665+
transformed := make(map[string]interface{})
666+
if l, ok := d.GetOkExists("terraform_labels"); ok {
667+
for k := range l.(map[string]interface{}) {
668+
transformed[k] = v.(map[string]interface{})[k]
669+
}
670+
}
671+
672+
return transformed
673+
}
674+
675+
func flattenComputeGlobalAddressEffectiveLabels(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
676+
return v
677+
}
678+
477679
func expandComputeGlobalAddressAddress(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
478680
return v, nil
479681
}
@@ -509,3 +711,14 @@ func expandComputeGlobalAddressNetwork(v interface{}, d tpgresource.TerraformRes
509711
}
510712
return f.RelativeLink(), nil
511713
}
714+
715+
func expandComputeGlobalAddressEffectiveLabels(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]string, error) {
716+
if v == nil {
717+
return map[string]string{}, nil
718+
}
719+
m := make(map[string]string)
720+
for k, val := range v.(map[string]interface{}) {
721+
m[k] = val.(string)
722+
}
723+
return m, nil
724+
}

website/docs/r/compute_global_address.html.markdown

+1-3
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ The following arguments are supported:
9797
An optional description of this resource.
9898

9999
* `labels` -
100-
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
100+
(Optional)
101101
Labels to apply to this address. A list of key->value pairs.
102102

103103
**Note**: This field is non-authoritative, and will only manage the labels present in your configuration.
@@ -155,12 +155,10 @@ In addition to the arguments listed above, the following computed attributes are
155155
internally during updates.
156156

157157
* `terraform_labels` -
158-
([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
159158
The combination of labels configured directly on the resource
160159
and default labels configured on the provider.
161160

162161
* `effective_labels` -
163-
([Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
164162
All of labels (key/value pairs) present on the resource in GCP, including the labels configured through Terraform, other clients and services.
165163
* `self_link` - The URI of the created resource.
166164

0 commit comments

Comments
 (0)