Skip to content

Commit

Permalink
use json for variable related things in run_shell task
Browse files Browse the repository at this point in the history
  • Loading branch information
pk910 committed Feb 5, 2024
1 parent 376c498 commit 2e8b023
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 3 deletions.
24 changes: 21 additions & 3 deletions pkg/coordinator/tasks/run_shell/task.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,23 @@ func (t *Task) Execute(ctx context.Context) error {

// add env vars
for envName, varName := range t.config.EnvVars {
varValue, varFound := t.ctx.Vars.LookupVar(varName)
varValue, varFound, err2 := t.ctx.Vars.ResolveQuery(varName)
if err2 != nil {
cmdLogger.Errorf("failed parsing var query for env variable %v: %v", envName, err2)
return err2
}

if !varFound {
continue
}

command.Env = append(command.Env, fmt.Sprintf("%v=%v", envName, varValue))
varJSON, err3 := json.Marshal(varValue)
if err3 != nil {
cmdLogger.Errorf("failed encoding env variable %v: %v", envName, err3)
return err3
}

command.Env = append(command.Env, fmt.Sprintf("%v=%v", envName, string(varJSON)))
}

// start shell
Expand Down Expand Up @@ -197,9 +208,16 @@ func (t *Task) readOutputStream(pipe io.ReadCloser) chan string {
}

var outputVarPattern = regexp.MustCompile(`^::set-var +([^ ]+) +(.*)$`)
var outputJSONPattern = regexp.MustCompile(`^::set-json +([^ ]+) +(.*)$`)

func (t *Task) parseOutputVars(line string) {
match := outputVarPattern.FindStringSubmatch(line)
if match != nil {
t.ctx.Vars.SetVar(match[1], match[2])
t.logger.Infof("set variable %v: (string) %v", match[1], match[2])
}

match = outputJSONPattern.FindStringSubmatch(line)
if match != nil {
var varValue interface{}

Expand All @@ -208,7 +226,7 @@ func (t *Task) parseOutputVars(line string) {
t.logger.Warnf("error parsing ::set-var expression: %v", err.Error())
} else {
t.ctx.Vars.SetVar(match[1], varValue)
t.logger.Infof("set variable %v: %v", match[1], varValue)
t.logger.Infof("set variable %v: (json) %v", match[1], varValue)
}
}
}
1 change: 1 addition & 0 deletions pkg/coordinator/types/vars.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package types
type Variables interface {
GetVar(name string) interface{}
LookupVar(name string) (interface{}, bool)
ResolveQuery(query string) (interface{}, bool, error)
SetVar(name string, value interface{})
NewScope() Variables
GetVarsMap() map[string]any
Expand Down
23 changes: 23 additions & 0 deletions pkg/coordinator/vars/variables.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,29 @@ func (v *Variables) GetVarsMap() map[string]any {
return varsMap
}

func (v *Variables) ResolveQuery(queryStr string) (interface{}, bool, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

varsMap := v.GetVarsMap()
queryStr = fmt.Sprintf(".%v", queryStr)

query, err := gojq.Parse(queryStr)
if err != nil {
return nil, false, fmt.Errorf("could not parse variable query '%v': %v", queryStr, err)
}

iter := query.RunWithContext(ctx, varsMap)

val, ok := iter.Next()
if !ok {
// no query result, skip variable assignment
return nil, false, nil
}

return val, true, nil
}

func (v *Variables) ConsumeVars(config interface{}, consumeMap map[string]string) error {
applyMap := map[string]interface{}{}

Expand Down

0 comments on commit 2e8b023

Please sign in to comment.