From: Joaquin Varela <joaquinvarela@neatech.ar>
To: pve-devel@lists.proxmox.com
Cc: Joaquin Varela <joaquinvarela@neatech.ar>
Subject: [PATCH manager v2 1/3] ui: add ZFS over NVMe/TCP storage editor
Date: Sun, 2 Aug 2026 00:35:32 -0300 [thread overview]
Message-ID: <c5bb1ab9123978fa831480b626f5eeeea46be0ea.1785636980.git.joaquinvarela@neatech.ar> (raw)
In-Reply-To: <cover.1785636980.git.joaquinvarela@neatech.ar>
Register the zfsnvme storage type and add an ExtJS editor for
its ZFS, NVMe/TCP, native multipath and DH-HMAC-CHAP properties.
Keep immutable target identity fields read-only after creation.
Expose portal-to-interface ordering so all cluster nodes use the
intended independent data paths.
Signed-off-by: Joaquin Varela <joaquinvarela@neatech.ar>
---
www/manager6/Makefile | 1 +
www/manager6/Utils.js | 6 ++
www/manager6/storage/ZFSNVMeEdit.js | 148 ++++++++++++++++++++++++++++
3 files changed, 155 insertions(+)
create mode 100644 www/manager6/storage/ZFSNVMeEdit.js
diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index eb0e9d9c..a93eb57b 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -375,6 +375,7 @@ JSSRC= \
storage/Summary.js \
storage/TemplateView.js \
storage/ZFSEdit.js \
+ storage/ZFSNVMeEdit.js \
storage/ZFSPoolEdit.js \
storage/ESXIEdit.js \
Workspace.js \
diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js
index 040b5ae0..82b9ecae 100644
--- a/www/manager6/Utils.js
+++ b/www/manager6/Utils.js
@@ -880,6 +880,12 @@ Ext.define('PVE.Utils', {
faIcon: 'building',
backups: false,
},
+ zfsnvme: {
+ name: 'ZFS over NVMe/TCP',
+ ipanel: 'ZFSNVMeInputPanel',
+ faIcon: 'building',
+ backups: false,
+ },
zfspool: {
name: 'ZFS',
ipanel: 'ZFSPoolInputPanel',
diff --git a/www/manager6/storage/ZFSNVMeEdit.js b/www/manager6/storage/ZFSNVMeEdit.js
new file mode 100644
index 00000000..db6e559f
--- /dev/null
+++ b/www/manager6/storage/ZFSNVMeEdit.js
@@ -0,0 +1,148 @@
+Ext.define('PVE.storage.ZFSNVMeInputPanel', {
+ extend: 'PVE.panel.StorageBase',
+
+ onlineHelp: 'storage_zfsnvme',
+
+ onGetValues: function (values) {
+ if (this.isCreate) {
+ values.content = 'images';
+ }
+ return this.callParent([values]);
+ },
+
+ initComponent: function () {
+ let me = this;
+
+ me.type = 'zfsnvme';
+
+ me.column1 = [
+ {
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
+ name: 'server',
+ fieldLabel: gettext('SSH Server'),
+ allowBlank: false,
+ },
+ {
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
+ name: 'pool',
+ fieldLabel: gettext('ZFS Pool'),
+ emptyText: 'tank/pve-nvme',
+ allowBlank: false,
+ },
+ {
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
+ name: 'subsysnqn',
+ fieldLabel: gettext('Subsystem NQN'),
+ emptyText: 'nqn.2026-07.example:pve-storage',
+ allowBlank: false,
+ },
+ {
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
+ name: 'blocksize',
+ value: '16k',
+ fieldLabel: gettext('Block Size'),
+ validator: PVE.Utils.validateZfsBlocksize,
+ allowBlank: false,
+ },
+ {
+ xtype: 'proxmoxcheckbox',
+ name: 'sparse',
+ checked: true,
+ uncheckedValue: 0,
+ fieldLabel: gettext('Thin provision'),
+ },
+ ];
+
+ me.column2 = [
+ {
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
+ name: 'nvme-portals',
+ fieldLabel: gettext('NVMe/TCP Portals'),
+ emptyText: '10.90.1.11:4420,10.90.2.11:4420',
+ allowBlank: false,
+ },
+ {
+ xtype: 'textfield',
+ name: 'nvme-host-ifaces',
+ fieldLabel: gettext('Host Interfaces'),
+ emptyText: 'ens20,ens21',
+ allowBlank: false,
+ },
+ {
+ xtype: me.isCreate ? 'textfield' : 'displayfield',
+ inputType: me.isCreate ? 'password' : 'text',
+ name: 'dhchap-key',
+ value: me.isCreate ? '' : gettext('Configured'),
+ submitValue: me.isCreate,
+ fieldLabel: gettext('DHCHAP Key'),
+ allowBlank: !me.isCreate,
+ },
+ {
+ xtype: 'proxmoxKVComboBox',
+ name: 'nvme-iopolicy',
+ value: 'round-robin',
+ fieldLabel: gettext('I/O Policy'),
+ comboItems: [
+ ['round-robin', 'round-robin'],
+ ['queue-depth', 'queue-depth'],
+ ['numa', 'numa'],
+ ],
+ allowBlank: false,
+ },
+ ];
+
+ me.advancedColumn1 = [
+ {
+ xtype: 'proxmoxintegerfield',
+ name: 'nvme-keep-alive-tmo',
+ value: 5,
+ minValue: 1,
+ maxValue: 120,
+ fieldLabel: gettext('Keep Alive Timeout'),
+ allowBlank: false,
+ },
+ {
+ xtype: 'proxmoxintegerfield',
+ name: 'nvme-reconnect-delay',
+ value: 2,
+ minValue: 1,
+ maxValue: 120,
+ fieldLabel: gettext('Reconnect Delay'),
+ allowBlank: false,
+ },
+ ];
+
+ me.advancedColumn2 = [
+ {
+ xtype: 'proxmoxintegerfield',
+ name: 'nvme-ctrl-loss-tmo',
+ value: 600,
+ minValue: -1,
+ maxValue: 86400,
+ fieldLabel: gettext('Controller Loss Timeout'),
+ allowBlank: false,
+ },
+ {
+ xtype: 'proxmoxintegerfield',
+ name: 'nvme-nr-io-queues',
+ minValue: 1,
+ maxValue: 1024,
+ fieldLabel: gettext('I/O Queues'),
+ deleteEmpty: !me.isCreate,
+ allowBlank: true,
+ },
+ ];
+
+ me.columnB = [
+ {
+ xtype: 'displayfield',
+ userCls: 'pmx-hint',
+ value: gettext(
+ 'Host interface names are matched to portals by position and must exist on every selected node.',
+ ),
+ },
+ ];
+
+ me.callParent();
+ },
+});
--
2.54.0.windows.1
next prev parent reply other threads:[~2026-08-02 3:36 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-02 3:35 [PATCH manager v2 0/3] add ZFS over NVMe/TCP storage editor Joaquin Varela
2026-08-02 3:35 ` Joaquin Varela [this message]
2026-08-02 3:35 ` [PATCH manager v2 2/3] ui: expose NVMe fast I/O fail policy Joaquin Varela
2026-08-02 3:35 ` [PATCH manager v2 3/3] ui: configure zfsnvme host NQN allow-list Joaquin Varela
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=c5bb1ab9123978fa831480b626f5eeeea46be0ea.1785636980.git.joaquinvarela@neatech.ar \
--to=joaquinvarela@neatech.ar \
--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.