From: "Max R. Carrara" <m.carrara@proxmox.com>
To: pve-devel@lists.proxmox.com
Cc: Alfonso Kuen <gerencia@idkmanager.com>,
Thomas Ellmenreich <t.ellmenreich@proxmox.com>,
Jakob Klocker <j.klocker@proxmox.com>
Subject: [PATCH pve-storage v4 09/17] all plugins, api: mark certain properties as hidden in plugindata()
Date: Fri, 6 Nov 2026 16:45:45 +0100 [thread overview]
Message-ID: <20261106154554.2182986-10-m.carrara@proxmox.com> (raw)
In-Reply-To: <20261106154554.2182986-1-m.carrara@proxmox.com>
As done with 'advanced-properties', add a new 'hidden-properties' hash
in `plugindata()` of all plugins. For each plugin, mark the properties
that are *not* visible / used anywhere in the create / edit panel in
the UI in that hash.
This results in the following properties being marked as hidden if
they do appear in a given plugin's `properties()` or `options()`:
- bwlimit
- create-base-path
- create-subdirs
- content-dirs
- format
Properties that the UI of a built-in plugin simply does not offer yet
are not marked.
Additionally, expose whether a property is hidden or not through a
new 'x-hidden' key that is added to each plugin property schema that
is returned by the `plugins/storage/plugin` endpoint.
The key is always set to either 0 or 1, also for plugins without the
hash.
Signed-off-by: Max R. Carrara <m.carrara@proxmox.com>
---
src/PVE/API2/Plugins/Storage/Plugin.pm | 2 ++
src/PVE/Storage/BTRFSPlugin.pm | 5 +++++
src/PVE/Storage/CIFSPlugin.pm | 7 +++++++
src/PVE/Storage/CephFSPlugin.pm | 7 +++++++
src/PVE/Storage/DirPlugin.pm | 7 +++++++
src/PVE/Storage/ESXiPlugin.pm | 1 +
src/PVE/Storage/ISCSIDirectPlugin.pm | 3 +++
src/PVE/Storage/ISCSIPlugin.pm | 3 +++
src/PVE/Storage/LVMPlugin.pm | 3 +++
src/PVE/Storage/LvmThinPlugin.pm | 3 +++
src/PVE/Storage/NFSPlugin.pm | 7 +++++++
src/PVE/Storage/PBSPlugin.pm | 1 +
src/PVE/Storage/RBDPlugin.pm | 3 +++
src/PVE/Storage/ZFSPlugin.pm | 3 +++
src/PVE/Storage/ZFSPoolPlugin.pm | 3 +++
15 files changed, 58 insertions(+)
diff --git a/src/PVE/API2/Plugins/Storage/Plugin.pm b/src/PVE/API2/Plugins/Storage/Plugin.pm
index 33efc138..72b176ff 100644
--- a/src/PVE/API2/Plugins/Storage/Plugin.pm
+++ b/src/PVE/API2/Plugins/Storage/Plugin.pm
@@ -64,21 +64,23 @@ my sub get_schema_for_plugin : prototype($) ($plugin) {
my $options = $plugin->options();
# also covers the fallback for plugins without 'sensitive-properties' in their plugindata()
my $sensitive = { map { $_ => 1 } PVE::Storage::Plugin::sensitive_properties($type)->@* };
my $advanced = $plugin->plugindata()->{'advanced-properties'} // {};
+ my $hidden = $plugin->plugindata()->{'hidden-properties'} // {};
my $schema = {};
$PLUGIN_SCHEMAS->{$type} = $schema;
for my $option (keys $options->%*) {
my $prop_schema = PVE::RESTHandler::api_dump_remove_refs(
PVE::Storage::Plugin->get_property_schema($type, $option));
# shallow copy
my $property = { $prop_schema->%* };
$property->{'x-advanced'} = $advanced->{$option} ? 1 : 0;
+ $property->{'x-hidden'} = $hidden->{$option} ? 1 : 0;
$property->{'x-sensitive'} = $sensitive->{$option} ? 1 : 0;
$schema->{$option} = $property;
for my $opt_key (keys $options->{$option}->%*) {
diff --git a/src/PVE/Storage/BTRFSPlugin.pm b/src/PVE/Storage/BTRFSPlugin.pm
index 0108e03d..bb3b29bb 100644
--- a/src/PVE/Storage/BTRFSPlugin.pm
+++ b/src/PVE/Storage/BTRFSPlugin.pm
@@ -46,10 +46,15 @@ sub plugindata {
],
format => [{ raw => 1, subvol => 1 }, 'raw'],
'advanced-properties' => {
preallocation => 1,
},
+ 'hidden-properties' => {
+ 'create-base-path' => 1,
+ 'create-subdirs' => 1,
+ format => 1,
+ },
'sensitive-properties' => {},
};
}
sub properties {
diff --git a/src/PVE/Storage/CIFSPlugin.pm b/src/PVE/Storage/CIFSPlugin.pm
index 5a04154a..6a428248 100644
--- a/src/PVE/Storage/CIFSPlugin.pm
+++ b/src/PVE/Storage/CIFSPlugin.pm
@@ -127,10 +127,17 @@ sub plugindata {
format => [{ raw => 1, qcow2 => 1, vmdk => 1 }, 'raw'],
'advanced-properties' => {
preallocation => 1,
'snapshot-as-volume-chain' => 1,
},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ 'create-base-path' => 1,
+ 'create-subdirs' => 1,
+ 'content-dirs' => 1,
+ format => 1,
+ },
'sensitive-properties' => { password => 1 },
};
}
sub properties {
diff --git a/src/PVE/Storage/CephFSPlugin.pm b/src/PVE/Storage/CephFSPlugin.pm
index 59cb57c3..01a73732 100644
--- a/src/PVE/Storage/CephFSPlugin.pm
+++ b/src/PVE/Storage/CephFSPlugin.pm
@@ -117,10 +117,17 @@ sub type {
sub plugindata {
return {
content =>
[{ vztmpl => 1, iso => 1, backup => 1, snippets => 1, import => 1 }, { backup => 1 }],
'advanced-properties' => {},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ 'create-base-path' => 1,
+ 'create-subdirs' => 1,
+ 'content-dirs' => 1,
+ format => 1,
+ },
'sensitive-properties' => { keyring => 1 },
};
}
sub properties {
diff --git a/src/PVE/Storage/DirPlugin.pm b/src/PVE/Storage/DirPlugin.pm
index 8e923077..a9240398 100644
--- a/src/PVE/Storage/DirPlugin.pm
+++ b/src/PVE/Storage/DirPlugin.pm
@@ -40,10 +40,17 @@ sub plugindata {
format => [{ raw => 1, qcow2 => 1, vmdk => 1, subvol => 1 }, 'raw'],
'advanced-properties' => {
preallocation => 1,
'snapshot-as-volume-chain' => 1,
},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ 'create-base-path' => 1,
+ 'create-subdirs' => 1,
+ 'content-dirs' => 1,
+ format => 1,
+ },
'sensitive-properties' => {},
};
}
sub properties {
diff --git a/src/PVE/Storage/ESXiPlugin.pm b/src/PVE/Storage/ESXiPlugin.pm
index 82f64650..d418fbd2 100644
--- a/src/PVE/Storage/ESXiPlugin.pm
+++ b/src/PVE/Storage/ESXiPlugin.pm
@@ -31,10 +31,11 @@ sub type {
sub plugindata {
return {
content => [{ import => 1 }, { import => 1 }],
format => [{ raw => 1, qcow2 => 1, vmdk => 1 }, 'raw'],
'advanced-properties' => {},
+ 'hidden-properties' => {},
'sensitive-properties' => { password => 1 },
};
}
sub properties {
diff --git a/src/PVE/Storage/ISCSIDirectPlugin.pm b/src/PVE/Storage/ISCSIDirectPlugin.pm
index 72bad793..65ae0ab8 100644
--- a/src/PVE/Storage/ISCSIDirectPlugin.pm
+++ b/src/PVE/Storage/ISCSIDirectPlugin.pm
@@ -65,10 +65,13 @@ sub type {
sub plugindata {
return {
content => [{ images => 1, none => 1 }, { images => 1 }],
select_existing => 1,
'advanced-properties' => {},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ },
'sensitive-properties' => {},
};
}
sub options {
diff --git a/src/PVE/Storage/ISCSIPlugin.pm b/src/PVE/Storage/ISCSIPlugin.pm
index 2f148935..4a632e09 100644
--- a/src/PVE/Storage/ISCSIPlugin.pm
+++ b/src/PVE/Storage/ISCSIPlugin.pm
@@ -349,10 +349,13 @@ sub type {
sub plugindata {
return {
content => [{ images => 1, none => 1 }, { images => 1 }],
select_existing => 1,
'advanced-properties' => {},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ },
'sensitive-properties' => {},
};
}
sub properties {
diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm
index 2619a7b9..e0204217 100644
--- a/src/PVE/Storage/LVMPlugin.pm
+++ b/src/PVE/Storage/LVMPlugin.pm
@@ -716,10 +716,13 @@ sub plugindata {
content => [{ images => 1, rootdir => 1 }, { images => 1 }],
format => [{ raw => 1, qcow2 => 1 }, 'raw'],
'advanced-properties' => {
'snapshot-as-volume-chain' => 1,
},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ },
'sensitive-properties' => {},
};
}
my $on_volume_remove_format = {
diff --git a/src/PVE/Storage/LvmThinPlugin.pm b/src/PVE/Storage/LvmThinPlugin.pm
index 7fed8af8..cc11dea8 100644
--- a/src/PVE/Storage/LvmThinPlugin.pm
+++ b/src/PVE/Storage/LvmThinPlugin.pm
@@ -35,10 +35,13 @@ sub type {
sub plugindata {
return {
content => [{ images => 1, rootdir => 1 }, { images => 1, rootdir => 1 }],
'advanced-properties' => {},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ },
'sensitive-properties' => {},
};
}
sub properties {
diff --git a/src/PVE/Storage/NFSPlugin.pm b/src/PVE/Storage/NFSPlugin.pm
index 85497df6..d4b086da 100644
--- a/src/PVE/Storage/NFSPlugin.pm
+++ b/src/PVE/Storage/NFSPlugin.pm
@@ -68,10 +68,17 @@ sub plugindata {
format => [{ raw => 1, qcow2 => 1, vmdk => 1 }, 'raw'],
'advanced-properties' => {
preallocation => 1,
'snapshot-as-volume-chain' => 1,
},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ 'create-base-path' => 1,
+ 'create-subdirs' => 1,
+ 'content-dirs' => 1,
+ format => 1,
+ },
'sensitive-properties' => {},
};
}
sub properties {
diff --git a/src/PVE/Storage/PBSPlugin.pm b/src/PVE/Storage/PBSPlugin.pm
index 83b6f89b..66372e54 100644
--- a/src/PVE/Storage/PBSPlugin.pm
+++ b/src/PVE/Storage/PBSPlugin.pm
@@ -30,10 +30,11 @@ sub type {
sub plugindata {
return {
content => [{ backup => 1, none => 1 }, { backup => 1 }],
'advanced-properties' => {},
+ 'hidden-properties' => {},
'sensitive-properties' => {
'encryption-key' => 1,
'master-pubkey' => 1,
password => 1,
},
diff --git a/src/PVE/Storage/RBDPlugin.pm b/src/PVE/Storage/RBDPlugin.pm
index 970358ca..c7aab835 100644
--- a/src/PVE/Storage/RBDPlugin.pm
+++ b/src/PVE/Storage/RBDPlugin.pm
@@ -415,10 +415,13 @@ sub type {
sub plugindata {
return {
content => [{ images => 1, rootdir => 1 }, { images => 1 }],
'advanced-properties' => {},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ },
'sensitive-properties' => { keyring => 1 },
};
}
sub properties {
diff --git a/src/PVE/Storage/ZFSPlugin.pm b/src/PVE/Storage/ZFSPlugin.pm
index 81923494..85137c39 100644
--- a/src/PVE/Storage/ZFSPlugin.pm
+++ b/src/PVE/Storage/ZFSPlugin.pm
@@ -193,10 +193,13 @@ sub type {
sub plugindata {
return {
content => [{ images => 1 }, { images => 1 }],
'advanced-properties' => {},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ },
'sensitive-properties' => {},
};
}
sub properties {
diff --git a/src/PVE/Storage/ZFSPoolPlugin.pm b/src/PVE/Storage/ZFSPoolPlugin.pm
index 522fee8b..7a7903bf 100644
--- a/src/PVE/Storage/ZFSPoolPlugin.pm
+++ b/src/PVE/Storage/ZFSPoolPlugin.pm
@@ -63,10 +63,13 @@ sub type {
sub plugindata {
return {
content => [{ images => 1, rootdir => 1 }, { images => 1, rootdir => 1 }],
format => [{ raw => 1, subvol => 1 }, 'raw'],
'advanced-properties' => {},
+ 'hidden-properties' => {
+ bwlimit => 1,
+ },
'sensitive-properties' => {},
};
}
sub properties {
--
2.47.3
next prev parent reply other threads:[~2026-11-06 15:47 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 15:45 [PATCH common/manager/proxmox-widget-toolkit/storage/storage-plugin-examples v4 00/17] GUI Support for Custom Storage Plugins Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-common v4 01/17] json schema: add multiline string format Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-storage v4 02/17] api: plugins/storage: add initial routes and endpoints Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-storage v4 03/17] api: plugins/storage/plugin: include schema in plugin metadata Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-storage v4 04/17] api: plugins/storage/plugin: mark sensitive properties in schema Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-storage v4 05/17] api: plugins/storage/plugin: factor plugin metadata code into helper Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-storage v4 06/17] api: plugins/storage/plugin: add plugins' 'content' to their metadata Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-storage v4 07/17] all plugins: add 'title' to properties, adapt 'description's Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-storage v4 08/17] all plugins, api: mark certain properties as advanced in plugindata() Max R. Carrara
2026-11-06 15:45 ` Max R. Carrara [this message]
2026-11-06 15:45 ` [PATCH proxmox-widget-toolkit v4 10/17] form: introduce new 'proxmoxtextarea' field Max R. Carrara
2026-11-06 15:45 ` [PATCH proxmox-widget-toolkit v4 11/17] utils: introduce helper function getFieldDefFromPropertySchema Max R. Carrara
2026-11-06 15:45 ` [PATCH proxmox-widget-toolkit v4 12/17] acme: use helper to construct ExtJS fields from property schemas Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-manager v4 13/17] api: sort modules and API method registrations Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-manager v4 14/17] api: add API routes 'plugins' and 'plugins/storage' Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-manager v4 15/17] ui: storage view: display error when no editor for storage type exists Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-manager v4 16/17] ui: storage: add basic UI integration for custom storage plugins Max R. Carrara
2026-11-06 15:45 ` [PATCH pve-storage-plugin-examples v4 17/17] sshfs: Update SSHFS plugin Max R. Carrara
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=20261106154554.2182986-10-m.carrara@proxmox.com \
--to=m.carrara@proxmox.com \
--cc=gerencia@idkmanager.com \
--cc=j.klocker@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
--cc=t.ellmenreich@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