public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: David Riley <d.riley@proxmox.com>
To: Daniel Kral <d.kral@proxmox.com>, pve-devel@lists.proxmox.com
Subject: Re: [PATCH pve-manager v2 03/10] fix #7294: ui: pool: add SDN VNets as pool members
Date: Mon, 20 Jul 2026 10:21:36 +0200	[thread overview]
Message-ID: <313264dc-4b8d-4804-a427-91bed338c3b3@proxmox.com> (raw)
In-Reply-To: <DJRJWI71SQE8.39S52J8BTJA43@proxmox.com>

some comments inline.

On 7/6/26 4:17 PM, Daniel Kral wrote:
> On Fri Jun 26, 2026 at 3:10 PM CEST, David Riley wrote:
>> Add user interface to manage SDN VNets inside resource pools.
>> In the dialog window users can select an SDN zone, pick an associated
>> VNet, and optionally specify a VLAN tag.
>>
>> The VNet selector only shows VNets of the selected zone to prevent
>> invalid configurations.
>>
>> Link:https://bugzilla.proxmox.com/show_bug.cgi?id=7294
>> Signed-off-by: David Riley<d.riley@proxmox.com>
>> ---
>>   www/css/ext6-pve.css             |  15 ++++
>>   www/manager6/Utils.js            |   1 +
>>   www/manager6/grid/PoolMembers.js | 123 +++++++++++++++++++++++++++++++
>>   3 files changed, 139 insertions(+)
>>
>> diff --git a/www/css/ext6-pve.css b/www/css/ext6-pve.css
>> index 5c37dd29..3c383dfa 100644
>> --- a/www/css/ext6-pve.css
>> +++ b/www/css/ext6-pve.css
>> @@ -464,6 +464,21 @@ div.right-aligned {
>>       content: " ";
>>   }
>>   
>> +.x-fa-pool-net:before {
>> +    width: 14px;
>> +    height: 14px;
>> +    position: absolute;
>> +    left: 1px;
>> +    top: 1px;
>> +    opacity: 0.45;
>> +}
>> +
>> +.x-fa-pool-net-grid:before {
>> +    left: 14px;
>> +    top: 6px;
>> +    opacity: 0.65;
>> +}
>> +
> The patch message should contain the information from patch #4, which
> explains why there is an opacity applied here.


Alright. I'll add an explanation.


>>   .x-fa-treepanel:before {
>>       width: 16px;
>>       height: 24px;
>> diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js
>> index 040b5ae0..8f53dfb6 100644
>> --- a/www/manager6/Utils.js
>> +++ b/www/manager6/Utils.js
>> @@ -1322,6 +1322,7 @@ Ext.define('PVE.Utils', {
>>                   const networkTypeMapping = {
>>                       fabric: 'fa fa-road',
>>                       zone: 'fa fa-th',
>> +                    vnet: 'fa fa-network-wired x-fa-pool-net x-fa-pool-net-grid',
>>                   };
>>   
>>                   return networkTypeMapping[record['network-type']] ?? '';
>> diff --git a/www/manager6/grid/PoolMembers.js b/www/manager6/grid/PoolMembers.js
>> index 69f50e30..5aaa2b71 100644
>> --- a/www/manager6/grid/PoolMembers.js
>> +++ b/www/manager6/grid/PoolMembers.js
>> @@ -158,6 +158,108 @@ Ext.define('PVE.pool.AddStorage', {
>>       },
>>   });
>>   
>> +Ext.define('PVE.pool.AddVnet', {
>> +    extend: 'Proxmox.window.Edit',
>> +
>> +    viewModel: {
>> +        data: {
>> +            zone: '',
>> +        },
>> +        formulas: {
>> +            vnetDisabled: function (get) {
>> +                return !get('zone');
>> +            },
>> +        },
>> +    },
>> +
>> +    initComponent: function () {
>> +        let me = this;
>> +
>> +        if (!me.pool) {
>> +            throw 'no pool specified';
>> +        }
>> +
>> +        me.isCreate = true;
>> +        me.isAdd = true;
>> +        me.url = '/pools/';
>> +        me.method = 'PUT';
>> +        me.extraRequestParams.poolid = me.pool;
>> +
>> +        Ext.apply(me, {
>> +            subject: gettext('VNet'),
>> +            width: 350,
>> +            items: [
>> +                {
>> +                    xtype: 'inputpanel',
>> +                    onGetValues: function (values) {
>> +                        let network = `zone=${values.zone},vnet=${values.vnet}`;
>> +
>> +                        if (values.tag) {
>> +                            network += `,tag=${values.tag}`;
>> +                        }
>> +
>> +                        delete values.zone;
>> +                        delete values.vnet;
>> +                        delete values.tag;
>> +
>> +                        values.network = network;
>> +
>> +                        return values;
>> +                    },
>> +                    items: [
>> +                        {
>> +                            xtype: 'pveSDNZoneSelector',
>> +                            fieldLabel: gettext('Zone'),
>> +                            name: 'zone',
>> +                            allowBlank: false,
>> +                            bind: {
>> +                                value: '{zone}',
>> +                            },
>> +                            listeners: {
>> +                                change: function (_f, _value) {
>> +                                    let vnetField = me.down('field[name=vnet]');
>> +                                    if (vnetField) {
>> +                                        vnetField.setValue('');
>> +                                    }
> nit: might be nice to use a 'reference' on 'vnet' and then reference it
>       here with lookupReference('vnet'), but no hard feelings.


Would make the code a little cleaner. I'll refactored it.


>> +                                },
>> +                            },
>> +                        },
>> +                        {
>> +                            xtype: 'pveSDNVnetSelector',
>> +                            fieldLabel: gettext('VNet'),
>> +                            name: 'vnet',
>> +                            allowBlank: false,
>> +                            bind: {
>> +                                disabled: '{vnetDisabled}',
>> +                            },
>> +                            listeners: {
>> +                                beforequery: function (_queryPlan) {
>> +                                    let zone = me.getViewModel().get('zone');
>> +                                    let store = this.getStore();
>> +                                    store.clearFilter();
>> +                                    store.filter('zone', zone);
>> +                                    return true;
>> +                                },
>> +                            },
>> +                        },
>> +                        {
>> +                            xtype: 'proxmoxintegerfield',
>> +                            name: 'tag',
>> +                            fieldLabel: gettext('VLAN Tag'),
>> +                            minValue: 1,
>> +                            maxValue: 4094,
>> +                            allowBlank: true,
>> +                            emptyText: gettext('All'),
>> +                        },
>> +                    ],
>> +                },
>> +            ],
>> +        });
>> +
>> +        me.callParent();
>> +    },
>> +});
>> +
>>   Ext.define('PVE.grid.PoolMembers', {
>>       extend: 'Ext.grid.GridPanel',
>>       alias: ['widget.pvePoolMembers'],
>> @@ -223,6 +325,18 @@ Ext.define('PVE.grid.PoolMembers', {
>>                       rec.data.type === 'openvz'
>>                   ) {
>>                       params.vms = rec.data.vmid;
>> +                } else if (rec.get('type') === 'network') {
>> +                    if (rec.get('network-type') === 'vnet') {
>> +                        let [_type, zone, vnet, tag] = rec.data.id.split('/');
>> +
>> +                        let network = `zone=${zone},vnet=${vnet}`;
>> +
>> +                        if (tag) {
>> +                            network += `,tag=${tag}`;
>> +                        }
>> +
>> +                        params.network = network;
>> +                    }
> should maybe console.warn() or something similar if the network type is
> not recognized?


That should never be the case, but adding an else here might at least make it
immediately visible. So I'll consider adding it.


>>                   } else {
>>                       throw 'unknown resource type';
>>                   }
>> @@ -268,6 +382,15 @@ Ext.define('PVE.grid.PoolMembers', {
>>                                       win.show();
>>                                   },
>>                               },
>> +                            {
>> +                                text: gettext('VNet'),
>> +                                iconCls: 'fa fa-network-wired x-fa-pool-net',
>> +                                handler: function () {
>> +                                    let win = Ext.create('PVE.pool.AddVnet', { pool: me.pool });
>> +                                    win.on('destroy', reload);
>> +                                    win.show();
>> +                                },
>> +                            },
>>                           ],
>>                       }),
>>                   },
>




  reply	other threads:[~2026-07-20  8:21 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-26 13:10 [PATCH access-control/cluster/common/manager/network/proxmox-widget-toolkit/qemu-server v2 00/10] fix #7294: pool: add SDN VNets as pool members David Riley
2026-06-26 13:10 ` [PATCH pve-manager v2 01/10] ui: replace var with let to match style guide for variable declaration David Riley
2026-07-03 13:14   ` Daniel Kral
2026-06-26 13:10 ` [PATCH pve-manager v2 02/10] fix #7294: api: pool: add SDN VNets as pool members David Riley
2026-07-03 13:19   ` Daniel Kral
2026-07-20  8:20     ` David Riley
2026-06-26 13:10 ` [PATCH pve-manager v2 03/10] fix #7294: ui: " David Riley
2026-07-06 14:17   ` Daniel Kral
2026-07-20  8:21     ` David Riley [this message]
2026-06-26 13:10 ` [PATCH proxmox-widget-toolkit v2 04/10] fix #7294: css: theme: add opacity override for pool VNet icon David Riley
2026-07-03 13:30   ` Daniel Kral
2026-07-20  8:22     ` David Riley
2026-06-26 13:10 ` [PATCH pve-access-control v2 05/10] fix #7294: acl: pool: add SDN VNets as pool members David Riley
2026-07-03 14:35   ` Daniel Kral
2026-07-20  8:24     ` David Riley
2026-07-06 11:56   ` Daniel Kral
2026-07-20  8:23     ` David Riley
2026-06-26 13:10 ` [PATCH pve-network v2 06/10] fix #7294: sdn: register api formats for zones and vnets David Riley
2026-07-06 12:21   ` Daniel Kral
2026-07-20  8:24     ` David Riley
2026-06-26 13:10 ` [PATCH pve-network v2 07/10] fix #7294: sdn: vnet: update pool members on vnet migration and deletion David Riley
2026-07-06 12:29   ` Daniel Kral
2026-07-20  8:24     ` David Riley
2026-06-26 13:10 ` [PATCH pve-common v2 08/10] tools: add helpers for version comparison David Riley
2026-07-06 13:02   ` Daniel Kral
2026-06-26 13:10 ` [PATCH pve-cluster v2 09/10] fix #7294: cluster: helpers: add cluster-wide version assertion David Riley
2026-07-06 13:00   ` Daniel Kral
2026-07-20  8:25     ` David Riley
2026-06-26 13:10 ` [PATCH qemu-server v2 10/10] fix #7294: helpers: use cluster-wide version helper David Riley
2026-07-06 13:20   ` Daniel Kral
2026-07-20  8:26     ` David Riley
2026-07-06 14:07 ` [PATCH access-control/cluster/common/manager/network/proxmox-widget-toolkit/qemu-server v2 00/10] fix #7294: pool: add SDN VNets as pool members Daniel Kral

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=313264dc-4b8d-4804-a427-91bed338c3b3@proxmox.com \
    --to=d.riley@proxmox.com \
    --cc=d.kral@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 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