Merge pull request #3009 from weaveworks/991-show-unconnected-processes

show unconnected processes

Fixes #991.
This commit is contained in:
Matthias Radestock
2018-01-02 17:26:46 +00:00
committed by GitHub
7 changed files with 24 additions and 68 deletions

View File

@@ -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)

View File

@@ -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>
);

View File

@@ -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

View File

@@ -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",

View File

@@ -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
}

View File

@@ -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,
},
},
},

View File

@@ -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