diff --git a/pkg/terraform/executor.go b/pkg/terraform/executor.go index f6900f0c6..3b1b651a9 100644 --- a/pkg/terraform/executor.go +++ b/pkg/terraform/executor.go @@ -44,6 +44,8 @@ const ( failFileSuffix = ".fail" requiredVersion = ">= 0.12, < 0.13" + + noOfLinesOnError = 20 ) // ErrBinaryNotFound denotes the fact that the Terraform binary could not be @@ -211,22 +213,55 @@ func (ex *Executor) execute(verbose bool, args ...string) error { wg.Add(1) go tailFile(p, done, &wg) + } else { + fmt.Printf("\nYou can find the logs in %q\n", p) } wg.Wait() s, err := ex.Status(pid) if err != nil { + if !verbose { + showError(p, noOfLinesOnError) + } return fmt.Errorf("failed checking execution status: %w", err) } if s != ExecutionStatusSuccess { + if !verbose { + showError(p, noOfLinesOnError) + } return fmt.Errorf("executing Terraform failed, check %s for details", p) } return nil } +func showError(path string, noOfLines int) { + // nolint: gosec + data, err := ioutil.ReadFile(path) + if err != nil { + fmt.Printf("error reading file: %v", err) + return + } + + text := string(data) + lines := strings.Split(text, "\n") + + // Deletion by one is done here to adjust the difference between the user provided number which + // starts counting from 1 and array indices which start counting from 0. + // nolint: gomnd + offset := len(lines) - noOfLines - 1 + + if offset > 0 { + lines = lines[offset:] + } + + for _, line := range lines { + fmt.Println(line) + } +} + // LoadVars is a convenience function to load the tfvars file into memory // as a JSON object. func (ex *Executor) LoadVars() (map[string]interface{}, error) {