From 57618be9325e81e75b9ba12881d3ab991a944a64 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Tue, 3 May 2016 17:05:44 +0100 Subject: [PATCH] Add a condition to rendering any kubernetes nodes at all --- render/pod.go | 16 ++++++++++------ render/render.go | 27 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/render/pod.go b/render/pod.go index 7f7c540ab..f93741b17 100644 --- a/render/pod.go +++ b/render/pod.go @@ -14,10 +14,14 @@ const ( UnmanagedMajor = "Unmanaged" ) +func renderKubernetesTopologies(rpt report.Report) bool { + return len(rpt.Pod.Nodes)+len(rpt.Service.Nodes) > 1 +} + // PodRenderer is a Renderer which produces a renderable kubernetes // graph by merging the container graph and the pods topology. -var PodRenderer = ApplyDecorators( - MakeFilter( +var PodRenderer = ConditionalRenderer(renderKubernetesTopologies, + ApplyDecorators(MakeFilter( func(n report.Node) bool { state, ok := n.Latest.Lookup(kubernetes.PodState) return (!ok || state != kubernetes.StateDeleted) @@ -36,13 +40,13 @@ var PodRenderer = ApplyDecorators( ), SelectPod, ), - ), + )), ) // PodServiceRenderer is a Renderer which produces a renderable kubernetes services // graph by merging the pods graph and the services topology. -var PodServiceRenderer = ApplyDecorators( - FilterEmpty(report.Pod, +var PodServiceRenderer = ConditionalRenderer(renderKubernetesTopologies, + ApplyDecorators(FilterEmpty(report.Pod, MakeReduce( MakeMap( MapPod2Service, @@ -50,7 +54,7 @@ var PodServiceRenderer = ApplyDecorators( ), SelectService, ), - ), + )), ) // MapContainer2Pod maps container Nodes to pod diff --git a/render/render.go b/render/render.go index 9ef5ffadb..9a9078a3e 100644 --- a/render/render.go +++ b/render/render.go @@ -158,3 +158,30 @@ func propagateLatest(key string, from, to report.Node) report.Node { } return to } + +// Condition is a predecate over the entire report that can evaluate to true or false. +type Condition func(report.Report) bool + +type conditionalRenderer struct { + Condition + Renderer +} + +// ConditionalRenderer renders nothing if the condition is false, otherwise it defers +// to the wrapped Renderer. +func ConditionalRenderer(c Condition, r Renderer) Renderer { + return Memoise(conditionalRenderer{c, r}) +} + +func (cr conditionalRenderer) Render(rpt report.Report, dct Decorator) report.Nodes { + if cr.Condition(rpt) { + return cr.Renderer.Render(rpt, dct) + } + return report.Nodes{} +} +func (cr conditionalRenderer) Stats(rpt report.Report, dct Decorator) Stats { + if cr.Condition(rpt) { + return cr.Renderer.Stats(rpt, dct) + } + return Stats{} +}