Merge pull request #255 from tomwilkie/move-aggregate

Move AggregateMetadata into render package.
This commit is contained in:
Tom Wilkie
2015-06-18 10:37:16 +02:00
9 changed files with 87 additions and 81 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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