Skip to content

Commit 6551b68

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

7 files changed

+1776
-2
lines changed

google/provider.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -414,9 +414,9 @@ func Provider() terraform.ResourceProvider {
414414
return provider
415415
}
416416

417-
// Generated resources: 78
417+
// Generated resources: 80
418418
// Generated IAM resources: 18
419-
// Total generated resources: 96
419+
// Total generated resources: 98
420420
func ResourceMap() map[string]*schema.Resource {
421421
resourceMap, _ := ResourceMapWithErrors()
422422
return resourceMap
@@ -445,6 +445,7 @@ func ResourceMapWithErrors() (map[string]*schema.Resource, error) {
445445
"google_compute_backend_service": resourceComputeBackendService(),
446446
"google_compute_region_backend_service": resourceComputeRegionBackendService(),
447447
"google_compute_backend_service_signed_url_key": resourceComputeBackendServiceSignedUrlKey(),
448+
"google_compute_disk_resource_policy_attachment": resourceComputeDiskResourcePolicyAttachment(),
448449
"google_compute_disk": resourceComputeDisk(),
449450
"google_compute_firewall": resourceComputeFirewall(),
450451
"google_compute_forwarding_rule": resourceComputeForwardingRule(),
@@ -462,6 +463,7 @@ func ResourceMapWithErrors() (map[string]*schema.Resource, error) {
462463
"google_compute_node_template": resourceComputeNodeTemplate(),
463464
"google_compute_region_autoscaler": resourceComputeRegionAutoscaler(),
464465
"google_compute_region_disk": resourceComputeRegionDisk(),
466+
"google_compute_resource_policy": resourceComputeResourcePolicy(),
465467
"google_compute_route": resourceComputeRoute(),
466468
"google_compute_router": resourceComputeRouter(),
467469
"google_compute_snapshot": resourceComputeSnapshot(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,330 @@
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(4 * time.Minute),
39+
Delete: schema.DefaultTimeout(4 * 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+
Required: true,
57+
ForceNew: true,
58+
DiffSuppressFunc: compareSelfLinkOrResourceName,
59+
},
60+
"project": {
61+
Type: schema.TypeString,
62+
Optional: true,
63+
Computed: true,
64+
ForceNew: true,
65+
},
66+
},
67+
}
68+
}
69+
70+
func resourceComputeDiskResourcePolicyAttachmentCreate(d *schema.ResourceData, meta interface{}) error {
71+
config := meta.(*Config)
72+
73+
obj := make(map[string]interface{})
74+
nameProp, err := expandComputeDiskResourcePolicyAttachmentName(d.Get("name"), d, config)
75+
if err != nil {
76+
return err
77+
} else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(nameProp)) && (ok || !reflect.DeepEqual(v, nameProp)) {
78+
obj["name"] = nameProp
79+
}
80+
81+
obj, err = resourceComputeDiskResourcePolicyAttachmentEncoder(d, meta, obj)
82+
if err != nil {
83+
return err
84+
}
85+
86+
url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/zones/{{zone}}/disks/{{disk}}/addResourcePolicies")
87+
if err != nil {
88+
return err
89+
}
90+
91+
log.Printf("[DEBUG] Creating new DiskResourcePolicyAttachment: %#v", obj)
92+
project, err := getProject(d, config)
93+
if err != nil {
94+
return err
95+
}
96+
res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutCreate))
97+
if err != nil {
98+
return fmt.Errorf("Error creating DiskResourcePolicyAttachment: %s", err)
99+
}
100+
101+
// Store the ID now
102+
id, err := replaceVars(d, config, "{{project}}/{{zone}}/{{disk}}/{{name}}")
103+
if err != nil {
104+
return fmt.Errorf("Error constructing id: %s", err)
105+
}
106+
d.SetId(id)
107+
108+
op := &compute.Operation{}
109+
err = Convert(res, op)
110+
if err != nil {
111+
return err
112+
}
113+
114+
waitErr := computeOperationWaitTime(
115+
config.clientCompute, op, project, "Creating DiskResourcePolicyAttachment",
116+
int(d.Timeout(schema.TimeoutCreate).Minutes()))
117+
118+
if waitErr != nil {
119+
// The resource didn't actually create
120+
d.SetId("")
121+
return fmt.Errorf("Error waiting to create DiskResourcePolicyAttachment: %s", waitErr)
122+
}
123+
124+
log.Printf("[DEBUG] Finished creating DiskResourcePolicyAttachment %q: %#v", d.Id(), res)
125+
126+
return resourceComputeDiskResourcePolicyAttachmentRead(d, meta)
127+
}
128+
129+
func resourceComputeDiskResourcePolicyAttachmentRead(d *schema.ResourceData, meta interface{}) error {
130+
config := meta.(*Config)
131+
132+
url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/zones/{{zone}}/disks/{{disk}}")
133+
if err != nil {
134+
return err
135+
}
136+
137+
project, err := getProject(d, config)
138+
if err != nil {
139+
return err
140+
}
141+
res, err := sendRequest(config, "GET", project, url, nil)
142+
if err != nil {
143+
return handleNotFoundError(err, d, fmt.Sprintf("ComputeDiskResourcePolicyAttachment %q", d.Id()))
144+
}
145+
146+
res, err = flattenNestedComputeDiskResourcePolicyAttachment(d, meta, res)
147+
if err != nil {
148+
return err
149+
}
150+
151+
if res == nil {
152+
// Object isn't there any more - remove it from the state.
153+
log.Printf("[DEBUG] Removing ComputeDiskResourcePolicyAttachment because it couldn't be matched.")
154+
d.SetId("")
155+
return nil
156+
}
157+
158+
res, err = resourceComputeDiskResourcePolicyAttachmentDecoder(d, meta, res)
159+
if err != nil {
160+
return err
161+
}
162+
163+
if res == nil {
164+
// Decoding the object has resulted in it being gone. It may be marked deleted
165+
log.Printf("[DEBUG] Removing ComputeDiskResourcePolicyAttachment because it no longer exists.")
166+
d.SetId("")
167+
return nil
168+
}
169+
170+
if err := d.Set("project", project); err != nil {
171+
return fmt.Errorf("Error reading DiskResourcePolicyAttachment: %s", err)
172+
}
173+
174+
if err := d.Set("name", flattenComputeDiskResourcePolicyAttachmentName(res["name"], d)); err != nil {
175+
return fmt.Errorf("Error reading DiskResourcePolicyAttachment: %s", err)
176+
}
177+
178+
return nil
179+
}
180+
181+
func resourceComputeDiskResourcePolicyAttachmentDelete(d *schema.ResourceData, meta interface{}) error {
182+
config := meta.(*Config)
183+
184+
project, err := getProject(d, config)
185+
if err != nil {
186+
return err
187+
}
188+
189+
url, err := replaceVars(d, config, "{{ComputeBasePath}}projects/{{project}}/zones/{{zone}}/disks/{{disk}}/removeResourcePolicies")
190+
if err != nil {
191+
return err
192+
}
193+
194+
var obj map[string]interface{}
195+
obj = make(map[string]interface{})
196+
197+
// projects/{project}/regions/{region}/resourcePolicies/{resourceId}
198+
region := getRegionFromZone(d.Get("zone").(string))
199+
200+
name, err := expandComputeDiskResourcePolicyAttachmentName(d.Get("name"), d, config)
201+
if err != nil {
202+
return err
203+
} else if v, ok := d.GetOkExists("name"); !isEmptyValue(reflect.ValueOf(name)) && (ok || !reflect.DeepEqual(v, name)) {
204+
obj["resourcePolicies"] = []interface{}{fmt.Sprintf("projects/%s/regions/%s/resourcePolicies/%s", project, region, name)}
205+
}
206+
log.Printf("[DEBUG] Deleting DiskResourcePolicyAttachment %q", d.Id())
207+
208+
res, err := sendRequestWithTimeout(config, "POST", project, url, obj, d.Timeout(schema.TimeoutDelete))
209+
if err != nil {
210+
return handleNotFoundError(err, d, "DiskResourcePolicyAttachment")
211+
}
212+
213+
op := &compute.Operation{}
214+
err = Convert(res, op)
215+
if err != nil {
216+
return err
217+
}
218+
219+
err = computeOperationWaitTime(
220+
config.clientCompute, op, project, "Deleting DiskResourcePolicyAttachment",
221+
int(d.Timeout(schema.TimeoutDelete).Minutes()))
222+
223+
if err != nil {
224+
return err
225+
}
226+
227+
log.Printf("[DEBUG] Finished deleting DiskResourcePolicyAttachment %q: %#v", d.Id(), res)
228+
return nil
229+
}
230+
231+
func resourceComputeDiskResourcePolicyAttachmentImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
232+
config := meta.(*Config)
233+
if err := parseImportId([]string{
234+
"projects/(?P<project>[^/]+)/zones/(?P<zone>[^/]+)/disks/(?P<disk>[^/]+)/(?P<name>[^/]+)",
235+
"(?P<project>[^/]+)/(?P<zone>[^/]+)/(?P<disk>[^/]+)/(?P<name>[^/]+)",
236+
"(?P<zone>[^/]+)/(?P<disk>[^/]+)/(?P<name>[^/]+)",
237+
"(?P<disk>[^/]+)/(?P<name>[^/]+)",
238+
}, d, config); err != nil {
239+
return nil, err
240+
}
241+
242+
// Replace import id for the resource id
243+
id, err := replaceVars(d, config, "{{project}}/{{zone}}/{{disk}}/{{name}}")
244+
if err != nil {
245+
return nil, fmt.Errorf("Error constructing id: %s", err)
246+
}
247+
d.SetId(id)
248+
249+
return []*schema.ResourceData{d}, nil
250+
}
251+
252+
func flattenComputeDiskResourcePolicyAttachmentName(v interface{}, d *schema.ResourceData) interface{} {
253+
return v
254+
}
255+
256+
func expandComputeDiskResourcePolicyAttachmentName(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
257+
return v, nil
258+
}
259+
260+
func resourceComputeDiskResourcePolicyAttachmentEncoder(d *schema.ResourceData, meta interface{}, obj map[string]interface{}) (map[string]interface{}, error) {
261+
config := meta.(*Config)
262+
project, err := getProject(d, config)
263+
if err != nil {
264+
return nil, err
265+
}
266+
267+
region := getRegionFromZone(d.Get("zone").(string))
268+
269+
obj["resourcePolicies"] = []interface{}{fmt.Sprintf("projects/%s/regions/%s/resourcePolicies/%s", project, region, obj["name"])}
270+
delete(obj, "name")
271+
return obj, nil
272+
}
273+
274+
func flattenNestedComputeDiskResourcePolicyAttachment(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) {
275+
var v interface{}
276+
var ok bool
277+
278+
v, ok = res["resourcePolicies"]
279+
if !ok || v == nil {
280+
return nil, nil
281+
}
282+
283+
switch v.(type) {
284+
case []interface{}:
285+
break
286+
case map[string]interface{}:
287+
// Construct list out of single nested resource
288+
v = []interface{}{v}
289+
default:
290+
return nil, fmt.Errorf("expected list or map for value resourcePolicies. Actual value: %v", v)
291+
}
292+
293+
expectedName, err := expandComputeDiskResourcePolicyAttachmentName(d.Get("name"), d, meta.(*Config))
294+
if err != nil {
295+
return nil, err
296+
}
297+
298+
// Search list for this resource.
299+
items := v.([]interface{})
300+
for _, itemRaw := range items {
301+
if itemRaw == nil {
302+
continue
303+
}
304+
// List response only contains the ID - construct a response object.
305+
item := map[string]interface{}{
306+
"name": itemRaw,
307+
}
308+
309+
// Decode list item before comparing.
310+
item, err := resourceComputeDiskResourcePolicyAttachmentDecoder(d, meta, item)
311+
if err != nil {
312+
return nil, err
313+
}
314+
315+
itemName := flattenComputeDiskResourcePolicyAttachmentName(item["name"], d)
316+
if !reflect.DeepEqual(itemName, expectedName) {
317+
log.Printf("[DEBUG] Skipping item with name= %#v, looking for %#v)", itemName, expectedName)
318+
continue
319+
}
320+
log.Printf("[DEBUG] Found item for resource %q: %#v)", d.Id(), item)
321+
return item, nil
322+
}
323+
324+
return nil, nil
325+
}
326+
327+
func resourceComputeDiskResourcePolicyAttachmentDecoder(d *schema.ResourceData, meta interface{}, res map[string]interface{}) (map[string]interface{}, error) {
328+
res["name"] = GetResourceNameFromSelfLink(res["name"].(string))
329+
return res, nil
330+
}

0 commit comments

Comments
 (0)