Showing already configured custom device classes makes it easier to create new OSDs with custom device classes.
The Crush map contains a list of all OSDs in the cluster, including their device class. This means we can create a list of used device classes from it, avoiding adding another API endpoint. Fetching the crushmap should also be quite a bit less data that needs to be transferred, compared to the other possible nodes/<node>/ceph/osd endpoint, especially in larger clusters. Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com> --- www/manager6/ceph/OSD.js | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/www/manager6/ceph/OSD.js b/www/manager6/ceph/OSD.js index 30671dc4..eb27d3b3 100644 --- a/www/manager6/ceph/OSD.js +++ b/www/manager6/ceph/OSD.js @@ -17,6 +17,38 @@ Ext.define('PVE.CephCreateOsd', { me.isCreate = true; + let deviceClasses = [ + ['hdd', 'HDD'], + ['ssd', 'SSD'], + ['nvme', 'NVMe'], + ]; + + Proxmox.Utils.API2Request({ + url: "/nodes/" + me.nodename + "/ceph/crush", + method: 'GET', + failure: function(response, opts) { + let msg = response.htmlStatus; + console.error('Failed to load crushmap', msg); + // We still need to show the default list of device classes + me.down('field[name=crush-device-class]').setComboItems(deviceClasses); + }, + success: function(response, opts) { + let data = response.result.data; + + let classes = new Set(); + for (const match of data.matchAll(/^device\s[0-9]*\sosd\.[0-9]*\sclass\s(.*)$/gim)) { + classes.add(match[1]); + } + for (const v of ['hdd', 'ssd', 'nvme']) { + classes.delete(v); + } + for (const v of classes) { + deviceClasses.push([v, v]); + } + me.down('field[name=crush-device-class]').setComboItems(deviceClasses); + }, + }); + Ext.applyIf(me, { url: "/nodes/" + me.nodename + "/ceph/osd", method: 'POST', @@ -81,11 +113,6 @@ Ext.define('PVE.CephCreateOsd', { }, { xtype: 'proxmoxKVComboBox', - comboItems: [ - ['hdd', 'HDD'], - ['ssd', 'SSD'], - ['nvme', 'NVMe'], - ], name: 'crush-device-class', nodename: me.nodename, fieldLabel: gettext('Device Class'), -- 2.30.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel