1 Ext
.define('pmg-cluster', {
2 extend
: 'Ext.data.Model',
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;
14 { type
: 'number', name
: 'rootfs_per',
15 calculate: function(data
) {
17 return Ext
.isObject(du
) ? du
.used
/du
.total
: 0;
23 url
: "/api2/json/config/cluster/status"
28 Ext
.define('PMG.ClusterJoinNodeWindow', {
29 extend
: 'Proxmox.window.Edit',
30 xtype
: 'pmgClusterJoinNodeWindow',
32 title
: gettext('Cluster Join'),
38 url
: '/config/cluster/join',
43 fieldLabel
: 'IP Address',
48 inputType
: 'password',
49 fieldLabel
: gettext('Password'),
54 fieldLabel
: gettext('Fingerprint'),
60 Ext
.define('PMG.ClusterAddNodeWindow', {
61 extend
: 'Ext.window.Window',
62 xtype
: 'pmgClusterAddNodeWindow',
63 mixins
: ['Proxmox.Mixin.CBind'],
69 title
: gettext('Cluster Join') + ' : ' + gettext('Information'),
73 fingerprint
: undefined,
80 html
: gettext("Please use the 'Join' button on the node you want to add, using the following IP address and fingerprint.")
86 padding
: '0 10 10 10',
90 fieldLabel
: gettext('IP Address'),
91 cbind
: { value
: '{ipAddress}' },
96 fieldLabel
: gettext('Fingerprint'),
97 cbind
: { value
: '{fingerprint}' },
105 Ext
.define('PMG.ClusterAdministration', {
106 extend
: 'Ext.tab.Panel',
107 xtype
: 'pmgClusterAdministration',
109 title
: gettext('Cluster Administration'),
112 defaults
: { border
: false },
125 title
: gettext('Nodes'),
127 xclass
: 'Ext.app.ViewController',
129 init: function(view
) {
130 view
.store
.on('load', this.onLoad
, this);
131 Proxmox
.Utils
.monStoreErrors(view
, view
.getStore());
134 onLoad: function(store
, records
) {
135 var vm
= this.getViewModel();
136 vm
.set('nodecount', records
.length
);
139 Ext
.Array
.each(records
, function(ni
) {
140 if (ni
.data
.type
=== 'master') {
144 vm
.set('master', master
);
147 onCreate: function() {
148 var view
= this.getView();
150 Proxmox
.Utils
.API2Request({
151 url
: '/config/cluster/create',
154 failure: function (response
, opts
) {
155 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
157 success: function(response
, options
) {
158 var upid
= response
.result
.data
;
159 var win
= Ext
.create('Proxmox.window.TaskProgress', { upid
: upid
});
161 win
.on('destroy', function() { view
.store
.load(); });
167 var view
= this.getView();
168 var win
= Ext
.create('PMG.ClusterJoinNodeWindow', {});
170 win
.on('destroy', function() {
176 var vm
= this.getViewModel();
178 var win
= Ext
.create('PMG.ClusterAddNodeWindow', {
179 ipAddress
: vm
.get('master').get('ip'),
180 fingerprint
: vm
.get('master').get('fingerprint')
192 text
: gettext('Create'),
193 reference
: 'createButton',
196 disabled
: '{nodecount}'
200 text
: gettext('Add'),
201 reference
: 'addButton',
204 disabled
: '{!master}'
208 text
: gettext('Join'),
209 reference
: 'joinButton',
212 disabled
: '{nodecount}'
218 header
: gettext('Node'),
223 header
: gettext('Role'),
228 header
: gettext('ID'),
234 header
: gettext('IP'),
239 header
: gettext('State'),
241 renderer: function(value
, metaData
, record
) {
243 var state
= 'active';
244 if (!d
.insync
) state
= 'syncing';
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,'"') + '"';
258 header
: gettext('Subscription'),
260 renderer
: Proxmox
.Utils
.format_subscription_level
,
264 header
: gettext('Uptime'),
266 renderer
: Proxmox
.Utils
.render_uptime
,
270 header
: gettext('Load average'),
271 renderer: function(value
) {
272 if (Ext
.isArray(value
)) {
280 xtype
: 'widgetcolumn',
282 xtype
: 'progressbarwidget',
283 textTpl
: '{value:percent}'
285 header
: gettext('RAM usage'),
286 dataIndex
: 'memory_per'
289 xtype
: 'widgetcolumn',
291 xtype
: 'progressbarwidget',
292 textTpl
: '{value:percent}'
294 header
: gettext('HD space'),
295 dataIndex
: 'rootfs_per'