Skip to content

Commit

Permalink
Reverse the eval order of config and variable blocks
Browse files Browse the repository at this point in the history
`config` blocks are now evaluated earlier than `variable`, which allows `variable` block to access config values
  • Loading branch information
mumoshu committed Apr 25, 2020
1 parent 65dad94 commit 8308b6f
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 39 deletions.
10 changes: 9 additions & 1 deletion examples/config/config.variant
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,18 @@ job "config view" {
}
}

variable "var1" {
value = conf.foo
}

exec {
command = "echo"
args = [
jsonencode(conf.foo)
<<EOS
${jsonencode(conf.foo)}
${jsonencode(var.var1)}
EOS
,
]
}
}
8 changes: 4 additions & 4 deletions examples/config/config_test.variant
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ test "app deploy" {
env = "prod"
exitstatus = 0
err = ""
out = trimspace(<<EOS
out = <<EOS
{"app":"app1","bar":"OPT1","env":"prod","getfoo":"app_override,prod,PARAM1","v":"app1prod"}
{"app":"app1","bar":"OPT1","env":"prod","getfoo":"app_override,prod,PARAM1","v":"app1prod"}
EOS
)
}

case "app2prod" {
app = "app2"
env = "prod"
exitstatus = 0
err = ""
out = trimspace(<<EOS
out = <<EOS
{"app":"app2","bar":"OPT1","env":"prod","getfoo":"app_override,prod,PARAM1","v":"app2"}
{"app":"app2","bar":"OPT1","env":"prod","getfoo":"app_override,prod,PARAM1","v":"app2"}
EOS
)
}

// missing env "test"
Expand Down
73 changes: 39 additions & 34 deletions pkg/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package app
import (
"flag"
"fmt"
"github.com/variantdev/vals"
"io/ioutil"
"os"
"os/exec"
Expand Down Expand Up @@ -31,7 +32,6 @@ import (
"github.com/pkg/errors"
"github.com/variantdev/dag/pkg/dag"
"github.com/variantdev/mod/pkg/shell"
"github.com/variantdev/vals"
"github.com/zclconf/go-cty/cty"
"github.com/zclconf/go-cty/cty/gocty"
)
Expand Down Expand Up @@ -144,28 +144,6 @@ func (app *App) Job(l *EventLogger, cmd string, args map[string]interface{}, opt
}
}

conf, err := app.getConfigs(jobCtx, cc, j, "config", func(j JobSpec) []Config { return j.Configs }, nil)
if err != nil {
return nil, err
}

jobEvalCtx.Variables["conf"] = conf

secretRefsEvaluator, err := vals.New(vals.Options{CacheSize: 100})
if err != nil {
return nil, fmt.Errorf("failed to initialize vals: %v", err)
}

sec, err := app.getConfigs(jobCtx, cc, j, "secret", func(j JobSpec) []Config { return j.Secrets }, func(m map[string]interface{}) (map[string]interface{}, error) {
return secretRefsEvaluator.Eval(m)
})

if err != nil {
return nil, err
}

jobEvalCtx.Variables["sec"] = sec

needs := map[string]cty.Value{}

var concurrency int
Expand Down Expand Up @@ -1213,7 +1191,7 @@ func (app *App) createJobContext(cc *HCL2Config, j JobSpec, givenParams map[stri
}

varSpecs := append(append([]Variable{}, cc.Variables...), j.Variables...)
varCtx := &hcl2.EvalContext{
modCtx := &hcl2.EvalContext{
Functions: conf.Functions("."),
Variables: map[string]cty.Value{
"param": cty.ObjectVal(params),
Expand All @@ -1222,17 +1200,13 @@ func (app *App) createJobContext(cc *HCL2Config, j JobSpec, givenParams map[stri
},
}

jobCtx, err := addVariables(varCtx, varSpecs)
mod, err := getModule(modCtx, cc.Module, j.Module)
if err != nil {
return nil, err
}

mod, err := getModule(jobCtx, cc.Module, j.Module)
if err != nil {
return nil, err
}

jobCtx.Variables["mod"] = mod
confEvalCtx := cloneEvalContext(modCtx)
confEvalCtx.Variables["mod"] = mod

globalArgs := map[string]interface{}{}

Expand All @@ -1258,10 +1232,41 @@ func (app *App) createJobContext(cc *HCL2Config, j JobSpec, givenParams map[stri
globalArgs[k] = v
}

return &JobContext{
evalContext: jobCtx,
confJobCtx := &JobContext{
evalContext: confEvalCtx,
globalArgs: globalArgs,
}, nil
}

conf, err := app.getConfigs(confJobCtx, cc, j, "config", func(j JobSpec) []Config { return j.Configs }, nil)
if err != nil {
return nil, err
}

secJobCtx := confJobCtx.WithVariable("conf", conf).Ptr()

secretRefsEvaluator, err := vals.New(vals.Options{CacheSize: 100})
if err != nil {
return nil, fmt.Errorf("failed to initialize vals: %v", err)
}

sec, err := app.getConfigs(secJobCtx, cc, j, "secret", func(j JobSpec) []Config { return j.Secrets }, func(m map[string]interface{}) (map[string]interface{}, error) {
return secretRefsEvaluator.Eval(m)
})

if err != nil {
return nil, err
}

varJobCtx := secJobCtx.WithVariable("sec", sec)

varCtx, err := addVariables(varJobCtx.evalContext, varSpecs)
if err != nil {
return nil, err
}

jobCtx := varJobCtx.WithEvalContext(varCtx).Ptr()

return jobCtx, nil
}

func (app *App) getConfigs(jobCtx *JobContext, cc *HCL2Config, j JobSpec, confType string, f func(JobSpec) []Config, g func(map[string]interface{}) (map[string]interface{}, error)) (cty.Value, error) {
Expand Down

0 comments on commit 8308b6f

Please sign in to comment.