@@ -4,17 +4,24 @@ import (
4
4
"bytes"
5
5
"fmt"
6
6
"io"
7
+ "log"
7
8
"os"
8
9
"os/exec"
10
+ "strings"
9
11
)
10
12
11
13
type Terragrunt struct {
12
14
WorkingDir string
13
15
}
14
16
15
17
func (terragrunt Terragrunt ) Init (params []string , envs map [string ]string ) (string , string , error ) {
16
- return terragrunt .runTerragruntCommand ("init" , true , envs , params ... )
18
+
19
+ stdout , stderr , exitCode , err := terragrunt .runTerragruntCommand ("init" , true , envs , params ... )
20
+ if exitCode != 0 {
21
+ logCommandFail (exitCode , err )
22
+ }
17
23
24
+ return stdout , stderr , err
18
25
}
19
26
20
27
func (terragrunt Terragrunt ) Apply (params []string , plan * string , envs map [string ]string ) (string , string , error ) {
@@ -23,41 +30,58 @@ func (terragrunt Terragrunt) Apply(params []string, plan *string, envs map[strin
23
30
if plan != nil {
24
31
params = append (params , * plan )
25
32
}
26
- stdout , stderr , err := terragrunt .runTerragruntCommand ("apply" , true , envs , params ... )
33
+ stdout , stderr , exitCode , err := terragrunt .runTerragruntCommand ("apply" , true , envs , params ... )
34
+ if exitCode != 0 {
35
+ logCommandFail (exitCode , err )
36
+ }
37
+
27
38
return stdout , stderr , err
28
39
}
29
40
30
41
func (terragrunt Terragrunt ) Destroy (params []string , envs map [string ]string ) (string , string , error ) {
31
42
params = append (params , "--auto-approve" )
32
43
params = append (params , "--terragrunt-non-interactive" )
33
- stdout , stderr , err := terragrunt .runTerragruntCommand ("destroy" , true , envs , params ... )
44
+ stdout , stderr , exitCode , err := terragrunt .runTerragruntCommand ("destroy" , true , envs , params ... )
45
+ if exitCode != 0 {
46
+ logCommandFail (exitCode , err )
47
+ }
48
+
49
+
34
50
return stdout , stderr , err
35
51
}
36
52
37
53
func (terragrunt Terragrunt ) Plan (params []string , envs map [string ]string ) (bool , string , string , error ) {
38
- stdout , stderr , err := terragrunt .runTerragruntCommand ("plan" , true , envs , params ... )
54
+ stdout , stderr , exitCode , err := terragrunt .runTerragruntCommand ("plan" , true , envs , params ... )
55
+ if exitCode != 0 {
56
+ logCommandFail (exitCode , err )
57
+ }
58
+
39
59
return true , stdout , stderr , err
40
60
}
41
61
42
62
func (terragrunt Terragrunt ) Show (params []string , envs map [string ]string ) (string , string , error ) {
43
- stdout , stderr , err := terragrunt .runTerragruntCommand ("show" , false , envs , params ... )
63
+ stdout , stderr , exitCode , err := terragrunt .runTerragruntCommand ("show" , false , envs , params ... )
64
+ if exitCode != 0 {
65
+ logCommandFail (exitCode , err )
66
+ }
67
+
44
68
return stdout , stderr , err
45
69
}
46
70
47
- func (terragrunt Terragrunt ) runTerragruntCommand (command string , printOutputToStdout bool , envs map [string ]string , arg ... string ) (string , string , error ) {
71
+ func (terragrunt Terragrunt ) runTerragruntCommand (command string , printOutputToStdout bool , envs map [string ]string , arg ... string ) (stdOut string , stdErr string , exitCode int , err error ) {
48
72
args := []string {command }
49
73
args = append (args , arg ... )
50
- cmd := exec .Command ("terragrunt" , args ... )
51
- cmd .Dir = terragrunt .WorkingDir
52
-
53
- env := os .Environ ()
54
- env = append (env , "TF_CLI_ARGS=-no-color" )
55
- env = append (env , "TF_IN_AUTOMATION=true" )
56
74
57
- for k , v := range envs {
58
- env = append (env , fmt .Sprintf ("%s=%s" , k , v ))
75
+ expandedArgs := make ([]string , 0 )
76
+ for _ , p := range args {
77
+ s := os .ExpandEnv (p )
78
+ s = strings .TrimSpace (s )
79
+ if s != "" {
80
+ expandedArgs = append (expandedArgs , s )
81
+ }
59
82
}
60
83
84
+ // Set up common output buffers
61
85
var mwout , mwerr io.Writer
62
86
var stdout , stderr bytes.Buffer
63
87
if printOutputToStdout {
@@ -68,15 +92,22 @@ func (terragrunt Terragrunt) runTerragruntCommand(command string, printOutputToS
68
92
mwerr = io .Writer (& stderr )
69
93
}
70
94
71
- cmd . Env = env
72
- cmd . Stdout = mwout
73
- cmd .Stderr = mwerr
95
+ cmd := exec . Command ( "terragrunt" , args ... )
96
+ log . Printf ( "Running command: terragrunt %v" , expandedArgs )
97
+ cmd .Dir = terragrunt . WorkingDir
74
98
75
- err := cmd .Run ()
99
+ env := os .Environ ()
100
+ env = append (env , "TF_CLI_ARGS=-no-color" )
101
+ env = append (env , "TF_IN_AUTOMATION=true" )
76
102
77
- if err != nil {
78
- return stdout . String (), stderr . String () , fmt .Errorf ( "error: %v " , err )
103
+ for k , v := range envs {
104
+ env = append ( env , fmt .Sprintf ( "%s=%s " , k , v ) )
79
105
}
80
106
81
- return stdout .String (), stderr .String (), err
107
+ cmd .Env = env
108
+ cmd .Stdout = mwout
109
+ cmd .Stderr = mwerr
110
+
111
+ err = cmd .Run ()
112
+ return stdout .String (), stderr .String (), cmd .ProcessState .ExitCode (), err
82
113
}
0 commit comments