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