Merge pull request #545 from weaveworks/544-containers-by-hostname

Add containers by hostname view.
This commit is contained in:
Tom Wilkie
2015-10-10 09:08:24 +01:00
6 changed files with 65 additions and 7 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"
@@ -70,6 +71,7 @@ type Container interface {
ID() string
Image() string
PID() int
Hostname() string
GetNode([]net.IP) report.Node
StartGatheringStats() error
@@ -100,6 +102,15 @@ func (c *container) PID() int {
return c.container.State.Pid
}
func (c *container) Hostname() string {
if c.container.Config.Domainname == "" {
return c.container.Config.Hostname
}
return fmt.Sprintf("%s.%s", c.container.Config.Hostname,
c.container.Config.Domainname)
}
func (c *container) StartGatheringStats() error {
c.Lock()
defer c.Unlock()
@@ -221,6 +232,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.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

@@ -31,6 +31,10 @@ func (c *mockContainer) Image() string {
return c.c.Image
}
func (c *mockContainer) Hostname() string {
return ""
}
func (c *mockContainer) StartGatheringStats() error {
return nil
}

View File

@@ -484,7 +484,7 @@ func MapContainer2ContainerImage(n RenderableNode, _ report.Networks) Renderable
return RenderableNodes{}
}
// Add container-<id> key to NMD, which will later be counted to produce the minor label
// Add container id key to the counters, which will later be counted to produce the minor label
result := NewDerivedNode(id, n)
result.Node.Counters[containersKey] = 1
return RenderableNodes{id: result}
@@ -594,6 +594,29 @@ 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{}
}
result := NewDerivedNode(id, n)
result.LabelMajor = id
result.Rank = id
// Add container id key to the counters, which will later be counted to produce the minor label
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,16 @@ 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: ContainerRenderer,
},
}
// AddressRenderer is a Renderer which produces a renderable address
// graph from the address topology.
var AddressRenderer = Map{