pkg/tfplan2cai/converters/services/resourcemanager/project.go (127 lines of code) (raw):

package resourcemanager import ( "fmt" "strconv" "strings" "github.com/GoogleCloudPlatform/terraform-google-conversion/v6/pkg/caiasset" "github.com/GoogleCloudPlatform/terraform-google-conversion/v6/pkg/tfplan2cai/converters/cai" "github.com/hashicorp/terraform-provider-google-beta/google-beta/tpgresource" transport_tpg "github.com/hashicorp/terraform-provider-google-beta/google-beta/transport" "google.golang.org/api/cloudbilling/v1" "google.golang.org/api/cloudresourcemanager/v1" ) func ResourceConverterProject() cai.ResourceConverter { return cai.ResourceConverter{ Convert: GetProjectAndBillingInfoCaiObjects, } } func GetProjectAndBillingInfoCaiObjects(d tpgresource.TerraformResourceData, config *transport_tpg.Config) ([]caiasset.Asset, error) { if projectAsset, err := GetProjectCaiObject(d, config); err == nil { assets := []caiasset.Asset{projectAsset} if _, ok := d.GetOk("billing_account"); !ok { return assets, nil } else { if billingAsset, err := GetProjectBillingInfoCaiObject(d, config); err == nil { assets = append(assets, billingAsset) return assets, nil } else { return []caiasset.Asset{}, err } } } else { return []caiasset.Asset{}, err } } func GetProjectCaiObject(d tpgresource.TerraformResourceData, config *transport_tpg.Config) (caiasset.Asset, error) { linkTmpl := "//cloudresourcemanager.googleapis.com/projects/{{number}}" name, err := cai.AssetName(d, config, linkTmpl) if err != nil { return caiasset.Asset{}, err } if data, err := GetProjectData(d, config); err == nil { return caiasset.Asset{ Name: name, Type: "cloudresourcemanager.googleapis.com/Project", Resource: &caiasset.AssetResource{ Version: "v1", DiscoveryDocumentURI: "https://cloudresourcemanager.googleapis.com/$discovery/rest?version=v1", DiscoveryName: "Project", Data: data, }, }, nil } else { return caiasset.Asset{}, err } } func GetProjectData(d tpgresource.TerraformResourceData, config *transport_tpg.Config) (map[string]interface{}, error) { pid := d.Get("project_id").(string) project := &cloudresourcemanager.Project{ ProjectId: pid, Name: d.Get("name").(string), } if res, ok := d.GetOk("number"); ok { num, err := strconv.ParseInt(res.(string), 10, 64) if err != nil { return nil, err } project.ProjectNumber = num } if err := getParentResourceId(d, project); err != nil { return nil, err } if _, ok := d.GetOk("effective_labels"); ok { project.Labels = tpgresource.ExpandEffectiveLabels(d) } return cai.JsonMap(project) } func getParentResourceId(d tpgresource.TerraformResourceData, p *cloudresourcemanager.Project) error { orgId := d.Get("org_id").(string) folderId := d.Get("folder_id").(string) if orgId != "" && folderId != "" { return fmt.Errorf("'org_id' and 'folder_id' cannot be both set.") } if orgId != "" { p.Parent = &cloudresourcemanager.ResourceId{ Id: orgId, Type: "organization", } } if folderId != "" { p.Parent = &cloudresourcemanager.ResourceId{ Id: strings.TrimPrefix(folderId, "folders/"), Type: "folder", } } return nil } func GetProjectBillingInfoCaiObject(d tpgresource.TerraformResourceData, config *transport_tpg.Config) (caiasset.Asset, error) { linkTmpl := "//cloudbilling.googleapis.com/projects/{{project_id_or_project}}/billingInfo" name, err := cai.AssetName(d, config, linkTmpl) if err != nil { return caiasset.Asset{}, err } project := strings.Split(name, "/")[4] if data, err := GetProjectBillingInfoData(d, project); err == nil { return caiasset.Asset{ Name: name, Type: "cloudbilling.googleapis.com/ProjectBillingInfo", Resource: &caiasset.AssetResource{ Version: "v1", DiscoveryDocumentURI: "https://cloudbilling.googleapis.com/$discovery/rest", DiscoveryName: "ProjectBillingInfo", Data: data, Location: "global", }, }, nil } else { return caiasset.Asset{}, err } } func GetProjectBillingInfoData(d tpgresource.TerraformResourceData, project string) (map[string]interface{}, error) { ba := &cloudbilling.ProjectBillingInfo{ BillingAccountName: fmt.Sprintf("billingAccounts/%s", d.Get("billing_account")), Name: fmt.Sprintf("projects/%s/billingInfo", project), ProjectId: d.Get("project_id").(string), } return cai.JsonMap(ba) }