public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: "Daniel Kral" <d.kral@proxmox.com>
To: "David Riley" <d.riley@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, 06 Jul 2026 16:17:07 +0200	[thread overview]
Message-ID: <DJRJWI71SQE8.39S52J8BTJA43@proxmox.com> (raw)
In-Reply-To: <20260626131035.112374-4-d.riley@proxmox.com>

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.

>  .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.

> +                                },
> +                            },
> +                        },
> +                        {
> +                            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?

>                  } 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-06 14:17 UTC|newest]

Thread overview: 23+ 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-06-26 13:10 ` [PATCH pve-manager v2 03/10] fix #7294: ui: " David Riley
2026-07-06 14:17   ` Daniel Kral [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-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-06 11:56   ` Daniel Kral
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-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-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-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-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=DJRJWI71SQE8.39S52J8BTJA43@proxmox.com \
    --to=d.kral@proxmox.com \
    --cc=d.riley@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