]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/node/Disks.js
8e79dc8420d773c360ae66324bcf1d744f9f8642
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
) {
37 if (rec
.data
.osdid
>= 0) {
39 if (rec
.data
.bluestore
=== 1) {
40 bluestore
= ' (Bluestore)';
42 return "Ceph osd." + rec
.data
.osdid
.toString() + bluestore
;
46 if (rec
.data
.journals
> 0) {
47 types
.push('Journal');
50 if (rec
.data
.db
> 0) {
54 if (rec
.data
.wal
> 0) {
58 if (types
.length
> 0) {
59 return 'Ceph (' + types
.join(', ') + ')';
63 return v
|| Proxmox
.Utils
.noText
;
68 header
: gettext('Size'),
72 renderer
: Proxmox
.Utils
.format_size
,
79 renderer: function(value
) {
81 return Proxmox
.Utils
.yesText
;
83 return Proxmox
.Utils
.noText
;
89 header
: gettext('Vendor'),
92 renderer
: Ext
.String
.htmlEncode
,
96 header
: gettext('Model'),
99 renderer
: Ext
.String
.htmlEncode
,
103 header
: gettext('Serial'),
106 renderer
: Ext
.String
.htmlEncode
,
110 header
: 'S.M.A.R.T.',
113 renderer
: Ext
.String
.htmlEncode
,
120 dataIndex
: 'wearout',
121 renderer: function(value
) {
122 if (Ext
.isNumeric(value
)) {
123 return (100 - value
).toString() + '%';
130 initComponent: function() {
131 /*jslint confusion: true */
134 var nodename
= me
.pveSelNode
.data
.node
;
136 throw "no node name specified";
139 var sm
= Ext
.create('Ext.selection.RowModel', {});
141 var store
= Ext
.create('Ext.data.Store', {
142 storeid
: 'node-disk-list' + nodename
,
143 model
: 'node-disk-list',
146 url
: "/api2/json/nodes/" + nodename
+ "/disks/list"
156 var reloadButton
= Ext
.create('Proxmox.button.Button', {
157 text
: gettext('Reload'),
158 handler: function() {
163 var smartButton
= Ext
.create('Proxmox.button.Button', {
164 text
: gettext('Show S.M.A.R.T. values'),
166 enableFn: function() {
167 return !!sm
.getSelection().length
;
170 handler: function() {
171 var rec
= sm
.getSelection()[0];
173 var win
= Ext
.create('PVE.DiskSmartWindow', {
175 dev
: rec
.data
.devpath
181 var initButton
= Ext
.create('Proxmox.button.Button', {
182 text
: gettext('Initialize Disk with GPT'),
184 enableFn: function() {
185 var selection
= sm
.getSelection();
187 if (!selection
.length
|| selection
[0].data
.used
) {
195 handler: function() {
196 var rec
= sm
.getSelection()[0];
197 Proxmox
.Utils
.API2Request({
198 url
: '/api2/extjs/nodes/' + nodename
+ '/disks/initgpt',
201 params
: { disk
: rec
.data
.devpath
},
202 failure: function(response
, options
) {
203 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
205 success: function(response
, options
) {
206 var upid
= response
.result
.data
;
207 var win
= Ext
.create('Proxmox.window.TaskProgress', {
216 me
.loadCount
= 1; // avoid duplicate loadmask
217 Proxmox
.Utils
.monStoreErrors(me
, store
);
222 tbar
: [ reloadButton
, smartButton
, initButton
],
224 itemdblclick: function() {
225 var rec
= sm
.getSelection()[0];
227 var win
= Ext
.create('PVE.DiskSmartWindow', {
229 dev
: rec
.data
.devpath
242 Ext
.define('node-disk-list', {
243 extend
: 'Ext.data.Model',
244 fields
: [ 'devpath', 'used', { name
: 'size', type
: 'number'},
245 {name
: 'osdid', type
: 'number'},
246 'vendor', 'model', 'serial', 'rpm', 'type', 'health', 'wearout' ],
247 idProperty
: 'devpath'
251 Ext
.define('PVE.DiskSmartWindow', {
252 extend
: 'Ext.window.Window',
253 alias
: 'widget.pveSmartWindow',
263 emptyText
: gettext('No S.M.A.R.T. Values'),
267 reserveScrollbar
: true,
269 { text
: 'ID', dataIndex
: 'id', width
: 50 },
270 { text
: gettext('Attribute'), flex
: 1, dataIndex
: 'name', renderer
: Ext
.String
.htmlEncode
},
271 { text
: gettext('Value'), dataIndex
: 'raw', renderer
: Ext
.String
.htmlEncode
},
272 { text
: gettext('Normalized'), dataIndex
: 'value', width
: 60},
273 { text
: gettext('Threshold'), dataIndex
: 'threshold', width
: 60},
274 { text
: gettext('Worst'), dataIndex
: 'worst', width
: 60},
275 { text
: gettext('Flags'), dataIndex
: 'flags'},
276 { text
: gettext('Failing'), dataIndex
: 'fail', renderer
: Ext
.String
.htmlEncode
}
287 'background-color': 'white',
288 'white-space': 'pre',
289 'font-family': 'monospace'
296 text
: gettext('Reload'),
298 handler: function() {
300 me
.up('window').store
.reload();
304 text
: gettext('Close'),
306 handler: function() {
308 me
.up('window').close();
322 title
: gettext('S.M.A.R.T. Values'),
324 initComponent: function() {
327 var nodename
= me
.nodename
;
329 throw "no node name specified";
334 throw "no device specified";
337 me
.store
= Ext
.create('Ext.data.Store', {
341 url
: "/api2/json/nodes/" + nodename
+ "/disks/smart?disk=" + dev
346 var grid
= me
.down('#smarts');
347 var text
= me
.down('#text');
349 Proxmox
.Utils
.monStoreErrors(grid
, me
.store
);
350 me
.mon(me
.store
, 'load', function(s
, records
, success
) {
351 if (success
&& records
.length
> 0) {
352 var rec
= records
[0];
353 switch (rec
.data
.type
) {
355 grid
.setVisible(false);
356 text
.setVisible(true);
357 text
.setHtml(Ext
.String
.htmlEncode(rec
.data
.text
));
361 // cannot use empty case because
363 grid
.setVisible(true);
364 text
.setVisible(false);
365 grid
.setStore(rec
.attributes());
375 Ext
.define('disk-smart', {
376 extend
: 'Ext.data.Model',
382 hasMany
: {model
: 'smart-attribute', name
: 'attributes'}
384 Ext
.define('smart-attribute', {
385 extend
: 'Ext.data.Model',
387 { name
:'id', type
:'number' }, 'name', 'value', 'worst', 'threshold', 'flags', 'fail', 'raw'