Skip to content

Commit f8b2bd6

Browse files
committed
refactor: improve target selector
1 parent fcd9791 commit f8b2bd6

30 files changed

+338
-536
lines changed

cmd/attach.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"github.com/loft-sh/devspace/pkg/devspace/plugin"
88
"github.com/loft-sh/devspace/pkg/devspace/services/targetselector"
99
"github.com/loft-sh/devspace/pkg/util/factory"
10-
"github.com/loft-sh/devspace/pkg/util/ptr"
1110
"github.com/pkg/errors"
1211

1312
"github.com/spf13/cobra"
@@ -99,18 +98,16 @@ func (cmd *AttachCmd) Run(f factory.Factory, cobraCmd *cobra.Command, args []str
9998
return err
10099
}
101100

102-
// Build params
103-
options := targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, cmd.Namespace, cmd.Pod, cmd.Pick)
104-
105101
// get image selector if specified
106102
imageSelector, err := getImageSelector(client, configLoader, configOptions, cmd.Image, cmd.ImageSelector, log)
107103
if err != nil {
108104
return err
109105
}
110106

111-
// set image selector
112-
options.ImageSelector = imageSelector
113-
options.Wait = ptr.Bool(false)
107+
// Build params
108+
options := targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, imageSelector, cmd.Namespace, cmd.Pod).
109+
WithPick(cmd.Pick).
110+
WithWait(false)
114111

115112
// Start attach
116113
return f.NewServicesClient(nil, nil, client, log).StartAttach(options, make(chan error))

cmd/dev.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cmd
22

33
import (
44
"fmt"
5+
"github.com/loft-sh/devspace/pkg/devspace/kubectl/selector"
56
"github.com/loft-sh/devspace/pkg/util/stringutil"
67
"io"
78
"os"
@@ -11,7 +12,6 @@ import (
1112
"time"
1213

1314
runtimevar "github.com/loft-sh/devspace/pkg/devspace/config/loader/variable/runtime"
14-
"github.com/loft-sh/devspace/pkg/devspace/imageselector"
1515
"github.com/loft-sh/devspace/pkg/util/command"
1616

1717
"github.com/loft-sh/devspace/pkg/devspace/config"
@@ -625,24 +625,24 @@ func (cmd *DevCmd) startOutput(configInterface config.Config, dependencies []typ
625625
}
626626
return 0, nil
627627
} else {
628-
selectorOptions := targetselector.NewDefaultOptions().ApplyCmdParameter("", "", cmd.Namespace, "")
628+
selectorOptions := targetselector.NewEmptyOptions().
629+
WithContainerFilter(selector.FilterNonRunningContainers).
630+
WithPick(true).
631+
WithNamespace(cmd.Namespace)
629632
if config.Dev.Terminal != nil {
630-
selectorOptions = selectorOptions.ApplyConfigParameter(config.Dev.Terminal.LabelSelector, config.Dev.Terminal.Namespace, config.Dev.Terminal.ContainerName, "")
631-
}
633+
var imageSelectors []string
634+
if config.Dev.Terminal.ImageSelector != "" {
635+
imageSelector, err := runtimevar.NewRuntimeResolver(true).FillRuntimeVariablesAsImageSelector(config.Dev.Terminal.ImageSelector, configInterface, dependencies)
636+
if err != nil {
637+
return 0, err
638+
}
632639

633-
var imageSelectors []imageselector.ImageSelector
634-
if config.Dev.Terminal != nil && config.Dev.Terminal.ImageSelector != "" {
635-
imageSelector, err := runtimevar.NewRuntimeResolver(true).FillRuntimeVariablesAsImageSelector(config.Dev.Terminal.ImageSelector, configInterface, dependencies)
636-
if err != nil {
637-
return 0, err
640+
imageSelectors = []string{imageSelector.Image}
638641
}
639-
640-
imageSelectors = append(imageSelectors, *imageSelector)
642+
selectorOptions = selectorOptions.ApplyConfigParameter(config.Dev.Terminal.ContainerName, config.Dev.Terminal.LabelSelector, imageSelectors, config.Dev.Terminal.Namespace, "")
641643
}
642644

643645
cmd.log.Info("Terminal: Waiting for containers to start...")
644-
selectorOptions.ImageSelector = imageSelectors
645-
646646
code, err := servicesClient.StartTerminal(selectorOptions, args, cmd.WorkingDirectory, exitChan, true, cmd.TerminalReconnect, stdout, stderr, stdin)
647647
if services.IsUnexpectedExitCode(code) {
648648
cmd.log.Warnf("Command terminated with exit code %d", code)

cmd/enter.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,17 +117,15 @@ func (cmd *EnterCmd) Run(f factory.Factory, cobraCmd *cobra.Command, args []stri
117117
return err
118118
}
119119

120-
// Build params
121-
selectorOptions := targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, cmd.Namespace, cmd.Pod, cmd.Pick)
122-
123120
// get image selector if specified
124121
imageSelector, err := getImageSelector(client, configLoader, configOptions, cmd.Image, cmd.ImageSelector, logger)
125122
if err != nil {
126123
return err
127124
}
128125

129-
// set image selector
130-
selectorOptions.ImageSelector = imageSelector
126+
// Build params
127+
selectorOptions := targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, imageSelector, cmd.Namespace, cmd.Pod).
128+
WithPick(cmd.Pick)
131129

132130
// Start terminal
133131
stdout, stderr, stdin := defaultStdStreams(cmd.Stdout, cmd.Stderr, cmd.Stdin)

cmd/logs.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,17 +116,15 @@ func (cmd *LogsCmd) RunLogs(f factory.Factory) error {
116116
return err
117117
}
118118

119-
// Build options
120-
options := targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, cmd.Namespace, cmd.Pod, cmd.Pick)
121-
122119
// get image selector if specified
123120
imageSelector, err := getImageSelector(client, configLoader, configOptions, cmd.Image, cmd.ImageSelector, log)
124121
if err != nil {
125122
return err
126123
}
127124

128-
// set image selector
129-
options.ImageSelector = imageSelector
125+
// Build options
126+
options := targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, imageSelector, cmd.Namespace, cmd.Pod).
127+
WithPick(cmd.Pick)
130128

131129
// Start terminal
132130
err = f.NewServicesClient(nil, nil, client, log).StartLogs(options, cmd.Follow, int64(cmd.LastAmountOfLines), cmd.Wait)
@@ -137,8 +135,8 @@ func (cmd *LogsCmd) RunLogs(f factory.Factory) error {
137135
return nil
138136
}
139137

140-
func getImageSelector(client kubectl.Client, configLoader loader.ConfigLoader, configOptions *loader.ConfigOptions, image, imageSelector string, log log.Logger) ([]imageselector.ImageSelector, error) {
141-
var imageSelectors []imageselector.ImageSelector
138+
func getImageSelector(client kubectl.Client, configLoader loader.ConfigLoader, configOptions *loader.ConfigOptions, image, imageSelector string, log log.Logger) ([]string, error) {
139+
var imageSelectors []string
142140
if imageSelector != "" {
143141
var (
144142
err error
@@ -166,7 +164,7 @@ func getImageSelector(client kubectl.Client, configLoader loader.ConfigLoader, c
166164
return nil, err
167165
}
168166

169-
imageSelectors = append(imageSelectors, *resolved)
167+
imageSelectors = append(imageSelectors, resolved.Image)
170168
} else if image != "" {
171169
log.Warnf("Flag --image is deprecated, please use --image-selector instead")
172170

@@ -193,7 +191,7 @@ func getImageSelector(client kubectl.Client, configLoader loader.ConfigLoader, c
193191
return nil, fmt.Errorf("couldn't find an image with name %s in devspace config", image)
194192
}
195193

196-
imageSelectors = append(imageSelectors, *imageSelector)
194+
imageSelectors = append(imageSelectors, imageSelector.Image)
197195
}
198196

199197
return imageSelectors, nil

cmd/restart.go

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,15 @@ package cmd
33
import (
44
"context"
55
"fmt"
6+
"github.com/loft-sh/devspace/cmd/flags"
67
runtimevar "github.com/loft-sh/devspace/pkg/devspace/config/loader/variable/runtime"
7-
"github.com/loft-sh/devspace/pkg/devspace/imageselector"
8-
98
"github.com/loft-sh/devspace/pkg/devspace/dependency"
109
"github.com/loft-sh/devspace/pkg/devspace/hook"
1110
"github.com/loft-sh/devspace/pkg/devspace/kubectl"
1211
"github.com/loft-sh/devspace/pkg/devspace/plugin"
1312
"github.com/loft-sh/devspace/pkg/devspace/services/inject"
1413
"github.com/loft-sh/devspace/pkg/devspace/services/targetselector"
1514
"github.com/loft-sh/devspace/pkg/util/factory"
16-
"github.com/loft-sh/devspace/pkg/util/ptr"
17-
18-
"github.com/loft-sh/devspace/cmd/flags"
1915
"github.com/loft-sh/devspace/pkg/util/log"
2016
"github.com/pkg/errors"
2117

@@ -85,7 +81,7 @@ func (cmd *RestartCmd) Run(f factory.Factory) error {
8581
return errors.Wrap(err, "create kube client")
8682
}
8783

88-
return restartContainer(client, targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, cmd.Namespace, cmd.Pod, cmd.Pick), cmd.log)
84+
return restartContainer(client, targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, nil, cmd.Namespace, cmd.Pod).WithPick(cmd.Pick), cmd.log)
8985
}
9086

9187
log.StartFileLogging()
@@ -149,17 +145,19 @@ func (cmd *RestartCmd) Run(f factory.Factory) error {
149145
}
150146

151147
// create target selector options
152-
options := targetselector.NewOptionsFromFlags("", "", cmd.Namespace, "", cmd.Pick).ApplyConfigParameter(syncPath.LabelSelector, syncPath.Namespace, syncPath.ContainerName, "")
153-
options.ImageSelector = []imageselector.ImageSelector{}
148+
var imageSelector []string
154149
if syncPath.ImageSelector != "" {
155-
imageSelector, err := runtimevar.NewRuntimeResolver(true).FillRuntimeVariablesAsImageSelector(syncPath.ImageSelector, configInterface, dep)
150+
imageSelectorObject, err := runtimevar.NewRuntimeResolver(true).FillRuntimeVariablesAsImageSelector(syncPath.ImageSelector, configInterface, dep)
156151
if err != nil {
157152
return err
158153
}
159154

160-
options.ImageSelector = append(options.ImageSelector, *imageSelector)
155+
imageSelector = []string{imageSelectorObject.Image}
161156
}
162157

158+
options := targetselector.NewOptionsFromFlags("", "", nil, cmd.Namespace, "").
159+
WithPick(cmd.Pick).
160+
ApplyConfigParameter(syncPath.ContainerName, syncPath.LabelSelector, imageSelector, syncPath.Namespace, "")
163161
err = restartContainer(client, options, cmd.log)
164162
if err != nil {
165163
return err
@@ -179,7 +177,7 @@ func (cmd *RestartCmd) Run(f factory.Factory) error {
179177
}
180178

181179
func restartContainer(client kubectl.Client, options targetselector.Options, log log.Logger) error {
182-
options.Wait = ptr.Bool(false)
180+
options = options.WithWait(false)
183181
container, err := targetselector.NewTargetSelector(client).SelectSingleContainer(context.TODO(), options, log)
184182
if err != nil {
185183
return errors.Errorf("Error selecting pod: %v", err)

cmd/sync.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,17 +180,16 @@ func (cmd *SyncCmd) Run(f factory.Factory) error {
180180
return err
181181
}
182182

183-
// Build params
184-
options := targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, cmd.Namespace, cmd.Pod, cmd.Pick)
185183
// get image selector if specified
186184
imageSelector, err := getImageSelector(client, configLoader, configOptions, "", cmd.ImageSelector, logger)
187185
if err != nil {
188186
return err
189187
}
190188

191-
// set image selector
192-
options.ImageSelector = imageSelector
193-
options.Wait = &cmd.Wait
189+
// Build params
190+
options := targetselector.NewOptionsFromFlags(cmd.Container, cmd.LabelSelector, imageSelector, cmd.Namespace, cmd.Pod).
191+
WithPick(cmd.Pick).
192+
WithWait(cmd.Wait)
194193

195194
if cmd.DownloadOnly && cmd.UploadOnly {
196195
return errors.New("--upload-only cannot be used together with --download-only")
@@ -253,9 +252,8 @@ func (cmd *SyncCmd) Run(f factory.Factory) error {
253252
return errors.Wrap(err, "apply flags to sync config")
254253
}
255254

256-
options = options.ApplyConfigParameter(syncConfig.LabelSelector, syncConfig.Namespace, syncConfig.ContainerName, "")
257-
258255
// Start sync
256+
options = options.ApplyConfigParameter(syncConfig.ContainerName, syncConfig.LabelSelector, nil, syncConfig.Namespace, "")
259257
return f.NewServicesClient(configInterface, nil, client, logger).StartSyncFromCmd(options, syncConfig, cmd.Interrupt, cmd.NoWatch, cmd.Verbose)
260258
}
261259

e2e/kube/kube.go

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package kube
33
import (
44
"context"
55
"fmt"
6-
"github.com/loft-sh/devspace/pkg/devspace/imageselector"
76
"strings"
87
"time"
98

@@ -41,15 +40,10 @@ func (k *KubeHelper) RawClient() kubernetes.Interface {
4140
}
4241

4342
func (k *KubeHelper) ExecByImageSelector(imageSelector, namespace string, command []string) (string, error) {
44-
targetOptions := targetselector.NewEmptyOptions().ApplyConfigParameter(nil, namespace, "", "")
45-
targetOptions.AllowPick = false
46-
targetOptions.Timeout = 120
47-
targetOptions.ImageSelector = []imageselector.ImageSelector{
48-
{
49-
Image: imageSelector,
50-
},
51-
}
52-
targetOptions.WaitingStrategy = targetselector.NewUntilNewestRunningWaitingStrategy(time.Second * 2)
43+
targetOptions := targetselector.NewOptionsFromFlags("", "", []string{imageSelector}, namespace, "").
44+
WithTimeout(120).
45+
WithWaitingStrategy(targetselector.NewUntilNewestRunningWaitingStrategy(time.Second * 2))
46+
5347
container, err := targetselector.NewTargetSelector(k.client).SelectSingleContainer(context.TODO(), targetOptions, log.Discard)
5448
if err != nil {
5549
return "", err
@@ -64,12 +58,10 @@ func (k *KubeHelper) ExecByImageSelector(imageSelector, namespace string, comman
6458
}
6559

6660
func (k *KubeHelper) ExecByContainer(labelSelector, containerName, namespace string, command []string) (string, error) {
67-
targetOptions := targetselector.NewEmptyOptions().ApplyConfigParameter(nil, namespace, "", "")
68-
targetOptions.AllowPick = false
69-
targetOptions.Timeout = 120
70-
targetOptions.LabelSelector = labelSelector
71-
targetOptions.ContainerName = containerName
72-
targetOptions.WaitingStrategy = targetselector.NewUntilNewestRunningWaitingStrategy(time.Second * 2)
61+
targetOptions := targetselector.NewOptionsFromFlags(containerName, labelSelector, nil, namespace, "").
62+
WithTimeout(120).
63+
WithWaitingStrategy(targetselector.NewUntilNewestRunningWaitingStrategy(time.Second * 2))
64+
7365
container, err := targetselector.NewTargetSelector(k.client).SelectSingleContainer(context.TODO(), targetOptions, log.Discard)
7466
if err != nil {
7567
return "", err

pkg/devspace/build/builder/kaniko/kaniko.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,8 @@ func (b *Builder) BuildImage(contextPath, dockerfilePath string, entrypoint []st
393393
stdoutLogger := kanikoLogger{out: writer}
394394

395395
// Stream the logs
396-
err = services.NewClient(b.helper.Config, nil, b.helper.KubeClient, log).StartLogsWithWriter(targetselector.NewOptionsFromFlags(buildPod.Spec.Containers[0].Name, "", buildPod.Namespace, buildPod.Name, false), true, 100, false, stdoutLogger)
396+
options := targetselector.NewOptionsFromFlags(buildPod.Spec.Containers[0].Name, "", nil, buildPod.Namespace, buildPod.Name)
397+
err = services.NewClient(b.helper.Config, nil, b.helper.KubeClient, log).StartLogsWithWriter(options, true, 100, false, stdoutLogger)
397398
if err != nil {
398399
return errors.Errorf("error printing build logs: %v", err)
399400
}

pkg/devspace/hook/hook.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,16 @@ func executeSingle(client kubectl.Client, config config.Config, dependencies []t
143143
var hook Hook
144144
if hookConfig.Container != nil {
145145
if hookConfig.Upload != nil {
146-
hook = NewRemoteHook(NewUploadHook(), client, hookConfig.Container.Namespace)
146+
hook = NewRemoteHook(NewUploadHook())
147147
} else if hookConfig.Download != nil {
148-
hook = NewRemoteHook(NewDownloadHook(), client, hookConfig.Container.Namespace)
148+
hook = NewRemoteHook(NewDownloadHook())
149149
} else if hookConfig.Logs != nil {
150150
// we use another waiting strategy here, because the pod might has finished already
151-
hook = NewRemoteHookWithWaitingStrategy(NewLogsHook(hookWriter), targetselector.NewUntilNotWaitingStrategy(time.Second*2, client, hookConfig.Container.Namespace))
151+
hook = NewRemoteHookWithWaitingStrategy(NewLogsHook(hookWriter), targetselector.NewUntilNotWaitingStrategy(time.Second*2))
152152
} else if hookConfig.Wait != nil {
153153
hook = NewWaitHook()
154154
} else {
155-
hook = NewRemoteHook(NewRemoteCommandHook(hookWriter, hookWriter), client, hookConfig.Container.Namespace)
155+
hook = NewRemoteHook(NewRemoteCommandHook(hookWriter, hookWriter))
156156
}
157157
} else {
158158
hook = NewLocalCommandHook(hookWriter, hookWriter)

pkg/devspace/hook/remote_hook.go

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ type RemoteHook interface {
2323
ExecuteRemotely(hook *latest.HookConfig, podContainer *selector.SelectedPodContainer, client kubectl.Client, config config.Config, dependencies []types.Dependency, log logpkg.Logger) error
2424
}
2525

26-
func NewRemoteHook(hook RemoteHook, client kubectl.Client, namespace string) Hook {
26+
func NewRemoteHook(hook RemoteHook) Hook {
2727
return &remoteHook{
2828
Hook: hook,
29-
WaitingStrategy: targetselector.NewUntilNewestRunningWaitingStrategy(time.Second*2, client, namespace),
29+
WaitingStrategy: targetselector.NewUntilNewestRunningWaitingStrategy(time.Second * 2),
3030
}
3131
}
3232

@@ -95,20 +95,15 @@ func (r *remoteHook) execute(hook *latest.HookConfig, imageSelector []imageselec
9595

9696
// select the container
9797
targetSelector := targetselector.NewTargetSelector(client)
98-
podContainer, err := targetSelector.SelectSingleContainer(context.TODO(), targetselector.Options{
99-
Selector: selector.Selector{
100-
ImageSelector: imageSelector,
101-
LabelSelector: labelSelector,
102-
Pod: hook.Container.Pod,
103-
ContainerName: hook.Container.ContainerName,
104-
Namespace: hook.Container.Namespace,
105-
},
106-
Wait: &wait,
107-
Timeout: timeout,
108-
SortPods: selector.SortPodsByNewest,
109-
SortContainers: selector.SortContainersByNewest,
110-
WaitingStrategy: r.WaitingStrategy,
111-
}, log)
98+
99+
// build target selector
100+
targetSelectorOptions := targetselector.NewOptionsFromFlags(hook.Container.ContainerName, labelSelector, targetselector.ToStringImageSelector(imageSelector), hook.Container.Namespace, hook.Container.Pod).
101+
WithTimeout(timeout).
102+
WithWait(wait).
103+
WithWaitingStrategy(r.WaitingStrategy)
104+
105+
// select container
106+
podContainer, err := targetSelector.SelectSingleContainer(context.TODO(), targetSelectorOptions, log)
112107
if err != nil {
113108
if _, ok := err.(*targetselector.NotFoundErr); ok {
114109
return false, nil

0 commit comments

Comments
 (0)