@@ -5,9 +5,16 @@ import Col from 'react-bootstrap/Col';
5
5
import Breadcrumb from 'react-bootstrap/Breadcrumb' ;
6
6
import SideMenu from '../components/SideMenu.js' ;
7
7
import Loading from '../components/Loading.js' ;
8
- import SmartTable from '../components/SmartTable.js' ;
9
8
import { connect } from 'react-redux' ;
10
9
import { getSystemInfo } from '../actions' ;
10
+ import {
11
+ faServer ,
12
+ faCheckCircle
13
+ } from '@fortawesome/free-solid-svg-icons' ;
14
+ import {
15
+ faCircle
16
+ } from '@fortawesome/free-regular-svg-icons' ;
17
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' ;
11
18
12
19
class SystemView extends Component {
13
20
@@ -52,10 +59,107 @@ class SystemView extends Component {
52
59
return output . join ( ' ' ) ;
53
60
}
54
61
62
+ renderNode ( node ) {
63
+
64
+ let cardClass = 'card' ;
65
+ let headerClass = "card-header" ;
66
+ if ( node . nodeID . startsWith ( 'gateway' ) ) {
67
+ cardClass += " bg-dark" ;
68
+ headerClass += " text-white" ;
69
+ }
70
+ return < Col md = { 6 } key = { node . nodeID } >
71
+ < div className = { cardClass } >
72
+ < div className = { headerClass } >
73
+ < FontAwesomeIcon size = "lg" icon = { faServer } /> < strong > { node . nodeID } </ strong >
74
+ </ div >
75
+ < ul className = "list-group list-group-flush" >
76
+ < li className = "list-group-item d-flex justify-content-between align-items-center" >
77
+ Cluster
78
+ < span className = "badge badge-primary badge-pill" > { node . clusterName } </ span >
79
+ </ li >
80
+ < li className = "list-group-item d-flex justify-content-between align-items-center" >
81
+ Host
82
+ < span className = "badge badge-primary badge-pill" > { node . hostname } </ span >
83
+ </ li >
84
+ < li className = "list-group-item d-flex justify-content-between align-items-center" >
85
+ OS up time
86
+ < span className = "badge badge-primary badge-pill" > { this . formaUptime ( node . os . uptime ) } </ span >
87
+ </ li >
88
+ < li className = "list-group-item d-flex justify-content-between align-items-center" >
89
+ Application up time
90
+ < span className = "badge badge-primary badge-pill" > { this . formaUptime ( node . processUptime ) } </ span >
91
+ </ li >
92
+ < li className = "list-group-item d-flex justify-content-between align-items-center" >
93
+ Client
94
+ < span className = "badge badge-primary badge-pill" > { node . client } </ span >
95
+ </ li >
96
+ < li className = "list-group-item d-flex justify-content-between align-items-center" >
97
+ Running services
98
+ < span className = "badge badge-primary badge-pill" > { node . services . length } </ span >
99
+ </ li >
100
+ < li className = "list-group-item d-flex justify-content-between align-items-center" >
101
+ CPU (15min average)
102
+ < span className = "badge badge-primary badge-pill" > { node . cpu . load15 . toFixed ( 1 ) } %</ span >
103
+ </ li >
104
+ < li className = "list-group-item d-flex justify-content-between align-items-center" >
105
+ Memory
106
+ < span className = "badge badge-primary badge-pill" > { node . memory . percent . toFixed ( 1 ) } %</ span >
107
+ </ li >
108
+ < li className = "list-group-item d-flex justify-content-between align-items-center" >
109
+ Server time
110
+ < span className = "badge badge-primary badge-pill" > { node . time . utc } </ span >
111
+ </ li >
112
+ </ ul >
113
+ </ div >
114
+ </ Col > ;
115
+ }
116
+
117
+ renderServices ( nodes , allServices ) {
118
+ if ( ! allServices || ! nodes ) return ;
119
+ let data = [ ] ;
120
+ let header = nodes . map ( ( node ) => node . nodeID ) ;
121
+ for ( let serviceName of allServices ) {
122
+ data . push ( {
123
+ name : serviceName ,
124
+ status : nodes . map ( ( node ) => node . services . indexOf ( serviceName ) != - 1 )
125
+ } ) ;
126
+ }
127
+
128
+ function checkbox ( value ) {
129
+ if ( value ) {
130
+ return < FontAwesomeIcon size = "lg" icon = { faCheckCircle } /> ;
131
+ } else {
132
+ return < FontAwesomeIcon size = "lg" icon = { faCircle } /> ;
133
+ }
134
+ }
135
+
136
+ let grid = data . map ( ( row ) => (
137
+ < tr key = { row . name } >
138
+ < th scope = "row" > { row . name } </ th >
139
+ { row . status . map ( ( s , i ) => < td key = { i } className = "text-center" > { checkbox ( s ) } </ td > ) }
140
+ </ tr >
141
+ ) ) ;
142
+
143
+ return < Col md = { 12 } >
144
+ < table className = "table table-sm" >
145
+ < thead className = "thead-dark" >
146
+ < tr >
147
+ < th scope = "col" > Service</ th >
148
+ { header . map ( ( h , i ) => < th key = { i } scope = "col" className = "text-center" > { h } </ th > ) }
149
+ </ tr >
150
+ </ thead >
151
+ < tbody >
152
+ { grid }
153
+ </ tbody >
154
+ </ table >
155
+ </ Col > ;
156
+ }
157
+
55
158
render ( ) {
56
159
if ( this . props . isLoading ) {
57
160
return < Loading /> ;
58
161
}
162
+ let nodes = this . props . nodes ? this . props . nodes . map ( ( n ) => this . renderNode ( n ) ) : null ;
59
163
return (
60
164
< div >
61
165
< Container fluid >
@@ -68,48 +172,13 @@ class SystemView extends Component {
68
172
< Breadcrumb . Item > Dashboard</ Breadcrumb . Item >
69
173
< Breadcrumb . Item active > System</ Breadcrumb . Item >
70
174
</ Breadcrumb >
175
+ < h1 className = "display-5" > Nodes</ h1 >
176
+ < Row >
177
+ { nodes }
178
+ </ Row >
179
+ < h1 className = "display-5" > Services</ h1 >
71
180
< Row >
72
- < Col md = { 7 } >
73
- < ul className = "list-group" >
74
- < li className = "list-group-item d-flex justify-content-between align-items-center" >
75
- OS up time
76
- < span className = "badge badge-primary badge-pill" > { this . formaUptime ( this . props . osUptime ) } </ span >
77
- </ li >
78
- < li className = "list-group-item d-flex justify-content-between align-items-center" >
79
- Application up time
80
- < span className = "badge badge-primary badge-pill" > { this . formaUptime ( this . props . appUptime ) } </ span >
81
- </ li >
82
- < li className = "list-group-item d-flex justify-content-between align-items-center" >
83
- Client
84
- < span className = "badge badge-primary badge-pill" > { this . props . client } </ span >
85
- </ li >
86
- < li className = "list-group-item d-flex justify-content-between align-items-center" >
87
- Running services
88
- < span className = "badge badge-primary badge-pill" > { this . props . node . upServiceCount } /{ this . props . node . totalServiceCount } </ span >
89
- </ li >
90
- < li className = "list-group-item d-flex justify-content-between align-items-center" >
91
- CPU (15min average)
92
- < span className = "badge badge-primary badge-pill" > { this . props . cpu . toFixed ( 1 ) } %</ span >
93
- </ li >
94
- < li className = "list-group-item d-flex justify-content-between align-items-center" >
95
- Memory
96
- < span className = "badge badge-primary badge-pill" > { this . props . mem . toFixed ( 1 ) } %</ span >
97
- </ li >
98
- < li className = "list-group-item d-flex justify-content-between align-items-center" >
99
- Server time
100
- < span className = "badge badge-primary badge-pill" > { this . props . time } </ span >
101
- </ li >
102
- </ ul >
103
- </ Col >
104
- < Col md = { 5 } >
105
- < SmartTable
106
- columns = { [
107
- { name : 'Service Name' , field : 'name' } ,
108
- { name : 'Running' , field : 'up' , format : 'check' } ,
109
- ] }
110
- data = { { rows : this . props . node . services } }
111
- />
112
- </ Col >
181
+ { this . renderServices ( this . props . nodes , this . props . allServices ) }
113
182
</ Row >
114
183
</ Col >
115
184
</ Row >
@@ -122,14 +191,8 @@ class SystemView extends Component {
122
191
// eslint-disable-next-line no-unused-vars
123
192
const mapStateToProps = ( state ) => ( {
124
193
isLoading : state . loading . SYSTEM_INFO ,
125
- node : state . system . info . node ,
126
- cpu : state . system . info . health . cpu . load15 ,
127
- mem : state . system . info . health . mem . percent ,
128
- client : state . system . info . health . client . type + " " + state . system . info . health . client . langVersion ,
129
- os : state . system . info . health . os ,
130
- time : state . system . info . health . time . utc ,
131
- osUptime : state . system . info . health . os . uptime ,
132
- appUptime : state . system . info . health . process . uptime ,
194
+ nodes : state . system . info . nodes ,
195
+ allServices : state . system . info . allServices ,
133
196
} ) ;
134
197
135
198
const mapDispatchToProps = ( dispatch ) => ( {
0 commit comments