all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Maximiliano Sandoval <m.sandoval@proxmox.com>
To: Arthur Bied-Charreton <a.bied-charreton@proxmox.com>
Cc: pve-devel@lists.proxmox.com
Subject: Re: [PATCH pve-manager 5/8] ui: Add CPU flag editor for custom models
Date: Thu, 26 Mar 2026 16:40:12 +0100	[thread overview]
Message-ID: <s8oh5q2oazn.fsf@toolbox> (raw)
In-Reply-To: <20260312084021.124465-6-a.bied-charreton@proxmox.com> (Arthur Bied-Charreton's message of "Thu, 12 Mar 2026 09:40:18 +0100")

Arthur Bied-Charreton <a.bied-charreton@proxmox.com> writes:

> Add CPU flag editor to the CPUTypeEdit component, using the VMCPUFlagSelector
> also used in the VM creation flow. By default, only show the CPU flags that
> are currently meant to be shown in the VM creation window, see [0]. When in
> CPUTypeEdit, show all available flags.
>
> For each flag in VMCPUFlagSelector, also display which node(s) it is available
> on to limit misconfigurations.
>
> Original patch:
> https://lore.proxmox.com/pve-devel/20211028114150.3245864-10-s.reiter@proxmox.com
>
> [0] https://git.proxmox.com/?p=qemu-server.git;a=blob;f=src/PVE/QemuServer/CPUConfig.pm;h=32ec495422791422f20caa928d6b632b3de4fcd9;hb=refs/heads/master#l349
>
> Originally-by: Stefan Reiter <s.reiter@proxmox.com>
> Signed-off-by: Arthur Bied-Charreton <a.bied-charreton@proxmox.com>
> ---
>  www/manager6/dc/CPUTypeEdit.js         |  11 ++-
>  www/manager6/form/CPUModelSelector.js  |   1 +
>  www/manager6/form/VMCPUFlagSelector.js | 121 ++++++++++++++++++++++---
>  3 files changed, 117 insertions(+), 16 deletions(-)
>
> diff --git a/www/manager6/dc/CPUTypeEdit.js b/www/manager6/dc/CPUTypeEdit.js
> index 8cf508b4..d6e06601 100644
> --- a/www/manager6/dc/CPUTypeEdit.js
> +++ b/www/manager6/dc/CPUTypeEdit.js
> @@ -84,7 +84,16 @@ Ext.define('PVE.dc.CPUTypeEdit', {
>                      name: 'phys-bits',
>                  },
>              ],
> -
> +            columnB: [
> +                {
> +                    xtype: 'vmcpuflagselector',
> +                    fieldLabel: gettext('Extra CPU flags'),
> +                    name: 'flags',
> +                    restrictToVMFlags: false,
> +                    height: 380,
> +                    hideHeaders: false,
> +                },
> +            ],
>          },
>      ],
>  });
> diff --git a/www/manager6/form/CPUModelSelector.js b/www/manager6/form/CPUModelSelector.js
> index 2154ff46..683fa469 100644
> --- a/www/manager6/form/CPUModelSelector.js
> +++ b/www/manager6/form/CPUModelSelector.js
> @@ -17,6 +17,7 @@ Ext.define('PVE.form.CPUModelSelector', {
>      anyMatch: true,
>      forceSelection: true,
>      autoSelect: false,
> +    triggerAction: 'query',
>  
>      deleteEmpty: true,
>      config: {
> diff --git a/www/manager6/form/VMCPUFlagSelector.js b/www/manager6/form/VMCPUFlagSelector.js
> index 74b1a2c4..06c9d9f1 100644
> --- a/www/manager6/form/VMCPUFlagSelector.js
> +++ b/www/manager6/form/VMCPUFlagSelector.js
> @@ -1,3 +1,19 @@
> +const VM_CPU_FLAGS_SUBSET = {
> +    aes: true,
> +    'amd-no-ssb': true,
> +    'amd-ssbd': true,
> +    'hv-evmcs': true,
> +    'hv-tlbflush': true,
> +    ibpb: true,
> +    'md-clear': true,
> +    'nested-virt': true,
> +    pcid: true,
> +    pdpe1gb: true,
> +    'spec-ctrl': true,
> +    ssbd: true,
> +    'virt-ssbd': true,
> +};
> +
>  Ext.define('PVE.form.VMCPUFlagSelector', {
>      extend: 'Ext.grid.Panel',
>      alias: 'widget.vmcpuflagselector',
> @@ -6,6 +22,10 @@ Ext.define('PVE.form.VMCPUFlagSelector', {
>          field: 'Ext.form.field.Field',
>      },
>  
> +    config: {
> +        restrictToVMFlags: true,
> +    },
> +
>      disableSelection: true,
>      columnLines: false,
>      selectable: false,
> @@ -17,27 +37,18 @@ Ext.define('PVE.form.VMCPUFlagSelector', {
>      unknownFlags: [],
>  
>      store: {
> -        type: 'store',
> -        fields: ['name', { name: 'state', defaultValue: '=' }, 'description'],
> -        autoLoad: true,
> +        fields: ['name', { name: 'state', defaultValue: '=' }, 'description', 'supported-on'],
> +        autoLoad: false,
>          proxy: {
>              type: 'proxmox',
>              url: '/api2/json/nodes/localhost/capabilities/qemu/cpu-flags',
> +            extraParams: { accel: 'kvm' },
>          },
>          listeners: {
>              update: function () {
>                  this.commitChanges();
>              },
> -            refresh: function (store, eOpts) {
> -                let me = this;
> -                let view = me.view;
> -
> -                if (store.adjustedForValue !== view.value) {
> -                    view.adjustStoreForValue();
> -                }
> -            },
>          },
> -        adjustedForValue: undefined,
>      },
>  
>      getValue: function () {
> @@ -86,14 +97,18 @@ Ext.define('PVE.form.VMCPUFlagSelector', {
>              let rec = store.findRecord('name', flagName, 0, false, true, true);
>              if (rec !== null) {
>                  rec.set('state', sign);
> +                rec.commit();
>              } else {
>                  me.unknownFlags.push(flag);
>              }
>          });
>  
> -        store.adjustedForValue = value;
> +        me.getView().refresh();
> +    },
> +    isDirty: function () {
> +        let me = this;
> +        return me.originalValue !== me.getValue();
>      },
> -
>      setValue: function (value) {
>          let me = this;
>  
> @@ -109,6 +124,7 @@ Ext.define('PVE.form.VMCPUFlagSelector', {
>      },
>      columns: [
>          {
> +            text: gettext('State'),
>              dataIndex: 'state',
>              renderer: function (v) {
>                  switch (v) {
> @@ -125,6 +141,7 @@ Ext.define('PVE.form.VMCPUFlagSelector', {
>              width: 65,
>          },
>          {
> +            text: gettext('Set'),

This would benefit from a TRANSLATORS comment. Is this a noun (set as in
set theory)? is it a verb (to set)? From the point of view of
translators there is not enough context to decide.

>              xtype: 'widgetcolumn',
>              dataIndex: 'state',
>              width: 95,
> @@ -171,22 +188,96 @@ Ext.define('PVE.form.VMCPUFlagSelector', {
>              },
>          },
>          {
> +            text: gettext('Flag'),
>              dataIndex: 'name',
>              width: 100,
>          },
>          {
> +            text: gettext('Description'),
>              dataIndex: 'description',
> +            sortable: false,
> +            cellWrap: true,
> +            flex: 3,
> +        },
> +        {
> +            text: gettext('Supported On'),
> +            dataIndex: 'supported-on',
>              cellWrap: true,
>              flex: 1,
> +            renderer: (v) => (Array.isArray(v) ? v.join(', ') : ''),
>          },
>      ],
>  
>      initComponent: function () {
>          let me = this;
>  
> +        me.unknownFlags = [];
>          me.value = me.originalValue = '';
> -        me.store.view = me;
> +
> +        me.dockedItems = [
> +            {
> +                xtype: 'toolbar',
> +                dock: 'top',
> +                items: [
> +                    {
> +                        xtype: 'tbtext',
> +                        text: gettext('Acceleration:'),
> +                        autoEl: {
> +                            tag: 'span',
> +                            'data-qtip': gettext(
> +                                'A custom CPU model using acceleration-specific flags should only be assigned to VMs configured with the matching acceleration type, i.e., `kvm: off` for TCG, or `kvm: on` for KVM.',

I would recommend to use quotes `"`, single-quotes `'` in user-facing
strings. Backticks are a markup/markdown concept. See [1].

off-topic: In principle one should use “” rather than "", but I don't
think there is precedent for this the codebase.

[1] https://en.wikipedia.org/wiki/Quotation_mark#In_English

> +                            ),
> +                        },
> +                    },
> +                    {
> +                        xtype: 'radiogroup',
> +                        layout: 'hbox',
> +                        validateOnChange: false,
> +                        items: [
> +                            {
> +                                boxLabel: 'KVM',
> +                                inputValue: 'kvm',
> +                                name: 'accel',
> +                                checked: true,
> +                                isFormField: false,
> +                            },
> +                            {
> +                                boxLabel: 'TCG',
> +                                inputValue: 'tcg',
> +                                name: 'accel',
> +                                margin: '0 0 0 10',
> +                                isFormField: false,
> +                            },
> +                        ],
> +                        listeners: {
> +                            change: function (_, value) {
> +                                let view = this.up('grid');
> +                                let proxy = view.getStore().getProxy();
> +                                let accel = value.accel;
> +                                if (accel) {
> +                                    proxy.setExtraParam('accel', accel);
> +                                } else {
> +                                    delete proxy.extraParams.accel;
> +                                }
> +                                view.getStore().load();
> +                            },
> +                        },
> +                    },
> +                ],
> +            },
> +        ];
>  
>          me.callParent(arguments);
> +
> +        me.getStore().on('load', function (store, _, success) {
> +            if (success) {
> +                if (me.restrictToVMFlags) {
> +                    store.filterBy((rec) => VM_CPU_FLAGS_SUBSET[rec.get('name')] === true);
> +                }
> +                me.adjustStoreForValue();
> +                me.checkDirty();
> +            }
> +        });
> +        me.getStore().load();
>      },
>  });

-- 
Maximiliano




  parent reply	other threads:[~2026-03-26 15:40 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-12  8:40 [PATCH manager/qemu-server 0/8] Add API and UI for custom CPU models Arthur Bied-Charreton
2026-03-12  8:40 ` [PATCH pve-manager 1/8] ui: VMCPUFlagSelector: Fix unknownFlags behaviour Arthur Bied-Charreton
2026-03-25 15:57   ` Fiona Ebner
2026-03-26 13:47     ` Arthur Bied-Charreton
2026-03-12  8:40 ` [PATCH pve-manager 2/8] ui: CPUModelSelector: Fix dirty state on default Arthur Bied-Charreton
2026-03-26  9:53   ` Fiona Ebner
2026-03-26 14:14     ` Arthur Bied-Charreton
2026-03-12  8:40 ` [PATCH pve-manager 3/8] ui: CPUModelSelector: Allow filtering out custom models Arthur Bied-Charreton
2026-03-26  9:59   ` Fiona Ebner
2026-03-26 14:17     ` Arthur Bied-Charreton
2026-03-12  8:40 ` [PATCH pve-manager 4/8] ui: Add basic custom CPU model editor Arthur Bied-Charreton
2026-03-26 15:10   ` Fiona Ebner
2026-03-27  9:23     ` Arthur Bied-Charreton
2026-03-27  9:32       ` Fiona Ebner
2026-03-27  9:34         ` Arthur Bied-Charreton
2026-03-12  8:40 ` [PATCH pve-manager 5/8] ui: Add CPU flag editor for custom models Arthur Bied-Charreton
2026-03-26 15:22   ` Fiona Ebner
2026-03-27  9:34     ` Arthur Bied-Charreton
2026-03-26 15:40   ` Maximiliano Sandoval [this message]
2026-03-27  7:48     ` Arthur Bied-Charreton
2026-03-12  8:40 ` [PATCH qemu-server 6/8] qemu: Add helpers for new custom models endpoints Arthur Bied-Charreton
2026-03-20 17:20   ` Fiona Ebner
2026-03-23  6:56     ` Arthur Bied-Charreton
2026-03-12  8:40 ` [PATCH qemu-server 7/8] api: qemu: Extend cpu-flags endpoint to return actually supported flags Arthur Bied-Charreton
2026-03-20 17:20   ` Fiona Ebner
2026-03-23  7:25     ` Arthur Bied-Charreton
2026-03-12  8:40 ` [PATCH qemu-server 8/8] api: qemu: Add CRUD handlers for custom CPU models Arthur Bied-Charreton
2026-03-23 14:46   ` Fiona Ebner
2026-03-23 16:04     ` Arthur Bied-Charreton
2026-03-23 16:10       ` Arthur Bied-Charreton
2026-03-24  9:27         ` Fiona Ebner
2026-03-26 14:54 ` [PATCH manager/qemu-server 0/8] Add API and UI " Fiona Ebner
2026-03-27 13:07   ` Arthur Bied-Charreton
2026-03-27 13:28     ` Fiona Ebner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=s8oh5q2oazn.fsf@toolbox \
    --to=m.sandoval@proxmox.com \
    --cc=a.bied-charreton@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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