Skip to content

Commit

Permalink
Merge pull request #1904 from weaveworks/1864-apply-filters-to-detail…
Browse files Browse the repository at this point in the history
…s-panel

Apply filters from current view to details panel
  • Loading branch information
Alfonso Acosta authored Oct 18, 2016
2 parents 8da5ca3 + ffdcc23 commit 3829784
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 9 deletions.
5 changes: 5 additions & 0 deletions app/api_topologies.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
13 changes: 7 additions & 6 deletions app/api_topology.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
10 changes: 10 additions & 0 deletions client/app/scripts/actions/app-actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,8 @@ export function changeTopologyOption(option, value, topologyId) {
);
getNodeDetails(
state.get('topologyUrlsById'),
state.get('currentTopologyId'),
getActiveTopologyOptions(state),
state.get('nodeDetails'),
dispatch
);
Expand Down Expand Up @@ -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
);
Expand All @@ -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
);
Expand Down Expand Up @@ -543,6 +549,8 @@ export function receiveTopologies(topologies) {
);
getNodeDetails(
state.get('topologyUrlsById'),
state.get('currentTopologyId'),
getActiveTopologyOptions(state),
state.get('nodeDetails'),
dispatch
);
Expand Down Expand Up @@ -645,6 +653,8 @@ export function route(urlState) {
);
getNodeDetails(
state.get('topologyUrlsById'),
state.get('currentTopologyId'),
getActiveTopologyOptions(state),
state.get('nodeDetails'),
dispatch
);
Expand Down
12 changes: 9 additions & 3 deletions client/app/scripts/utils/web-api-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down
24 changes: 24 additions & 0 deletions render/filters.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
13 changes: 13 additions & 0 deletions render/render.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}
}

0 comments on commit 3829784

Please sign in to comment.