diff --git a/cli/cmd/context/ls.go b/cli/cmd/context/ls.go index 835fd7fdf..f4485d620 100644 --- a/cli/cmd/context/ls.go +++ b/cli/cmd/context/ls.go @@ -70,7 +70,7 @@ func runList(cmd *cobra.Command, opts lsOpts) error { return err } format := strings.ToLower(strings.ReplaceAll(opts.format, " ", "")) - if format != "" && format != formatter.JSON && format != formatter.PRETTY && format != formatter.TemplateJSON { + if format != "" && format != formatter.JSON && format != formatter.PRETTY && format != formatter.TemplateLegacyJSON { mobycli.Exec(cmd.Root()) return nil } @@ -94,9 +94,12 @@ func runList(cmd *cobra.Command, opts lsOpts) error { return nil } - if opts.json || format == formatter.JSON || format == formatter.TemplateJSON { + if opts.json || format == formatter.JSON { opts.format = formatter.JSON } + if format == formatter.TemplateLegacyJSON { + opts.format = formatter.TemplateLegacyJSON + } view := viewFromContextList(contexts, currentContext) return formatter.Print(view, opts.format, os.Stdout, @@ -108,7 +111,7 @@ func runList(cmd *cobra.Command, opts lsOpts) error { } _, _ = fmt.Fprintf(w, "%s\t%s\t%s\t%s\t%s\t%s\n", contextName, - c.Type, + c.ContextType, c.Description, c.DockerEndpoint, c.KubernetesEndpoint, @@ -141,7 +144,7 @@ type contextView struct { Description string DockerEndpoint string KubernetesEndpoint string - Type string + ContextType string Name string StackOrchestrator string } @@ -155,7 +158,7 @@ func viewFromContextList(contextList []*store.DockerContext, currentContext stri DockerEndpoint: getEndpoint("docker", c.Endpoints), KubernetesEndpoint: getEndpoint("kubernetes", c.Endpoints), Name: c.Name, - Type: c.Type(), + ContextType: c.Type(), StackOrchestrator: c.Metadata.StackOrchestrator, } } diff --git a/cli/cmd/version.go b/cli/cmd/version.go index 77bf060ce..f1238ab9f 100644 --- a/cli/cmd/version.go +++ b/cli/cmd/version.go @@ -59,7 +59,7 @@ func runVersion(cmd *cobra.Command) { case formatter.PRETTY, "": versionString = strings.Replace(getOutFromMoby(cmd, fixedPrettyArgs(os.Args[1:])...), "\n Version:", "\n Cloud integration: "+displayedVersion+"\n Version:", 1) - case formatter.JSON, formatter.TemplateJSON: // Try to catch full JSON formats + case formatter.JSON, formatter.TemplateLegacyJSON: // Try to catch full JSON formats versionString = strings.Replace(getOutFromMoby(cmd, fixedJSONArgs(os.Args[1:])...), `"Version":`, fmt.Sprintf(`"CloudIntegration":%q,"Version":`, displayedVersion), 1) default: diff --git a/formatter/consts.go b/formatter/consts.go index bdc30b22e..0bb06bf7c 100644 --- a/formatter/consts.go +++ b/formatter/consts.go @@ -19,8 +19,8 @@ package formatter const ( // JSON is the constant for Json formats on list commands JSON = "json" - // TemplateJSON the legacy json formatting value using go template - TemplateJSON = "{{json.}}" + // TemplateLegacyJSON the legacy json formatting value using go template + TemplateLegacyJSON = "{{json.}}" // PRETTY is the constant for default formats on list commands PRETTY = "pretty" ) diff --git a/formatter/formatter.go b/formatter/formatter.go index c3e84af7a..4f8df5369 100644 --- a/formatter/formatter.go +++ b/formatter/formatter.go @@ -32,6 +32,25 @@ func Print(toJSON interface{}, format string, outWriter io.Writer, writerFn func switch strings.ToLower(format) { case PRETTY, "": return PrintPrettySection(outWriter, writerFn, headers...) + case TemplateLegacyJSON: + switch reflect.TypeOf(toJSON).Kind() { + case reflect.Slice: + s := reflect.ValueOf(toJSON) + for i := 0; i < s.Len(); i++ { + obj := s.Index(i).Interface() + outJSON, err := ToJSON(obj, "", "") + if err != nil { + return err + } + _, _ = fmt.Fprint(outWriter, outJSON) + } + default: + outJSON, err := ToStandardJSON(toJSON) + if err != nil { + return err + } + _, _ = fmt.Fprintln(outWriter, outJSON) + } case JSON: switch reflect.TypeOf(toJSON).Kind() { case reflect.Slice: diff --git a/formatter/formatter_test.go b/formatter/formatter_test.go index 7b86773fa..be7f0bd2c 100644 --- a/formatter/formatter_test.go +++ b/formatter/formatter_test.go @@ -58,5 +58,16 @@ func TestPrint(t *testing.T) { } }, "NAME", "STATUS")) assert.Equal(t, b.String(), `[{"Name":"myName1","Status":"myStatus1"},{"Name":"myName2","Status":"myStatus2"}] +`) + + b.Reset() + assert.NilError(t, Print(testList, TemplateLegacyJSON, b, func(w io.Writer) { + for _, t := range testList { + _, _ = fmt.Fprintf(w, "%s\t%s\n", t.Name, t.Status) + } + }, "NAME", "STATUS")) + json := b.String() + assert.Equal(t, json, `{"Name":"myName1","Status":"myStatus1"} +{"Name":"myName2","Status":"myStatus2"} `) } diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 01651df99..b79775ea7 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -86,7 +86,7 @@ func TestContextDefault(t *testing.T) { golden.Assert(t, res.Stdout(), GoldenFile("ls-out-json")) res = c.RunDockerCmd("context", "ls", "--format", "{{ json . }}") - golden.Assert(t, res.Stdout(), GoldenFile("ls-out-json")) + golden.Assert(t, res.Stdout(), GoldenFile("ls-out-legacy-json")) }) t.Run("inspect", func(t *testing.T) { diff --git a/tests/e2e/testdata/ls-out-json-windows.golden b/tests/e2e/testdata/ls-out-json-windows.golden index c16354247..4d2c3306e 100644 --- a/tests/e2e/testdata/ls-out-json-windows.golden +++ b/tests/e2e/testdata/ls-out-json-windows.golden @@ -1 +1 @@ -[{"Current":true,"Description":"Current DOCKER_HOST based configuration","DockerEndpoint":"npipe:////./pipe/docker_engine","KubernetesEndpoint":"","Type":"moby","Name":"default","StackOrchestrator":"swarm"}] +[{"Current":true,"Description":"Current DOCKER_HOST based configuration","DockerEndpoint":"npipe:////./pipe/docker_engine","KubernetesEndpoint":"","ContextType":"moby","Name":"default","StackOrchestrator":"swarm"}] diff --git a/tests/e2e/testdata/ls-out-json.golden b/tests/e2e/testdata/ls-out-json.golden index 828827532..c387b2cde 100644 --- a/tests/e2e/testdata/ls-out-json.golden +++ b/tests/e2e/testdata/ls-out-json.golden @@ -1 +1 @@ -[{"Current":true,"Description":"Current DOCKER_HOST based configuration","DockerEndpoint":"unix:///var/run/docker.sock","KubernetesEndpoint":"","Type":"moby","Name":"default","StackOrchestrator":"swarm"}] +[{"Current":true,"Description":"Current DOCKER_HOST based configuration","DockerEndpoint":"unix:///var/run/docker.sock","KubernetesEndpoint":"","ContextType":"moby","Name":"default","StackOrchestrator":"swarm"}] diff --git a/tests/e2e/testdata/ls-out-legacy-json-windows.golden b/tests/e2e/testdata/ls-out-legacy-json-windows.golden new file mode 100644 index 000000000..8417af140 --- /dev/null +++ b/tests/e2e/testdata/ls-out-legacy-json-windows.golden @@ -0,0 +1 @@ +{"Current":true,"Description":"Current DOCKER_HOST based configuration","DockerEndpoint":"npipe:////./pipe/docker_engine","KubernetesEndpoint":"","ContextType":"moby","Name":"default","StackOrchestrator":"swarm"} diff --git a/tests/e2e/testdata/ls-out-legacy-json.golden b/tests/e2e/testdata/ls-out-legacy-json.golden new file mode 100644 index 000000000..dadb250bb --- /dev/null +++ b/tests/e2e/testdata/ls-out-legacy-json.golden @@ -0,0 +1 @@ +{"Current":true,"Description":"Current DOCKER_HOST based configuration","DockerEndpoint":"unix:///var/run/docker.sock","KubernetesEndpoint":"","ContextType":"moby","Name":"default","StackOrchestrator":"swarm"}