Applications (expr) topology

This commit is contained in:
Peter Bourgon
2015-09-10 11:51:31 +02:00
parent a94731c59b
commit f259f9306d
6 changed files with 39 additions and 3 deletions

View File

@@ -16,7 +16,7 @@ func TestAPITopology(t *testing.T) {
if err := json.Unmarshal(body, &topologies); err != nil {
t.Fatalf("JSON parse error: %s", err)
}
equals(t, 3, len(topologies))
equals(t, 4, len(topologies))
for _, topology := range topologies {
is200(t, ts, topology.URL)

View File

@@ -12,6 +12,7 @@ import (
"github.com/gorilla/mux"
"github.com/weaveworks/scope/render"
"github.com/weaveworks/scope/render/dsl"
"github.com/weaveworks/scope/report"
"github.com/weaveworks/scope/xfer"
)
@@ -137,6 +138,21 @@ var topologyRegistry = map[string]topologyView{
parent: "",
renderer: render.FilterUnconnected(render.ProcessWithContainerNameRenderer{}),
},
"applications-expr": {
human: "Applications (expr)",
parent: "",
renderer: render.CustomRenderer{
Renderer: render.Map{
Renderer: render.SelectAll,
MapFunc: render.MapIdentity,
},
RenderFunc: dsl.ParseExpressions(
"ALL GROUPBY {{pid}}",
"NOT WITH {{pid}} REMOVE",
"NOT CONNECTED REMOVE",
).Eval,
},
},
"applications-by-name": {
human: "by name",
parent: "applications",

View File

@@ -341,7 +341,11 @@ func cp(dst render.RenderableNodes, src render.RenderableNodes, id string) {
}
func merge(dst render.RenderableNodes, dstID string, src render.RenderableNodes, srcID string) {
dst[dstID] = dst[dstID].Merge(src[srcID])
dstNode, ok := dst[dstID]
if !ok {
dstNode = render.NewRenderableNode(dstID)
}
dst[dstID] = dstNode.Merge(src[srcID])
// Every transform that calls merge must call shift at the end, to update
// adjacency lists and edge metadatas.

View File

@@ -95,7 +95,7 @@ func ParseExpressions(strs ...string) Expressions {
for _, str := range strs {
expr, err := ParseExpression(str)
if err != nil {
log.Printf("%s: %v", str, err)
log.Printf("%q: %v", str, err)
continue
}
exprs = append(exprs, expr)

View File

@@ -31,6 +31,11 @@ const (
// If the output is empty, the node shall be omitted from the rendered topology.
type MapFunc func(RenderableNode, report.Networks) RenderableNodes
// MapIdentity returns a perfect identity mapping of the input domain.
func MapIdentity(n RenderableNode, _ report.Networks) RenderableNodes {
return RenderableNodes{n.ID: n}
}
// MapEndpointIdentity maps an endpoint topology node to a single endpoint
// renderable node. As it is only ever run on endpoint topology nodes, we
// expect that certain keys are present.

View File

@@ -86,4 +86,15 @@ var (
SelectHost = TopologySelector(func(r report.Report) RenderableNodes {
return MakeRenderableNodes(r.Host)
})
// SelectAll merges all topologies.
SelectAll = TopologySelector(func(r report.Report) RenderableNodes {
rns := RenderableNodes{}
for _, t := range r.Topologies() {
for id, rn := range MakeRenderableNodes(t) {
rns[id] = rn
}
}
return rns
})
)