diff --git a/app/api_topologies.go b/app/api_topologies.go index 1d205ce60..2a28a40ae 100644 --- a/app/api_topologies.go +++ b/app/api_topologies.go @@ -188,9 +188,8 @@ func MakeRegistry() *Registry { ID: "unconnected", Default: "hide", Options: []APITopologyOption{ - // Show the user why there are filtered nodes in this view. - // Don't give them the option to show those nodes. - {Value: "hide", Label: "Unconnected nodes hidden", filter: nil, filterPseudo: false}, + {Value: "show", Label: "Show Unconnected", filter: nil, filterPseudo: false}, + {Value: "hide", Label: "Hide Unconnected", filter: render.IsConnected, filterPseudo: false}, }, }, } @@ -201,7 +200,6 @@ func MakeRegistry() *Registry { APITopologyDesc{ id: processesID, renderer: render.ProcessWithContainerNameRenderer, - filter: render.FilterUnconnected, Name: "Processes", Rank: 1, Options: unconnectedFilter, @@ -211,7 +209,6 @@ func MakeRegistry() *Registry { id: processesByNameID, parent: processesID, renderer: render.ProcessNameRenderer, - filter: render.FilterUnconnected, Name: "by name", Options: unconnectedFilter, HideIfEmpty: true, @@ -219,7 +216,6 @@ func MakeRegistry() *Registry { APITopologyDesc{ id: containersID, renderer: render.ContainerWithImageNameRenderer, - filter: render.FilterUnconnectedPseudo, Name: "Containers", Rank: 2, Options: containerFilters, @@ -228,7 +224,6 @@ func MakeRegistry() *Registry { id: containersByHostnameID, parent: containersID, renderer: render.ContainerHostnameRenderer, - filter: render.FilterUnconnectedPseudo, Name: "by DNS name", Options: containerFilters, }, @@ -236,14 +231,12 @@ func MakeRegistry() *Registry { id: containersByImageID, parent: containersID, renderer: render.ContainerImageRenderer, - filter: render.FilterUnconnectedPseudo, Name: "by image", Options: containerFilters, }, APITopologyDesc{ id: podsID, renderer: render.PodRenderer, - filter: render.FilterUnconnectedPseudo, Name: "Pods", Rank: 3, Options: []APITopologyOptionGroup{unmanagedFilter}, @@ -253,7 +246,6 @@ func MakeRegistry() *Registry { id: kubeControllersID, parent: podsID, renderer: render.KubeControllerRenderer, - filter: render.FilterUnconnectedPseudo, Name: "controllers", Options: []APITopologyOptionGroup{unmanagedFilter}, HideIfEmpty: true, @@ -262,7 +254,6 @@ func MakeRegistry() *Registry { id: servicesID, parent: podsID, renderer: render.PodServiceRenderer, - filter: render.FilterUnconnectedPseudo, Name: "services", Options: []APITopologyOptionGroup{unmanagedFilter}, HideIfEmpty: true, @@ -270,7 +261,6 @@ func MakeRegistry() *Registry { APITopologyDesc{ id: ecsTasksID, renderer: render.ECSTaskRenderer, - filter: render.FilterUnconnectedPseudo, Name: "Tasks", Rank: 3, Options: []APITopologyOptionGroup{unmanagedFilter}, @@ -280,7 +270,6 @@ func MakeRegistry() *Registry { id: ecsServicesID, parent: ecsTasksID, renderer: render.ECSServiceRenderer, - filter: render.FilterUnconnectedPseudo, Name: "services", Options: []APITopologyOptionGroup{unmanagedFilter}, HideIfEmpty: true, @@ -288,7 +277,6 @@ func MakeRegistry() *Registry { APITopologyDesc{ id: swarmServicesID, renderer: render.SwarmServiceRenderer, - filter: render.FilterUnconnectedPseudo, Name: "services", Rank: 3, Options: []APITopologyOptionGroup{unmanagedFilter}, @@ -297,7 +285,6 @@ func MakeRegistry() *Registry { APITopologyDesc{ id: hostsID, renderer: render.HostRenderer, - filter: render.FilterUnconnectedPseudo, Name: "Hosts", Rank: 4, }, @@ -305,7 +292,6 @@ func MakeRegistry() *Registry { id: weaveID, parent: hostsID, renderer: render.WeaveRenderer, - filter: render.FilterUnconnectedPseudo, Name: "Weave Net", }, ) @@ -318,7 +304,6 @@ type APITopologyDesc struct { id string parent string renderer render.Renderer - filter render.Transformer Name string `json:"name"` Rank int `json:"rank"` @@ -542,7 +527,7 @@ func (r *Registry) RendererForTopology(topologyID string, values url.Values, rpt if len(values) == 0 { // if no options where provided, only apply base filter - return topology.renderer, topology.filter, nil + return topology.renderer, render.FilterUnconnectedPseudo, nil } var filters []render.FilterFunc @@ -553,9 +538,9 @@ func (r *Registry) RendererForTopology(topologyID string, values url.Values, rpt } } if len(filters) > 0 { - return topology.renderer, render.Transformers([]render.Transformer{render.ComposeFilterFuncs(filters...), topology.filter}), nil + return topology.renderer, render.Transformers([]render.Transformer{render.ComposeFilterFuncs(filters...), render.FilterUnconnectedPseudo}), nil } - return topology.renderer, topology.filter, nil + return topology.renderer, render.FilterUnconnectedPseudo, nil } type reporterHandler func(context.Context, Reporter, http.ResponseWriter, *http.Request) diff --git a/client/app/scripts/components/node-details/node-details-table-node-link.js b/client/app/scripts/components/node-details/node-details-table-node-link.js index 0ecd15aeb..1c3303b9b 100644 --- a/client/app/scripts/components/node-details/node-details-table-node-link.js +++ b/client/app/scripts/components/node-details/node-details-table-node-link.js @@ -32,24 +32,17 @@ class NodeDetailsTableNodeLink extends React.Component { } render() { - const { label, labelMinor, linkable } = this.props; + const { label, labelMinor } = this.props; const title = !labelMinor ? label : `${label} (${labelMinor})`; - if (linkable) { - return ( - - {label} - - ); - } return ( - + {label} ); diff --git a/render/detailed/connections.go b/render/detailed/connections.go index cf252e134..e41dbd401 100644 --- a/render/detailed/connections.go +++ b/render/detailed/connections.go @@ -48,7 +48,6 @@ type Connection struct { NodeID string `json:"nodeId"` // ID of a node in the topology. Optional, must be set if linkable is true. Label string `json:"label"` LabelMinor string `json:"labelMinor,omitempty"` - Linkable bool `json:"linkable"` Metadata []report.MetadataRow `json:"metadata,omitempty"` } @@ -132,7 +131,6 @@ func (c *connectionCounters) rows(r report.Report, ns report.Nodes, includeLocal NodeID: summary.ID, Label: summary.Label, LabelMinor: summary.LabelMinor, - Linkable: true, } if row.remoteAddr != "" { connection.Label = row.remoteAddr diff --git a/render/detailed/node_test.go b/render/detailed/node_test.go index 11fafc6ed..c8e2d086c 100644 --- a/render/detailed/node_test.go +++ b/render/detailed/node_test.go @@ -37,9 +37,7 @@ func TestMakeDetailedHostNode(t *testing.T) { containerImageNodeSummary := child(t, render.ContainerImageRenderer, expected.ClientContainerImageNodeID) containerNodeSummary := child(t, render.ContainerRenderer, fixture.ClientContainerNodeID) process1NodeSummary := child(t, render.ProcessRenderer, fixture.ClientProcess1NodeID) - process1NodeSummary.Linkable = true process2NodeSummary := child(t, render.ProcessRenderer, fixture.ClientProcess2NodeID) - process2NodeSummary.Linkable = true podNodeSummary := child(t, render.PodRenderer, fixture.ClientPodNodeID) want := detailed.Node{ NodeSummary: detailed.NodeSummary{ @@ -50,7 +48,6 @@ func TestMakeDetailedHostNode(t *testing.T) { Rank: "hostname.com", Pseudo: false, Shape: "circle", - Linkable: true, }, Adjacency: report.MakeIDList(fixture.ServerHostNodeID), Metadata: []report.MetadataRow{ @@ -157,7 +154,6 @@ func TestMakeDetailedHostNode(t *testing.T) { NodeID: fixture.ServerHostNodeID, Label: "server", LabelMinor: "hostname.com", - Linkable: true, Metadata: []report.MetadataRow{ { ID: "port", @@ -188,7 +184,6 @@ func TestMakeDetailedContainerNode(t *testing.T) { have := detailed.MakeNode("containers", detailed.RenderContext{Report: fixture.Report}, renderableNodes, renderableNode) serverProcessNodeSummary := child(t, render.ProcessRenderer, fixture.ServerProcessNodeID) - serverProcessNodeSummary.Linkable = true want := detailed.Node{ NodeSummary: detailed.NodeSummary{ BasicNodeSummary: detailed.BasicNodeSummary{ @@ -197,7 +192,6 @@ func TestMakeDetailedContainerNode(t *testing.T) { LabelMinor: "server.hostname.com", Rank: fixture.ServerContainerImageName, Shape: "hexagon", - Linkable: true, Pseudo: false, }, Metadata: []report.MetadataRow{ @@ -266,7 +260,6 @@ func TestMakeDetailedContainerNode(t *testing.T) { NodeID: fixture.ClientContainerNodeID, Label: "client", LabelMinor: "client.hostname.com", - Linkable: true, Metadata: []report.MetadataRow{ { ID: "port", @@ -279,10 +272,9 @@ func TestMakeDetailedContainerNode(t *testing.T) { }, }, { - ID: connectionID(render.IncomingInternetID, fixture.RandomClientIP), - NodeID: render.IncomingInternetID, - Label: fixture.RandomClientIP, - Linkable: true, + ID: connectionID(render.IncomingInternetID, fixture.RandomClientIP), + NodeID: render.IncomingInternetID, + Label: fixture.RandomClientIP, Metadata: []report.MetadataRow{ { ID: "port", @@ -321,7 +313,6 @@ func TestMakeDetailedPodNode(t *testing.T) { containerNodeSummary := child(t, render.ContainerWithImageNameRenderer, fixture.ServerContainerNodeID) serverProcessNodeSummary := child(t, render.ProcessRenderer, fixture.ServerProcessNodeID) - serverProcessNodeSummary.Linkable = true // Temporary workaround for: https://github.com/weaveworks/scope/issues/1295 want := detailed.Node{ NodeSummary: detailed.NodeSummary{ BasicNodeSummary: detailed.BasicNodeSummary{ @@ -330,7 +321,6 @@ func TestMakeDetailedPodNode(t *testing.T) { LabelMinor: "1 container", Rank: "ping/pong-b", Shape: "heptagon", - Linkable: true, Pseudo: false, }, Metadata: []report.MetadataRow{ @@ -385,7 +375,6 @@ func TestMakeDetailedPodNode(t *testing.T) { NodeID: fixture.ClientPodNodeID, Label: "pong-a", LabelMinor: "1 container", - Linkable: true, Metadata: []report.MetadataRow{ { ID: "port", @@ -398,10 +387,9 @@ func TestMakeDetailedPodNode(t *testing.T) { }, }, { - ID: connectionID(render.IncomingInternetID, fixture.RandomClientIP), - NodeID: render.IncomingInternetID, - Label: fixture.RandomClientIP, - Linkable: true, + ID: connectionID(render.IncomingInternetID, fixture.RandomClientIP), + NodeID: render.IncomingInternetID, + Label: fixture.RandomClientIP, Metadata: []report.MetadataRow{ { ID: "port", diff --git a/render/detailed/summary.go b/render/detailed/summary.go index 16705e370..038217534 100644 --- a/render/detailed/summary.go +++ b/render/detailed/summary.go @@ -50,7 +50,6 @@ type BasicNodeSummary struct { Rank string `json:"rank"` Shape string `json:"shape,omitempty"` Stack bool `json:"stack,omitempty"` - Linkable bool `json:"linkable,omitempty"` // Whether this node can be linked-to Pseudo bool `json:"pseudo,omitempty"` } @@ -104,10 +103,9 @@ var primaryAPITopology = map[string]string{ // possible. This summary is sufficient for rendering links to the node. func MakeBasicNodeSummary(r report.Report, n report.Node) (BasicNodeSummary, bool) { summary := BasicNodeSummary{ // This is unlikely to look very good, but is a reasonable fallback - ID: n.ID, - Label: n.ID, - Shape: report.Triangle, - Linkable: true, + ID: n.ID, + Label: n.ID, + Shape: report.Triangle, } if t, ok := r.Topology(n.Topology); ok { summary.Shape = t.GetShape() @@ -240,7 +238,6 @@ func processNodeSummary(base BasicNodeSummary, n report.Node) BasicNodeSummary { base.LabelMinor = hostID base.Rank = hostID } - base.Linkable = render.IsConnected(n) return base } diff --git a/render/detailed/summary_test.go b/render/detailed/summary_test.go index 2044723ca..057f61ad0 100644 --- a/render/detailed/summary_test.go +++ b/render/detailed/summary_test.go @@ -130,7 +130,6 @@ func TestMakeNodeSummary(t *testing.T) { LabelMinor: fixture.ClientHostName, Rank: fixture.ClientContainerImageName, Shape: "hexagon", - Linkable: true, }, Metadata: []report.MetadataRow{ {ID: docker.ImageName, Label: "Image", Value: fixture.ClientContainerImageName, Priority: 1}, @@ -150,7 +149,6 @@ func TestMakeNodeSummary(t *testing.T) { LabelMinor: "1 container", Rank: fixture.ClientContainerImageName, Shape: "hexagon", - Linkable: true, Stack: true, }, Metadata: []report.MetadataRow{ @@ -170,7 +168,6 @@ func TestMakeNodeSummary(t *testing.T) { LabelMinor: "hostname.com", Rank: "hostname.com", Shape: "circle", - Linkable: true, }, Metadata: []report.MetadataRow{ {ID: host.HostName, Label: "Hostname", Value: fixture.ClientHostName, Priority: 11}, @@ -190,7 +187,6 @@ func TestMakeNodeSummary(t *testing.T) { Rank: "apache", Shape: "square", Stack: true, - Linkable: true, }, }, }, diff --git a/render/process.go b/render/process.go index 1fdd08b63..0ef12832f 100644 --- a/render/process.go +++ b/render/process.go @@ -27,9 +27,8 @@ var EndpointRenderer = SelectEndpoint // ProcessRenderer is a Renderer which produces a renderable process // graph by merging the endpoint graph and the process topology. It -// also colors connected nodes. Since the process topology views only -// show connected processes, we need this info to determine whether -// processes appearing in a details panel are linkable. +// also colors connected nodes, so we can apply a filter to show/hide +// unconnected nodes depending on user choice. var ProcessRenderer = Memoise(ColorConnected(endpoints2Processes{})) // processWithContainerNameRenderer is a Renderer which produces a process