From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id 195671FF0ED for ; Fri, 31 Jul 2026 17:37:42 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 45E62216B8; Fri, 31 Jul 2026 17:36:41 +0200 (CEST) From: Jakob Klocker To: pve-devel@lists.proxmox.com Subject: [PATCH manager/storage 0/9] storage: plugins: display failed and outdated storage plugins in the GUI Date: Fri, 31 Jul 2026 17:36:08 +0200 Message-ID: <20260731153617.358265-1-j.klocker@proxmox.com> X-Mailer: git-send-email 2.47.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 1 AWL -0.631 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RDNS_NONE 1.274 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record Message-ID-Hash: BGQTXK5D7TM5YZFG5VIM2POAKU3MVJRF X-Message-ID-Hash: BGQTXK5D7TM5YZFG5VIM2POAKU3MVJRF X-MailFrom: jklocker@dev.proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Jakob Klocker X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Currently a storage whose plugin fails to load - because it is a third-party plugin that is outdated, broken, or not installed on a node - is silently dropped from the cluster resource tree, giving the user no indication why it's gone or how to fix it. This series makes such storages visible and displays plugin metadata to explain the situation. The storage backend now records, per plugin, whether it is a built-in or a third-party plugin, its API version, the supported API version range, its load state and an optional documentation URL. The scan result for third-party plugins is cached. On a cache hit only the known-good plugins are required and registered; plugins that failed to load are not retried and their metadata is served from the cache. This also means the warning printed when a plugin fails to load is emitted once when the cache is rebuilt, instead of by every short-lived process (pvesm, pct, qm, ...). Additionally the cluster resource endpoint emits an entry for storages with an unloadable plugin instead of dropping them and the GUI uses the new metadata to: - mark outdated and failed storages with a distinct icon in the resource tree - show the plugin state, whether it's external, and a link to the plugin's documentation in the storage status panel - display a dedicated summary for storages whose plugin could not be loaded, explaining the problem and pointing to the plugin's homepage if provided. Tested on a single node with sshfs with API version 11 (outdated, still loads) and a plugin with an error (load-error, api too old), plus a storage whose type has no plugin installed at all. Verified the tree icons, the new StatusView rows, and the dedicated summary view, and that healthy storages are unchanged. pve-storage: Jakob Klocker (5): storage: drop unused variable in storage_info storage: add `plugin-url` to built-in plugins storage: add `unknown` flag to parse_config storage: plugins: cache and classify custom storage plugins storage: expose plugin metadata in storage status src/PVE/API2/Storage/Status.pm | 39 +++++ src/PVE/Storage.pm | 248 +++++++++++++++++++++++---- src/PVE/Storage/BTRFSPlugin.pm | 1 + src/PVE/Storage/CIFSPlugin.pm | 1 + src/PVE/Storage/CephFSPlugin.pm | 1 + src/PVE/Storage/DirPlugin.pm | 1 + src/PVE/Storage/ISCSIDirectPlugin.pm | 1 + src/PVE/Storage/ISCSIPlugin.pm | 1 + src/PVE/Storage/LVMPlugin.pm | 1 + src/PVE/Storage/LvmThinPlugin.pm | 1 + src/PVE/Storage/NFSPlugin.pm | 1 + src/PVE/Storage/PBSPlugin.pm | 1 + src/PVE/Storage/Plugin.pm | 4 +- src/PVE/Storage/RBDPlugin.pm | 1 + src/PVE/Storage/ZFSPlugin.pm | 1 + src/PVE/Storage/ZFSPoolPlugin.pm | 1 + 16 files changed, 264 insertions(+), 40 deletions(-) pve-manager: Jakob Klocker (4): cluster: backend: include storages with unloadable plugins www: storage: show plugin state/external/url in StatusView www: storage: distinguish failed/outdated storage plugins in resource tree www: storage: display custom summary for failed plugins PVE/API2/Cluster.pm | 51 ++++++++++++- PVE/API2Tools.pm | 6 ++ www/manager6/Makefile | 1 + www/manager6/Utils.js | 72 ++++++++++++++++++ www/manager6/storage/Browser.js | 33 ++++++--- www/manager6/storage/PluginError.js | 111 ++++++++++++++++++++++++++++ www/manager6/storage/StatusView.js | 38 +++++++++- 7 files changed, 300 insertions(+), 12 deletions(-) create mode 100644 www/manager6/storage/PluginError.js Summary over all repositories: 23 files changed, 564 insertions(+), 52 deletions(-) -- Generated by murpp 0.12.0