From: "Max R. Carrara" <m.carrara@proxmox.com>
To: "Andrei Perepiolkin" <andrei.perepiolkin@open-e.com>,
<pve-devel@lists.proxmox.com>
Subject: Re: [pve-devel] [RFC pve-storage/proxmox-widget-toolkit/pve-manager master v2 00/10] GUI Support for Custom Storage Plugins
Date: Thu, 19 Mar 2026 11:46:08 +0100 [thread overview]
Message-ID: <DH6P5L0I5WAV.3F4TIEU9SLL6R@proxmox.com> (raw)
In-Reply-To: <32e444a7-f273-4b3d-b91c-c76c1828d86d@open-e.com>
On Tue Feb 10, 2026 at 9:57 PM CET, Andrei Perepiolkin wrote:
> Hi Max,
>
>
> I finally got myself to test code and Im stuck on making deb packages:
>
> For pve-storage error looks like:
>
Hi Andrei,
sorry for the late reply -- seems like you'll need a lot of our other
packages installed on your system. In particular, the patches for
pve-manager depend on the patches made to libpve-storage-perl. Since we
have tests that run during package builds, generate docs, generate
completions for bash and zsh, etc. you get these errors.
So, since there's a version break, you'll need to install the newly
built version of libpve-storage-perl first before building pve-manager.
The simplest way around this would probably be to build this in a VM
where you have Proxmox VE with the latest packages installed: Build
libpve-storage-perl on there first, install it, and then build
pve-manager.
There are other ways to build this too, like in a Debian container for
example, but that isn't as straightforward as just putting it all into a
VM.
That being said, perhaps we can pass through the PERL5LIB env var or
something in the future, to make builds a little easier. (Or add a flag
to disable generating bash / zsh completions and the like. *gestures
vaguely*)
Hope this helps! Let me know if there's anything else I can help you
with.
PS: The patches should hopefully still apply; otherwise, just let me
know and I'll rebase them ASAP.
> ........
>
> make[3]: Entering directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0/PVE'
> make[3]: Nothing to be done for 'clean'.
> make[3]: Leaving directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0/PVE'
> make -C udev-rbd clean
> make[3]: Entering directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0/udev-rbd'
> make[3]: Nothing to be done for 'clean'.
> make[3]: Leaving directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0/udev-rbd'
> make[2]: Leaving directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0'
> dh_clean
> make[1]: Leaving directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0'
> debian/rules binary
> make[1]: Entering directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0'
> dh binary
> dh_update_autotools_config
> dh_autoreconf
> dh_auto_configure
> dh_auto_build
> make -j16 "INSTALL=install --strip-program=true"
> make[2]: Entering directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0'
> make[2]: Nothing to be done for 'all'.
> make[2]: Leaving directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0'
> dh_auto_test
> make -j16 test
> make[2]: Entering directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0'
> perl -I. -T -e "use PVE::CLI::pvesm; PVE::CLI::pvesm->verify_api();"
> 400 internal error - unable to verify schema
> properties.control_port.type: value 'int' does not have a value in the
> enumeration 'string, object, coderef, array, boolean, number, integer,
> null, any'
> properties.data_port.type: value 'int' does not have a value in the
> enumeration 'string, object, coderef, array, boolean, number, integer,
> null, any'
> properties.luns_per_target.type: value 'int' does not have a value in
> the enumeration 'string, object, coderef, array, boolean, number,
> integer, null, any'
> make[2]: *** [Makefile:16: test] Error 255
> make[2]: Leaving directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0'
> dh_auto_test: error: make -j16 test returned exit code 2
> make[1]: *** [debian/rules:13: binary] Error 255
> make[1]: Leaving directory
> '/root/build/pve-storage/libpve-storage-perl-9.1.0'
> dpkg-buildpackage: error: debian/rules binary subprocess returned exit
> status 2
> make: *** [Makefile:31: libpve-storage-perl_9.1.0_all.deb] Error 2
>
>
>
> For pve-manager:
>
> .....
>
> test -z "${PVE_DOC_INSTANTVIEW}" || man -l pvesr.1
> Note: Writing pvenode.1
> test -z "${PVE_DOC_INSTANTVIEW}" || man -l pvenode.1
> Can't locate PVE/API2/Plugins/Storage.pm in @INC (you may need to
> install the PVE::API2::Plugins::Storage module) (@INC entries checked:
> .. . /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.40.1
> /usr/local/share/perl/5.40.1 /usr/lib/x86_64-linux-gnu/perl5/5.40
> /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base
> /usr/lib/x86_64-linux-gnu/perl/5.40 /usr/share/perl/5.40
> /usr/local/lib/site_perl) at ../PVE/API2/Plugins.pm line 8.
> BEGIN failed--compilation aborted at ../PVE/API2/Plugins.pm line 8.
> Compilation failed in require at ../PVE/API2.pm line 20.
> BEGIN failed--compilation aborted at ../PVE/API2.pm line 20.
> Compilation failed in require at ../PVE/Service/pveproxy.pm line 13.
> BEGIN failed--compilation aborted at ../PVE/Service/pveproxy.pm line 13.
> Compilation failed in require at -e line 1.
> BEGIN failed--compilation aborted at -e line 1.
> Can't locate PVE/API2/Plugins/Storage.pm in @INC (you may need to
> install the PVE::API2::Plugins::Storage module) (@INC entries checked:
> .. . /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.40.1
> /usr/local/share/perl/5.40.1 /usr/lib/x86_64-linux-gnu/perl5/5.40
> /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base
> /usr/lib/x86_64-linux-gnu/perl/5.40 /usr/share/perl/5.40
> /usr/local/lib/site_perl) at ../PVE/API2/Plugins.pm line 8.
> BEGIN failed--compilation aborted at ../PVE/API2/Plugins.pm line 8.
> Compilation failed in require at ../PVE/API2.pm line 20.
> BEGIN failed--compilation aborted at ../PVE/API2.pm line 20.
> Compilation failed in require at ../PVE/CLI/pvesh.pm line 16.
> BEGIN failed--compilation aborted at ../PVE/CLI/pvesh.pm line 16.
> Compilation failed in require at -e line 1.
> BEGIN failed--compilation aborted at -e line 1.
> make[3]: *** [/usr/share/pve-doc-generator/pve-doc-generator.mk:38:
> pveproxy.8-synopsis.adoc] Error 2
> make[3]: *** Waiting for unfinished jobs....
> make[3]: *** [/usr/share/pve-doc-generator/pve-doc-generator.mk:34:
> pvesh.1-synopsis.adoc] Error 2
> Note: Writing vzdump.1
> test -z "${PVE_DOC_INSTANTVIEW}" || man -l vzdump.1
> Can't locate PVE/API2/Plugins/Storage.pm in @INC (you may need to
> install the PVE::API2::Plugins::Storage module) (@INC entries checked:
> .. . /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.40.1
> /usr/local/share/perl/5.40.1 /usr/lib/x86_64-linux-gnu/perl5/5.40
> /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base
> /usr/lib/x86_64-linux-gnu/perl/5.40 /usr/share/perl/5.40
> /usr/local/lib/site_perl) at ../PVE/API2/Plugins.pm line 8.
> BEGIN failed--compilation aborted at ../PVE/API2/Plugins.pm line 8.
> Compilation failed in require at ../PVE/API2.pm line 20.
> BEGIN failed--compilation aborted at ../PVE/API2.pm line 20.
> Compilation failed in require at ../PVE/Service/pvedaemon.pm line 8.
> BEGIN failed--compilation aborted at ../PVE/Service/pvedaemon.pm line 8.
> Compilation failed in require at -e line 1.
> BEGIN failed--compilation aborted at -e line 1.
> make[3]: *** [/usr/share/pve-doc-generator/pve-doc-generator.mk:38:
> pvedaemon.8-synopsis.adoc] Error 2
> Note: Writing pveceph.1
> test -z "${PVE_DOC_INSTANTVIEW}" || man -l pveceph.1
> make[3]: Leaving directory '/root/build/pve-manager/pve-manager-9.1.5/bin'
> make[2]: *** [Makefile:16: all] Error 2
> make[2]: Leaving directory '/root/build/pve-manager/pve-manager-9.1.5'
> dh_auto_build: error: make -j16 "INSTALL=install --strip-program=true"
> returned exit code 2
> make[1]: *** [debian/rules:7: build] Error 2
> make[1]: Leaving directory '/root/build/pve-manager/pve-manager-9.1.5'
> dpkg-buildpackage: error: debian/rules build subprocess returned exit
> status 2
> make: *** [Makefile:42: pve-manager_9.1.5_all.deb] Error 2
>
>
>
> I've managed to make deb package for proxmox-widget-toolkit.
>
> My strategy is to:
> 1. apply your patches to code in repositories
> 2. make deb packages
> 3. install deb packages on system and test it
>
> May be you can recommend something or point me to the guide regarding
> making deb packages with applied patches.
> Ive installed dev repositories according to
> https://pve.proxmox.com/wiki/Developer_Documentation
>
> But I think Im mising something related to linkage or something else
>
> Im building packages on proxmox 9.1 updated to 9.5
>
>
> Best regards,
>
> Andrei
>
> On 1/9/26 04:19, Max R. Carrara wrote:
> > On Thu Jan 8, 2026 at 11:48 PM CET, Andrei Perepiolkin wrote: >> Hi Max, >> >> >> I like your idea of extending Proxmox with the
> capability to >> render a UI for adding and editing custom storage
> plugins. >> >> I'm curious — was your patch approved or merged? >> >> >>
> Best regards, >> >> Andrei Perepiolkin > > Hello Andrei! > > I'm very
> glad you like it! The RFC is still awaiting comments / > feedback /
> review, mostly because it is / was holiday season. > > However, if you'd
> like to see this merged or iterated on faster, I'd > highly appreciate
> any feedback and/or testing! :) > > If you want to try it out for
> yourself, let me know if you need any > help applying or building the
> patches. It should work with any third- > party plugin out of the box,
> including yours. > > Best regards, Max > >> >> On 11/21/25 11:58, Max R.
> Carrara wrote: >>> GUI Support for Custom Storage Plugins - v2 >>>
> =========================================== >>> >>> This is a complete
> refresh of my previous RFC that aims to be >>> much less greenfield-y
> and instead tries to reuse as much >>> existing code as possible while
> remaining as forward-compatible >>> as possible. >>> >>> Normally I
> would provide a more detailed changelog under each >>> patch, but since
> so much has changed since rfc-v1, I'll instead >>> sum up the biggest
> changes here: >>> >>> - The API routes are changed to be a little more
> flexible—routes >>> regarding views etc. are completely omitted. See
> patches #01 and >>> #08 for more information. >>> >>> - The schemas of
> plugins are returned as part of their metadata. >>> A "schema" for a
> storage plugin in this context is simply a >>> hashmap consisting of the
> plugin's properties' JSON schemas. See >>> patch #02 for a complete and
> detailed explanation. >>> >>> - Existing UI code concerned with building
> the fields of ACME >>> DNS challenge plugins is factored out, made more
> generic and >>> also receives some additional features so that it can be
> used in >>> different places. See patches #05 and #06 for details. >>>
> >>> - Instead of making separate versions of all of the storage- >>>
> related UI components (panels etc.), only one new input panel is >>>
> added, while the remaining necessary functionality is integrated >>>
> into the existing code. See patch #09 for further details. >>> >>> >>>
> The Result ---------- >>> >>> Instead of having to provide a separate
> "view definition", >>> storage entries for custom storage plugins can
> now be created >>> and edited in the UI *without* needing to provide any
> extra UI / >>> layouting hints. >>> >>> So, if one now installs
> something like the SSHFS example plugin >>> [sshfs-plugin], the
> resulting UI is about ~80% there in terms of >>> look and feel compared
> to the forms of built-in plugins: >>> >>> - Default values are displayed
> as grey text inside fields - >>> Descriptions of properties are provided
> as little pop-up quips >>> when hovering over a field - "fixed"
> properties are >>> automatically taken into account and made read-only
> when editing >>> a storage entry - "sensitive" properties are
> automatically >>> treated as password fields - Optional / non-optional
> properties >>> are handled - The min- / maxLength of strings and the
> min- / >>> maximum of numeric fields is taken into account in the UI -
> The >>> "Backup Retention" tab is automatically masked / unmasked >>>
> depending on whether the storage plugin supports backups or not >>> >>>
> This is mostly everything that I managed to squeeze out of the >>>
> existing SectionConfig schemas / data. >>> >>> Additionally, something
> that's neat is that the `title` key of >>> every property is now used as
> its field's label in the UI. That >>> means we can provide labels for
> all of our built-in properties >>> while third-party developers may
> provide theirs for their own >>> properties. As a quick example, this is
> what that would look >>> like for the SSHFS plugin [sshfs-plugin]: >>>
> >>> sub properties { return { 'remote-path' => { description => >>>
> "Path on the remote filesystem used for SSHFS. Must be >>> absolute.",
> type => 'string', format => 'pve-storage-path', >>> title => 'Remote
> Path', }, 'sshfs-private-key' => { description >>> => "The private key
> to use for SSHFS.", type => 'string', title >>> => 'Private Key', }, };
> } >>> >>> >>> This becomes even more flexible for third-party devs once
> we >>> switch over to property isolation—something the code in this RFC
> >>> should be 100% forward-compatible with. Then they wouldn't be >>>
> bound to our provided labels. >>> >>> In terms of overall looks, the
> remaining 20% consist of some >>> polish on the frontend for the most
> part, but honestly, that can >>> be done once this RFC becomes an actual
> series. I felt that this >>> was in an adequate enough state to publish
> for now—please let me >>> know what you think if you give this RFC a
> spin, I'd appreciate >>> it! >>> >>> Previous Versions -----------------
> >>> >>> rfc-v1: https://lore.proxmox.com/pve- >>>
> devel/20250908180058.530119-1-m.carrara@proxmox.com/ >>> >>> References
> ---------- >>> >>> [sshfs-plugin]:
> https://git.proxmox.com/?p=pve-storage-plugin- >>>
> examples.git;a=tree;f=plugin- >>>
> sshfs;h=c7543808f7226209650d1b8b6e449392bc1f0d2d;hb=refs/heads/ >>>
> master >>> >>> Summary of Changes ------------------ >>> >>>
> pve-storage: >>> >>> Max R. Carrara (5): 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 >>> >>> 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 >>>
> +++++++++++++++++++++++++ 5 files changed, 253 insertions(+) >>> 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 (2): utils: introduce helper function >>>
> getFieldDefFromPropertySchema acme: use helper to construct >>> ExtJS
> fields from property schemas >>> >>> src/Utils.js | 106
> ++++++++++++++++++++++++++++++ >>> +++++ src/window/ACMEPluginEdit.js |
> 42 +++++--------- 2 files >>> changed, 119 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 | 1 +
> www/manager6/storage/CustomEdit.js | 110 ++ >>> ++++++++++++++++++++++ 7
> files changed, 278 insertions(+), 34 >>> deletions(-) create mode 100644
> PVE/API2/Plugins.pm create mode >>> 100644
> www/manager6/storage/CustomEdit.js >>> > >
prev parent reply other threads:[~2026-03-19 10:46 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-21 16:58 Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC pve-storage master v2 1/10] api: plugins/storage: add initial routes and endpoints Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC pve-storage master v2 2/10] api: plugins/storage/plugin: include schema in plugin metadata Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC pve-storage master v2 3/10] api: plugins/storage/plugin: mark sensitive properties in schema Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC pve-storage master v2 4/10] api: plugins/storage/plugin: factor plugin metadata code into helper Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC pve-storage master v2 5/10] api: plugins/storage/plugin: add plugins' 'content' to their metadata Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC proxmox-widget-toolkit master v2 6/10] utils: introduce helper function getFieldDefFromPropertySchema Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC proxmox-widget-toolkit master v2 7/10] acme: use helper to construct ExtJS fields from property schemas Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC pve-manager master v2 08/10] api: add API routes 'plugins' and 'plugins/storage' Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC pve-manager master v2 09/10] ui: storage view: display error when no editor for storage type exists Max R. Carrara
2025-11-21 16:58 ` [pve-devel] [RFC pve-manager master v2 10/10] ui: storage: add basic UI integration for custom storage plugins Max R. Carrara
2026-01-08 22:48 ` [pve-devel] [RFC pve-storage/proxmox-widget-toolkit/pve-manager master v2 00/10] GUI Support for Custom Storage Plugins Andrei Perepiolkin via pve-devel
[not found] ` <de8deeff-b3d7-447b-8647-555dc058e10b@open-e.com>
2026-01-09 9:19 ` Max R. Carrara
2026-02-10 20:57 ` Andrei Perepiolkin
2026-03-19 10:46 ` Max R. Carrara [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DH6P5L0I5WAV.3F4TIEU9SLL6R@proxmox.com \
--to=m.carrara@proxmox.com \
--cc=andrei.perepiolkin@open-e.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.