* [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