Merge pull request 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

@ -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))
}

@ -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))
}
}

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

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

@ -11,6 +11,7 @@ import (
. "github.com/containers/libpod/v2/test/utils"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
. "github.com/onsi/gomega/gexec"
)
var _ = Describe("Podman Info", func() {
@ -35,11 +36,30 @@ var _ = Describe("Podman Info", func() {
processTestResult(f)
})
It("podman info json output", func() {
session := podmanTest.Podman([]string{"info", "--format=json"})
session.WaitWithDefaultTimeout()
Expect(session.ExitCode()).To(Equal(0))
It("podman info --format json", func() {
tests := []struct {
input string
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() {

@ -55,17 +55,29 @@ var _ = Describe("Podman version", func() {
})
It("podman version --format json", func() {
session := podmanTest.Podman([]string{"version", "--format", "json"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
Expect(session.IsJSONOutputValid()).To(BeTrue())
})
It("podman version --format json", func() {
session := podmanTest.Podman([]string{"version", "--format", "{{ json .}}"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
Expect(session.IsJSONOutputValid()).To(BeTrue())
tests := []struct {
input string
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{"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() {