2024-04-18 12:16:58 +02:00
Ext . define ( 'pbs-gc-jobs-status' , {
extend : 'Ext.data.Model' ,
fields : [
2024-04-22 11:02:57 +02:00
'store' , 'upid' , 'removed-bytes' , 'pending-bytes' , 'schedule' ,
2024-04-22 11:44:49 +02:00
'next-run' , 'last-run-endtime' , 'last-run-state' , 'duration' ,
2024-04-18 12:16:58 +02:00
] ,
idProperty : 'store' ,
proxy : {
type : 'proxmox' ,
url : '/api2/json/admin/gc' ,
} ,
} ) ;
Ext . define ( 'PBS.config.GCJobView' , {
extend : 'Ext.grid.GridPanel' ,
alias : 'widget.pbsGCJobView' ,
stateful : true ,
allowDeselect : false ,
title : gettext ( 'Garbage Collect Jobs' ) ,
controller : {
xclass : 'Ext.app.ViewController' ,
init : function ( view ) {
let params = { } ;
let store = view . getStore ( ) ;
let proxy = store . rstore . getProxy ( ) ;
if ( view . datastore ) {
params . store = view . datastore ;
// after the store is loaded, select the row to enable the Edit,.. buttons
store . rstore . proxy . on ( {
'afterload' : {
2024-11-28 14:49:25 +01:00
fn : ( ) => {
if ( view . store ) {
view . getSelectionModel ( ) . select ( 0 ) ;
}
} ,
2024-04-18 12:16:58 +02:00
single : true ,
} ,
} ) ;
// do not highlight the selected row
view . items . items [ 0 ] . selectedItemCls = '' ;
view . items . items [ 0 ] . overItemCls = '' ;
}
proxy . setExtraParams ( params ) ;
Proxmox . Utils . monStoreErrors ( view , store . rstore ) ;
} ,
getDatastoreName : function ( ) {
return this . getView ( ) . getSelection ( ) [ 0 ] ? . data . store ;
} ,
getData : function ( ) {
let view = this . getView ( ) ;
let datastore = this . getDatastoreName ( ) ;
return view . getStore ( ) . getById ( datastore ) . data ;
} ,
editGCJob : function ( ) {
let data = this . getData ( ) ;
Ext . create ( 'PBS.window.GCJobEdit' , {
datastore : data . store ,
id : data . store ,
schedule : data . schedule ,
listeners : {
destroy : ( ) => this . reload ( ) ,
} ,
} ) . show ( ) ;
} ,
garbageCollect : function ( ) {
let datastore = this . getDatastoreName ( ) ;
Proxmox . Utils . API2Request ( {
url : ` /admin/datastore/ ${ datastore } /gc ` ,
method : 'POST' ,
failure : function ( response ) {
Ext . Msg . alert ( gettext ( 'Error' ) , response . htmlStatus ) ;
} ,
success : function ( response , options ) {
Ext . create ( 'Proxmox.window.TaskViewer' , {
upid : response . result . data ,
} ) . show ( ) ;
} ,
} ) ;
} ,
showTaskLog : function ( ) {
let me = this ;
2024-04-22 11:02:57 +02:00
let upid = this . getData ( ) . upid ;
2024-04-18 12:16:58 +02:00
if ( ! upid ) return ;
Ext . create ( 'Proxmox.window.TaskViewer' , { upid } ) . show ( ) ;
} ,
startStore : function ( ) { this . getView ( ) . getStore ( ) . rstore . startUpdate ( ) ; } ,
stopStore : function ( ) { this . getView ( ) . getStore ( ) . rstore . stopUpdate ( ) ; } ,
reload : function ( ) { this . getView ( ) . getStore ( ) . rstore . load ( ) ; } ,
2024-04-22 13:05:04 +02:00
filterState : function ( view , state ) {
delete state . height ;
} ,
2024-04-18 12:16:58 +02:00
} ,
listeners : {
activate : 'startStore' ,
2024-04-22 13:05:03 +02:00
beforedestroy : 'stopStore' ,
2024-04-18 12:16:58 +02:00
deactivate : 'stopStore' ,
itemdblclick : 'editGCJob' ,
2024-04-22 13:05:04 +02:00
beforestatesave : 'filterState' ,
2024-04-18 12:16:58 +02:00
} ,
store : {
type : 'diff' ,
autoDestroy : true ,
autoDestroyRstore : true ,
sorters : 'store' ,
rstore : {
type : 'update' ,
storeid : 'pbs-gc-jobs-status' ,
model : 'pbs-gc-jobs-status' ,
interval : 5000 ,
} ,
} ,
tbar : [
{
xtype : 'proxmoxButton' ,
text : gettext ( 'Edit' ) ,
handler : 'editGCJob' ,
enableFn : ( rec ) => ! ! rec ,
disabled : true ,
} ,
'-' ,
{
xtype : 'proxmoxButton' ,
text : gettext ( 'Show Log' ) ,
handler : 'showTaskLog' ,
2024-04-22 11:02:57 +02:00
enableFn : ( rec ) => ! ! rec . data . upid ,
2024-04-18 12:16:58 +02:00
disabled : true ,
} ,
{
xtype : 'proxmoxButton' ,
text : gettext ( 'Run now' ) ,
handler : 'garbageCollect' ,
enableFn : ( rec ) => ! ! rec ,
disabled : true ,
} ,
] ,
columns : [
{
header : gettext ( 'Datastore' ) ,
dataIndex : 'store' ,
renderer : Ext . String . htmlEncode ,
hideable : false ,
2024-04-18 12:17:04 +02:00
minWidth : 120 ,
maxWidth : 300 ,
flex : 2 ,
2024-04-18 12:16:58 +02:00
} ,
{
header : gettext ( 'Schedule' ) ,
dataIndex : 'schedule' ,
hideable : false ,
renderer : ( value ) => value ? value : Proxmox . Utils . NoneText ,
2024-04-18 12:17:04 +02:00
minWidth : 85 ,
flex : 1 ,
2024-04-18 12:16:58 +02:00
} ,
{
header : gettext ( 'Last GC' ) ,
dataIndex : 'last-run-endtime' ,
renderer : PBS . Utils . render _optional _timestamp ,
2024-04-18 12:17:04 +02:00
minWidth : 150 ,
flex : 1 ,
2024-04-18 12:16:58 +02:00
} ,
{
text : gettext ( 'Duration' ) ,
dataIndex : 'duration' ,
renderer : Proxmox . Utils . render _duration ,
2024-04-18 12:17:04 +02:00
minWidth : 80 ,
flex : 1 ,
2024-04-18 12:16:58 +02:00
} ,
{
header : gettext ( 'Last Status' ) ,
dataIndex : 'last-run-state' ,
renderer : PBS . Utils . render _task _status ,
minWidth : 80 ,
2024-04-18 12:17:04 +02:00
flex : 1 ,
2024-04-18 12:16:58 +02:00
} ,
{
header : gettext ( 'Next Run' ) ,
dataIndex : 'next-run' ,
renderer : PBS . Utils . render _next _task _run ,
2024-04-18 12:17:04 +02:00
minWidth : 150 ,
flex : 1 ,
2024-04-18 12:16:58 +02:00
} ,
2024-04-18 12:17:03 +02:00
{
header : gettext ( 'Removed Data' ) ,
dataIndex : 'removed-bytes' ,
2024-04-22 11:02:57 +02:00
renderer : ( value , meta , record ) => record . data . upid !== null
2024-04-18 12:17:05 +02:00
? Proxmox . Utils . format _size ( value , true ) : "-" ,
2024-04-18 12:17:04 +02:00
minWidth : 85 ,
flex : 1 ,
2024-04-18 12:17:03 +02:00
} ,
{
header : gettext ( 'Pending Data' ) ,
dataIndex : 'pending-bytes' ,
2024-04-22 11:02:57 +02:00
renderer : ( value , meta , record ) => record . data . upid !== null
2024-04-18 12:17:05 +02:00
? Proxmox . Utils . format _size ( value , true ) : "-" ,
2024-04-18 12:17:04 +02:00
minWidth : 80 ,
flex : 3 ,
2024-04-18 12:17:03 +02:00
} ,
2024-04-18 12:16:58 +02:00
] ,
2024-04-18 12:17:00 +02:00
initComponent : function ( ) {
let me = this ;
2024-05-16 11:18:41 +02:00
let isSingleDatastore = ! ! me . datastore ;
2024-04-18 12:17:00 +02:00
2024-05-21 11:30:07 +02:00
me . stateId = isSingleDatastore ? 'grid-gc-jobs-single' : 'grid-gc-jobs-v1' ;
2024-04-18 12:17:00 +02:00
for ( let column of me . columns ) {
2024-05-16 11:18:41 +02:00
column . sortable = ! isSingleDatastore ;
2024-04-18 12:17:00 +02:00
if ( column . dataIndex === 'store' ) {
2024-05-16 11:18:41 +02:00
column . hidden = isSingleDatastore ;
2024-04-18 12:17:00 +02:00
}
}
me . callParent ( ) ;
} ,
2024-04-18 12:16:58 +02:00
} ) ;