diff --git a/client/app/scripts/components/node-details/node-details-info.js b/client/app/scripts/components/node-details/node-details-info.js index eab95092d..33cfea695 100644 --- a/client/app/scripts/components/node-details/node-details-info.js +++ b/client/app/scripts/components/node-details/node-details-info.js @@ -1,10 +1,30 @@ import React from 'react'; export default class NodeDetailsInfo extends React.Component { + + constructor(props, context) { + super(props, context); + this.state = { + expanded: false + }; + this.handleClickMore = this.handleClickMore.bind(this); + } + + handleClickMore(ev) { + ev.preventDefault(); + const expanded = !this.state.expanded; + this.setState({expanded}); + } + render() { + const rows = (this.props.rows || []); + const prime = rows.filter(row => row.prime); + const overflow = rows.filter(row => !row.prime); + const showOverflow = overflow.length > 0 && !this.state.expanded; + const showLess = this.state.expanded; return (
- {this.props.rows && this.props.rows.map(field => { + {prime && prime.map(field => { return (
@@ -18,6 +38,22 @@ export default class NodeDetailsInfo extends React.Component {
); })} + {this.state.expanded && overflow && overflow.map(field => { + return ( +
+
+ {field.label} +
+
+
+ {field.value} +
+
+
+ ); + })} + {showOverflow &&
Show more
} + {showLess &&
Show less
}
); } diff --git a/render/detailed/metadata.go b/render/detailed/metadata.go index 4643fb630..e2ad2602a 100644 --- a/render/detailed/metadata.go +++ b/render/detailed/metadata.go @@ -16,27 +16,27 @@ import ( var ( processNodeMetadata = []MetadataRowTemplate{ - Latest{ID: process.PID}, + Latest{ID: process.PID, Prime: true}, + Latest{ID: process.Cmdline, Prime: true}, Latest{ID: process.PPID}, - Latest{ID: process.Cmdline}, Latest{ID: process.Threads}, } containerNodeMetadata = []MetadataRowTemplate{ - Latest{ID: docker.ContainerID, Truncate: 12}, + Latest{ID: docker.ContainerID, Truncate: 12, Prime: true}, + Latest{ID: docker.ContainerState, Prime: true}, + Latest{ID: docker.ContainerCommand, Prime: true}, Latest{ID: docker.ImageID, Truncate: 12}, - Latest{ID: docker.ContainerState}, Latest{ID: docker.ContainerUptime}, Latest{ID: docker.ContainerRestartCount}, Set{ID: docker.ContainerIPs}, Set{ID: docker.ContainerPorts}, Latest{ID: docker.ContainerCreated}, - Latest{ID: docker.ContainerCommand}, Latest{ID: overlay.WeaveMACAddress}, Latest{ID: overlay.WeaveDNSHostname}, } containerImageNodeMetadata = []MetadataRowTemplate{ - Latest{ID: docker.ImageID, Truncate: 12}, - Counter{ID: render.ContainersKey}, + Latest{ID: docker.ImageID, Truncate: 12, Prime: true}, + Counter{ID: render.ContainersKey, Prime: true}, } podNodeMetadata = []MetadataRowTemplate{ Latest{ID: kubernetes.PodID}, @@ -44,10 +44,10 @@ var ( Latest{ID: kubernetes.PodCreated}, } hostNodeMetadata = []MetadataRowTemplate{ + Latest{ID: host.KernelVersion, Prime: true}, + Latest{ID: host.Uptime, Prime: true}, Latest{ID: host.HostName}, Latest{ID: host.OS}, - Latest{ID: host.KernelVersion}, - Latest{ID: host.Uptime}, Set{ID: host.LocalNetworks}, } ) @@ -60,7 +60,8 @@ type MetadataRowTemplate interface { // Latest extracts some metadata rows from a node's Latest type Latest struct { ID string - Truncate int + Truncate int // If > 0, truncate the value to this length. + Prime bool // Whether the row should be shown by default } // MetadataRows implements MetadataRowTemplate @@ -69,7 +70,7 @@ func (l Latest) MetadataRows(n report.Node) []MetadataRow { if l.Truncate > 0 && len(val) > l.Truncate { val = val[:l.Truncate] } - return []MetadataRow{{ID: l.ID, Value: val}} + return []MetadataRow{{ID: l.ID, Value: val, Prime: l.Prime}} } return nil } @@ -89,13 +90,14 @@ func (s Set) MetadataRows(n report.Node) []MetadataRow { // Counter extracts some metadata rows from a node's Counters type Counter struct { - ID string + ID string + Prime bool } // MetadataRows implements MetadataRowTemplate func (c Counter) MetadataRows(n report.Node) []MetadataRow { if val, ok := n.Counters.Lookup(c.ID); ok { - return []MetadataRow{{ID: c.ID, Value: strconv.Itoa(val)}} + return []MetadataRow{{ID: c.ID, Value: strconv.Itoa(val), Prime: c.Prime}} } return nil } @@ -104,6 +106,7 @@ func (c Counter) MetadataRows(n report.Node) []MetadataRow { type MetadataRow struct { ID string Value string + Prime bool } // Copy returns a value copy of a metadata row. @@ -121,10 +124,12 @@ func (m MetadataRow) MarshalJSON() ([]byte, error) { ID string `json:"id"` Label string `json:"label"` Value string `json:"value"` + Prime bool `json:"prime,omitempty"` }{ ID: m.ID, Label: Label(m.ID), Value: m.Value, + Prime: m.Prime, }) } diff --git a/render/detailed/metadata_test.go b/render/detailed/metadata_test.go index 2e55999fc..47feeba53 100644 --- a/render/detailed/metadata_test.go +++ b/render/detailed/metadata_test.go @@ -27,8 +27,8 @@ func TestNodeMetadata(t *testing.T) { Add(docker.ContainerIPs, report.MakeStringSet("10.10.10.0/24", "10.10.10.1/24")), ), want: []detailed.MetadataRow{ - {ID: docker.ContainerID, Value: fixture.ClientContainerID}, - {ID: docker.ContainerState, Value: "running"}, + {ID: docker.ContainerID, Value: fixture.ClientContainerID, Prime: true}, + {ID: docker.ContainerState, Value: "running", Prime: true}, {ID: docker.ContainerIPs, Value: "10.10.10.0/24, 10.10.10.1/24"}, }, }, diff --git a/render/detailed/node_test.go b/render/detailed/node_test.go index 200265143..5a4c935e6 100644 --- a/render/detailed/node_test.go +++ b/render/detailed/node_test.go @@ -120,9 +120,9 @@ func TestMakeDetailedContainerNode(t *testing.T) { Label: "server", Linkable: true, Metadata: []detailed.MetadataRow{ - {ID: "docker_container_id", Value: fixture.ServerContainerID}, + {ID: "docker_container_id", Value: fixture.ServerContainerID, Prime: true}, + {ID: "docker_container_state", Value: "running", Prime: true}, {ID: "docker_image_id", Value: fixture.ServerContainerImageID}, - {ID: "docker_container_state", Value: "running"}, }, DockerLabels: []detailed.MetadataRow{ {ID: "label_" + render.AmazonECSContainerNameLabel, Value: `server`}, @@ -159,7 +159,7 @@ func TestMakeDetailedContainerNode(t *testing.T) { Label: "apache", Linkable: true, Metadata: []detailed.MetadataRow{ - {ID: process.PID, Value: fixture.ServerPID}, + {ID: process.PID, Value: fixture.ServerPID, Prime: true}, }, Metrics: []detailed.MetricRow{}, },