// Individual edges. func handleEdge(rep Reporter, renderer render.Renderer, w http.ResponseWriter, r *http.Request) { var ( vars = mux.Vars(r) localID = vars["local"] remoteID = vars["remote"] rpt = rep.Report() metadata = renderer.EdgeMetadata(rpt, localID, remoteID) ) respondWith(w, http.StatusOK, APIEdge{Metadata: metadata}) }
func handleWebsocket( w http.ResponseWriter, r *http.Request, rep Reporter, renderer render.Renderer, loop time.Duration, ) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { // log.Println("Upgrade:", err) return } defer conn.Close() quit := make(chan struct{}) go func(c *websocket.Conn) { for { // just discard everything the browser sends if _, _, err := c.NextReader(); err != nil { close(quit) break } } }(conn) var ( previousTopo render.RenderableNodes tick = time.Tick(loop) wait = make(chan struct{}, 1) ) rep.WaitOn(wait) defer rep.UnWait(wait) for { newTopo := renderer.Render(rep.Report()).Prune() diff := render.TopoDiff(previousTopo, newTopo) previousTopo = newTopo if err := conn.SetWriteDeadline(time.Now().Add(websocketTimeout)); err != nil { return } if err := conn.WriteJSON(diff); err != nil { return } select { case <-wait: case <-tick: case <-quit: return } } }
func benchmarkStats(b *testing.B, r render.Renderer) { report, err := loadReport() if err != nil { b.Fatal(err) } b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { // No way to tell if this was successful :( benchmarkStatsResult = r.Stats(report) } }
// Individual nodes. func handleNode(rep Reporter, renderer render.Renderer, w http.ResponseWriter, r *http.Request) { var ( vars = mux.Vars(r) nodeID = vars["id"] rpt = rep.Report() node, ok = renderer.Render(rep.Report())[nodeID] ) if !ok { http.NotFound(w, r) return } respondWith(w, http.StatusOK, APINode{Node: render.MakeDetailedNode(rpt, node)}) }
// Individual nodes. func handleNode(ctx context.Context, renderer render.Renderer, _ render.Decorator, report report.Report, w http.ResponseWriter, r *http.Request) { var ( vars = mux.Vars(r) topologyID = vars["topology"] nodeID = vars["id"] rendered = renderer.Render(report, nil) node, ok = rendered[nodeID] ) if !ok { http.NotFound(w, r) return } respondWith(w, http.StatusOK, APINode{Node: detailed.MakeNode(topologyID, report, rendered, node)}) }
func benchmarkRender(b *testing.B, r render.Renderer) { report, err := loadReport() if err != nil { b.Fatal(err) } b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { benchmarkRenderResult = r.Render(report) if len(benchmarkRenderResult) == 0 { b.Errorf("Rendered topology contained no nodes") } } }
func decorateWithStats(rpt report.Report, renderer render.Renderer) topologyStats { var ( nodes int realNodes int edges int ) for _, n := range renderer.Render(rpt) { nodes++ if !n.Pseudo { realNodes++ } edges += len(n.Adjacency) } renderStats := renderer.Stats(rpt) return topologyStats{ NodeCount: nodes, NonpseudoNodeCount: realNodes, EdgeCount: edges, FilteredNodes: renderStats.FilteredNodes, } }
// Full topology. func handleTopology(rep Reporter, renderer render.Renderer, w http.ResponseWriter, r *http.Request) { respondWith(w, http.StatusOK, APITopology{ Nodes: renderer.Render(rep.Report()).Prune(), }) }
// Full topology. func handleTopology(ctx context.Context, renderer render.Renderer, decorator render.Decorator, report report.Report, w http.ResponseWriter, r *http.Request) { respondWith(w, http.StatusOK, APITopology{ Nodes: detailed.Summaries(report, renderer.Render(report, decorator)), }) }