]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/dc/Health.js
use Proxmox.Utils instead of PVE.Utils
[pve-manager.git] / www / manager6 / dc / Health.js
CommitLineData
0b659b8e
DC
1Ext.define('PVE.dc.Health', {
2 extend: 'Ext.panel.Panel',
3 alias: 'widget.pveDcHealth',
4
8f8ec25d 5 title: gettext('Health'),
0b659b8e
DC
6
7 bodyPadding: '0 20 0 20',
8 height: 200,
701acf20
DC
9 layout: {
10 type: 'hbox',
11 align: 'stretch'
12 },
0b659b8e
DC
13
14 defaults: {
701acf20 15 flex: 1,
0b659b8e
DC
16 xtype: 'box',
17 style: {
18 'text-align':'center'
19 }
20 },
21
22 cepherrors: 0,
23
24 updateStatus: function(store, records, success) {
25 var me = this;
26 if (!success) {
27 return;
28 }
29
30 var cluster = {
428bc4a2 31 iconCls: PVE.Utils.get_health_icon('good', true),
0b659b8e
DC
32 text: gettext("Standalone node - no cluster defined")
33 };
34
35 var nodes = {
36 online: 0,
37 offline: 0
38 };
39
40 // by default we have one node
41 var numNodes = 1;
42 var i;
43
44 for (i = 0; i < records.length; i++) {
45 var item = records[i];
46 if (item.data.type === 'node') {
47 nodes[item.data.online === 1 ? 'online':'offline']++;
48 } else if(item.data.type === 'cluster') {
49 cluster.text = gettext("Cluster") + ": ";
50 cluster.text += item.data.name + ", ";
51 cluster.text += gettext("Quorate") + ": ";
e7ade592 52 cluster.text += Proxmox.Utils.format_boolean(item.data.quorate);
0b659b8e 53 if (item.data.quorate != 1) {
428bc4a2 54 cluster.iconCls = PVE.Utils.get_health_icon('critical', true);
0b659b8e
DC
55 }
56
57 numNodes = item.data.nodes;
58 }
59 }
60
61 if (numNodes !== (nodes.online + nodes.offline)) {
62 nodes.offline = numNodes - nodes.online;
63 }
64
046e640c 65 me.getComponent('clusterstatus').updateHealth(cluster);
0b659b8e
DC
66 me.getComponent('nodestatus').update(nodes);
67 },
68
69 updateCeph: function(store, records, success) {
70 var me = this;
71 var cephstatus = me.getComponent('ceph');
72 if (!success || records.length < 1) {
d43f7042
DC
73
74 // if ceph status is already visible
75 // dont stop to update
76 if (cephstatus.isVisible()) {
77 return;
78 }
0b659b8e 79 me.cepherrors++;
0b659b8e
DC
80
81 // after 3 unsuccessful tries of
82 // /nodes/localhost/ceph/status
83 // we give up (there probably is no ceph installed)
84 if (me.cepherrors >= 3) {
85 me.cephstore.stopUpdate();
86 }
87 return;
88 }
89
90 me.cepherrors = 0;
91
dfe6d184 92 var state = PVE.Utils.render_ceph_health(records[0].data.health || {});
046e640c 93 cephstatus.updateHealth(state);
0b659b8e
DC
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',
046e640c
DC
107 xtype: 'pveHealthWidget',
108 title: gettext('Status')
0b659b8e
DC
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,
c359b437 137 userCls: 'pointer',
2ce6111f 138 title: 'Ceph',
046e640c 139 xtype: 'pveHealthWidget',
c359b437
DC
140 hidden: true,
141 listeners: {
142 element: 'el',
143 click: function() {
144 var me = this;
145 var sp = Ext.state.Manager.getProvider();
146
147 // preselect the ceph tab
148 sp.set('nodetab', {value:'ceph'});
149
150 // select the first node which is online
151 var nodeid = '';
152 var nodes = PVE.data.ResourceStore.getNodes();
153 Ext.Array.some(nodes, function(node) {
154 if (node.running) {
155 nodeid = node.id;
156 return true;
157 }
158
159 return false;
160 });
161 Ext.ComponentQuery.query('pveResourceTree')[0].selectById(nodeid);
162 }
163 }
0b659b8e
DC
164 }
165 ],
166
167 initComponent: function() {
168 var me = this;
169
0c7c0d6b 170 me.cephstore = Ext.create('Proxmox.data.UpdateStore', {
0b659b8e
DC
171 interval: 3000,
172 storeid: 'pve-cluster-ceph',
173 proxy: {
174 type: 'pve',
175 url: '/api2/json/nodes/localhost/ceph/status'
176 }
177 });
178 me.callParent();
179 me.cephstore.startUpdate();
180 me.mon(me.cephstore, 'load', me.updateCeph, me);
181 }
182});