Add containers by hostname view.

This commit is contained in:
Tom Wilkie
2015-10-05 15:01:58 +00:00
parent 6ad182a144
commit de6742db11
5 changed files with 58 additions and 6 deletions

View File

@@ -224,6 +224,15 @@ var topologyRegistry = &registry{
{"hide", "System containers hidden", true, render.FilterSystem},
}},
},
"containers-by-hostname": {
human: "by hostname",
parent: "containers",
renderer: render.ContainerHostnameRenderer,
options: optionParams{"system": {
{"show", "System containers shown", false, nop},
{"hide", "System containers hidden", true, render.FilterSystem},
}},
},
"hosts": {
human: "Hosts",
parent: "",

View File

@@ -22,11 +22,12 @@ import (
// These constants are keys used in node metadata
const (
ContainerName = "docker_container_name"
ContainerCommand = "docker_container_command"
ContainerPorts = "docker_container_ports"
ContainerCreated = "docker_container_created"
ContainerIPs = "docker_container_ips"
ContainerName = "docker_container_name"
ContainerCommand = "docker_container_command"
ContainerPorts = "docker_container_ports"
ContainerCreated = "docker_container_created"
ContainerIPs = "docker_container_ips"
ContainerHostname = "docker_container_hostname"
NetworkRxDropped = "network_rx_dropped"
NetworkRxBytes = "network_rx_bytes"
@@ -221,6 +222,7 @@ func (c *container) GetNode(localAddrs []net.IP) report.Node {
ImageID: c.container.Image,
ContainerIPs: strings.Join(append(c.container.NetworkSettings.SecondaryIPAddresses,
c.container.NetworkSettings.IPAddress), " "),
ContainerHostname: c.container.Config.Hostname,
})
AddLabels(result, c.container.Config.Labels)

View File

@@ -80,7 +80,7 @@ func TestContainer(t *testing.T) {
test.Poll(t, 100*time.Millisecond, want, func() interface{} {
node := c.GetNode([]net.IP{})
for k, v := range node.Metadata {
if v == "0" {
if v == "0" || v == "" {
delete(node.Metadata, k)
}
}

View File

@@ -594,6 +594,28 @@ func MapContainer2Pod(n RenderableNode, _ report.Networks) RenderableNodes {
return RenderableNodes{id: result}
}
// MapContainer2Hostname maps container RenderableNodes to 'hostname' renderabled nodes..
func MapContainer2Hostname(n RenderableNode, _ report.Networks) RenderableNodes {
// Propogate all pseudo nodes
if n.Pseudo {
return RenderableNodes{n.ID: n}
}
// Otherwise, if some some reason the container doesn't have a hostname
// (maybe slightly out of sync reports), just drop it
id, ok := n.Node.Metadata[docker.ContainerHostname]
if !ok {
return RenderableNodes{}
}
// Add container-<id> key to NMD, which will later be counted to produce the minor label
result := NewDerivedNode(id, n)
result.LabelMajor = id
result.Rank = id
result.Node.Counters[containersKey] = 1
return RenderableNodes{id: result}
}
// MapCountContainers maps 1:1 container image nodes, counting
// the number of containers grouped together and putting
// that info in the minor label.

View File

@@ -171,6 +171,25 @@ var ContainerImageRenderer = Map{
},
}
// ContainerHostnameRenderer is a Renderer which produces a renderable container
// by hostname graph..
var ContainerHostnameRenderer = Map{
MapFunc: MapCountContainers,
Renderer: Map{
MapFunc: MapContainer2Hostname,
Renderer: MakeReduce(
Map{
MapFunc: MapContainer2ContainerImage,
Renderer: ContainerRenderer,
},
Map{
MapFunc: MapContainerImageIdentity,
Renderer: SelectContainerImage,
},
),
},
}
// AddressRenderer is a Renderer which produces a renderable address
// graph from the address topology.
var AddressRenderer = Map{