[pbs-devel] [PATCH proxmox-backup v4 45/45] ui: expose s3 refresh button for datastores backed by object store

Christian Ebner c.ebner at proxmox.com
Mon Jun 23 11:41:06 CEST 2025


Allows to trigger a refresh of the local datastore contents from
the WebUI.

Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
 www/datastore/Summary.js | 44 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/www/datastore/Summary.js b/www/datastore/Summary.js
index cdb34aea3..d8f59ebc5 100644
--- a/www/datastore/Summary.js
+++ b/www/datastore/Summary.js
@@ -301,6 +301,31 @@ Ext.define('PBS.DataStoreSummary', {
                 });
             },
         },
+        {
+            xtype: 'button',
+            text: gettext('S3 Refresh'),
+            hidden: true,
+            itemId: 's3RefreshButton',
+            reference: 's3RefreshButton',
+            handler: function () {
+                let me = this;
+                let datastore = me.up('panel').datastore;
+                Proxmox.Utils.API2Request({
+                    url: `/admin/datastore/${datastore}/s3-refresh`,
+                    method: 'PUT',
+                    failure: (response) => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+                    success: function (response, options) {
+                        Ext.create('Proxmox.window.TaskViewer', {
+                            upid: response.result.data,
+                            taskDone: () => {
+                                me.up('panel').statusStore.load();
+                                Ext.ComponentQuery.query('navigationtree')[0]?.reloadStore();
+                            },
+                        }).show();
+                    },
+                });
+            },
+        },
         '->',
         {
             xtype: 'proxmoxRRDTypeSelector',
@@ -398,6 +423,7 @@ Ext.define('PBS.DataStoreSummary', {
         me.mon(me.statusStore, 'load', (s, records, success) => {
             let mountBtn = me.lookupReferenceHolder().lookupReference('mountButton');
             let unmountBtn = me.lookupReferenceHolder().lookupReference('unmountButton');
+            let s3RefreshBtn = me.lookupReferenceHolder().lookupReference('s3RefreshButton');
             if (!success) {
                 lastRequestWasFailue = true;
 
@@ -413,6 +439,16 @@ Ext.define('PBS.DataStoreSummary', {
                     success: (response) => {
                         let mode = response.result.data['maintenance-mode'];
                         let [type, _message] = PBS.Utils.parseMaintenanceMode(mode);
+
+                        if (!type && response.result.data.backend) {
+                            let backendConfig = PBS.Utils.parsePropertyString(
+                                response.result.data.backend,
+                            );
+                            if (backendConfig.type === 's3') {
+                                s3RefreshBtn.setDisabled(true);
+                            }
+                        }
+
                         if (!response.result.data['backing-device']) {
                             return;
                         }
@@ -466,6 +502,14 @@ Ext.define('PBS.DataStoreSummary', {
                 me.lookupReferenceHolder().lookupReference('mountButton').setHidden(!removable);
                 me.lookupReferenceHolder().lookupReference('unmountButton').setHidden(!removable);
 
+                if (data.backend) {
+                    let backendConfig = PBS.Utils.parsePropertyString(data.backend);
+                    let s3Backend = backendConfig.type === 's3';
+                    me.lookupReferenceHolder()
+                        .lookupReference('s3RefreshButton')
+                        .setHidden(!s3Backend);
+                }
+
                 let path = Ext.htmlEncode(data.path);
                 me.down('pbsDataStoreInfo').setTitle(`${me.datastore} (${path})`);
                 me.down('pbsDataStoreNotes').setNotes(data.comment);
-- 
2.47.2





More information about the pbs-devel mailing list