From ccf6c1fdca365486a3725274c787b0c3406bf746 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Fri, 4 Sep 2015 10:16:17 +0000 Subject: [PATCH] Make container rank the image _name_ --- app/router.go | 2 +- render/expected/expected.go | 4 ++-- render/mapping.go | 13 +++++++++---- render/topologies.go | 34 ++++++++++++++++++++++++++++++++++ render/topologies_test.go | 2 +- 5 files changed, 47 insertions(+), 8 deletions(-) diff --git a/app/router.go b/app/router.go index a8f7b8702..88225dbc4 100644 --- a/app/router.go +++ b/app/router.go @@ -137,7 +137,7 @@ var topologyRegistry = map[string]topologyView{ "containers": { human: "Containers", parent: "", - renderer: render.ContainerRenderer, + renderer: render.ContainerWithImageNameRenderer{}, }, "containers-by-image": { human: "by image", diff --git a/render/expected/expected.go b/render/expected/expected.go index 32e88c4db..6966d1449 100644 --- a/render/expected/expected.go +++ b/render/expected/expected.go @@ -212,7 +212,7 @@ var ( ID: test.ClientContainerID, LabelMajor: "client", LabelMinor: test.ClientHostName, - Rank: test.ClientContainerImageID, + Rank: test.ClientContainerImageName, Pseudo: false, Origins: report.MakeIDList( test.ClientContainerImageNodeID, @@ -233,7 +233,7 @@ var ( ID: test.ServerContainerID, LabelMajor: "server", LabelMinor: test.ServerHostName, - Rank: test.ServerContainerImageID, + Rank: test.ServerContainerImageName, Pseudo: false, Origins: report.MakeIDList( test.ServerContainerImageNodeID, diff --git a/render/mapping.go b/render/mapping.go index 6519118c2..6945abdc7 100644 --- a/render/mapping.go +++ b/render/mapping.go @@ -398,6 +398,14 @@ func MapContainer2ContainerImage(n RenderableNode, _ report.Networks) Renderable return RenderableNodes{id: result} } +func imageNameWithoutVersion(name string) string { + parts := strings.SplitN(name, ":", 2) + if len(parts) == 2 { + return parts[0] + } + return name +} + // MapContainerImage2Name maps container images RenderableNodes to // RenderableNodes for each container image name. // @@ -414,10 +422,7 @@ func MapContainerImage2Name(n RenderableNode, _ report.Networks) RenderableNodes return RenderableNodes{} } - parts := strings.SplitN(name, ":", 2) - if len(parts) == 2 { - name = parts[0] - } + name = imageNameWithoutVersion(name) node := NewDerivedNode(name, n) node.LabelMajor = name diff --git a/render/topologies.go b/render/topologies.go index 23b9d481e..e0d675095 100644 --- a/render/topologies.go +++ b/render/topologies.go @@ -123,6 +123,40 @@ var ContainerRenderer = MakeReduce( }, ) +// ContainerWithImageNameRenderer is a Renderer which produces a container +// graph where the ranks are the image names, not their IDs +type ContainerWithImageNameRenderer struct{} + +// Render produces a process graph where the minor labels contain the +// container name, if found. +func (r ContainerWithImageNameRenderer) Render(rpt report.Report) RenderableNodes { + containers := ContainerRenderer.Render(rpt) + images := Map{ + MapFunc: MapContainerImageIdentity, + Renderer: SelectContainerImage, + }.Render(rpt) + + for id, c := range containers { + imageID, ok := c.Node.Metadata[docker.ImageID] + if !ok { + continue + } + image, ok := images[imageID] + if !ok { + continue + } + c.Rank = imageNameWithoutVersion(image.LabelMajor) + containers[id] = c + } + + return containers +} + +// EdgeMetadata produces an EdgeMetadata for a given edge. +func (r ContainerWithImageNameRenderer) EdgeMetadata(rpt report.Report, localID, remoteID string) report.EdgeMetadata { + return ContainerRenderer.EdgeMetadata(rpt, localID, remoteID) +} + // ContainerImageRenderer is a Renderer which produces a renderable container // image graph by merging the container graph and the container image topology. var ContainerImageRenderer = Map{ diff --git a/render/topologies_test.go b/render/topologies_test.go index 25f37bd5c..87dcbb54d 100644 --- a/render/topologies_test.go +++ b/render/topologies_test.go @@ -26,7 +26,7 @@ func TestProcessNameRenderer(t *testing.T) { } func TestContainerRenderer(t *testing.T) { - have := expected.Sterilize(render.ContainerRenderer.Render(test.Report)) + have := expected.Sterilize(render.ContainerWithImageNameRenderer{}.Render(test.Report)) want := expected.RenderedContainers if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have))