package render_test import ( "fmt" "testing" "github.com/weaveworks/scope/common/mtime" "github.com/weaveworks/scope/probe/docker" "github.com/weaveworks/scope/probe/endpoint" "github.com/weaveworks/scope/probe/host" "github.com/weaveworks/scope/render" "github.com/weaveworks/scope/report" ) var ( serverHostID = "host1" serverHostNodeID = report.MakeHostNodeID(serverHostID) randomIP = "3.4.5.6" randomPort = "56789" randomEndpointNodeID = report.MakeEndpointNodeID(serverHostID, randomIP, randomPort) serverIP = "192.168.1.1" serverPort = "80" serverEndpointNodeID = report.MakeEndpointNodeID(serverHostID, serverIP, serverPort) container1ID = "11b2c3d4e5" container1IP = "192.168.0.1" container1Name = "foo" container1NodeID = report.MakeContainerNodeID(container1ID) container1Port = "16782" container1EndpointNodeID = report.MakeEndpointNodeID(serverHostID, container1IP, container1Port) duplicatedIP = "192.168.0.2" duplicatedPort = "80" duplicatedEndpointNodeID = report.MakeEndpointNodeID(serverHostID, duplicatedIP, duplicatedPort) container2ID = "21b2c3d4e5" container2IP = duplicatedIP container2Name = "bar" container2NodeID = report.MakeContainerNodeID(container2ID) pauseContainerID = "31b2c3d4e5" pauseContainerIP = duplicatedIP pauseContainerName = "POD" pauseContainerNodeID = report.MakeContainerNodeID(pauseContainerID) rpt = report.Report{ Endpoint: report.Topology{ Nodes: report.Nodes{ randomEndpointNodeID: report.MakeNodeWith(randomEndpointNodeID, map[string]string{ endpoint.Addr: randomIP, endpoint.Port: randomPort, endpoint.Conntracked: "true", }). WithAdjacent(serverEndpointNodeID).WithTopology(report.Endpoint), serverEndpointNodeID: report.MakeNodeWith(serverEndpointNodeID, map[string]string{ endpoint.Addr: serverIP, endpoint.Port: serverPort, endpoint.Conntracked: "true", }). WithTopology(report.Endpoint), container1EndpointNodeID: report.MakeNodeWith(container1EndpointNodeID, map[string]string{ endpoint.Addr: container1IP, endpoint.Port: container1Port, endpoint.Conntracked: "true", }). WithAdjacent(duplicatedEndpointNodeID).WithTopology(report.Endpoint), duplicatedEndpointNodeID: report.MakeNodeWith(duplicatedEndpointNodeID, map[string]string{ endpoint.Addr: duplicatedIP, endpoint.Port: duplicatedPort, endpoint.Conntracked: "true", }). WithTopology(report.Endpoint), }, }, Container: report.Topology{ Nodes: report.Nodes{ container1NodeID: report.MakeNodeWith(container1NodeID, map[string]string{ docker.ContainerID: container1ID, docker.ContainerName: container1Name, report.HostNodeID: serverHostNodeID, }). WithSets(report.EmptySets. Add(docker.ContainerIPs, report.MakeStringSet(container1IP)). Add(docker.ContainerIPsWithScopes, report.MakeStringSet(report.MakeAddressNodeID("", container1IP))). Add(docker.ContainerPorts, report.MakeStringSet(fmt.Sprintf("%s:%s->%s/tcp", serverIP, serverPort, serverPort))), ).WithTopology(report.Container), container2NodeID: report.MakeNodeWith(container2NodeID, map[string]string{ docker.ContainerID: container2ID, docker.ContainerName: container2Name, report.HostNodeID: serverHostNodeID, }). WithSets(report.EmptySets. Add(docker.ContainerIPs, report.MakeStringSet(container2IP)). Add(docker.ContainerIPsWithScopes, report.MakeStringSet(report.MakeAddressNodeID("", container2IP))), ).WithTopology(report.Container), pauseContainerNodeID: report.MakeNodeWith(pauseContainerNodeID, map[string]string{ docker.ContainerID: pauseContainerID, docker.ContainerName: pauseContainerName, report.HostNodeID: serverHostNodeID, }). WithSets(report.EmptySets. Add(docker.ContainerIPs, report.MakeStringSet(pauseContainerIP)). Add(docker.ContainerIPsWithScopes, report.MakeStringSet(report.MakeAddressNodeID("", pauseContainerIP))), ).WithTopology(report.Container).WithLatest(report.DoesNotMakeConnections, mtime.Now(), ""), }, }, Host: report.Topology{ Nodes: report.Nodes{ serverHostNodeID: report.MakeNodeWith(serverHostNodeID, map[string]string{ report.HostNodeID: serverHostNodeID, }). WithSets(report.EmptySets. Add(host.LocalNetworks, report.MakeStringSet("192.168.0.0/16")), ).WithTopology(report.Host), }, }, } ) func TestShortLivedInternetNodeConnections(t *testing.T) { have := Prune(render.ContainerWithImageNameRenderer.Render(rpt, FilterNoop)) // Conntracked-only connections from the internet should be assigned to the internet pseudonode internet, ok := have[render.IncomingInternetID] if !ok { t.Fatal("Expected output to have an incoming internet node") } if !internet.Adjacency.Contains(container1NodeID) { t.Errorf("Expected internet node to have adjacency to %s, but only had %v", container1NodeID, internet.Adjacency) } } func TestPauseContainerDiscarded(t *testing.T) { have := Prune(render.ContainerWithImageNameRenderer.Render(rpt, FilterNoop)) // There should only be a connection from container1 and the destination should be container2 container1, ok := have[container1NodeID] if !ok { t.Fatal("Expected output to have container1") } if len(container1.Adjacency) != 1 || !container1.Adjacency.Contains(container2NodeID) { t.Errorf("Expected container1 to have a unique adjacency to %s, but instead had %v", container2NodeID, container1.Adjacency) } }