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

This patch doesn't flow the solution as suggested in #2822. It adds a node
combobox on the top of the add storage dialog for ZFS and LVM(Thin).
The user has to select the node where the storage should be added. The
restriction to the selected node is automatically set as well. The
default value is set the the current node.

The drop down sets the node parameter which is then used for a proxyto
call and routed to the correct node.


-- pve-storage
Stefan Hrdlicka (1):
  fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes

 PVE/API2/Storage/Config.pm | 7 +++++++
 1 file changed, 7 insertions(+)


-- pve-manager
Stefan Hrdlicka (1):
  fix #2822: add lvm, lvmthin & zfs storage for all cluster nodes

 www/manager6/controller/StorageEdit.js | 20 ++++++++++++++++++++
 www/manager6/storage/Base.js           | 25 +++++++++++++++++++++++++
 www/manager6/storage/LVMEdit.js        |  9 ++++++++-
 www/manager6/storage/LvmThinEdit.js    | 14 +++++++++++++-
 www/manager6/storage/ZFSPoolEdit.js    | 24 +++++++++++++++---------
 5 files changed, 81 insertions(+), 11 deletions(-)


-- 
2.30.2





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

* [pve-devel] [PATCH pve-storage 1/2] fix #2822: add lvm, lvmthin & zfs storage on all cluster nodes
  2022-05-24 14:45 [pve-devel] [PATCH storage, manager 0/2] fix #2822: add lvm, lvmthin & zfs storage on all cluster nodes Stefan Hrdlicka
@ 2022-05-24 14:45 ` Stefan Hrdlicka
  2022-06-07 12:54   ` Fabian Ebner
  2022-05-24 14:45 ` [pve-devel] [PATCH pve-manager 2/2] " Stefan Hrdlicka
  2022-05-24 14:45 ` [pve-devel] [PATCH QQQ] fix #2822: enable node storage scanning for LVM, LVMThin & ZFS Stefan Hrdlicka
  2 siblings, 1 reply; 7+ messages in thread
From: Stefan Hrdlicka @ 2022-05-24 14:45 UTC (permalink / raw)
  To: pve-devel

this enables forwarding of request to the correct node if a node is set

Signed-off-by: Stefan Hrdlicka <s.hrdlicka@proxmox.com>
---
 PVE/API2/Storage/Config.pm | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/PVE/API2/Storage/Config.pm b/PVE/API2/Storage/Config.pm
index 6bd770e..82b73ca 100755
--- a/PVE/API2/Storage/Config.pm
+++ b/PVE/API2/Storage/Config.pm
@@ -146,6 +146,13 @@ __PACKAGE__->register_method ({
     protected => 1,
     path => '',
     method => 'POST',
+    proxyto_callback => sub {
+	my ($rpcenv, $proxyto, $uri_param) = @_;
+	my $node = delete $uri_param->{node};
+	$node = "localhost" if !$node;
+
+	return $node;
+    },
     description => "Create a new storage.",
     permissions => {
 	check => ['perm', '/storage', ['Datastore.Allocate']],
-- 
2.30.2





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

* [pve-devel] [PATCH pve-manager 2/2] fix #2822: add lvm, lvmthin & zfs storage on all cluster nodes
  2022-05-24 14:45 [pve-devel] [PATCH storage, manager 0/2] fix #2822: add lvm, lvmthin & zfs storage on all cluster nodes Stefan Hrdlicka
  2022-05-24 14:45 ` [pve-devel] [PATCH pve-storage 1/2] " Stefan Hrdlicka
@ 2022-05-24 14:45 ` Stefan Hrdlicka
  2022-06-07 12:54   ` Fabian Ebner
  2022-05-24 14:45 ` [pve-devel] [PATCH QQQ] fix #2822: enable node storage scanning for LVM, LVMThin & ZFS Stefan Hrdlicka
  2 siblings, 1 reply; 7+ messages in thread
From: Stefan Hrdlicka @ 2022-05-24 14:45 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>
---

Depends on the change in pve-storage

 www/manager6/controller/StorageEdit.js | 20 ++++++++++++++++++++
 www/manager6/storage/Base.js           | 25 +++++++++++++++++++++++++
 www/manager6/storage/LVMEdit.js        |  9 ++++++++-
 www/manager6/storage/LvmThinEdit.js    | 14 +++++++++++++-
 www/manager6/storage/ZFSPoolEdit.js    | 24 +++++++++++++++---------
 5 files changed, 81 insertions(+), 11 deletions(-)

diff --git a/www/manager6/controller/StorageEdit.js b/www/manager6/controller/StorageEdit.js
index cb73b776..25745a5b 100644
--- a/www/manager6/controller/StorageEdit.js
+++ b/www/manager6/controller/StorageEdit.js
@@ -25,3 +25,23 @@ Ext.define('PVE.controller.StorageEdit', {
 	},
     },
 });
+
+Ext.define('PVE.storage.StorageLocalController', {
+    extend: 'PVE.controller.StorageEdit',
+    alias: 'controller.storageLocal',
+    apiBaseUrl: '/api2/json/nodes/',
+
+    clearValueSetUrl: function(reference, path, nodeSelector) {
+	var me = this;
+
+	var refObj = me.lookupReference(reference);
+	refObj.clearValue();
+
+	var refObjStore = refObj.getStore();
+	refObjStore.getProxy().setUrl(me.apiBaseUrl + nodeSelector.value + path);
+	refObjStore.load();
+
+	var nodeRestriction = me.lookupReference('nodeRestriction');
+	nodeRestriction.setValue(nodeSelector.value);
+    },
+});
diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
index 7f6d7a09..92654131 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: 'nodeRestriction',
 		disabled: me.storageId === 'local',
 		fieldLabel: gettext('Nodes'),
 		emptyText: gettext('All') + ' (' + gettext('No restrictions') +')',
@@ -76,6 +77,30 @@ Ext.define('PVE.panel.StorageBase', {
     },
 });
 
+Ext.define('PVE.panel.StorageBaseLocal', {
+    extend: 'PVE.panel.StorageBase',
+    controller: 'storageLocal',
+
+    initComponent: function() {
+	var me = this;
+
+	me.columnT = [
+	    {
+		xtype: 'pveNodeSelector',
+		reference: 'pveNodeSelector',
+		name: 'node',
+		itemId: 'pveNodeSelector',
+		fieldLabel: gettext('Scan node'),
+		allowBlank: false,
+		disallowedNodes: undefined,
+		onlineValidator: true,
+		preferredValue: Proxmox.NodeName,
+	}];
+	me.callParent();
+    },
+
+});
+
 Ext.define('PVE.storage.BaseEdit', {
     extend: 'Proxmox.window.Edit',
 
diff --git a/www/manager6/storage/LVMEdit.js b/www/manager6/storage/LVMEdit.js
index 2a9cd283..d6f8da06 100644
--- a/www/manager6/storage/LVMEdit.js
+++ b/www/manager6/storage/LVMEdit.js
@@ -84,7 +84,7 @@ Ext.define('PVE.storage.BaseStorageSelector', {
 });
 
 Ext.define('PVE.storage.LVMInputPanel', {
-    extend: 'PVE.panel.StorageBase',
+    extend: 'PVE.panel.StorageBaseLocal',
 
     onlineHelp: 'storage_lvm',
 
@@ -105,6 +105,7 @@ Ext.define('PVE.storage.LVMInputPanel', {
 	if (me.isCreate) {
 	    var vgField = Ext.create('PVE.storage.VgSelector', {
 		name: 'vgname',
+		reference: 'pveLVMVGSelector',
 		fieldLabel: gettext('Volume group'),
 		allowBlank: false,
 	    });
@@ -175,5 +176,11 @@ Ext.define('PVE.storage.LVMInputPanel', {
 	];
 
 	me.callParent();
+	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
+	nodeSelector.on({
+		change: {
+		    fn: 'clearValueSetUrl', args: ['pveLVMVGSelector', '/scan/lvm'],
+		},
+	});
     },
 });
diff --git a/www/manager6/storage/LvmThinEdit.js b/www/manager6/storage/LvmThinEdit.js
index 4eab7740..ab1abb4c 100644
--- a/www/manager6/storage/LvmThinEdit.js
+++ b/www/manager6/storage/LvmThinEdit.js
@@ -93,7 +93,7 @@ Ext.define('PVE.storage.BaseVGSelector', {
 });
 
 Ext.define('PVE.storage.LvmThinInputPanel', {
-    extend: 'PVE.panel.StorageBase',
+    extend: 'PVE.panel.StorageBaseLocal',
 
     onlineHelp: 'storage_lvmthin',
 
@@ -123,6 +123,7 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
 	if (me.isCreate) {
 	    var vgField = Ext.create('PVE.storage.TPoolSelector', {
 		name: 'thinpool',
+		reference: 'pveLVMThinPoolSelector',
 		fieldLabel: gettext('Thin Pool'),
 		allowBlank: false,
 	    });
@@ -130,6 +131,7 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
 	    me.column1.push({
 		xtype: 'pveBaseVGSelector',
 		name: 'vgname',
+		reference: 'pveLVMThinVGSelector',
 		fieldLabel: gettext('Volume group'),
 		listeners: {
 		    change: function(f, value) {
@@ -163,5 +165,15 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
 	me.column2 = [];
 
 	me.callParent();
+
+	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
+	nodeSelector.on({
+		change: {
+		    fn: function() {
+			me.controller.clearValueSetUrl('pveLVMThinVGSelector', '/scan/lvm', nodeSelector);
+			me.controller.clearValueSetUrl('pveLVMThinPoolSelector', '/scan/lvmthin', nodeSelector);
+		    },
+		},
+	});
     },
 });
diff --git a/www/manager6/storage/ZFSPoolEdit.js b/www/manager6/storage/ZFSPoolEdit.js
index 8e689f0c..885f7a47 100644
--- a/www/manager6/storage/ZFSPoolEdit.js
+++ b/www/manager6/storage/ZFSPoolEdit.js
@@ -2,6 +2,7 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
     extend: 'Ext.form.field.ComboBox',
     alias: 'widget.pveZFSPoolSelector',
     valueField: 'pool',
+    reference: "pveZFSPoolSelector",
     displayField: 'pool',
     queryMode: 'local',
     editable: false,
@@ -23,7 +24,6 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
 		url: '/api2/json/nodes/' + me.nodename + '/scan/zfs',
 	    },
 	});
-
 	store.sort('pool', 'ASC');
 
 	Ext.apply(me, {
@@ -35,7 +35,7 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
 });
 
 Ext.define('PVE.storage.ZFSPoolInputPanel', {
-    extend: 'PVE.panel.StorageBase',
+    extend: 'PVE.panel.StorageBaseLocal',
 
     onlineHelp: 'storage_zfspool',
 
@@ -63,13 +63,13 @@ Ext.define('PVE.storage.ZFSPoolInputPanel', {
 	// 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,
+		xtype: 'pveContentTypeSelector',
+		cts: ['images', 'rootdir'],
+		fieldLabel: gettext('Content'),
+		name: 'content',
+		value: ['images', 'rootdir'],
+		multiSelect: true,
+		allowBlank: false,
 	});
 	me.column2 = [
 	    {
@@ -89,5 +89,11 @@ xtype: 'pveContentTypeSelector',
 	];
 
 	me.callParent();
+	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
+	nodeSelector.on({
+		change: {
+		    fn: 'clearValueSetUrl', args: ['pveZFSPoolSelector', '/scan/zfs'],
+		},
+	});
     },
 });
-- 
2.30.2





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

* [pve-devel] [PATCH QQQ] fix #2822: enable node storage scanning for LVM, LVMThin & ZFS
  2022-05-24 14:45 [pve-devel] [PATCH storage, manager 0/2] fix #2822: add lvm, lvmthin & zfs storage on all cluster nodes Stefan Hrdlicka
  2022-05-24 14:45 ` [pve-devel] [PATCH pve-storage 1/2] " Stefan Hrdlicka
  2022-05-24 14:45 ` [pve-devel] [PATCH pve-manager 2/2] " Stefan Hrdlicka
@ 2022-05-24 14:45 ` Stefan Hrdlicka
  2022-05-24 14:58   ` Stefan Hrdlicka
  2 siblings, 1 reply; 7+ messages in thread
From: Stefan Hrdlicka @ 2022-05-24 14:45 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 first node in the list 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/controller/StorageEdit.js | 20 ++++++++++++++++++++
 www/manager6/storage/Base.js           | 24 ++++++++++++++++++++++++
 www/manager6/storage/LVMEdit.js        |  9 ++++++++-
 www/manager6/storage/LvmThinEdit.js    | 14 +++++++++++++-
 www/manager6/storage/ZFSPoolEdit.js    | 24 +++++++++++++++---------
 5 files changed, 80 insertions(+), 11 deletions(-)

diff --git a/www/manager6/controller/StorageEdit.js b/www/manager6/controller/StorageEdit.js
index cb73b776..25745a5b 100644
--- a/www/manager6/controller/StorageEdit.js
+++ b/www/manager6/controller/StorageEdit.js
@@ -25,3 +25,23 @@ Ext.define('PVE.controller.StorageEdit', {
 	},
     },
 });
+
+Ext.define('PVE.storage.StorageLocalController', {
+    extend: 'PVE.controller.StorageEdit',
+    alias: 'controller.storageLocal',
+    apiBaseUrl: '/api2/json/nodes/',
+
+    clearValueSetUrl: function(reference, path, nodeSelector) {
+	var me = this;
+
+	var refObj = me.lookupReference(reference);
+	refObj.clearValue();
+
+	var refObjStore = refObj.getStore();
+	refObjStore.getProxy().setUrl(me.apiBaseUrl + nodeSelector.value + path);
+	refObjStore.load();
+
+	var nodeRestriction = me.lookupReference('nodeRestriction');
+	nodeRestriction.setValue(nodeSelector.value);
+    },
+});
diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
index 7f6d7a09..121cf26e 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: 'nodeRestriction',
 		disabled: me.storageId === 'local',
 		fieldLabel: gettext('Nodes'),
 		emptyText: gettext('All') + ' (' + gettext('No restrictions') +')',
@@ -76,6 +77,29 @@ Ext.define('PVE.panel.StorageBase', {
     },
 });
 
+Ext.define('PVE.panel.StorageBaseLocal', {
+    extend: 'PVE.panel.StorageBase',
+    controller: 'storageLocal',
+
+    initComponent: function() {
+	var me = this;
+
+	me.columnT = [
+	    {
+		xtype: 'pveNodeSelector',
+		reference: 'pveNodeSelector',
+		name: 'node',
+		itemId: 'pveNodeSelector',
+		fieldLabel: gettext('Scan node'),
+		allowBlank: false,
+		disallowedNodes: undefined,
+		onlineValidator: true,
+	}];
+	me.callParent();
+    },
+
+});
+
 Ext.define('PVE.storage.BaseEdit', {
     extend: 'Proxmox.window.Edit',
 
diff --git a/www/manager6/storage/LVMEdit.js b/www/manager6/storage/LVMEdit.js
index 2a9cd283..d6f8da06 100644
--- a/www/manager6/storage/LVMEdit.js
+++ b/www/manager6/storage/LVMEdit.js
@@ -84,7 +84,7 @@ Ext.define('PVE.storage.BaseStorageSelector', {
 });
 
 Ext.define('PVE.storage.LVMInputPanel', {
-    extend: 'PVE.panel.StorageBase',
+    extend: 'PVE.panel.StorageBaseLocal',
 
     onlineHelp: 'storage_lvm',
 
@@ -105,6 +105,7 @@ Ext.define('PVE.storage.LVMInputPanel', {
 	if (me.isCreate) {
 	    var vgField = Ext.create('PVE.storage.VgSelector', {
 		name: 'vgname',
+		reference: 'pveLVMVGSelector',
 		fieldLabel: gettext('Volume group'),
 		allowBlank: false,
 	    });
@@ -175,5 +176,11 @@ Ext.define('PVE.storage.LVMInputPanel', {
 	];
 
 	me.callParent();
+	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
+	nodeSelector.on({
+		change: {
+		    fn: 'clearValueSetUrl', args: ['pveLVMVGSelector', '/scan/lvm'],
+		},
+	});
     },
 });
diff --git a/www/manager6/storage/LvmThinEdit.js b/www/manager6/storage/LvmThinEdit.js
index 4eab7740..ab1abb4c 100644
--- a/www/manager6/storage/LvmThinEdit.js
+++ b/www/manager6/storage/LvmThinEdit.js
@@ -93,7 +93,7 @@ Ext.define('PVE.storage.BaseVGSelector', {
 });
 
 Ext.define('PVE.storage.LvmThinInputPanel', {
-    extend: 'PVE.panel.StorageBase',
+    extend: 'PVE.panel.StorageBaseLocal',
 
     onlineHelp: 'storage_lvmthin',
 
@@ -123,6 +123,7 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
 	if (me.isCreate) {
 	    var vgField = Ext.create('PVE.storage.TPoolSelector', {
 		name: 'thinpool',
+		reference: 'pveLVMThinPoolSelector',
 		fieldLabel: gettext('Thin Pool'),
 		allowBlank: false,
 	    });
@@ -130,6 +131,7 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
 	    me.column1.push({
 		xtype: 'pveBaseVGSelector',
 		name: 'vgname',
+		reference: 'pveLVMThinVGSelector',
 		fieldLabel: gettext('Volume group'),
 		listeners: {
 		    change: function(f, value) {
@@ -163,5 +165,15 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
 	me.column2 = [];
 
 	me.callParent();
+
+	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
+	nodeSelector.on({
+		change: {
+		    fn: function() {
+			me.controller.clearValueSetUrl('pveLVMThinVGSelector', '/scan/lvm', nodeSelector);
+			me.controller.clearValueSetUrl('pveLVMThinPoolSelector', '/scan/lvmthin', nodeSelector);
+		    },
+		},
+	});
     },
 });
diff --git a/www/manager6/storage/ZFSPoolEdit.js b/www/manager6/storage/ZFSPoolEdit.js
index 8e689f0c..885f7a47 100644
--- a/www/manager6/storage/ZFSPoolEdit.js
+++ b/www/manager6/storage/ZFSPoolEdit.js
@@ -2,6 +2,7 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
     extend: 'Ext.form.field.ComboBox',
     alias: 'widget.pveZFSPoolSelector',
     valueField: 'pool',
+    reference: "pveZFSPoolSelector",
     displayField: 'pool',
     queryMode: 'local',
     editable: false,
@@ -23,7 +24,6 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
 		url: '/api2/json/nodes/' + me.nodename + '/scan/zfs',
 	    },
 	});
-
 	store.sort('pool', 'ASC');
 
 	Ext.apply(me, {
@@ -35,7 +35,7 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
 });
 
 Ext.define('PVE.storage.ZFSPoolInputPanel', {
-    extend: 'PVE.panel.StorageBase',
+    extend: 'PVE.panel.StorageBaseLocal',
 
     onlineHelp: 'storage_zfspool',
 
@@ -63,13 +63,13 @@ Ext.define('PVE.storage.ZFSPoolInputPanel', {
 	// 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,
+		xtype: 'pveContentTypeSelector',
+		cts: ['images', 'rootdir'],
+		fieldLabel: gettext('Content'),
+		name: 'content',
+		value: ['images', 'rootdir'],
+		multiSelect: true,
+		allowBlank: false,
 	});
 	me.column2 = [
 	    {
@@ -89,5 +89,11 @@ xtype: 'pveContentTypeSelector',
 	];
 
 	me.callParent();
+	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
+	nodeSelector.on({
+		change: {
+		    fn: 'clearValueSetUrl', args: ['pveZFSPoolSelector', '/scan/zfs'],
+		},
+	});
     },
 });
-- 
2.30.2





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

* Re: [pve-devel] [PATCH QQQ] fix #2822: enable node storage scanning for LVM, LVMThin & ZFS
  2022-05-24 14:45 ` [pve-devel] [PATCH QQQ] fix #2822: enable node storage scanning for LVM, LVMThin & ZFS Stefan Hrdlicka
@ 2022-05-24 14:58   ` Stefan Hrdlicka
  0 siblings, 0 replies; 7+ messages in thread
From: Stefan Hrdlicka @ 2022-05-24 14:58 UTC (permalink / raw)
  To: pve-devel

please ignore this, there was an old file in my folder

On 5/24/22 16:45, 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 first node in the list 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/controller/StorageEdit.js | 20 ++++++++++++++++++++
>   www/manager6/storage/Base.js           | 24 ++++++++++++++++++++++++
>   www/manager6/storage/LVMEdit.js        |  9 ++++++++-
>   www/manager6/storage/LvmThinEdit.js    | 14 +++++++++++++-
>   www/manager6/storage/ZFSPoolEdit.js    | 24 +++++++++++++++---------
>   5 files changed, 80 insertions(+), 11 deletions(-)
>
> diff --git a/www/manager6/controller/StorageEdit.js b/www/manager6/controller/StorageEdit.js
> index cb73b776..25745a5b 100644
> --- a/www/manager6/controller/StorageEdit.js
> +++ b/www/manager6/controller/StorageEdit.js
> @@ -25,3 +25,23 @@ Ext.define('PVE.controller.StorageEdit', {
>   	},
>       },
>   });
> +
> +Ext.define('PVE.storage.StorageLocalController', {
> +    extend: 'PVE.controller.StorageEdit',
> +    alias: 'controller.storageLocal',
> +    apiBaseUrl: '/api2/json/nodes/',
> +
> +    clearValueSetUrl: function(reference, path, nodeSelector) {
> +	var me = this;
> +
> +	var refObj = me.lookupReference(reference);
> +	refObj.clearValue();
> +
> +	var refObjStore = refObj.getStore();
> +	refObjStore.getProxy().setUrl(me.apiBaseUrl + nodeSelector.value + path);
> +	refObjStore.load();
> +
> +	var nodeRestriction = me.lookupReference('nodeRestriction');
> +	nodeRestriction.setValue(nodeSelector.value);
> +    },
> +});
> diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
> index 7f6d7a09..121cf26e 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: 'nodeRestriction',
>   		disabled: me.storageId === 'local',
>   		fieldLabel: gettext('Nodes'),
>   		emptyText: gettext('All') + ' (' + gettext('No restrictions') +')',
> @@ -76,6 +77,29 @@ Ext.define('PVE.panel.StorageBase', {
>       },
>   });
>   
> +Ext.define('PVE.panel.StorageBaseLocal', {
> +    extend: 'PVE.panel.StorageBase',
> +    controller: 'storageLocal',
> +
> +    initComponent: function() {
> +	var me = this;
> +
> +	me.columnT = [
> +	    {
> +		xtype: 'pveNodeSelector',
> +		reference: 'pveNodeSelector',
> +		name: 'node',
> +		itemId: 'pveNodeSelector',
> +		fieldLabel: gettext('Scan node'),
> +		allowBlank: false,
> +		disallowedNodes: undefined,
> +		onlineValidator: true,
> +	}];
> +	me.callParent();
> +    },
> +
> +});
> +
>   Ext.define('PVE.storage.BaseEdit', {
>       extend: 'Proxmox.window.Edit',
>   
> diff --git a/www/manager6/storage/LVMEdit.js b/www/manager6/storage/LVMEdit.js
> index 2a9cd283..d6f8da06 100644
> --- a/www/manager6/storage/LVMEdit.js
> +++ b/www/manager6/storage/LVMEdit.js
> @@ -84,7 +84,7 @@ Ext.define('PVE.storage.BaseStorageSelector', {
>   });
>   
>   Ext.define('PVE.storage.LVMInputPanel', {
> -    extend: 'PVE.panel.StorageBase',
> +    extend: 'PVE.panel.StorageBaseLocal',
>   
>       onlineHelp: 'storage_lvm',
>   
> @@ -105,6 +105,7 @@ Ext.define('PVE.storage.LVMInputPanel', {
>   	if (me.isCreate) {
>   	    var vgField = Ext.create('PVE.storage.VgSelector', {
>   		name: 'vgname',
> +		reference: 'pveLVMVGSelector',
>   		fieldLabel: gettext('Volume group'),
>   		allowBlank: false,
>   	    });
> @@ -175,5 +176,11 @@ Ext.define('PVE.storage.LVMInputPanel', {
>   	];
>   
>   	me.callParent();
> +	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
> +	nodeSelector.on({
> +		change: {
> +		    fn: 'clearValueSetUrl', args: ['pveLVMVGSelector', '/scan/lvm'],
> +		},
> +	});
>       },
>   });
> diff --git a/www/manager6/storage/LvmThinEdit.js b/www/manager6/storage/LvmThinEdit.js
> index 4eab7740..ab1abb4c 100644
> --- a/www/manager6/storage/LvmThinEdit.js
> +++ b/www/manager6/storage/LvmThinEdit.js
> @@ -93,7 +93,7 @@ Ext.define('PVE.storage.BaseVGSelector', {
>   });
>   
>   Ext.define('PVE.storage.LvmThinInputPanel', {
> -    extend: 'PVE.panel.StorageBase',
> +    extend: 'PVE.panel.StorageBaseLocal',
>   
>       onlineHelp: 'storage_lvmthin',
>   
> @@ -123,6 +123,7 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
>   	if (me.isCreate) {
>   	    var vgField = Ext.create('PVE.storage.TPoolSelector', {
>   		name: 'thinpool',
> +		reference: 'pveLVMThinPoolSelector',
>   		fieldLabel: gettext('Thin Pool'),
>   		allowBlank: false,
>   	    });
> @@ -130,6 +131,7 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
>   	    me.column1.push({
>   		xtype: 'pveBaseVGSelector',
>   		name: 'vgname',
> +		reference: 'pveLVMThinVGSelector',
>   		fieldLabel: gettext('Volume group'),
>   		listeners: {
>   		    change: function(f, value) {
> @@ -163,5 +165,15 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
>   	me.column2 = [];
>   
>   	me.callParent();
> +
> +	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
> +	nodeSelector.on({
> +		change: {
> +		    fn: function() {
> +			me.controller.clearValueSetUrl('pveLVMThinVGSelector', '/scan/lvm', nodeSelector);
> +			me.controller.clearValueSetUrl('pveLVMThinPoolSelector', '/scan/lvmthin', nodeSelector);
> +		    },
> +		},
> +	});
>       },
>   });
> diff --git a/www/manager6/storage/ZFSPoolEdit.js b/www/manager6/storage/ZFSPoolEdit.js
> index 8e689f0c..885f7a47 100644
> --- a/www/manager6/storage/ZFSPoolEdit.js
> +++ b/www/manager6/storage/ZFSPoolEdit.js
> @@ -2,6 +2,7 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
>       extend: 'Ext.form.field.ComboBox',
>       alias: 'widget.pveZFSPoolSelector',
>       valueField: 'pool',
> +    reference: "pveZFSPoolSelector",
>       displayField: 'pool',
>       queryMode: 'local',
>       editable: false,
> @@ -23,7 +24,6 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
>   		url: '/api2/json/nodes/' + me.nodename + '/scan/zfs',
>   	    },
>   	});
> -
>   	store.sort('pool', 'ASC');
>   
>   	Ext.apply(me, {
> @@ -35,7 +35,7 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
>   });
>   
>   Ext.define('PVE.storage.ZFSPoolInputPanel', {
> -    extend: 'PVE.panel.StorageBase',
> +    extend: 'PVE.panel.StorageBaseLocal',
>   
>       onlineHelp: 'storage_zfspool',
>   
> @@ -63,13 +63,13 @@ Ext.define('PVE.storage.ZFSPoolInputPanel', {
>   	// 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,
> +		xtype: 'pveContentTypeSelector',
> +		cts: ['images', 'rootdir'],
> +		fieldLabel: gettext('Content'),
> +		name: 'content',
> +		value: ['images', 'rootdir'],
> +		multiSelect: true,
> +		allowBlank: false,
>   	});
>   	me.column2 = [
>   	    {
> @@ -89,5 +89,11 @@ xtype: 'pveContentTypeSelector',
>   	];
>   
>   	me.callParent();
> +	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
> +	nodeSelector.on({
> +		change: {
> +		    fn: 'clearValueSetUrl', args: ['pveZFSPoolSelector', '/scan/zfs'],
> +		},
> +	});
>       },
>   });




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

* Re: [pve-devel] [PATCH pve-storage 1/2] fix #2822: add lvm, lvmthin & zfs storage on all cluster nodes
  2022-05-24 14:45 ` [pve-devel] [PATCH pve-storage 1/2] " Stefan Hrdlicka
@ 2022-06-07 12:54   ` Fabian Ebner
  0 siblings, 0 replies; 7+ messages in thread
From: Fabian Ebner @ 2022-06-07 12:54 UTC (permalink / raw)
  To: pve-devel, s.hrdlicka

Am 24.05.22 um 16:45 schrieb Stefan Hrdlicka:
> this enables forwarding of request to the correct node if a node is set
> 
> Signed-off-by: Stefan Hrdlicka <s.hrdlicka@proxmox.com>
> ---
>  PVE/API2/Storage/Config.pm | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/PVE/API2/Storage/Config.pm b/PVE/API2/Storage/Config.pm
> index 6bd770e..82b73ca 100755
> --- a/PVE/API2/Storage/Config.pm
> +++ b/PVE/API2/Storage/Config.pm
> @@ -146,6 +146,13 @@ __PACKAGE__->register_method ({
>      protected => 1,
>      path => '',
>      method => 'POST',
> +    proxyto_callback => sub {
> +	my ($rpcenv, $proxyto, $uri_param) = @_;
> +	my $node = delete $uri_param->{node};

Messing with the uri params here is hacky. It destroys the consistency
between the API schema and what the API call actually handles.

It's not really required to proxy the call to a specific node. The only
downside is that we don't do an early storage access check if the
storage is not enabled for the current node.

> +	$node = "localhost" if !$node;
> +
> +	return $node;
> +    },
>      description => "Create a new storage.",
>      permissions => {
>  	check => ['perm', '/storage', ['Datastore.Allocate']],




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

* Re: [pve-devel] [PATCH pve-manager 2/2] fix #2822: add lvm, lvmthin & zfs storage on all cluster nodes
  2022-05-24 14:45 ` [pve-devel] [PATCH pve-manager 2/2] " Stefan Hrdlicka
@ 2022-06-07 12:54   ` Fabian Ebner
  0 siblings, 0 replies; 7+ messages in thread
From: Fabian Ebner @ 2022-06-07 12:54 UTC (permalink / raw)
  To: pve-devel, s.hrdlicka

Am 24.05.22 um 16:45 schrieb Stefan Hrdlicka:
> 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.
> 

IMHO it's not immediately clear what the "Scan node" is for if the
selector is at the very top. I'd put it closer to the VG/thin pool/ZFS
pool selectors it's affecting. And maybe worth adding a tooltip too?

This patch changes the pre-selected nodes restriction to be the current
node. Previously, it was all nodes.

For LVM, when selecting an iSCSI storage as the base storage, the
content/LUN listing could also be proxied to the "Scan node", because
the storage might not be accessiable from the local node.

> Signed-off-by: Stefan Hrdlicka <s.hrdlicka@proxmox.com>
> ---
> 
> Depends on the change in pve-storage
> 
>  www/manager6/controller/StorageEdit.js | 20 ++++++++++++++++++++
>  www/manager6/storage/Base.js           | 25 +++++++++++++++++++++++++
>  www/manager6/storage/LVMEdit.js        |  9 ++++++++-
>  www/manager6/storage/LvmThinEdit.js    | 14 +++++++++++++-
>  www/manager6/storage/ZFSPoolEdit.js    | 24 +++++++++++++++---------
>  5 files changed, 81 insertions(+), 11 deletions(-)
> 
> diff --git a/www/manager6/controller/StorageEdit.js b/www/manager6/controller/StorageEdit.js
> index cb73b776..25745a5b 100644
> --- a/www/manager6/controller/StorageEdit.js
> +++ b/www/manager6/controller/StorageEdit.js
> @@ -25,3 +25,23 @@ Ext.define('PVE.controller.StorageEdit', {
>  	},
>      },
>  });
> +
> +Ext.define('PVE.storage.StorageLocalController', {
> +    extend: 'PVE.controller.StorageEdit',
> +    alias: 'controller.storageLocal',
> +    apiBaseUrl: '/api2/json/nodes/',
> +
> +    clearValueSetUrl: function(reference, path, nodeSelector) {

Nit: could pass nodeSelector.value directly and from the name it's not
clear that the node restrictions are updated.

> +	var me = this;

Please use let or const instead of var, see:
https://pve.proxmox.com/wiki/Javascript_Style_Guide#Variables

> +
> +	var refObj = me.lookupReference(reference);
> +	refObj.clearValue();
> +
> +	var refObjStore = refObj.getStore();
> +	refObjStore.getProxy().setUrl(me.apiBaseUrl + nodeSelector.value + path);
> +	refObjStore.load();

It's great that you were able to be so concise, but I'm not too happy
about the bit of coupling that comes with it. To avoid accessing the
internals of these other components, I'd teach them a setNodename()
method. The clear() could also happen as part of the setNodename() methods.

And we could call setNodename() and update the node restrictions
directly, avoiding the need for this controller. But maybe others prefer
the approach with the contorller?

> +
> +	var nodeRestriction = me.lookupReference('nodeRestriction');
> +	nodeRestriction.setValue(nodeSelector.value);
> +    },
> +});
> diff --git a/www/manager6/storage/Base.js b/www/manager6/storage/Base.js
> index 7f6d7a09..92654131 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: 'nodeRestriction',
>  		disabled: me.storageId === 'local',
>  		fieldLabel: gettext('Nodes'),
>  		emptyText: gettext('All') + ' (' + gettext('No restrictions') +')',
> @@ -76,6 +77,30 @@ Ext.define('PVE.panel.StorageBase', {
>      },
>  });
>  
> +Ext.define('PVE.panel.StorageBaseLocal', {

Not really accurate, because it's not a base for all local storage types
and it's a base for LVM, which can also be shared.

> +    extend: 'PVE.panel.StorageBase',
> +    controller: 'storageLocal',
> +
> +    initComponent: function() {
> +	var me = this;
> +
> +	me.columnT = [
> +	    {
> +		xtype: 'pveNodeSelector',
> +		reference: 'pveNodeSelector',

A bit generic for a reference, I'd at least include the "scan" part.

> +		name: 'node',
> +		itemId: 'pveNodeSelector',
> +		fieldLabel: gettext('Scan node'),
> +		allowBlank: false,
> +		disallowedNodes: undefined,
> +		onlineValidator: true,
> +		preferredValue: Proxmox.NodeName,
> +	}];
> +	me.callParent();
> +    },
> +
> +});
> +
>  Ext.define('PVE.storage.BaseEdit', {
>      extend: 'Proxmox.window.Edit',
>  
> diff --git a/www/manager6/storage/LVMEdit.js b/www/manager6/storage/LVMEdit.js
> index 2a9cd283..d6f8da06 100644
> --- a/www/manager6/storage/LVMEdit.js
> +++ b/www/manager6/storage/LVMEdit.js
> @@ -84,7 +84,7 @@ Ext.define('PVE.storage.BaseStorageSelector', {
>  });
>  
>  Ext.define('PVE.storage.LVMInputPanel', {
> -    extend: 'PVE.panel.StorageBase',
> +    extend: 'PVE.panel.StorageBaseLocal',
>  
>      onlineHelp: 'storage_lvm',
>  
> @@ -105,6 +105,7 @@ Ext.define('PVE.storage.LVMInputPanel', {
>  	if (me.isCreate) {
>  	    var vgField = Ext.create('PVE.storage.VgSelector', {
>  		name: 'vgname',
> +		reference: 'pveLVMVGSelector',
>  		fieldLabel: gettext('Volume group'),
>  		allowBlank: false,
>  	    });
> @@ -175,5 +176,11 @@ Ext.define('PVE.storage.LVMInputPanel', {
>  	];
>  
>  	me.callParent();
> +	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
> +	nodeSelector.on({
> +		change: {
> +		    fn: 'clearValueSetUrl', args: ['pveLVMVGSelector', '/scan/lvm'],
> +		},

Style nit: indented once too much.

> +	});
>      },
>  });
> diff --git a/www/manager6/storage/LvmThinEdit.js b/www/manager6/storage/LvmThinEdit.js
> index 4eab7740..ab1abb4c 100644
> --- a/www/manager6/storage/LvmThinEdit.js
> +++ b/www/manager6/storage/LvmThinEdit.js
> @@ -93,7 +93,7 @@ Ext.define('PVE.storage.BaseVGSelector', {
>  });
>  
>  Ext.define('PVE.storage.LvmThinInputPanel', {
> -    extend: 'PVE.panel.StorageBase',
> +    extend: 'PVE.panel.StorageBaseLocal',
>  
>      onlineHelp: 'storage_lvmthin',
>  
> @@ -123,6 +123,7 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
>  	if (me.isCreate) {
>  	    var vgField = Ext.create('PVE.storage.TPoolSelector', {
>  		name: 'thinpool',
> +		reference: 'pveLVMThinPoolSelector',
>  		fieldLabel: gettext('Thin Pool'),
>  		allowBlank: false,
>  	    });
> @@ -130,6 +131,7 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
>  	    me.column1.push({
>  		xtype: 'pveBaseVGSelector',
>  		name: 'vgname',
> +		reference: 'pveLVMThinVGSelector',
>  		fieldLabel: gettext('Volume group'),
>  		listeners: {
>  		    change: function(f, value) {
> @@ -163,5 +165,15 @@ Ext.define('PVE.storage.LvmThinInputPanel', {
>  	me.column2 = [];
>  
>  	me.callParent();
> +
> +	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
> +	nodeSelector.on({
> +		change: {
> +		    fn: function() {
> +			me.controller.clearValueSetUrl('pveLVMThinVGSelector', '/scan/lvm', nodeSelector);
> +			me.controller.clearValueSetUrl('pveLVMThinPoolSelector', '/scan/lvmthin', nodeSelector);
> +		    },
> +		},

Style nit: same here.

> +	});
>      },
>  });
> diff --git a/www/manager6/storage/ZFSPoolEdit.js b/www/manager6/storage/ZFSPoolEdit.js
> index 8e689f0c..885f7a47 100644
> --- a/www/manager6/storage/ZFSPoolEdit.js
> +++ b/www/manager6/storage/ZFSPoolEdit.js
> @@ -2,6 +2,7 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
>      extend: 'Ext.form.field.ComboBox',
>      alias: 'widget.pveZFSPoolSelector',
>      valueField: 'pool',
> +    reference: "pveZFSPoolSelector",
>      displayField: 'pool',
>      queryMode: 'local',
>      editable: false,
> @@ -23,7 +24,6 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
>  		url: '/api2/json/nodes/' + me.nodename + '/scan/zfs',
>  	    },
>  	});
> -

Nit: unrelated change.

>  	store.sort('pool', 'ASC');
>  
>  	Ext.apply(me, {
> @@ -35,7 +35,7 @@ Ext.define('PVE.storage.ZFSPoolSelector', {
>  });
>  
>  Ext.define('PVE.storage.ZFSPoolInputPanel', {
> -    extend: 'PVE.panel.StorageBase',
> +    extend: 'PVE.panel.StorageBaseLocal',
>  
>      onlineHelp: 'storage_zfspool',
>  
> @@ -63,13 +63,13 @@ Ext.define('PVE.storage.ZFSPoolInputPanel', {
>  	// 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,
> +		xtype: 'pveContentTypeSelector',
> +		cts: ['images', 'rootdir'],
> +		fieldLabel: gettext('Content'),
> +		name: 'content',
> +		value: ['images', 'rootdir'],
> +		multiSelect: true,
> +		allowBlank: false,

Can still be improved, because of the mismatch between beginning
me.column1.push(
    {
and end
});

It's an unrelated cleanup and thus should be its own patch.

>  	});
>  	me.column2 = [
>  	    {
> @@ -89,5 +89,11 @@ xtype: 'pveContentTypeSelector',
>  	];
>  
>  	me.callParent();
> +	var nodeSelector = Ext.ComponentQuery.query('#pveNodeSelector')[0];
> +	nodeSelector.on({
> +		change: {
> +		    fn: 'clearValueSetUrl', args: ['pveZFSPoolSelector', '/scan/zfs'],
> +		},

Style nit: same here.

> +	});
>      },
>  });




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

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

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-24 14:45 [pve-devel] [PATCH storage, manager 0/2] fix #2822: add lvm, lvmthin & zfs storage on all cluster nodes Stefan Hrdlicka
2022-05-24 14:45 ` [pve-devel] [PATCH pve-storage 1/2] " Stefan Hrdlicka
2022-06-07 12:54   ` Fabian Ebner
2022-05-24 14:45 ` [pve-devel] [PATCH pve-manager 2/2] " Stefan Hrdlicka
2022-06-07 12:54   ` Fabian Ebner
2022-05-24 14:45 ` [pve-devel] [PATCH QQQ] fix #2822: enable node storage scanning for LVM, LVMThin & ZFS Stefan Hrdlicka
2022-05-24 14:58   ` 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