diff --git a/render/detailed_node_test.go b/render/detailed_node_test.go index 0fa7499c9..4e06ec406 100644 --- a/render/detailed_node_test.go +++ b/render/detailed_node_test.go @@ -141,6 +141,16 @@ func TestMakeDetailedContainerNode(t *testing.T) { LabelMinor: test.ServerHostName, Pseudo: false, Tables: []render.Table{ + { + Title: `Container Image "image/server"`, + Numeric: false, + Rank: 4, + Rows: []render.Row{ + {"Image ID", test.ServerContainerImageID, "", false}, + {`Label "foo1"`, `bar1`, "", false}, + {`Label "foo2"`, `bar2`, "", false}, + }, + }, { Title: `Container "server"`, Numeric: false, diff --git a/render/expected/expected.go b/render/expected/expected.go index c0b0dd0dd..79c0d91d8 100644 --- a/render/expected/expected.go +++ b/render/expected/expected.go @@ -215,6 +215,7 @@ var ( Rank: test.ClientContainerImageID, Pseudo: false, Origins: report.MakeIDList( + test.ClientContainerImageNodeID, test.ClientContainerNodeID, test.Client54001NodeID, test.Client54002NodeID, @@ -235,6 +236,7 @@ var ( Rank: test.ServerContainerImageID, Pseudo: false, Origins: report.MakeIDList( + test.ServerContainerImageNodeID, test.ServerContainerNodeID, test.Server80NodeID, test.ServerProcessNodeID, diff --git a/render/mapping.go b/render/mapping.go index 7c13d82dd..24c6bcb65 100644 --- a/render/mapping.go +++ b/render/mapping.go @@ -121,7 +121,12 @@ func MapContainerIdentity(m RenderableNode, _ report.Networks) RenderableNodes { rank = m.Metadata[docker.ImageID] ) - return RenderableNodes{id: NewRenderableNodeWith(id, major, minor, rank, m)} + node := NewRenderableNodeWith(id, major, minor, rank, m) + if imageID, ok := m.Metadata[docker.ImageID]; ok { + scope, _, _ := report.ParseContainerNodeID(m.ID) + node.Origins = node.Origins.Add(report.MakeContainerNodeID(scope, imageID)) + } + return RenderableNodes{id: node} } // MapContainerImageIdentity maps a container image topology node to container diff --git a/report/id.go b/report/id.go index 2d3ebc0c0..3dc56b136 100644 --- a/report/id.go +++ b/report/id.go @@ -87,6 +87,16 @@ func ParseEndpointNodeID(endpointNodeID string) (hostID, address, port string, o return fields[0], fields[1], fields[2], true } +// ParseContainerNodeID produces the host ID, and container id from an container +// node ID. +func ParseContainerNodeID(containerNodeID string) (hostID, containerID string, ok bool) { + fields := strings.SplitN(containerNodeID, ScopeDelim, 3) + if len(fields) != 2 { + return "", "", false + } + return fields[0], fields[1], true +} + // ParseAddressNodeID produces the host ID, address from an address node ID. func ParseAddressNodeID(addressNodeID string) (hostID, address string, ok bool) { fields := strings.SplitN(addressNodeID, ScopeDelim, 2)