]> git.proxmox.com Git - pmg-gui.git/blob - js/ClusterAdministration.js
add missing clearbeforeload arguments for monStoreErrors
[pmg-gui.git] / js / ClusterAdministration.js
1 Ext.define('pmg-cluster', {
2 extend: 'Ext.data.Model',
3 fields: [
4 'type', 'name', 'ip', 'hostrsapubkey', 'rootrsapubkey',
5 'fingerprint', { type: 'integer', name: 'cid' },
6 { type: 'boolean', name: 'insync' },
7 'memory', 'loadavg', 'uptime', 'rootfs', 'conn_error', 'level',
8 { type: 'number', name: 'memory_per',
9 calculate: function(data) {
10 var mem = data.memory;
11 return Ext.isObject(mem) ? mem.used/mem.total : 0;
12 }
13 },
14 { type: 'number', name: 'rootfs_per',
15 calculate: function(data) {
16 var du = data.rootfs;
17 return Ext.isObject(du) ? du.used/du.total : 0;
18 }
19 }
20 ],
21 proxy: {
22 type: 'proxmox',
23 url: "/api2/json/config/cluster/status"
24 },
25 idProperty: 'cid'
26 });
27
28 Ext.define('PMG.ClusterJoinNodeWindow', {
29 extend: 'Proxmox.window.Edit',
30 xtype: 'pmgClusterJoinNodeWindow',
31
32 title: gettext('Cluster Join'),
33
34 width: 800,
35
36 method: 'POST',
37
38 url: '/config/cluster/join',
39
40 items: [
41 {
42 xtype: 'textfield',
43 fieldLabel: 'IP Address',
44 name: 'master_ip'
45 },
46 {
47 xtype: 'textfield',
48 inputType: 'password',
49 fieldLabel: gettext('Password'),
50 name: 'password'
51 },
52 {
53 xtype: 'textfield',
54 fieldLabel: gettext('Fingerprint'),
55 name: 'fingerprint'
56 }
57 ]
58 });
59
60 Ext.define('PMG.ClusterAddNodeWindow', {
61 extend: 'Ext.window.Window',
62 xtype: 'pmgClusterAddNodeWindow',
63 mixins: ['Proxmox.Mixin.CBind'],
64
65 width: 800,
66
67 modal: true,
68
69 title: gettext('Cluster Join') + ' : ' + gettext('Information'),
70
71 ipAddress: undefined,
72
73 fingerprint: undefined,
74
75 items: [
76 {
77 xtype: 'component',
78 border: false,
79 padding: 10,
80 html: gettext("Please use the 'Join' button on the node you want to add, using the following IP address and fingerprint.")
81 },
82 {
83 xtype: 'container',
84 layout: 'form',
85 border: false,
86 padding: '0 10 10 10',
87 items: [
88 {
89 xtype: 'textfield',
90 fieldLabel: gettext('IP Address'),
91 cbind: { value: '{ipAddress}' },
92 editable: false
93 },
94 {
95 xtype: 'textfield',
96 fieldLabel: gettext('Fingerprint'),
97 cbind: { value: '{fingerprint}' },
98 editable: false
99 }
100 ]
101 }
102 ]
103 });
104
105 Ext.define('PMG.ClusterAdministration', {
106 extend: 'Ext.tab.Panel',
107 xtype: 'pmgClusterAdministration',
108
109 title: gettext('Cluster Administration'),
110
111 border: false,
112 defaults: { border: false },
113
114 viewModel: {
115 parent: null,
116 data: {
117 nodecount: 0,
118 master: null
119 }
120 },
121
122 items: [
123 {
124 xtype: 'grid',
125 title: gettext('Nodes'),
126 controller: {
127 xclass: 'Ext.app.ViewController',
128
129 init: function(view) {
130 view.store.on('load', this.onLoad, this);
131 Proxmox.Utils.monStoreErrors(view, view.getStore());
132 },
133
134 onLoad: function(store, records) {
135 var vm = this.getViewModel();
136 vm.set('nodecount', records.length);
137
138 var master = null;
139 Ext.Array.each(records, function(ni) {
140 if (ni.data.type === 'master') {
141 master = ni;
142 }
143 });
144 vm.set('master', master);
145 },
146
147 onCreate: function() {
148 var view = this.getView();
149
150 Proxmox.Utils.API2Request({
151 url: '/config/cluster/create',
152 method: 'POST',
153 waitMsgTarget: view,
154 failure: function (response, opts) {
155 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
156 },
157 success: function(response, options) {
158 var upid = response.result.data;
159 var win = Ext.create('Proxmox.window.TaskProgress', { upid: upid });
160 win.show();
161 win.on('destroy', function() { view.store.load(); });
162 }
163 });
164 },
165
166 onJoin: function() {
167 var view = this.getView();
168 var win = Ext.create('PMG.ClusterJoinNodeWindow', {});
169 win.show();
170 win.on('destroy', function() {
171 // fixme: logout
172 });
173 },
174
175 onAdd: function() {
176 var vm = this.getViewModel();
177
178 var win = Ext.create('PMG.ClusterAddNodeWindow', {
179 ipAddress: vm.get('master').get('ip'),
180 fingerprint: vm.get('master').get('fingerprint')
181 });
182
183 win.show();
184 }
185 },
186 store: {
187 autoLoad: true,
188 model: 'pmg-cluster'
189 },
190 tbar: [
191 {
192 text: gettext('Create'),
193 reference: 'createButton',
194 handler: 'onCreate',
195 bind: {
196 disabled: '{nodecount}'
197 }
198 },
199 {
200 text: gettext('Add'),
201 reference: 'addButton',
202 handler: 'onAdd',
203 bind: {
204 disabled: '{!master}'
205 }
206 },
207 {
208 text: gettext('Join'),
209 reference: 'joinButton',
210 handler: 'onJoin',
211 bind: {
212 disabled: '{nodecount}'
213 }
214 }
215 ],
216 columns: [
217 {
218 header: gettext('Node'),
219 width: 150,
220 dataIndex: 'name'
221 },
222 {
223 header: gettext('Role'),
224 width: 100,
225 dataIndex: 'type'
226 },
227 {
228 header: gettext('ID'),
229 width: 80,
230 dataIndex: 'cid'
231 },
232 {
233
234 header: gettext('IP'),
235 width: 150,
236 dataIndex: 'ip'
237 },
238 {
239 header: gettext('State'),
240 width: 100,
241 renderer: function(value, metaData, record) {
242 var d = record.data;
243 var state = 'active';
244 if (!d.insync) state = 'syncing';
245 if (d.conn_error) {
246 metaData.tdCls = 'x-form-invalid-field';
247 var html = '<p>' + Ext.htmlEncode(d.conn_error) + '</p>';
248 html = html.replace(/\n/g, '<br>');
249 metaData.tdAttr = 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
250 html.replace(/\"/g,'&quot;') + '"';
251 state = 'error';
252 }
253 return state;
254 },
255 dataIndex: 'insync'
256 },
257 {
258 header: gettext('Subscription'),
259 width: 120,
260 renderer: Proxmox.Utils.format_subscription_level,
261 dataIndex: 'level'
262 },
263 {
264 header: gettext('Uptime'),
265 width: 150,
266 renderer: Proxmox.Utils.render_uptime,
267 dataIndex: 'uptime'
268 },
269 {
270 header: gettext('Load average'),
271 renderer: function(value) {
272 if (Ext.isArray(value)) {
273 return value[0];
274 }
275 return value;
276 },
277 dataIndex: 'loadavg'
278 },
279 {
280 xtype: 'widgetcolumn',
281 widget: {
282 xtype: 'progressbarwidget',
283 textTpl: '{value:percent}'
284 },
285 header: gettext('RAM usage'),
286 dataIndex: 'memory_per'
287 },
288 {
289 xtype: 'widgetcolumn',
290 widget: {
291 xtype: 'progressbarwidget',
292 textTpl: '{value:percent}'
293 },
294 header: gettext('HD space'),
295 dataIndex: 'rootfs_per'
296 }
297 ]
298 }
299 ]
300 });