extend: 'Ext.panel.Panel',
alias: 'widget.pveDcHealth',
- title: gettext('Datacenter Health'),
+ title: gettext('Health'),
- bodyPadding: '0 20 0 20',
- height: 200,
- layout: 'column',
+ bodyPadding: 10,
+ height: 250,
+ layout: {
+ type: 'hbox',
+ align: 'stretch',
+ },
defaults: {
- columnWidth: 0.5,
+ flex: 1,
xtype: 'box',
style: {
- 'text-align':'center'
- }
+ 'text-align': 'center',
+ },
},
- cepherrors: 0,
+ nodeList: [],
+ nodeIndex: 0,
updateStatus: function(store, records, success) {
- var me = this;
+ let me = this;
if (!success) {
return;
}
- var cluster = {
+ let cluster = {
iconCls: PVE.Utils.get_health_icon('good', true),
- text: gettext("Standalone node - no cluster defined")
+ text: gettext("Standalone node - no cluster defined"),
};
-
- var nodes = {
+ let nodes = {
online: 0,
- offline: 0
+ offline: 0,
};
-
- // by default we have one node
- var numNodes = 1;
- var i;
-
- for (i = 0; i < records.length; i++) {
- var item = records[i];
- if (item.data.type === 'node') {
- nodes[item.data.online === 1 ? 'online':'offline']++;
- } else if(item.data.type === 'cluster') {
- cluster.text = gettext("Cluster") + ": ";
- cluster.text += item.data.name + ", ";
- cluster.text += gettext("Quorate") + ": ";
- cluster.text += PVE.Utils.format_boolean(item.data.quorate);
- if (item.data.quorate != 1) {
+ let numNodes = 1; // by default we have one node
+ for (const { data } of records) {
+ if (data.type === 'node') {
+ nodes[data.online === 1 ? 'online':'offline']++;
+ } else if (data.type === 'cluster') {
+ cluster.text = `${gettext("Cluster")}: ${data.name}, ${gettext("Quorate")}: `;
+ cluster.text += Proxmox.Utils.format_boolean(data.quorate);
+ if (data.quorate !== 1) {
cluster.iconCls = PVE.Utils.get_health_icon('critical', true);
}
-
- numNodes = item.data.nodes;
+ numNodes = data.nodes;
}
}
- if (numNodes !== (nodes.online + nodes.offline)) {
+ if (numNodes !== nodes.online + nodes.offline) {
nodes.offline = numNodes - nodes.online;
}
},
updateCeph: function(store, records, success) {
- var me = this;
- var cephstatus = me.getComponent('ceph');
+ let me = this;
+ let cephstatus = me.getComponent('ceph');
if (!success || records.length < 1) {
- me.cepherrors++;
- cephstatus.setVisible(false);
-
- // after 3 unsuccessful tries of
- // /nodes/localhost/ceph/status
- // we give up (there probably is no ceph installed)
- if (me.cepherrors >= 3) {
+ if (cephstatus.isVisible()) {
+ return; // if ceph status is already visible don't stop to update
+ }
+ // try all nodes until we either get a successful api call, or we tried all nodes
+ if (++me.nodeIndex >= me.nodeList.length) {
me.cephstore.stopUpdate();
+ } else {
+ store.getProxy().setUrl(`/api2/json/nodes/${me.nodeList[me.nodeIndex].node}/ceph/status`);
}
return;
}
- me.cepherrors = 0;
-
- var state = PVE.Utils.render_ceph_health(records[0]);
+ let state = PVE.Utils.render_ceph_health(records[0].data.health || {});
cephstatus.updateHealth(state);
cephstatus.setVisible(true);
},
listeners: {
destroy: function() {
- var me = this;
+ let me = this;
me.cephstore.stopUpdate();
- }
+ },
},
items: [
{
itemId: 'clusterstatus',
xtype: 'pveHealthWidget',
- title: gettext('Status')
+ title: gettext('Status'),
},
{
itemId: 'nodestatus',
data: {
online: 0,
- offline: 0
+ offline: 0,
},
tpl: [
'<h3>' + gettext('Nodes') + '</h3><br />',
gettext('Offline'),
'</div>',
'<div class="right-aligned">{offline}</div>',
- '</div>'
- ]
+ '</div>',
+ ],
},
{
itemId: 'ceph',
width: 250,
columnWidth: undefined,
userCls: 'pointer',
- title: gettext('Ceph'),
+ title: 'Ceph',
xtype: 'pveHealthWidget',
hidden: true,
listeners: {
element: 'el',
click: function() {
- var me = this;
- var sp = Ext.state.Manager.getProvider();
-
- // preselect the ceph tab
- sp.set('nodetab', {value:'ceph'});
-
- // select the first node which is online
- var nodeid = '';
- var nodes = PVE.data.ResourceStore.getNodes();
- Ext.Array.some(nodes, function(node) {
- if (node.running) {
- nodeid = node.id;
- return true;
- }
-
- return false;
- });
- Ext.ComponentQuery.query('pveResourceTree')[0].selectById(nodeid);
- }
- }
- }
+ Ext.state.Manager.getProvider().set('dctab', { value: 'ceph' }, true);
+ },
+ },
+ },
],
initComponent: function() {
- var me = this;
+ let me = this;
- me.cephstore = Ext.create('PVE.data.UpdateStore', {
+ me.nodeList = PVE.data.ResourceStore.getNodes();
+ me.nodeIndex = 0;
+ me.cephstore = Ext.create('Proxmox.data.UpdateStore', {
interval: 3000,
storeid: 'pve-cluster-ceph',
proxy: {
- type: 'pve',
- url: '/api2/json/nodes/localhost/ceph/status'
- }
+ type: 'proxmox',
+ url: `/api2/json/nodes/${me.nodeList[me.nodeIndex].node}/ceph/status`,
+ },
});
me.callParent();
- me.cephstore.startUpdate();
me.mon(me.cephstore, 'load', me.updateCeph, me);
- }
+ me.cephstore.startUpdate();
+ },
});