Skip to content
This repository has been archived by the owner on Nov 27, 2023. It is now read-only.

Commit

Permalink
Merge pull request #854 from gtardif/retro-compat-context-json-list
Browse files Browse the repository at this point in the history
Revert breaking change on `docker context ls —format “{{ json . }}`
  • Loading branch information
gtardif authored Oct 30, 2020
2 parents 8104611 + c3cc543 commit 24b40e1
Show file tree
Hide file tree
Showing 10 changed files with 46 additions and 11 deletions.
13 changes: 8 additions & 5 deletions cli/cmd/context/ls.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand All @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -141,7 +144,7 @@ type contextView struct {
Description string
DockerEndpoint string
KubernetesEndpoint string
Type string
ContextType string
Name string
StackOrchestrator string
}
Expand All @@ -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,
}
}
Expand Down
2 changes: 1 addition & 1 deletion cli/cmd/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions formatter/consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)
19 changes: 19 additions & 0 deletions formatter/formatter.go
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
11 changes: 11 additions & 0 deletions formatter/formatter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"}
`)
}
2 changes: 1 addition & 1 deletion tests/e2e/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion tests/e2e/testdata/ls-out-json-windows.golden
Original file line number Diff line number Diff line change
@@ -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"}]
2 changes: 1 addition & 1 deletion tests/e2e/testdata/ls-out-json.golden
Original file line number Diff line number Diff line change
@@ -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"}]
1 change: 1 addition & 0 deletions tests/e2e/testdata/ls-out-legacy-json-windows.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Current":true,"Description":"Current DOCKER_HOST based configuration","DockerEndpoint":"npipe:////./pipe/docker_engine","KubernetesEndpoint":"","ContextType":"moby","Name":"default","StackOrchestrator":"swarm"}
1 change: 1 addition & 0 deletions tests/e2e/testdata/ls-out-legacy-json.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Current":true,"Description":"Current DOCKER_HOST based configuration","DockerEndpoint":"unix:///var/run/docker.sock","KubernetesEndpoint":"","ContextType":"moby","Name":"default","StackOrchestrator":"swarm"}

0 comments on commit 24b40e1

Please sign in to comment.