aboutsummaryrefslogtreecommitdiffstats
path: root/client/go/internal/admin/prog/spec_env.go
blob: c88ec963812d9a0cb42cf3c23becd8982f6d578f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
// Author: arnej

package prog

import (
	"os"
	"strings"

	"github.com/vespa-engine/vespa/client/go/internal/admin/trace"
)

func (p *Spec) Setenv(k, v string) {
	p.Env[k] = v
}

func (p *Spec) Getenv(k string) string {
	if v, ok := p.Env[k]; ok {
		return v
	}
	return os.Getenv(k)
}

func (spec *Spec) EffectiveEnv() []string {
	envMap := make(map[string]string)
	addToMap := func(kv string) {
		for idx, elem := range kv {
			if elem == '=' {
				k := kv[:idx]
				envMap[k] = kv
				return
			}
		}
		trace.Trace("invalid entry in os.Environ():", kv)
		envMap[kv] = kv
	}
	for _, entry := range os.Environ() {
		addToMap(entry)
	}
	for k, v := range spec.Env {
		trace.Trace("add to environment:", k, "=", v)
		envMap[k] = k + "=" + v
	}
	envVec := make([]string, len(envMap))
	idx := 0
	for _, val := range envMap {
		envVec[idx] = val
		idx++
	}
	return envVec
}

func (spec *Spec) ConsiderFallback(varName, varValue string) {
	if spec.Getenv(varName) == "" && varValue != "" {
		spec.Setenv(varName, varValue)
	}
}

func (spec *Spec) ConsiderEnvFallback(targetVar, fallbackVar string) {
	spec.ConsiderFallback(targetVar, spec.Getenv(fallbackVar))
}

func (p *Spec) MatchesListEnv(envVarName string) bool {
	return p.matchesListString(p.Getenv(envVarName))
}

func (p *Spec) matchesListString(env string) bool {
	if env == "all" {
		trace.Debug(p.Program, "always matching in:", env)
		return true
	}
	parts := strings.Fields(env)
	for _, part := range parts {
		if p.BaseName == part {
			trace.Debug(p.Program, "has basename matching in:", env)
			return true
		}
		trace.Debug("checking matching:", p.BaseName, "!=", part)
	}
	return false
}

func (p *Spec) ValueFromListEnv(envVarName string) string {
	return p.valueFromListString(p.Getenv(envVarName))
}

func (p *Spec) valueFromListString(env string) string {
	parts := strings.Fields(env)
	for _, part := range parts {
		idx := strings.Index(part, "=")
		if idx <= 0 {
			trace.Trace("expected key=value, but got:", part)
			continue
		}
		partName := part[:idx]
		idx++
		partValue := part[idx:]
		if p.BaseName == partName || partName == "all" {
			trace.Debug(p.Program, "has basename matching in:", env)
			return partValue
		}
		trace.Debug("checking matching:", p.BaseName, "!=", part)
	}
	return ""
}