]>
git.proxmox.com Git - proxmox-widget-toolkit.git/blob - src/panel/DiskList.js
b1551394e40a371c281a6f6170f4482031ae663f
1 Ext
.define('pmx-disk-list', {
2 extend
: 'Ext.data.Model',
5 { name
: 'size', type
: 'number' },
6 { name
: 'osdid', type
: 'number', defaultValue
: -1 },
9 convert: function(value
, rec
) {
10 if (value
) return value
;
11 if (rec
.data
.health
) {
12 return rec
.data
.health
;
15 if (rec
.data
.type
=== 'partition') {
19 return Proxmox
.Utils
.unknownText
;
24 convert: function(value
, rec
) {
25 if (value
) return value
;
26 if (rec
.data
.devpath
) return rec
.data
.devpath
;
32 convert: function(value
, rec
) {
33 if (value
) return value
;
34 if (rec
.data
.type
) return rec
.data
.type
;
38 'vendor', 'model', 'serial', 'rpm', 'type', 'wearout', 'health',
40 idProperty
: 'devpath',
43 Ext
.define('Proxmox.DiskList', {
44 extend
: 'Ext.tree.Panel',
45 alias
: 'widget.pmxDiskList',
47 supportsWipeDisk
: false,
51 emptyText
: gettext('No Disks found'),
54 stateId
: 'tree-node-disks',
57 xclass
: 'Ext.app.ViewController',
61 let view
= me
.getView();
64 if (view
.includePartitions
) {
65 extraParams
['include-partitions'] = 1;
68 let url
= `${view.baseurl}/list`;
71 extraParams
: extraParams
,
77 openSmartWindow: function() {
79 let view
= me
.getView();
80 let selection
= view
.getSelection();
81 if (!selection
|| selection
.length
< 1) return;
83 let rec
= selection
[0];
84 Ext
.create('Proxmox.window.DiskSmart', {
85 baseurl
: view
.baseurl
,
92 let view
= me
.getView();
93 let selection
= view
.getSelection();
94 if (!selection
|| selection
.length
< 1) return;
96 let rec
= selection
[0];
97 Proxmox
.Utils
.API2Request({
98 url
: `${view.exturl}/initgpt`,
101 params
: { disk
: rec
.data
.name
},
102 failure: function(response
, options
) {
103 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
105 success: function(response
, options
) {
106 var upid
= response
.result
.data
;
107 var win
= Ext
.create('Proxmox.window.TaskProgress', {
109 taskDone: function() {
118 wipeDisk: function() {
120 let view
= me
.getView();
121 let selection
= view
.getSelection();
122 if (!selection
|| selection
.length
< 1) return;
124 let rec
= selection
[0];
125 Proxmox
.Utils
.API2Request({
126 url
: `${view.exturl}/wipedisk`,
129 params
: { disk
: rec
.data
.name
},
130 failure: function(response
, options
) {
131 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
133 success: function(response
, options
) {
134 var upid
= response
.result
.data
;
135 var win
= Ext
.create('Proxmox.window.TaskProgress', {
137 taskDone: function() {
146 init: function(view
) {
147 let nodename
= view
.nodename
|| 'localhost';
148 view
.baseurl
= `/api2/json/nodes/${nodename}/disks`;
149 view
.exturl
= `/api2/extjs/nodes/${nodename}/disks`;
151 this.store
= Ext
.create('Ext.data.Store', {
152 model
: 'pmx-disk-list',
154 this.store
.on('load', this.onLoad
, this);
156 Proxmox
.Utils
.monStoreErrors(view
, this.store
);
160 onLoad: function(store
, records
, success
, operation
) {
162 let view
= this.getView();
165 Proxmox
.Utils
.setErrorMask(
167 Proxmox
.Utils
.getResponseErrorMessage(operation
.getError()),
174 for (const item
of records
) {
175 let data
= item
.data
;
177 data
.expanded
= true;
179 data
.iconCls
= 'fa fa-fw fa-hdd-o x-fa-tree';
181 disks
[data
.devpath
] = data
;
184 for (const item
of records
) {
185 let data
= item
.data
;
187 disks
[data
.parent
].leaf
= false;
188 disks
[data
.parent
].children
.push(data
);
193 for (const [_
, device
] of Object
.entries(disks
)) {
194 children
.push(device
);
202 Proxmox
.Utils
.setErrorMask(view
, false);
206 renderDiskType: function(v
) {
207 if (v
=== undefined) return Proxmox
.Utils
.unknownText
;
209 case 'ssd': return 'SSD';
210 case 'hdd': return 'Hard Disk';
211 case 'usb': return 'USB';
216 renderDiskUsage: function(v
, metaData
, rec
) {
217 let extendedInfo
= '';
220 if (rec
.data
.osdid
!== undefined && rec
.data
.osdid
>= 0) {
221 types
.push(`OSD.${rec.data.osdid.toString()}`);
223 if (rec
.data
.journals
> 0) {
224 types
.push('Journal');
226 if (rec
.data
.db
> 0) {
229 if (rec
.data
.wal
> 0) {
232 if (types
.length
> 0) {
233 extendedInfo
= `, Ceph (${types.join(', ')})`;
236 return v
? `${v}${extendedInfo}` : Proxmox
.Utils
.noText
;
242 header
: gettext('Device'),
245 dataIndex
: 'devpath',
248 header
: gettext('Type'),
251 dataIndex
: 'disk-type',
252 renderer: function(v
) {
254 return me
.renderDiskType(v
);
258 header
: gettext('Usage'),
261 renderer: function(v
, metaData
, rec
) {
263 return me
.renderDiskUsage(v
, metaData
, rec
);
268 header
: gettext('Size'),
272 renderer
: Proxmox
.Utils
.format_size
,
279 renderer
: Proxmox
.Utils
.format_boolean
,
283 header
: gettext('Vendor'),
287 renderer
: Ext
.String
.htmlEncode
,
291 header
: gettext('Model'),
294 renderer
: Ext
.String
.htmlEncode
,
298 header
: gettext('Serial'),
301 renderer
: Ext
.String
.htmlEncode
,
305 header
: 'S.M.A.R.T.',
308 renderer
: Ext
.String
.htmlEncode
,
316 dataIndex
: 'wearout',
317 renderer: function(value
) {
318 if (Ext
.isNumeric(value
)) {
319 return (100 - value
).toString() + '%';
327 itemdblclick
: 'openSmartWindow',
330 initComponent: function() {
335 text
: gettext('Reload'),
339 xtype
: 'proxmoxButton',
340 text
: gettext('Show S.M.A.R.T. values'),
341 parentXType
: 'treepanel',
343 enableFn: function(rec
) {
344 if (!rec
|| rec
.data
.parent
) {
350 handler
: 'openSmartWindow',
353 xtype
: 'proxmoxButton',
354 text
: gettext('Initialize Disk with GPT'),
355 parentXType
: 'treepanel',
357 enableFn: function(rec
) {
358 if (!rec
|| rec
.data
.parent
||
359 (rec
.data
.used
&& rec
.data
.used
!== 'unused')) {
369 if (me
.supportsWipeDisk
) {
372 xtype
: 'proxmoxButton',
373 text
: gettext('Wipe Disk'),
374 parentXType
: 'treepanel',
376 confirmMsg: function(rec
) {
377 const data
= rec
.data
;
379 let mainMessage
= Ext
.String
.format(
380 gettext('Are you sure you want to wipe {0}?'),
383 mainMessage
+= `<br> ${gettext('All data on the device will be lost!')}`;
385 const type
= me
.renderDiskType(data
["disk-type"]);
388 if (data
.children
.length
> 0) {
389 const partitionUsage
= data
.children
.map(
390 partition
=> me
.renderDiskUsage(partition
.used
),
392 usage
= `${gettext('Partitions')} (${partitionUsage})`;
394 usage
= me
.renderDiskUsage(data
.used
, undefined, rec
);
397 const size
= Proxmox
.Utils
.format_size(data
.size
);
398 const serial
= Ext
.String
.htmlEncode(data
.serial
);
400 let additionalInfo
= `${gettext('Type')}: ${type}<br>`;
401 additionalInfo
+= `${gettext('Usage')}: ${usage}<br>`;
402 additionalInfo
+= `${gettext('Size')}: ${size}<br>`;
403 additionalInfo
+= `${gettext('Serial')}: ${serial}`;
405 return `${mainMessage}<br><br>${additionalInfo}`;
408 enableFn: function(rec
) {
409 // TODO enable for partitions once they can be selected for ZFS,LVM,etc. creation
410 if (!rec
|| rec
.data
.parent
) {