public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
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 >>> > >





      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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal