public inbox for pve-devel@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 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