From: Andrei Perepiolkin <andrei.perepiolkin@open-e.com>
To: "Max R. Carrara" <m.carrara@proxmox.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: Tue, 10 Feb 2026 15:57:46 -0500 [thread overview]
Message-ID: <32e444a7-f273-4b3d-b91c-c76c1828d86d@open-e.com> (raw)
In-Reply-To: <DFJY3XE0PWEX.29JFVO9N9OLED@proxmox.com>
Hi Max,
I finally got myself to test code and Im stuck on making deb packages:
For pve-storage error looks like:
........
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-02-10 21:02 UTC|newest]
Thread overview: 14+ 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 [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=32e444a7-f273-4b3d-b91c-c76c1828d86d@open-e.com \
--to=andrei.perepiolkin@open-e.com \
--cc=m.carrara@proxmox.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