Skip to content

Commit 901f2d5

Browse files
Add IAM resources to google_compute_instance_template (#11932) (#20954)
[upstream:ad60c789a06387639f7837e98a552d3d9e1bc396] Signed-off-by: Modular Magician <[email protected]>
1 parent eeff161 commit 901f2d5

File tree

6 files changed

+1182
-2
lines changed

6 files changed

+1182
-2
lines changed

.changelog/11932.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
```release-note:new-resource
2+
`google_compute_instance_template_iam_member`
3+
```
4+
```release-note:new-resource
5+
`google_compute_instance_template_iam_policy`
6+
```
7+
```release-note:new-resource
8+
`google_compute_instance_template_iam_binding`
9+
```
10+
```release-note:new-datasource
11+
`google_compute_instance_template_iam_policy`
12+
```

google/provider/provider_mmv1_resources.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ var generatedIAMDatasources = map[string]*schema.Resource{
379379
"google_compute_disk_iam_policy": tpgiamresource.DataSourceIamPolicy(compute.ComputeDiskIamSchema, compute.ComputeDiskIamUpdaterProducer),
380380
"google_compute_image_iam_policy": tpgiamresource.DataSourceIamPolicy(compute.ComputeImageIamSchema, compute.ComputeImageIamUpdaterProducer),
381381
"google_compute_instance_iam_policy": tpgiamresource.DataSourceIamPolicy(compute.ComputeInstanceIamSchema, compute.ComputeInstanceIamUpdaterProducer),
382+
"google_compute_instance_template_iam_policy": tpgiamresource.DataSourceIamPolicy(compute.ComputeInstanceTemplateIamSchema, compute.ComputeInstanceTemplateIamUpdaterProducer),
382383
"google_compute_region_disk_iam_policy": tpgiamresource.DataSourceIamPolicy(compute.ComputeRegionDiskIamSchema, compute.ComputeRegionDiskIamUpdaterProducer),
383384
"google_compute_snapshot_iam_policy": tpgiamresource.DataSourceIamPolicy(compute.ComputeSnapshotIamSchema, compute.ComputeSnapshotIamUpdaterProducer),
384385
"google_compute_subnetwork_iam_policy": tpgiamresource.DataSourceIamPolicy(compute.ComputeSubnetworkIamSchema, compute.ComputeSubnetworkIamUpdaterProducer),
@@ -469,8 +470,8 @@ var handwrittenIAMDatasources = map[string]*schema.Resource{
469470

470471
// Resources
471472
// Generated resources: 511
472-
// Generated IAM resources: 264
473-
// Total generated resources: 775
473+
// Generated IAM resources: 267
474+
// Total generated resources: 778
474475
var generatedResources = map[string]*schema.Resource{
475476
"google_folder_access_approval_settings": accessapproval.ResourceAccessApprovalFolderSettings(),
476477
"google_organization_access_approval_settings": accessapproval.ResourceAccessApprovalOrganizationSettings(),
@@ -676,6 +677,9 @@ var generatedResources = map[string]*schema.Resource{
676677
"google_compute_instance_group_membership": compute.ResourceComputeInstanceGroupMembership(),
677678
"google_compute_instance_group_named_port": compute.ResourceComputeInstanceGroupNamedPort(),
678679
"google_compute_instance_settings": compute.ResourceComputeInstanceSettings(),
680+
"google_compute_instance_template_iam_binding": tpgiamresource.ResourceIamBinding(compute.ComputeInstanceTemplateIamSchema, compute.ComputeInstanceTemplateIamUpdaterProducer, compute.ComputeInstanceTemplateIdParseFunc),
681+
"google_compute_instance_template_iam_member": tpgiamresource.ResourceIamMember(compute.ComputeInstanceTemplateIamSchema, compute.ComputeInstanceTemplateIamUpdaterProducer, compute.ComputeInstanceTemplateIdParseFunc),
682+
"google_compute_instance_template_iam_policy": tpgiamresource.ResourceIamPolicy(compute.ComputeInstanceTemplateIamSchema, compute.ComputeInstanceTemplateIamUpdaterProducer, compute.ComputeInstanceTemplateIdParseFunc),
679683
"google_compute_interconnect": compute.ResourceComputeInterconnect(),
680684
"google_compute_interconnect_attachment": compute.ResourceComputeInterconnectAttachment(),
681685
"google_compute_managed_ssl_certificate": compute.ResourceComputeManagedSslCertificate(),
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
// ----------------------------------------------------------------------------
5+
//
6+
// *** AUTO GENERATED CODE *** Type: MMv1 ***
7+
//
8+
// ----------------------------------------------------------------------------
9+
//
10+
// This file is automatically generated by Magic Modules and manual
11+
// changes will be clobbered when the file is regenerated.
12+
//
13+
// Please read more about how to change this file in
14+
// .github/CONTRIBUTING.md.
15+
//
16+
// ----------------------------------------------------------------------------
17+
18+
package compute
19+
20+
import (
21+
"fmt"
22+
23+
"github.com/hashicorp/errwrap"
24+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
25+
"google.golang.org/api/cloudresourcemanager/v1"
26+
27+
"github.com/hashicorp/terraform-provider-google/google/tpgiamresource"
28+
"github.com/hashicorp/terraform-provider-google/google/tpgresource"
29+
transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport"
30+
)
31+
32+
var ComputeInstanceTemplateIamSchema = map[string]*schema.Schema{
33+
"project": {
34+
Type: schema.TypeString,
35+
Computed: true,
36+
Optional: true,
37+
ForceNew: true,
38+
},
39+
"name": {
40+
Type: schema.TypeString,
41+
Required: true,
42+
ForceNew: true,
43+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
44+
},
45+
}
46+
47+
type ComputeInstanceTemplateIamUpdater struct {
48+
project string
49+
name string
50+
d tpgresource.TerraformResourceData
51+
Config *transport_tpg.Config
52+
}
53+
54+
func ComputeInstanceTemplateIamUpdaterProducer(d tpgresource.TerraformResourceData, config *transport_tpg.Config) (tpgiamresource.ResourceIamUpdater, error) {
55+
values := make(map[string]string)
56+
57+
project, _ := tpgresource.GetProject(d, config)
58+
if project != "" {
59+
if err := d.Set("project", project); err != nil {
60+
return nil, fmt.Errorf("Error setting project: %s", err)
61+
}
62+
}
63+
values["project"] = project
64+
if v, ok := d.GetOk("name"); ok {
65+
values["name"] = v.(string)
66+
}
67+
68+
// We may have gotten either a long or short name, so attempt to parse long name if possible
69+
m, err := tpgresource.GetImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/global/instanceTemplates/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config, d.Get("name").(string))
70+
if err != nil {
71+
return nil, err
72+
}
73+
74+
for k, v := range m {
75+
values[k] = v
76+
}
77+
78+
u := &ComputeInstanceTemplateIamUpdater{
79+
project: values["project"],
80+
name: values["name"],
81+
d: d,
82+
Config: config,
83+
}
84+
85+
if err := d.Set("project", u.project); err != nil {
86+
return nil, fmt.Errorf("Error setting project: %s", err)
87+
}
88+
if err := d.Set("name", u.GetResourceId()); err != nil {
89+
return nil, fmt.Errorf("Error setting name: %s", err)
90+
}
91+
92+
return u, nil
93+
}
94+
95+
func ComputeInstanceTemplateIdParseFunc(d *schema.ResourceData, config *transport_tpg.Config) error {
96+
values := make(map[string]string)
97+
98+
project, _ := tpgresource.GetProject(d, config)
99+
if project != "" {
100+
values["project"] = project
101+
}
102+
103+
m, err := tpgresource.GetImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/global/instanceTemplates/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config, d.Id())
104+
if err != nil {
105+
return err
106+
}
107+
108+
for k, v := range m {
109+
values[k] = v
110+
}
111+
112+
u := &ComputeInstanceTemplateIamUpdater{
113+
project: values["project"],
114+
name: values["name"],
115+
d: d,
116+
Config: config,
117+
}
118+
if err := d.Set("name", u.GetResourceId()); err != nil {
119+
return fmt.Errorf("Error setting name: %s", err)
120+
}
121+
d.SetId(u.GetResourceId())
122+
return nil
123+
}
124+
125+
func (u *ComputeInstanceTemplateIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
126+
url, err := u.qualifyInstanceTemplateUrl("getIamPolicy")
127+
if err != nil {
128+
return nil, err
129+
}
130+
131+
project, err := tpgresource.GetProject(u.d, u.Config)
132+
if err != nil {
133+
return nil, err
134+
}
135+
var obj map[string]interface{}
136+
url, err = transport_tpg.AddQueryParams(url, map[string]string{"optionsRequestedPolicyVersion": fmt.Sprintf("%d", tpgiamresource.IamPolicyVersion)})
137+
if err != nil {
138+
return nil, err
139+
}
140+
141+
userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
142+
if err != nil {
143+
return nil, err
144+
}
145+
146+
policy, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
147+
Config: u.Config,
148+
Method: "GET",
149+
Project: project,
150+
RawURL: url,
151+
UserAgent: userAgent,
152+
Body: obj,
153+
})
154+
if err != nil {
155+
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
156+
}
157+
158+
out := &cloudresourcemanager.Policy{}
159+
err = tpgresource.Convert(policy, out)
160+
if err != nil {
161+
return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
162+
}
163+
164+
return out, nil
165+
}
166+
167+
func (u *ComputeInstanceTemplateIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
168+
json, err := tpgresource.ConvertToMap(policy)
169+
if err != nil {
170+
return err
171+
}
172+
173+
obj := make(map[string]interface{})
174+
obj["policy"] = json
175+
176+
url, err := u.qualifyInstanceTemplateUrl("setIamPolicy")
177+
if err != nil {
178+
return err
179+
}
180+
project, err := tpgresource.GetProject(u.d, u.Config)
181+
if err != nil {
182+
return err
183+
}
184+
185+
userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
186+
if err != nil {
187+
return err
188+
}
189+
190+
_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
191+
Config: u.Config,
192+
Method: "POST",
193+
Project: project,
194+
RawURL: url,
195+
UserAgent: userAgent,
196+
Body: obj,
197+
Timeout: u.d.Timeout(schema.TimeoutCreate),
198+
})
199+
if err != nil {
200+
return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
201+
}
202+
203+
return nil
204+
}
205+
206+
func (u *ComputeInstanceTemplateIamUpdater) qualifyInstanceTemplateUrl(methodIdentifier string) (string, error) {
207+
urlTemplate := fmt.Sprintf("{{ComputeBasePath}}%s/%s", fmt.Sprintf("projects/%s/global/instanceTemplates/%s", u.project, u.name), methodIdentifier)
208+
url, err := tpgresource.ReplaceVars(u.d, u.Config, urlTemplate)
209+
if err != nil {
210+
return "", err
211+
}
212+
return url, nil
213+
}
214+
215+
func (u *ComputeInstanceTemplateIamUpdater) GetResourceId() string {
216+
return fmt.Sprintf("projects/%s/global/instanceTemplates/%s", u.project, u.name)
217+
}
218+
219+
func (u *ComputeInstanceTemplateIamUpdater) GetMutexKey() string {
220+
return fmt.Sprintf("iam-compute-instancetemplate-%s", u.GetResourceId())
221+
}
222+
223+
func (u *ComputeInstanceTemplateIamUpdater) DescribeResource() string {
224+
return fmt.Sprintf("compute instancetemplate %q", u.GetResourceId())
225+
}

0 commit comments

Comments
 (0)