mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-02 17:50:39 +00:00
Merge pull request #3005 from weaveworks/move-rendercontext
refactor: move RenderContext where it belongs
This commit is contained in:
@@ -566,8 +566,6 @@ func captureReporter(rep Reporter, f reporterHandler) CtxHandlerFunc {
|
||||
}
|
||||
}
|
||||
|
||||
type rendererHandler func(context.Context, render.Renderer, render.Transformer, report.RenderContext, http.ResponseWriter, *http.Request)
|
||||
|
||||
func (r *Registry) captureRenderer(rep Reporter, f rendererHandler) CtxHandlerFunc {
|
||||
return func(ctx context.Context, w http.ResponseWriter, req *http.Request) {
|
||||
var (
|
||||
|
||||
@@ -183,7 +183,7 @@ func getTestContainerLabelFilterTopologySummary(t *testing.T, exclude bool) (det
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return detailed.Summaries(report.RenderContext{Report: fixture.Report}, render.Render(fixture.Report, renderer, filter).Nodes), nil
|
||||
return detailed.Summaries(detailed.RenderContext{Report: fixture.Report}, render.Render(fixture.Report, renderer, filter).Nodes), nil
|
||||
}
|
||||
|
||||
func TestAPITopologyAddsKubernetes(t *testing.T) {
|
||||
|
||||
@@ -28,15 +28,26 @@ type APINode struct {
|
||||
Node detailed.Node `json:"node"`
|
||||
}
|
||||
|
||||
// RenderContextForReporter creates the rendering context for the given reporter.
|
||||
func RenderContextForReporter(rep Reporter, r report.Report) detailed.RenderContext {
|
||||
rc := detailed.RenderContext{Report: r}
|
||||
if wrep, ok := rep.(WebReporter); ok {
|
||||
rc.MetricsGraphURL = wrep.MetricsGraphURL
|
||||
}
|
||||
return rc
|
||||
}
|
||||
|
||||
type rendererHandler func(context.Context, render.Renderer, render.Transformer, detailed.RenderContext, http.ResponseWriter, *http.Request)
|
||||
|
||||
// Full topology.
|
||||
func handleTopology(ctx context.Context, renderer render.Renderer, transformer render.Transformer, rc report.RenderContext, w http.ResponseWriter, r *http.Request) {
|
||||
func handleTopology(ctx context.Context, renderer render.Renderer, transformer render.Transformer, rc detailed.RenderContext, w http.ResponseWriter, r *http.Request) {
|
||||
respondWith(w, http.StatusOK, APITopology{
|
||||
Nodes: detailed.Summaries(rc, render.Render(rc.Report, renderer, transformer).Nodes),
|
||||
})
|
||||
}
|
||||
|
||||
// Individual nodes.
|
||||
func handleNode(ctx context.Context, renderer render.Renderer, transformer render.Transformer, rc report.RenderContext, w http.ResponseWriter, r *http.Request) {
|
||||
func handleNode(ctx context.Context, renderer render.Renderer, transformer render.Transformer, rc detailed.RenderContext, w http.ResponseWriter, r *http.Request) {
|
||||
var (
|
||||
vars = mux.Vars(r)
|
||||
topologyID = vars["topology"]
|
||||
|
||||
@@ -137,7 +137,7 @@ func BenchmarkRenderProcessNames(b *testing.B) {
|
||||
|
||||
func benchmarkSummarizeTopology(b *testing.B, topologyID string) {
|
||||
r := getReport(b)
|
||||
rc := report.RenderContext{Report: r}
|
||||
rc := detailed.RenderContext{Report: r}
|
||||
nodes := renderForTopology(b, topologyID, r)
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
|
||||
@@ -37,21 +37,12 @@ type Reporter interface {
|
||||
|
||||
// WebReporter is a reporter that creates reports whose data is eventually
|
||||
// displayed on websites. It carries fields that will be forwarded to the
|
||||
// report.RenderContext
|
||||
// detailed.RenderContext
|
||||
type WebReporter struct {
|
||||
Reporter
|
||||
MetricsGraphURL string
|
||||
}
|
||||
|
||||
// RenderContextForReporter creates the rendering context for the given reporter.
|
||||
func RenderContextForReporter(rep Reporter, r report.Report) report.RenderContext {
|
||||
rc := report.RenderContext{Report: r}
|
||||
if wrep, ok := rep.(WebReporter); ok {
|
||||
rc.MetricsGraphURL = wrep.MetricsGraphURL
|
||||
}
|
||||
return rc
|
||||
}
|
||||
|
||||
// Adder is something that can accept reports. It's a convenient interface for
|
||||
// parts of the app, and several experimental components. It takes the following
|
||||
// arguments:
|
||||
|
||||
@@ -78,9 +78,15 @@ func (c *ControlInstance) CodecDecodeSelf(decoder *codec.Decoder) {
|
||||
}
|
||||
}
|
||||
|
||||
// RenderContext carries contextual data that is needed when rendering parts of the report.
|
||||
type RenderContext struct {
|
||||
report.Report
|
||||
MetricsGraphURL string
|
||||
}
|
||||
|
||||
// MakeNode transforms a renderable node to a detailed node. It uses
|
||||
// aggregate metadata, plus the set of origin node IDs, to produce tables.
|
||||
func MakeNode(topologyID string, rc report.RenderContext, ns report.Nodes, n report.Node) Node {
|
||||
func MakeNode(topologyID string, rc RenderContext, ns report.Nodes, n report.Node) Node {
|
||||
summary, _ := MakeNodeSummary(rc, n)
|
||||
return Node{
|
||||
NodeSummary: summary,
|
||||
@@ -181,7 +187,7 @@ var nodeSummaryGroupSpecs = []struct {
|
||||
},
|
||||
}
|
||||
|
||||
func children(rc report.RenderContext, n report.Node) []NodeSummaryGroup {
|
||||
func children(rc RenderContext, n report.Node) []NodeSummaryGroup {
|
||||
summaries := map[string][]NodeSummary{}
|
||||
n.Children.ForEach(func(child report.Node) {
|
||||
if child.ID == n.ID {
|
||||
|
||||
@@ -18,7 +18,7 @@ import (
|
||||
)
|
||||
|
||||
func child(t *testing.T, r render.Renderer, id string) detailed.NodeSummary {
|
||||
s, ok := detailed.MakeNodeSummary(report.RenderContext{Report: fixture.Report}, r.Render(fixture.Report).Nodes[id])
|
||||
s, ok := detailed.MakeNodeSummary(detailed.RenderContext{Report: fixture.Report}, r.Render(fixture.Report).Nodes[id])
|
||||
if !ok {
|
||||
t.Fatalf("Expected node %s to be summarizable, but wasn't", id)
|
||||
}
|
||||
@@ -32,7 +32,7 @@ func connectionID(nodeID string, addr string) string {
|
||||
func TestMakeDetailedHostNode(t *testing.T) {
|
||||
renderableNodes := render.HostRenderer.Render(fixture.Report).Nodes
|
||||
renderableNode := renderableNodes[fixture.ClientHostNodeID]
|
||||
have := detailed.MakeNode("hosts", report.RenderContext{Report: fixture.Report}, renderableNodes, renderableNode)
|
||||
have := detailed.MakeNode("hosts", detailed.RenderContext{Report: fixture.Report}, renderableNodes, renderableNode)
|
||||
|
||||
containerImageNodeSummary := child(t, render.ContainerImageRenderer, expected.ClientContainerImageNodeID)
|
||||
containerNodeSummary := child(t, render.ContainerRenderer, fixture.ClientContainerNodeID)
|
||||
@@ -185,7 +185,7 @@ func TestMakeDetailedContainerNode(t *testing.T) {
|
||||
if !ok {
|
||||
t.Fatalf("Node not found: %s", id)
|
||||
}
|
||||
have := detailed.MakeNode("containers", report.RenderContext{Report: fixture.Report}, renderableNodes, renderableNode)
|
||||
have := detailed.MakeNode("containers", detailed.RenderContext{Report: fixture.Report}, renderableNodes, renderableNode)
|
||||
|
||||
serverProcessNodeSummary := child(t, render.ProcessRenderer, fixture.ServerProcessNodeID)
|
||||
serverProcessNodeSummary.Linkable = true
|
||||
@@ -317,7 +317,7 @@ func TestMakeDetailedPodNode(t *testing.T) {
|
||||
if !ok {
|
||||
t.Fatalf("Node not found: %s", id)
|
||||
}
|
||||
have := detailed.MakeNode("pods", report.RenderContext{Report: fixture.Report}, renderableNodes, renderableNode)
|
||||
have := detailed.MakeNode("pods", detailed.RenderContext{Report: fixture.Report}, renderableNodes, renderableNode)
|
||||
|
||||
containerNodeSummary := child(t, render.ContainerWithImageNameRenderer, fixture.ServerContainerNodeID)
|
||||
serverProcessNodeSummary := child(t, render.ProcessRenderer, fixture.ServerProcessNodeID)
|
||||
|
||||
@@ -138,7 +138,7 @@ func MakeBasicNodeSummary(r report.Report, n report.Node) (BasicNodeSummary, boo
|
||||
}
|
||||
|
||||
// MakeNodeSummary summarizes a node, if possible.
|
||||
func MakeNodeSummary(rc report.RenderContext, n report.Node) (NodeSummary, bool) {
|
||||
func MakeNodeSummary(rc RenderContext, n report.Node) (NodeSummary, bool) {
|
||||
base, ok := MakeBasicNodeSummary(rc.Report, n)
|
||||
if !ok {
|
||||
return NodeSummary{}, false
|
||||
@@ -411,7 +411,7 @@ func (s nodeSummariesByID) Less(i, j int) bool { return s[i].ID < s[j].ID }
|
||||
type NodeSummaries map[string]NodeSummary
|
||||
|
||||
// Summaries converts RenderableNodes into a set of NodeSummaries
|
||||
func Summaries(rc report.RenderContext, rns report.Nodes) NodeSummaries {
|
||||
func Summaries(rc RenderContext, rns report.Nodes) NodeSummaries {
|
||||
|
||||
result := NodeSummaries{}
|
||||
for id, node := range rns {
|
||||
|
||||
@@ -21,7 +21,7 @@ import (
|
||||
func TestSummaries(t *testing.T) {
|
||||
{
|
||||
// Just a convenient source of some rendered nodes
|
||||
have := detailed.Summaries(report.RenderContext{Report: fixture.Report}, render.ProcessRenderer.Render(fixture.Report).Nodes)
|
||||
have := detailed.Summaries(detailed.RenderContext{Report: fixture.Report}, render.ProcessRenderer.Render(fixture.Report).Nodes)
|
||||
// The ids of the processes rendered above
|
||||
expectedIDs := []string{
|
||||
fixture.ClientProcess1NodeID,
|
||||
@@ -53,7 +53,7 @@ func TestSummaries(t *testing.T) {
|
||||
processNode.Metrics = processNode.Metrics.Copy()
|
||||
processNode.Metrics[process.CPUUsage] = metric
|
||||
input.Process.Nodes[fixture.ClientProcess1NodeID] = processNode
|
||||
have := detailed.Summaries(report.RenderContext{Report: input}, render.ProcessRenderer.Render(input).Nodes)
|
||||
have := detailed.Summaries(detailed.RenderContext{Report: input}, render.ProcessRenderer.Render(input).Nodes)
|
||||
|
||||
node, ok := have[fixture.ClientProcess1NodeID]
|
||||
if !ok {
|
||||
@@ -196,7 +196,7 @@ func TestMakeNodeSummary(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, testcase := range testcases {
|
||||
have, ok := detailed.MakeNodeSummary(report.RenderContext{Report: fixture.Report}, testcase.input)
|
||||
have, ok := detailed.MakeNodeSummary(detailed.RenderContext{Report: fixture.Report}, testcase.input)
|
||||
if ok != testcase.ok {
|
||||
t.Errorf("%s: MakeNodeSummary failed: expected ok value to be: %v", testcase.name, testcase.ok)
|
||||
continue
|
||||
@@ -228,7 +228,7 @@ func TestMakeNodeSummaryNoMetadata(t *testing.T) {
|
||||
report.Overlay: report.MakeOverlayNodeID("", "3e:ca:14:ca:12:5c"),
|
||||
processNameTopology: "/home/weave/scope",
|
||||
} {
|
||||
summary, b := detailed.MakeNodeSummary(report.RenderContext{}, report.MakeNode(id).WithTopology(topology))
|
||||
summary, b := detailed.MakeNodeSummary(detailed.RenderContext{}, report.MakeNode(id).WithTopology(topology))
|
||||
switch {
|
||||
case !b:
|
||||
t.Errorf("Node Summary missing for topology %s, id %s", topology, id)
|
||||
@@ -270,7 +270,7 @@ func TestNodeMetadata(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, input := range inputs {
|
||||
summary, _ := detailed.MakeNodeSummary(report.RenderContext{Report: fixture.Report}, input.node)
|
||||
summary, _ := detailed.MakeNodeSummary(detailed.RenderContext{Report: fixture.Report}, input.node)
|
||||
have := summary.Metadata
|
||||
if !reflect.DeepEqual(input.want, have) {
|
||||
t.Errorf("%s: %s", input.name, test.Diff(input.want, have))
|
||||
@@ -371,7 +371,7 @@ func TestNodeMetrics(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, input := range inputs {
|
||||
summary, _ := detailed.MakeNodeSummary(report.RenderContext{Report: fixture.Report}, input.node)
|
||||
summary, _ := detailed.MakeNodeSummary(detailed.RenderContext{Report: fixture.Report}, input.node)
|
||||
have := summary.Metrics
|
||||
if !reflect.DeepEqual(input.want, have) {
|
||||
t.Errorf("%s: %s", input.name, test.Diff(input.want, have))
|
||||
@@ -468,7 +468,7 @@ func TestNodeTables(t *testing.T) {
|
||||
},
|
||||
}
|
||||
for _, input := range inputs {
|
||||
summary, _ := detailed.MakeNodeSummary(report.RenderContext{Report: input.rpt}, input.node)
|
||||
summary, _ := detailed.MakeNodeSummary(detailed.RenderContext{Report: input.rpt}, input.node)
|
||||
have := summary.Tables
|
||||
if !reflect.DeepEqual(input.want, have) {
|
||||
t.Errorf("%s: %s", input.name, test.Diff(input.want, have))
|
||||
|
||||
@@ -168,12 +168,6 @@ type Report struct {
|
||||
ID string `deepequal:"skip"`
|
||||
}
|
||||
|
||||
// RenderContext carries contextual data that is needed when rendering parts of the report.
|
||||
type RenderContext struct {
|
||||
Report
|
||||
MetricsGraphURL string
|
||||
}
|
||||
|
||||
// MakeReport makes a clean report, ready to Merge() other reports into.
|
||||
func MakeReport() Report {
|
||||
return Report{
|
||||
|
||||
Reference in New Issue
Block a user