mirror of
https://github.com/containers/podman.git
synced 2025-07-31 04:12:40 +08:00
Merge pull request #6929 from vrothberg/fix-9627
version/info: format: allow more json variants
This commit is contained in:
9
cmd/podman/parse/json.go
Normal file
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))
|
||||||
|
}
|
30
cmd/podman/parse/json_test.go
Normal file
30
cmd/podman/parse/json_test.go
Normal 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))
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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() {
|
||||||
|
@ -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() {
|
||||||
|
Reference in New Issue
Block a user