public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH V4 pve-manager 0/2] add iscsi, lvm, lvmthin & zfs storage on all cluster nodes (fix #2822)
@ 2022-08-04 14:46 Stefan Hrdlicka
  2022-08-04 14:46 ` [pve-devel] [PATCH V4 manager 1/2] fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes Stefan Hrdlicka
  2022-08-04 14:46 ` [pve-devel] [PATCH V4 manager 2/2] cleanup: "var" to "let", fix some indentation in related files Stefan Hrdlicka
  0 siblings, 2 replies; 4+ messages in thread
From: Stefan Hrdlicka @ 2022-08-04 14:46 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

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

 www/manager6/storage/Base.js        | 59 +++++++++++++++++++++--
 www/manager6/storage/IScsiEdit.js   | 45 +++++++++++++-----
 www/manager6/storage/LVMEdit.js     | 44 +++++++++++++----
 www/manager6/storage/LvmThinEdit.js | 73 ++++++++++++++++++++---------
 www/manager6/storage/ZFSPoolEdit.js | 52 ++++++++++++++------
 5 files changed, 210 insertions(+), 63 deletions(-)

-- 
2.30.2





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

* [pve-devel] [PATCH V4 manager 1/2] fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes
  2022-08-04 14:46 [pve-devel] [PATCH V4 pve-manager 0/2] add iscsi, lvm, lvmthin & zfs storage on all cluster nodes (fix #2822) Stefan Hrdlicka
@ 2022-08-04 14:46 ` Stefan Hrdlicka
  2022-09-20 13:53   ` Dominik Csapak
  2022-08-04 14:46 ` [pve-devel] [PATCH V4 manager 2/2] cleanup: "var" to "let", fix some indentation in related files Stefan Hrdlicka
  1 sibling, 1 reply; 4+ messages in thread
From: Stefan Hrdlicka @ 2022-08-04 14:46 UTC (permalink / raw)
  To: pve-devel

This adds a dropdown box for 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/storage/Base.js        | 49 +++++++++++++++++++++++++
 www/manager6/storage/IScsiEdit.js   | 39 +++++++++++++++-----
 www/manager6/storage/LVMEdit.js     | 30 ++++++++++++++--
 www/manager6/storage/LvmThinEdit.js | 55 ++++++++++++++++++++++-------
 www/manager6/storage/ZFSPoolEdit.js | 29 +++++++++++++--
 5 files changed, 175 insertions(+), 27 deletions(-)

diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
index 7f6d7a09..d7dd13cc 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') +')',
@@ -76,6 +77,54 @@ Ext.define('PVE.panel.StorageBase', {
     },
 });
 
+Ext.define('PVE.form.StorageScanNodeSelector', {
+    extend: 'PVE.form.NodeSelector',
+    xtype: 'pveStorageScanNodeSelector',
+
+    name: 'storageScanNode',
+    itemId: 'pveStorageScanNodeSelector',
+    fieldLabel: gettext('Scan node'),
+    allowBlank: true,
+    disallowedNodes: undefined,
+    autoSelect: false,
+    submitValue: false,
+    value: 'localhost',
+    autoEl: {
+	tag: 'div',
+	'data-qtip': gettext('Scan for available storages on the selected node'),
+    },
+    triggers: {
+	clear: {
+	    handler: function() {
+		let me = this;
+		me.setValue('localhost');
+	    },
+	},
+    },
+    setValue: function(value) {
+	let me = this;
+	me.callParent([value]);
+	me.triggers.clear.setVisible(me.triggers.clear.isVisible() && value !== 'localhost');
+    },
+});
+
+Ext.define('PVE.storage.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();
+    },
+
+});
+
 Ext.define('PVE.storage.BaseEdit', {
     extend: 'Proxmox.window.Edit',
 
diff --git a/www/manager6/storage/IScsiEdit.js b/www/manager6/storage/IScsiEdit.js
index 2f35f882..e9177f9e 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.storage.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');
@@ -77,8 +80,25 @@ Ext.define('PVE.storage.IScsiInputPanel', {
     initComponent: function() {
 	var me = this;
 
-	me.column1 = [
-	    {
+	me.column1 = [];
+	me.column1.push({
+	    xtype: 'pveStorageScanNodeSelector',
+	    disabled: !me.isCreate,
+	    hidden: !me.isCreate,
+	    preferredValue: '',
+	    allowBlank: true,
+	    autoSelect: false,
+	    listeners: {
+		change: {
+		    fn: function(field, value) {
+			me.lookupReference('iScsiTargetScan').setNodeName(value);
+			me.lookupReference('storageNodeRestriction')
+			    .setValue(value === 'localhost' ? '' : value);
+		    },
+		},
+	    },
+	});
+	me.column1.push({
 		xtype: me.isCreate ? 'textfield' : 'displayfield',
 		name: 'portal',
 		value: '',
@@ -94,15 +114,16 @@ Ext.define('PVE.storage.IScsiInputPanel', {
 		    },
 		},
 	    },
-	    {
+	);
+	me.column1.push(
+	    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..e8c5c88a 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.storage.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,25 @@ 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.lookupReference('volumeGroupSelector')
+				.setNodeName(value);
+			    me.lookupReference('storageNodeRestriction')
+				.setValue(value === 'localhost' ? '' : value);
+			},
+		    },
+	        },
+	    });
 
 	    var baseField = Ext.createWidget('pveFileSelector', {
 		name: 'base',
diff --git a/www/manager6/storage/LvmThinEdit.js b/www/manager6/storage/LvmThinEdit.js
index 4eab7740..7cd50746 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.storage.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.storage.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,44 @@ 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.lookupReference('thinPoolSelector')
+				.setNodeName(value);
+			    me.lookupReference('volumeGroupSelector')
+				.setNodeName(value);
+			    me.lookupReference('storageNodeRestriction')
+				.setValue(value === 'localhost' ? '' : 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.lookupReference('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..d7319a10 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.storage.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,23 @@ Ext.define('PVE.storage.ZFSPoolInputPanel', {
 	me.column1 = [];
 
 	if (me.isCreate) {
+	    me.column1.push({
+	        xtype: 'pveStorageScanNodeSelector',
+	        listeners: {
+		    change: {
+			fn: function(field, value) {
+			    me.lookupReference('zfsPoolSelector')
+				.setNodeName(value);
+			    me.lookupReference('storageNodeRestriction')
+				.setValue(value === 'localhost' ? '' : 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] 4+ messages in thread

* [pve-devel] [PATCH V4 manager 2/2] cleanup: "var" to "let", fix some indentation in related files
  2022-08-04 14:46 [pve-devel] [PATCH V4 pve-manager 0/2] add iscsi, lvm, lvmthin & zfs storage on all cluster nodes (fix #2822) Stefan Hrdlicka
  2022-08-04 14:46 ` [pve-devel] [PATCH V4 manager 1/2] fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes Stefan Hrdlicka
@ 2022-08-04 14:46 ` Stefan Hrdlicka
  1 sibling, 0 replies; 4+ messages in thread
From: Stefan Hrdlicka @ 2022-08-04 14:46 UTC (permalink / raw)
  To: pve-devel

replace all "var" with "let" in files related to patch for ticket #2822

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 d7dd13cc..ce511c40 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',
@@ -136,7 +136,7 @@ Ext.define('PVE.storage.BaseEdit', {
     },
 
     initComponent: function() {
-	var me = this;
+	let me = this;
 
 	me.isCreate = !me.storageId;
 
@@ -196,8 +196,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 e9177f9e..674761c2 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 = [];
 	me.column1.push({
@@ -107,7 +107,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 e8c5c88a..f7091a42 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,
@@ -133,7 +133,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 7cd50746..e7c58285 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 d7319a10..aec825f4 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 = [];
 
@@ -84,15 +84,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] 4+ messages in thread

* Re: [pve-devel] [PATCH V4 manager 1/2] fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes
  2022-08-04 14:46 ` [pve-devel] [PATCH V4 manager 1/2] fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes Stefan Hrdlicka
@ 2022-09-20 13:53   ` Dominik Csapak
  0 siblings, 0 replies; 4+ messages in thread
From: Dominik Csapak @ 2022-09-20 13:53 UTC (permalink / raw)
  To: Proxmox VE development discussion, Stefan Hrdlicka

first, the patch does not apply here:
----
Applying: fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes
error: corrupt patch at line 335
Patch failed at 0001 fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes
----

also, some comments/nits inline (aside from those, it looks ok to me, could not
test because of the above issue)

On 8/4/22 16:46, Stefan Hrdlicka wrote:
> This adds a dropdown box for 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.
> 

iscsi is not mentioned here ;)

> Signed-off-by: Stefan Hrdlicka <s.hrdlicka@proxmox.com>
> ---
>   www/manager6/storage/Base.js        | 49 +++++++++++++++++++++++++
>   www/manager6/storage/IScsiEdit.js   | 39 +++++++++++++++-----
>   www/manager6/storage/LVMEdit.js     | 30 ++++++++++++++--
>   www/manager6/storage/LvmThinEdit.js | 55 ++++++++++++++++++++++-------
>   www/manager6/storage/ZFSPoolEdit.js | 29 +++++++++++++--
>   5 files changed, 175 insertions(+), 27 deletions(-)
> 
> diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
> index 7f6d7a09..d7dd13cc 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') +')',
> @@ -76,6 +77,54 @@ Ext.define('PVE.panel.StorageBase', {
>       },
>   });
>   
> +Ext.define('PVE.form.StorageScanNodeSelector', {
> +    extend: 'PVE.form.NodeSelector',
> +    xtype: 'pveStorageScanNodeSelector',
> +
> +    name: 'storageScanNode',
> +    itemId: 'pveStorageScanNodeSelector',
> +    fieldLabel: gettext('Scan node'),
> +    allowBlank: true,
> +    disallowedNodes: undefined,
> +    autoSelect: false,
> +    submitValue: false,
> +    value: 'localhost',
> +    autoEl: {
> +	tag: 'div',
> +	'data-qtip': gettext('Scan for available storages on the selected node'),
> +    },
> +    triggers: {
> +	clear: {
> +	    handler: function() {
> +		let me = this;
> +		me.setValue('localhost');
> +	    },
> +	},
> +    },
> +    setValue: function(value) {
> +	let me = this;
> +	me.callParent([value]);
> +	me.triggers.clear.setVisible(me.triggers.clear.isVisible() && value !== 'localhost');
> +    },
> +});
> +
> +Ext.define('PVE.storage.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();
> +    },
> +
> +});

nit: imho these two belong in www/manager6/form, but it's not a big deal

> +
>   Ext.define('PVE.storage.BaseEdit', {
>       extend: 'Proxmox.window.Edit',
>   
> diff --git a/www/manager6/storage/IScsiEdit.js b/www/manager6/storage/IScsiEdit.js
> index 2f35f882..e9177f9e 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.storage.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');
> @@ -77,8 +80,25 @@ Ext.define('PVE.storage.IScsiInputPanel', {
>       initComponent: function() {
>   	var me = this;
>   
> -	me.column1 = [
> -	    {
> +	me.column1 = [];
> +	me.column1.push({
> +	    xtype: 'pveStorageScanNodeSelector',
> +	    disabled: !me.isCreate,
> +	    hidden: !me.isCreate,
> +	    preferredValue: '',
> +	    allowBlank: true,
> +	    autoSelect: false,
> +	    listeners: {
> +		change: {
> +		    fn: function(field, value) {
> +			me.lookupReference('iScsiTargetScan').setNodeName(value);
> +			me.lookupReference('storageNodeRestriction')
> +			    .setValue(value === 'localhost' ? '' : value)
nit: you could use 'lookup' instead of 'lookupReference' (it's just a short alias)

> +		    },
> +		},
> +	    },
> +	});
> +	me.column1.push({
>   		xtype: me.isCreate ? 'textfield' : 'displayfield',
>   		name: 'portal',
>   		value: '',
> @@ -94,15 +114,16 @@ Ext.define('PVE.storage.IScsiInputPanel', {
>   		    },
>   		},
>   	    },
> -	    {
> +	);
> +	me.column1.push(
> +	    Ext.createWidget(me.isCreate ? 'pveIScsiScan' : 'displayfield', {
>   		readOnly: !me.isCreate,
> -		xtype: me.isCreate ? 'pveIScsiScan' : 'displayfield',
>   		name: 'target',
>   		value: '',
> -		fieldLabel: 'Target',
> +		fieldLabel: gettext('Target'),

nit: it's ok, but does not really belong into this patch

>   		allowBlank: false,
> -	    },
> -	];
> +		reference: 'iScsiTargetScan',
> +	}));

any particular reason why you use '.push()' here?
AFAICS you could simply define them inline like this:

me.column1 = [
     {
          xtype: ...
          ...
     },
     ...
];

like it was before

>   
>   	me.column2 = [
>   	    {
> diff --git a/www/manager6/storage/LVMEdit.js b/www/manager6/storage/LVMEdit.js
> index 2a9cd283..e8c5c88a 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.storage.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,25 @@ 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.lookupReference('volumeGroupSelector')
> +				.setNodeName(value);
> +			    me.lookupReference('storageNodeRestriction')
> +				.setValue(value === 'localhost' ? '' : value);

s/lookupReference/lookup/

> +			},
> +		    },
> +	        },
> +	    });
>   
>   	    var baseField = Ext.createWidget('pveFileSelector', {
>   		name: 'base',
> diff --git a/www/manager6/storage/LvmThinEdit.js b/www/manager6/storage/LvmThinEdit.js
> index 4eab7740..7cd50746 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.storage.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.storage.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,44 @@ 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.lookupReference('thinPoolSelector')
> +				.setNodeName(value);
> +			    me.lookupReference('volumeGroupSelector')
> +				.setNodeName(value);
> +			    me.lookupReference('storageNodeRestriction')
> +				.setValue(value === 'localhost' ? '' : value);

s/lookupReference/lookup/

> +			},
> +		    },
> +		},
>   	    });
>   
> -	    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.lookupReference('thinPoolSelector');

s/lookupReference/lookup/

>   			    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..d7319a10 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.storage.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}`,
>   	    },
>   	});
> -

nit: also not really relevant for this patch

>   	store.sort('pool', 'ASC');
>   
>   	Ext.apply(me, {
> @@ -45,9 +54,23 @@ Ext.define('PVE.storage.ZFSPoolInputPanel', {
>   	me.column1 = [];
>   
>   	if (me.isCreate) {
> +	    me.column1.push({
> +	        xtype: 'pveStorageScanNodeSelector',
> +	        listeners: {
> +		    change: {
> +			fn: function(field, value) {
> +			    me.lookupReference('zfsPoolSelector')
> +				.setNodeName(value);
> +			    me.lookupReference('storageNodeRestriction')
> +				.setValue(value === 'localhost' ? '' : value);

s/lookupReference/lookup/

> +			},
> +		    },
> +		},
> +	    });
>   	    me.column1.push(Ext.create('PVE.storage.ZFSPoolSelector', {
>   		name: 'pool',
>   		fieldLabel: gettext('ZFS Pool'),
> +		reference: 'zfsPoolSelector',
>   		allowBlank: false,
>   	    }));
>   	} else {





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

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

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-04 14:46 [pve-devel] [PATCH V4 pve-manager 0/2] add iscsi, lvm, lvmthin & zfs storage on all cluster nodes (fix #2822) Stefan Hrdlicka
2022-08-04 14:46 ` [pve-devel] [PATCH V4 manager 1/2] fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes Stefan Hrdlicka
2022-09-20 13:53   ` Dominik Csapak
2022-08-04 14:46 ` [pve-devel] [PATCH V4 manager 2/2] cleanup: "var" to "let", fix some indentation in related files Stefan Hrdlicka

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