From 4f6066f0ff921bf7e2ba23d171acad75e306a5f1 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Wed, 23 Mar 2016 12:43:47 +0000 Subject: [PATCH 1/2] Stop hiding kubernetes topologies in the backend. --- app/api_topologies.go | 55 ++++++++++++++++++-------------------- app/api_topologies_test.go | 4 +-- app/router.go | 3 --- 3 files changed, 28 insertions(+), 34 deletions(-) diff --git a/app/api_topologies.go b/app/api_topologies.go index 6930aeaf4..8c51f21e3 100644 --- a/app/api_topologies.go +++ b/app/api_topologies.go @@ -18,28 +18,6 @@ var ( topologyRegistry = ®istry{ items: map[string]APITopologyDesc{}, } - kubernetesTopologies = []APITopologyDesc{ - { - id: "pods", - renderer: render.PodRenderer, - Name: "Pods", - Rank: 3, - Options: map[string][]APITopologyOption{"system": { - {"show", "System pods shown", false, render.FilterNoop}, - {"hide", "System pods hidden", true, render.FilterSystem}, - }}, - }, - { - id: "pods-by-service", - parent: "pods", - renderer: render.PodServiceRenderer, - Name: "by service", - Options: map[string][]APITopologyOption{"system": { - {"show", "System services shown", false, render.FilterNoop}, - {"hide", "System services hidden", true, render.FilterSystem}, - }}, - }, - } ) func init() { @@ -106,6 +84,28 @@ func init() { Rank: 4, Options: map[string][]APITopologyOption{}, }, + APITopologyDesc{ + id: "pods", + renderer: render.PodRenderer, + Name: "Pods", + Rank: 3, + HideIfEmpty: true, + Options: map[string][]APITopologyOption{"system": { + {"show", "System pods shown", false, render.FilterNoop}, + {"hide", "System pods hidden", true, render.FilterSystem}, + }}, + }, + APITopologyDesc{ + id: "pods-by-service", + parent: "pods", + renderer: render.PodServiceRenderer, + Name: "by service", + HideIfEmpty: true, + Options: map[string][]APITopologyOption{"system": { + {"show", "System services shown", false, render.FilterNoop}, + {"hide", "System services hidden", true, render.FilterSystem}, + }}, + }, ) } @@ -121,9 +121,10 @@ type APITopologyDesc struct { parent string renderer render.Renderer - Name string `json:"name"` - Rank int `json:"rank"` - Options map[string][]APITopologyOption `json:"options"` + Name string `json:"name"` + Rank int `json:"rank"` + HideIfEmpty bool `json:"hide_if_empty"` + Options map[string][]APITopologyOption `json:"options"` URL string `json:"url"` SubTopologies []APITopologyDesc `json:"sub_topologies,omitempty"` @@ -241,10 +242,6 @@ func decorateWithStats(rpt report.Report, renderer render.Renderer) topologyStat } } -func (r *registry) enableKubernetesTopologies() { - r.add(kubernetesTopologies...) -} - func renderedForRequest(r *http.Request, topology APITopologyDesc) render.Renderer { renderer := topology.renderer for param, opts := range topology.Options { diff --git a/app/api_topologies_test.go b/app/api_topologies_test.go index 9579ccbe2..968525202 100644 --- a/app/api_topologies_test.go +++ b/app/api_topologies_test.go @@ -27,7 +27,7 @@ func TestAPITopology(t *testing.T) { if err := decoder.Decode(&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) @@ -65,7 +65,7 @@ func TestAPITopologyAddsKubernetes(t *testing.T) { if err := decoder.Decode(&topologies); err != nil { t.Fatalf("JSON parse error: %s", err) } - equals(t, 3, len(topologies)) + equals(t, 4, len(topologies)) // Enable the kubernetes topologies rpt := report.MakeReport() diff --git a/app/router.go b/app/router.go index 7964861f6..08aba0ba5 100644 --- a/app/router.go +++ b/app/router.go @@ -157,9 +157,6 @@ func RegisterReportPostHandler(a Adder, router *mux.Router) { return } a.Add(ctx, rpt) - if len(rpt.Pod.Nodes) > 0 { - topologyRegistry.enableKubernetesTopologies() - } w.WriteHeader(http.StatusOK) })) } From 1e4d6e829d6471d60868f9a8d1ddbcde9b044914 Mon Sep 17 00:00:00 2001 From: Simon Howe Date: Wed, 23 Mar 2016 15:36:55 +0100 Subject: [PATCH 2/2] Hide empty topo's that set hidden_if_empty=true. --- client/app/scripts/stores/app-store.js | 8 ++++++-- .../scripts/utils/__tests__/topology-utils-test.js | 14 ++++++++++++++ client/app/scripts/utils/topology-utils.js | 5 +++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/client/app/scripts/stores/app-store.js b/client/app/scripts/stores/app-store.js index 0f1f49360..cd79d84d2 100644 --- a/client/app/scripts/stores/app-store.js +++ b/client/app/scripts/stores/app-store.js @@ -6,7 +6,8 @@ import { Store } from 'flux/utils'; import AppDispatcher from '../dispatcher/app-dispatcher'; import ActionTypes from '../constants/action-types'; import { EDGE_ID_SEPARATOR } from '../constants/naming'; -import { findTopologyById, setTopologyUrlsById, updateTopologyIds } from '../utils/topology-utils'; +import { findTopologyById, setTopologyUrlsById, updateTopologyIds, + filterHiddenTopologies } from '../utils/topology-utils'; const makeList = List; const makeMap = Map; @@ -62,8 +63,11 @@ const topologySorter = topology => topology.get('rank'); // adds ID field to topology (based on last part of URL path) and save urls in // map for easy lookup function processTopologies(nextTopologies) { + // filter out hidden topos + const visibleTopologies = filterHiddenTopologies(nextTopologies); + // add IDs to topology objects in-place - const topologiesWithId = updateTopologyIds(nextTopologies); + const topologiesWithId = updateTopologyIds(visibleTopologies); // cache URLs by ID topologyUrlsById = setTopologyUrlsById(topologyUrlsById, topologiesWithId); diff --git a/client/app/scripts/utils/__tests__/topology-utils-test.js b/client/app/scripts/utils/__tests__/topology-utils-test.js index 7686eee92..7010bb414 100644 --- a/client/app/scripts/utils/__tests__/topology-utils-test.js +++ b/client/app/scripts/utils/__tests__/topology-utils-test.js @@ -106,4 +106,18 @@ describe('TopologyUtils', () => { expect(nodes.n2.degree).toEqual(0); expect(nodes.n3.degree).toEqual(0); }); + + describe('filterHiddenTopologies', () => { + it('should filter out empty topos that set hidden_if_empty=true', () => { + const topos = [ + {id: 'a', hidden_if_empty: true, stats: {node_count: 0, filtered_nodes:0}}, + {id: 'b', hidden_if_empty: true, stats: {node_count: 1, filtered_nodes:0}}, + {id: 'c', hidden_if_empty: true, stats: {node_count: 0, filtered_nodes:1}}, + {id: 'd', hidden_if_empty: false, stats: {node_count: 0, filtered_nodes:0}} + ]; + + const res = TopologyUtils.filterHiddenTopologies(topos); + expect(res.map(t => t.id)).toEqual(['b', 'c', 'd']); + }); + }) }); diff --git a/client/app/scripts/utils/topology-utils.js b/client/app/scripts/utils/topology-utils.js index 4489aa5e4..5d0e5dd23 100644 --- a/client/app/scripts/utils/topology-utils.js +++ b/client/app/scripts/utils/topology-utils.js @@ -50,3 +50,8 @@ export function setTopologyUrlsById(topologyUrlsById, topologies) { }); return urlMap; } + +export function filterHiddenTopologies(topologies) { + return topologies.filter(t => (!t.hidden_if_empty || t.stats.node_count > 0 || + t.stats.filtered_nodes > 0)); +}