Merge pull request #6929 from vrothberg/fix-9627

version/info: format: allow more json variants
This commit is contained in:
OpenShift Merge Robot
2020-07-11 13:13:31 +02:00
committed by GitHub
6 changed files with 91 additions and 18 deletions

9
cmd/podman/parse/json.go Normal file
View File

@ -0,0 +1,9 @@
package parse
import "regexp"
var jsonFormatRegex = regexp.MustCompile(`^(\s*json\s*|\s*{{\s*json\s*\.\s*}}\s*)$`)
func MatchesJSONFormat(s string) bool {
return jsonFormatRegex.Match([]byte(s))
}

View File

@ -0,0 +1,30 @@
package parse
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestMatchesJSONFormat(t *testing.T) {
tests := []struct {
input string
expected bool
}{
{"json", true},
{" json", true},
{"json ", true},
{" json ", true},
{"{{json .}}", true},
{"{{ json .}}", true},
{"{{json . }}", true},
{" {{ json . }} ", true},
{"{{json }}", false},
{"{{json .", false},
{"json . }}", false},
}
for _, tt := range tests {
assert.Equal(t, tt.expected, MatchesJSONFormat(tt.input))
}
}

View File

@ -5,6 +5,7 @@ import (
"os" "os"
"text/template" "text/template"
"github.com/containers/libpod/v2/cmd/podman/parse"
"github.com/containers/libpod/v2/cmd/podman/registry" "github.com/containers/libpod/v2/cmd/podman/registry"
"github.com/containers/libpod/v2/cmd/podman/validate" "github.com/containers/libpod/v2/cmd/podman/validate"
"github.com/containers/libpod/v2/pkg/domain/entities" "github.com/containers/libpod/v2/pkg/domain/entities"
@ -68,7 +69,7 @@ func info(cmd *cobra.Command, args []string) error {
return err return err
} }
if inFormat == "json" { if parse.MatchesJSONFormat(inFormat) {
b, err := json.MarshalIndent(info, "", " ") b, err := json.MarshalIndent(info, "", " ")
if err != nil { if err != nil {
return err return err

View File

@ -8,6 +8,7 @@ import (
"text/tabwriter" "text/tabwriter"
"github.com/containers/buildah/pkg/formats" "github.com/containers/buildah/pkg/formats"
"github.com/containers/libpod/v2/cmd/podman/parse"
"github.com/containers/libpod/v2/cmd/podman/registry" "github.com/containers/libpod/v2/cmd/podman/registry"
"github.com/containers/libpod/v2/cmd/podman/validate" "github.com/containers/libpod/v2/cmd/podman/validate"
"github.com/containers/libpod/v2/libpod/define" "github.com/containers/libpod/v2/libpod/define"
@ -41,7 +42,7 @@ func version(cmd *cobra.Command, args []string) error {
} }
switch { switch {
case versionFormat == "json", versionFormat == "{{ json .}}": case parse.MatchesJSONFormat(versionFormat):
s, err := json.MarshalToString(versions) s, err := json.MarshalToString(versions)
if err != nil { if err != nil {
return err return err

View File

@ -11,6 +11,7 @@ import (
. "github.com/containers/libpod/v2/test/utils" . "github.com/containers/libpod/v2/test/utils"
. "github.com/onsi/ginkgo" . "github.com/onsi/ginkgo"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
. "github.com/onsi/gomega/gexec"
) )
var _ = Describe("Podman Info", func() { var _ = Describe("Podman Info", func() {
@ -35,11 +36,30 @@ var _ = Describe("Podman Info", func() {
processTestResult(f) processTestResult(f)
}) })
It("podman info json output", func() { It("podman info --format json", func() {
session := podmanTest.Podman([]string{"info", "--format=json"}) tests := []struct {
session.WaitWithDefaultTimeout() input string
Expect(session.ExitCode()).To(Equal(0)) success bool
exitCode int
}{
{"json", true, 0},
{" json", true, 0},
{"json ", true, 0},
{" json ", true, 0},
{"{{json .}}", true, 0},
{"{{ json .}}", true, 0},
{"{{json . }}", true, 0},
{" {{ json . }} ", true, 0},
{"{{json }}", false, 125},
{"{{json .", false, 125},
{"json . }}", false, 0}, // Note: this does NOT fail but produces garbage
}
for _, tt := range tests {
session := podmanTest.Podman([]string{"info", "--format", tt.input})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(tt.exitCode))
Expect(session.IsJSONOutputValid()).To(Equal(tt.success))
}
}) })
It("podman info --format GO template", func() { It("podman info --format GO template", func() {

View File

@ -55,17 +55,29 @@ var _ = Describe("Podman version", func() {
}) })
It("podman version --format json", func() { It("podman version --format json", func() {
session := podmanTest.Podman([]string{"version", "--format", "json"}) tests := []struct {
session.WaitWithDefaultTimeout() input string
Expect(session).Should(Exit(0)) success bool
Expect(session.IsJSONOutputValid()).To(BeTrue()) exitCode int
}) }{
{"json", true, 0},
It("podman version --format json", func() { {" json", true, 0},
session := podmanTest.Podman([]string{"version", "--format", "{{ json .}}"}) {"json ", true, 0},
session.WaitWithDefaultTimeout() {" json ", true, 0},
Expect(session).Should(Exit(0)) {"{{json .}}", true, 0},
Expect(session.IsJSONOutputValid()).To(BeTrue()) {"{{ json .}}", true, 0},
{"{{json . }}", true, 0},
{" {{ json . }} ", true, 0},
{"{{json }}", false, 125},
{"{{json .", false, 125},
{"json . }}", false, 0}, // Note: this does NOT fail but produces garbage
}
for _, tt := range tests {
session := podmanTest.Podman([]string{"version", "--format", tt.input})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(tt.exitCode))
Expect(session.IsJSONOutputValid()).To(Equal(tt.success))
}
}) })
It("podman version --format GO template", func() { It("podman version --format GO template", func() {