Merge pull request #437 from weaveworks/436-container-image-name-in-rank

Make container rank the image _name_
This commit is contained in:
Paul Bellamy
2015-09-04 17:08:59 +01:00
5 changed files with 47 additions and 8 deletions

View File

@@ -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",

View File

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

View File

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

View File

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

View File

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