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 <jhonce@redhat.com>
This commit is contained in:
Jhon Honce
2020-12-07 15:34:14 -07:00
parent e2f91207fc
commit ce474788fd
3 changed files with 39 additions and 1 deletions

View File

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

View File

@ -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"}]}"`))
})
})

View File

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