Skip to content

Commit 53a3e23

Browse files
chrissngmodular-magician
authored andcommitted
Allow updating of resource policies in compute_disk
Signed-off-by: Modular Magician <[email protected]>
1 parent 8084671 commit 53a3e23

7 files changed

+1758
-2
lines changed

google/provider.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -421,9 +421,9 @@ func Provider() terraform.ResourceProvider {
421421
return provider
422422
}
423423

424-
// Generated resources: 80
424+
// Generated resources: 82
425425
// Generated IAM resources: 21
426-
// Total generated resources: 101
426+
// Total generated resources: 103
427427
func ResourceMap() map[string]*schema.Resource {
428428
resourceMap, _ := ResourceMapWithErrors()
429429
return resourceMap
@@ -455,6 +455,7 @@ func ResourceMapWithErrors() (map[string]*schema.Resource, error) {
455455
"google_compute_backend_service": resourceComputeBackendService(),
456456
"google_compute_region_backend_service": resourceComputeRegionBackendService(),
457457
"google_compute_backend_service_signed_url_key": resourceComputeBackendServiceSignedUrlKey(),
458+
"google_compute_disk_resource_policy_attachment": resourceComputeDiskResourcePolicyAttachment(),
458459
"google_compute_disk": resourceComputeDisk(),
459460
"google_compute_firewall": resourceComputeFirewall(),
460461
"google_compute_forwarding_rule": resourceComputeForwardingRule(),
@@ -472,6 +473,7 @@ func ResourceMapWithErrors() (map[string]*schema.Resource, error) {
472473
"google_compute_node_template": resourceComputeNodeTemplate(),
473474
"google_compute_region_autoscaler": resourceComputeRegionAutoscaler(),
474475
"google_compute_region_disk": resourceComputeRegionDisk(),
476+
"google_compute_resource_policy": resourceComputeResourcePolicy(),
475477
"google_compute_route": resourceComputeRoute(),
476478
"google_compute_router": resourceComputeRouter(),
477479
"google_compute_router_nat": resourceComputeRouterNat(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
1+
// ----------------------------------------------------------------------------
2+
//
3+
// *** AUTO GENERATED CODE *** AUTO GENERATED CODE ***
4+
//
5+
// ----------------------------------------------------------------------------
6+
//
7+
// This file is automatically generated by Magic Modules and manual
8+
// changes will be clobbered when the file is regenerated.
9+
//
10+
// Please read more about how to change this file in
11+
// .github/CONTRIBUTING.md.
12+
//
13+
// ----------------------------------------------------------------------------
14+
15+
package google
16+
17+
import (
18+
"fmt"
19+
"log"
20+
"reflect"
21+
"time"
22+
23+
"github.com/hashicorp/terraform/helper/schema"
24+
"google.golang.org/api/compute/v1"
25+
)
26+
27+
func resourceComputeDiskResourcePolicyAttachment() *schema.Resource {
28+
return &schema.Resource{
29+
Create: resourceComputeDiskResourcePolicyAttachmentCreate,
30+
Read: resourceComputeDiskResourcePolicyAttachmentRead,
31+
Delete: resourceComputeDiskResourcePolicyAttachmentDelete,
32+
33+
Importer: &schema.ResourceImporter{
34+
State: resourceComputeDiskResourcePolicyAttachmentImport,
35+
},
36+
37+
Timeouts: &schema.ResourceTimeout{
38+
Create: schema.DefaultTimeout(3 * time.Minute),
39+
Delete: schema.DefaultTimeout(*time.Minute),
40+
},
41+
42+
Schema: map[string]*schema.Schema{
43+
"disk": {
44+
Type: schema.TypeString,
45+
Required: true,
46+
ForceNew: true,
47+
DiffSuppressFunc: compareSelfLinkOrResourceName,
48+
},
49+
"name": {
50+
Type: schema.TypeString,
51+
Required: true,
52+
ForceNew: true,
53+
},
54+
"zone": {
55+
Type: schema.TypeString,
56+
Computed: true,
57+
Optional: true,
58+
ForceNew: true,
59+
DiffSuppressFunc: compareSelfLinkOrResourceName,
60+
},
61+
"project": {
62+
Type: schema.TypeString,
63+
Optional: true,
64+
Computed: true,
65+
ForceNew: true,
66+
},
67+
},
68+
}
69+
}
70+
71+
func resourceComputeDiskResourcePolicyAttachmentCreate(d *schema.ResourceData, meta interface{}) error {
72+
config := meta.(*Config)
73+
74+
obj := make(map[string]interface{})
75+
nameProp, err := expandComputeDiskResourcePolicyAttachmentName(d.Get("name"), d, config)
76+
if err != nil {
77+
return err
78+
} else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) {
79+
obj["name"] = nameProp
80+
}
81+
82+
obj, err = resourceComputeDiskResourcePolicyAttachmentEncoder(d, meta, obj)
83+
if err != nil {
84+
return err
85+
}
86+
87+
url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/zones/{{zone}}/disks/{{disk}}/addResourcePolicies")
88+
if err != nil {
89+
return err
90+
}
91+
92+
log.Printf("[DEBUG] Creating new DiskResourcePolicyAttachment: %#v", obj)
93+
project, err := getProject(d, config)
94+
if err != nil {
95+
return err
96+
}
97+
res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutCreate))
98+
if err != nil {
99+
return fmt.Errorf("Error creating DiskResourcePolicyAttachment: %s", err)
100+
}
101+
102+
// Store the ID now
103+
id, err := replaceVars(d, config, "{{project}}/{{zone}}/{{disk}}/{{name}}")
104+
if err != nil {
105+
return fmt.Errorf("Error constructing id: %s", err)
106+
}
107+
d.SetId(id)
108+
109+
op := &compute.Operation{}
110+
err = Convert(res, op)
111+
if err != nil {
112+
return err
113+
}
114+
115+
waitErr := computeOperationWaitTime(
116+
config.clientCompute, op, project, "Creating DiskResourcePolicyAttachment",
117+
int(d.Timeout(schema.TimeoutCreate).Minutes()))
118+
119+
if waitErr != nil {
120+
// The resource didn't actually create
121+
d.SetId("")
122+
return fmt.Errorf("Error waiting to create DiskResourcePolicyAttachment: %s", waitErr)
123+
}
124+
125+
log.Printf("[DEBUG] Finished creating DiskResourcePolicyAttachment %q: %#v", d.Id(), res)
126+
127+
return resourceComputeDiskResourcePolicyAttachmentRead(d, meta)
128+
}
129+
130+
func resourceComputeDiskResourcePolicyAttachmentRead(d *schema.ResourceData, meta interface{}) error {
131+
config := meta.(*Config)
132+
133+
url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/zones/{{zone}}/disks/{{disk}}")
134+
if err != nil {
135+
return err
136+
}
137+
138+
project, err := getProject(d, config)
139+
if err != nil {
140+
return err
141+
}
142+
res, err := sendRequest(config, "GET", project, url, nil)
143+
if err != nil {
144+
return handleNotFoundError(err, d, fmt.Sprintf("ComputeDiskResourcePolicyAttachment %q", d.Id()))
145+
}
146+
147+
res, err = flattenNestedComputeDiskResourcePolicyAttachment(d, meta, res)
148+
if err != nil {
149+
return err
150+
}
151+
152+
if res == nil {
153+
// Object isn't there any more - remove it from the state.
154+
log.Printf("[DEBUG] Removing ComputeDiskResourcePolicyAttachment because it couldn't be matched.")
155+
d.SetId("")
156+
return nil
157+
}
158+
159+
res, err = resourceComputeDiskResourcePolicyAttachmentDecoder(d, meta, res)
160+
if err != nil {
161+
return err
162+
}
163+
164+
if res == nil {
165+
// Decoding the object has resulted in it being gone. It may be marked deleted
166+
log.Printf("[DEBUG] Removing ComputeDiskResourcePolicyAttachment because it no longer exists.")
167+
d.SetId("")
168+
return nil
169+
}
170+
171+
if err := d.Set("project", project); err != nil {
172+
return fmt.Errorf("Error reading DiskResourcePolicyAttachment: %s", err)
173+
}
174+
175+
if err := d.Set("name", flattenComputeDiskResourcePolicyAttachmentName(res["name"], d)); err != nil {
176+
return fmt.Errorf("Error reading DiskResourcePolicyAttachment: %s", err)
177+
}
178+
179+
return nil
180+
}
181+
182+
func resourceComputeDiskResourcePolicyAttachmentDelete(d *schema.ResourceData, meta interface{}) error {
183+
config := meta.(*Config)
184+
185+
project, err := getProject(d, config)
186+
if err != nil {
187+
return err
188+
}
189+
190+
url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/zones/{{zone}}/disks/{{disk}}/removeResourcePolicies")
191+
if err != nil {
192+
return err
193+
}
194+
195+
var obj map[string]interface{}
196+
obj = make(map[string]interface{})
197+
198+
// projects/{project}/regions/{region}/resourcePolicies/{resourceId}
199+
region := getRegionFromZone(d.Get("zone").(string))
200+
201+
name, err := expandComputeDiskResourcePolicyAttachmentName(d.Get("name"), d, config)
202+
if err != nil {
203+
return err
204+
} else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(name)) && (ok || !reflect.DeepEqual(v, name)) {
205+
obj["resourcePolicies"] = []interface{}{fmt.Sprintf("projects/%s/regions/%s/resourcePolicies/%s", project, region, name)}
206+
}
207+
log.Printf("[DEBUG] Deleting DiskResourcePolicyAttachment %q", d.Id())
208+
209+
res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutDelete))
210+
if err != nil {
211+
return handleNotFoundError(err, d, "DiskResourcePolicyAttachment")
212+
}
213+
214+
op := &compute.Operation{}
215+
err = Convert(res, op)
216+
if err != nil {
217+
return err
218+
}
219+
220+
err = computeOperationWaitTime(
221+
config.clientCompute, op, project, "Deleting DiskResourcePolicyAttachment",
222+
int(d.Timeout(schema.TimeoutDelete).Minutes()))
223+
224+
if err != nil {
225+
return err
226+
}
227+
228+
log.Printf("[DEBUG] Finished deleting DiskResourcePolicyAttachment %q: %#v", d.Id(), res)
229+
return nil
230+
}
231+
232+
func resourceComputeDiskResourcePolicyAttachmentImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
233+
config := meta.(*Config)
234+
if err := parseImportId([]string{
235+
"projects/(?P<project>[^/]+)/zones/(?P<zone>[^/]+)/disks/(?P<disk>[^/]+)/(?P<name>[^/]+)",
236+
"(?P<project>[^/]+)/(?P<zone>[^/]+)/(?P<disk>[^/]+)/(?P<name>[^/]+)",
237+
"(?P<zone>[^/]+)/(?P<disk>[^/]+)/(?P<name>[^/]+)",
238+
"(?P<disk>[^/]+)/(?P<name>[^/]+)",
239+
}, d, config); err != nil {
240+
return nil, err
241+
}
242+
243+
// Replace import id for the resource id
244+
id, err := replaceVars(d, config, "{{project}}/{{zone}}/{{disk}}/{{name}}")
245+
if err != nil {
246+
return nil, fmt.Errorf("Error constructing id: %s", err)
247+
}
248+
d.SetId(id)
249+
250+
return []*schema.ResourceData{d}, nil
251+
}
252+
253+
func flattenComputeDiskResourcePolicyAttachmentName(v interface{}, d *schema.ResourceData) interface{} {
254+
return v
255+
}
256+
257+
func expandComputeDiskResourcePolicyAttachmentName(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
258+
return v, nil
259+
}
260+
261+
func resourceComputeDiskResourcePolicyAttachmentEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) {
262+
config := meta.(*Config)
263+
project, err := getProject(d, config)
264+
if err != nil {
265+
return nil, err
266+
}
267+
268+
region := getRegionFromZone(d.Get("zone").(string))
269+
270+
obj["resourcePolicies"] = []interface{}{fmt.Sprintf("projects/%s/regions/%s/resourcePolicies/%s", project, region, obj["name"])}
271+
delete(obj, "name")
272+
return obj, nil
273+
}
274+
275+
func flattenNestedComputeDiskResourcePolicyAttachment(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) {
276+
var v interface{}
277+
var ok bool
278+
279+
v, ok = res["resourcePolicies"]
280+
if !ok || v == nil {
281+
return nil, nil
282+
}
283+
284+
switch v.(type) {
285+
case []interface{}:
286+
break
287+
case map[string]interface{}:
288+
// Construct list out of single nested resource
289+
v = []interface{}{v}
290+
default:
291+
return nil, fmt.Errorf("expected list or map for value resourcePolicies. Actual value: %v", v)
292+
}
293+
294+
_, item, err := resourceComputeDiskResourcePolicyAttachmentFindNestedObjectInList(d, meta, v.([]interface{}))
295+
if err != nil {
296+
return nil, err
297+
}
298+
return item, nil
299+
}
300+
301+
func resourceComputeDiskResourcePolicyAttachmentFindNestedObjectInList(d *schema.ResourceData, meta interface{}, items []interface{}) (index int, item map[string]interface{}, err error) {
302+
expectedName, err := expandComputeDiskResourcePolicyAttachmentName(d.Get("name"), d, meta.(*Config))
303+
if err != nil {
304+
return -1, nil, err
305+
}
306+
307+
// Search list for this resource.
308+
for idx, itemRaw := range items {
309+
if itemRaw == nil {
310+
continue
311+
}
312+
// List response only contains the ID - construct a response object.
313+
item := map[string]interface{}{
314+
"name": itemRaw,
315+
}
316+
317+
// Decode list item before comparing.
318+
item, err := resourceComputeDiskResourcePolicyAttachmentDecoder(d, meta, item)
319+
if err != nil {
320+
return -1, nil, err
321+
}
322+
323+
itemName := flattenComputeDiskResourcePolicyAttachmentName(item["name"], d)
324+
if !reflect.DeepEqual(itemName, expectedName) {
325+
log.Printf("[DEBUG] Skipping item with name= %#v, looking for %#v)", itemName, expectedName)
326+
continue
327+
}
328+
log.Printf("[DEBUG] Found item for resource %q: %#v)", d.Id(), item)
329+
return idx, item, nil
330+
}
331+
return -1, nil, nil
332+
}
333+
func resourceComputeDiskResourcePolicyAttachmentDecoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) {
334+
res["name"] = GetResourceNameFromSelfLink(res["name"].(string))
335+
return res, nil
336+
}

0 commit comments

Comments
 (0)