all lists on 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 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