From cc79b7631ee8efdd4e58a93951f8d63aef672e78 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 18 Jul 2018 08:58:07 +0000 Subject: [PATCH] Propagate multiple container values at once This is more efficient than repeatedly inserting a single value. --- render/container.go | 8 +++----- render/render.go | 7 ------- report/map_helpers.go | 13 +++++++++++++ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/render/container.go b/render/container.go index 5228136df..d2f9a6657 100644 --- a/render/container.go +++ b/render/container.go @@ -143,11 +143,9 @@ func (r containerWithImageNameRenderer) Render(rpt report.Report) Nodes { imageNameWithoutTag := docker.ImageNameWithoutTag(imageName) imageNodeID := report.MakeContainerImageNodeID(imageNameWithoutTag) - c = propagateLatest(docker.ImageName, image, c) - c = propagateLatest(docker.ImageTag, image, c) - c = propagateLatest(docker.ImageSize, image, c) - c = propagateLatest(docker.ImageVirtualSize, image, c) - c = propagateLatest(docker.ImageLabelPrefix+"works.weave.role", image, c) + c.Latest = c.Latest.Propagate(image.Latest, docker.ImageName, docker.ImageTag, + docker.ImageSize, docker.ImageVirtualSize, docker.ImageLabelPrefix+"works.weave.role") + c.Parents = c.Parents. Delete(report.ContainerImage). Add(report.ContainerImage, report.MakeStringSet(imageNodeID)) diff --git a/render/render.go b/render/render.go index eb3b6c8a2..ee2429d61 100644 --- a/render/render.go +++ b/render/render.go @@ -115,13 +115,6 @@ func (m Map) Render(rpt report.Report) Nodes { return output.result(input) } -func propagateLatest(key string, from, to report.Node) report.Node { - if value, timestamp, ok := from.Latest.LookupEntry(key); ok { - to.Latest = to.Latest.Set(key, timestamp, value) - } - return to -} - // Condition is a predecate over the entire report that can evaluate to true or false. type Condition func(report.Report) bool diff --git a/report/map_helpers.go b/report/map_helpers.go index 359785465..5339dc6c0 100644 --- a/report/map_helpers.go +++ b/report/map_helpers.go @@ -173,3 +173,16 @@ func (m StringLatestMap) addMapEntries(ts time.Time, n map[string]string) String out.fixup() return out } + +// Propagate a set of latest values from one set to another. +func (m StringLatestMap) Propagate(from StringLatestMap, keys ...string) StringLatestMap { + out := make(StringLatestMap, len(m), len(m)+len(keys)) + copy(out, m) + for _, k := range keys { + if v, ts, ok := from.LookupEntry(k); ok { + out = append(out, stringLatestEntry{key: k, Value: v, Timestamp: ts}) + } + } + out.fixup() + return out +}