Skip to content

Commit 7a7bc27

Browse files
Add Dataproc Metastore Database Resource for IAM support (#13335) (#9615)
[upstream:80c3712b54bbb55deaca7f13f8865d47dc2b94bb] Signed-off-by: Modular Magician <[email protected]>
1 parent 79688b4 commit 7a7bc27

6 files changed

+993
-2
lines changed

.changelog/13335.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
metastore: Add `google_dataproc_metastore_database_iam_*` resources
3+
```

google-beta/provider/provider_mmv1_resources.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,7 @@ var generatedIAMDatasources = map[string]*schema.Resource{
469469
"google_dataplex_task_iam_policy": tpgiamresource.DataSourceIamPolicy(dataplex.DataplexTaskIamSchema, dataplex.DataplexTaskIamUpdaterProducer),
470470
"google_dataplex_zone_iam_policy": tpgiamresource.DataSourceIamPolicy(dataplex.DataplexZoneIamSchema, dataplex.DataplexZoneIamUpdaterProducer),
471471
"google_dataproc_autoscaling_policy_iam_policy": tpgiamresource.DataSourceIamPolicy(dataproc.DataprocAutoscalingPolicyIamSchema, dataproc.DataprocAutoscalingPolicyIamUpdaterProducer),
472+
"google_dataproc_metastore_database_iam_policy": tpgiamresource.DataSourceIamPolicy(dataprocmetastore.DataprocMetastoreDatabaseIamSchema, dataprocmetastore.DataprocMetastoreDatabaseIamUpdaterProducer),
472473
"google_dataproc_metastore_federation_iam_policy": tpgiamresource.DataSourceIamPolicy(dataprocmetastore.DataprocMetastoreFederationIamSchema, dataprocmetastore.DataprocMetastoreFederationIamUpdaterProducer),
473474
"google_dataproc_metastore_service_iam_policy": tpgiamresource.DataSourceIamPolicy(dataprocmetastore.DataprocMetastoreServiceIamSchema, dataprocmetastore.DataprocMetastoreServiceIamUpdaterProducer),
474475
"google_dns_managed_zone_iam_policy": tpgiamresource.DataSourceIamPolicy(dns.DNSManagedZoneIamSchema, dns.DNSManagedZoneIamUpdaterProducer),
@@ -549,8 +550,8 @@ var handwrittenIAMDatasources = map[string]*schema.Resource{
549550

550551
// Resources
551552
// Generated resources: 628
552-
// Generated IAM resources: 306
553-
// Total generated resources: 934
553+
// Generated IAM resources: 309
554+
// Total generated resources: 937
554555
var generatedResources = map[string]*schema.Resource{
555556
"google_folder_access_approval_settings": accessapproval.ResourceAccessApprovalFolderSettings(),
556557
"google_organization_access_approval_settings": accessapproval.ResourceAccessApprovalOrganizationSettings(),
@@ -977,6 +978,9 @@ var generatedResources = map[string]*schema.Resource{
977978
"google_dataproc_gdc_application_environment": dataprocgdc.ResourceDataprocGdcApplicationEnvironment(),
978979
"google_dataproc_gdc_service_instance": dataprocgdc.ResourceDataprocGdcServiceInstance(),
979980
"google_dataproc_gdc_spark_application": dataprocgdc.ResourceDataprocGdcSparkApplication(),
981+
"google_dataproc_metastore_database_iam_binding": tpgiamresource.ResourceIamBinding(dataprocmetastore.DataprocMetastoreDatabaseIamSchema, dataprocmetastore.DataprocMetastoreDatabaseIamUpdaterProducer, dataprocmetastore.DataprocMetastoreDatabaseIdParseFunc),
982+
"google_dataproc_metastore_database_iam_member": tpgiamresource.ResourceIamMember(dataprocmetastore.DataprocMetastoreDatabaseIamSchema, dataprocmetastore.DataprocMetastoreDatabaseIamUpdaterProducer, dataprocmetastore.DataprocMetastoreDatabaseIdParseFunc),
983+
"google_dataproc_metastore_database_iam_policy": tpgiamresource.ResourceIamPolicy(dataprocmetastore.DataprocMetastoreDatabaseIamSchema, dataprocmetastore.DataprocMetastoreDatabaseIamUpdaterProducer, dataprocmetastore.DataprocMetastoreDatabaseIdParseFunc),
980984
"google_dataproc_metastore_federation": dataprocmetastore.ResourceDataprocMetastoreFederation(),
981985
"google_dataproc_metastore_federation_iam_binding": tpgiamresource.ResourceIamBinding(dataprocmetastore.DataprocMetastoreFederationIamSchema, dataprocmetastore.DataprocMetastoreFederationIamUpdaterProducer, dataprocmetastore.DataprocMetastoreFederationIdParseFunc),
982986
"google_dataproc_metastore_federation_iam_member": tpgiamresource.ResourceIamMember(dataprocmetastore.DataprocMetastoreFederationIamSchema, dataprocmetastore.DataprocMetastoreFederationIamUpdaterProducer, dataprocmetastore.DataprocMetastoreFederationIdParseFunc),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,262 @@
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 code is generated by Magic Modules using the following:
11+
//
12+
// Configuration: https://github.com/GoogleCloudPlatform/magic-modules/tree/main/mmv1/products/metastore/Database.yaml
13+
// Template: https://github.com/GoogleCloudPlatform/magic-modules/tree/main/mmv1/templates/terraform/iam_policy.go.tmpl
14+
//
15+
// DO NOT EDIT this file directly. Any changes made to this file will be
16+
// overwritten during the next generation cycle.
17+
//
18+
// ----------------------------------------------------------------------------
19+
20+
package dataprocmetastore
21+
22+
import (
23+
"fmt"
24+
25+
"github.com/hashicorp/errwrap"
26+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
27+
"google.golang.org/api/cloudresourcemanager/v1"
28+
29+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgiamresource"
30+
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
31+
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
32+
)
33+
34+
var DataprocMetastoreDatabaseIamSchema = map[string]*schema.Schema{
35+
"project": {
36+
Type: schema.TypeString,
37+
Computed: true,
38+
Optional: true,
39+
ForceNew: true,
40+
},
41+
"location": {
42+
Type: schema.TypeString,
43+
Computed: true,
44+
Optional: true,
45+
ForceNew: true,
46+
},
47+
"service_id": {
48+
Type: schema.TypeString,
49+
Required: true,
50+
ForceNew: true,
51+
},
52+
"database": {
53+
Type: schema.TypeString,
54+
Required: true,
55+
ForceNew: true,
56+
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
57+
},
58+
}
59+
60+
type DataprocMetastoreDatabaseIamUpdater struct {
61+
project string
62+
location string
63+
serviceId string
64+
database string
65+
d tpgresource.TerraformResourceData
66+
Config *transport_tpg.Config
67+
}
68+
69+
func DataprocMetastoreDatabaseIamUpdaterProducer(d tpgresource.TerraformResourceData, config *transport_tpg.Config) (tpgiamresource.ResourceIamUpdater, error) {
70+
values := make(map[string]string)
71+
72+
project, _ := tpgresource.GetProject(d, config)
73+
if project != "" {
74+
if err := d.Set("project", project); err != nil {
75+
return nil, fmt.Errorf("Error setting project: %s", err)
76+
}
77+
}
78+
values["project"] = project
79+
location, _ := tpgresource.GetLocation(d, config)
80+
if location != "" {
81+
if err := d.Set("location", location); err != nil {
82+
return nil, fmt.Errorf("Error setting location: %s", err)
83+
}
84+
}
85+
values["location"] = location
86+
if v, ok := d.GetOk("service_id"); ok {
87+
values["serviceId"] = v.(string)
88+
}
89+
90+
if v, ok := d.GetOk("database"); ok {
91+
values["database"] = v.(string)
92+
}
93+
94+
// We may have gotten either a long or short name, so attempt to parse long name if possible
95+
m, err := tpgresource.GetImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/services/(?P<serviceId>[^/]+)/databases/(?P<database>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<serviceId>[^/]+)/(?P<database>[^/]+)", "(?P<location>[^/]+)/(?P<serviceId>[^/]+)/(?P<database>[^/]+)", "(?P<database>[^/]+)"}, d, config, d.Get("database").(string))
96+
if err != nil {
97+
return nil, err
98+
}
99+
100+
for k, v := range m {
101+
values[k] = v
102+
}
103+
104+
u := &DataprocMetastoreDatabaseIamUpdater{
105+
project: values["project"],
106+
location: values["location"],
107+
serviceId: values["serviceId"],
108+
database: values["database"],
109+
d: d,
110+
Config: config,
111+
}
112+
113+
if err := d.Set("project", u.project); err != nil {
114+
return nil, fmt.Errorf("Error setting project: %s", err)
115+
}
116+
if err := d.Set("location", u.location); err != nil {
117+
return nil, fmt.Errorf("Error setting location: %s", err)
118+
}
119+
if err := d.Set("service_id", u.serviceId); err != nil {
120+
return nil, fmt.Errorf("Error setting service_id: %s", err)
121+
}
122+
if err := d.Set("database", u.GetResourceId()); err != nil {
123+
return nil, fmt.Errorf("Error setting database: %s", err)
124+
}
125+
126+
return u, nil
127+
}
128+
129+
func DataprocMetastoreDatabaseIdParseFunc(d *schema.ResourceData, config *transport_tpg.Config) error {
130+
values := make(map[string]string)
131+
132+
project, _ := tpgresource.GetProject(d, config)
133+
if project != "" {
134+
values["project"] = project
135+
}
136+
137+
location, _ := tpgresource.GetLocation(d, config)
138+
if location != "" {
139+
values["location"] = location
140+
}
141+
142+
m, err := tpgresource.GetImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/services/(?P<serviceId>[^/]+)/databases/(?P<database>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<serviceId>[^/]+)/(?P<database>[^/]+)", "(?P<location>[^/]+)/(?P<serviceId>[^/]+)/(?P<database>[^/]+)", "(?P<database>[^/]+)"}, d, config, d.Id())
143+
if err != nil {
144+
return err
145+
}
146+
147+
for k, v := range m {
148+
values[k] = v
149+
}
150+
151+
u := &DataprocMetastoreDatabaseIamUpdater{
152+
project: values["project"],
153+
location: values["location"],
154+
serviceId: values["serviceId"],
155+
database: values["database"],
156+
d: d,
157+
Config: config,
158+
}
159+
if err := d.Set("database", u.GetResourceId()); err != nil {
160+
return fmt.Errorf("Error setting database: %s", err)
161+
}
162+
d.SetId(u.GetResourceId())
163+
return nil
164+
}
165+
166+
func (u *DataprocMetastoreDatabaseIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
167+
url, err := u.qualifyDatabaseUrl("getIamPolicy")
168+
if err != nil {
169+
return nil, err
170+
}
171+
172+
project, err := tpgresource.GetProject(u.d, u.Config)
173+
if err != nil {
174+
return nil, err
175+
}
176+
var obj map[string]interface{}
177+
178+
userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
179+
if err != nil {
180+
return nil, err
181+
}
182+
183+
policy, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
184+
Config: u.Config,
185+
Method: "GET",
186+
Project: project,
187+
RawURL: url,
188+
UserAgent: userAgent,
189+
Body: obj,
190+
})
191+
if err != nil {
192+
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
193+
}
194+
195+
out := &cloudresourcemanager.Policy{}
196+
err = tpgresource.Convert(policy, out)
197+
if err != nil {
198+
return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
199+
}
200+
201+
return out, nil
202+
}
203+
204+
func (u *DataprocMetastoreDatabaseIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
205+
json, err := tpgresource.ConvertToMap(policy)
206+
if err != nil {
207+
return err
208+
}
209+
210+
obj := make(map[string]interface{})
211+
obj["policy"] = json
212+
213+
url, err := u.qualifyDatabaseUrl("setIamPolicy")
214+
if err != nil {
215+
return err
216+
}
217+
project, err := tpgresource.GetProject(u.d, u.Config)
218+
if err != nil {
219+
return err
220+
}
221+
222+
userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
223+
if err != nil {
224+
return err
225+
}
226+
227+
_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
228+
Config: u.Config,
229+
Method: "POST",
230+
Project: project,
231+
RawURL: url,
232+
UserAgent: userAgent,
233+
Body: obj,
234+
Timeout: u.d.Timeout(schema.TimeoutCreate),
235+
})
236+
if err != nil {
237+
return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
238+
}
239+
240+
return nil
241+
}
242+
243+
func (u *DataprocMetastoreDatabaseIamUpdater) qualifyDatabaseUrl(methodIdentifier string) (string, error) {
244+
urlTemplate := fmt.Sprintf("{{DataprocMetastoreBasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/%s/services/%s/databases/%s", u.project, u.location, u.serviceId, u.database), methodIdentifier)
245+
url, err := tpgresource.ReplaceVars(u.d, u.Config, urlTemplate)
246+
if err != nil {
247+
return "", err
248+
}
249+
return url, nil
250+
}
251+
252+
func (u *DataprocMetastoreDatabaseIamUpdater) GetResourceId() string {
253+
return fmt.Sprintf("projects/%s/locations/%s/services/%s/databases/%s", u.project, u.location, u.serviceId, u.database)
254+
}
255+
256+
func (u *DataprocMetastoreDatabaseIamUpdater) GetMutexKey() string {
257+
return fmt.Sprintf("iam-dataprocmetastore-database-%s", u.GetResourceId())
258+
}
259+
260+
func (u *DataprocMetastoreDatabaseIamUpdater) DescribeResource() string {
261+
return fmt.Sprintf("dataprocmetastore database %q", u.GetResourceId())
262+
}

0 commit comments

Comments
 (0)