Repository: GoogleCloudPlatform/terraform-validator
Pull request #1473 (2023-03-21 01:03:49)

Adding IAM resources for Dataplex Lake, Zone and Asset
<!-- Put a description of what this PR is for here, along with any references to issues that this resolves or contributes to -->

Adding get/setIAMPolicy support for Dataplex Lake, Zone and Asset
Lake, Zone and Asset resources were generated via DCL. Followed guide https://googlecloudplatform.github.io/magic-modules/docs/how-to/add-mmv1-iam/#adding-iam-support-to-nonexistent-resources to add the IAM resources.
(part of https://github.com/hashicorp/terraform-provider-google/issues/11648)


<!--
Replace each [ ] with [X] to check it. Switch to the preview view to make it easier to click on links.
These steps will speed up the review process, and we appreciate you spending time on them before sending
your code to be reviewed.
-->
If this PR is for Terraform, I acknowledge that I have:

- [X] Searched through the [issue tracker](https://github.com/hashicorp/terraform-provider-google/issues) for an open issue that this either resolves or contributes to, commented on it to claim it, and written "fixes {url}" or "part of {url}" in this PR description. If there were no relevant open issues, I opened one and commented that I would like to work on it (not necessary for very small changes).
- [X] Ensured that all new fields I added that can be set by a user appear in at least one [example](https://github.com/GoogleCloudPlatform/magic-modules/tree/main/mmv1/templates/terraform/examples) (for generated resources) or [third_party test](https://github.com/GoogleCloudPlatform/magic-modules/tree/main/mmv1/third_party/terraform/tests) (for handwritten resources or update tests).
- [X] [Generated Terraform providers](https://github.com/GoogleCloudPlatform/magic-modules/blob/main/docs/content/docs/getting-started/generate-providers.md), and ran [`make test` and `make lint`](https://googlecloudplatform.github.io/magic-modules/docs/getting-started/run-provider-tests/#run-unit-tests) in the generated providers to ensure it passes unit and linter tests.
- [X] [Ran](https://github.com/GoogleCloudPlatform/magic-modules/blob/main/docs/content/docs/getting-started/run-provider-tests.md) relevant acceptance tests using my own Google Cloud project and credentials (If the acceptance tests do not yet pass or you are unable to run them, please let your reviewer know).
- [X] Read the [Release Notes Guide](https://github.com/GoogleCloudPlatform/magic-modules/blob/main/.ci/RELEASE_NOTES_GUIDE.md) before writing my release note below.

<!-- AUTOCHANGELOG for Downstream PRs.

Please select one of the following "release-note:" headings:
    - release-note:enhancement
    - release-note:bug
    - release-note:note
    - release-note:new-resource
    - release-note:new-datasource
    - release-note:deprecation
    - release-note:breaking-change
    - release-note:none

Unless you choose release-note:none, please add a release note.

See .ci/RELEASE_NOTES_GUIDE.md for writing good release notes.

You can add more release note blocks if you want more than one CHANGELOG
entry for this PR.
-->
**Release Note Template for Downstream PRs (will be copied)**

```release-note:new-resource
`google_dataplex_lake_iam_*`
```
```release-note:new-resource
`google_dataplex_zone_iam_*`
```
```release-note:new-resource
`google_dataplex_asset_iam_*`
```

Derived from https://github.com/GoogleCloudPlatform/magic-modules/pull/7436


Patch:
diff --git a/converters/google/resources/config.go b/converters/google/resources/config.go
index 65ca04bb..16877887 100644
--- a/converters/google/resources/config.go
+++ b/converters/google/resources/config.go
@@ -207,6 +207,7 @@ type Config struct {
 	DataCatalogBasePath          string
 	DataFusionBasePath           string
 	DataLossPreventionBasePath   string
+	DataplexBasePath             string
 	DataprocBasePath             string
 	DataprocMetastoreBasePath    string
 	DatastoreBasePath            string
@@ -313,6 +314,7 @@ const ContainerAttachedBasePathKey = "ContainerAttached"
 const DataCatalogBasePathKey = "DataCatalog"
 const DataFusionBasePathKey = "DataFusion"
 const DataLossPreventionBasePathKey = "DataLossPrevention"
+const DataplexBasePathKey = "Dataplex"
 const DataprocBasePathKey = "Dataproc"
 const DataprocMetastoreBasePathKey = "DataprocMetastore"
 const DatastoreBasePathKey = "Datastore"
@@ -413,6 +415,7 @@ var DefaultBasePaths = map[string]string{
 	DataCatalogBasePathKey:          "https://datacatalog.googleapis.com/v1/",
 	DataFusionBasePathKey:           "https://datafusion.googleapis.com/v1/",
 	DataLossPreventionBasePathKey:   "https://dlp.googleapis.com/v2/",
+	DataplexBasePathKey:             "https://dataplex.googleapis.com/v1/",
 	DataprocBasePathKey:             "https://dataproc.googleapis.com/v1/",
 	DataprocMetastoreBasePathKey:    "https://metastore.googleapis.com/v1/",
 	DatastoreBasePathKey:            "https://datastore.googleapis.com/v1/",
@@ -1289,6 +1292,7 @@ func ConfigureBasePaths(c *Config) {
 	c.DataCatalogBasePath = DefaultBasePaths[DataCatalogBasePathKey]
 	c.DataFusionBasePath = DefaultBasePaths[DataFusionBasePathKey]
 	c.DataLossPreventionBasePath = DefaultBasePaths[DataLossPreventionBasePathKey]
+	c.DataplexBasePath = DefaultBasePaths[DataplexBasePathKey]
 	c.DataprocBasePath = DefaultBasePaths[DataprocBasePathKey]
 	c.DataprocMetastoreBasePath = DefaultBasePaths[DataprocMetastoreBasePathKey]
 	c.DatastoreBasePath = DefaultBasePaths[DatastoreBasePathKey]
diff --git a/converters/google/resources/dataplex_asset_iam.go b/converters/google/resources/dataplex_asset_iam.go
new file mode 100644
index 00000000..65df6c5e
--- /dev/null
+++ b/converters/google/resources/dataplex_asset_iam.go
@@ -0,0 +1,129 @@
+// ----------------------------------------------------------------------------
+//
+//     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
+//
+// ----------------------------------------------------------------------------
+//
+//     This file is automatically generated by Magic Modules and manual
+//     changes will be clobbered when the file is regenerated.
+//
+//     Please read more about how to change this file in
+//     .github/CONTRIBUTING.md.
+//
+// ----------------------------------------------------------------------------
+
+package google
+
+import "fmt"
+
+// Provide a separate asset type constant so we don't have to worry about name conflicts between IAM and non-IAM converter files
+const DataplexAssetIAMAssetType string = "dataplex.googleapis.com/Asset"
+
+func resourceConverterDataplexAssetIamPolicy() ResourceConverter {
+	return ResourceConverter{
+		AssetType:         DataplexAssetIAMAssetType,
+		Convert:           GetDataplexAssetIamPolicyCaiObject,
+		MergeCreateUpdate: MergeDataplexAssetIamPolicy,
+	}
+}
+
+func resourceConverterDataplexAssetIamBinding() ResourceConverter {
+	return ResourceConverter{
+		AssetType:         DataplexAssetIAMAssetType,
+		Convert:           GetDataplexAssetIamBindingCaiObject,
+		FetchFullResource: FetchDataplexAssetIamPolicy,
+		MergeCreateUpdate: MergeDataplexAssetIamBinding,
+		MergeDelete:       MergeDataplexAssetIamBindingDelete,
+	}
+}
+
+func resourceConverterDataplexAssetIamMember() ResourceConverter {
+	return ResourceConverter{
+		AssetType:         DataplexAssetIAMAssetType,
+		Convert:           GetDataplexAssetIamMemberCaiObject,
+		FetchFullResource: FetchDataplexAssetIamPolicy,
+		MergeCreateUpdate: MergeDataplexAssetIamMember,
+		MergeDelete:       MergeDataplexAssetIamMemberDelete,
+	}
+}
+
+func GetDataplexAssetIamPolicyCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) {
+	return newDataplexAssetIamAsset(d, config, expandIamPolicyBindings)
+}
+
+func GetDataplexAssetIamBindingCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) {
+	return newDataplexAssetIamAsset(d, config, expandIamRoleBindings)
+}
+
+func GetDataplexAssetIamMemberCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) {
+	return newDataplexAssetIamAsset(d, config, expandIamMemberBindings)
+}
+
+func MergeDataplexAssetIamPolicy(existing, incoming Asset) Asset {
+	existing.IAMPolicy = incoming.IAMPolicy
+	return existing
+}
+
+func MergeDataplexAssetIamBinding(existing, incoming Asset) Asset {
+	return mergeIamAssets(existing, incoming, mergeAuthoritativeBindings)
+}
+
+func MergeDataplexAssetIamBindingDelete(existing, incoming Asset) Asset {
+	return mergeDeleteIamAssets(existing, incoming, mergeDeleteAuthoritativeBindings)
+}
+
+func MergeDataplexAssetIamMember(existing, incoming Asset) Asset {
+	return mergeIamAssets(existing, incoming, mergeAdditiveBindings)
+}
+
+func MergeDataplexAssetIamMemberDelete(existing, incoming Asset) Asset {
+	return mergeDeleteIamAssets(existing, incoming, mergeDeleteAdditiveBindings)
+}
+
+func newDataplexAssetIamAsset(
+	d TerraformResourceData,
+	config *Config,
+	expandBindings func(d TerraformResourceData) ([]IAMBinding, error),
+) ([]Asset, error) {
+	bindings, err := expandBindings(d)
+	if err != nil {
+		return []Asset{}, fmt.Errorf("expanding bindings: %v", err)
+	}
+
+	name, err := assetName(d, config, "//dataplex.googleapis.com/projects/{{project}}/locations/{{location}}/lakes/{{lake}}/zones/{{dataplex_zone}}/assets/{{asset}}")
+	if err != nil {
+		return []Asset{}, err
+	}
+
+	return []Asset{{
+		Name: name,
+		Type: DataplexAssetIAMAssetType,
+		IAMPolicy: &IAMPolicy{
+			Bindings: bindings,
+		},
+	}}, nil
+}
+
+func FetchDataplexAssetIamPolicy(d TerraformResourceData, config *Config) (Asset, error) {
+	// Check if the identity field returns a value
+	if _, ok := d.GetOk("location"); !ok {
+		return Asset{}, ErrEmptyIdentityField
+	}
+	if _, ok := d.GetOk("lake"); !ok {
+		return Asset{}, ErrEmptyIdentityField
+	}
+	if _, ok := d.GetOk("dataplex_zone"); !ok {
+		return Asset{}, ErrEmptyIdentityField
+	}
+	if _, ok := d.GetOk("asset"); !ok {
+		return Asset{}, ErrEmptyIdentityField
+	}
+
+	return fetchIamPolicy(
+		DataplexAssetIamUpdaterProducer,
+		d,
+		config,
+		"//dataplex.googleapis.com/projects/{{project}}/locations/{{location}}/lakes/{{lake}}/zones/{{dataplex_zone}}/assets/{{asset}}",
+		DataplexAssetIAMAssetType,
+	)
+}
diff --git a/converters/google/resources/dataplex_lake_iam.go b/converters/google/resources/dataplex_lake_iam.go
new file mode 100644
index 00000000..bd5e7ae9
--- /dev/null
+++ b/converters/google/resources/dataplex_lake_iam.go
@@ -0,0 +1,123 @@
+// ----------------------------------------------------------------------------
+//
+//     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
+//
+// ----------------------------------------------------------------------------
+//
+//     This file is automatically generated by Magic Modules and manual
+//     changes will be clobbered when the file is regenerated.
+//
+//     Please read more about how to change this file in
+//     .github/CONTRIBUTING.md.
+//
+// ----------------------------------------------------------------------------
+
+package google
+
+import "fmt"
+
+// Provide a separate asset type constant so we don't have to worry about name conflicts between IAM and non-IAM converter files
+const DataplexLakeIAMAssetType string = "dataplex.googleapis.com/Lake"
+
+func resourceConverterDataplexLakeIamPolicy() ResourceConverter {
+	return ResourceConverter{
+		AssetType:         DataplexLakeIAMAssetType,
+		Convert:           GetDataplexLakeIamPolicyCaiObject,
+		MergeCreateUpdate: MergeDataplexLakeIamPolicy,
+	}
+}
+
+func resourceConverterDataplexLakeIamBinding() ResourceConverter {
+	return ResourceConverter{
+		AssetType:         DataplexLakeIAMAssetType,
+		Convert:           GetDataplexLakeIamBindingCaiObject,
+		FetchFullResource: FetchDataplexLakeIamPolicy,
+		MergeCreateUpdate: MergeDataplexLakeIamBinding,
+		MergeDelete:       MergeDataplexLakeIamBindingDelete,
+	}
+}
+
+func resourceConverterDataplexLakeIamMember() ResourceConverter {
+	return ResourceConverter{
+		AssetType:         DataplexLakeIAMAssetType,
+		Convert:           GetDataplexLakeIamMemberCaiObject,
+		FetchFullResource: FetchDataplexLakeIamPolicy,
+		MergeCreateUpdate: MergeDataplexLakeIamMember,
+		MergeDelete:       MergeDataplexLakeIamMemberDelete,
+	}
+}
+
+func GetDataplexLakeIamPolicyCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) {
+	return newDataplexLakeIamAsset(d, config, expandIamPolicyBindings)
+}
+
+func GetDataplexLakeIamBindingCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) {
+	return newDataplexLakeIamAsset(d, config, expandIamRoleBindings)
+}
+
+func GetDataplexLakeIamMemberCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) {
+	return newDataplexLakeIamAsset(d, config, expandIamMemberBindings)
+}
+
+func MergeDataplexLakeIamPolicy(existing, incoming Asset) Asset {
+	existing.IAMPolicy = incoming.IAMPolicy
+	return existing
+}
+
+func MergeDataplexLakeIamBinding(existing, incoming Asset) Asset {
+	return mergeIamAssets(existing, incoming, mergeAuthoritativeBindings)
+}
+
+func MergeDataplexLakeIamBindingDelete(existing, incoming Asset) Asset {
+	return mergeDeleteIamAssets(existing, incoming, mergeDeleteAuthoritativeBindings)
+}
+
+func MergeDataplexLakeIamMember(existing, incoming Asset) Asset {
+	return mergeIamAssets(existing, incoming, mergeAdditiveBindings)
+}
+
+func MergeDataplexLakeIamMemberDelete(existing, incoming Asset) Asset {
+	return mergeDeleteIamAssets(existing, incoming, mergeDeleteAdditiveBindings)
+}
+
+func newDataplexLakeIamAsset(
+	d TerraformResourceData,
+	config *Config,
+	expandBindings func(d TerraformResourceData) ([]IAMBinding, error),
+) ([]Asset, error) {
+	bindings, err := expandBindings(d)
+	if err != nil {
+		return []Asset{}, fmt.Errorf("expanding bindings: %v", err)
+	}
+
+	name, err := assetName(d, config, "//dataplex.googleapis.com/projects/{{project}}/locations/{{location}}/lakes/{{lake}}")
+	if err != nil {
+		return []Asset{}, err
+	}
+
+	return []Asset{{
+		Name: name,
+		Type: DataplexLakeIAMAssetType,
+		IAMPolicy: &IAMPolicy{
+			Bindings: bindings,
+		},
+	}}, nil
+}
+
+func FetchDataplexLakeIamPolicy(d TerraformResourceData, config *Config) (Asset, error) {
+	// Check if the identity field returns a value
+	if _, ok := d.GetOk("location"); !ok {
+		return Asset{}, ErrEmptyIdentityField
+	}
+	if _, ok := d.GetOk("lake"); !ok {
+		return Asset{}, ErrEmptyIdentityField
+	}
+
+	return fetchIamPolicy(
+		DataplexLakeIamUpdaterProducer,
+		d,
+		config,
+		"//dataplex.googleapis.com/projects/{{project}}/locations/{{location}}/lakes/{{lake}}",
+		DataplexLakeIAMAssetType,
+	)
+}
diff --git a/converters/google/resources/dataplex_zone_iam.go b/converters/google/resources/dataplex_zone_iam.go
new file mode 100644
index 00000000..0ddb040f
--- /dev/null
+++ b/converters/google/resources/dataplex_zone_iam.go
@@ -0,0 +1,126 @@
+// ----------------------------------------------------------------------------
+//
+//     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
+//
+// ----------------------------------------------------------------------------
+//
+//     This file is automatically generated by Magic Modules and manual
+//     changes will be clobbered when the file is regenerated.
+//
+//     Please read more about how to change this file in
+//     .github/CONTRIBUTING.md.
+//
+// ----------------------------------------------------------------------------
+
+package google
+
+import "fmt"
+
+// Provide a separate asset type constant so we don't have to worry about name conflicts between IAM and non-IAM converter files
+const DataplexZoneIAMAssetType string = "dataplex.googleapis.com/Zone"
+
+func resourceConverterDataplexZoneIamPolicy() ResourceConverter {
+	return ResourceConverter{
+		AssetType:         DataplexZoneIAMAssetType,
+		Convert:           GetDataplexZoneIamPolicyCaiObject,
+		MergeCreateUpdate: MergeDataplexZoneIamPolicy,
+	}
+}
+
+func resourceConverterDataplexZoneIamBinding() ResourceConverter {
+	return ResourceConverter{
+		AssetType:         DataplexZoneIAMAssetType,
+		Convert:           GetDataplexZoneIamBindingCaiObject,
+		FetchFullResource: FetchDataplexZoneIamPolicy,
+		MergeCreateUpdate: MergeDataplexZoneIamBinding,
+		MergeDelete:       MergeDataplexZoneIamBindingDelete,
+	}
+}
+
+func resourceConverterDataplexZoneIamMember() ResourceConverter {
+	return ResourceConverter{
+		AssetType:         DataplexZoneIAMAssetType,
+		Convert:           GetDataplexZoneIamMemberCaiObject,
+		FetchFullResource: FetchDataplexZoneIamPolicy,
+		MergeCreateUpdate: MergeDataplexZoneIamMember,
+		MergeDelete:       MergeDataplexZoneIamMemberDelete,
+	}
+}
+
+func GetDataplexZoneIamPolicyCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) {
+	return newDataplexZoneIamAsset(d, config, expandIamPolicyBindings)
+}
+
+func GetDataplexZoneIamBindingCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) {
+	return newDataplexZoneIamAsset(d, config, expandIamRoleBindings)
+}
+
+func GetDataplexZoneIamMemberCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) {
+	return newDataplexZoneIamAsset(d, config, expandIamMemberBindings)
+}
+
+func MergeDataplexZoneIamPolicy(existing, incoming Asset) Asset {
+	existing.IAMPolicy = incoming.IAMPolicy
+	return existing
+}
+
+func MergeDataplexZoneIamBinding(existing, incoming Asset) Asset {
+	return mergeIamAssets(existing, incoming, mergeAuthoritativeBindings)
+}
+
+func MergeDataplexZoneIamBindingDelete(existing, incoming Asset) Asset {
+	return mergeDeleteIamAssets(existing, incoming, mergeDeleteAuthoritativeBindings)
+}
+
+func MergeDataplexZoneIamMember(existing, incoming Asset) Asset {
+	return mergeIamAssets(existing, incoming, mergeAdditiveBindings)
+}
+
+func MergeDataplexZoneIamMemberDelete(existing, incoming Asset) Asset {
+	return mergeDeleteIamAssets(existing, incoming, mergeDeleteAdditiveBindings)
+}
+
+func newDataplexZoneIamAsset(
+	d TerraformResourceData,
+	config *Config,
+	expandBindings func(d TerraformResourceData) ([]IAMBinding, error),
+) ([]Asset, error) {
+	bindings, err := expandBindings(d)
+	if err != nil {
+		return []Asset{}, fmt.Errorf("expanding bindings: %v", err)
+	}
+
+	name, err := assetName(d, config, "//dataplex.googleapis.com/projects/{{project}}/locations/{{location}}/lakes/{{lake}}/zones/{{dataplex_zone}}")
+	if err != nil {
+		return []Asset{}, err
+	}
+
+	return []Asset{{
+		Name: name,
+		Type: DataplexZoneIAMAssetType,
+		IAMPolicy: &IAMPolicy{
+			Bindings: bindings,
+		},
+	}}, nil
+}
+
+func FetchDataplexZoneIamPolicy(d TerraformResourceData, config *Config) (Asset, error) {
+	// Check if the identity field returns a value
+	if _, ok := d.GetOk("location"); !ok {
+		return Asset{}, ErrEmptyIdentityField
+	}
+	if _, ok := d.GetOk("lake"); !ok {
+		return Asset{}, ErrEmptyIdentityField
+	}
+	if _, ok := d.GetOk("dataplex_zone"); !ok {
+		return Asset{}, ErrEmptyIdentityField
+	}
+
+	return fetchIamPolicy(
+		DataplexZoneIamUpdaterProducer,
+		d,
+		config,
+		"//dataplex.googleapis.com/projects/{{project}}/locations/{{location}}/lakes/{{lake}}/zones/{{dataplex_zone}}",
+		DataplexZoneIAMAssetType,
+	)
+}
diff --git a/converters/google/resources/iam_dataplex_asset.go b/converters/google/resources/iam_dataplex_asset.go
new file mode 100644
index 00000000..205496fe
--- /dev/null
+++ b/converters/google/resources/iam_dataplex_asset.go
@@ -0,0 +1,253 @@
+// ----------------------------------------------------------------------------
+//
+//     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
+//
+// ----------------------------------------------------------------------------
+//
+//     This file is automatically generated by Magic Modules and manual
+//     changes will be clobbered when the file is regenerated.
+//
+//     Please read more about how to change this file in
+//     .github/CONTRIBUTING.md.
+//
+// ----------------------------------------------------------------------------
+
+package google
+
+import (
+	"fmt"
+
+	"github.com/hashicorp/errwrap"
+	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+	"google.golang.org/api/cloudresourcemanager/v1"
+)
+
+var DataplexAssetIamSchema = map[string]*schema.Schema{
+	"project": {
+		Type:     schema.TypeString,
+		Computed: true,
+		Optional: true,
+		ForceNew: true,
+	},
+	"location": {
+		Type:     schema.TypeString,
+		Computed: true,
+		Optional: true,
+		ForceNew: true,
+	},
+	"lake": {
+		Type:     schema.TypeString,
+		Required: true,
+		ForceNew: true,
+	},
+	"dataplex_zone": {
+		Type:     schema.TypeString,
+		Required: true,
+		ForceNew: true,
+	},
+	"asset": {
+		Type:             schema.TypeString,
+		Required:         true,
+		ForceNew:         true,
+		DiffSuppressFunc: compareSelfLinkOrResourceName,
+	},
+}
+
+type DataplexAssetIamUpdater struct {
+	project      string
+	location     string
+	lake         string
+	dataplexZone string
+	asset        string
+	d            TerraformResourceData
+	Config       *Config
+}
+
+func DataplexAssetIamUpdaterProducer(d TerraformResourceData, config *Config) (ResourceIamUpdater, error) {
+	values := make(map[string]string)
+
+	project, _ := 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, _ := 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("lake"); ok {
+		values["lake"] = v.(string)
+	}
+
+	if v, ok := d.GetOk("dataplex_zone"); ok {
+		values["dataplex_zone"] = v.(string)
+	}
+
+	if v, ok := d.GetOk("asset"); ok {
+		values["asset"] = v.(string)
+	}
+
+	// We may have gotten either a long or short name, so attempt to parse long name if possible
+	m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/lakes/(?P<lake>[^/]+)/zones/(?P<dataplex_zone>[^/]+)/assets/(?P<asset>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<lake>[^/]+)/(?P<dataplex_zone>[^/]+)/(?P<asset>[^/]+)", "(?P<location>[^/]+)/(?P<lake>[^/]+)/(?P<dataplex_zone>[^/]+)/(?P<asset>[^/]+)", "(?P<asset>[^/]+)"}, d, config, d.Get("asset").(string))
+	if err != nil {
+		return nil, err
+	}
+
+	for k, v := range m {
+		values[k] = v
+	}
+
+	u := &DataplexAssetIamUpdater{
+		project:      values["project"],
+		location:     values["location"],
+		lake:         values["lake"],
+		dataplexZone: values["dataplex_zone"],
+		asset:        values["asset"],
+		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("lake", u.lake); err != nil {
+		return nil, fmt.Errorf("Error setting lake: %s", err)
+	}
+	if err := d.Set("dataplex_zone", u.dataplexZone); err != nil {
+		return nil, fmt.Errorf("Error setting dataplex_zone: %s", err)
+	}
+	if err := d.Set("asset", u.GetResourceId()); err != nil {
+		return nil, fmt.Errorf("Error setting asset: %s", err)
+	}
+
+	return u, nil
+}
+
+func DataplexAssetIdParseFunc(d *schema.ResourceData, config *Config) error {
+	values := make(map[string]string)
+
+	project, _ := getProject(d, config)
+	if project != "" {
+		values["project"] = project
+	}
+
+	location, _ := getLocation(d, config)
+	if location != "" {
+		values["location"] = location
+	}
+
+	m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/lakes/(?P<lake>[^/]+)/zones/(?P<dataplex_zone>[^/]+)/assets/(?P<asset>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<lake>[^/]+)/(?P<dataplex_zone>[^/]+)/(?P<asset>[^/]+)", "(?P<location>[^/]+)/(?P<lake>[^/]+)/(?P<dataplex_zone>[^/]+)/(?P<asset>[^/]+)", "(?P<asset>[^/]+)"}, d, config, d.Id())
+	if err != nil {
+		return err
+	}
+
+	for k, v := range m {
+		values[k] = v
+	}
+
+	u := &DataplexAssetIamUpdater{
+		project:      values["project"],
+		location:     values["location"],
+		lake:         values["lake"],
+		dataplexZone: values["dataplex_zone"],
+		asset:        values["asset"],
+		d:            d,
+		Config:       config,
+	}
+	if err := d.Set("asset", u.GetResourceId()); err != nil {
+		return fmt.Errorf("Error setting asset: %s", err)
+	}
+	d.SetId(u.GetResourceId())
+	return nil
+}
+
+func (u *DataplexAssetIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
+	url, err := u.qualifyAssetUrl("getIamPolicy")
+	if err != nil {
+		return nil, err
+	}
+
+	project, err := getProject(u.d, u.Config)
+	if err != nil {
+		return nil, err
+	}
+	var obj map[string]interface{}
+
+	userAgent, err := generateUserAgentString(u.d, u.Config.UserAgent)
+	if err != nil {
+		return nil, err
+	}
+
+	policy, err := SendRequest(u.Config, "GET", project, url, userAgent, obj)
+	if err != nil {
+		return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
+	}
+
+	out := &cloudresourcemanager.Policy{}
+	err = Convert(policy, out)
+	if err != nil {
+		return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
+	}
+
+	return out, nil
+}
+
+func (u *DataplexAssetIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
+	json, err := ConvertToMap(policy)
+	if err != nil {
+		return err
+	}
+
+	obj := make(map[string]interface{})
+	obj["policy"] = json
+
+	url, err := u.qualifyAssetUrl("setIamPolicy")
+	if err != nil {
+		return err
+	}
+	project, err := getProject(u.d, u.Config)
+	if err != nil {
+		return err
+	}
+
+	userAgent, err := generateUserAgentString(u.d, u.Config.UserAgent)
+	if err != nil {
+		return err
+	}
+
+	_, err = SendRequestWithTimeout(u.Config, "POST", project, url, userAgent, obj, u.d.Timeout(schema.TimeoutCreate))
+	if err != nil {
+		return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
+	}
+
+	return nil
+}
+
+func (u *DataplexAssetIamUpdater) qualifyAssetUrl(methodIdentifier string) (string, error) {
+	urlTemplate := fmt.Sprintf("{{DataplexBasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/%s/lakes/%s/zones/%s/assets/%s", u.project, u.location, u.lake, u.dataplexZone, u.asset), methodIdentifier)
+	url, err := replaceVars(u.d, u.Config, urlTemplate)
+	if err != nil {
+		return "", err
+	}
+	return url, nil
+}
+
+func (u *DataplexAssetIamUpdater) GetResourceId() string {
+	return fmt.Sprintf("projects/%s/locations/%s/lakes/%s/zones/%s/assets/%s", u.project, u.location, u.lake, u.dataplexZone, u.asset)
+}
+
+func (u *DataplexAssetIamUpdater) GetMutexKey() string {
+	return fmt.Sprintf("iam-dataplex-asset-%s", u.GetResourceId())
+}
+
+func (u *DataplexAssetIamUpdater) DescribeResource() string {
+	return fmt.Sprintf("dataplex asset %q", u.GetResourceId())
+}
diff --git a/converters/google/resources/iam_dataplex_lake.go b/converters/google/resources/iam_dataplex_lake.go
new file mode 100644
index 00000000..c3505a2c
--- /dev/null
+++ b/converters/google/resources/iam_dataplex_lake.go
@@ -0,0 +1,223 @@
+// ----------------------------------------------------------------------------
+//
+//     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
+//
+// ----------------------------------------------------------------------------
+//
+//     This file is automatically generated by Magic Modules and manual
+//     changes will be clobbered when the file is regenerated.
+//
+//     Please read more about how to change this file in
+//     .github/CONTRIBUTING.md.
+//
+// ----------------------------------------------------------------------------
+
+package google
+
+import (
+	"fmt"
+
+	"github.com/hashicorp/errwrap"
+	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+	"google.golang.org/api/cloudresourcemanager/v1"
+)
+
+var DataplexLakeIamSchema = map[string]*schema.Schema{
+	"project": {
+		Type:     schema.TypeString,
+		Computed: true,
+		Optional: true,
+		ForceNew: true,
+	},
+	"location": {
+		Type:     schema.TypeString,
+		Computed: true,
+		Optional: true,
+		ForceNew: true,
+	},
+	"lake": {
+		Type:             schema.TypeString,
+		Required:         true,
+		ForceNew:         true,
+		DiffSuppressFunc: compareSelfLinkOrResourceName,
+	},
+}
+
+type DataplexLakeIamUpdater struct {
+	project  string
+	location string
+	lake     string
+	d        TerraformResourceData
+	Config   *Config
+}
+
+func DataplexLakeIamUpdaterProducer(d TerraformResourceData, config *Config) (ResourceIamUpdater, error) {
+	values := make(map[string]string)
+
+	project, _ := 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, _ := 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("lake"); ok {
+		values["lake"] = v.(string)
+	}
+
+	// We may have gotten either a long or short name, so attempt to parse long name if possible
+	m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/lakes/(?P<lake>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<lake>[^/]+)", "(?P<location>[^/]+)/(?P<lake>[^/]+)", "(?P<lake>[^/]+)"}, d, config, d.Get("lake").(string))
+	if err != nil {
+		return nil, err
+	}
+
+	for k, v := range m {
+		values[k] = v
+	}
+
+	u := &DataplexLakeIamUpdater{
+		project:  values["project"],
+		location: values["location"],
+		lake:     values["lake"],
+		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("lake", u.GetResourceId()); err != nil {
+		return nil, fmt.Errorf("Error setting lake: %s", err)
+	}
+
+	return u, nil
+}
+
+func DataplexLakeIdParseFunc(d *schema.ResourceData, config *Config) error {
+	values := make(map[string]string)
+
+	project, _ := getProject(d, config)
+	if project != "" {
+		values["project"] = project
+	}
+
+	location, _ := getLocation(d, config)
+	if location != "" {
+		values["location"] = location
+	}
+
+	m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/lakes/(?P<lake>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<lake>[^/]+)", "(?P<location>[^/]+)/(?P<lake>[^/]+)", "(?P<lake>[^/]+)"}, d, config, d.Id())
+	if err != nil {
+		return err
+	}
+
+	for k, v := range m {
+		values[k] = v
+	}
+
+	u := &DataplexLakeIamUpdater{
+		project:  values["project"],
+		location: values["location"],
+		lake:     values["lake"],
+		d:        d,
+		Config:   config,
+	}
+	if err := d.Set("lake", u.GetResourceId()); err != nil {
+		return fmt.Errorf("Error setting lake: %s", err)
+	}
+	d.SetId(u.GetResourceId())
+	return nil
+}
+
+func (u *DataplexLakeIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
+	url, err := u.qualifyLakeUrl("getIamPolicy")
+	if err != nil {
+		return nil, err
+	}
+
+	project, err := getProject(u.d, u.Config)
+	if err != nil {
+		return nil, err
+	}
+	var obj map[string]interface{}
+
+	userAgent, err := generateUserAgentString(u.d, u.Config.UserAgent)
+	if err != nil {
+		return nil, err
+	}
+
+	policy, err := SendRequest(u.Config, "GET", project, url, userAgent, obj)
+	if err != nil {
+		return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
+	}
+
+	out := &cloudresourcemanager.Policy{}
+	err = Convert(policy, out)
+	if err != nil {
+		return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
+	}
+
+	return out, nil
+}
+
+func (u *DataplexLakeIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
+	json, err := ConvertToMap(policy)
+	if err != nil {
+		return err
+	}
+
+	obj := make(map[string]interface{})
+	obj["policy"] = json
+
+	url, err := u.qualifyLakeUrl("setIamPolicy")
+	if err != nil {
+		return err
+	}
+	project, err := getProject(u.d, u.Config)
+	if err != nil {
+		return err
+	}
+
+	userAgent, err := generateUserAgentString(u.d, u.Config.UserAgent)
+	if err != nil {
+		return err
+	}
+
+	_, err = SendRequestWithTimeout(u.Config, "POST", project, url, userAgent, obj, u.d.Timeout(schema.TimeoutCreate))
+	if err != nil {
+		return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
+	}
+
+	return nil
+}
+
+func (u *DataplexLakeIamUpdater) qualifyLakeUrl(methodIdentifier string) (string, error) {
+	urlTemplate := fmt.Sprintf("{{DataplexBasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/%s/lakes/%s", u.project, u.location, u.lake), methodIdentifier)
+	url, err := replaceVars(u.d, u.Config, urlTemplate)
+	if err != nil {
+		return "", err
+	}
+	return url, nil
+}
+
+func (u *DataplexLakeIamUpdater) GetResourceId() string {
+	return fmt.Sprintf("projects/%s/locations/%s/lakes/%s", u.project, u.location, u.lake)
+}
+
+func (u *DataplexLakeIamUpdater) GetMutexKey() string {
+	return fmt.Sprintf("iam-dataplex-lake-%s", u.GetResourceId())
+}
+
+func (u *DataplexLakeIamUpdater) DescribeResource() string {
+	return fmt.Sprintf("dataplex lake %q", u.GetResourceId())
+}
diff --git a/converters/google/resources/iam_dataplex_zone.go b/converters/google/resources/iam_dataplex_zone.go
new file mode 100644
index 00000000..cc34ea7b
--- /dev/null
+++ b/converters/google/resources/iam_dataplex_zone.go
@@ -0,0 +1,238 @@
+// ----------------------------------------------------------------------------
+//
+//     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
+//
+// ----------------------------------------------------------------------------
+//
+//     This file is automatically generated by Magic Modules and manual
+//     changes will be clobbered when the file is regenerated.
+//
+//     Please read more about how to change this file in
+//     .github/CONTRIBUTING.md.
+//
+// ----------------------------------------------------------------------------
+
+package google
+
+import (
+	"fmt"
+
+	"github.com/hashicorp/errwrap"
+	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+	"google.golang.org/api/cloudresourcemanager/v1"
+)
+
+var DataplexZoneIamSchema = map[string]*schema.Schema{
+	"project": {
+		Type:     schema.TypeString,
+		Computed: true,
+		Optional: true,
+		ForceNew: true,
+	},
+	"location": {
+		Type:     schema.TypeString,
+		Computed: true,
+		Optional: true,
+		ForceNew: true,
+	},
+	"lake": {
+		Type:     schema.TypeString,
+		Required: true,
+		ForceNew: true,
+	},
+	"dataplex_zone": {
+		Type:             schema.TypeString,
+		Required:         true,
+		ForceNew:         true,
+		DiffSuppressFunc: compareSelfLinkOrResourceName,
+	},
+}
+
+type DataplexZoneIamUpdater struct {
+	project      string
+	location     string
+	lake         string
+	dataplexZone string
+	d            TerraformResourceData
+	Config       *Config
+}
+
+func DataplexZoneIamUpdaterProducer(d TerraformResourceData, config *Config) (ResourceIamUpdater, error) {
+	values := make(map[string]string)
+
+	project, _ := 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, _ := 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("lake"); ok {
+		values["lake"] = v.(string)
+	}
+
+	if v, ok := d.GetOk("dataplex_zone"); ok {
+		values["dataplex_zone"] = v.(string)
+	}
+
+	// We may have gotten either a long or short name, so attempt to parse long name if possible
+	m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/lakes/(?P<lake>[^/]+)/zones/(?P<dataplex_zone>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<lake>[^/]+)/(?P<dataplex_zone>[^/]+)", "(?P<location>[^/]+)/(?P<lake>[^/]+)/(?P<dataplex_zone>[^/]+)", "(?P<dataplex_zone>[^/]+)"}, d, config, d.Get("dataplex_zone").(string))
+	if err != nil {
+		return nil, err
+	}
+
+	for k, v := range m {
+		values[k] = v
+	}
+
+	u := &DataplexZoneIamUpdater{
+		project:      values["project"],
+		location:     values["location"],
+		lake:         values["lake"],
+		dataplexZone: values["dataplex_zone"],
+		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("lake", u.lake); err != nil {
+		return nil, fmt.Errorf("Error setting lake: %s", err)
+	}
+	if err := d.Set("dataplex_zone", u.GetResourceId()); err != nil {
+		return nil, fmt.Errorf("Error setting dataplex_zone: %s", err)
+	}
+
+	return u, nil
+}
+
+func DataplexZoneIdParseFunc(d *schema.ResourceData, config *Config) error {
+	values := make(map[string]string)
+
+	project, _ := getProject(d, config)
+	if project != "" {
+		values["project"] = project
+	}
+
+	location, _ := getLocation(d, config)
+	if location != "" {
+		values["location"] = location
+	}
+
+	m, err := getImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/lakes/(?P<lake>[^/]+)/zones/(?P<dataplex_zone>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<lake>[^/]+)/(?P<dataplex_zone>[^/]+)", "(?P<location>[^/]+)/(?P<lake>[^/]+)/(?P<dataplex_zone>[^/]+)", "(?P<dataplex_zone>[^/]+)"}, d, config, d.Id())
+	if err != nil {
+		return err
+	}
+
+	for k, v := range m {
+		values[k] = v
+	}
+
+	u := &DataplexZoneIamUpdater{
+		project:      values["project"],
+		location:     values["location"],
+		lake:         values["lake"],
+		dataplexZone: values["dataplex_zone"],
+		d:            d,
+		Config:       config,
+	}
+	if err := d.Set("dataplex_zone", u.GetResourceId()); err != nil {
+		return fmt.Errorf("Error setting dataplex_zone: %s", err)
+	}
+	d.SetId(u.GetResourceId())
+	return nil
+}
+
+func (u *DataplexZoneIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) {
+	url, err := u.qualifyZoneUrl("getIamPolicy")
+	if err != nil {
+		return nil, err
+	}
+
+	project, err := getProject(u.d, u.Config)
+	if err != nil {
+		return nil, err
+	}
+	var obj map[string]interface{}
+
+	userAgent, err := generateUserAgentString(u.d, u.Config.UserAgent)
+	if err != nil {
+		return nil, err
+	}
+
+	policy, err := SendRequest(u.Config, "GET", project, url, userAgent, obj)
+	if err != nil {
+		return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
+	}
+
+	out := &cloudresourcemanager.Policy{}
+	err = Convert(policy, out)
+	if err != nil {
+		return nil, errwrap.Wrapf("Cannot convert a policy to a resource manager policy: {{err}}", err)
+	}
+
+	return out, nil
+}
+
+func (u *DataplexZoneIamUpdater) SetResourceIamPolicy(policy *cloudresourcemanager.Policy) error {
+	json, err := ConvertToMap(policy)
+	if err != nil {
+		return err
+	}
+
+	obj := make(map[string]interface{})
+	obj["policy"] = json
+
+	url, err := u.qualifyZoneUrl("setIamPolicy")
+	if err != nil {
+		return err
+	}
+	project, err := getProject(u.d, u.Config)
+	if err != nil {
+		return err
+	}
+
+	userAgent, err := generateUserAgentString(u.d, u.Config.UserAgent)
+	if err != nil {
+		return err
+	}
+
+	_, err = SendRequestWithTimeout(u.Config, "POST", project, url, userAgent, obj, u.d.Timeout(schema.TimeoutCreate))
+	if err != nil {
+		return errwrap.Wrapf(fmt.Sprintf("Error setting IAM policy for %s: {{err}}", u.DescribeResource()), err)
+	}
+
+	return nil
+}
+
+func (u *DataplexZoneIamUpdater) qualifyZoneUrl(methodIdentifier string) (string, error) {
+	urlTemplate := fmt.Sprintf("{{DataplexBasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/%s/lakes/%s/zones/%s", u.project, u.location, u.lake, u.dataplexZone), methodIdentifier)
+	url, err := replaceVars(u.d, u.Config, urlTemplate)
+	if err != nil {
+		return "", err
+	}
+	return url, nil
+}
+
+func (u *DataplexZoneIamUpdater) GetResourceId() string {
+	return fmt.Sprintf("projects/%s/locations/%s/lakes/%s/zones/%s", u.project, u.location, u.lake, u.dataplexZone)
+}
+
+func (u *DataplexZoneIamUpdater) GetMutexKey() string {
+	return fmt.Sprintf("iam-dataplex-zone-%s", u.GetResourceId())
+}
+
+func (u *DataplexZoneIamUpdater) DescribeResource() string {
+	return fmt.Sprintf("dataplex zone %q", u.GetResourceId())
+}
diff --git a/converters/google/resources/resource_converters.go b/converters/google/resources/resource_converters.go
index 8e929d83..c6d396e9 100644
--- a/converters/google/resources/resource_converters.go
+++ b/converters/google/resources/resource_converters.go
@@ -171,6 +171,15 @@ func ResourceConverters() map[string][]ResourceConverter {
 		"google_data_fusion_instance_iam_policy":                  {resourceConverterDataFusionInstanceIamPolicy()},
 		"google_data_fusion_instance_iam_binding":                 {resourceConverterDataFusionInstanceIamBinding()},
 		"google_data_fusion_instance_iam_member":                  {resourceConverterDataFusionInstanceIamMember()},
+		"google_dataplex_asset_iam_policy":                        {resourceConverterDataplexAssetIamPolicy()},
+		"google_dataplex_asset_iam_binding":                       {resourceConverterDataplexAssetIamBinding()},
+		"google_dataplex_asset_iam_member":                        {resourceConverterDataplexAssetIamMember()},
+		"google_dataplex_lake_iam_policy":                         {resourceConverterDataplexLakeIamPolicy()},
+		"google_dataplex_lake_iam_binding":                        {resourceConverterDataplexLakeIamBinding()},
+		"google_dataplex_lake_iam_member":                         {resourceConverterDataplexLakeIamMember()},
+		"google_dataplex_zone_iam_policy":                         {resourceConverterDataplexZoneIamPolicy()},
+		"google_dataplex_zone_iam_binding":                        {resourceConverterDataplexZoneIamBinding()},
+		"google_dataplex_zone_iam_member":                         {resourceConverterDataplexZoneIamMember()},
 		"google_dataproc_autoscaling_policy_iam_policy":           {resourceConverterDataprocAutoscalingPolicyIamPolicy()},
 		"google_dataproc_autoscaling_policy_iam_binding":          {resourceConverterDataprocAutoscalingPolicyIamBinding()},
 		"google_dataproc_autoscaling_policy_iam_member":           {resourceConverterDataprocAutoscalingPolicyIamMember()},
diff --git a/go.mod b/go.mod
index fd7e9669..0b7f4857 100644
--- a/go.mod
+++ b/go.mod
@@ -27,7 +27,7 @@ require (
 	github.com/hashicorp/terraform-json v0.14.0
 	github.com/hashicorp/terraform-plugin-framework v1.1.1
 	github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.0
-	github.com/hashicorp/terraform-provider-google v1.20.1-0.20230320213810-b1645712723b
+	github.com/hashicorp/terraform-provider-google v1.20.1-0.20230321005915-caaf99d0c0d4
 	github.com/mitchellh/go-homedir v1.1.0
 	github.com/pkg/errors v0.9.1
 	github.com/sirupsen/logrus v1.9.0
diff --git a/go.sum b/go.sum
index 41139450..841078e7 100644
--- a/go.sum
+++ b/go.sum
@@ -553,8 +553,8 @@ github.com/hashicorp/terraform-plugin-mux v0.8.0 h1:WCTP66mZ+iIaIrCNJnjPEYnVjawT
 github.com/hashicorp/terraform-plugin-mux v0.8.0/go.mod h1:vdW0daEi8Kd4RFJmet5Ot+SIVB/B8SwQVJiYKQwdCy8=
 github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.0 h1:FtCLTiTcykdsURXPt/ku7fYXm3y19nbzbZcUxHx9RbI=
 github.com/hashicorp/terraform-plugin-sdk/v2 v2.24.0/go.mod h1:80wf5oad1tW+oLnbXS4UTYmDCrl7BuN1Q+IA91X1a4Y=
-github.com/hashicorp/terraform-provider-google v1.20.1-0.20230320213810-b1645712723b h1:Jbo1jEi8ppaVCkGJZQUhBFMyqMySBccmzyTcOvI/f/I=
-github.com/hashicorp/terraform-provider-google v1.20.1-0.20230320213810-b1645712723b/go.mod h1:Wn+5oEyIb0xoRzKqjLIZ8DE7bvH9WQ68mAb3G8RJrcE=
+github.com/hashicorp/terraform-provider-google v1.20.1-0.20230321005915-caaf99d0c0d4 h1:HFeY5AnwZzdfC/Si0SDlpMSH0zunn6pCS8AS3U2Foe8=
+github.com/hashicorp/terraform-provider-google v1.20.1-0.20230321005915-caaf99d0c0d4/go.mod h1:Wn+5oEyIb0xoRzKqjLIZ8DE7bvH9WQ68mAb3G8RJrcE=
 github.com/hashicorp/terraform-registry-address v0.1.0 h1:W6JkV9wbum+m516rCl5/NjKxCyTVaaUBbzYcMzBDO3U=
 github.com/hashicorp/terraform-registry-address v0.1.0/go.mod h1:EnyO2jYO6j29DTHbJcm00E5nQTFeTtyZH3H5ycydQ5A=
 github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 h1:HKLsbzeOsfXmKNpr3GiT18XAblV0BjCbzL8KQAMZGa0=


Test patch:
diff --git a/converters/google/resources/config_test_utils.go b/converters/google/resources/config_test_utils.go
index b2332209..23498f5c 100644
--- a/converters/google/resources/config_test_utils.go
+++ b/converters/google/resources/config_test_utils.go
@@ -53,6 +53,7 @@ func configureTestBasePaths(c *Config, url string) {
 	c.DataCatalogBasePath = url
 	c.DataFusionBasePath = url
 	c.DataLossPreventionBasePath = url
+	c.DataplexBasePath = url
 	c.DataprocBasePath = url
 	c.DataprocMetastoreBasePath = url
 	c.DatastoreBasePath = url