Skip to content

Commit 0b5b03b

Browse files
Add etag checks to ACM directional policy resources (#12903) (#9302)
[upstream:c47b0f47e9c46a452fd07cf0b1d598f5f6e35fab] Signed-off-by: Modular Magician <[email protected]>
1 parent 79d829c commit 0b5b03b

13 files changed

+215
-0
lines changed

.changelog/12903.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
accesscontextmanager: added `etag` to access context manager directional policy resources to prevent overriding changes
3+
```

google-beta/services/accesscontextmanager/resource_access_context_manager_service_perimeter_dry_run_egress_policy.go

+50
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,11 @@ the perimeter.`,
309309
Computed: true,
310310
Description: `The name of the Access Policy this resource belongs to.`,
311311
},
312+
"etag": {
313+
Type: schema.TypeString,
314+
Computed: true,
315+
Description: `The perimeter etag is internally used to prevent overwriting the list of policies on PATCH calls. It is retrieved from the same GET perimeter API call that's used to get the current list of policies. The policy defined in this resource is added or removed from that list, and then this etag is sent with the PATCH call along with the updated policies.`,
316+
},
312317
},
313318
UseJSONNumber: true,
314319
}
@@ -377,6 +382,22 @@ func resourceAccessContextManagerServicePerimeterDryRunEgressPolicyCreate(d *sch
377382

378383
headers := make(http.Header)
379384
obj["use_explicit_dry_run_spec"] = true
385+
386+
etag := d.Get("etag").(string)
387+
388+
if etag == "" {
389+
log.Printf("[ERROR] Unable to get etag: %s", err)
390+
return nil
391+
}
392+
obj["etag"] = etag
393+
394+
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
395+
// won't set it
396+
updateMask := []string{"spec.egressPolicies", "etag"}
397+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
398+
if err != nil {
399+
return err
400+
}
380401
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
381402
Config: config,
382403
Method: "PATCH",
@@ -474,6 +495,9 @@ func resourceAccessContextManagerServicePerimeterDryRunEgressPolicyRead(d *schem
474495
if err != nil {
475496
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("AccessContextManagerServicePerimeterDryRunEgressPolicy %q", d.Id()))
476497
}
498+
if err := d.Set("etag", res["etag"]); err != nil {
499+
log.Printf("[ERROR] Unable to set etag: %s", err)
500+
}
477501

478502
res, err = flattenNestedAccessContextManagerServicePerimeterDryRunEgressPolicy(d, meta, res)
479503
if err != nil {
@@ -496,6 +520,9 @@ func resourceAccessContextManagerServicePerimeterDryRunEgressPolicyRead(d *schem
496520
if err := d.Set("title", flattenNestedAccessContextManagerServicePerimeterDryRunEgressPolicyTitle(res["title"], d, config)); err != nil {
497521
return fmt.Errorf("Error reading ServicePerimeterDryRunEgressPolicy: %s", err)
498522
}
523+
if err := d.Set("etag", flattenNestedAccessContextManagerServicePerimeterDryRunEgressPolicyEtag(res["etag"], d, config)); err != nil {
524+
return fmt.Errorf("Error reading ServicePerimeterDryRunEgressPolicy: %s", err)
525+
}
499526

500527
return nil
501528
}
@@ -540,6 +567,22 @@ func resourceAccessContextManagerServicePerimeterDryRunEgressPolicyDelete(d *sch
540567
headers := make(http.Header)
541568
obj["use_explicit_dry_run_spec"] = true
542569

570+
etag := d.Get("etag").(string)
571+
572+
if etag == "" {
573+
log.Printf("[ERROR] Unable to get etag: %s", err)
574+
return nil
575+
}
576+
obj["etag"] = etag
577+
578+
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
579+
// won't set it
580+
updateMask := []string{"spec.egressPolicies", "etag"}
581+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
582+
if err != nil {
583+
return err
584+
}
585+
543586
log.Printf("[DEBUG] Deleting ServicePerimeterDryRunEgressPolicy %q", d.Id())
544587
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
545588
Config: config,
@@ -750,6 +793,10 @@ func flattenNestedAccessContextManagerServicePerimeterDryRunEgressPolicyTitle(v
750793
return v
751794
}
752795

796+
func flattenNestedAccessContextManagerServicePerimeterDryRunEgressPolicyEtag(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
797+
return v
798+
}
799+
753800
func expandNestedAccessContextManagerServicePerimeterDryRunEgressPolicyEgressFrom(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
754801
l := v.([]interface{})
755802
if len(l) == 0 || l[0] == nil {
@@ -1127,6 +1174,9 @@ func resourceAccessContextManagerServicePerimeterDryRunEgressPolicyListForPatch(
11271174
if err != nil {
11281175
return nil, err
11291176
}
1177+
if err := d.Set("etag", res["etag"]); err != nil {
1178+
log.Printf("[ERROR] Unable to set etag: %s", err)
1179+
}
11301180
var v interface{}
11311181
var ok bool
11321182
if v, ok = res["spec"]; ok && v != nil {

google-beta/services/accesscontextmanager/resource_access_context_manager_service_perimeter_dry_run_egress_policy_generated_meta.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ fields:
1616
- field: 'egress_to.operations.method_selectors.permission'
1717
- field: 'egress_to.operations.service_name'
1818
- field: 'egress_to.resources'
19+
- field: 'etag'
1920
- field: 'perimeter'
2021
provider_only: true
2122
- field: 'title'

google-beta/services/accesscontextmanager/resource_access_context_manager_service_perimeter_dry_run_ingress_policy.go

+50
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,11 @@ also matches the 'operations' field.`,
302302
Computed: true,
303303
Description: `The name of the Access Policy this resource belongs to.`,
304304
},
305+
"etag": {
306+
Type: schema.TypeString,
307+
Computed: true,
308+
Description: `The perimeter etag is internally used to prevent overwriting the list of policies on PATCH calls. It is retrieved from the same GET perimeter API call that's used to get the current list of policies. The policy defined in this resource is added or removed from that list, and then this etag is sent with the PATCH call along with the updated policies.`,
309+
},
305310
},
306311
UseJSONNumber: true,
307312
}
@@ -370,6 +375,22 @@ func resourceAccessContextManagerServicePerimeterDryRunIngressPolicyCreate(d *sc
370375

371376
headers := make(http.Header)
372377
obj["use_explicit_dry_run_spec"] = true
378+
379+
etag := d.Get("etag").(string)
380+
381+
if etag == "" {
382+
log.Printf("[ERROR] Unable to get etag: %s", err)
383+
return nil
384+
}
385+
obj["etag"] = etag
386+
387+
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
388+
// won't set it
389+
updateMask := []string{"spec.ingressPolicies", "etag"}
390+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
391+
if err != nil {
392+
return err
393+
}
373394
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
374395
Config: config,
375396
Method: "PATCH",
@@ -467,6 +488,9 @@ func resourceAccessContextManagerServicePerimeterDryRunIngressPolicyRead(d *sche
467488
if err != nil {
468489
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("AccessContextManagerServicePerimeterDryRunIngressPolicy %q", d.Id()))
469490
}
491+
if err := d.Set("etag", res["etag"]); err != nil {
492+
log.Printf("[ERROR] Unable to set etag: %s", err)
493+
}
470494

471495
res, err = flattenNestedAccessContextManagerServicePerimeterDryRunIngressPolicy(d, meta, res)
472496
if err != nil {
@@ -489,6 +513,9 @@ func resourceAccessContextManagerServicePerimeterDryRunIngressPolicyRead(d *sche
489513
if err := d.Set("title", flattenNestedAccessContextManagerServicePerimeterDryRunIngressPolicyTitle(res["title"], d, config)); err != nil {
490514
return fmt.Errorf("Error reading ServicePerimeterDryRunIngressPolicy: %s", err)
491515
}
516+
if err := d.Set("etag", flattenNestedAccessContextManagerServicePerimeterDryRunIngressPolicyEtag(res["etag"], d, config)); err != nil {
517+
return fmt.Errorf("Error reading ServicePerimeterDryRunIngressPolicy: %s", err)
518+
}
492519

493520
return nil
494521
}
@@ -533,6 +560,22 @@ func resourceAccessContextManagerServicePerimeterDryRunIngressPolicyDelete(d *sc
533560
headers := make(http.Header)
534561
obj["use_explicit_dry_run_spec"] = true
535562

563+
etag := d.Get("etag").(string)
564+
565+
if etag == "" {
566+
log.Printf("[ERROR] Unable to get etag: %s", err)
567+
return nil
568+
}
569+
obj["etag"] = etag
570+
571+
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
572+
// won't set it
573+
updateMask := []string{"spec.ingressPolicies", "etag"}
574+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
575+
if err != nil {
576+
return err
577+
}
578+
536579
log.Printf("[DEBUG] Deleting ServicePerimeterDryRunIngressPolicy %q", d.Id())
537580
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
538581
Config: config,
@@ -731,6 +774,10 @@ func flattenNestedAccessContextManagerServicePerimeterDryRunIngressPolicyTitle(v
731774
return v
732775
}
733776

777+
func flattenNestedAccessContextManagerServicePerimeterDryRunIngressPolicyEtag(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
778+
return v
779+
}
780+
734781
func expandNestedAccessContextManagerServicePerimeterDryRunIngressPolicyIngressFrom(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
735782
l := v.([]interface{})
736783
if len(l) == 0 || l[0] == nil {
@@ -1086,6 +1133,9 @@ func resourceAccessContextManagerServicePerimeterDryRunIngressPolicyListForPatch
10861133
if err != nil {
10871134
return nil, err
10881135
}
1136+
if err := d.Set("etag", res["etag"]); err != nil {
1137+
log.Printf("[ERROR] Unable to set etag: %s", err)
1138+
}
10891139
var v interface{}
10901140
var ok bool
10911141
if v, ok = res["spec"]; ok && v != nil {

google-beta/services/accesscontextmanager/resource_access_context_manager_service_perimeter_dry_run_ingress_policy_generated_meta.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ api_version: 'v1'
66
api_resource_type_kind: 'ServicePerimeter'
77
fields:
88
- field: 'access_policy_id'
9+
- field: 'etag'
910
- field: 'ingress_from.identities'
1011
- field: 'ingress_from.identity_type'
1112
- field: 'ingress_from.sources.access_level'

google-beta/services/accesscontextmanager/resource_access_context_manager_service_perimeter_egress_policy.go

+48
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,11 @@ the perimeter.`,
309309
Computed: true,
310310
Description: `The name of the Access Policy this resource belongs to.`,
311311
},
312+
"etag": {
313+
Type: schema.TypeString,
314+
Computed: true,
315+
Description: `The perimeter etag is internally used to prevent overwriting the list of policies on PATCH calls. It is retrieved from the same GET perimeter API call that's used to get the current list of policies. The policy defined in this resource is added or removed from that list, and then this etag is sent with the PATCH call along with the updated policies.`,
316+
},
312317
},
313318
UseJSONNumber: true,
314319
}
@@ -376,6 +381,21 @@ func resourceAccessContextManagerServicePerimeterEgressPolicyCreate(d *schema.Re
376381
}
377382

378383
headers := make(http.Header)
384+
etag := d.Get("etag").(string)
385+
386+
if etag == "" {
387+
log.Printf("[ERROR] Unable to get etag: %s", err)
388+
return nil
389+
}
390+
obj["etag"] = etag
391+
392+
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
393+
// won't set it
394+
updateMask := []string{"status.egressPolicies", "etag"}
395+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
396+
if err != nil {
397+
return err
398+
}
379399
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
380400
Config: config,
381401
Method: "PATCH",
@@ -473,6 +493,9 @@ func resourceAccessContextManagerServicePerimeterEgressPolicyRead(d *schema.Reso
473493
if err != nil {
474494
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("AccessContextManagerServicePerimeterEgressPolicy %q", d.Id()))
475495
}
496+
if err := d.Set("etag", res["etag"]); err != nil {
497+
log.Printf("[ERROR] Unable to set etag: %s", err)
498+
}
476499

477500
res, err = flattenNestedAccessContextManagerServicePerimeterEgressPolicy(d, meta, res)
478501
if err != nil {
@@ -495,6 +518,9 @@ func resourceAccessContextManagerServicePerimeterEgressPolicyRead(d *schema.Reso
495518
if err := d.Set("title", flattenNestedAccessContextManagerServicePerimeterEgressPolicyTitle(res["title"], d, config)); err != nil {
496519
return fmt.Errorf("Error reading ServicePerimeterEgressPolicy: %s", err)
497520
}
521+
if err := d.Set("etag", flattenNestedAccessContextManagerServicePerimeterEgressPolicyEtag(res["etag"], d, config)); err != nil {
522+
return fmt.Errorf("Error reading ServicePerimeterEgressPolicy: %s", err)
523+
}
498524

499525
return nil
500526
}
@@ -537,6 +563,21 @@ func resourceAccessContextManagerServicePerimeterEgressPolicyDelete(d *schema.Re
537563
}
538564

539565
headers := make(http.Header)
566+
etag := d.Get("etag").(string)
567+
568+
if etag == "" {
569+
log.Printf("[ERROR] Unable to get etag: %s", err)
570+
return nil
571+
}
572+
obj["etag"] = etag
573+
574+
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
575+
// won't set it
576+
updateMask := []string{"status.egressPolicies", "etag"}
577+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
578+
if err != nil {
579+
return err
580+
}
540581

541582
log.Printf("[DEBUG] Deleting ServicePerimeterEgressPolicy %q", d.Id())
542583
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
@@ -748,6 +789,10 @@ func flattenNestedAccessContextManagerServicePerimeterEgressPolicyTitle(v interf
748789
return v
749790
}
750791

792+
func flattenNestedAccessContextManagerServicePerimeterEgressPolicyEtag(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
793+
return v
794+
}
795+
751796
func expandNestedAccessContextManagerServicePerimeterEgressPolicyEgressFrom(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
752797
l := v.([]interface{})
753798
if len(l) == 0 || l[0] == nil {
@@ -1125,6 +1170,9 @@ func resourceAccessContextManagerServicePerimeterEgressPolicyListForPatch(d *sch
11251170
if err != nil {
11261171
return nil, err
11271172
}
1173+
if err := d.Set("etag", res["etag"]); err != nil {
1174+
log.Printf("[ERROR] Unable to set etag: %s", err)
1175+
}
11281176
var v interface{}
11291177
var ok bool
11301178
if v, ok = res["status"]; ok && v != nil {

google-beta/services/accesscontextmanager/resource_access_context_manager_service_perimeter_egress_policy_generated_meta.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ fields:
1616
- field: 'egress_to.operations.method_selectors.permission'
1717
- field: 'egress_to.operations.service_name'
1818
- field: 'egress_to.resources'
19+
- field: 'etag'
1920
- field: 'perimeter'
2021
provider_only: true
2122
- field: 'title'

0 commit comments

Comments
 (0)