@@ -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
405411func 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
0 commit comments