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',
9 type
: 'number', name
: 'memory_per',
10 calculate: function(data
) {
11 var mem
= data
.memory
;
12 return Ext
.isObject(mem
) ? mem
.used
/mem
.total
: 0;
16 type
: 'number', name
: 'rootfs_per',
17 calculate: function(data
) {
19 return Ext
.isObject(du
) ? du
.used
/du
.total
: 0;
25 url
: "/api2/json/config/cluster/status",
30 Ext
.define('PMG.ClusterJoinNodeWindow', {
31 extend
: 'Proxmox.window.Edit',
32 xtype
: 'pmgClusterJoinNodeWindow',
33 onlineHelp
: 'pmgcm_join',
35 title
: gettext('Cluster Join'),
41 url
: '/config/cluster/join',
46 fieldLabel
: 'IP Address',
51 inputType
: 'password',
52 fieldLabel
: gettext('Password'),
57 fieldLabel
: gettext('Fingerprint'),
63 Ext
.define('PMG.ClusterAddNodeWindow', {
64 extend
: 'Ext.window.Window',
65 xtype
: 'pmgClusterAddNodeWindow',
66 mixins
: ['Proxmox.Mixin.CBind'],
72 title
: gettext('Cluster Join') + ' : ' + gettext('Information'),
76 fingerprint
: undefined,
82 padding
: '10 10 10 10',
83 html
: gettext("Please use the 'Join' button on the node you want to add, using the following IP address and fingerprint."),
89 padding
: '0 10 10 10',
93 fieldLabel
: gettext('IP Address'),
94 cbind
: { value
: '{ipAddress}' },
99 fieldLabel
: gettext('Fingerprint'),
100 cbind
: { value
: '{fingerprint}' },
108 Ext
.define('PMG.ClusterAdministration', {
109 extend
: 'Ext.tab.Panel',
110 xtype
: 'pmgClusterAdministration',
112 title
: gettext('Cluster Administration'),
115 defaults
: { border
: false },
128 title
: gettext('Nodes'),
130 xclass
: 'Ext.app.ViewController',
132 init: function(view
) {
133 view
.store
.on('load', this.onLoad
, this);
134 Proxmox
.Utils
.monStoreErrors(view
, view
.getStore(), true);
137 onLoad: function(store
, records
, success
) {
138 var vm
= this.getViewModel();
139 if (!success
|| !records
) {
142 vm
.set('nodecount', records
.length
);
145 Ext
.Array
.each(records
, function(ni
) {
146 if (ni
.data
.type
=== 'master') {
150 vm
.set('master', master
);
153 onCreate: function() {
154 var view
= this.getView();
156 Proxmox
.Utils
.API2Request({
157 url
: '/config/cluster/create',
160 failure: function(response
, opts
) {
161 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
163 success: function(response
, options
) {
164 var upid
= response
.result
.data
;
165 var win
= Ext
.create('Proxmox.window.TaskProgress', { upid
: upid
});
167 win
.on('destroy', function() { view
.store
.load(); });
173 var view
= this.getView();
174 var win
= Ext
.create('PMG.ClusterJoinNodeWindow', {});
176 win
.on('destroy', function() {
182 var vm
= this.getViewModel();
184 var win
= Ext
.create('PMG.ClusterAddNodeWindow', {
185 ipAddress
: vm
.get('master').get('ip'),
186 fingerprint
: vm
.get('master').get('fingerprint'),
194 model
: 'pmg-cluster',
199 text
: gettext('Create'),
200 reference
: 'createButton',
203 disabled
: '{nodecount}',
207 text
: gettext('Add'),
208 reference
: 'addButton',
211 disabled
: '{!master}',
215 text
: gettext('Join'),
216 reference
: 'joinButton',
219 disabled
: '{nodecount}',
225 header
: gettext('Node'),
230 header
: gettext('Role'),
235 header
: gettext('ID'),
241 header
: gettext('IP'),
246 header
: gettext('State'),
248 renderer: function(value
, metaData
, record
) {
250 var state
= 'active';
255 metaData
.tdCls
= 'x-form-invalid-field';
256 var html
= '<p>' + Ext
.htmlEncode(d
.conn_error
) + '</p>';
257 html
= html
.replace(/\n/g, '<br>');
258 metaData
.tdAttr
= 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
259 html
.replace(/\"/g, '"') + '"';
267 header
: gettext('Subscription'),
269 renderer
: Proxmox
.Utils
.format_subscription_level
,
273 header
: gettext('Uptime'),
275 renderer
: Proxmox
.Utils
.render_uptime
,
279 header
: gettext('Load average'),
280 renderer: function(value
) {
281 if (Ext
.isDefined(value
)) {
282 if (Ext
.isArray(value
)) {
285 return value
.toString();
289 dataIndex
: 'loadavg',
292 xtype
: 'widgetcolumn',
294 xtype
: 'progressbarwidget',
295 textTpl
: '{value:percent}',
297 header
: gettext('RAM usage'),
298 dataIndex
: 'memory_per',
301 xtype
: 'widgetcolumn',
303 xtype
: 'progressbarwidget',
304 textTpl
: '{value:percent}',
306 header
: gettext('HD space'),
307 dataIndex
: 'rootfs_per',