2 Ext
.define('pmg-cluster', {
3 extend
: 'Ext.data.Model',
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',
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;
17 type
: 'number', name
: 'rootfs_per',
18 calculate: function(data
) {
20 return Ext
.isObject(du
) ? du
.used
/du
.total
: 0;
26 url
: "/api2/json/config/cluster/status",
31 Ext
.define('PMG.ClusterJoinNodeWindow', {
32 extend
: 'Proxmox.window.Edit',
33 xtype
: 'pmgClusterJoinNodeWindow',
34 onlineHelp
: 'pmgcm_join',
36 title
: gettext('Cluster Join'),
42 url
: '/config/cluster/join',
47 fieldLabel
: 'IP Address',
52 inputType
: 'password',
53 fieldLabel
: gettext('Password'),
58 fieldLabel
: gettext('Fingerprint'),
64 Ext
.define('PMG.ClusterAddNodeWindow', {
65 extend
: 'Ext.window.Window',
66 xtype
: 'pmgClusterAddNodeWindow',
67 mixins
: ['Proxmox.Mixin.CBind'],
73 title
: gettext('Cluster Join') + ' : ' + gettext('Information'),
77 fingerprint
: undefined,
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."),
90 padding
: '0 10 10 10',
94 fieldLabel
: gettext('IP Address'),
95 cbind
: { value
: '{ipAddress}' },
100 fieldLabel
: gettext('Fingerprint'),
101 cbind
: { value
: '{fingerprint}' },
109 /*jslint confusion: true*/
110 /* bind is a function and object */
111 Ext
.define('PMG.ClusterAdministration', {
112 extend
: 'Ext.tab.Panel',
113 xtype
: 'pmgClusterAdministration',
115 title
: gettext('Cluster Administration'),
118 defaults
: { border
: false },
131 title
: gettext('Nodes'),
133 xclass
: 'Ext.app.ViewController',
135 init: function(view
) {
136 view
.store
.on('load', this.onLoad
, this);
137 Proxmox
.Utils
.monStoreErrors(view
, view
.getStore(), true);
140 onLoad: function(store
, records
, success
) {
141 var vm
= this.getViewModel();
142 if (!success
|| !records
) {
145 vm
.set('nodecount', records
.length
);
148 Ext
.Array
.each(records
, function(ni
) {
149 if (ni
.data
.type
=== 'master') {
153 vm
.set('master', master
);
156 onCreate: function() {
157 var view
= this.getView();
159 Proxmox
.Utils
.API2Request({
160 url
: '/config/cluster/create',
163 failure: function(response
, opts
) {
164 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
166 success: function(response
, options
) {
167 var upid
= response
.result
.data
;
168 var win
= Ext
.create('Proxmox.window.TaskProgress', { upid
: upid
});
170 win
.on('destroy', function() { view
.store
.load(); });
176 var view
= this.getView();
177 var win
= Ext
.create('PMG.ClusterJoinNodeWindow', {});
179 win
.on('destroy', function() {
185 var vm
= this.getViewModel();
187 var win
= Ext
.create('PMG.ClusterAddNodeWindow', {
188 ipAddress
: vm
.get('master').get('ip'),
189 fingerprint
: vm
.get('master').get('fingerprint'),
197 model
: 'pmg-cluster',
202 text
: gettext('Create'),
203 reference
: 'createButton',
206 disabled
: '{nodecount}',
210 text
: gettext('Add'),
211 reference
: 'addButton',
214 disabled
: '{!master}',
218 text
: gettext('Join'),
219 reference
: 'joinButton',
222 disabled
: '{nodecount}',
228 header
: gettext('Node'),
233 header
: gettext('Role'),
238 header
: gettext('ID'),
244 header
: gettext('IP'),
249 header
: gettext('State'),
251 renderer: function(value
, metaData
, record
) {
253 var state
= 'active';
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, '"') + '"';
270 header
: gettext('Subscription'),
272 renderer
: Proxmox
.Utils
.format_subscription_level
,
276 header
: gettext('Uptime'),
278 renderer
: Proxmox
.Utils
.render_uptime
,
282 header
: gettext('Load average'),
283 renderer: function(value
) {
284 if (Ext
.isDefined(value
)) {
285 if (Ext
.isArray(value
)) {
288 return value
.toString();
292 dataIndex
: 'loadavg',
295 xtype
: 'widgetcolumn',
297 xtype
: 'progressbarwidget',
298 textTpl
: '{value:percent}',
300 header
: gettext('RAM usage'),
301 dataIndex
: 'memory_per',
304 xtype
: 'widgetcolumn',
306 xtype
: 'progressbarwidget',
307 textTpl
: '{value:percent}',
309 header
: gettext('HD space'),
310 dataIndex
: 'rootfs_per',