Skip to content

Commit 9cc54cb

Browse files
Add Region Backend Service IAM support (#5754) (#4088)
* Add Region Backend Service IAM support Fixes gap in RegionBackendService IAMSupport * Update terraform.yaml Signed-off-by: Modular Magician <[email protected]>
1 parent 9df10ae commit 9cc54cb

File tree

6 files changed

+1104
-2
lines changed

6 files changed

+1104
-2
lines changed

.changelog/5754.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
```release-note:new-resource
2+
`google_region_backend_service_iam_*`
3+
4+
```
Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
// ----------------------------------------------------------------------------
2+
//
3+
// *** AUTO GENERATED CODE *** Type: MMv1 ***
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+
package google
15+
16+
import (
17+
"fmt"
18+
19+
"github.com/hashicorp/errwrap"
20+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
21+
"google.golang.org/api/cloudresourcemanager/v1"
22+
)
23+
24+
var ComputeRegionBackendServiceIamSchema = map[string]*schema.Schema{
25+
"project": {
26+
Type: schema.TypeString,
27+
Computed: true,
28+
Optional: true,
29+
ForceNew: true,
30+
},
31+
"region": {
32+
Type: schema.TypeString,
33+
Computed: true,
34+
Optional: true,
35+
ForceNew: true,
36+
},
37+
"name": {
38+
Type: schema.TypeString,
39+
Required: true,
40+
ForceNew: true,
41+
DiffSuppressFunc: compareSelfLinkOrResourceName,
42+
},
43+
}
44+
45+
type ComputeRegionBackendServiceIamUpdater struct {
46+
project string
47+
region string
48+
name string
49+
d TerraformResourceData
50+
Config *Config
51+
}
52+
53+
func ComputeRegionBackendServiceIamUpdaterProducer(d TerraformResourceData, config *Config) (ResourceIamUpdater, error) {
54+
values := make(map[string]string)
55+
56+
project, _ := getProject(d, config)
57+
if project != "" {
58+
if err := d.Set("project", project); err != nil {
59+
return nil, fmt.Errorf("Error setting project: %s", err)
60+
}
61+
}
62+
values["project"] = project
63+
region, _ := getRegion(d, config)
64+
if region != "" {
65+
if err := d.Set("region", region); err != nil {
66+
return nil, fmt.Errorf("Error setting region: %s", err)
67+
}
68+
}
69+
values["region"] = region
70+
if v, ok := d.GetOk("name"); ok {
71+
values["name"] = v.(string)
72+
}
73+
74+
// We may have gotten either a long or short name, so attempt to parse long name if possible
75+
m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/regions/(?P<region>[^/]+)/backendServices/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<region>[^/]+)/(?P<name>[^/]+)", "(?P<region>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config, d.Get("name").(string))
76+
if err != nil {
77+
return nil, err
78+
}
79+
80+
for k, v := range m {
81+
values[k] = v
82+
}
83+
84+
u := &ComputeRegionBackendServiceIamUpdater{
85+
project: values["project"],
86+
region: values["region"],
87+
name: values["name"],
88+
d: d,
89+
Config: config,
90+
}
91+
92+
if err := d.Set("project", u.project); err != nil {
93+
return nil, fmt.Errorf("Error setting project: %s", err)
94+
}
95+
if err := d.Set("region", u.region); err != nil {
96+
return nil, fmt.Errorf("Error setting region: %s", err)
97+
}
98+
if err := d.Set("name", u.GetResourceId()); err != nil {
99+
return nil, fmt.Errorf("Error setting name: %s", err)
100+
}
101+
102+
return u, nil
103+
}
104+
105+
func ComputeRegionBackendServiceIdParseFunc(d *schema.ResourceData, config *Config) error {
106+
values := make(map[string]string)
107+
108+
project, _ := getProject(d, config)
109+
if project != "" {
110+
values["project"] = project
111+
}
112+
113+
region, _ := getRegion(d, config)
114+
if region != "" {
115+
values["region"] = region
116+
}
117+
118+
m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/regions/(?P<region>[^/]+)/backendServices/(?P<name>[^/]+)", "(?P<project>[^/]+)/(?P<region>[^/]+)/(?P<name>[^/]+)", "(?P<region>[^/]+)/(?P<name>[^/]+)", "(?P<name>[^/]+)"}, d, config, d.Id())
119+
if err != nil {
120+
return err
121+
}
122+
123+
for k, v := range m {
124+
values[k] = v
125+
}
126+
127+
u := &ComputeRegionBackendServiceIamUpdater{
128+
project: values["project"],
129+
region: values["region"],
130+
name: values["name"],
131+
d: d,
132+
Config: config,
133+
}
134+
if err := d.Set("name", u.GetResourceId()); err != nil {
135+
return fmt.Errorf("Error setting name: %s", err)
136+
}
137+
d.SetId(u.GetResourceId())
138+
return nil
139+
}
140+
141+
func (u *ComputeRegionBackendServiceIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
142+
url, err := u.qualifyRegionBackendServiceUrl("getIamPolicy")
143+
if err != nil {
144+
return nil, err
145+
}
146+
147+
project, err := getProject(u.d, u.Config)
148+
if err != nil {
149+
return nil, err
150+
}
151+
var obj map[string]interface{}
152+
url, err = addQueryParams(url, map[string]string{"optionsRequestedPolicyVersion": fmt.Sprintf("%d", iamPolicyVersion)})
153+
if err != nil {
154+
return nil, err
155+
}
156+
157+
userAgent, err := generateUserAgentString(u.d, u.Config.userAgent)
158+
if err != nil {
159+
return nil, err
160+
}
161+
162+
policy, err := sendRequest(u.Config, "GET", project, url, userAgent, obj)
163+
if err != nil {
164+
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
165+
}
166+
167+
out := &cloudresourcemanager.Policy{}
168+
err = Convert(policy, out)
169+
if err != nil {
170+
return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
171+
}
172+
173+
return out, nil
174+
}
175+
176+
func (u *ComputeRegionBackendServiceIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
177+
json, err := ConvertToMap(policy)
178+
if err != nil {
179+
return err
180+
}
181+
182+
obj := make(map[string]interface{})
183+
obj["policy"] = json
184+
185+
url, err := u.qualifyRegionBackendServiceUrl("setIamPolicy")
186+
if err != nil {
187+
return err
188+
}
189+
project, err := getProject(u.d, u.Config)
190+
if err != nil {
191+
return err
192+
}
193+
194+
userAgent, err := generateUserAgentString(u.d, u.Config.userAgent)
195+
if err != nil {
196+
return err
197+
}
198+
199+
_, err = sendRequestWithTimeout(u.Config, "POST", project, url, userAgent, obj, u.d.Timeout(schema.TimeoutCreate))
200+
if err != nil {
201+
return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
202+
}
203+
204+
return nil
205+
}
206+
207+
func (u *ComputeRegionBackendServiceIamUpdater) qualifyRegionBackendServiceUrl(methodIdentifier string) (string, error) {
208+
urlTemplate := fmt.Sprintf("{{ComputeBasePath}}%s/%s", fmt.Sprintf("projects/%s/regions/%s/backendServices/%s", u.project, u.region, u.name), methodIdentifier)
209+
url, err := replaceVars(u.d, u.Config, urlTemplate)
210+
if err != nil {
211+
return "", err
212+
}
213+
return url, nil
214+
}
215+
216+
func (u *ComputeRegionBackendServiceIamUpdater) GetResourceId() string {
217+
return fmt.Sprintf("projects/%s/regions/%s/backendServices/%s", u.project, u.region, u.name)
218+
}
219+
220+
func (u *ComputeRegionBackendServiceIamUpdater) GetMutexKey() string {
221+
return fmt.Sprintf("iam-compute-regionbackendservice-%s", u.GetResourceId())
222+
}
223+
224+
func (u *ComputeRegionBackendServiceIamUpdater) DescribeResource() string {
225+
return fmt.Sprintf("compute regionbackendservice %q", u.GetResourceId())
226+
}

0 commit comments

Comments
 (0)