mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 10:11:03 +00:00
Merge pull request #3009 from weaveworks/991-show-unconnected-processes
show unconnected processes Fixes #991.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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 (
|
||||
<span
|
||||
className="node-details-table-node-link"
|
||||
title={title}
|
||||
ref={this.saveNodeRef}
|
||||
onClick={this.handleClick}
|
||||
{...dismissRowClickProps}
|
||||
>
|
||||
{label}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<span className="node-details-table-node" title={title}>
|
||||
<span
|
||||
className="node-details-table-node-link"
|
||||
title={title}
|
||||
ref={this.saveNodeRef}
|
||||
onClick={this.handleClick}
|
||||
{...dismissRowClickProps}
|
||||
>
|
||||
{label}
|
||||
</span>
|
||||
);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user