diff --git a/cmd/podman/inspect/inspect.go b/cmd/podman/inspect/inspect.go index 13f36ebbd29a..cc48b7ae42c0 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 c2e0f4407280..97f77414ebf6 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 d089396787f7..027e96427a1a 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) +}