in terraformutils/terraformoutput/hcl.go [27:118]
func OutputHclFiles(resources []terraformutils.Resource, provider terraformutils.ProviderGenerator, path string, serviceName string, isCompact bool, output string, sort bool) error {
if err := os.MkdirAll(path, os.ModePerm); err != nil {
return err
}
providerConfig := map[string]interface{}{
"version": providerwrapper.GetProviderVersion(provider.GetName()),
}
if providerWithSource, ok := provider.(terraformutils.ProviderWithSource); ok {
providerConfig["source"] = providerWithSource.GetSource()
}
// create provider file
providerData := provider.GetProviderData()
providerData["terraform"] = map[string]interface{}{
"required_providers": []map[string]interface{}{{
provider.GetName(): providerConfig,
}},
}
providerDataFile, err := terraformutils.Print(providerData, map[string]struct{}{}, output, sort)
if err != nil {
return err
}
PrintFile(path+"/provider."+GetFileExtension(output), providerDataFile)
// create outputs files
outputs := map[string]interface{}{}
outputsByResource := map[string]map[string]interface{}{}
for i, r := range resources {
outputState := map[string]*terraform.OutputState{}
outputsByResource[r.InstanceInfo.Type+"_"+r.ResourceName+"_"+r.GetIDKey()] = map[string]interface{}{
"value": "${" + r.InstanceInfo.Type + "." + r.ResourceName + "." + r.GetIDKey() + "}",
}
outputState[r.InstanceInfo.Type+"_"+r.ResourceName+"_"+r.GetIDKey()] = &terraform.OutputState{
Type: "string",
Value: r.InstanceState.Attributes[r.GetIDKey()],
}
for _, v := range provider.GetResourceConnections() {
for k, ids := range v {
if (serviceName != "" && k == serviceName) || (serviceName == "" && k == r.ServiceName()) {
if _, exist := r.InstanceState.Attributes[ids[1]]; exist {
key := ids[1]
if ids[1] == "self_link" || ids[1] == "id" {
key = r.GetIDKey()
}
linkKey := r.InstanceInfo.Type + "_" + r.ResourceName + "_" + key
outputsByResource[linkKey] = map[string]interface{}{
"value": "${" + r.InstanceInfo.Type + "." + r.ResourceName + "." + key + "}",
}
outputState[linkKey] = &terraform.OutputState{
Type: "string",
Value: r.InstanceState.Attributes[ids[1]],
}
}
}
}
}
resources[i].Outputs = outputState
}
if len(outputsByResource) > 0 {
outputs["output"] = outputsByResource
outputsFile, err := terraformutils.Print(outputs, map[string]struct{}{}, output, sort)
if err != nil {
return err
}
PrintFile(path+"/outputs."+GetFileExtension(output), outputsFile)
}
// group by resource by type
typeOfServices := map[string][]terraformutils.Resource{}
for _, r := range resources {
typeOfServices[r.InstanceInfo.Type] = append(typeOfServices[r.InstanceInfo.Type], r)
}
if isCompact {
err := printFile(resources, "resources", path, output, sort)
if err != nil {
return err
}
} else {
for k, v := range typeOfServices {
fileName := strings.ReplaceAll(k, strings.Split(k, "_")[0]+"_", "")
err := printFile(v, fileName, path, output, sort)
if err != nil {
return err
}
}
}
return nil
}