diff options
author | Corey Hulen <corey@hulen.com> | 2016-08-04 09:25:37 -0800 |
---|---|---|
committer | Harrison Healey <harrisonmhealey@gmail.com> | 2016-08-04 13:25:37 -0400 |
commit | 59d971dc751b0414c5b38c9df4b552e45f5641be (patch) | |
tree | d8c39aa5d1fa67d41d89bdd37f699a8e7ca7af36 /webapp/components/admin_console/cluster_table.jsx | |
parent | ac90f5b38962c301318fff9118c4556537002941 (diff) | |
download | chat-59d971dc751b0414c5b38c9df4b552e45f5641be.tar.gz chat-59d971dc751b0414c5b38c9df4b552e45f5641be.tar.bz2 chat-59d971dc751b0414c5b38c9df4b552e45f5641be.zip |
PLT-2899 adding clustering of app servers (#3682)
* PLT-2899 adding clustering of app servers
* PLT-2899 base framework
* PLT-2899 HA backend
* PLT-2899 Fixing config file
* PLT-2899 adding config syncing
* PLT-2899 set System console to readonly when clustering enabled.
* PLT-2899 Fixing publish API
* PLT-2899 fixing strings
Diffstat (limited to 'webapp/components/admin_console/cluster_table.jsx')
-rw-r--r-- | webapp/components/admin_console/cluster_table.jsx | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/webapp/components/admin_console/cluster_table.jsx b/webapp/components/admin_console/cluster_table.jsx new file mode 100644 index 000000000..c8a98fd76 --- /dev/null +++ b/webapp/components/admin_console/cluster_table.jsx @@ -0,0 +1,179 @@ +// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; + +import {FormattedMessage} from 'react-intl'; +import * as Utils from 'utils/utils.jsx'; + +import statusGreen from 'images/status_green.png'; +import statusRed from 'images/status_red.png'; + +export default class ClusterTable extends React.Component { + static propTypes = { + clusterInfos: React.PropTypes.array.isRequired, + reload: React.PropTypes.func.isRequired + } + + render() { + var versionMismatch = ( + <img + className='cluster-status' + src={statusGreen} + /> + ); + + var configMismatch = ( + <img + className='cluster-status' + src={statusGreen} + /> + ); + + var version = ''; + var configHash = ''; + + if (this.props.clusterInfos.length) { + version = this.props.clusterInfos[0].version; + configHash = this.props.clusterInfos[0].config_hash; + } + + this.props.clusterInfos.map((clusterInfo) => { + if (clusterInfo.version !== version) { + versionMismatch = ( + <img + className='cluster-status' + src={statusRed} + /> + ); + } + + if (clusterInfo.config_hash !== configHash) { + configMismatch = ( + <img + className='cluster-status' + src={statusRed} + /> + ); + } + + return null; + }); + + var items = this.props.clusterInfos.map((clusterInfo) => { + var status = null; + + if (clusterInfo.hostname === '') { + clusterInfo.hostname = Utils.localizeMessage('admin.cluster.unknown', 'unknown'); + } + + if (clusterInfo.version === '') { + clusterInfo.version = Utils.localizeMessage('admin.cluster.unknown', 'unknown'); + } + + if (clusterInfo.config_hash === '') { + clusterInfo.config_hash = Utils.localizeMessage('admin.cluster.unknown', 'unknown'); + } + + if (clusterInfo.id === '') { + clusterInfo.id = Utils.localizeMessage('admin.cluster.unknown', 'unknown'); + } + + if (clusterInfo.is_alive) { + status = ( + <img + className='cluster-status' + src={statusGreen} + /> + ); + } else { + status = ( + <img + className='cluster-status' + src={statusRed} + /> + ); + } + + return ( + <tr key={clusterInfo.id}> + <td style={{whiteSpace: 'nowrap'}}>{status}</td> + <td style={{whiteSpace: 'nowrap'}}>{clusterInfo.hostname}</td> + <td style={{whiteSpace: 'nowrap'}}>{versionMismatch} {clusterInfo.version}</td> + <td style={{whiteSpace: 'nowrap'}}><div className='config-hash'>{configMismatch} {clusterInfo.config_hash}</div></td> + <td style={{whiteSpace: 'nowrap'}}>{clusterInfo.internode_url}</td> + <td style={{whiteSpace: 'nowrap'}}><div className='config-hash'>{clusterInfo.id}</div></td> + </tr> + ); + }); + + return ( + <div + className='cluster-panel__table' + style={{ + margin: '10px', + marginBottom: '30px' + }} + > + <div className='text-right'> + <button + type='submit' + className='btn btn-link' + onClick={this.props.reload} + > + <i className='fa fa-refresh'></i> + <FormattedMessage + id='admin.cluster.status_table.reload' + defaultMessage=' Reload Cluster Status' + /> + </button> + </div> + <table className='table'> + <thead> + <tr> + <th> + <FormattedMessage + id='admin.cluster.status_table.status' + defaultMessage='Status' + /> + </th> + <th> + <FormattedMessage + id='admin.cluster.status_table.hostname' + defaultMessage='Hostname' + /> + </th> + <th> + <FormattedMessage + id='admin.cluster.status_table.version' + defaultMessage='Version' + /> + </th> + <th> + <FormattedMessage + id='admin.cluster.status_table.config_hash' + defaultMessage='Config File MD5' + /> + </th> + <th> + <FormattedMessage + id='admin.cluster.status_table.url' + defaultMessage='Inter-Node URL' + /> + </th> + <th> + <FormattedMessage + id='admin.cluster.status_table.id' + defaultMessage='Node ID' + /> + </th> + </tr> + </thead> + <tbody> + {items} + </tbody> + </table> + </div> + ); + } +}
\ No newline at end of file |