From ce474788fd9bcecdb1cd6730fecd16e5d8840ae5 Mon Sep 17 00:00:00 2001 From: Jhon Honce Date: Mon, 7 Dec 2020 15:34:14 -0700 Subject: [PATCH] Restore json format for fields as well as whole structs * Add template func to inspect template processing * Added test using repro from #8444 Fixes #8444 Signed-off-by: Jhon Honce --- cmd/podman/inspect/inspect.go | 11 ++++++++++- test/e2e/inspect_test.go | 15 +++++++++++++++ test/utils/utils.go | 14 ++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/cmd/podman/inspect/inspect.go b/cmd/podman/inspect/inspect.go index 13f36ebbd2..cc48b7ae42 100644 --- a/cmd/podman/inspect/inspect.go +++ b/cmd/podman/inspect/inspect.go @@ -1,6 +1,7 @@ package inspect import ( + "bytes" "context" "encoding/json" // due to a bug in json-iterator it cannot be used here "fmt" @@ -245,7 +246,15 @@ func printJSON(data []interface{}) error { } func printTmpl(typ, row string, data []interface{}) error { - t, err := template.New(typ + " inspect").Parse(row) + t, err := template.New(typ + " inspect").Funcs(map[string]interface{}{ + "json": func(v interface{}) string { + b := &bytes.Buffer{} + e := registry.JSONLibrary().NewEncoder(b) + e.SetEscapeHTML(false) + _ = e.Encode(v) + return strings.TrimSpace(b.String()) + }, + }).Parse(row) if err != nil { return err } diff --git a/test/e2e/inspect_test.go b/test/e2e/inspect_test.go index c2e0f44072..97f77414eb 100644 --- a/test/e2e/inspect_test.go +++ b/test/e2e/inspect_test.go @@ -7,6 +7,7 @@ import ( . "github.com/containers/podman/v2/test/utils" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + . "github.com/onsi/gomega/gexec" "github.com/opencontainers/selinux/go-selinux" ) @@ -428,4 +429,18 @@ var _ = Describe("Podman inspect", func() { Expect(inspect).To(ExitWithError()) }) + // Fixes https://github.com/containers/podman/issues/8444 + It("podman inspect --format json .NetworkSettings.Ports", func() { + ctnrName := "Ctnr_" + RandomString(25) + + create := podmanTest.Podman([]string{"create", "--name", ctnrName, "-p", "8080:80", ALPINE}) + create.WaitWithDefaultTimeout() + Expect(create).Should(Exit(0)) + + inspect := podmanTest.Podman([]string{"inspect", `--format="{{json .NetworkSettings.Ports}}"`, ctnrName}) + inspect.WaitWithDefaultTimeout() + Expect(inspect).Should(Exit(0)) + Expect(inspect.OutputToString()).To(Equal(`"{"80/tcp":[{"HostIp":"","HostPort":"8080"}]}"`)) + }) + }) diff --git a/test/utils/utils.go b/test/utils/utils.go index d089396787..027e96427a 100644 --- a/test/utils/utils.go +++ b/test/utils/utils.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "math/rand" "os" "os/exec" "runtime" @@ -465,3 +466,16 @@ func Containerized() bool { } return false } + +var randomLetters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + +// RandomString returns a string of given length composed of random characters +func RandomString(n int) string { + rand.Seed(GinkgoRandomSeed()) + + b := make([]rune, n) + for i := range b { + b[i] = randomLetters[rand.Intn(len(randomLetters))] + } + return string(b) +}