Skip to content

Commit eddda40

Browse files
authored
Merge pull request #1889 from lizardruss/master
devspace init + devspace dev fails
2 parents 8a4e1bf + d6469f2 commit eddda40

File tree

12 files changed

+478
-11
lines changed

12 files changed

+478
-11
lines changed

cmd/init.go

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

33
import (
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+
}

cmd/init_test.go

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package cmd
22

3+
import (
4+
"testing"
5+
6+
"gotest.tools/assert"
7+
"gotest.tools/assert/cmp"
8+
)
9+
310
/*import (
411
"io/ioutil"
512
"os"
@@ -303,3 +310,114 @@ func testInit(t *testing.T, testCase initTestCase) {
303310
})
304311
assert.NilError(t, err, "Error cleaning up in testCase %s", testCase.name)
305312
}*/
313+
314+
type parseImagesTestCase struct {
315+
name string
316+
manifests string
317+
expected []string
318+
}
319+
320+
func TestParseImages(t *testing.T) {
321+
testCases := []parseImagesTestCase{
322+
{
323+
name: `Single`,
324+
manifests: `
325+
apiVersion: apps/v1
326+
kind: Deployment
327+
metadata:
328+
name: "new"
329+
labels:
330+
"app.kubernetes.io/name": "devspace-app"
331+
"app.kubernetes.io/component": "test"
332+
"app.kubernetes.io/managed-by": "Helm"
333+
spec:
334+
replicas: 1
335+
strategy:
336+
type: Recreate
337+
selector:
338+
matchLabels:
339+
"app.kubernetes.io/name": "devspace-app"
340+
"app.kubernetes.io/component": "test"
341+
"app.kubernetes.io/managed-by": "Helm"
342+
template:
343+
metadata:
344+
labels:
345+
"app.kubernetes.io/name": "devspace-app"
346+
"app.kubernetes.io/component": "test"
347+
"app.kubernetes.io/managed-by": "Helm"
348+
spec:
349+
containers:
350+
- image: "username/app"
351+
name: "container-0"
352+
`,
353+
expected: []string{
354+
"username/app",
355+
},
356+
},
357+
{
358+
name: `Multiple`,
359+
manifests: `
360+
---
361+
# Source: my-app/templates/service.yaml
362+
apiVersion: v1
363+
kind: Service
364+
metadata:
365+
name: php
366+
labels:
367+
release: "test-helm"
368+
spec:
369+
ports:
370+
- port: 80
371+
protocol: TCP
372+
selector:
373+
release: "test-helm"
374+
---
375+
# Source: my-app/templates/deployment.yaml
376+
apiVersion: apps/v1
377+
kind: Deployment
378+
metadata:
379+
name: test-helm
380+
labels:
381+
release: "test-helm"
382+
spec:
383+
replicas: 1
384+
selector:
385+
matchLabels:
386+
release: "test-helm"
387+
template:
388+
metadata:
389+
annotations:
390+
revision: "1"
391+
labels:
392+
release: "test-helm"
393+
spec:
394+
containers:
395+
- name: default
396+
image: "php"
397+
`,
398+
expected: []string{
399+
"php",
400+
},
401+
},
402+
}
403+
404+
for _, testCase := range testCases {
405+
manifests := testCase.manifests
406+
407+
actual, err := parseImages(manifests)
408+
assert.NilError(
409+
t,
410+
err,
411+
"Unexpected error in test case %s",
412+
testCase.name,
413+
)
414+
415+
expected := testCase.expected
416+
assert.Assert(
417+
t,
418+
cmp.DeepEqual(expected, actual),
419+
"Unexpected values in test case %s",
420+
testCase.name,
421+
)
422+
}
423+
}

e2e/framework/util.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ func CleanupTempDir(initialDir, tempDir string) {
9191
}
9292

9393
func CopyToTempDir(relativePath string) (string, error) {
94-
dir, err := ioutil.TempDir("", "")
94+
dir, err := ioutil.TempDir("", "temp-*")
9595
if err != nil {
9696
return "", err
9797
}

0 commit comments

Comments
 (0)