Skip to content

Commit 45dc890

Browse files
committed
fix: replace pods statefulset problems
1 parent bd559b2 commit 45dc890

2 files changed

Lines changed: 52 additions & 94 deletions

File tree

pkg/devspace/services/podreplace/builder.go

Lines changed: 52 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
runtimevar "github.com/loft-sh/devspace/pkg/devspace/config/loader/variable/runtime"
1414
"github.com/loft-sh/devspace/pkg/devspace/config/versions/latest"
1515
devspacecontext "github.com/loft-sh/devspace/pkg/devspace/context"
16-
"github.com/loft-sh/devspace/pkg/devspace/imageselector"
1716
"github.com/loft-sh/devspace/pkg/devspace/kubectl/selector"
1817
"github.com/loft-sh/devspace/pkg/util/hash"
1918
"github.com/pkg/errors"
@@ -77,9 +76,9 @@ func buildDeployment(ctx *devspacecontext.Context, name string, target runtime.O
7776
for _, pvc := range t.Spec.VolumeClaimTemplates {
7877
pvcName := pvc.Name
7978
if pvcName == "" {
80-
pvcName = "data-" + t.Name
79+
pvcName = "data"
8180
}
82-
81+
pvcName += "-" + t.Name + "-0"
8382
podTemplate.Spec.Volumes = append(podTemplate.Spec.Volumes, corev1.Volume{
8483
Name: "data",
8584
VolumeSource: corev1.VolumeSource{
@@ -99,12 +98,6 @@ func buildDeployment(ctx *devspacecontext.Context, name string, target runtime.O
9998
return nil, err
10099
}
101100

102-
// replace the image names
103-
err = replaceImagesInPodSpec(ctx, &podTemplate.Spec, devPod)
104-
if err != nil {
105-
return nil, err
106-
}
107-
108101
// apply the patches
109102
podTemplate, err = applyPodPatches(podTemplate, devPod)
110103
if err != nil {
@@ -113,7 +106,7 @@ func buildDeployment(ctx *devspacecontext.Context, name string, target runtime.O
113106

114107
// check if terminal and modify pod
115108
loader.EachDevContainer(devPod, func(devContainer *latest.DevContainer) bool {
116-
err = modifyDevContainer(devPod, devContainer, podTemplate)
109+
err = modifyDevContainer(ctx, devPod, devContainer, podTemplate)
117110
if err != nil {
118111
return false
119112
}
@@ -167,46 +160,51 @@ func buildDeployment(ctx *devspacecontext.Context, name string, target runtime.O
167160
return deployment, nil
168161
}
169162

170-
func modifyDevContainer(devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
171-
err := replaceTerminal(devContainer, podTemplate)
163+
func modifyDevContainer(ctx *devspacecontext.Context, devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
164+
err := replaceImage(ctx, devPod, devContainer, podTemplate)
165+
if err != nil {
166+
return err
167+
}
168+
169+
err = replaceTerminal(ctx, devPod, devContainer, podTemplate)
172170
if err != nil {
173171
return errors.Wrap(err, "replace terminal")
174172
}
175173

176-
err = replaceAttach(devContainer, podTemplate)
174+
err = replaceAttach(ctx, devPod, devContainer, podTemplate)
177175
if err != nil {
178176
return errors.Wrap(err, "replace attach")
179177
}
180178

181-
err = replaceEnv(devContainer, podTemplate)
179+
err = replaceEnv(ctx, devPod, devContainer, podTemplate)
182180
if err != nil {
183181
return errors.Wrap(err, "replace env")
184182
}
185183

186-
err = replaceCommand(devPod, devContainer, podTemplate)
184+
err = replaceCommand(ctx, devPod, devContainer, podTemplate)
187185
if err != nil {
188186
return errors.Wrap(err, "replace entrypoint")
189187
}
190188

191-
err = replaceWorkingDir(devContainer, podTemplate)
189+
err = replaceWorkingDir(ctx, devPod, devContainer, podTemplate)
192190
if err != nil {
193191
return errors.Wrap(err, "replace working dir")
194192
}
195193

196-
err = replaceResources(devContainer, podTemplate)
194+
err = replaceResources(ctx, devPod, devContainer, podTemplate)
197195
if err != nil {
198196
return errors.Wrap(err, "replace resources")
199197
}
200198

201199
return nil
202200
}
203201

204-
func replaceResources(devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
202+
func replaceResources(ctx *devspacecontext.Context, devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
205203
if devContainer.Resources == nil {
206204
return nil
207205
}
208206

209-
index, container, err := getPodTemplateContainer(devContainer, podTemplate)
207+
index, container, err := getPodTemplateContainer(ctx, devPod, devContainer, podTemplate)
210208
if err != nil {
211209
return err
212210
}
@@ -227,12 +225,12 @@ func replaceResources(devContainer *latest.DevContainer, podTemplate *corev1.Pod
227225
return nil
228226
}
229227

230-
func replaceWorkingDir(devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
228+
func replaceWorkingDir(ctx *devspacecontext.Context, devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
231229
if devContainer.WorkingDir == "" {
232230
return nil
233231
}
234232

235-
index, container, err := getPodTemplateContainer(devContainer, podTemplate)
233+
index, container, err := getPodTemplateContainer(ctx, devPod, devContainer, podTemplate)
236234
if err != nil {
237235
return err
238236
}
@@ -242,7 +240,7 @@ func replaceWorkingDir(devContainer *latest.DevContainer, podTemplate *corev1.Po
242240
return nil
243241
}
244242

245-
func replaceCommand(devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
243+
func replaceCommand(ctx *devspacecontext.Context, devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
246244
// replace with DevSpace helper
247245
injectRestartHelper := false
248246
if !devContainer.DisableRestartHelper {
@@ -259,7 +257,7 @@ func replaceCommand(devPod *latest.DevPod, devContainer *latest.DevContainer, po
259257
return nil
260258
}
261259

262-
index, container, err := getPodTemplateContainer(devContainer, podTemplate)
260+
index, container, err := getPodTemplateContainer(ctx, devPod, devContainer, podTemplate)
263261
if err != nil {
264262
return err
265263
}
@@ -324,12 +322,12 @@ func replaceCommand(devPod *latest.DevPod, devContainer *latest.DevContainer, po
324322
return nil
325323
}
326324

327-
func replaceEnv(devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
325+
func replaceEnv(ctx *devspacecontext.Context, devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
328326
if len(devContainer.Env) == 0 {
329327
return nil
330328
}
331329

332-
index, container, err := getPodTemplateContainer(devContainer, podTemplate)
330+
index, container, err := getPodTemplateContainer(ctx, devPod, devContainer, podTemplate)
333331
if err != nil {
334332
return err
335333
}
@@ -345,12 +343,12 @@ func replaceEnv(devContainer *latest.DevContainer, podTemplate *corev1.PodTempla
345343
return nil
346344
}
347345

348-
func replaceAttach(devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
346+
func replaceAttach(ctx *devspacecontext.Context, devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
349347
if devContainer.Attach == nil || devContainer.Attach.DisableReplace || (devContainer.Attach.Enabled != nil && !*devContainer.Attach.Enabled) {
350348
return nil
351349
}
352350

353-
index, container, err := getPodTemplateContainer(devContainer, podTemplate)
351+
index, container, err := getPodTemplateContainer(ctx, devPod, devContainer, podTemplate)
354352
if err != nil {
355353
return err
356354
}
@@ -364,12 +362,12 @@ func replaceAttach(devContainer *latest.DevContainer, podTemplate *corev1.PodTem
364362
return nil
365363
}
366364

367-
func replaceTerminal(devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
365+
func replaceTerminal(ctx *devspacecontext.Context, devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
368366
if devContainer.Terminal == nil || devContainer.Terminal.DisableReplace || (devContainer.Terminal.Enabled != nil && !*devContainer.Terminal.Enabled) {
369367
return nil
370368
}
371369

372-
index, container, err := getPodTemplateContainer(devContainer, podTemplate)
370+
index, container, err := getPodTemplateContainer(ctx, devPod, devContainer, podTemplate)
373371
if err != nil {
374372
return err
375373
}
@@ -383,23 +381,31 @@ func replaceTerminal(devContainer *latest.DevContainer, podTemplate *corev1.PodT
383381
return nil
384382
}
385383

386-
func getPodTemplateContainer(devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) (int, *corev1.Container, error) {
387-
if devContainer.Container == "" && len(podTemplate.Spec.Containers) > 1 {
388-
names := []string{}
389-
for _, c := range podTemplate.Spec.Containers {
390-
names = append(names, c.Name)
384+
func getPodTemplateContainer(ctx *devspacecontext.Context, devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) (int, *corev1.Container, error) {
385+
containerName := devContainer.Container
386+
if containerName == "" && len(podTemplate.Spec.Containers) > 1 {
387+
containers, err := matchesImageSelector(ctx, podTemplate, devPod)
388+
if err != nil {
389+
return 0, nil, err
390+
} else if len(containers) != 1 {
391+
names := []string{}
392+
for _, c := range podTemplate.Spec.Containers {
393+
names = append(names, c.Name)
394+
}
395+
396+
return 0, nil, fmt.Errorf("couldn't modify pod as multiple containers were found '%s', but no dev.*.container was specified", strings.Join(names, "' '"))
391397
}
392398

393-
return 0, nil, fmt.Errorf("couldn't modify pod as multiple containers were found %s, but no containerName was specified", strings.Join(names, " "))
399+
containerName = containers[0]
394400
}
395401

396402
for i, con := range podTemplate.Spec.Containers {
397-
if devContainer.Container == "" || con.Name == devContainer.Container {
403+
if containerName == "" || con.Name == containerName {
398404
return i, &con, nil
399405
}
400406
}
401407

402-
return 0, nil, fmt.Errorf("couldn't find container %s", devContainer.Container)
408+
return 0, nil, fmt.Errorf("couldn't find container '%s' in pod", containerName)
403409
}
404410

405411
func hashConfig(replacePod *latest.DevPod) (string, error) {
@@ -411,70 +417,23 @@ func hashConfig(replacePod *latest.DevPod) (string, error) {
411417
return hash.String(string(out)), nil
412418
}
413419

414-
func replaceImagesInPodSpec(ctx *devspacecontext.Context, podSpec *corev1.PodSpec, devPod *latest.DevPod) error {
415-
var err error
416-
loader.EachDevContainer(devPod, func(devContainer *latest.DevContainer) bool {
417-
if devContainer.DevImage == "" {
418-
return true
419-
}
420-
err = replaceImageInPodSpec(ctx, podSpec, devPod.LabelSelector, devPod.ImageSelector, devContainer.Container, devContainer.DevImage)
421-
if err != nil {
422-
return false
423-
}
424-
return true
425-
})
426-
427-
return err
428-
}
429-
430-
func replaceImageInPodSpec(ctx *devspacecontext.Context, podSpec *corev1.PodSpec, labelSelector map[string]string, imageSelector string, container, replaceImage string) error {
431-
if len(podSpec.Containers) == 0 {
432-
return fmt.Errorf("no containers in pod spec")
420+
func replaceImage(ctx *devspacecontext.Context, devPod *latest.DevPod, devContainer *latest.DevContainer, podTemplate *corev1.PodTemplateSpec) error {
421+
if devContainer.DevImage == "" {
422+
return nil
433423
}
434424

435-
imageStr, err := runtimevar.NewRuntimeResolver(ctx.WorkingDir, true).FillRuntimeVariablesAsString(ctx.Context, replaceImage, ctx.Config, ctx.Dependencies)
425+
index, container, err := getPodTemplateContainer(ctx, devPod, devContainer, podTemplate)
436426
if err != nil {
437427
return err
438428
}
439429

440-
if container != "" {
441-
for i := range podSpec.Containers {
442-
if podSpec.Containers[i].Name == container {
443-
podSpec.Containers[i].Image = imageStr
444-
break
445-
}
446-
}
447-
} else if labelSelector != nil {
448-
if len(podSpec.Containers) > 1 {
449-
return fmt.Errorf("pod spec has more than 1 containers and containerName is an empty string")
450-
}
451-
452-
// exchange image name
453-
if len(podSpec.Containers) == 1 {
454-
podSpec.Containers[0].Image = imageStr
455-
}
456-
} else if imageSelector != "" {
457-
if len(podSpec.Containers) == 1 {
458-
podSpec.Containers[0].Image = imageStr
459-
} else {
460-
var imageSelectorPtr *imageselector.ImageSelector
461-
if imageSelector != "" {
462-
imageSelectorPtr, err = runtimevar.NewRuntimeResolver(ctx.WorkingDir, true).FillRuntimeVariablesAsImageSelector(ctx.Context, replaceImage, ctx.Config, ctx.Dependencies)
463-
if err != nil {
464-
return err
465-
}
466-
}
467-
468-
// exchange image name
469-
for i := range podSpec.Containers {
470-
if imageSelectorPtr != nil && imageselector.CompareImageNames(imageSelectorPtr.Image, podSpec.Containers[i].Image) {
471-
podSpec.Containers[i].Image = imageStr
472-
break
473-
}
474-
}
475-
}
430+
imageStr, err := runtimevar.NewRuntimeResolver(ctx.WorkingDir, true).FillRuntimeVariablesAsString(ctx.Context, devContainer.DevImage, ctx.Config, ctx.Dependencies)
431+
if err != nil {
432+
return err
476433
}
477434

435+
container.Image = imageStr
436+
podTemplate.Spec.Containers[index] = *container
478437
return nil
479438
}
480439

pkg/devspace/services/podreplace/find.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,5 +154,4 @@ func matchesImageSelector(ctx *devspacecontext.Context, pod *corev1.PodTemplateS
154154
}
155155

156156
return matchingContainers, nil
157-
158157
}

0 commit comments

Comments
 (0)