Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changelog/17775.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
```release-note:enhancement
dataplex: added IAM support for `google_dataplex_data_product` (iam_policy, iam_binding, iam_member)
```

```release-note:enhancement
dataplex: added `access_approval_config` field to `google_dataplex_data_product`
```
295 changes: 295 additions & 0 deletions google-beta/services/dataplex/iam_dataplex_data_product.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,295 @@
// Copyright IBM Corp. 2014, 2026
// SPDX-License-Identifier: MPL-2.0

// ----------------------------------------------------------------------------
//
// *** AUTO GENERATED CODE *** Type: MMv1 ***
//
// ----------------------------------------------------------------------------
//
// This code is generated by Magic Modules using the following:
//
// Configuration: https://github.com/GoogleCloudPlatform/magic-modules/tree/main/mmv1/products/dataplex/DataProduct.yaml
// Template: https://github.com/GoogleCloudPlatform/magic-modules/tree/main/mmv1/templates/terraform/iam_policy.go.tmpl
//
// DO NOT EDIT this file directly. Any changes made to this file will be
// overwritten during the next generation cycle.
//
// ----------------------------------------------------------------------------

package dataplex

import (
"fmt"
"regexp"
"strings"

"github.com/hashicorp/errwrap"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"google.golang.org/api/cloudresourcemanager/v1"

"github.com/hashicorp/terraform-provider-google-beta/google-beta/registry"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgiamresource"
"github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource"
transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport"
)

var (
_ = regexp.Match
_ = strings.Trim
_ = errwrap.Wrap
_ = schema.Noop
)

func init() {
registry.Schema{
Name: "google_dataplex_data_product_iam_binding",
ProductName: "Dataplex",
Type: registry.SchemaTypeIAMResource,
Schema: tpgiamresource.ResourceIamBinding(DataplexDataProductIamSchema, DataplexDataProductIamUpdaterProducer, DataplexDataProductIdParseFunc),
}.Register()
registry.Schema{
Name: "google_dataplex_data_product_iam_member",
ProductName: "Dataplex",
Type: registry.SchemaTypeIAMResource,
Schema: tpgiamresource.ResourceIamMember(DataplexDataProductIamSchema, DataplexDataProductIamUpdaterProducer, DataplexDataProductIdParseFunc, tpgiamresource.IamWithParentResourceIdentity(DataplexDataProductIamParentParentResourceIdentityParser)),
}.Register()
registry.Schema{
Name: "google_dataplex_data_product_iam_policy",
ProductName: "Dataplex",
Type: registry.SchemaTypeIAMResource,
Schema: tpgiamresource.ResourceIamPolicy(DataplexDataProductIamSchema, DataplexDataProductIamUpdaterProducer, DataplexDataProductIdParseFunc),
}.Register()
registry.Schema{
Name: "google_dataplex_data_product_iam_policy",
ProductName: "Dataplex",
Type: registry.SchemaTypeIAMDataSource,
Schema: tpgiamresource.DataSourceIamPolicy(DataplexDataProductIamSchema, DataplexDataProductIamUpdaterProducer),
}.Register()
}

var DataplexDataProductIamSchema = map[string]*schema.Schema{
"project": {
Type: schema.TypeString,
Computed: true,
Optional: true,
ForceNew: true,
},
"location": {
Type: schema.TypeString,
Computed: true,
Optional: true,
ForceNew: true,
},
"data_product_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
DiffSuppressFunc: tpgresource.CompareSelfLinkOrResourceName,
},
}

type DataplexDataProductIamUpdater struct {
project string
location string
dataProductId string
d tpgresource.TerraformResourceData
Config *transport_tpg.Config
}

func DataplexDataProductIamUpdaterProducer(d tpgresource.TerraformResourceData, config *transport_tpg.Config) (tpgiamresource.ResourceIamUpdater, error) {
values := make(map[string]string)

project, _ := tpgresource.GetProject(d, config)
if project != "" {
if err := d.Set("project", project); err != nil {
return nil, fmt.Errorf("Error setting project: %s", err)
}
}
values["project"] = project
location, _ := tpgresource.GetLocation(d, config)
if location != "" {
if err := d.Set("location", location); err != nil {
return nil, fmt.Errorf("Error setting location: %s", err)
}
}
values["location"] = location
if v, ok := d.GetOk("data_product_id"); ok {
values["data_product_id"] = v.(string)
}

// We may have gotten either a long or short name, so attempt to parse long name if possible
m, err := tpgresource.GetImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/dataProducts/(?P<data_product_id>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<data_product_id>[^/]+)", "(?P<location>[^/]+)/(?P<data_product_id>[^/]+)", "(?P<data_product_id>[^/]+)"}, d, config, d.Get("data_product_id").(string))
if err != nil {
return nil, err
}

for k, v := range m {
values[k] = v
}

u := &DataplexDataProductIamUpdater{
project: values["project"],
location: values["location"],
dataProductId: values["data_product_id"],
d: d,
Config: config,
}

if err := d.Set("project", u.project); err != nil {
return nil, fmt.Errorf("Error setting project: %s", err)
}
if err := d.Set("location", u.location); err != nil {
return nil, fmt.Errorf("Error setting location: %s", err)
}
if err := d.Set("data_product_id", u.GetResourceId()); err != nil {
return nil, fmt.Errorf("Error setting data_product_id: %s", err)
}

return u, nil
}

func DataplexDataProductIdParseFunc(d *schema.ResourceData, config *transport_tpg.Config) error {
values := make(map[string]string)

project, _ := tpgresource.GetProject(d, config)
if project != "" {
values["project"] = project
}

location, _ := tpgresource.GetLocation(d, config)
if location != "" {
values["location"] = location
}

m, err := tpgresource.GetImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/dataProducts/(?P<data_product_id>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<data_product_id>[^/]+)", "(?P<location>[^/]+)/(?P<data_product_id>[^/]+)", "(?P<data_product_id>[^/]+)"}, d, config, d.Id())
if err != nil {
return err
}

for k, v := range m {
values[k] = v
}

u := &DataplexDataProductIamUpdater{
project: values["project"],
location: values["location"],
dataProductId: values["data_product_id"],
d: d,
Config: config,
}
if err := d.Set("data_product_id", u.GetResourceId()); err != nil {
return fmt.Errorf("Error setting data_product_id: %s", err)
}
d.SetId(u.GetResourceId())
return nil
}

func (u *DataplexDataProductIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
url, err := u.qualifyDataProductUrl("getIamPolicy")
if err != nil {
return nil, err
}

project, err := tpgresource.GetProject(u.d, u.Config)
if err != nil {
return nil, err
}
var obj map[string]interface{}

userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
if err != nil {
return nil, err
}

policy, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: u.Config,
Method: "GET",
Project: project,
RawURL: url,
UserAgent: userAgent,
Body: obj,
})
if err != nil {
return nil, fmt.Errorf("Error retrieving IAM policy for %s: %w", u.DescribeResource(), err)
}

out := &cloudresourcemanager.Policy{}
err = tpgresource.Convert(policy, out)
if err != nil {
return nil, fmt.Errorf("Cannot convert a policy to a resource manager policy: %w", err)
}

return out, nil
}

func (u *DataplexDataProductIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
json, err := tpgresource.ConvertToMap(policy)
if err != nil {
return err
}

obj := make(map[string]interface{})
obj["policy"] = json

url, err := u.qualifyDataProductUrl("setIamPolicy")
if err != nil {
return err
}
project, err := tpgresource.GetProject(u.d, u.Config)
if err != nil {
return err
}

userAgent, err := tpgresource.GenerateUserAgentString(u.d, u.Config.UserAgent)
if err != nil {
return err
}

_, err = transport_tpg.SendRequest(transport_tpg.SendRequestOptions{
Config: u.Config,
Method: "POST",
Project: project,
RawURL: url,
UserAgent: userAgent,
Body: obj,
Timeout: u.d.Timeout(schema.TimeoutCreate),
})
if err != nil {
return fmt.Errorf("Error setting IAM policy for %s: %w", u.DescribeResource(), err)
}

return nil
}

func (u *DataplexDataProductIamUpdater) qualifyDataProductUrl(methodIdentifier string) (string, error) {
urlTemplate := fmt.Sprintf("{{DataplexBasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/%s/dataProducts/%s", u.project, u.location, u.dataProductId), methodIdentifier)
url, err := tpgresource.ReplaceVars(u.d, u.Config, urlTemplate)
if err != nil {
return "", err
}
return url, nil
}

func (u *DataplexDataProductIamUpdater) GetResourceId() string {
return fmt.Sprintf("projects/%s/locations/%s/dataProducts/%s", u.project, u.location, u.dataProductId)
}

func DataplexDataProductIamParentParentResourceIdentityParser(d *schema.ResourceData, identity *schema.IdentityData, transportConfig *transport_tpg.Config) (string, error) {
return tpgiamresource.ParseIamResourceIdentity(d, identity, transportConfig, tpgiamresource.IamResourceIdentityConfig{
Params: []tpgiamresource.IamIdentityParam{
{Key: "project", IdentityKey: "project"},
{Key: "location", IdentityKey: "location"},
{Key: "dataProductId", IdentityKey: "data_product_id"},
},
UriFormat: "projects/%s/locations/%s/dataProducts/%s",
})
}

func (u *DataplexDataProductIamUpdater) GetMutexKey() string {
return fmt.Sprintf("iam-dataplex-dataproduct-%s", u.GetResourceId())
}

func (u *DataplexDataProductIamUpdater) DescribeResource() string {
return fmt.Sprintf("dataplex dataproduct %q", u.GetResourceId())
}
Loading