Skip to content

Commit 9017fc0

Browse files
authored
Merge pull request #743 from fahedouch/fix-inspector
enhance inspect
2 parents b235a09 + a112344 commit 9017fc0

File tree

5 files changed

+51
-5
lines changed

5 files changed

+51
-5
lines changed

cmd/nerdctl/container_inspect.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ func containerInspectAction(cmd *cobra.Command, args []string) error {
8181
if len(errs) > 0 {
8282
return fmt.Errorf("%d errors: %v", len(errs), errs)
8383
}
84+
8485
return formatSlice(cmd, f.entries)
8586
}
8687

cmd/nerdctl/fmtutil.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,12 @@ func formatSlice(cmd *cobra.Command, x []interface{}) error {
7575
for _, f := range x {
7676
var b bytes.Buffer
7777
if err := tmpl.Execute(&b, f); err != nil {
78-
return err
78+
if _, ok := err.(template.ExecError); ok {
79+
// FallBack to Raw Format
80+
if err = tryRawFormat(&b, f, tmpl); err != nil {
81+
return err
82+
}
83+
}
7984
}
8085
if _, err = fmt.Fprintf(cmd.OutOrStdout(), b.String()+"\n"); err != nil {
8186
return err
@@ -85,6 +90,29 @@ func formatSlice(cmd *cobra.Command, x []interface{}) error {
8590
return nil
8691
}
8792

93+
func tryRawFormat(b *bytes.Buffer, f interface{}, tmpl *template.Template) error {
94+
m, err := json.MarshalIndent(f, "", " ")
95+
if err != nil {
96+
return err
97+
}
98+
99+
var raw interface{}
100+
rdr := bytes.NewReader(m)
101+
dec := json.NewDecoder(rdr)
102+
dec.UseNumber()
103+
104+
if rawErr := dec.Decode(&raw); rawErr != nil {
105+
return fmt.Errorf("unable to read inspect data: %v", rawErr)
106+
}
107+
108+
tmplMissingKey := tmpl.Option("missingkey=error")
109+
if rawErr := tmplMissingKey.Execute(b, raw); rawErr != nil {
110+
return fmt.Errorf("Template parsing error: %v", rawErr)
111+
}
112+
113+
return nil
114+
}
115+
88116
// parseTemplate wraps github.com/docker/cli/templates.Parse() to allow `json` as an alias of `{{json .}}`.
89117
// parseTemplate can be removed when https://github.com/docker/cli/pull/3355 gets merged and tagged (Docker 22.XX).
90118
func parseTemplate(format string) (*template.Template, error) {

cmd/nerdctl/image_inspect.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ func imageInspectActionWithPlatform(cmd *cobra.Command, args []string, platform
128128
if len(errs) > 0 {
129129
return fmt.Errorf("%d errors: %v", len(errs), errs)
130130
}
131+
131132
return formatSlice(cmd, f.entries)
132133
}
133134

cmd/nerdctl/image_inspect_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,14 @@ func TestImageInspectContainsSomeStuff(t *testing.T) {
3333
assert.Assert(base.T, inspect.RootFS.Type != "")
3434
assert.Assert(base.T, inspect.Architecture != "")
3535
}
36+
37+
func TestImageInspectWithFormat(t *testing.T) {
38+
base := testutil.NewBase(t)
39+
40+
base.Cmd("pull", testutil.CommonImage).AssertOK()
41+
// test RawFormat support
42+
base.Cmd("image", "inspect", testutil.CommonImage, "--format", "{{.Id}}").AssertOK()
43+
44+
// test typedFormat support
45+
base.Cmd("image", "inspect", testutil.CommonImage, "--format", "{{.ID}}").AssertOK()
46+
}

cmd/nerdctl/inspect.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ func inspectAction(cmd *cobra.Command, args []string) error {
7474
},
7575
}
7676

77+
var errs []error
7778
for _, req := range args {
7879
ni, err := imagewalker.Walk(ctx, req)
7980
if err != nil {
@@ -93,16 +94,20 @@ func inspectAction(cmd *cobra.Command, args []string) error {
9394
return fmt.Errorf("no such object %s", req)
9495
}
9596
if ni != 0 {
96-
if err := imageInspectActionWithPlatform(cmd, args, ""); err != nil {
97-
return err
97+
if err := imageInspectActionWithPlatform(cmd, []string{req}, ""); err != nil {
98+
errs = append(errs, err)
9899
}
99100
} else {
100-
if err := containerInspectAction(cmd, args); err != nil {
101-
return err
101+
if err := containerInspectAction(cmd, []string{req}); err != nil {
102+
errs = append(errs, err)
102103
}
103104
}
104105
}
105106

107+
if len(errs) > 0 {
108+
return fmt.Errorf("%d errors: %v", len(errs), errs)
109+
}
110+
106111
return nil
107112
}
108113

0 commit comments

Comments
 (0)