From 807b30bfe3bbe3489f28f02bf80773e985212fc1 Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Mon, 24 Aug 2015 18:40:20 +0000 Subject: [PATCH] Figure out whether to show host tags in details pane from context --- app/api_topology.go | 2 +- app/router.go | 21 +++++++++------------ render/detailed_node.go | 17 +++++++++++++++-- render/detailed_node_test.go | 4 ++-- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/app/api_topology.go b/app/api_topology.go index 198d1b162..204ddaa65 100644 --- a/app/api_topology.go +++ b/app/api_topology.go @@ -68,7 +68,7 @@ func handleNode(rep xfer.Reporter, t topologyView, w http.ResponseWriter, r *htt http.NotFound(w, r) return } - respondWith(w, http.StatusOK, APINode{Node: render.MakeDetailedNode(rpt, node, t.isMultiHost)}) + respondWith(w, http.StatusOK, APINode{Node: render.MakeDetailedNode(rpt, node)}) } // Individual edges. diff --git a/app/router.go b/app/router.go index 7eabfc8f7..570f223f6 100644 --- a/app/router.go +++ b/app/router.go @@ -107,10 +107,9 @@ var topologyRegistry = map[string]topologyView{ renderer: render.FilterUnconnected{Renderer: render.ProcessWithContainerNameRenderer{}}, }, "applications-by-name": { - human: "by name", - parent: "applications", - renderer: render.FilterUnconnected{Renderer: render.ProcessNameRenderer}, - isMultiHost: true, + human: "by name", + parent: "applications", + renderer: render.FilterUnconnected{Renderer: render.ProcessNameRenderer}, }, "containers": { human: "Containers", @@ -118,10 +117,9 @@ var topologyRegistry = map[string]topologyView{ renderer: render.ContainerRenderer, }, "containers-by-image": { - human: "by image", - parent: "containers", - renderer: render.ContainerImageRenderer, - isMultiHost: true, + human: "by image", + parent: "containers", + renderer: render.ContainerImageRenderer, }, "hosts": { human: "Hosts", @@ -131,8 +129,7 @@ var topologyRegistry = map[string]topologyView{ } type topologyView struct { - human string - parent string - renderer render.Renderer - isMultiHost bool // does the view involve information from multiple hosts? + human string + parent string + renderer render.Renderer } diff --git a/render/detailed_node.go b/render/detailed_node.go index 8b6d6aa5b..3fd23ed94 100644 --- a/render/detailed_node.go +++ b/render/detailed_node.go @@ -72,15 +72,28 @@ func (t sortableTables) Less(i, j int) bool { return t[i].Rank > t[j].Rank } // MakeDetailedNode transforms a renderable node to a detailed node. It uses // aggregate metadata, plus the set of origin node IDs, to produce tables. -func MakeDetailedNode(r report.Report, n RenderableNode, addHostTags bool) DetailedNode { +func MakeDetailedNode(r report.Report, n RenderableNode) DetailedNode { tables := sortableTables{} + + // Figure out if multiple hosts are referenced by the renderableNode + originHosts := make(map[string]struct{}) + for _, id := range n.Origins { + for _, topology := range r.Topologies() { + if nmd, ok := topology.NodeMetadatas[id]; ok { + originHosts[report.ExtractHostID(nmd)] = struct{}{} + break + } + } + } + multiHost := len(originHosts) > 1 + // RenderableNode may be the result of merge operation(s), and so may have // multiple origins. The ultimate goal here is to generate tables to view // in the UI, so we skip the intermediate representations, but we could // add them later. connections := []Row{} for _, id := range n.Origins { - if table, ok := OriginTable(r, id, addHostTags); ok { + if table, ok := OriginTable(r, id, multiHost); ok { tables = append(tables, table) } else if _, ok := r.Endpoint.NodeMetadatas[id]; ok { connections = append(connections, connectionDetailsRows(r.Endpoint, id)...) diff --git a/render/detailed_node_test.go b/render/detailed_node_test.go index 1f4e6de02..796a997d3 100644 --- a/render/detailed_node_test.go +++ b/render/detailed_node_test.go @@ -74,7 +74,7 @@ func TestOriginTable(t *testing.T) { func TestMakeDetailedHostNode(t *testing.T) { renderableNode := render.HostRenderer.Render(test.Report)[render.MakeHostID(test.ClientHostID)] - have := render.MakeDetailedNode(test.Report, renderableNode, false) + have := render.MakeDetailedNode(test.Report, renderableNode) want := render.DetailedNode{ ID: render.MakeHostID(test.ClientHostID), LabelMajor: "client", @@ -131,7 +131,7 @@ func TestMakeDetailedHostNode(t *testing.T) { func TestMakeDetailedContainerNode(t *testing.T) { renderableNode := render.ContainerRenderer.Render(test.Report)[test.ServerContainerID] - have := render.MakeDetailedNode(test.Report, renderableNode, false) + have := render.MakeDetailedNode(test.Report, renderableNode) want := render.DetailedNode{ ID: test.ServerContainerID, LabelMajor: "server",