Merge pull request #1200 from weaveworks/1181-hide-in-ui

Stop hiding kubernetes topologies in the backend.
This commit is contained in:
Tom Wilkie
2016-03-24 13:35:28 +00:00
6 changed files with 53 additions and 36 deletions

View File

@@ -18,28 +18,6 @@ var (
topologyRegistry = &registry{
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 {

View File

@@ -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()

View File

@@ -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)
}))
}

View File

@@ -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);

View File

@@ -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']);
});
})
});

View File

@@ -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));
}