diff --git a/converters/google/resources/cloud_run_v2_job_iam.go b/converters/google/resources/cloud_run_v2_job_iam.go new file mode 100644 index 000000000..4367140d7 --- /dev/null +++ b/converters/google/resources/cloud_run_v2_job_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 CloudRunV2JobIAMAssetType string = "run.googleapis.com/Job" + +func resourceConverterCloudRunV2JobIamPolicy() ResourceConverter { + return ResourceConverter{ + AssetType: CloudRunV2JobIAMAssetType, + Convert: GetCloudRunV2JobIamPolicyCaiObject, + MergeCreateUpdate: MergeCloudRunV2JobIamPolicy, + } +} + +func resourceConverterCloudRunV2JobIamBinding() ResourceConverter { + return ResourceConverter{ + AssetType: CloudRunV2JobIAMAssetType, + Convert: GetCloudRunV2JobIamBindingCaiObject, + FetchFullResource: FetchCloudRunV2JobIamPolicy, + MergeCreateUpdate: MergeCloudRunV2JobIamBinding, + MergeDelete: MergeCloudRunV2JobIamBindingDelete, + } +} + +func resourceConverterCloudRunV2JobIamMember() ResourceConverter { + return ResourceConverter{ + AssetType: CloudRunV2JobIAMAssetType, + Convert: GetCloudRunV2JobIamMemberCaiObject, + FetchFullResource: FetchCloudRunV2JobIamPolicy, + MergeCreateUpdate: MergeCloudRunV2JobIamMember, + MergeDelete: MergeCloudRunV2JobIamMemberDelete, + } +} + +func GetCloudRunV2JobIamPolicyCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) { + return newCloudRunV2JobIamAsset(d, config, expandIamPolicyBindings) +} + +func GetCloudRunV2JobIamBindingCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) { + return newCloudRunV2JobIamAsset(d, config, expandIamRoleBindings) +} + +func GetCloudRunV2JobIamMemberCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) { + return newCloudRunV2JobIamAsset(d, config, expandIamMemberBindings) +} + +func MergeCloudRunV2JobIamPolicy(existing, incoming Asset) Asset { + existing.IAMPolicy = incoming.IAMPolicy + return existing +} + +func MergeCloudRunV2JobIamBinding(existing, incoming Asset) Asset { + return mergeIamAssets(existing, incoming, mergeAuthoritativeBindings) +} + +func MergeCloudRunV2JobIamBindingDelete(existing, incoming Asset) Asset { + return mergeDeleteIamAssets(existing, incoming, mergeDeleteAuthoritativeBindings) +} + +func MergeCloudRunV2JobIamMember(existing, incoming Asset) Asset { + return mergeIamAssets(existing, incoming, mergeAdditiveBindings) +} + +func MergeCloudRunV2JobIamMemberDelete(existing, incoming Asset) Asset { + return mergeDeleteIamAssets(existing, incoming, mergeDeleteAdditiveBindings) +} + +func newCloudRunV2JobIamAsset( + 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, "//run.googleapis.com/projects/{{project}}/locations/{{location}}/jobs/{{name}}") + if err != nil { + return []Asset{}, err + } + + return []Asset{{ + Name: name, + Type: CloudRunV2JobIAMAssetType, + IAMPolicy: &IAMPolicy{ + Bindings: bindings, + }, + }}, nil +} + +func FetchCloudRunV2JobIamPolicy(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("name"); !ok { + return Asset{}, ErrEmptyIdentityField + } + + return fetchIamPolicy( + CloudRunV2JobIamUpdaterProducer, + d, + config, + "//run.googleapis.com/projects/{{project}}/locations/{{location}}/jobs/{{name}}", + CloudRunV2JobIAMAssetType, + ) +} diff --git a/converters/google/resources/cloud_run_v2_service_iam.go b/converters/google/resources/cloud_run_v2_service_iam.go new file mode 100644 index 000000000..5c52baaaa --- /dev/null +++ b/converters/google/resources/cloud_run_v2_service_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 CloudRunV2ServiceIAMAssetType string = "run.googleapis.com/Service" + +func resourceConverterCloudRunV2ServiceIamPolicy() ResourceConverter { + return ResourceConverter{ + AssetType: CloudRunV2ServiceIAMAssetType, + Convert: GetCloudRunV2ServiceIamPolicyCaiObject, + MergeCreateUpdate: MergeCloudRunV2ServiceIamPolicy, + } +} + +func resourceConverterCloudRunV2ServiceIamBinding() ResourceConverter { + return ResourceConverter{ + AssetType: CloudRunV2ServiceIAMAssetType, + Convert: GetCloudRunV2ServiceIamBindingCaiObject, + FetchFullResource: FetchCloudRunV2ServiceIamPolicy, + MergeCreateUpdate: MergeCloudRunV2ServiceIamBinding, + MergeDelete: MergeCloudRunV2ServiceIamBindingDelete, + } +} + +func resourceConverterCloudRunV2ServiceIamMember() ResourceConverter { + return ResourceConverter{ + AssetType: CloudRunV2ServiceIAMAssetType, + Convert: GetCloudRunV2ServiceIamMemberCaiObject, + FetchFullResource: FetchCloudRunV2ServiceIamPolicy, + MergeCreateUpdate: MergeCloudRunV2ServiceIamMember, + MergeDelete: MergeCloudRunV2ServiceIamMemberDelete, + } +} + +func GetCloudRunV2ServiceIamPolicyCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) { + return newCloudRunV2ServiceIamAsset(d, config, expandIamPolicyBindings) +} + +func GetCloudRunV2ServiceIamBindingCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) { + return newCloudRunV2ServiceIamAsset(d, config, expandIamRoleBindings) +} + +func GetCloudRunV2ServiceIamMemberCaiObject(d TerraformResourceData, config *Config) ([]Asset, error) { + return newCloudRunV2ServiceIamAsset(d, config, expandIamMemberBindings) +} + +func MergeCloudRunV2ServiceIamPolicy(existing, incoming Asset) Asset { + existing.IAMPolicy = incoming.IAMPolicy + return existing +} + +func MergeCloudRunV2ServiceIamBinding(existing, incoming Asset) Asset { + return mergeIamAssets(existing, incoming, mergeAuthoritativeBindings) +} + +func MergeCloudRunV2ServiceIamBindingDelete(existing, incoming Asset) Asset { + return mergeDeleteIamAssets(existing, incoming, mergeDeleteAuthoritativeBindings) +} + +func MergeCloudRunV2ServiceIamMember(existing, incoming Asset) Asset { + return mergeIamAssets(existing, incoming, mergeAdditiveBindings) +} + +func MergeCloudRunV2ServiceIamMemberDelete(existing, incoming Asset) Asset { + return mergeDeleteIamAssets(existing, incoming, mergeDeleteAdditiveBindings) +} + +func newCloudRunV2ServiceIamAsset( + 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, "//run.googleapis.com/projects/{{project}}/locations/{{location}}/services/{{name}}") + if err != nil { + return []Asset{}, err + } + + return []Asset{{ + Name: name, + Type: CloudRunV2ServiceIAMAssetType, + IAMPolicy: &IAMPolicy{ + Bindings: bindings, + }, + }}, nil +} + +func FetchCloudRunV2ServiceIamPolicy(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("name"); !ok { + return Asset{}, ErrEmptyIdentityField + } + + return fetchIamPolicy( + CloudRunV2ServiceIamUpdaterProducer, + d, + config, + "//run.googleapis.com/projects/{{project}}/locations/{{location}}/services/{{name}}", + CloudRunV2ServiceIAMAssetType, + ) +} diff --git a/converters/google/resources/iam_cloud_run_v2_job.go b/converters/google/resources/iam_cloud_run_v2_job.go new file mode 100644 index 000000000..37005a23c --- /dev/null +++ b/converters/google/resources/iam_cloud_run_v2_job.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 CloudRunV2JobIamSchema = map[string]*schema.Schema{ + "project": { + Type: schema.TypeString, + Computed: true, + Optional: true, + ForceNew: true, + }, + "location": { + Type: schema.TypeString, + Computed: true, + Optional: true, + ForceNew: true, + }, + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + DiffSuppressFunc: compareSelfLinkOrResourceName, + }, +} + +type CloudRunV2JobIamUpdater struct { + project string + location string + name string + d TerraformResourceData + Config *Config +} + +func CloudRunV2JobIamUpdaterProducer(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("name"); ok { + values["name"] = 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[^/]+)/locations/(?P[^/]+)/jobs/(?P[^/]+)", "(?P[^/]+)/(?P[^/]+)/(?P[^/]+)", "(?P[^/]+)/(?P[^/]+)", "(?P[^/]+)"}, d, config, d.Get("name").(string)) + if err != nil { + return nil, err + } + + for k, v := range m { + values[k] = v + } + + u := &CloudRunV2JobIamUpdater{ + project: values["project"], + location: values["location"], + name: values["name"], + 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("name", u.GetResourceId()); err != nil { + return nil, fmt.Errorf("Error setting name: %s", err) + } + + return u, nil +} + +func CloudRunV2JobIdParseFunc(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[^/]+)/locations/(?P[^/]+)/jobs/(?P[^/]+)", "(?P[^/]+)/(?P[^/]+)/(?P[^/]+)", "(?P[^/]+)/(?P[^/]+)", "(?P[^/]+)"}, d, config, d.Id()) + if err != nil { + return err + } + + for k, v := range m { + values[k] = v + } + + u := &CloudRunV2JobIamUpdater{ + project: values["project"], + location: values["location"], + name: values["name"], + d: d, + Config: config, + } + if err := d.Set("name", u.GetResourceId()); err != nil { + return fmt.Errorf("Error setting name: %s", err) + } + d.SetId(u.GetResourceId()) + return nil +} + +func (u *CloudRunV2JobIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) { + url, err := u.qualifyJobUrl("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 *CloudRunV2JobIamUpdater) 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.qualifyJobUrl("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 *CloudRunV2JobIamUpdater) qualifyJobUrl(methodIdentifier string) (string, error) { + urlTemplate := fmt.Sprintf("{{CloudRunV2BasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/%s/jobs/%s", u.project, u.location, u.name), methodIdentifier) + url, err := replaceVars(u.d, u.Config, urlTemplate) + if err != nil { + return "", err + } + return url, nil +} + +func (u *CloudRunV2JobIamUpdater) GetResourceId() string { + return fmt.Sprintf("projects/%s/locations/%s/jobs/%s", u.project, u.location, u.name) +} + +func (u *CloudRunV2JobIamUpdater) GetMutexKey() string { + return fmt.Sprintf("iam-cloudrunv2-job-%s", u.GetResourceId()) +} + +func (u *CloudRunV2JobIamUpdater) DescribeResource() string { + return fmt.Sprintf("cloudrunv2 job %q", u.GetResourceId()) +} diff --git a/converters/google/resources/iam_cloud_run_v2_service.go b/converters/google/resources/iam_cloud_run_v2_service.go new file mode 100644 index 000000000..6b85e182d --- /dev/null +++ b/converters/google/resources/iam_cloud_run_v2_service.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 CloudRunV2ServiceIamSchema = map[string]*schema.Schema{ + "project": { + Type: schema.TypeString, + Computed: true, + Optional: true, + ForceNew: true, + }, + "location": { + Type: schema.TypeString, + Computed: true, + Optional: true, + ForceNew: true, + }, + "name": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + DiffSuppressFunc: compareSelfLinkOrResourceName, + }, +} + +type CloudRunV2ServiceIamUpdater struct { + project string + location string + name string + d TerraformResourceData + Config *Config +} + +func CloudRunV2ServiceIamUpdaterProducer(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("name"); ok { + values["name"] = 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[^/]+)/locations/(?P[^/]+)/services/(?P[^/]+)", "(?P[^/]+)/(?P[^/]+)/(?P[^/]+)", "(?P[^/]+)/(?P[^/]+)", "(?P[^/]+)"}, d, config, d.Get("name").(string)) + if err != nil { + return nil, err + } + + for k, v := range m { + values[k] = v + } + + u := &CloudRunV2ServiceIamUpdater{ + project: values["project"], + location: values["location"], + name: values["name"], + 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("name", u.GetResourceId()); err != nil { + return nil, fmt.Errorf("Error setting name: %s", err) + } + + return u, nil +} + +func CloudRunV2ServiceIdParseFunc(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[^/]+)/locations/(?P[^/]+)/services/(?P[^/]+)", "(?P[^/]+)/(?P[^/]+)/(?P[^/]+)", "(?P[^/]+)/(?P[^/]+)", "(?P[^/]+)"}, d, config, d.Id()) + if err != nil { + return err + } + + for k, v := range m { + values[k] = v + } + + u := &CloudRunV2ServiceIamUpdater{ + project: values["project"], + location: values["location"], + name: values["name"], + d: d, + Config: config, + } + if err := d.Set("name", u.GetResourceId()); err != nil { + return fmt.Errorf("Error setting name: %s", err) + } + d.SetId(u.GetResourceId()) + return nil +} + +func (u *CloudRunV2ServiceIamUpdater) GetResourceIamPolicy() (*cloudresourcemanager.Policy, error) { + url, err := u.qualifyServiceUrl("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 *CloudRunV2ServiceIamUpdater) 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.qualifyServiceUrl("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 *CloudRunV2ServiceIamUpdater) qualifyServiceUrl(methodIdentifier string) (string, error) { + urlTemplate := fmt.Sprintf("{{CloudRunV2BasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/%s/services/%s", u.project, u.location, u.name), methodIdentifier) + url, err := replaceVars(u.d, u.Config, urlTemplate) + if err != nil { + return "", err + } + return url, nil +} + +func (u *CloudRunV2ServiceIamUpdater) GetResourceId() string { + return fmt.Sprintf("projects/%s/locations/%s/services/%s", u.project, u.location, u.name) +} + +func (u *CloudRunV2ServiceIamUpdater) GetMutexKey() string { + return fmt.Sprintf("iam-cloudrunv2-service-%s", u.GetResourceId()) +} + +func (u *CloudRunV2ServiceIamUpdater) DescribeResource() string { + return fmt.Sprintf("cloudrunv2 service %q", u.GetResourceId()) +} diff --git a/converters/google/resources/resource_converters.go b/converters/google/resources/resource_converters.go index b53fa2ba2..f9af20d52 100644 --- a/converters/google/resources/resource_converters.go +++ b/converters/google/resources/resource_converters.go @@ -117,6 +117,12 @@ func ResourceConverters() map[string][]ResourceConverter { "google_cloud_run_service_iam_policy": {resourceConverterCloudRunServiceIamPolicy()}, "google_cloud_run_service_iam_binding": {resourceConverterCloudRunServiceIamBinding()}, "google_cloud_run_service_iam_member": {resourceConverterCloudRunServiceIamMember()}, + "google_cloud_run_v2_job_iam_policy": {resourceConverterCloudRunV2JobIamPolicy()}, + "google_cloud_run_v2_job_iam_binding": {resourceConverterCloudRunV2JobIamBinding()}, + "google_cloud_run_v2_job_iam_member": {resourceConverterCloudRunV2JobIamMember()}, + "google_cloud_run_v2_service_iam_policy": {resourceConverterCloudRunV2ServiceIamPolicy()}, + "google_cloud_run_v2_service_iam_binding": {resourceConverterCloudRunV2ServiceIamBinding()}, + "google_cloud_run_v2_service_iam_member": {resourceConverterCloudRunV2ServiceIamMember()}, "google_cloud_tasks_queue_iam_policy": {resourceConverterCloudTasksQueueIamPolicy()}, "google_cloud_tasks_queue_iam_binding": {resourceConverterCloudTasksQueueIamBinding()}, "google_cloud_tasks_queue_iam_member": {resourceConverterCloudTasksQueueIamMember()},