diff --git a/probe/endpoint/reporter.go b/probe/endpoint/reporter.go index 79c946ca0..0c7c5bfad 100644 --- a/probe/endpoint/reporter.go +++ b/probe/endpoint/reporter.go @@ -80,18 +80,18 @@ func (r *Reporter) addConnection(rpt *report.Report, c *procspy.Connection) { localIsClient = int(c.LocalPort) > int(c.RemotePort) localAddressNodeID = report.MakeAddressNodeID(r.hostID, c.LocalAddress.String()) remoteAddressNodeID = report.MakeAddressNodeID(r.hostID, c.RemoteAddress.String()) - adjecencyID = "" + adjacencyID = "" edgeID = "" ) if localIsClient { - adjecencyID = report.MakeAdjacencyID(localAddressNodeID) - rpt.Address.Adjacency[adjecencyID] = rpt.Address.Adjacency[adjecencyID].Add(remoteAddressNodeID) + adjacencyID = report.MakeAdjacencyID(localAddressNodeID) + rpt.Address.Adjacency[adjacencyID] = rpt.Address.Adjacency[adjacencyID].Add(remoteAddressNodeID) edgeID = report.MakeEdgeID(localAddressNodeID, remoteAddressNodeID) } else { - adjecencyID = report.MakeAdjacencyID(remoteAddressNodeID) - rpt.Address.Adjacency[adjecencyID] = rpt.Address.Adjacency[adjecencyID].Add(localAddressNodeID) + adjacencyID = report.MakeAdjacencyID(remoteAddressNodeID) + rpt.Address.Adjacency[adjacencyID] = rpt.Address.Adjacency[adjacencyID].Add(localAddressNodeID) edgeID = report.MakeEdgeID(remoteAddressNodeID, localAddressNodeID) } @@ -109,18 +109,18 @@ func (r *Reporter) addConnection(rpt *report.Report, c *procspy.Connection) { var ( localEndpointNodeID = report.MakeEndpointNodeID(r.hostID, c.LocalAddress.String(), strconv.Itoa(int(c.LocalPort))) remoteEndpointNodeID = report.MakeEndpointNodeID(r.hostID, c.RemoteAddress.String(), strconv.Itoa(int(c.RemotePort))) - adjecencyID = "" + adjacencyID = "" edgeID = "" ) if localIsClient { - adjecencyID = report.MakeAdjacencyID(localEndpointNodeID) - rpt.Endpoint.Adjacency[adjecencyID] = rpt.Endpoint.Adjacency[adjecencyID].Add(remoteEndpointNodeID) + adjacencyID = report.MakeAdjacencyID(localEndpointNodeID) + rpt.Endpoint.Adjacency[adjacencyID] = rpt.Endpoint.Adjacency[adjacencyID].Add(remoteEndpointNodeID) edgeID = report.MakeEdgeID(localEndpointNodeID, remoteEndpointNodeID) } else { - adjecencyID = report.MakeAdjacencyID(remoteEndpointNodeID) - rpt.Endpoint.Adjacency[adjecencyID] = rpt.Endpoint.Adjacency[adjecencyID].Add(localEndpointNodeID) + adjacencyID = report.MakeAdjacencyID(remoteEndpointNodeID) + rpt.Endpoint.Adjacency[adjacencyID] = rpt.Endpoint.Adjacency[adjacencyID].Add(localEndpointNodeID) edgeID = report.MakeEdgeID(remoteEndpointNodeID, localEndpointNodeID) } diff --git a/render/detailed_node.go b/render/detailed_node.go index 11585a692..2f329228a 100644 --- a/render/detailed_node.go +++ b/render/detailed_node.go @@ -184,25 +184,38 @@ func connectionDetailsRows(topology report.Topology, originID string) []Row { if !ok { return rows } - for _, serverNodeID := range topology.Adjacency[report.MakeAdjacencyID(originID)] { - if remote, ok := labeler(serverNodeID); ok { - rows = append(rows, Row{ - Key: local, - ValueMajor: remote, - }) + // Firstly, collection outgoing connections from this node. + originAdjID := report.MakeAdjacencyID(originID) + for _, serverNodeID := range topology.Adjacency[originAdjID] { + remote, ok := labeler(serverNodeID) + if !ok { + continue } + rows = append(rows, Row{ + Key: local, + ValueMajor: remote, + }) } + // Next, scan the topology for incoming connections to this node. for clientAdjID, serverNodeIDs := range topology.Adjacency { - if serverNodeIDs.Contains(originID) { - if clientNodeID, ok := report.ParseAdjacencyID(clientAdjID); ok { - if remote, ok := labeler(clientNodeID); ok { - rows = append(rows, Row{ - Key: remote, - ValueMajor: local, - }) - } - } + if clientAdjID == originAdjID { + continue } + if !serverNodeIDs.Contains(originID) { + continue + } + clientNodeID, ok := report.ParseAdjacencyID(clientAdjID) + if !ok { + continue + } + remote, ok := labeler(clientNodeID) + if !ok { + continue + } + rows = append(rows, Row{ + Key: remote, + ValueMajor: local, + }) } return rows } diff --git a/render/detailed_node_test.go b/render/detailed_node_test.go index 242f24d56..20b6f97cc 100644 --- a/render/detailed_node_test.go +++ b/render/detailed_node_test.go @@ -94,8 +94,8 @@ func TestMakeDetailedHostNode(t *testing.T) { Rank: 0, Rows: []render.Row{ { - Key: "Local", - ValueMajor: "Remote", + Key: "Client", + ValueMajor: "Server", ValueMinor: "", }, { diff --git a/render/mapping.go b/render/mapping.go index 5e77db13c..8d3369b25 100644 --- a/render/mapping.go +++ b/render/mapping.go @@ -33,12 +33,12 @@ const ( // rendered topology. type LeafMapFunc func(report.NodeMetadata) (RenderableNode, bool) -// PseudoFunc creates RenderableNode representing pseudo nodes given the nodeID. -// dstNodeID is the node id of one of the nodes this node is attached to. -// nodeID and dstNodeID are node IDs prior to mapping. isClient indicated the direction -// of the edge to dstNodeID - true indicates nodeID is the client, false indicates -// nodeID is the server. -type PseudoFunc func(nodeID string, dstNodeID string, isClient bool, local report.Networks) (RenderableNode, bool) +// PseudoFunc creates RenderableNode representing pseudo nodes given the +// srcNodeID. dstNodeID is the node id of one of the nodes this node has an +// edge to. srcNodeID and dstNodeID are node IDs prior to mapping. srcIsClient +// indicates the direction of the edge to dstNodeID - true indicates srcNodeID +// is the client, false indicates dstNodeID is the server. +type PseudoFunc func(srcNodeID, dstNodeID string, srcIsClient bool, local report.Networks) (RenderableNode, bool) // MapFunc is anything which can take an arbitrary RenderableNode and // return another RenderableNode. @@ -324,25 +324,25 @@ func MapAddress2Host(n RenderableNode) (RenderableNode, bool) { // the report's local networks. Otherwise, the returned function will // produce a single pseudo node per (dst address, src address, src port). func GenericPseudoNode(addresser func(id string) net.IP) PseudoFunc { - return func(nodeID, dstNodeId string, isClient bool, local report.Networks) (RenderableNode, bool) { + return func(srcNodeID, dstNodeID string, srcIsClient bool, local report.Networks) (RenderableNode, bool) { // Use the addresser to extract the IP of the missing node - nodeAddr := addresser(nodeID) + srcNodeAddr := addresser(srcNodeID) // If the dstNodeAddr is not in a network local to this report, we emit an // internet node - if !local.Contains(nodeAddr) { + if !local.Contains(srcNodeAddr) { return newPseudoNode(TheInternetID, TheInternetMajor, ""), true } - if isClient { - // If the client node is missing, generate a single pseudo node for every (client ip, server ip, server por) - serverIP, serverPort := trySplitAddr(dstNodeId) - outputID := MakePseudoNodeID(nodeAddr.String(), serverIP, serverPort) - major := nodeAddr.String() + if srcIsClient { + // If the client node is missing, generate a single pseudo node for every (client ip, server ip, server port) + serverIP, serverPort := trySplitAddr(dstNodeID) + outputID := MakePseudoNodeID(srcNodeAddr.String(), serverIP, serverPort) + major := srcNodeAddr.String() return newPseudoNode(outputID, major, ""), true } - // Othereise (the server node is missing), generate a pseudo node for every (server ip, server port) - serverIP, serverPort := trySplitAddr(nodeID) + // Otherwise (the server node is missing), generate a pseudo node for every (server ip, server port) + serverIP, serverPort := trySplitAddr(srcNodeID) outputID := MakePseudoNodeID(serverIP, serverPort) if serverPort != "" { return newPseudoNode(outputID, serverIP+":"+serverPort, ""), true diff --git a/render/render.go b/render/render.go index d9dfcafb4..c6ea9c2f4 100644 --- a/render/render.go +++ b/render/render.go @@ -177,8 +177,8 @@ func (m LeafMap) Render(rpt report.Report) RenderableNodes { source2mapped[nodeID] = mapped.ID } - mkPseudoNode := func(srcID, dstId string, srcIsClient bool) (string, bool) { - pseudoNode, ok := m.Pseudo(srcID, dstId, srcIsClient, localNetworks) + mkPseudoNode := func(srcNodeID, dstNodeID string, srcIsClient bool) (string, bool) { + pseudoNode, ok := m.Pseudo(srcNodeID, dstNodeID, srcIsClient, localNetworks) if !ok { return "", false } @@ -191,7 +191,7 @@ func (m LeafMap) Render(rpt report.Report) RenderableNodes { } nodes[pseudoNode.ID] = pseudoNode - source2mapped[pseudoNode.ID] = srcID + source2mapped[pseudoNode.ID] = srcNodeID return pseudoNode.ID, true }