Merge pull request #1904 from weaveworks/1864-apply-filters-to-details-panel

Apply filters from current view to details panel
This commit is contained in:
Alfonso Acosta
2016-10-18 15:10:29 +02:00
committed by GitHub
6 changed files with 68 additions and 9 deletions

View File

@@ -350,6 +350,11 @@ func (r *registry) rendererForTopology(topologyID string, values url.Values, rpt
}
topology = updateFilters(rpt, []APITopologyDesc{topology})[0]
if len(values) == 0 {
// Do not apply filtering if no options where provided
return topology.renderer, nil, nil
}
var decorators []render.Decorator
for _, group := range topology.Options {
value := values.Get(group.ID)

View File

@@ -36,13 +36,14 @@ func handleTopology(ctx context.Context, renderer render.Renderer, decorator ren
}
// Individual nodes.
func handleNode(ctx context.Context, renderer render.Renderer, _ render.Decorator, report report.Report, w http.ResponseWriter, r *http.Request) {
func handleNode(ctx context.Context, renderer render.Renderer, decorator 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]
vars = mux.Vars(r)
topologyID = vars["topology"]
nodeID = vars["id"]
preciousRenderer = render.PreciousNodeRenderer{PreciousNodeID: nodeID, Renderer: renderer}
rendered = preciousRenderer.Render(report, decorator)
node, ok = rendered[nodeID]
)
if !ok {
http.NotFound(w, r)

View File

@@ -170,6 +170,8 @@ export function changeTopologyOption(option, value, topologyId) {
);
getNodeDetails(
state.get('topologyUrlsById'),
state.get('currentTopologyId'),
getActiveTopologyOptions(state),
state.get('nodeDetails'),
dispatch
);
@@ -260,6 +262,8 @@ export function clickNode(nodeId, label, origin) {
const state = getState();
getNodeDetails(
state.get('topologyUrlsById'),
state.get('currentTopologyId'),
getActiveTopologyOptions(state),
state.get('nodeDetails'),
dispatch
);
@@ -285,6 +289,8 @@ export function clickRelative(nodeId, topologyId, label, origin) {
const state = getState();
getNodeDetails(
state.get('topologyUrlsById'),
state.get('currentTopologyId'),
getActiveTopologyOptions(state),
state.get('nodeDetails'),
dispatch
);
@@ -543,6 +549,8 @@ export function receiveTopologies(topologies) {
);
getNodeDetails(
state.get('topologyUrlsById'),
state.get('currentTopologyId'),
getActiveTopologyOptions(state),
state.get('nodeDetails'),
dispatch
);
@@ -645,6 +653,8 @@ export function route(urlState) {
);
getNodeDetails(
state.get('topologyUrlsById'),
state.get('currentTopologyId'),
getActiveTopologyOptions(state),
state.get('nodeDetails'),
dispatch
);

View File

@@ -163,13 +163,19 @@ export function getNodesDelta(topologyUrl, options, dispatch) {
}
}
export function getNodeDetails(topologyUrlsById, nodeMap, dispatch) {
export function getNodeDetails(topologyUrlsById, currentTopologyId, options, nodeMap, dispatch) {
// get details for all opened nodes
const obj = nodeMap.last();
if (obj && topologyUrlsById.has(obj.topologyId)) {
const topologyUrl = topologyUrlsById.get(obj.topologyId);
const url = [topologyUrl, '/', encodeURIComponent(obj.id)]
.join('').substr(1);
let urlComponents = [topologyUrl, '/', encodeURIComponent(obj.id)];
if (currentTopologyId === obj.topologyId) {
// Only forward filters for nodes in the current topology
const optionsQuery = buildOptionsQuery(options);
urlComponents = urlComponents.concat(['?', optionsQuery]);
}
const url = urlComponents.join('').substr(1);
reqwest({
url,
success: (res) => {

View File

@@ -10,6 +10,30 @@ import (
"github.com/weaveworks/scope/report"
)
// PreciousNodeRenderer ensures a node is never filtered out by decorators
type PreciousNodeRenderer struct {
PreciousNodeID string
Renderer
}
// Render implements Renderer
func (p PreciousNodeRenderer) Render(rpt report.Report, dct Decorator) report.Nodes {
undecoratedNodes := p.Renderer.Render(rpt, nil)
preciousNode, foundBeforeDecoration := undecoratedNodes[p.PreciousNodeID]
finalNodes := applyDecorator{ConstantRenderer(undecoratedNodes)}.Render(rpt, dct)
if _, ok := finalNodes[p.PreciousNodeID]; !ok && foundBeforeDecoration {
finalNodes[p.PreciousNodeID] = preciousNode
}
return finalNodes
}
// Stats implements Renderer
func (p PreciousNodeRenderer) Stats(rpt report.Report, dct Decorator) Stats {
// default to the underlying renderer
// TODO: we don't take into account the precious node, so we may be off by one
return p.Renderer.Stats(rpt, dct)
}
// CustomRenderer allow for mapping functions that received the entire topology
// in one call - useful for functions that need to consider the entire graph.
// We should minimise the use of this renderer type, as it is very inflexible.

View File

@@ -185,3 +185,16 @@ func (cr conditionalRenderer) Stats(rpt report.Report, dct Decorator) Stats {
}
return Stats{}
}
// ConstantRenderer renders a fixed set of nodes
type ConstantRenderer report.Nodes
// Render implements Renderer
func (c ConstantRenderer) Render(_ report.Report, _ Decorator) report.Nodes {
return report.Nodes(c)
}
// Stats implements Renderer
func (c ConstantRenderer) Stats(_ report.Report, _ Decorator) Stats {
return Stats{}
}