]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/dc/Health.js
18ea5afa0c4ae48059c34ea456b31e44942c2259
[pve-manager.git] / www / manager6 / dc / Health.js
1 Ext.define('PVE.dc.Health', {
2 extend: 'Ext.panel.Panel',
3 alias: 'widget.pveDcHealth',
4
5 title: gettext('Health'),
6
7 bodyPadding: 10,
8 height: 220,
9 layout: {
10 type: 'hbox',
11 align: 'stretch'
12 },
13
14 defaults: {
15 flex: 1,
16 xtype: 'box',
17 style: {
18 'text-align':'center'
19 }
20 },
21
22 nodeList: [],
23 nodeIndex: 0,
24
25 updateStatus: function(store, records, success) {
26 var me = this;
27 if (!success) {
28 return;
29 }
30
31 var cluster = {
32 iconCls: PVE.Utils.get_health_icon('good', true),
33 text: gettext("Standalone node - no cluster defined")
34 };
35
36 var nodes = {
37 online: 0,
38 offline: 0
39 };
40
41 // by default we have one node
42 var numNodes = 1;
43 var i;
44
45 for (i = 0; i < records.length; i++) {
46 var item = records[i];
47 if (item.data.type === 'node') {
48 nodes[item.data.online === 1 ? 'online':'offline']++;
49 } else if(item.data.type === 'cluster') {
50 cluster.text = gettext("Cluster") + ": ";
51 cluster.text += item.data.name + ", ";
52 cluster.text += gettext("Quorate") + ": ";
53 cluster.text += Proxmox.Utils.format_boolean(item.data.quorate);
54 if (item.data.quorate != 1) {
55 cluster.iconCls = PVE.Utils.get_health_icon('critical', true);
56 }
57
58 numNodes = item.data.nodes;
59 }
60 }
61
62 if (numNodes !== (nodes.online + nodes.offline)) {
63 nodes.offline = numNodes - nodes.online;
64 }
65
66 me.getComponent('clusterstatus').updateHealth(cluster);
67 me.getComponent('nodestatus').update(nodes);
68 },
69
70 updateCeph: function(store, records, success) {
71 var me = this;
72 var cephstatus = me.getComponent('ceph');
73 if (!success || records.length < 1) {
74
75 // if ceph status is already visible
76 // dont stop to update
77 if (cephstatus.isVisible()) {
78 return;
79 }
80
81 // try all nodes until we either get a successfull api call,
82 // or we tried all nodes
83 if (++me.nodeIndex >= me.nodeList.length) {
84 me.cephstore.stopUpdate();
85 } else {
86 store.getProxy().setUrl('/api2/json/nodes/' + me.nodeList[me.nodeIndex].node + '/ceph/status');
87 }
88
89 return;
90 }
91
92 var state = PVE.Utils.render_ceph_health(records[0].data.health || {});
93 cephstatus.updateHealth(state);
94 cephstatus.setVisible(true);
95 },
96
97 listeners: {
98 destroy: function() {
99 var me = this;
100 me.cephstore.stopUpdate();
101 }
102 },
103
104 items: [
105 {
106 itemId: 'clusterstatus',
107 xtype: 'pveHealthWidget',
108 title: gettext('Status')
109 },
110 {
111 itemId: 'nodestatus',
112 data: {
113 online: 0,
114 offline: 0
115 },
116 tpl: [
117 '<h3>' + gettext('Nodes') + '</h3><br />',
118 '<div style="width: 150px;margin: auto;font-size: 12pt">',
119 '<div class="left-aligned">',
120 '<i class="good fa fa-fw fa-check">&nbsp;</i>',
121 gettext('Online'),
122 '</div>',
123 '<div class="right-aligned">{online}</div>',
124 '<br /><br />',
125 '<div class="left-aligned">',
126 '<i class="critical fa fa-fw fa-times">&nbsp;</i>',
127 gettext('Offline'),
128 '</div>',
129 '<div class="right-aligned">{offline}</div>',
130 '</div>'
131 ]
132 },
133 {
134 itemId: 'ceph',
135 width: 250,
136 columnWidth: undefined,
137 userCls: 'pointer',
138 title: 'Ceph',
139 xtype: 'pveHealthWidget',
140 hidden: true,
141 listeners: {
142 element: 'el',
143 click: function() {
144 var sp = Ext.state.Manager.getProvider();
145 sp.set('dctab', {value:'ceph'}, true);
146 }
147 }
148 }
149 ],
150
151 initComponent: function() {
152 var me = this;
153
154 me.nodeList = PVE.data.ResourceStore.getNodes();
155 me.nodeIndex = 0;
156 me.cephstore = Ext.create('Proxmox.data.UpdateStore', {
157 interval: 3000,
158 storeid: 'pve-cluster-ceph',
159 proxy: {
160 type: 'proxmox',
161 url: '/api2/json/nodes/' + me.nodeList[me.nodeIndex].node + '/ceph/status'
162 }
163 });
164 me.callParent();
165 me.mon(me.cephstore, 'load', me.updateCeph, me);
166 me.cephstore.startUpdate();
167 }
168 });