11package cmd
22
33import (
4+ "bytes"
45 "fmt"
56 "io/ioutil"
67 "net/http"
@@ -10,7 +11,9 @@ import (
1011 "strconv"
1112 "strings"
1213
13- "github.com/loft-sh/devspace/pkg/devspace/imageselector"
14+ "github.com/loft-sh/devspace/cmd/flags"
15+ "github.com/vmware-labs/yaml-jsonpath/pkg/yamlpath"
16+ yaml "gopkg.in/yaml.v3"
1417
1518 "github.com/loft-sh/devspace/pkg/devspace/compose"
1619 "github.com/loft-sh/devspace/pkg/devspace/hook"
@@ -238,13 +241,24 @@ func (cmd *InitCmd) Run(f factory.Factory) error {
238241 for {
239242 image := ""
240243 if imageQuestion != "" {
244+ manifests , err := cmd .render (f , config )
245+ if err != nil {
246+ return errors .Wrap (err , "error rendering deployment" )
247+ }
248+
249+ images , err := parseImages (manifests )
250+ if err != nil {
251+ return errors .Wrap (err , "error parsing images" )
252+ }
253+
254+ if len (images ) == 0 {
255+ return fmt .Errorf ("no images found for the selected deployments" )
256+ }
257+
241258 image , err = cmd .log .Question (& survey.QuestionOptions {
242- Question : imageQuestion ,
243- ValidationMessage : "Please enter a valid container image from a Kubernetes pod (e.g. myregistry.tld/project/image)" ,
244- ValidationFunc : func (name string ) error {
245- _ , _ , err := imageselector .GetStrippedDockerImageName (strings .ToLower (name ))
246- return err
247- },
259+ Question : imageQuestion ,
260+ DefaultValue : images [0 ],
261+ Options : images ,
248262 })
249263 if err != nil {
250264 return err
@@ -727,3 +741,57 @@ func (cmd *InitCmd) addProfileConfig(config *latest.Config, imageName string) er
727741 }
728742 return nil
729743}
744+
745+ func (cmd * InitCmd ) render (f factory.Factory , config * latest.Config ) (string , error ) {
746+ // Save temporary file to render it
747+ renderPath := loader .ConfigPath ("render.yaml" )
748+ configLoader := loader .NewConfigLoader (renderPath )
749+
750+ err := configLoader .Save (config )
751+ defer os .Remove (renderPath )
752+ if err != nil {
753+ return "" , err
754+ }
755+
756+ // Use the render command to render it.
757+ writer := & bytes.Buffer {}
758+ renderCmd := & RenderCmd {
759+ GlobalFlags : & flags.GlobalFlags {
760+ Silent : true ,
761+ ConfigPath : renderPath ,
762+ },
763+ SkipPush : true ,
764+ SkipBuild : true ,
765+ Writer : writer ,
766+ }
767+ err = renderCmd .Run (f )
768+ if err != nil {
769+ return "" , err
770+ }
771+
772+ return writer .String (), nil
773+ }
774+
775+ func parseImages (manifests string ) ([]string , error ) {
776+ images := []string {}
777+
778+ var doc yaml.Node
779+ dec := yaml .NewDecoder (bytes .NewReader ([]byte (manifests )))
780+ for dec .Decode (& doc ) == nil {
781+ path , err := yamlpath .NewPath ("..image" )
782+ if err != nil {
783+ return nil , err
784+ }
785+
786+ matches , err := path .Find (& doc )
787+ if err != nil {
788+ return nil , err
789+ }
790+
791+ for _ , match := range matches {
792+ images = append (images , match .Value )
793+ }
794+ }
795+
796+ return images , nil
797+ }
0 commit comments