Merge pull request #1422 from weaveworks/1364-kuber-kuber-kuber-kuber-kuber-kuber-kuber-kuber-netes

Add a condition to rendering any kubernetes nodes at all
This commit is contained in:
Paul Bellamy
2016-05-04 11:32:04 +01:00
2 changed files with 37 additions and 6 deletions

View File

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

View File

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