pkg/cai2hcl/converters/services/resourcemanager/project.go (54 lines of code) (raw):
package resourcemanager
import (
"fmt"
"strings"
"github.com/GoogleCloudPlatform/terraform-google-conversion/v6/pkg/cai2hcl/converters/utils"
"github.com/GoogleCloudPlatform/terraform-google-conversion/v6/pkg/cai2hcl/models"
"github.com/GoogleCloudPlatform/terraform-google-conversion/v6/pkg/caiasset"
tfschema "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// ProjectAssetType is the CAI asset type name for project.
const ProjectAssetType string = "cloudresourcemanager.googleapis.com/Project"
// ProjectSchemaName is the TF resource schema name for resourcemanager project.
const ProjectSchemaName string = "google_project"
// ProjectConverter for compute project resource.
type ProjectConverter struct {
name string
schema map[string]*tfschema.Schema
}
// NewProjectConverter returns an HCL converter for compute project.
func NewProjectConverter(provider *tfschema.Provider) models.Converter {
schema := provider.ResourcesMap[ProjectSchemaName].Schema
return &ProjectConverter{
name: ProjectSchemaName,
schema: schema,
}
}
// Convert converts asset resource data.
func (c *ProjectConverter) Convert(asset caiasset.Asset) ([]*models.TerraformResourceBlock, error) {
var blocks []*models.TerraformResourceBlock
block, err := c.convertResourceData(asset)
if err != nil {
return nil, err
}
blocks = append(blocks, block)
return blocks, nil
}
func (c *ProjectConverter) convertResourceData(asset caiasset.Asset) (*models.TerraformResourceBlock, error) {
if asset.Resource == nil || asset.Resource.Data == nil {
return nil, fmt.Errorf("asset resource data is nil")
}
assetResourceData := asset.Resource.Data
hclData := make(map[string]interface{})
hclData["name"] = assetResourceData["name"]
hclData["project_id"] = assetResourceData["projectId"]
hclData["labels"] = utils.RemoveTerraformAttributionLabel(assetResourceData["labels"])
if strings.Contains(asset.Resource.Parent, "folders/") {
hclData["folder_id"] = utils.ParseFieldValue(asset.Resource.Parent, "folders")
} else if strings.Contains(asset.Resource.Parent, "organizations/") {
hclData["org_id"] = utils.ParseFieldValue(asset.Resource.Parent, "organizations")
}
ctyVal, err := utils.MapToCtyValWithSchema(hclData, c.schema)
if err != nil {
return nil, err
}
return &models.TerraformResourceBlock{
Labels: []string{c.name, assetResourceData["projectId"].(string)},
Value: ctyVal,
}, nil
}