11package evaluator
22
33import (
4+ "os"
45 "reflect"
6+ "strings"
57
68 "fmt"
79
@@ -31,13 +33,19 @@ func detectVariables(templates map[string]*hclast.File, varfile []*hclast.File)
3133 if err := hcl .DecodeObject (& variables , template .Node .(* hclast.ObjectList ).Filter ("variable" )); err != nil {
3234 return nil , err
3335 }
36+ envVars , err := decodeEnvVars (variables )
37+ if err != nil {
38+ return nil , err
39+ }
3440 tfvars , err := decodeTFVars (varfile )
3541 if err != nil {
3642 return nil , err
3743 }
3844
3945 for _ , v := range variables {
40- if overriddenVariable (v , tfvars ); v .Default == nil {
46+ overriddenVariable (v , envVars )
47+ overriddenVariable (v , tfvars )
48+ if v .Default == nil {
4149 continue
4250 }
4351 varName := "var." + v .Name
@@ -61,6 +69,44 @@ func decodeTFVars(varfile []*hclast.File) ([]map[string]interface{}, error) {
6169 return result , nil
6270}
6371
72+ func decodeEnvVars (variables []* hclVariable ) ([]map [string ]interface {}, error ) {
73+ result := []map [string ]interface {}{}
74+
75+ for _ , e := range os .Environ () {
76+ idx := strings .Index (e , "=" )
77+ envKey := e [:idx ]
78+ envVal := e [idx + 1 :]
79+
80+ if strings .HasPrefix (envKey , "TF_VAR_" ) {
81+ varName := strings .Replace (envKey , "TF_VAR_" , "" , 1 )
82+ for _ , v := range variables {
83+ if v .Name != varName {
84+ continue
85+ }
86+
87+ var varType string
88+ if v .DeclaredType == "" {
89+ varType = deduceType (v .Default )
90+ } else {
91+ varType = v .DeclaredType
92+ }
93+
94+ if varType == HCL_STRING_VARTYPE {
95+ envVal = fmt .Sprintf ("\" %s\" " , envVal )
96+ }
97+
98+ var r map [string ]interface {}
99+ if err := hcl .Decode (& r , fmt .Sprintf ("%s = %s" , varName , envVal )); err != nil {
100+ return nil , err
101+ }
102+ result = append (result , r )
103+ }
104+ }
105+ }
106+
107+ return result , nil
108+ }
109+
64110func overriddenVariable (v * hclVariable , tfvars []map [string ]interface {}) {
65111 for _ , vars := range tfvars {
66112 val := vars [v .Name ]
@@ -83,8 +129,13 @@ func overriddenVariable(v *hclVariable, tfvars []map[string]interface{}) {
83129 }
84130}
85131
86- func parseVariable (val interface {}, varType string ) hilast.Variable {
87- // varType is overwrite invariably. Because, happen panic when used in incorrect type
132+ func deduceType (val interface {}) string {
133+ if val == nil {
134+ return HCL_STRING_VARTYPE
135+ }
136+
137+ var varType string
138+
88139 switch reflect .TypeOf (val ).Kind () {
89140 case reflect .String :
90141 varType = HCL_STRING_VARTYPE
@@ -96,6 +147,13 @@ func parseVariable(val interface{}, varType string) hilast.Variable {
96147 varType = HCL_STRING_VARTYPE
97148 }
98149
150+ return varType
151+ }
152+
153+ func parseVariable (val interface {}, varType string ) hilast.Variable {
154+ // varType is overwrite invariably. Because, happen panic when used in incorrect type
155+ varType = deduceType (val )
156+
99157 var hilVar hilast.Variable
100158 switch varType {
101159 case HCL_STRING_VARTYPE :
0 commit comments