Skip to content

Commit c6b8542

Browse files
committed
feat: add DEVSPACE_KUBECTL_EXECUTABLE
1 parent 55ee138 commit c6b8542

3 files changed

Lines changed: 36 additions & 22 deletions

File tree

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

Lines changed: 31 additions & 16 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,51 +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_EXECUTABLE": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
48+
"DEVSPACE_EXECUTABLE": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
4549
ex, err := os.Executable()
4650
if err != nil {
4751
return nil, err
4852
}
4953
return ex, nil
5054
},
51-
"DEVSPACE_TMPDIR": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
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) {
5265
tempFolder, ok := values.TempFolderFrom(ctx)
5366
if !ok {
5467
return os.TempDir(), nil
5568
}
5669
return tempFolder, nil
5770
},
58-
"DEVSPACE_VERSION": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
71+
"DEVSPACE_VERSION": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
5972
return upgrade.GetVersion(), nil
6073
},
61-
"DEVSPACE_RANDOM": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
74+
"DEVSPACE_RANDOM": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
6275
return randutil.GenerateRandomString(6), nil
6376
},
64-
"DEVSPACE_PROFILE": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
77+
"DEVSPACE_PROFILE": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
6578
return options.Profile, nil
6679
},
67-
"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) {
6881
homeDir, err := homedir.Dir()
6982
if err != nil {
7083
return nil, err
7184
}
7285
return homeDir, nil
7386
},
74-
"DEVSPACE_TIMESTAMP": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
87+
"DEVSPACE_TIMESTAMP": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
7588
return strconv.FormatInt(time.Now().Unix(), 10), nil
7689
},
77-
"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) {
7891
configPath := options.ConfigPath
7992
branch, err := git.GetBranch(filepath.Dir(configPath))
8093
if err != nil {
@@ -83,7 +96,7 @@ var predefinedVars = map[string]PredefinedVariableFunction{
8396

8497
return branch, nil
8598
},
86-
"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) {
87100
configPath := options.ConfigPath
88101
hash, err := git.GetHash(ctx, filepath.Dir(configPath))
89102
if err != nil {
@@ -92,14 +105,14 @@ var predefinedVars = map[string]PredefinedVariableFunction{
92105

93106
return hash[:8], nil
94107
},
95-
"DEVSPACE_CONTEXT": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
108+
"DEVSPACE_CONTEXT": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
96109
if options.KubeClient == nil {
97110
return "", nil
98111
}
99112

100113
return options.KubeClient.CurrentContext(), nil
101114
},
102-
"DEVSPACE_NAMESPACE": func(ctx context.Context, options *PredefinedVariableOptions) (interface{}, error) {
115+
"DEVSPACE_NAMESPACE": func(ctx context.Context, options *PredefinedVariableOptions, log log.Logger) (interface{}, error) {
103116
if options.KubeClient == nil {
104117
return "", nil
105118
}
@@ -133,7 +146,7 @@ func AddPredefinedVars(plugins []plugin.Metadata) {
133146
pluginFolder := p.PluginFolder
134147
for _, variable := range p.Vars {
135148
v := variable
136-
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) {
137150
args, err := json.Marshal(os.Args)
138151
if err != nil {
139152
return "", err
@@ -155,20 +168,22 @@ func AddPredefinedVars(plugins []plugin.Metadata) {
155168

156169
// NewPredefinedVariable creates a new predefined variable for the given name or fails if there
157170
// is none with the given name
158-
func NewPredefinedVariable(name string, options *PredefinedVariableOptions) (Variable, error) {
171+
func NewPredefinedVariable(name string, options *PredefinedVariableOptions, log log.Logger) (Variable, error) {
159172
if _, ok := predefinedVars[name]; !ok {
160173
return nil, errors.New("predefined variable " + name + " not found")
161174
}
162175

163176
return &predefinedVariable{
164177
name: name,
165178
options: options,
179+
log: log,
166180
}, nil
167181
}
168182

169183
type predefinedVariable struct {
170184
name string
171185
options *PredefinedVariableOptions
186+
log log.Logger
172187
}
173188

174189
func (p *predefinedVariable) Load(ctx context.Context, definition *latest.Variable) (interface{}, error) {
@@ -177,5 +192,5 @@ func (p *predefinedVariable) Load(ctx context.Context, definition *latest.Variab
177192
return nil, errors.New("predefined variable " + p.name + " not found")
178193
}
179194

180-
return getVar(ctx, p.options)
195+
return getVar(ctx, p.options, p.log)
181196
}

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_EXECUTABLE", "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)