Skip to content

Commit 1eb9eb3

Browse files
authored
Merge pull request #2166 from FabianKramm/print-feat
feat: add DEVSPACE_EXECUTABLE environment variable
2 parents 42bed82 + 5d503c3 commit 1eb9eb3

5 files changed

Lines changed: 49 additions & 21 deletions

File tree

cmd/list/vars.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ func (cmd *varsCmd) RunListVars(f factory.Factory, cobraCmd *cobra.Command, args
8080
fmt.Sprintf("%v", value),
8181
})
8282
}
83+
sort.Slice(varRow, func(i, j int) bool {
84+
return varRow[i][0] < varRow[j][0]
85+
})
8386

8487
// No variable found
8588
if len(varRow) == 0 {

cmd/print.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/sirupsen/logrus"
1515
"io"
1616
"os"
17+
"sort"
1718

1819
"github.com/loft-sh/devspace/cmd/flags"
1920
"github.com/loft-sh/devspace/pkg/util/factory"
@@ -194,6 +195,9 @@ func printExtraInfo(config config.Config, dependencies []types.Dependency, log l
194195
fmt.Sprintf("%v", varValue),
195196
})
196197
}
198+
sort.Slice(values, func(i, j int) bool {
199+
return values[i][0] < values[j][0]
200+
})
197201

198202
if len(values) > 0 {
199203
logger.PrintTable(log, headerColumnNames, values)

pkg/devspace/config/loader/variable/predefined_variable.go

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import (
88
"fmt"
99
"github.com/loft-sh/devspace/pkg/devspace/context/values"
1010
"github.com/loft-sh/devspace/pkg/devspace/kubectl"
11+
"github.com/loft-sh/devspace/pkg/util/downloader"
12+
"github.com/loft-sh/devspace/pkg/util/downloader/commands"
13+
"github.com/loft-sh/devspace/pkg/util/log"
14+
"github.com/sirupsen/logrus"
1115
"os"
1216
"path/filepath"
1317
"strconv"
@@ -30,44 +34,60 @@ type PredefinedVariableOptions struct {
3034
}
3135

3236
// PredefinedVariableFunction is the definition of a predefined variable
33-
type PredefinedVariableFunction func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error)
37+
type PredefinedVariableFunction func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error)
3438

3539
// predefinedVars holds all predefined variables that can be used in the config
3640
var predefinedVars = map[string]PredefinedVariableFunction{
37-
"DEVSPACE_NAME": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
41+
"DEVSPACE_NAME": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
3842
name, ok := values.NameFrom(ctx)
3943
if !ok {
4044
return "", nil
4145
}
4246
return name, nil
4347
},
44-
"DEVSPACE_TMPDIR": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
48+
"DEVSPACE_EXECUTABLE": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
49+
ex, err := os.Executable()
50+
if err != nil {
51+
return nil, err
52+
}
53+
return ex, nil
54+
},
55+
"DEVSPACE_KUBECTL_EXECUTABLE": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
56+
debugLog := log.WithLevel(logrus.DebugLevel)
57+
path, err := downloader.NewDownloader(commands.NewKubectlCommand(), debugLog).EnsureCommand(ctx)
58+
if err != nil {
59+
debugLog.Debugf("Error downloading kubectl: %v", err)
60+
return "", nil
61+
}
62+
return path, nil
63+
},
64+
"DEVSPACE_TMPDIR": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
4565
tempFolder, ok := values.TempFolderFrom(ctx)
4666
if !ok {
4767
return os.TempDir(), nil
4868
}
4969
return tempFolder, nil
5070
},
51-
"DEVSPACE_VERSION": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
71+
"DEVSPACE_VERSION": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
5272
return upgrade.GetVersion(), nil
5373
},
54-
"DEVSPACE_RANDOM": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
74+
"DEVSPACE_RANDOM": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
5575
return randutil.GenerateRandomString(6), nil
5676
},
57-
"DEVSPACE_PROFILE": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
77+
"DEVSPACE_PROFILE": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
5878
return options.Profile, nil
5979
},
60-
"DEVSPACE_USER_HOME": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
80+
"DEVSPACE_USER_HOME": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
6181
homeDir, err := homedir.Dir()
6282
if err != nil {
6383
return nil, err
6484
}
6585
return homeDir, nil
6686
},
67-
"DEVSPACE_TIMESTAMP": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
87+
"DEVSPACE_TIMESTAMP": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
6888
return strconv.FormatInt(time.Now().Unix(), 10), nil
6989
},
70-
"DEVSPACE_GIT_BRANCH": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
90+
"DEVSPACE_GIT_BRANCH": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
7191
configPath := options.ConfigPath
7292
branch, err := git.GetBranch(filepath.Dir(configPath))
7393
if err != nil {
@@ -76,7 +96,7 @@ var predefinedVars = map[string]PredefinedVariableFunction{
7696

7797
return branch, nil
7898
},
79-
"DEVSPACE_GIT_COMMIT": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
99+
"DEVSPACE_GIT_COMMIT": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
80100
configPath := options.ConfigPath
81101
hash, err := git.GetHash(ctx, filepath.Dir(configPath))
82102
if err != nil {
@@ -85,14 +105,14 @@ var predefinedVars = map[string]PredefinedVariableFunction{
85105

86106
return hash[:8], nil
87107
},
88-
"DEVSPACE_CONTEXT": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
108+
"DEVSPACE_CONTEXT": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
89109
if options.KubeClient == nil {
90110
return "", nil
91111
}
92112

93113
return options.KubeClient.CurrentContext(), nil
94114
},
95-
"DEVSPACE_NAMESPACE": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
115+
"DEVSPACE_NAMESPACE": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
96116
if options.KubeClient == nil {
97117
return "", nil
98118
}
@@ -126,7 +146,7 @@ func AddPredefinedVars(plugins []plugin.Metadata) {
126146
pluginFolder := p.PluginFolder
127147
for _, variable := range p.Vars {
128148
v := variable
129-
predefinedVars[variable.Name] = func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
149+
predefinedVars[variable.Name] = func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
130150
args, err := json.Marshal(os.Args)
131151
if err != nil {
132152
return "", err
@@ -148,20 +168,22 @@ func AddPredefinedVars(plugins []plugin.Metadata) {
148168

149169
// NewPredefinedVariable creates a new predefined variable for the given name or fails if there
150170
// is none with the given name
151-
func NewPredefinedVariable(name string, options *PredefinedVariableOptions) (Variable, error) {
171+
func NewPredefinedVariable(name string, options *PredefinedVariableOptions, log log.Logger) (Variable, error) {
152172
if _, ok := predefinedVars[name]; !ok {
153173
return nil, errors.New("predefined variable " + name + " not found")
154174
}
155175

156176
return &predefinedVariable{
157177
name: name,
158178
options: options,
179+
log: log,
159180
}, nil
160181
}
161182

162183
type predefinedVariable struct {
163184
name string
164185
options *PredefinedVariableOptions
186+
log log.Logger
165187
}
166188

167189
func (p *predefinedVariable) Load(ctx context.Context, definition *latest.Variable) (interface{}, error) {
@@ -170,5 +192,5 @@ func (p *predefinedVariable) Load(ctx context.Context, definition *latest.Variab
170192
return nil, errors.New("predefined variable " + p.name + " not found")
171193
}
172194

173-
return getVar(ctx, p.options)
195+
return getVar(ctx, p.options, p.log)
174196
}

pkg/devspace/config/loader/variable/resolver.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
"github.com/pkg/errors"
2020
)
2121

22-
var AlwaysResolvePredefinedVars = []string{"DEVSPACE_NAME", "DEVSPACE_TMPDIR", "DEVSPACE_VERSION", "DEVSPACE_RANDOM", "DEVSPACE_PROFILE", "DEVSPACE_USER_HOME", "DEVSPACE_TIMESTAMP", "devspace.context", "DEVSPACE_CONTEXT", "devspace.namespace", "DEVSPACE_NAMESPACE"}
22+
var AlwaysResolvePredefinedVars = []string{"DEVSPACE_NAME", "DEVSPACE_EXECUTABLE", "DEVSPACE_KUBECTL_EXECUTABLE", "DEVSPACE_TMPDIR", "DEVSPACE_VERSION", "DEVSPACE_RANDOM", "DEVSPACE_PROFILE", "DEVSPACE_USER_HOME", "DEVSPACE_TIMESTAMP", "devspace.context", "DEVSPACE_CONTEXT", "devspace.namespace", "DEVSPACE_NAMESPACE"}
2323

2424
// NewResolver creates a new resolver that caches resolved variables in memory and in the provided cache
2525
func NewResolver(localCache localcache.Cache, predefinedVariableOptions *PredefinedVariableOptions, flags []string, log log.Logger) (Resolver, error) {
@@ -339,7 +339,7 @@ func (r *resolver) resolve(ctx context.Context, name string, definition *latest.
339339
}
340340

341341
// is predefined variable?
342-
variable, err := NewPredefinedVariable(name, r.options)
342+
variable, err := NewPredefinedVariable(name, r.options, r.log)
343343
if err == nil {
344344
value, err := variable.Load(ctx, definition)
345345
if err != nil {
@@ -507,7 +507,7 @@ func (r *resolver) resolveDefinitionString(ctx context.Context, str string, defi
507507
v, ok := r.memoryCache[varName]
508508
if !ok {
509509
// check if its a predefined variable
510-
variable, err := NewPredefinedVariable(varName, r.options)
510+
variable, err := NewPredefinedVariable(varName, r.options, r.log)
511511
if err != nil {
512512
if r.vars[varName] == nil {
513513
return "${" + varName + "}", nil

pkg/util/downloader/commands/kubectl.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func (k *kubectlCommand) InstallPath() (string, error) {
3939
}
4040

4141
func (k *kubectlCommand) DownloadURL() string {
42-
// let the default kubectl version be 1.22.0
43-
kubectlVersion := "v1.22.0"
42+
// let the default kubectl version be 1.24.1
43+
kubectlVersion := "v1.24.1"
4444

4545
// try to fetch latest kubectl version if it fails use default version
4646
res, err := http.Get("https://storage.googleapis.com/kubernetes-release/release/stable.txt")
@@ -53,7 +53,6 @@ func (k *kubectlCommand) DownloadURL() string {
5353
}
5454

5555
url := "https://storage.googleapis.com/kubernetes-release/release/" + kubectlVersion + "/bin/" + runtime.GOOS + "/" + runtime.GOARCH + "/kubectl"
56-
5756
if runtime.GOOS == "windows" {
5857
url += ".exe"
5958
}

0 commit comments

Comments
 (0)