all lists on lists.proxmox.com
 help / color / mirror / Atom feed
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




  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.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal