From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 459841FF146 for ; Tue, 23 Jun 2026 16:34:53 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 35EB7379D; Tue, 23 Jun 2026 16:34:42 +0200 (CEST) From: "Max R. Carrara" To: pve-devel@lists.proxmox.com Subject: [PATCH common/manager/proxmox-widget-toolkit/storage 00/13] GUI Support for Custom Storage Plugins Date: Tue, 23 Jun 2026 16:33:17 +0200 Message-ID: <20260623143402.772452-1-m.carrara@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-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1782225231104 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.080 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: 4RZWWMLVBJVU7G3T4A7LZ2M5LJRW55E2 X-Message-ID-Hash: 4RZWWMLVBJVU7G3T4A7LZ2M5LJRW55E2 X-MailFrom: m.carrara@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 X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: GUI Support for Custom Storage Plugins ====================================== This series builds upon my previous RFC (see below), with some issues fixed and some further improvements made. The RFC status is dropped, rerolling this series as a proper v1. Big thanks to @Daniel H. for testing the RFC v2 and providing feedback! tl;dr: Integrate custom storage plugins into our web UI by deriving ExtJS field definitions from our SectionConfig JSON schema. JSON schema keys are converted into ExtJS field attributes in the front end. Notable Changes Since rfc-v2 ---------------------------- - Rebase on master - Add a new "multiline" format in pve-common that prevents strings with line breaks from being folded (thanks @Daniel H. for spotting this!) - Add 'title' keys to every inbuilt property and adapt some properties' descriptions (see patch #07 for the details) - Add a new 'proxmoxtextarea' field in the widget toolkit (see patch #08) --> If a property has the "multiline" format, this field is used instead the one matching its type - Use some of our custom ExtJS fields for the inbuilt 'content', 'preallocation' and 'snapshot-as-volume-chain' properties - Refrain from exposing properties in the UI that are exposed for any inbuilt storage types (in order to remain consistent) - As with inbuilt plugins, make 'preallocation' and 'snapshot-as-volume-chain' properties advanced fields --> The tech-preview hint for the SAVC property is also added if a plugin uses that property - If any field uses some kind of textarea field (such as "multiline" format properties), put those fields into the wide column at the bottom of the editing window instead - If no `title` key is provided in a given plugin's schema, transform its property name into title case instead, e.g. "foo_bar" --> "Foo Bar", "foo-bar" --> "Foo Bar" Overall, this results in a lot more polish. Testing would be much appreciated -- any custom plugin should work out of the box with this series. If you need prebuilt packages, holler at me! :) Previous Versions ----------------- rfc-v1: https://lore.proxmox.com/pve-devel/20250908180058.530119-1-m.carrara@proxmox.com/ rfc-v2: https://lore.proxmox.com/pve-devel/20251121165858.818307-1-m.carrara@proxmox.com/ Summary of Changes ------------------ pve-common: Max R. Carrara (1): json schema: add multiline string format src/PVE/JSONSchema.pm | 5 +++++ 1 file changed, 5 insertions(+) pve-storage: Max R. Carrara (6): api: plugins/storage: add initial routes and endpoints api: plugins/storage/plugin: include schema in plugin metadata api: plugins/storage/plugin: mark sensitive properties in schema api: plugins/storage/plugin: factor plugin metadata code into helper api: plugins/storage/plugin: add plugins' 'content' to their metadata all plugins: add 'title' to properties, adapt 'description's src/PVE/API2/Makefile | 1 + src/PVE/API2/Plugins/Makefile | 18 +++ src/PVE/API2/Plugins/Storage.pm | 54 ++++++++ src/PVE/API2/Plugins/Storage/Makefile | 17 +++ src/PVE/API2/Plugins/Storage/Plugin.pm | 163 +++++++++++++++++++++++++ src/PVE/Storage/BTRFSPlugin.pm | 1 + src/PVE/Storage/CIFSPlugin.pm | 10 +- src/PVE/Storage/CephFSPlugin.pm | 6 +- src/PVE/Storage/DirPlugin.pm | 11 +- src/PVE/Storage/ESXiPlugin.pm | 1 + src/PVE/Storage/ISCSIPlugin.pm | 6 +- src/PVE/Storage/LVMPlugin.pm | 10 +- src/PVE/Storage/LvmThinPlugin.pm | 3 +- src/PVE/Storage/NFSPlugin.pm | 6 +- src/PVE/Storage/PBSPlugin.pm | 5 +- src/PVE/Storage/Plugin.pm | 46 +++++-- src/PVE/Storage/RBDPlugin.pm | 16 ++- src/PVE/Storage/ZFSPlugin.pm | 16 ++- src/PVE/Storage/ZFSPoolPlugin.pm | 9 +- 19 files changed, 362 insertions(+), 37 deletions(-) create mode 100644 src/PVE/API2/Plugins/Makefile create mode 100644 src/PVE/API2/Plugins/Storage.pm create mode 100644 src/PVE/API2/Plugins/Storage/Makefile create mode 100644 src/PVE/API2/Plugins/Storage/Plugin.pm proxmox-widget-toolkit: Max R. Carrara (3): form: introduce new 'proxmoxtextarea' field utils: introduce helper function getFieldDefFromPropertySchema acme: use helper to construct ExtJS fields from property schemas src/Utils.js | 150 +++++++++++++++++++++++++++++++++++ src/form/TextAreaField.js | 47 +++++++++++ src/window/ACMEPluginEdit.js | 42 +++------- 3 files changed, 210 insertions(+), 29 deletions(-) pve-manager: Max R. Carrara (3): api: add API routes 'plugins' and 'plugins/storage' ui: storage view: display error when no editor for storage type exists ui: storage: add basic UI integration for custom storage plugins PVE/API2.pm | 6 + PVE/API2/Makefile | 1 + PVE/API2/Plugins.pm | 61 +++++++++ www/manager6/Makefile | 1 + www/manager6/dc/StorageView.js | 132 +++++++++++++----- www/manager6/storage/Base.js | 2 + www/manager6/storage/CustomEdit.js | 208 +++++++++++++++++++++++++++++ 7 files changed, 377 insertions(+), 34 deletions(-) create mode 100644 PVE/API2/Plugins.pm create mode 100644 www/manager6/storage/CustomEdit.js Summary over all repositories: 30 files changed, 954 insertions(+), 100 deletions(-) -- Generated by murpp 0.11.0