Add new topology view for Docker Swarm services

This commit is contained in:
Mike Lang
2017-04-14 12:50:28 -07:00
parent 327b909956
commit 2b208580ab
6 changed files with 49 additions and 4 deletions

View File

@@ -33,6 +33,7 @@ const (
weaveID = "weave"
ecsTasksID = "ecs-tasks"
ecsServicesID = "ecs-services"
swarmServicesID = "swarm-services"
)
var (
@@ -252,6 +253,14 @@ func MakeRegistry() *Registry {
Options: []APITopologyOptionGroup{unmanagedFilter},
HideIfEmpty: true,
},
APITopologyDesc{
id: swarmServicesID,
renderer: render.SwarmServiceRenderer,
Name: "services",
Rank: 3,
Options: []APITopologyOptionGroup{unmanagedFilter},
HideIfEmpty: true,
},
APITopologyDesc{
id: hostsID,
renderer: render.HostRenderer,

View File

@@ -40,7 +40,7 @@ func TestAPITopology(t *testing.T) {
if err := decoder.Decode(&topologies); err != nil {
t.Fatalf("JSON parse error: %s", err)
}
equals(t, 5, len(topologies))
equals(t, 6, len(topologies))
for _, topology := range topologies {
is200(t, ts, topology.URL)
@@ -50,7 +50,7 @@ func TestAPITopology(t *testing.T) {
}
// TODO: add ECS nodes in report fixture
if topology.Name == "Tasks" {
if topology.Name == "Tasks" || topology.Name == "services" {
continue
}
@@ -200,7 +200,7 @@ func TestAPITopologyAddsKubernetes(t *testing.T) {
if err := decoder.Decode(&topologies); err != nil {
t.Fatalf("JSON parse error: %s", err)
}
equals(t, 5, len(topologies))
equals(t, 6, len(topologies))
// Enable the kubernetes topologies
rpt := report.MakeReport()
@@ -234,7 +234,7 @@ func TestAPITopologyAddsKubernetes(t *testing.T) {
if err := decoder.Decode(&topologies); err != nil {
t.Fatalf("JSON parse error: %s", err)
}
equals(t, 5, len(topologies))
equals(t, 6, len(topologies))
found := false
for _, topology := range topologies {

View File

@@ -4,6 +4,7 @@ import (
"sort"
"github.com/weaveworks/scope/probe/awsecs"
"github.com/weaveworks/scope/probe/docker"
"github.com/weaveworks/scope/probe/host"
"github.com/weaveworks/scope/probe/kubernetes"
"github.com/weaveworks/scope/report"
@@ -27,6 +28,7 @@ var (
report.Service: kubernetesParentLabel,
report.ECSTask: latestLookup(awsecs.TaskFamily),
report.ECSService: ecsServiceParentLabel,
report.SwarmService: latestLookup(docker.ServiceName),
report.ContainerImage: containerImageParentLabel,
report.Host: latestLookup(host.HostName),
}

View File

@@ -71,6 +71,7 @@ var renderers = map[string]func(NodeSummary, report.Node) (NodeSummary, bool){
report.ReplicaSet: podGroupNodeSummary,
report.ECSTask: ecsTaskNodeSummary,
report.ECSService: ecsServiceNodeSummary,
report.SwarmService: swarmServiceNodeSummary,
report.Host: hostNodeSummary,
report.Overlay: weaveNodeSummary,
report.Endpoint: nil, // Do not render
@@ -93,6 +94,7 @@ var primaryAPITopology = map[string]string{
report.Service: "services",
report.ECSTask: "ecs-tasks",
report.ECSService: "ecs-services",
report.SwarmService: "swarm-services",
report.Host: "hosts",
}
@@ -276,6 +278,11 @@ func ecsServiceNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool)
return base, true
}
func swarmServiceNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool) {
base.Label, _ = n.Latest.Lookup(docker.ServiceName)
return base, true
}
func hostNodeSummary(base NodeSummary, n report.Node) (NodeSummary, bool) {
var (
hostname, _ = n.Latest.Lookup(host.HostName)

View File

@@ -33,5 +33,6 @@ var (
SelectReplicaSet = TopologySelector(report.ReplicaSet)
SelectECSTask = TopologySelector(report.ECSTask)
SelectECSService = TopologySelector(report.ECSService)
SelectSwarmService = TopologySelector(report.SwarmService)
SelectOverlay = TopologySelector(report.Overlay)
)

26
render/swarm.go Normal file
View File

@@ -0,0 +1,26 @@
package render
import (
"github.com/weaveworks/scope/report"
)
// SwarmServiceRenderer is a Renderer for Docker Swarm services
var SwarmServiceRenderer = ConditionalRenderer(renderSwarmTopologies,
MakeMap(
PropagateSingleMetrics(report.Container),
MakeReduce(
MakeMap(
Map2Parent(report.SwarmService, UnmanagedID, nil),
MakeFilter(
IsRunning,
ContainerWithImageNameRenderer,
),
),
SelectSwarmService,
),
),
)
func renderSwarmTopologies(rpt report.Report) bool {
return len(rpt.SwarmService.Nodes) >= 1
}