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',
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;
15 { type
: 'number', name
: 'rootfs_per',
16 calculate: function(data
) {
18 return Ext
.isObject(du
) ? du
.used
/du
.total
: 0;
24 url
: "/api2/json/config/cluster/status"
29 Ext
.define('PMG.ClusterJoinNodeWindow', {
30 extend
: 'Proxmox.window.Edit',
31 xtype
: 'pmgClusterJoinNodeWindow',
33 title
: gettext('Cluster Join'),
39 url
: '/config/cluster/join',
44 fieldLabel
: 'IP Address',
49 inputType
: 'password',
50 fieldLabel
: gettext('Password'),
55 fieldLabel
: gettext('Fingerprint'),
61 Ext
.define('PMG.ClusterAddNodeWindow', {
62 extend
: 'Ext.window.Window',
63 xtype
: 'pmgClusterAddNodeWindow',
64 mixins
: ['Proxmox.Mixin.CBind'],
70 title
: gettext('Cluster Join') + ' : ' + gettext('Information'),
74 fingerprint
: undefined,
80 padding
: '10 10 10 10',
81 html
: gettext("Please use the 'Join' button on the node you want to add, using the following IP address and fingerprint.")
87 padding
: '0 10 10 10',
91 fieldLabel
: gettext('IP Address'),
92 cbind
: { value
: '{ipAddress}' },
97 fieldLabel
: gettext('Fingerprint'),
98 cbind
: { value
: '{fingerprint}' },
106 /*jslint confusion: true*/
107 /* bind is a function and object */
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());
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')
198 text
: gettext('Create'),
199 reference
: 'createButton',
202 disabled
: '{nodecount}'
206 text
: gettext('Add'),
207 reference
: 'addButton',
210 disabled
: '{!master}'
214 text
: gettext('Join'),
215 reference
: 'joinButton',
218 disabled
: '{nodecount}'
224 header
: gettext('Node'),
229 header
: gettext('Role'),
234 header
: gettext('ID'),
240 header
: gettext('IP'),
245 header
: gettext('State'),
247 renderer: function(value
, metaData
, record
) {
249 var state
= 'active';
254 metaData
.tdCls
= 'x-form-invalid-field';
255 var html
= '<p>' + Ext
.htmlEncode(d
.conn_error
) + '</p>';
256 html
= html
.replace(/\n/g, '<br>');
257 metaData
.tdAttr
= 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
258 html
.replace(/\"/g,'"') + '"';
266 header
: gettext('Subscription'),
268 renderer
: Proxmox
.Utils
.format_subscription_level
,
272 header
: gettext('Uptime'),
274 renderer
: Proxmox
.Utils
.render_uptime
,
278 header
: gettext('Load average'),
279 renderer: function(value
) {
280 if (Ext
.isArray(value
)) {
283 return value
.toString();
288 xtype
: 'widgetcolumn',
290 xtype
: 'progressbarwidget',
291 textTpl
: '{value:percent}'
293 header
: gettext('RAM usage'),
294 dataIndex
: 'memory_per'
297 xtype
: 'widgetcolumn',
299 xtype
: 'progressbarwidget',
300 textTpl
: '{value:percent}'
302 header
: gettext('HD space'),
303 dataIndex
: 'rootfs_per'