diff --git a/app/api_topology.go b/app/api_topology.go index 9dd233322..c68801438 100644 --- a/app/api_topology.go +++ b/app/api_topology.go @@ -8,7 +8,6 @@ import ( "github.com/gorilla/websocket" "github.com/weaveworks/scope/render" - "github.com/weaveworks/scope/report" ) const ( @@ -28,7 +27,7 @@ type APINode struct { // APIEdge is returned by the /api/topology/*/*/* handlers. type APIEdge struct { - Metadata report.AggregateMetadata `json:"metadata"` + Metadata render.AggregateMetadata `json:"metadata"` } // Full topology. diff --git a/app/api_topology_test.go b/app/api_topology_test.go index 91dd772af..043e5fd72 100644 --- a/app/api_topology_test.go +++ b/app/api_topology_test.go @@ -58,7 +58,7 @@ func TestAPITopologyApplications(t *testing.T) { if err := json.Unmarshal(body, &edge); err != nil { t.Fatalf("JSON parse error: %s", err) } - want := report.AggregateMetadata{ + want := render.AggregateMetadata{ "egress_bytes": 24, "ingress_bytes": 0, "max_conn_count_tcp": 401, @@ -112,7 +112,7 @@ func TestAPITopologyHosts(t *testing.T) { if err := json.Unmarshal(body, &edge); err != nil { t.Fatalf("JSON parse error: %s", err) } - want := report.AggregateMetadata{ + want := render.AggregateMetadata{ "egress_bytes": 0, "ingress_bytes": 12, "max_conn_count_tcp": 16, diff --git a/render/detailed_node.go b/render/detailed_node.go index 6b3e9513f..5ef3a5b57 100644 --- a/render/detailed_node.go +++ b/render/detailed_node.go @@ -38,13 +38,13 @@ func MakeDetailedNode(r report.Report, n RenderableNode) DetailedNode { tables := []Table{} { rows := []Row{} - if val, ok := n.AggregateMetadata[report.KeyMaxConnCountTCP]; ok { + if val, ok := n.AggregateMetadata[KeyMaxConnCountTCP]; ok { rows = append(rows, Row{"TCP connections", strconv.FormatInt(int64(val), 10), ""}) } - if val, ok := n.AggregateMetadata[report.KeyBytesIngress]; ok { + if val, ok := n.AggregateMetadata[KeyBytesIngress]; ok { rows = append(rows, Row{"Bytes ingress", strconv.FormatInt(int64(val), 10), ""}) } - if val, ok := n.AggregateMetadata[report.KeyBytesEgress]; ok { + if val, ok := n.AggregateMetadata[KeyBytesEgress]; ok { rows = append(rows, Row{"Bytes egress", strconv.FormatInt(int64(val), 10), ""}) } if len(rows) > 0 { diff --git a/report/metadata.go b/render/metadata.go similarity index 85% rename from report/metadata.go rename to render/metadata.go index 7e5d3aa76..577b48b19 100644 --- a/report/metadata.go +++ b/render/metadata.go @@ -1,4 +1,8 @@ -package report +package render + +import ( + "github.com/weaveworks/scope/report" +) // AggregateMetadata is a composable version of an EdgeMetadata. It's used // when we want to merge nodes/edges for any reason. @@ -20,8 +24,8 @@ const ( KeyMaxConnCountTCP = "max_conn_count_tcp" ) -// Transform calculates a AggregateMetadata from an EdgeMetadata. -func (md EdgeMetadata) Transform() AggregateMetadata { +// AggregateMetadataOf calculates a AggregateMetadata from an EdgeMetadata. +func AggregateMetadataOf(md report.EdgeMetadata) AggregateMetadata { m := AggregateMetadata{} if md.WithBytes { m[KeyBytesIngress] = int(md.BytesIngress) diff --git a/report/metadata_test.go b/render/metadata_test.go similarity index 56% rename from report/metadata_test.go rename to render/metadata_test.go index 8795f3c47..805506650 100644 --- a/report/metadata_test.go +++ b/render/metadata_test.go @@ -1,61 +1,64 @@ -package report +package render_test import ( "reflect" "testing" + + "github.com/weaveworks/scope/render" + "github.com/weaveworks/scope/report" ) func TestAggregateMetadata(t *testing.T) { - for from, want := range map[EdgeMetadata]AggregateMetadata{ + for from, want := range map[report.EdgeMetadata]render.AggregateMetadata{ // Simple connection count - EdgeMetadata{ + report.EdgeMetadata{ WithConnCountTCP: true, MaxConnCountTCP: 400, }: { - KeyMaxConnCountTCP: 400, + render.KeyMaxConnCountTCP: 400, }, // Connection count rounding - EdgeMetadata{ + report.EdgeMetadata{ WithConnCountTCP: true, MaxConnCountTCP: 4, }: { - KeyMaxConnCountTCP: 4, + render.KeyMaxConnCountTCP: 4, }, // 0 connections. - EdgeMetadata{ + report.EdgeMetadata{ WithConnCountTCP: true, MaxConnCountTCP: 0, }: { - KeyMaxConnCountTCP: 0, + render.KeyMaxConnCountTCP: 0, }, // Egress - EdgeMetadata{ + report.EdgeMetadata{ WithBytes: true, BytesEgress: 24, BytesIngress: 0, }: { - KeyBytesEgress: 24, - KeyBytesIngress: 0, + render.KeyBytesEgress: 24, + render.KeyBytesIngress: 0, }, // Ingress - EdgeMetadata{ + report.EdgeMetadata{ WithBytes: true, BytesEgress: 0, BytesIngress: 1200, }: { - KeyBytesEgress: 0, - KeyBytesIngress: 1200, + render.KeyBytesEgress: 0, + render.KeyBytesIngress: 1200, }, // Nothing there. - EdgeMetadata{}: {}, + report.EdgeMetadata{}: {}, } { - if have := from.Transform(); !reflect.DeepEqual(have, want) { + if have := render.AggregateMetadataOf(from); !reflect.DeepEqual(have, want) { t.Errorf("have: %#v, want %#v", have, want) } @@ -64,14 +67,14 @@ func TestAggregateMetadata(t *testing.T) { func TestAggregateMetadataSum(t *testing.T) { var ( - this = AggregateMetadata{ + this = render.AggregateMetadata{ "ingress_bytes": 3, } - other = AggregateMetadata{ + other = render.AggregateMetadata{ "ingress_bytes": 333, "egress_bytes": 3, } - want = AggregateMetadata{ + want = render.AggregateMetadata{ "ingress_bytes": 336, "egress_bytes": 3, } diff --git a/render/render.go b/render/render.go index 97d54ce03..1b1236e85 100644 --- a/render/render.go +++ b/render/render.go @@ -9,7 +9,7 @@ import ( // Renderer is something that can render a report to a set of RenderableNodes. type Renderer interface { Render(report.Report) RenderableNodes - AggregateMetadata(rpt report.Report, localID, remoteID string) report.AggregateMetadata + AggregateMetadata(rpt report.Report, localID, remoteID string) AggregateMetadata } // Reduce renderer is a Renderer which merges together the output of several @@ -51,8 +51,8 @@ func (r Reduce) Render(rpt report.Report) RenderableNodes { } // AggregateMetadata produces an AggregateMetadata for a given edge. -func (r Reduce) AggregateMetadata(rpt report.Report, localID, remoteID string) report.AggregateMetadata { - metadata := report.AggregateMetadata{} +func (r Reduce) AggregateMetadata(rpt report.Report, localID, remoteID string) AggregateMetadata { + metadata := AggregateMetadata{} for _, renderer := range r { metadata.Merge(renderer.AggregateMetadata(rpt, localID, remoteID)) } @@ -111,7 +111,7 @@ func (m Map) render(rpt report.Report) (RenderableNodes, map[string]string) { // srcRenderableID. Since an edgeID can have multiple edges on the address // level, it uses the supplied mapping function to translate address IDs to // renderable node (mapped) IDs. -func (m Map) AggregateMetadata(rpt report.Report, srcRenderableID, dstRenderableID string) report.AggregateMetadata { +func (m Map) AggregateMetadata(rpt report.Report, srcRenderableID, dstRenderableID string) AggregateMetadata { // First we need to map the ids in this layer into the ids in the underlying layer _, mapped := m.render(rpt) // this maps from old -> new inverted := map[string][]string{} // this maps from new -> old(s) @@ -130,7 +130,7 @@ func (m Map) AggregateMetadata(rpt report.Report, srcRenderableID, dstRenderable } // Now recurse for each old edge - output := report.AggregateMetadata{} + output := AggregateMetadata{} for _, edge := range oldEdges { metadata := m.Renderer.AggregateMetadata(rpt, edge.src, edge.dst) output.Merge(metadata) @@ -202,7 +202,7 @@ func (m LeafMap) Render(rpt report.Report) RenderableNodes { srcRenderableNode.Origins = srcRenderableNode.Origins.Add(srcNodeID) edgeID := report.MakeEdgeID(srcNodeID, dstNodeID) if md, ok := t.EdgeMetadatas[edgeID]; ok { - srcRenderableNode.AggregateMetadata.Merge(md.Transform()) + srcRenderableNode.AggregateMetadata.Merge(AggregateMetadataOf(md)) } } @@ -216,7 +216,7 @@ func (m LeafMap) Render(rpt report.Report) RenderableNodes { // srcRenderableID. Since an edgeID can have multiple edges on the address // level, it uses the supplied mapping function to translate address IDs to // renderable node (mapped) IDs. -func (m LeafMap) AggregateMetadata(rpt report.Report, srcRenderableID, dstRenderableID string) report.AggregateMetadata { +func (m LeafMap) AggregateMetadata(rpt report.Report, srcRenderableID, dstRenderableID string) AggregateMetadata { t := m.Selector(rpt) metadata := report.EdgeMetadata{} for edgeID, edgeMeta := range t.EdgeMetadatas { @@ -237,7 +237,7 @@ func (m LeafMap) AggregateMetadata(rpt report.Report, srcRenderableID, dstRender metadata.Flatten(edgeMeta) } } - return metadata.Transform() + return AggregateMetadataOf(metadata) } // Render produces a set of RenderableNodes given a Report diff --git a/render/render_test.go b/render/render_test.go index b0ff17399..3aa758a5d 100644 --- a/render/render_test.go +++ b/render/render_test.go @@ -10,13 +10,13 @@ import ( type mockRenderer struct { render.RenderableNodes - aggregateMetadata report.AggregateMetadata + aggregateMetadata render.AggregateMetadata } func (m mockRenderer) Render(rpt report.Report) render.RenderableNodes { return m.RenderableNodes } -func (m mockRenderer) AggregateMetadata(rpt report.Report, localID, remoteID string) report.AggregateMetadata { +func (m mockRenderer) AggregateMetadata(rpt report.Report, localID, remoteID string) render.AggregateMetadata { return m.aggregateMetadata } @@ -36,11 +36,11 @@ func TestReduceRender(t *testing.T) { func TestReduceEdge(t *testing.T) { renderer := render.Reduce([]render.Renderer{ - mockRenderer{aggregateMetadata: report.AggregateMetadata{"foo": 1}}, - mockRenderer{aggregateMetadata: report.AggregateMetadata{"bar": 2}}, + mockRenderer{aggregateMetadata: render.AggregateMetadata{"foo": 1}}, + mockRenderer{aggregateMetadata: render.AggregateMetadata{"bar": 2}}, }) - want := report.AggregateMetadata{"foo": 1, "bar": 2} + want := render.AggregateMetadata{"foo": 1, "bar": 2} have := renderer.AggregateMetadata(report.MakeReport(), "", "") if !reflect.DeepEqual(want, have) { @@ -139,9 +139,9 @@ func TestMapEdge(t *testing.T) { }, } - want := report.AggregateMetadata{ - report.KeyBytesIngress: 1, - report.KeyBytesEgress: 2, + want := render.AggregateMetadata{ + render.KeyBytesIngress: 1, + render.KeyBytesEgress: 2, } have := mapper.AggregateMetadata(report.MakeReport(), "_foo", "_bar") if !reflect.DeepEqual(want, have) { diff --git a/render/renderable_node.go b/render/renderable_node.go index e34db414a..c5ccad8f4 100644 --- a/render/renderable_node.go +++ b/render/renderable_node.go @@ -16,8 +16,8 @@ type RenderableNode struct { Adjacency report.IDList `json:"adjacency,omitempty"` // Node IDs (in the same topology domain) Origins report.IDList `json:"origins,omitempty"` // Core node IDs that contributed information - report.AggregateMetadata `json:"metadata"` // Numeric sums - report.NodeMetadata `json:"-"` // merged NodeMetadata of the nodes used to build this + AggregateMetadata `json:"metadata"` // Numeric sums + report.NodeMetadata `json:"-"` // merged NodeMetadata of the nodes used to build this } // RenderableNodes is a set of RenderableNodes @@ -68,7 +68,7 @@ func NewRenderableNode(id, major, minor, rank string, nmd report.NodeMetadata) R LabelMinor: minor, Rank: rank, Pseudo: false, - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: AggregateMetadata{}, NodeMetadata: nmd.Copy(), } } @@ -93,7 +93,7 @@ func newPseudoNode(id, major, minor string) RenderableNode { LabelMinor: minor, Rank: "", Pseudo: true, - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: AggregateMetadata{}, NodeMetadata: report.NodeMetadata{}, } } diff --git a/render/topologies_test.go b/render/topologies_test.go index 0188c809f..872f6060e 100644 --- a/render/topologies_test.go +++ b/render/topologies_test.go @@ -254,9 +254,9 @@ func TestProcessRenderer(t *testing.T) { Pseudo: false, Adjacency: report.MakeIDList(serverProcessID), Origins: report.MakeIDList(client54001NodeID, client54002NodeID, clientProcessNodeID, clientHostNodeID), - AggregateMetadata: report.AggregateMetadata{ - report.KeyBytesIngress: 300, - report.KeyBytesEgress: 30, + AggregateMetadata: render.AggregateMetadata{ + render.KeyBytesIngress: 300, + render.KeyBytesEgress: 30, }, }, serverProcessID: { @@ -271,9 +271,9 @@ func TestProcessRenderer(t *testing.T) { "pseudo;10.10.10.11;192.168.1.1;80", ), Origins: report.MakeIDList(server80NodeID, serverProcessNodeID, serverHostNodeID), - AggregateMetadata: report.AggregateMetadata{ - report.KeyBytesIngress: 150, - report.KeyBytesEgress: 1500, + AggregateMetadata: render.AggregateMetadata{ + render.KeyBytesIngress: 150, + render.KeyBytesEgress: 1500, }, }, nonContainerProcessID: { @@ -284,19 +284,19 @@ func TestProcessRenderer(t *testing.T) { Pseudo: false, Adjacency: report.MakeIDList(), Origins: report.MakeIDList(nonContainerProcessNodeID, serverHostNodeID), - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: render.AggregateMetadata{}, }, "pseudo;10.10.10.10;192.168.1.1;80": { ID: "pseudo;10.10.10.10;192.168.1.1;80", LabelMajor: "10.10.10.10", Pseudo: true, - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: render.AggregateMetadata{}, }, "pseudo;10.10.10.11;192.168.1.1;80": { ID: "pseudo;10.10.10.11;192.168.1.1;80", LabelMajor: "10.10.10.11", Pseudo: true, - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: render.AggregateMetadata{}, }, } have := render.ProcessRenderer.Render(rpt) @@ -319,9 +319,9 @@ func TestProcessNameRenderer(t *testing.T) { Pseudo: false, Adjacency: report.MakeIDList("apache"), Origins: report.MakeIDList(client54001NodeID, client54002NodeID, clientProcessNodeID, clientHostNodeID), - AggregateMetadata: report.AggregateMetadata{ - report.KeyBytesIngress: 300, - report.KeyBytesEgress: 30, + AggregateMetadata: render.AggregateMetadata{ + render.KeyBytesIngress: 300, + render.KeyBytesEgress: 30, }, }, "apache": { @@ -336,9 +336,9 @@ func TestProcessNameRenderer(t *testing.T) { "pseudo;10.10.10.11;192.168.1.1;80", ), Origins: report.MakeIDList(server80NodeID, serverProcessNodeID, serverHostNodeID), - AggregateMetadata: report.AggregateMetadata{ - report.KeyBytesIngress: 150, - report.KeyBytesEgress: 1500, + AggregateMetadata: render.AggregateMetadata{ + render.KeyBytesIngress: 150, + render.KeyBytesEgress: 1500, }, }, "bash": { @@ -348,19 +348,19 @@ func TestProcessNameRenderer(t *testing.T) { Rank: "bash", Pseudo: false, Origins: report.MakeIDList(nonContainerProcessNodeID, serverHostNodeID), - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: render.AggregateMetadata{}, }, "pseudo;10.10.10.10;192.168.1.1;80": { ID: "pseudo;10.10.10.10;192.168.1.1;80", LabelMajor: "10.10.10.10", Pseudo: true, - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: render.AggregateMetadata{}, }, "pseudo;10.10.10.11;192.168.1.1;80": { ID: "pseudo;10.10.10.11;192.168.1.1;80", LabelMajor: "10.10.10.11", Pseudo: true, - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: render.AggregateMetadata{}, }, } have := render.ProcessNameRenderer.Render(rpt) @@ -383,9 +383,9 @@ func TestContainerRenderer(t *testing.T) { Pseudo: false, Adjacency: report.MakeIDList(serverContainerID), Origins: report.MakeIDList(clientContainerNodeID, client54001NodeID, client54002NodeID, clientProcessNodeID, clientHostNodeID), - AggregateMetadata: report.AggregateMetadata{ - report.KeyBytesIngress: 300, - report.KeyBytesEgress: 30, + AggregateMetadata: render.AggregateMetadata{ + render.KeyBytesIngress: 300, + render.KeyBytesEgress: 30, }, }, serverContainerID: { @@ -396,9 +396,9 @@ func TestContainerRenderer(t *testing.T) { Pseudo: false, Adjacency: report.MakeIDList(clientContainerID, render.UncontainedID), Origins: report.MakeIDList(serverContainerNodeID, server80NodeID, serverProcessNodeID, serverHostNodeID), - AggregateMetadata: report.AggregateMetadata{ - report.KeyBytesIngress: 150, - report.KeyBytesEgress: 1500, + AggregateMetadata: render.AggregateMetadata{ + render.KeyBytesIngress: 150, + render.KeyBytesEgress: 1500, }, }, render.UncontainedID: { @@ -408,7 +408,7 @@ func TestContainerRenderer(t *testing.T) { Rank: "", Pseudo: true, Origins: report.MakeIDList(nonContainerProcessNodeID, serverHostNodeID), - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: render.AggregateMetadata{}, }, } have := render.ContainerRenderer.Render(rpt) @@ -428,8 +428,8 @@ func TestRenderByNetworkHostname(t *testing.T) { Pseudo: false, Adjacency: report.MakeIDList("host:server.hostname.com"), Origins: report.MakeIDList(report.MakeHostNodeID("client.hostname.com"), report.MakeAddressNodeID("client.hostname.com", "10.10.10.20")), - AggregateMetadata: report.AggregateMetadata{ - report.KeyMaxConnCountTCP: 3, + AggregateMetadata: render.AggregateMetadata{ + render.KeyMaxConnCountTCP: 3, }, }, "host:random.hostname.com": { @@ -440,8 +440,8 @@ func TestRenderByNetworkHostname(t *testing.T) { Pseudo: false, Adjacency: report.MakeIDList("host:server.hostname.com"), Origins: report.MakeIDList(report.MakeHostNodeID("random.hostname.com"), report.MakeAddressNodeID("random.hostname.com", "172.16.11.9")), - AggregateMetadata: report.AggregateMetadata{ - report.KeyMaxConnCountTCP: 20, + AggregateMetadata: render.AggregateMetadata{ + render.KeyMaxConnCountTCP: 20, }, }, "host:server.hostname.com": { @@ -452,8 +452,8 @@ func TestRenderByNetworkHostname(t *testing.T) { Pseudo: false, Adjacency: report.MakeIDList("host:client.hostname.com", "pseudo;10.10.10.10;192.168.1.1;"), Origins: report.MakeIDList(report.MakeHostNodeID("server.hostname.com"), report.MakeAddressNodeID("server.hostname.com", "192.168.1.1")), - AggregateMetadata: report.AggregateMetadata{ - report.KeyMaxConnCountTCP: 10, + AggregateMetadata: render.AggregateMetadata{ + render.KeyMaxConnCountTCP: 10, }, }, "pseudo;10.10.10.10;192.168.1.1;": { @@ -464,7 +464,7 @@ func TestRenderByNetworkHostname(t *testing.T) { Pseudo: true, Adjacency: nil, Origins: nil, - AggregateMetadata: report.AggregateMetadata{}, + AggregateMetadata: render.AggregateMetadata{}, }, } have := render.LeafMap{