]> git.proxmox.com Git - pmg-gui.git/blame - js/ClusterAdministration.js
ClusterAdministration.js - display subscription status for all members
[pmg-gui.git] / js / ClusterAdministration.js
CommitLineData
462f0688
DM
1Ext.define('pmg-cluster', {
2 extend: 'Ext.data.Model',
3 fields: [
4 'type', 'name', 'ip', 'hostrsapubkey', 'rootrsapubkey',
96a898b1
DM
5 'fingerprint', { type: 'integer', name: 'cid' },
6 { type: 'boolean', name: 'insync' },
24e6dc95 7 'memory', 'loadavg', 'uptime', 'rootfs', 'conn_error', 'level',
a6f800c4
DM
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 }
462f0688
DM
20 ],
21 proxy: {
22 type: 'proxmox',
b4d28dad 23 url: "/api2/json/config/cluster/status"
462f0688
DM
24 },
25 idProperty: 'cid'
26});
27
c6a1bc6b
DM
28Ext.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
ee138d2d
DM
60Ext.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
c6a1bc6b 69 title: gettext('Cluster Join') + ' : ' + gettext('Information'),
ee138d2d
DM
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
462f0688
DM
105Ext.define('PMG.ClusterAdministration', {
106 extend: 'Ext.tab.Panel',
c77675e9 107 xtype: 'pmgClusterAdministration',
462f0688
DM
108
109 title: gettext('Cluster Administration'),
110
111 border: false,
112 defaults: { border: false },
113
c745a875
DM
114 viewModel: {
115 parent: null,
116 data: {
117 nodecount: 0,
c6a1bc6b 118 master: null
c745a875
DM
119 }
120 },
121
122 items: [
462f0688
DM
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 },
132
133 onLoad: function(store, records) {
c745a875
DM
134 var vm = this.getViewModel();
135 vm.set('nodecount', records.length);
462f0688 136
c6a1bc6b 137 var master = null;
462f0688 138 Ext.Array.each(records, function(ni) {
462f0688 139 if (ni.data.type === 'master') {
c745a875 140 master = ni;
462f0688
DM
141 }
142 });
c745a875
DM
143 vm.set('master', master);
144 },
462f0688 145
c6a1bc6b
DM
146 onCreate: function() {
147 var view = this.getView();
148
149 Proxmox.Utils.API2Request({
150 url: '/config/cluster/create',
151 method: 'POST',
152 waitMsgTarget: view,
153 failure: function (response, opts) {
154 Ext.Msg.alert(gettext('Error'), response.htmlStatus);
155 },
156 success: function(response, options) {
157 var upid = response.result.data;
158 var win = Ext.create('Proxmox.window.TaskProgress', { upid: upid });
159 win.show();
160 win.on('destroy', function() { view.store.load(); });
161 }
162 });
163 },
164
165 onJoin: function() {
166 var view = this.getView();
167 var win = Ext.create('PMG.ClusterJoinNodeWindow', {});
168 win.show();
169 win.on('destroy', function() {
170 // fixme: logout
171 });
172 },
173
c745a875
DM
174 onAdd: function() {
175 var vm = this.getViewModel();
ee138d2d
DM
176
177 var win = Ext.create('PMG.ClusterAddNodeWindow', {
178 ipAddress: vm.get('master').get('ip'),
179 fingerprint: vm.get('master').get('fingerprint')
c745a875 180 });
ee138d2d 181
c745a875
DM
182 win.show();
183 }
462f0688
DM
184 },
185 store: {
186 autoLoad: true,
187 model: 'pmg-cluster'
188 },
189 tbar: [
190 {
c745a875 191 text: gettext('Create'),
462f0688 192 reference: 'createButton',
c6a1bc6b 193 handler: 'onCreate',
c745a875
DM
194 bind: {
195 disabled: '{nodecount}'
196 }
197 },
198 {
199 text: gettext('Add'),
200 reference: 'addButton',
201 handler: 'onAdd',
202 bind: {
203 disabled: '{!master}'
204 }
205 },
206 {
207 text: gettext('Join'),
208 reference: 'joinButton',
c6a1bc6b 209 handler: 'onJoin',
c745a875
DM
210 bind: {
211 disabled: '{nodecount}'
212 }
462f0688
DM
213 }
214 ],
215 columns: [
216 {
217 header: gettext('Node'),
218 width: 150,
219 dataIndex: 'name'
220 },
221 {
222 header: gettext('Role'),
223 width: 100,
224 dataIndex: 'type'
225 },
226 {
227 header: gettext('ID'),
228 width: 80,
229 dataIndex: 'cid'
230 },
231 {
232
233 header: gettext('IP'),
234 width: 150,
235 dataIndex: 'ip'
236 },
96a898b1
DM
237 {
238 header: gettext('State'),
ef7b87d8 239 width: 100,
96a898b1
DM
240 renderer: function(value, metaData, record) {
241 var d = record.data;
242 var state = 'active';
243 if (!d.insync) state = 'syncing';
244 if (d.conn_error) {
245 metaData.tdCls = 'x-form-invalid-field';
246 var html = '<p>' + Ext.htmlEncode(d.conn_error) + '</p>';
247 html = html.replace(/\n/g, '<br>');
248 metaData.tdAttr = 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
249 html.replace(/\"/g,'&quot;') + '"';
250 state = 'error';
251 }
252 return state;
253 },
254 dataIndex: 'insync'
255 },
24e6dc95
DM
256 {
257 header: gettext('Subscription'),
258 width: 120,
259 renderer: Proxmox.Utils.format_subscription_level,
260 dataIndex: 'level'
261 },
96a898b1
DM
262 {
263 header: gettext('Uptime'),
ef7b87d8 264 width: 150,
96a898b1
DM
265 renderer: Proxmox.Utils.render_uptime,
266 dataIndex: 'uptime'
267 },
268 {
269 header: gettext('Load average'),
270 renderer: function(value) {
271 if (Ext.isArray(value)) {
272 return value[0];
273 }
274 return value;
275 },
276 dataIndex: 'loadavg'
277 },
278 {
a6f800c4
DM
279 xtype: 'widgetcolumn',
280 widget: {
281 xtype: 'progressbarwidget',
282 textTpl: '{value:percent}'
96a898b1 283 },
a6f800c4
DM
284 header: gettext('RAM usage'),
285 dataIndex: 'memory_per'
96a898b1
DM
286 },
287 {
a6f800c4
DM
288 xtype: 'widgetcolumn',
289 widget: {
290 xtype: 'progressbarwidget',
291 textTpl: '{value:percent}'
96a898b1 292 },
a6f800c4
DM
293 header: gettext('HD space'),
294 dataIndex: 'rootfs_per'
96a898b1 295 }
462f0688
DM
296 ]
297 }
298 ]
299});