Skip to content

Commit bd0e6ff

Browse files
committed
refactor: new exclude variable functionality
1 parent 5da92bc commit bd0e6ff

File tree

8 files changed

+156
-86
lines changed

8 files changed

+156
-86
lines changed

cmd/set/var.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,14 @@ type variableParser struct {
124124
Used map[string]bool
125125
}
126126

127-
func (v *variableParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, vars []*latest.Variable, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
127+
func (v *variableParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
128128
// Find out what vars are really used
129-
varsUsed, err := resolver.FindVariables(rawConfig, vars)
129+
varsUsed, err := resolver.FindVariables(rawConfig)
130130
if err != nil {
131131
return nil, err
132132
}
133133

134-
v.Definitions = vars
134+
v.Definitions = resolver.DefinedVars()
135135
v.Used = varsUsed
136136
return latest.NewRaw(), nil
137137
}

pkg/devspace/config/loader/loader.go

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import (
1212
"github.com/loft-sh/devspace/pkg/devspace/plugin"
1313
"github.com/loft-sh/devspace/pkg/devspace/upgrade"
1414

15-
"github.com/loft-sh/devspace/pkg/devspace/config/loader/expression"
1615
"github.com/loft-sh/devspace/pkg/devspace/config/loader/variable"
16+
"github.com/loft-sh/devspace/pkg/devspace/config/loader/variable/expression"
1717
"github.com/mitchellh/go-homedir"
1818
"github.com/pkg/errors"
1919
"gopkg.in/yaml.v2"
@@ -273,15 +273,6 @@ func (l *configLoader) parseConfig(absPath string, rawConfig map[interface{}]int
273273
options.Profiles = []string{generatedConfig.ActiveProfile}
274274
}
275275

276-
// create a new variable resolver
277-
resolver := l.newVariableResolver(generatedConfig, absPath, options, log)
278-
279-
// parse cli --var's, the resolver will cache them for us
280-
_, err = resolver.ConvertFlags(options.Vars)
281-
if err != nil {
282-
return nil, nil, nil, err
283-
}
284-
285276
// copy raw config
286277
copiedRawConfig, err := copyRaw(rawConfig)
287278
if err != nil {
@@ -300,14 +291,23 @@ func (l *configLoader) parseConfig(absPath string, rawConfig map[interface{}]int
300291
return nil, nil, nil, err
301292
}
302293

294+
// create a new variable resolver
295+
resolver := l.newVariableResolver(generatedConfig, absPath, options, vars, log)
296+
297+
// parse cli --var's, the resolver will cache them for us
298+
_, err = resolver.ConvertFlags(options.Vars)
299+
if err != nil {
300+
return nil, nil, nil, err
301+
}
302+
303303
// prepare profiles
304-
copiedRawConfig, err = prepareProfiles(copiedRawConfig, resolver, filepath.Dir(absPath), vars)
304+
copiedRawConfig, err = prepareProfiles(copiedRawConfig, resolver)
305305
if err != nil {
306306
return nil, nil, nil, err
307307
}
308308

309309
// apply the profiles
310-
copiedRawConfig, err = l.applyProfiles(copiedRawConfig, options, resolver, vars, log)
310+
copiedRawConfig, err = l.applyProfiles(copiedRawConfig, options, resolver, log)
311311
if err != nil {
312312
return nil, nil, nil, err
313313
}
@@ -318,6 +318,9 @@ func (l *configLoader) parseConfig(absPath string, rawConfig map[interface{}]int
318318
return nil, nil, nil, err
319319
}
320320

321+
// update the used vars in the resolver
322+
resolver.UpdateVars(vars)
323+
321324
// validate variables
322325
err = validateVars(vars)
323326
if err != nil {
@@ -328,7 +331,7 @@ func (l *configLoader) parseConfig(absPath string, rawConfig map[interface{}]int
328331
delete(copiedRawConfig, "vars")
329332

330333
// parse the config
331-
latestConfig, err := parser.Parse(rawConfig, copiedRawConfig, vars, resolver, log)
334+
latestConfig, err := parser.Parse(rawConfig, copiedRawConfig, resolver, log)
332335
if err != nil {
333336
return nil, nil, nil, err
334337
}
@@ -440,13 +443,13 @@ func validateProfile(profile interface{}) error {
440443
return nil
441444
}
442445

443-
func prepareProfiles(config map[interface{}]interface{}, resolver variable.Resolver, dir string, vars []*latest.Variable) (map[interface{}]interface{}, error) {
446+
func prepareProfiles(config map[interface{}]interface{}, resolver variable.Resolver) (map[interface{}]interface{}, error) {
444447
rawProfiles := config["profiles"]
445448
if rawProfiles == nil {
446449
return config, nil
447450
}
448451

449-
resolved, err := resolve(rawProfiles, resolver, vars)
452+
resolved, err := resolve(rawProfiles, resolver)
450453
if err != nil {
451454
return nil, err
452455
}
@@ -457,7 +460,7 @@ func prepareProfiles(config map[interface{}]interface{}, resolver variable.Resol
457460
}
458461

459462
for idx, profile := range profiles {
460-
resolvedProfile, err := resolve(profile, resolver, vars)
463+
resolvedProfile, err := resolve(profile, resolver)
461464
if err != nil {
462465
return nil, err
463466
}
@@ -469,7 +472,7 @@ func prepareProfiles(config map[interface{}]interface{}, resolver variable.Resol
469472

470473
// Resolve merge field
471474
if profileMap["merge"] != nil {
472-
merge, err := resolve(profileMap["merge"], resolver, vars)
475+
merge, err := resolve(profileMap["merge"], resolver)
473476
if err != nil {
474477
return nil, err
475478
}
@@ -478,7 +481,7 @@ func prepareProfiles(config map[interface{}]interface{}, resolver variable.Resol
478481

479482
// Resolve patches field
480483
if profileMap["patches"] != nil {
481-
patches, err := resolve(profileMap["patches"], resolver, vars)
484+
patches, err := resolve(profileMap["patches"], resolver)
482485
if err != nil {
483486
return nil, err
484487
}
@@ -487,7 +490,7 @@ func prepareProfiles(config map[interface{}]interface{}, resolver variable.Resol
487490

488491
// Resolve replace field
489492
if profileMap["replace"] != nil {
490-
replace, err := resolve(profileMap["replace"], resolver, vars)
493+
replace, err := resolve(profileMap["replace"], resolver)
491494
if err != nil {
492495
return nil, err
493496
}
@@ -496,7 +499,7 @@ func prepareProfiles(config map[interface{}]interface{}, resolver variable.Resol
496499

497500
// Resolve strategicMerge field
498501
if profileMap["strategicMerge"] != nil {
499-
strategicMerge, err := resolve(profileMap["strategicMerge"], resolver, vars)
502+
strategicMerge, err := resolve(profileMap["strategicMerge"], resolver)
500503
if err != nil {
501504
return nil, err
502505
}
@@ -517,19 +520,19 @@ func prepareProfiles(config map[interface{}]interface{}, resolver variable.Resol
517520
return config, nil
518521
}
519522

520-
func resolve(data interface{}, resolver variable.Resolver, vars []*latest.Variable) (interface{}, error) {
523+
func resolve(data interface{}, resolver variable.Resolver) (interface{}, error) {
521524
_, ok := data.(string)
522525
if !ok {
523526
return data, nil
524527
}
525528

526529
// find and fill variables
527-
return resolver.FillVariables(data, vars)
530+
return resolver.FillVariables(data)
528531
}
529532

530-
func (l *configLoader) applyProfiles(data map[interface{}]interface{}, options *ConfigOptions, resolver variable.Resolver, vars []*latest.Variable, log log.Logger) (map[interface{}]interface{}, error) {
533+
func (l *configLoader) applyProfiles(data map[interface{}]interface{}, options *ConfigOptions, resolver variable.Resolver, log log.Logger) (map[interface{}]interface{}, error) {
531534
// Get profile
532-
profiles, err := versions.ParseProfile(filepath.Dir(l.configPath), data, options.Profiles, options.ProfileRefresh, options.DisableProfileActivation, resolver, vars, log)
535+
profiles, err := versions.ParseProfile(filepath.Dir(l.configPath), data, options.Profiles, options.ProfileRefresh, options.DisableProfileActivation, resolver, log)
533536
if err != nil {
534537
return nil, err
535538
}
@@ -567,15 +570,15 @@ func (l *configLoader) applyProfiles(data map[interface{}]interface{}, options *
567570
return data, nil
568571
}
569572

570-
func (l *configLoader) newVariableResolver(generatedConfig *generated.Config, absPath string, options *ConfigOptions, log log.Logger) variable.Resolver {
573+
func (l *configLoader) newVariableResolver(generatedConfig *generated.Config, absPath string, options *ConfigOptions, vars []*latest.Variable, log log.Logger) variable.Resolver {
571574
return variable.NewResolver(generatedConfig.Vars, &variable.PredefinedVariableOptions{
572575
BasePath: options.BasePath,
573576
ConfigPath: absPath,
574577
KubeContextFlag: options.KubeContext,
575578
NamespaceFlag: options.Namespace,
576579
KubeConfigLoader: l.kubeConfigLoader,
577580
Profile: GetLastProfile(options.Profiles),
578-
}, log)
581+
}, vars, log)
579582
}
580583

581584
func GetLastProfile(profiles []string) string {

pkg/devspace/config/loader/parser.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
)
1111

1212
type Parser interface {
13-
Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, vars []*latest.Variable, resolver variable.Resolver, log log.Logger) (*latest.Config, error)
13+
Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, resolver variable.Resolver, log log.Logger) (*latest.Config, error)
1414
}
1515

1616
func NewDefaultParser() Parser {
@@ -19,11 +19,11 @@ func NewDefaultParser() Parser {
1919

2020
type defaultParser struct{}
2121

22-
func (d *defaultParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, vars []*latest.Variable, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
22+
func (d *defaultParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
2323
// delete the commands, since we don't need it in a normal scenario
2424
delete(rawConfig, "commands")
2525

26-
return fillVariablesAndParse(resolver, rawConfig, vars, log)
26+
return fillVariablesAndParse(resolver, rawConfig, log)
2727
}
2828

2929
func NewWithCommandsParser() Parser {
@@ -32,8 +32,8 @@ func NewWithCommandsParser() Parser {
3232

3333
type withCommandsParser struct{}
3434

35-
func (d *withCommandsParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, vars []*latest.Variable, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
36-
return fillVariablesAndParse(resolver, rawConfig, vars, log)
35+
func (d *withCommandsParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
36+
return fillVariablesAndParse(resolver, rawConfig, log)
3737
}
3838

3939
func NewCommandsParser() Parser {
@@ -42,14 +42,14 @@ func NewCommandsParser() Parser {
4242

4343
type commandsParser struct{}
4444

45-
func (c *commandsParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, vars []*latest.Variable, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
45+
func (c *commandsParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
4646
// modify the config
4747
preparedConfig, err := versions.ParseCommands(rawConfig)
4848
if err != nil {
4949
return nil, err
5050
}
5151

52-
return fillVariablesAndParse(resolver, preparedConfig, vars, log)
52+
return fillVariablesAndParse(resolver, preparedConfig, log)
5353
}
5454

5555
func NewProfilesParser() Parser {
@@ -58,7 +58,7 @@ func NewProfilesParser() Parser {
5858

5959
type profilesParser struct{}
6060

61-
func (p *profilesParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, vars []*latest.Variable, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
61+
func (p *profilesParser) Parse(originalRawConfig map[interface{}]interface{}, rawConfig map[interface{}]interface{}, resolver variable.Resolver, log log.Logger) (*latest.Config, error) {
6262
rawMap, err := copyRaw(originalRawConfig)
6363
if err != nil {
6464
return nil, err
@@ -94,9 +94,11 @@ func (p *profilesParser) Parse(originalRawConfig map[interface{}]interface{}, ra
9494
return retConfig, nil
9595
}
9696

97-
func fillVariablesAndParse(resolver variable.Resolver, preparedConfig map[interface{}]interface{}, vars []*latest.Variable, log log.Logger) (*latest.Config, error) {
98-
// fill in variables again
99-
preparedConfigInterface, err := resolver.FillVariables(preparedConfig, vars)
97+
func fillVariablesAndParse(resolver variable.Resolver, preparedConfig map[interface{}]interface{}, log log.Logger) (*latest.Config, error) {
98+
// fill in variables and expressions (leave out
99+
preparedConfigInterface, err := resolver.FillVariablesExclude(preparedConfig, []string{
100+
//"/deployments/*/helm/values",
101+
})
100102
if err != nil {
101103
return nil, err
102104
}

pkg/devspace/config/loader/expression/expression.go renamed to pkg/devspace/config/loader/variable/expression/expression.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,26 @@ func expressionMatchFn(key, value string) bool {
2020
return ExpressionMatchRegex.MatchString(value)
2121
}
2222

23-
func ResolveAllExpressions(preparedConfig interface{}, dir string) (interface{}, error) {
23+
func ExcludedPath(path string, excluded []*regexp.Regexp) bool {
24+
for _, expr := range excluded {
25+
if expr.MatchString(path) {
26+
return true
27+
}
28+
}
29+
30+
return false
31+
}
32+
33+
func ResolveAllExpressions(preparedConfig interface{}, dir string, exclude []*regexp.Regexp) (interface{}, error) {
2434
switch t := preparedConfig.(type) {
2535
case string:
2636
return ResolveExpressions(t, dir)
2737
case map[interface{}]interface{}:
28-
err := walk.Walk(t, expressionMatchFn, func(_, value string) (interface{}, error) {
38+
err := walk.Walk(t, expressionMatchFn, func(path, value string) (interface{}, error) {
39+
if ExcludedPath(path, exclude) {
40+
return value, nil
41+
}
42+
2943
return ResolveExpressions(value, dir)
3044
})
3145
if err != nil {

0 commit comments

Comments
 (0)