public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs
@ 2022-09-30 12:38 Stefan Hrdlicka
  2022-09-30 12:38 ` [pve-devel] [PATCH V6 pve-manager 1/2] fix #2822: add iscsi, lvm, lvmthin & zfs storage for all cluster nodes Stefan Hrdlicka
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Stefan Hrdlicka @ 2022-09-30 12:38 UTC (permalink / raw)
  To: pve-devel

V1 -> V2:
# pve-storage
* removed because patch is not needed

# pve-manager (1/3)
* remove storage controller from V1
* added custom ComboBox with API URL & setNodeName function
* added scan node selection for iSCSI 
* scan node selection field no longer send to server

## (optional) pve-manager (2/3): cleanup related files
* var to let statement change
* some indentation

## ((very) optional) pve-manager (3/3): cleanup all var statements
* replaces all var with let statements


V2 -> V3:
# pve-manager (1/2)
* fix broken interface (broken in V2  )
* improve tooltip
* replace jNodeSelector function with class object
  (PVE.panel.StorageBaseWithNodeSelector)

# other things:
* removed very optional cleanup
* nothing changed for "Base storage" selector. It is still possible to
  select for example an iSCSI device only availabe on one node that
  isn't availabe on the other ones. I wasn't sure if this should be
  changed in this context as well.


V3 -> V4:
# pve-manager (1/2)
* "localhost" is set for "Scan Node"
* if another node is selcted and the "X" (clear) is used, localhost is
  set as the value again
* use lookupReference
* moved used template literals for building path strings


V4 -> V5:
# pve-manager (1/2)
* s/lookupReference/lookup/
* move ComboBoxSetStoreNode & StrageScanNodeSelector 
  to www/manager6/form
* move array pushes to initialization of array

V5 -> V6:
# pve-manager (1/2)
* set default value of "Scan node" to Proxmox.NodeName
* don't allow empty "Scan node"

Stefan Hrdlicka (2):
  fix #2822: add iscsi, lvm, lvmthin & zfs storage for all cluster nodes
  cleanup: "var" to "let", fix some indentation in related files

 www/manager6/Makefile                        |  2 +
 www/manager6/form/ComboBoxSetStoreNode.js    | 16 +++++
 www/manager6/form/StorageScanNodeSelector.js | 31 +++++++++
 www/manager6/storage/Base.js                 | 11 +--
 www/manager6/storage/IScsiEdit.js            | 35 +++++++---
 www/manager6/storage/LVMEdit.js              | 43 +++++++++---
 www/manager6/storage/LvmThinEdit.js          | 70 ++++++++++++++------
 www/manager6/storage/ZFSPoolEdit.js          | 51 +++++++++-----
 8 files changed, 199 insertions(+), 60 deletions(-)
 create mode 100644 www/manager6/form/ComboBoxSetStoreNode.js
 create mode 100644 www/manager6/form/StorageScanNodeSelector.js

-- 
2.30.2





^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pve-devel] [PATCH V6 pve-manager 1/2] fix #2822: add iscsi, lvm, lvmthin & zfs storage for all cluster nodes
  2022-09-30 12:38 [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs Stefan Hrdlicka
@ 2022-09-30 12:38 ` Stefan Hrdlicka
  2022-09-30 12:38 ` [pve-devel] [PATCH V6 pve-manager 2/2] cleanup: "var" to "let", fix some indentation in related files Stefan Hrdlicka
  2022-10-21  9:24 ` [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs Dominik Csapak
  2 siblings, 0 replies; 5+ messages in thread
From: Stefan Hrdlicka @ 2022-09-30 12:38 UTC (permalink / raw)
  To: pve-devel

This adds a dropdown box for iSCSI, LVM, LVMThin & ZFS storage options where a
cluster node needs to be chosen. As default the current node is
selected. It restricts the the storage to be only availabe on the
selected node.

Signed-off-by: Stefan Hrdlicka <s.hrdlicka@proxmox.com>
---
 www/manager6/Makefile                        |  2 +
 www/manager6/form/ComboBoxSetStoreNode.js    | 16 ++++++
 www/manager6/form/StorageScanNodeSelector.js | 31 ++++++++++++
 www/manager6/storage/Base.js                 |  1 +
 www/manager6/storage/IScsiEdit.js            | 29 ++++++++---
 www/manager6/storage/LVMEdit.js              | 29 +++++++++--
 www/manager6/storage/LvmThinEdit.js          | 52 +++++++++++++++-----
 www/manager6/storage/ZFSPoolEdit.js          | 28 +++++++++--
 8 files changed, 164 insertions(+), 24 deletions(-)
 create mode 100644 www/manager6/form/ComboBoxSetStoreNode.js
 create mode 100644 www/manager6/form/StorageScanNodeSelector.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index d16770b1..81f5e5d8 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -27,6 +27,7 @@ JSSRC= 							\
 	form/CalendarEvent.js				\
 	form/CephPoolSelector.js			\
 	form/CephFSSelector.js				\
+	form/ComboBoxSetStoreNode.js			\
 	form/CompressionSelector.js			\
 	form/ContentTypeSelector.js			\
 	form/ControllerSelector.js			\
@@ -62,6 +63,7 @@ JSSRC= 							\
 	form/SecurityGroupSelector.js			\
 	form/SnapshotSelector.js			\
 	form/SpiceEnhancementSelector.js		\
+	form/StorageScanNodeSelector.js	    		\
 	form/StorageSelector.js				\
 	form/TFASelector.js				\
 	form/TokenSelector.js 				\
diff --git a/www/manager6/form/ComboBoxSetStoreNode.js b/www/manager6/form/ComboBoxSetStoreNode.js
new file mode 100644
index 00000000..3490ddd7
--- /dev/null
+++ b/www/manager6/form/ComboBoxSetStoreNode.js
@@ -0,0 +1,16 @@
+Ext.define('PVE.form.ComboBoxSetStoreNode', {
+    extend: 'Ext.form.field.ComboBox',
+    config: {
+	apiBaseUrl: '/api2/json/nodes/',
+	apiSuffix: '',
+    },
+
+    setNodeName: function(value) {
+	let me = this;
+	value ||= Proxmox.NodeName;
+
+	me.getStore().getProxy().setUrl(`${me.apiBaseUrl}${value}${me.apiSuffix}`);
+	this.clearValue();
+    },
+
+});
diff --git a/www/manager6/form/StorageScanNodeSelector.js b/www/manager6/form/StorageScanNodeSelector.js
new file mode 100644
index 00000000..31d56f92
--- /dev/null
+++ b/www/manager6/form/StorageScanNodeSelector.js
@@ -0,0 +1,31 @@
+Ext.define('PVE.form.StorageScanNodeSelector', {
+    extend: 'PVE.form.NodeSelector',
+    xtype: 'pveStorageScanNodeSelector',
+
+    name: 'storageScanNode',
+    itemId: 'pveStorageScanNodeSelector',
+    fieldLabel: gettext('Scan node'),
+    allowBlank: false,
+    disallowedNodes: undefined,
+    autoSelect: false,
+    submitValue: false,
+    value: Proxmox.NodeName,
+    autoEl: {
+	tag: 'div',
+	'data-qtip': gettext('Scan for available storages on the selected node'),
+    },
+    triggers: {
+	clear: {
+	    handler: function() {
+		let me = this;
+		me.setValue(Proxmox.NodeName);
+	    },
+	},
+    },
+
+    setValue: function(value) {
+	let me = this;
+	me.callParent([value]);
+	me.triggers.clear.setVisible(value !== Proxmox.NodeName);
+    },
+});
diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
index 7f6d7a09..1df7a8dd 100644
--- a/www/manager6/storage/Base.js
+++ b/www/manager6/storage/Base.js
@@ -36,6 +36,7 @@ Ext.define('PVE.panel.StorageBase', {
 	    {
 		xtype: 'pveNodeSelector',
 		name: 'nodes',
+		reference: 'storageNodeRestriction',
 		disabled: me.storageId === 'local',
 		fieldLabel: gettext('Nodes'),
 		emptyText: gettext('All') + ' (' + gettext('No restrictions') +')',
diff --git a/www/manager6/storage/IScsiEdit.js b/www/manager6/storage/IScsiEdit.js
index 2f35f882..46d9921a 100644
--- a/www/manager6/storage/IScsiEdit.js
+++ b/www/manager6/storage/IScsiEdit.js
@@ -1,5 +1,5 @@
 Ext.define('PVE.storage.IScsiScan', {
-    extend: 'Ext.form.field.ComboBox',
+    extend: 'PVE.form.ComboBoxSetStoreNode',
     alias: 'widget.pveIScsiScan',
 
     queryParam: 'portal',
@@ -10,6 +10,9 @@ Ext.define('PVE.storage.IScsiScan', {
 	loadingText: gettext('Scanning...'),
 	width: 350,
     },
+    config: {
+	apiSuffix: '/scan/iscsi',
+    },
     doRawQuery: function() {
 	// do nothing
     },
@@ -42,7 +45,7 @@ Ext.define('PVE.storage.IScsiScan', {
 	    fields: ['target', 'portal'],
 	    proxy: {
 		type: 'proxmox',
-		url: `/api2/json/nodes/${me.nodename}/scan/iscsi`,
+		url: `${me.apiBaseUrl}${me.nodename}${me.apiSuffix}`,
 	    },
 	});
 	store.sort('target', 'ASC');
@@ -78,6 +81,20 @@ Ext.define('PVE.storage.IScsiInputPanel', {
 	var me = this;
 
 	me.column1 = [
+	    {
+		xtype: 'pveStorageScanNodeSelector',
+		disabled: !me.isCreate,
+		hidden: !me.isCreate,
+		listeners: {
+		    change: {
+			fn: function(field, value) {
+			    me.lookup('iScsiTargetScan').setNodeName(value);
+			    me.lookup('storageNodeRestriction')
+				.setValue(value === Proxmox.NodeName ? '' : value);
+			},
+		    },
+		},
+	    },
 	    {
 		xtype: me.isCreate ? 'textfield' : 'displayfield',
 		name: 'portal',
@@ -94,14 +111,14 @@ Ext.define('PVE.storage.IScsiInputPanel', {
 		    },
 		},
 	    },
-	    {
+	    Ext.createWidget(me.isCreate ? 'pveIScsiScan' : 'displayfield', {
 		readOnly: !me.isCreate,
-		xtype: me.isCreate ? 'pveIScsiScan' : 'displayfield',
 		name: 'target',
 		value: '',
-		fieldLabel: 'Target',
+		fieldLabel: gettext('Target'),
 		allowBlank: false,
-	    },
+		reference: 'iScsiTargetScan',
+	    }),
 	];
 
 	me.column2 = [
diff --git a/www/manager6/storage/LVMEdit.js b/www/manager6/storage/LVMEdit.js
index 2a9cd283..67b34247 100644
--- a/www/manager6/storage/LVMEdit.js
+++ b/www/manager6/storage/LVMEdit.js
@@ -1,10 +1,20 @@
 Ext.define('PVE.storage.VgSelector', {
-    extend: 'Ext.form.field.ComboBox',
+    extend: 'PVE.form.ComboBoxSetStoreNode',
     alias: 'widget.pveVgSelector',
     valueField: 'vg',
     displayField: 'vg',
     queryMode: 'local',
     editable: false,
+    config: {
+	apiSuffix: '/scan/lvm',
+    },
+
+    setNodeName: function(value) {
+	let me = this;
+	me.callParent([value]);
+	me.getStore().load();
+    },
+
     initComponent: function() {
 	var me = this;
 
@@ -17,7 +27,7 @@ Ext.define('PVE.storage.VgSelector', {
 	    fields: ['vg', 'size', 'free'],
 	    proxy: {
 		type: 'proxmox',
-		url: '/api2/json/nodes/' + me.nodename + '/scan/lvm',
+		url: `${me.apiBaseUrl}${me.nodename}${me.apiSuffix}`,
 	    },
 	});
 
@@ -103,11 +113,24 @@ Ext.define('PVE.storage.LVMInputPanel', {
 	});
 
 	if (me.isCreate) {
-	    var vgField = Ext.create('PVE.storage.VgSelector', {
+	    let vgField = Ext.create('PVE.storage.VgSelector', {
 		name: 'vgname',
 		fieldLabel: gettext('Volume group'),
+		reference: 'volumeGroupSelector',
 		allowBlank: false,
 	    });
+	    me.column1.push({
+	        xtype: 'pveStorageScanNodeSelector',
+	        listeners: {
+	            change: {
+			fn: function(field, value) {
+			    me.lookup('volumeGroupSelector').setNodeName(value);
+			    me.lookup('storageNodeRestriction')
+				.setValue(value === Proxmox.NodeName ? '' : value);
+			},
+		    },
+	        },
+	    });
 
 	    var baseField = Ext.createWidget('pveFileSelector', {
 		name: 'base',
diff --git a/www/manager6/storage/LvmThinEdit.js b/www/manager6/storage/LvmThinEdit.js
index 4eab7740..c3679f5b 100644
--- a/www/manager6/storage/LvmThinEdit.js
+++ b/www/manager6/storage/LvmThinEdit.js
@@ -1,5 +1,5 @@
 Ext.define('PVE.storage.TPoolSelector', {
-    extend: 'Ext.form.field.ComboBox',
+    extend: 'PVE.form.ComboBoxSetStoreNode',
     alias: 'widget.pveTPSelector',
 
     queryParam: 'vg',
@@ -7,6 +7,10 @@ Ext.define('PVE.storage.TPoolSelector', {
     displayField: 'lv',
     editable: false,
 
+    config: {
+	apiSuffix: '/scan/lvmthin',
+    },
+
     doRawQuery: function() {
 	// nothing
     },
@@ -40,7 +44,7 @@ Ext.define('PVE.storage.TPoolSelector', {
 	    fields: ['lv'],
 	    proxy: {
 		type: 'proxmox',
-		url: '/api2/json/nodes/' + me.nodename + '/scan/lvmthin',
+		url: `${me.apiBaseUrl}${me.nodename}${me.apiSuffix}`,
 	    },
 	});
 
@@ -58,13 +62,23 @@ Ext.define('PVE.storage.TPoolSelector', {
 });
 
 Ext.define('PVE.storage.BaseVGSelector', {
-    extend: 'Ext.form.field.ComboBox',
+    extend: 'PVE.form.ComboBoxSetStoreNode',
     alias: 'widget.pveBaseVGSelector',
 
     valueField: 'vg',
     displayField: 'vg',
     queryMode: 'local',
     editable: false,
+    config: {
+	apiSuffix: '/scan/lvm',
+    },
+
+    setNodeName: function(value) {
+	let me = this;
+	me.callParent([value]);
+	me.getStore().load();
+    },
+
     initComponent: function() {
 	var me = this;
 
@@ -77,7 +91,7 @@ Ext.define('PVE.storage.BaseVGSelector', {
 	    fields: ['vg', 'size', 'free'],
 	    proxy: {
 		type: 'proxmox',
-		url: '/api2/json/nodes/' + me.nodename + '/scan/lvm',
+		url: `${me.apiBaseUrl}${me.nodename}${me.apiSuffix}`,
 	    },
 	});
 
@@ -121,27 +135,41 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
 	});
 
 	if (me.isCreate) {
-	    var vgField = Ext.create('PVE.storage.TPoolSelector', {
-		name: 'thinpool',
-		fieldLabel: gettext('Thin Pool'),
-		allowBlank: false,
+	    me.column1.push({
+	        xtype: 'pveStorageScanNodeSelector',
+	        listeners: {
+		    change: {
+			fn: function(field, value) {
+			    me.lookup('thinPoolSelector').setNodeName(value);
+			    me.lookup('volumeGroupSelector').setNodeName(value);
+			    me.lookup('storageNodeRestriction')
+				.setValue(value === Proxmox.NodeName ? '' : value);
+			},
+		    },
+		},
 	    });
 
-	    me.column1.push({
-		xtype: 'pveBaseVGSelector',
+	    me.column1.push(Ext.create('PVE.storage.BaseVGSelector', {
 		name: 'vgname',
 		fieldLabel: gettext('Volume group'),
+		reference: 'volumeGroupSelector',
 		listeners: {
 		    change: function(f, value) {
 			if (me.isCreate) {
+			    let vgField = me.lookup('thinPoolSelector');
 			    vgField.setVG(value);
 			    vgField.setValue('');
 			}
 		    },
 		},
-	    });
+	    }));
 
-	    me.column1.push(vgField);
+	    me.column1.push(Ext.create('PVE.storage.TPoolSelector', {
+		name: 'thinpool',
+		fieldLabel: gettext('Thin Pool'),
+		reference: 'thinPoolSelector',
+		allowBlank: false,
+	    }));
 	}
 
 	me.column1.push(vgnameField);
diff --git a/www/manager6/storage/ZFSPoolEdit.js b/www/manager6/storage/ZFSPoolEdit.js
index 8e689f0c..76eaa6d1 100644
--- a/www/manager6/storage/ZFSPoolEdit.js
+++ b/www/manager6/storage/ZFSPoolEdit.js
@@ -1,5 +1,5 @@
 Ext.define('PVE.storage.ZFSPoolSelector', {
-    extend: 'Ext.form.field.ComboBox',
+    extend: 'PVE.form.ComboBoxSetStoreNode',
     alias: 'widget.pveZFSPoolSelector',
     valueField: 'pool',
     displayField: 'pool',
@@ -8,6 +8,16 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
     listConfig: {
 	loadingText: gettext('Scanning...'),
     },
+    config: {
+	apiSuffix: '/scan/zfs',
+    },
+
+    setNodeName: function(value) {
+	let me = this;
+	me.callParent([value]);
+	me.getStore().load();
+    },
+
     initComponent: function() {
 	var me = this;
 
@@ -20,10 +30,9 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
 	    fields: ['pool', 'size', 'free'],
 	    proxy: {
 		type: 'proxmox',
-		url: '/api2/json/nodes/' + me.nodename + '/scan/zfs',
+		url: `${me.apiBaseUrl}${me.nodename}${me.apiSuffix}`,
 	    },
 	});
-
 	store.sort('pool', 'ASC');
 
 	Ext.apply(me, {
@@ -45,9 +54,22 @@ Ext.define('PVE.storage.ZFSPoolInputPanel', {
 	me.column1 = [];
 
 	if (me.isCreate) {
+	    me.column1.push({
+	        xtype: 'pveStorageScanNodeSelector',
+	        listeners: {
+		    change: {
+			fn: function(field, value) {
+			    me.lookup('zfsPoolSelector').setNodeName(value);
+			    me.lookup('storageNodeRestriction')
+				.setValue(value === Proxmox.NodeName ? '' : value);
+			},
+		    },
+		},
+	    });
 	    me.column1.push(Ext.create('PVE.storage.ZFSPoolSelector', {
 		name: 'pool',
 		fieldLabel: gettext('ZFS Pool'),
+		reference: 'zfsPoolSelector',
 		allowBlank: false,
 	    }));
 	} else {
-- 
2.30.2





^ permalink raw reply	[flat|nested] 5+ messages in thread

* [pve-devel] [PATCH V6 pve-manager 2/2] cleanup: "var" to "let", fix some indentation in related files
  2022-09-30 12:38 [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs Stefan Hrdlicka
  2022-09-30 12:38 ` [pve-devel] [PATCH V6 pve-manager 1/2] fix #2822: add iscsi, lvm, lvmthin & zfs storage for all cluster nodes Stefan Hrdlicka
@ 2022-09-30 12:38 ` Stefan Hrdlicka
  2022-10-21  9:24 ` [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs Dominik Csapak
  2 siblings, 0 replies; 5+ messages in thread
From: Stefan Hrdlicka @ 2022-09-30 12:38 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Stefan Hrdlicka <s.hrdlicka@proxmox.com>
---
 www/manager6/storage/Base.js        | 10 +++++-----
 www/manager6/storage/IScsiEdit.js   |  6 +++---
 www/manager6/storage/LVMEdit.js     | 14 +++++++-------
 www/manager6/storage/LvmThinEdit.js | 18 +++++++++---------
 www/manager6/storage/ZFSPoolEdit.js | 23 +++++++++++------------
 5 files changed, 35 insertions(+), 36 deletions(-)

diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
index 1df7a8dd..c8c735f3 100644
--- a/www/manager6/storage/Base.js
+++ b/www/manager6/storage/Base.js
@@ -5,7 +5,7 @@ Ext.define('PVE.panel.StorageBase', {
     type: '',
 
     onGetValues: function(values) {
-	var me = this;
+	let me = this;
 
 	if (me.isCreate) {
 	    values.type = me.type;
@@ -20,7 +20,7 @@ Ext.define('PVE.panel.StorageBase', {
     },
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	me.column1.unshift({
 	    xtype: me.isCreate ? 'textfield' : 'displayfield',
@@ -88,7 +88,7 @@ Ext.define('PVE.storage.BaseEdit', {
     },
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	me.isCreate = !me.storageId;
 
@@ -148,8 +148,8 @@ Ext.define('PVE.storage.BaseEdit', {
 	if (!me.isCreate) {
 	    me.load({
 		success: function(response, options) {
-		    var values = response.result.data;
-		    var ctypes = values.content || '';
+		    let values = response.result.data;
+		    let ctypes = values.content || '';
 
 		    values.content = ctypes.split(',');
 
diff --git a/www/manager6/storage/IScsiEdit.js b/www/manager6/storage/IScsiEdit.js
index 46d9921a..9eadcf92 100644
--- a/www/manager6/storage/IScsiEdit.js
+++ b/www/manager6/storage/IScsiEdit.js
@@ -64,7 +64,7 @@ Ext.define('PVE.storage.IScsiInputPanel', {
     onlineHelp: 'storage_open_iscsi',
 
     onGetValues: function(values) {
-	var me = this;
+	let me = this;
 
 	values.content = values.luns ? 'images' : 'none';
 	delete values.luns;
@@ -78,7 +78,7 @@ Ext.define('PVE.storage.IScsiInputPanel', {
     },
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	me.column1 = [
 	    {
@@ -104,7 +104,7 @@ Ext.define('PVE.storage.IScsiInputPanel', {
 		listeners: {
 		    change: function(f, value) {
 			if (me.isCreate) {
-			    var exportField = me.down('field[name=target]');
+			    let exportField = me.down('field[name=target]');
 			    exportField.setPortal(value);
 			    exportField.setValue('');
 			}
diff --git a/www/manager6/storage/LVMEdit.js b/www/manager6/storage/LVMEdit.js
index 67b34247..61f0e3a9 100644
--- a/www/manager6/storage/LVMEdit.js
+++ b/www/manager6/storage/LVMEdit.js
@@ -16,13 +16,13 @@ Ext.define('PVE.storage.VgSelector', {
     },
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	if (!me.nodename) {
 	    me.nodename = 'localhost';
 	}
 
-	var store = Ext.create('Ext.data.Store', {
+	let store = Ext.create('Ext.data.Store', {
 	    autoLoad: {}, // true,
 	    fields: ['vg', 'size', 'free'],
 	    proxy: {
@@ -55,9 +55,9 @@ Ext.define('PVE.storage.BaseStorageSelector', {
     valueField: 'storage',
     displayField: 'text',
     initComponent: function() {
-	var me = this;
+	let me = this;
 
-	var store = Ext.create('Ext.data.Store', {
+	let store = Ext.create('Ext.data.Store', {
 	    autoLoad: {
 		addRecords: true,
 		params: {
@@ -99,11 +99,11 @@ Ext.define('PVE.storage.LVMInputPanel', {
     onlineHelp: 'storage_lvm',
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	me.column1 = [];
 
-	var vgnameField = Ext.createWidget(me.isCreate ? 'textfield' : 'displayfield', {
+	let vgnameField = Ext.createWidget(me.isCreate ? 'textfield' : 'displayfield', {
 	    name: 'vgname',
 	    hidden: !!me.isCreate,
 	    disabled: !!me.isCreate,
@@ -132,7 +132,7 @@ Ext.define('PVE.storage.LVMInputPanel', {
 	        },
 	    });
 
-	    var baseField = Ext.createWidget('pveFileSelector', {
+	    let baseField = Ext.createWidget('pveFileSelector', {
 		name: 'base',
 		hidden: true,
 		disabled: true,
diff --git a/www/manager6/storage/LvmThinEdit.js b/www/manager6/storage/LvmThinEdit.js
index c3679f5b..01c47877 100644
--- a/www/manager6/storage/LvmThinEdit.js
+++ b/www/manager6/storage/LvmThinEdit.js
@@ -16,7 +16,7 @@ Ext.define('PVE.storage.TPoolSelector', {
     },
 
     onTriggerClick: function() {
-	var me = this;
+	let me = this;
 
 	if (!me.queryCaching || me.lastQuery !== me.vg) {
 	    me.store.removeAll();
@@ -28,19 +28,19 @@ Ext.define('PVE.storage.TPoolSelector', {
     },
 
     setVG: function(myvg) {
-	var me = this;
+	let me = this;
 
 	me.vg = myvg;
     },
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	if (!me.nodename) {
 	    me.nodename = 'localhost';
 	}
 
-	var store = Ext.create('Ext.data.Store', {
+	let store = Ext.create('Ext.data.Store', {
 	    fields: ['lv'],
 	    proxy: {
 		type: 'proxmox',
@@ -80,13 +80,13 @@ Ext.define('PVE.storage.BaseVGSelector', {
     },
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	if (!me.nodename) {
 	    me.nodename = 'localhost';
 	}
 
-	var store = Ext.create('Ext.data.Store', {
+	let store = Ext.create('Ext.data.Store', {
 	    autoLoad: {},
 	    fields: ['vg', 'size', 'free'],
 	    proxy: {
@@ -112,11 +112,11 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
     onlineHelp: 'storage_lvmthin',
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	me.column1 = [];
 
-	var vgnameField = Ext.createWidget(me.isCreate ? 'textfield' : 'displayfield', {
+	let vgnameField = Ext.createWidget(me.isCreate ? 'textfield' : 'displayfield', {
 	    name: 'vgname',
 	    hidden: !!me.isCreate,
 	    disabled: !!me.isCreate,
@@ -125,7 +125,7 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
 	    allowBlank: false,
 	});
 
-	var thinpoolField = Ext.createWidget(me.isCreate ? 'textfield' : 'displayfield', {
+	let thinpoolField = Ext.createWidget(me.isCreate ? 'textfield' : 'displayfield', {
 	    name: 'thinpool',
 	    hidden: !!me.isCreate,
 	    disabled: !!me.isCreate,
diff --git a/www/manager6/storage/ZFSPoolEdit.js b/www/manager6/storage/ZFSPoolEdit.js
index 76eaa6d1..d05a61ac 100644
--- a/www/manager6/storage/ZFSPoolEdit.js
+++ b/www/manager6/storage/ZFSPoolEdit.js
@@ -19,13 +19,13 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
     },
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	if (!me.nodename) {
 	    me.nodename = 'localhost';
 	}
 
-	var store = Ext.create('Ext.data.Store', {
+	let store = Ext.create('Ext.data.Store', {
 	    autoLoad: {}, // true,
 	    fields: ['pool', 'size', 'free'],
 	    proxy: {
@@ -49,7 +49,7 @@ Ext.define('PVE.storage.ZFSPoolInputPanel', {
     onlineHelp: 'storage_zfspool',
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	me.column1 = [];
 
@@ -83,15 +83,14 @@ Ext.define('PVE.storage.ZFSPoolInputPanel', {
 
 	// value is an array,
 	// while before it was a string
-	me.column1.push(
-	    {
-xtype: 'pveContentTypeSelector',
-	     cts: ['images', 'rootdir'],
-	     fieldLabel: gettext('Content'),
-	     name: 'content',
-	     value: ['images', 'rootdir'],
-	     multiSelect: true,
-	     allowBlank: false,
+	me.column1.push({
+	    xtype: 'pveContentTypeSelector',
+	    cts: ['images', 'rootdir'],
+	    fieldLabel: gettext('Content'),
+	    name: 'content',
+	    value: ['images', 'rootdir'],
+	    multiSelect: true,
+	    allowBlank: false,
 	});
 	me.column2 = [
 	    {
-- 
2.30.2





^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs
  2022-09-30 12:38 [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs Stefan Hrdlicka
  2022-09-30 12:38 ` [pve-devel] [PATCH V6 pve-manager 1/2] fix #2822: add iscsi, lvm, lvmthin & zfs storage for all cluster nodes Stefan Hrdlicka
  2022-09-30 12:38 ` [pve-devel] [PATCH V6 pve-manager 2/2] cleanup: "var" to "let", fix some indentation in related files Stefan Hrdlicka
@ 2022-10-21  9:24 ` Dominik Csapak
  2022-12-13 12:12   ` Thomas Lamprecht
  2 siblings, 1 reply; 5+ messages in thread
From: Dominik Csapak @ 2022-10-21  9:24 UTC (permalink / raw)
  To: Proxmox VE development discussion, Stefan Hrdlicka, Thomas Lamprecht

All in all LGTM, one small UX thing that i am not sure if we can improve without
making it way more complicated:

We now preselect the current node and leave the restriction out.
We then restrict when the node changes, but remove the restriction
again when we select the current node.

Maybe we want to just leave the restriction out when we load
the panel up, but always restrict when a user sets the node?
(as in, if i manually select the current node again, restrict
it?)

not sure if we'd want that or leave it like it is (or something else entirely?)
@Thomas do you have any thoughts about that?

Aside from that, consider the series:

Reviewed-by: Dominik Csapak <d.csapak@proxmox.com>
Tested-by: Dominik Csapak <d.cspaak@proxmox.com>

On 9/30/22 14:38, Stefan Hrdlicka wrote:
> V1 -> V2:
> # pve-storage
> * removed because patch is not needed
> 
> # pve-manager (1/3)
> * remove storage controller from V1
> * added custom ComboBox with API URL & setNodeName function
> * added scan node selection for iSCSI
> * scan node selection field no longer send to server
> 
> ## (optional) pve-manager (2/3): cleanup related files
> * var to let statement change
> * some indentation
> 
> ## ((very) optional) pve-manager (3/3): cleanup all var statements
> * replaces all var with let statements
> 
> 
> V2 -> V3:
> # pve-manager (1/2)
> * fix broken interface (broken in V2  )
> * improve tooltip
> * replace jNodeSelector function with class object
>    (PVE.panel.StorageBaseWithNodeSelector)
> 
> # other things:
> * removed very optional cleanup
> * nothing changed for "Base storage" selector. It is still possible to
>    select for example an iSCSI device only availabe on one node that
>    isn't availabe on the other ones. I wasn't sure if this should be
>    changed in this context as well.
> 
> 
> V3 -> V4:
> # pve-manager (1/2)
> * "localhost" is set for "Scan Node"
> * if another node is selcted and the "X" (clear) is used, localhost is
>    set as the value again
> * use lookupReference
> * moved used template literals for building path strings
> 
> 
> V4 -> V5:
> # pve-manager (1/2)
> * s/lookupReference/lookup/
> * move ComboBoxSetStoreNode & StrageScanNodeSelector
>    to www/manager6/form
> * move array pushes to initialization of array
> 
> V5 -> V6:
> # pve-manager (1/2)
> * set default value of "Scan node" to Proxmox.NodeName
> * don't allow empty "Scan node"
> 
> Stefan Hrdlicka (2):
>    fix #2822: add iscsi, lvm, lvmthin & zfs storage for all cluster nodes
>    cleanup: "var" to "let", fix some indentation in related files
> 
>   www/manager6/Makefile                        |  2 +
>   www/manager6/form/ComboBoxSetStoreNode.js    | 16 +++++
>   www/manager6/form/StorageScanNodeSelector.js | 31 +++++++++
>   www/manager6/storage/Base.js                 | 11 +--
>   www/manager6/storage/IScsiEdit.js            | 35 +++++++---
>   www/manager6/storage/LVMEdit.js              | 43 +++++++++---
>   www/manager6/storage/LvmThinEdit.js          | 70 ++++++++++++++------
>   www/manager6/storage/ZFSPoolEdit.js          | 51 +++++++++-----
>   8 files changed, 199 insertions(+), 60 deletions(-)
>   create mode 100644 www/manager6/form/ComboBoxSetStoreNode.js
>   create mode 100644 www/manager6/form/StorageScanNodeSelector.js
> 





^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs
  2022-10-21  9:24 ` [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs Dominik Csapak
@ 2022-12-13 12:12   ` Thomas Lamprecht
  0 siblings, 0 replies; 5+ messages in thread
From: Thomas Lamprecht @ 2022-12-13 12:12 UTC (permalink / raw)
  To: Proxmox VE development discussion, Dominik Csapak, Stefan Hrdlicka

Am 21/10/2022 um 11:24 schrieb Dominik Csapak:
> All in all LGTM, one small UX thing that i am not sure if we can improve without
> making it way more complicated:
> 
> We now preselect the current node and leave the restriction out.
> We then restrict when the node changes, but remove the restriction
> again when we select the current node.

IIUC, you mean that the node selector implies that it's restricted to the node that one
has loaded the web-interface with, even if that's then not the case.

As if that's the case then yes, that'd seem like confusing UX.

> 
> Maybe we want to just leave the restriction out when we load
> the panel up, but always restrict when a user sets the node?
> (as in, if i manually select the current node again, restrict
> it?)

And here you propose that we keep the empty value, and thus the "All (No restrictions)"
displayed on edit window creation, and if any node is actually selected by the user then we
always restrict it to that (just to ensure IIUC)?


If IIUC, then yes, while mabye not the best (as its an odd "problem") it might be the
better way.

> 
> not sure if we'd want that or leave it like it is (or something else entirely?)
> @Thomas do you have any thoughts about that?






^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-12-13 12:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-30 12:38 [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs Stefan Hrdlicka
2022-09-30 12:38 ` [pve-devel] [PATCH V6 pve-manager 1/2] fix #2822: add iscsi, lvm, lvmthin & zfs storage for all cluster nodes Stefan Hrdlicka
2022-09-30 12:38 ` [pve-devel] [PATCH V6 pve-manager 2/2] cleanup: "var" to "let", fix some indentation in related files Stefan Hrdlicka
2022-10-21  9:24 ` [pve-devel] [PATCH V6 pve-manager 0/2] fix #2822: add iscsi, lvm, lvmthin & zfs Dominik Csapak
2022-12-13 12:12   ` Thomas Lamprecht

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