diff --git a/probe/docker/reporter.go b/probe/docker/reporter.go index f9bf68276..66ae36564 100644 --- a/probe/docker/reporter.go +++ b/probe/docker/reporter.go @@ -13,11 +13,10 @@ import ( // Keys for use in Node const ( - ImageID = "docker_image_id" - ImageName = "docker_image_name" - ImageLabelPrefix = "docker_image_label_" - OverlayPeerPrefix = "docker_peer_" - IsInHostNetwork = "docker_is_in_host_network" + ImageID = "docker_image_id" + ImageName = "docker_image_name" + ImageLabelPrefix = "docker_image_label_" + IsInHostNetwork = "docker_is_in_host_network" ) // Exposed for testing @@ -261,10 +260,9 @@ func (r *Reporter) overlayTopology() report.Topology { } }) - peerID := OverlayPeerPrefix + r.hostID // Add both local and global networks to the LocalNetworks Set // since we treat container IPs as local - node := report.MakeNode(report.MakeOverlayNodeID(peerID)).WithSets( + node := report.MakeNode(report.MakeOverlayNodeID(report.DockerOverlayPeerPrefix, r.hostID)).WithSets( report.MakeSets().Add(host.LocalNetworks, report.MakeStringSet(subnets...))) return report.MakeTopology().AddNode(node) } diff --git a/probe/docker/reporter_test.go b/probe/docker/reporter_test.go index 1a81bc0fc..a6d48bb72 100644 --- a/probe/docker/reporter_test.go +++ b/probe/docker/reporter_test.go @@ -134,8 +134,7 @@ func TestReporter(t *testing.T) { // Reporter should add a container network { - peerID := docker.OverlayPeerPrefix + hostID - overlayNodeID := report.MakeOverlayNodeID(peerID) + overlayNodeID := report.MakeOverlayNodeID(report.DockerOverlayPeerPrefix, hostID) node, ok := rpt.Overlay.Nodes[overlayNodeID] if !ok { t.Fatalf("Expected report to have overlay node %q, but not found", overlayNodeID) diff --git a/probe/overlay/weave.go b/probe/overlay/weave.go index b14d4e535..d4b173d68 100644 --- a/probe/overlay/weave.go +++ b/probe/overlay/weave.go @@ -164,24 +164,25 @@ func (w *Weave) Report() (report.Report, error) { WeaveDNSHostname: {ID: WeaveDNSHostname, Label: "Weave DNS Name", From: report.FromLatest, Priority: 18}, }) for _, peer := range w.statusCache.Router.Peers { - node := report.MakeNodeWith(report.MakeOverlayNodeID(peer.Name), map[string]string{ - WeavePeerName: peer.Name, - WeavePeerNickName: peer.NickName, - }) + node := report.MakeNodeWith(report.MakeOverlayNodeID(report.WeaveOverlayPeerPrefix, peer.Name), + map[string]string{ + WeavePeerName: peer.Name, + WeavePeerNickName: peer.NickName, + }) if peer.Name == w.statusCache.Router.Name { node = node.WithLatest(report.HostNodeID, mtime.Now(), w.hostID) node = node.WithParents(report.EmptySets.Add(report.Host, report.MakeStringSet(w.hostID))) } for _, conn := range peer.Connections { if conn.Outbound { - node = node.WithAdjacent(report.MakeOverlayNodeID(conn.Name)) + node = node.WithAdjacent(report.MakeOverlayNodeID(report.WeaveOverlayPeerPrefix, conn.Name)) } } r.Overlay.AddNode(node) } if w.statusCache.IPAM.DefaultSubnet != "" { r.Overlay.AddNode( - report.MakeNode(report.MakeOverlayNodeID(w.statusCache.Router.Name)).WithSets( + report.MakeNode(report.MakeOverlayNodeID(report.WeaveOverlayPeerPrefix, w.statusCache.Router.Name)).WithSets( report.MakeSets().Add(host.LocalNetworks, report.MakeStringSet(w.statusCache.IPAM.DefaultSubnet)), ), ) diff --git a/probe/overlay/weave_test.go b/probe/overlay/weave_test.go index fc7161c5b..aec56548b 100644 --- a/probe/overlay/weave_test.go +++ b/probe/overlay/weave_test.go @@ -35,7 +35,7 @@ func TestWeaveTaggerOverlayTopology(t *testing.T) { t.Fatal(err) } - nodeID := report.MakeOverlayNodeID(weave.MockWeavePeerName) + nodeID := report.MakeOverlayNodeID(report.WeaveOverlayPeerPrefix, weave.MockWeavePeerName) node, ok := have.Overlay.Nodes[nodeID] if !ok { t.Errorf("Expected overlay node %q, but not found", nodeID) diff --git a/render/weave.go b/render/weave.go index 588729157..28d708e59 100644 --- a/render/weave.go +++ b/render/weave.go @@ -13,11 +13,17 @@ var WeaveRenderer = MakeMap( // MapWeaveIdentity maps an overlay topology node to a weave topology node. func MapWeaveIdentity(m report.Node, _ report.Networks) report.Nodes { - var node = m - if _, ok := m.Latest.Lookup(report.HostNodeID); !ok { + + peerPrefix, peerName := report.ParseOverlayNodeID(m.ID) + if peerPrefix != report.WeaveOverlayPeerPrefix { + return nil + } + + var node = NewDerivedNode(peerName, m) + if _, ok := node.Latest.Lookup(report.HostNodeID); !ok { nickname, _ := m.Latest.Lookup(overlay.WeavePeerNickName) id := MakePseudoNodeID(UnmanagedID, nickname) node = NewDerivedPseudoNode(id, m) } - return report.Nodes{node.ID: node} + return report.Nodes{peerName: node} } diff --git a/report/id.go b/report/id.go index dd1c3720f..ea6a279e9 100644 --- a/report/id.go +++ b/report/id.go @@ -22,6 +22,12 @@ const ( // Key added to nodes to prevent them being joined with conntracked connections DoesNotMakeConnections = "does_not_make_connections" + + // WeaveOverlayPeerPrefix is the prefix for weave peers in the overlay network + WeaveOverlayPeerPrefix = "" + + // DockerOverlayPeerPrefix is the prefix for docker peers in the overlay network + DockerOverlayPeerPrefix = "docker_peer_" ) // MakeEndpointNodeID produces an endpoint node ID from its composite parts. @@ -134,9 +140,26 @@ func parseSingleComponentID(tag string) func(string) (string, bool) { } // MakeOverlayNodeID produces an overlay topology node ID from a router peer's -// name, which is assumed to be globally unique. -func MakeOverlayNodeID(peerName string) string { - return "#" + peerName +// prefix and name, which is assumed to be globally unique. +func MakeOverlayNodeID(peerPrefix, peerName string) string { + return "#" + peerPrefix + peerName +} + +// ParseOverlayNodeID produces the overlay type and peer name. +func ParseOverlayNodeID(id string) (overlayPrefix string, peerName string) { + + if !strings.HasPrefix(id, "#") { + // Best we can do + return "", "" + } + + id = id[1:] + + if strings.HasPrefix(id, DockerOverlayPeerPrefix) { + return DockerOverlayPeerPrefix, id[len(DockerOverlayPeerPrefix):] + } + + return WeaveOverlayPeerPrefix, peerName } // ParseNodeID produces the host ID and remainder (typically an address) from