diff --git a/references/cli/dryrun.go b/references/cli/dryrun.go index eda2cf849..9f943dd73 100644 --- a/references/cli/dryrun.go +++ b/references/cli/dryrun.go @@ -133,7 +133,7 @@ func DryRunApplication(cmdOption *DryRunCmdOptions, c common.Args, namespace str var objs []*unstructured.Unstructured if cmdOption.DefinitionFile != "" { - objs, err = ReadDefinitionsFromFile(cmdOption.DefinitionFile) + objs, err = ReadDefinitionsFromFile(cmdOption.DefinitionFile, cmdOption.IOStreams) if err != nil { return buff, err } @@ -211,7 +211,7 @@ func readObj(path string) (*unstructured.Unstructured, error) { } // ReadDefinitionsFromFile will read objects from file or dir in the format of yaml -func ReadDefinitionsFromFile(path string) ([]*unstructured.Unstructured, error) { +func ReadDefinitionsFromFile(path string, io cmdutil.IOStreams) ([]*unstructured.Unstructured, error) { fi, err := os.Stat(path) if err != nil { return nil, err @@ -225,24 +225,31 @@ func ReadDefinitionsFromFile(path string) ([]*unstructured.Unstructured, error) } var objs []*unstructured.Unstructured - //nolint:gosec - fis, err := os.ReadDir(path) - if err != nil { - return nil, err - } - for _, fi := range fis { - if fi.IsDir() { - continue + err = filepath.WalkDir(path, func(path string, e os.DirEntry, err error) error { + if e == nil { + io.Errorf("failed to walk nil dir entry %s", path) + return nil } - fileType := filepath.Ext(fi.Name()) - if fileType != ".yaml" && fileType != ".yml" && fileType != ".cue" { - continue - } - obj, err := readObj(filepath.Join(path, fi.Name())) if err != nil { - return nil, err + io.Errorf("failed to walk dir %s: %v", path, err) + return nil + } + if e.IsDir() { + return nil + } + fileType := filepath.Ext(e.Name()) + if fileType != ".yaml" && fileType != ".yml" && fileType != ".cue" { + return nil + } + obj, err := readObj(path) + if err != nil { + return err } objs = append(objs, obj) + return nil + }) + if err != nil { + return nil, err } return objs, nil } diff --git a/references/cli/dryrun_test.go b/references/cli/dryrun_test.go index 282ed99a4..343b53866 100644 --- a/references/cli/dryrun_test.go +++ b/references/cli/dryrun_test.go @@ -223,9 +223,20 @@ var _ = Describe("Testing dry-run", func() { Expect(buff.String()).Should(ContainSubstring("kind: Deployment")) }) - It("Testing dry-run offline", func() { + It("Testing dry-run offline with definition file", func() { c := common2.Args{} - opt := DryRunCmdOptions{ApplicationFiles: []string{"test-data/dry-run/testing-dry-run-6.yaml"}, DefinitionFile: "test-data/dry-run/testing-worker-def.yaml", OfflineMode: true} + opt := DryRunCmdOptions{ApplicationFiles: []string{"test-data/dry-run/testing-dry-run-6.yaml"}, DefinitionFile: "test-data/dry-run/definitions/testing-worker-def.yaml", OfflineMode: true} + buff, err := DryRunApplication(&opt, c, "") + Expect(err).Should(BeNil()) + Expect(buff.String()).Should(ContainSubstring("# Application(testing-app)")) + Expect(buff.String()).Should(ContainSubstring("name: testing-dryrun")) + Expect(buff.String()).Should(ContainSubstring("kind: Deployment")) + Expect(buff.String()).Should(ContainSubstring("workload.oam.dev/type: myworker")) + }) + + It("Testing dry-run offline with definition directory", func() { + c := common2.Args{} + opt := DryRunCmdOptions{ApplicationFiles: []string{"test-data/dry-run/testing-dry-run-6.yaml"}, DefinitionFile: "test-data/dry-run/definitions", OfflineMode: true} buff, err := DryRunApplication(&opt, c, "") Expect(err).Should(BeNil()) Expect(buff.String()).Should(ContainSubstring("# Application(testing-app)")) @@ -236,7 +247,7 @@ var _ = Describe("Testing dry-run", func() { It("Testing dry-run offline with deploy workflow step", func() { c := common2.Args{} - opt := DryRunCmdOptions{ApplicationFiles: []string{"test-data/dry-run/testing-dry-run-7.yaml"}, DefinitionFile: "test-data/dry-run/testing-worker-def.yaml", OfflineMode: true} + opt := DryRunCmdOptions{ApplicationFiles: []string{"test-data/dry-run/testing-dry-run-7.yaml"}, DefinitionFile: "test-data/dry-run/definitions/testing-worker-def.yaml", OfflineMode: true} buff, err := DryRunApplication(&opt, c, "") Expect(err).Should(BeNil()) Expect(buff.String()).Should(ContainSubstring("# Application(testing-app with topology target-prod)")) diff --git a/references/cli/livediff.go b/references/cli/livediff.go index 0272bc5f0..6010d07ac 100644 --- a/references/cli/livediff.go +++ b/references/cli/livediff.go @@ -103,7 +103,7 @@ func LiveDiffApplication(cmdOption *LiveDiffCmdOptions, c common.Args) (bytes.Bu } var objs []*unstructured.Unstructured if cmdOption.DefinitionFile != "" { - objs, err = ReadDefinitionsFromFile(cmdOption.DefinitionFile) + objs, err = ReadDefinitionsFromFile(cmdOption.DefinitionFile, cmdOption.IOStreams) if err != nil { return buff, err } diff --git a/references/cli/test-data/dry-run/testing-worker-def.yaml b/references/cli/test-data/dry-run/definitions/testing-worker-def.yaml similarity index 100% rename from references/cli/test-data/dry-run/testing-worker-def.yaml rename to references/cli/test-data/dry-run/definitions/testing-worker-def.yaml