| package genconfig |
| |
| import ( |
| "fmt" |
| "io" |
| "os" |
| |
| "github.com/hashicorp/terraform/internal/tfdiags" |
| ) |
| |
| func ShouldWriteConfig(out string) bool { |
| // No specified out file, so don't write anything. |
| return len(out) != 0 |
| } |
| |
| func ValidateTargetFile(out string) (diags tfdiags.Diagnostics) { |
| if _, err := os.Stat(out); !os.IsNotExist(err) { |
| diags = diags.Append(tfdiags.Sourceless( |
| tfdiags.Error, |
| "Target generated file already exists", |
| "Terraform can only write generated config into a new file. Either choose a different target location or move all existing configuration out of the target file, delete it and try again.")) |
| |
| } |
| return diags |
| } |
| |
| type Change struct { |
| Addr string |
| ImportID string |
| GeneratedConfig string |
| } |
| |
| func (c *Change) MaybeWriteConfig(writer io.Writer, out string) (io.Writer, bool, tfdiags.Diagnostics) { |
| var wroteConfig bool |
| var diags tfdiags.Diagnostics |
| if len(c.GeneratedConfig) > 0 { |
| if writer == nil { |
| // Lazily create the generated file, in case we have no |
| // generated config to create. |
| if w, err := os.Create(out); err != nil { |
| if os.IsPermission(err) { |
| diags = diags.Append(tfdiags.Sourceless( |
| tfdiags.Error, |
| "Failed to create target generated file", |
| fmt.Sprintf("Terraform did not have permission to create the generated file (%s) in the target directory. Please modify permissions over the target directory, and try again.", out))) |
| return nil, false, diags |
| } |
| |
| diags = diags.Append(tfdiags.Sourceless( |
| tfdiags.Error, |
| "Failed to create target generated file", |
| fmt.Sprintf("Terraform could not create the generated file (%s) in the target directory: %v. Depending on the error message, this may be a bug in Terraform itself. If so, please report it!", out, err))) |
| return nil, false, diags |
| } else { |
| writer = w |
| } |
| |
| header := "# __generated__ by Terraform\n# Please review these resources and move them into your main configuration files.\n" |
| // Missing the header from the file, isn't the end of the world |
| // so if this did return an error, then we will just ignore it. |
| _, _ = writer.Write([]byte(header)) |
| } |
| |
| header := "\n# __generated__ by Terraform" |
| if len(c.ImportID) > 0 { |
| header += fmt.Sprintf(" from %q", c.ImportID) |
| } |
| header += "\n" |
| if _, err := writer.Write([]byte(fmt.Sprintf("%s%s\n", header, c.GeneratedConfig))); err != nil { |
| diags = diags.Append(tfdiags.Sourceless( |
| tfdiags.Warning, |
| "Failed to save generated config", |
| fmt.Sprintf("Terraform encountered an error while writing generated config: %v. The config for %s must be created manually before applying. Depending on the error message, this may be a bug in Terraform itself. If so, please report it!", err, c.Addr))) |
| } |
| wroteConfig = true |
| } |
| |
| return writer, wroteConfig, diags |
| } |