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

Reply via email to