From d874266cf62412f5801621469436049e77bffebe Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Tue, 1 Mar 2016 17:16:48 +0000 Subject: [PATCH 1/2] Stop mutating nodes in the rendering pipeline --- render/mapping.go | 21 ++++++++++++--------- render/topologies.go | 29 ++++++++++++++++------------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/render/mapping.go b/render/mapping.go index 5f0f24381..2c78b33aa 100644 --- a/render/mapping.go +++ b/render/mapping.go @@ -527,13 +527,14 @@ func MapCountProcessName(n RenderableNode, _ report.Networks) RenderableNodes { return RenderableNodes{n.ID: n} } + output := n.Copy() processes, _ := n.Node.Counters.Lookup(processesKey) if processes == 1 { - n.LabelMinor = "1 process" + output.LabelMinor = "1 process" } else { - n.LabelMinor = fmt.Sprintf("%d processes", processes) + output.LabelMinor = fmt.Sprintf("%d processes", processes) } - return RenderableNodes{n.ID: n} + return RenderableNodes{output.ID: output} } // MapContainer2ContainerImage maps container RenderableNodes to container @@ -757,13 +758,14 @@ func MapCountContainers(n RenderableNode, _ report.Networks) RenderableNodes { return RenderableNodes{n.ID: n} } + output := n.Copy() containers, _ := n.Node.Counters.Lookup(ContainersKey) if containers == 1 { - n.LabelMinor = "1 container" + output.LabelMinor = "1 container" } else { - n.LabelMinor = fmt.Sprintf("%d containers", containers) + output.LabelMinor = fmt.Sprintf("%d containers", containers) } - return RenderableNodes{n.ID: n} + return RenderableNodes{output.ID: output} } // MapCountPods maps 1:1 service nodes, counting the number of pods grouped @@ -773,13 +775,14 @@ func MapCountPods(n RenderableNode, _ report.Networks) RenderableNodes { return RenderableNodes{n.ID: n} } + output := n.Copy() pods, _ := n.Node.Counters.Lookup(podsKey) if pods == 1 { - n.LabelMinor = "1 pod" + output.LabelMinor = "1 pod" } else { - n.LabelMinor = fmt.Sprintf("%d pods", pods) + output.LabelMinor = fmt.Sprintf("%d pods", pods) } - return RenderableNodes{n.ID: n} + return RenderableNodes{output.ID: output} } // trySplitAddr is basically ParseArbitraryNodeID, since its callsites diff --git a/render/topologies.go b/render/topologies.go index 496787e37..cedc1487e 100644 --- a/render/topologies.go +++ b/render/topologies.go @@ -42,6 +42,7 @@ func (r processWithContainerNameRenderer) Render(rpt report.Report) RenderableNo SelectContainer, ).Render(rpt) + outputs := RenderableNodes{} for id, p := range processes { pid, ok := p.Node.Latest.Lookup(process.PID) if !ok { @@ -55,11 +56,11 @@ func (r processWithContainerNameRenderer) Render(rpt report.Report) RenderableNo if !ok { continue } - p.LabelMinor = fmt.Sprintf("%s (%s:%s)", report.ExtractHostID(p.Node), container.LabelMajor, pid) - processes[id] = p + output := p.Copy() + output.LabelMinor = fmt.Sprintf("%s (%s:%s)", report.ExtractHostID(p.Node), container.LabelMajor, pid) + outputs[id] = output } - - return processes + return outputs } // ProcessWithContainerNameRenderer is a Renderer which produces a process @@ -131,6 +132,7 @@ func (r containerWithHostIPsRenderer) Render(rpt report.Report) RenderableNodes SelectHost, ).Render(rpt) + outputs := RenderableNodes{} for id, c := range containers { networkMode, ok := c.Node.Latest.Lookup(docker.ContainerNetworkMode) if !ok || networkMode != docker.NetworkModeHost { @@ -150,11 +152,11 @@ func (r containerWithHostIPsRenderer) Render(rpt report.Report) RenderableNodes } } - c.Sets = c.Sets.Add(docker.ContainerIPs, newIPs) - containers[id] = c + output := c.Copy() + output.Sets = c.Sets.Add(docker.ContainerIPs, newIPs) + outputs[id] = output } - - return containers + return outputs } // ContainerWithHostIPsRenderer is a Renderer which produces a container graph @@ -175,6 +177,7 @@ func (r containerWithImageNameRenderer) Render(rpt report.Report) RenderableNode SelectContainerImage, ).Render(rpt) + outputs := RenderableNodes{} for id, c := range containers { imageID, ok := c.Node.Latest.Lookup(docker.ImageID) if !ok { @@ -184,12 +187,12 @@ func (r containerWithImageNameRenderer) Render(rpt report.Report) RenderableNode if !ok { continue } - c.Rank = ImageNameWithoutVersion(image.LabelMajor) - c.Latest = image.Latest.Merge(c.Latest) - containers[id] = c + output := c.Copy() + output.Rank = ImageNameWithoutVersion(image.LabelMajor) + output.Latest = image.Latest.Merge(c.Latest) + outputs[id] = output } - - return containers + return outputs } // ContainerWithImageNameRenderer is a Renderer which produces a container From 19411b9f76f3471ae44896fa43ca295eb7d9d23d Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Wed, 2 Mar 2016 10:35:11 +0000 Subject: [PATCH 2/2] Review feedback --- render/topologies.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/render/topologies.go b/render/topologies.go index cedc1487e..ffe2772f5 100644 --- a/render/topologies.go +++ b/render/topologies.go @@ -44,6 +44,7 @@ func (r processWithContainerNameRenderer) Render(rpt report.Report) RenderableNo outputs := RenderableNodes{} for id, p := range processes { + outputs[id] = p pid, ok := p.Node.Latest.Lookup(process.PID) if !ok { continue @@ -134,6 +135,7 @@ func (r containerWithHostIPsRenderer) Render(rpt report.Report) RenderableNodes outputs := RenderableNodes{} for id, c := range containers { + outputs[id] = c networkMode, ok := c.Node.Latest.Lookup(docker.ContainerNetworkMode) if !ok || networkMode != docker.NetworkModeHost { continue @@ -179,6 +181,7 @@ func (r containerWithImageNameRenderer) Render(rpt report.Report) RenderableNode outputs := RenderableNodes{} for id, c := range containers { + outputs[id] = c imageID, ok := c.Node.Latest.Lookup(docker.ImageID) if !ok { continue