Skip to content

Commit 1d5beef

Browse files
Add etag to service perimeter dry run resource (#12795) (#21005)
[upstream:c11b74b73d9f84f1a35e9ba758132d098633f722] Signed-off-by: Modular Magician <[email protected]>
1 parent b45d198 commit 1d5beef

4 files changed

+57
-0
lines changed

.changelog/12795.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
accesscontextmanager: added `etag` to `google_access_context_manager_service_perimeter_dry_run_resource` to prevent overriding list of resources
3+
```

google/services/accesscontextmanager/resource_access_context_manager_service_perimeter_dry_run_resource.go

+50
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ Format: projects/{project_number}`,
6767
Computed: true,
6868
Description: `The name of the Access Policy this resource belongs to.`,
6969
},
70+
"etag": {
71+
Type: schema.TypeString,
72+
Computed: true,
73+
Description: `The perimeter etag is internally used to prevent overwriting the list of perimeter resources on PATCH calls. It is retrieved from the same GET perimeter API call that's used to get the current list of resources. The resource to add or remove is merged into that list and then this etag is sent with the PATCH call along with the updated resource list.`,
74+
},
7075
},
7176
UseJSONNumber: true,
7277
}
@@ -123,6 +128,22 @@ func resourceAccessContextManagerServicePerimeterDryRunResourceCreate(d *schema.
123128

124129
headers := make(http.Header)
125130
obj["use_explicit_dry_run_spec"] = true
131+
132+
etag := d.Get("etag").(string)
133+
134+
if etag == "" {
135+
log.Printf("[ERROR] Unable to get etag: %s", err)
136+
return nil
137+
}
138+
obj["etag"] = etag
139+
140+
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
141+
// won't set it
142+
updateMask := []string{"spec.resources", "etag"}
143+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
144+
if err != nil {
145+
return err
146+
}
126147
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
127148
Config: config,
128149
Method: "PATCH",
@@ -214,6 +235,9 @@ func resourceAccessContextManagerServicePerimeterDryRunResourceRead(d *schema.Re
214235
if err != nil {
215236
return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("AccessContextManagerServicePerimeterDryRunResource %q", d.Id()))
216237
}
238+
if err := d.Set("etag", res["etag"]); err != nil {
239+
log.Printf("[ERROR] Unable to set etag: %s", err)
240+
}
217241

218242
res, err = flattenNestedAccessContextManagerServicePerimeterDryRunResource(d, meta, res)
219243
if err != nil {
@@ -230,6 +254,9 @@ func resourceAccessContextManagerServicePerimeterDryRunResourceRead(d *schema.Re
230254
if err := d.Set("resource", flattenNestedAccessContextManagerServicePerimeterDryRunResourceResource(res["resource"], d, config)); err != nil {
231255
return fmt.Errorf("Error reading ServicePerimeterDryRunResource: %s", err)
232256
}
257+
if err := d.Set("etag", flattenNestedAccessContextManagerServicePerimeterDryRunResourceEtag(res["etag"], d, config)); err != nil {
258+
return fmt.Errorf("Error reading ServicePerimeterDryRunResource: %s", err)
259+
}
233260

234261
return nil
235262
}
@@ -274,6 +301,22 @@ func resourceAccessContextManagerServicePerimeterDryRunResourceDelete(d *schema.
274301
headers := make(http.Header)
275302
obj["use_explicit_dry_run_spec"] = true
276303

304+
etag := d.Get("etag").(string)
305+
306+
if etag == "" {
307+
log.Printf("[ERROR] Unable to get etag: %s", err)
308+
return nil
309+
}
310+
obj["etag"] = etag
311+
312+
// updateMask is a URL parameter but not present in the schema, so ReplaceVars
313+
// won't set it
314+
updateMask := []string{"spec.resources", "etag"}
315+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"updateMask": strings.Join(updateMask, ",")})
316+
if err != nil {
317+
return err
318+
}
319+
277320
log.Printf("[DEBUG] Deleting ServicePerimeterDryRunResource %q", d.Id())
278321
res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
279322
Config: config,
@@ -326,6 +369,10 @@ func flattenNestedAccessContextManagerServicePerimeterDryRunResourceResource(v i
326369
return v
327370
}
328371

372+
func flattenNestedAccessContextManagerServicePerimeterDryRunResourceEtag(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
373+
return v
374+
}
375+
329376
func expandNestedAccessContextManagerServicePerimeterDryRunResourceResource(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
330377
return v, nil
331378
}
@@ -484,6 +531,9 @@ func resourceAccessContextManagerServicePerimeterDryRunResourceListForPatch(d *s
484531
if err != nil {
485532
return nil, err
486533
}
534+
if err := d.Set("etag", res["etag"]); err != nil {
535+
log.Printf("[ERROR] Unable to set etag: %s", err)
536+
}
487537
var v interface{}
488538
var ok bool
489539
if v, ok = res["spec"]; ok && v != nil {

google/services/accesscontextmanager/resource_access_context_manager_service_perimeter_dry_run_resource_generated_meta.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ api_version: 'v1'
55
api_resource_type_kind: 'ServicePerimeter'
66
fields:
77
- field: 'access_policy_id'
8+
- field: 'etag'
89
- field: 'perimeter_name'
910
provider_only: true
1011
- field: 'resource'

website/docs/r/access_context_manager_service_perimeter_dry_run_resource.html.markdown

+3
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ In addition to the arguments listed above, the following computed attributes are
9999
* `access_policy_id` -
100100
The name of the Access Policy this resource belongs to.
101101

102+
* `etag` -
103+
The perimeter etag is internally used to prevent overwriting the list of perimeter resources on PATCH calls. It is retrieved from the same GET perimeter API call that's used to get the current list of resources. The resource to add or remove is merged into that list and then this etag is sent with the PATCH call along with the updated resource list.
104+
102105

103106
## Timeouts
104107

0 commit comments

Comments
 (0)