]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/node/Disks.js
1 Ext
.define('PVE.node.DiskList', {
2 extend
: 'Ext.grid.GridPanel',
3 alias
: 'widget.pveNodeDiskList',
4 emptyText
: gettext('No Disks found'),
6 stateId
: 'grid-node-disks',
9 header
: gettext('Device'),
15 header
: gettext('Type'),
19 renderer: function(v
) {
22 } else if (v
=== 'hdd') {
24 } else if (v
=== 'usb'){
27 return gettext('Unknown');
32 header
: gettext('Usage'),
35 renderer: function(v
, metaData
, rec
) {
36 if (rec
&& (rec
.data
.osdid
>= 0)) {
37 return "osd." + rec
.data
.osdid
.toString();
39 return v
|| PVE
.Utils
.noText
;
44 header
: gettext('Size'),
48 renderer
: PVE
.Utils
.format_size
,
55 renderer: function(value
) {
57 return PVE
.Utils
.yesText
;
59 return PVE
.Utils
.noText
;
65 header
: gettext('Vendor'),
68 renderer
: Ext
.String
.htmlEncode
,
72 header
: gettext('Model'),
75 renderer
: Ext
.String
.htmlEncode
,
79 header
: gettext('Serial'),
82 renderer
: Ext
.String
.htmlEncode
,
89 renderer
: Ext
.String
.htmlEncode
,
97 renderer: function(value
) {
98 if (Ext
.isNumeric(value
)) {
99 return (100 - value
).toString() + '%';
106 initComponent: function() {
107 /*jslint confusion: true */
110 var nodename
= me
.pveSelNode
.data
.node
;
112 throw "no node name specified";
115 var sm
= Ext
.create('Ext.selection.RowModel', {});
117 var store
= Ext
.create('Ext.data.Store', {
118 storeid
: 'node-disk-list' + nodename
,
119 model
: 'node-disk-list',
122 url
: "/api2/json/nodes/" + nodename
+ "/disks/list"
132 var reloadButton
= Ext
.create('PVE.button.Button', {
133 text
: gettext('Reload'),
134 handler: function() {
139 var smartButton
= Ext
.create('PVE.button.Button', {
140 text
: gettext('Show S.M.A.R.T. values'),
142 enableFn: function() {
143 return !!sm
.getSelection().length
;
146 handler: function() {
147 var rec
= sm
.getSelection()[0];
149 var win
= Ext
.create('PVE.DiskSmartWindow', {
151 dev
: rec
.data
.devpath
157 var initButton
= Ext
.create('PVE.button.Button', {
158 text
: gettext('Initialize Disk with GPT'),
160 enableFn: function() {
161 var selection
= sm
.getSelection();
163 if (!selection
.length
|| selection
[0].data
.used
) {
171 handler: function() {
172 var rec
= sm
.getSelection()[0];
173 PVE
.Utils
.API2Request({
174 url
: '/api2/extjs/nodes/' + nodename
+ '/disks/initgpt',
177 params
: { disk
: rec
.data
.devpath
},
178 failure: function(response
, options
) {
179 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
181 success: function(response
, options
) {
182 var upid
= response
.result
.data
;
183 var win
= Ext
.create('PVE.window.TaskProgress', {
192 me
.loadCount
= 1; // avoid duplicate loadmask
193 PVE
.Utils
.monStoreErrors(me
, store
);
198 tbar
: [ reloadButton
, smartButton
, initButton
],
200 itemdblclick: function() {
201 var rec
= sm
.getSelection()[0];
203 var win
= Ext
.create('PVE.DiskSmartWindow', {
205 dev
: rec
.data
.devpath
218 Ext
.define('node-disk-list', {
219 extend
: 'Ext.data.Model',
220 fields
: [ 'devpath', 'used', { name
: 'size', type
: 'number'},
221 {name
: 'osdid', type
: 'number'},
222 'vendor', 'model', 'serial', 'rpm', 'type', 'health', 'wearout' ],
223 idProperty
: 'devpath'
227 Ext
.define('PVE.DiskSmartWindow', {
228 extend
: 'Ext.window.Window',
229 alias
: 'widget.pveSmartWindow',
239 emptyText
: gettext('No S.M.A.R.T. Values'),
243 reserveScrollbar
: true,
245 { text
: 'ID', dataIndex
: 'id', width
: 50 },
246 { text
: gettext('Attribute'), flex
: 1, dataIndex
: 'name', renderer
: Ext
.String
.htmlEncode
},
247 { text
: gettext('Value'), dataIndex
: 'raw', renderer
: Ext
.String
.htmlEncode
},
248 { text
: gettext('Normalized'), dataIndex
: 'value', width
: 60},
249 { text
: gettext('Threshold'), dataIndex
: 'threshold', width
: 60},
250 { text
: gettext('Worst'), dataIndex
: 'worst', width
: 60},
251 { text
: gettext('Flags'), dataIndex
: 'flags'},
252 { text
: gettext('Failing'), dataIndex
: 'fail', renderer
: Ext
.String
.htmlEncode
}
263 'background-color': 'white',
264 'white-space': 'pre',
265 'font-family': 'monospace'
272 text
: gettext('Reload'),
274 handler: function() {
276 me
.up('window').store
.reload();
280 text
: gettext('Close'),
282 handler: function() {
284 me
.up('window').close();
298 title
: gettext('S.M.A.R.T. Values'),
300 initComponent: function() {
303 var nodename
= me
.nodename
;
305 throw "no node name specified";
310 throw "no device specified";
313 me
.store
= Ext
.create('Ext.data.Store', {
317 url
: "/api2/json/nodes/" + nodename
+ "/disks/smart?disk=" + dev
322 var grid
= me
.down('#smarts');
323 var text
= me
.down('#text');
325 PVE
.Utils
.monStoreErrors(grid
, me
.store
);
326 me
.mon(me
.store
, 'load', function(s
, records
, success
) {
327 if (success
&& records
.length
> 0) {
328 var rec
= records
[0];
329 switch (rec
.data
.type
) {
331 grid
.setVisible(false);
332 text
.setVisible(true);
333 text
.setHtml(Ext
.String
.htmlEncode(rec
.data
.text
));
337 // cannot use empty case because
339 grid
.setVisible(true);
340 text
.setVisible(false);
341 grid
.setStore(rec
.attributes());
351 Ext
.define('disk-smart', {
352 extend
: 'Ext.data.Model',
358 hasMany
: {model
: 'smart-attribute', name
: 'attributes'}
360 Ext
.define('smart-attribute', {
361 extend
: 'Ext.data.Model',
363 { name
:'id', type
:'number' }, 'name', 'value', 'worst', 'threshold', 'flags', 'fail', 'raw'