public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Fiona Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH qemu-server 05/31] assume that SDN is available
Date: Wed, 25 Jun 2025 17:56:28 +0200	[thread overview]
Message-ID: <20250625155751.268047-6-f.ebner@proxmox.com> (raw)
In-Reply-To: <20250625155751.268047-1-f.ebner@proxmox.com>

pve-manager >= 8.2.10 has a hard dependency on libpve-network-perl
which includes the required modules.

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
 src/PVE/QemuServer.pm | 143 +++++++++++++++---------------------------
 src/usr/pve-bridge    |  21 ++-----
 2 files changed, 56 insertions(+), 108 deletions(-)

diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 513652d6..97a9ad5a 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -35,6 +35,8 @@ use PVE::GuestHelpers qw(safe_string_ne safe_num_ne safe_boolean_ne);
 use PVE::Mapping::Dir;
 use PVE::Mapping::PCI;
 use PVE::Mapping::USB;
+use PVE::Network::SDN::Vnets;
+use PVE::Network::SDN::Zones;
 use PVE::INotify;
 use PVE::JSONSchema qw(get_standard_option parse_property_string);
 use PVE::ProcFSTools;
@@ -80,13 +82,6 @@ use PVE::QemuServer::StateFile;
 use PVE::QemuServer::USB;
 use PVE::QemuServer::Virtiofs qw(max_virtiofs start_all_virtiofsd);
 
-my $have_sdn;
-eval {
-    require PVE::Network::SDN::Zones;
-    require PVE::Network::SDN::Vnets;
-    $have_sdn = 1;
-};
-
 my $have_ha_config;
 eval {
     require PVE::HA::Config;
@@ -5011,14 +5006,12 @@ sub vmconfig_hotplug_pending {
             } elsif ($opt =~ m/^net(\d+)$/) {
                 die "skip\n" if !$hotplug_features->{network};
                 vm_deviceunplug($vmid, $conf, $opt);
-                if ($have_sdn) {
-                    my $net = PVE::QemuServer::parse_net($conf->{$opt});
-                    PVE::Network::SDN::Vnets::del_ips_from_mac(
-                        $net->{bridge},
-                        $net->{macaddr},
-                        $conf->{name},
-                    );
-                }
+                my $net = PVE::QemuServer::parse_net($conf->{$opt});
+                PVE::Network::SDN::Vnets::del_ips_from_mac(
+                    $net->{bridge},
+                    $net->{macaddr},
+                    $conf->{name},
+                );
             } elsif (is_valid_drivename($opt)) {
                 die "skip\n"
                     if !$hotplug_features->{disk} || $opt =~ m/(efidisk|ide|sata|tpmstate)(\d+)/;
@@ -5252,17 +5245,15 @@ sub vmconfig_apply_pending {
             } elsif (defined($conf->{$opt}) && is_valid_drivename($opt)) {
                 vmconfig_delete_or_detach_drive($vmid, $storecfg, $conf, $opt, $force);
             } elsif (defined($conf->{$opt}) && $opt =~ m/^net\d+$/) {
-                if ($have_sdn) {
-                    my $net = PVE::QemuServer::parse_net($conf->{$opt});
-                    eval {
-                        PVE::Network::SDN::Vnets::del_ips_from_mac(
-                            $net->{bridge},
-                            $net->{macaddr},
-                            $conf->{name},
-                        );
-                    };
-                    warn if $@;
-                }
+                my $net = PVE::QemuServer::parse_net($conf->{$opt});
+                eval {
+                    PVE::Network::SDN::Vnets::del_ips_from_mac(
+                        $net->{bridge},
+                        $net->{macaddr},
+                        $conf->{name},
+                    );
+                };
+                warn if $@;
             }
         };
         if (my $err = $@) {
@@ -5288,8 +5279,6 @@ sub vmconfig_apply_pending {
                     parse_drive($opt, $conf->{$opt}),
                 );
             } elsif (defined($conf->{pending}->{$opt}) && $opt =~ m/^net\d+$/) {
-                return if !$have_sdn; # return from eval if SDN is not available
-
                 my $new_net = PVE::QemuServer::parse_net($conf->{pending}->{$opt});
                 if ($conf->{$opt}) {
                     my $old_net = PVE::QemuServer::parse_net($conf->{$opt});
@@ -5370,14 +5359,11 @@ sub vmconfig_update_net {
             die "skip\n" if !$hotplug;
             vm_deviceunplug($vmid, $conf, $opt);
 
-            if ($have_sdn) {
-                PVE::Network::SDN::Vnets::del_ips_from_mac(
-                    $oldnet->{bridge},
-                    $oldnet->{macaddr},
-                    $conf->{name},
-                );
-            }
-
+            PVE::Network::SDN::Vnets::del_ips_from_mac(
+                $oldnet->{bridge},
+                $oldnet->{macaddr},
+                $conf->{name},
+            );
         } else {
 
             die "internal error" if $opt !~ m/net(\d+)/;
@@ -5400,42 +5386,29 @@ sub vmconfig_update_net {
                 }
 
                 if (safe_string_ne($oldnet->{bridge}, $newnet->{bridge})) {
-                    if ($have_sdn) {
-                        PVE::Network::SDN::Vnets::del_ips_from_mac(
-                            $oldnet->{bridge},
-                            $oldnet->{macaddr},
-                            $conf->{name},
-                        );
-                        PVE::Network::SDN::Vnets::add_next_free_cidr(
-                            $newnet->{bridge},
-                            $conf->{name},
-                            $newnet->{macaddr},
-                            $vmid,
-                            undef,
-                            1,
-                        );
-                    }
+                    PVE::Network::SDN::Vnets::del_ips_from_mac(
+                        $oldnet->{bridge},
+                        $oldnet->{macaddr},
+                        $conf->{name},
+                    );
+                    PVE::Network::SDN::Vnets::add_next_free_cidr(
+                        $newnet->{bridge},
+                        $conf->{name},
+                        $newnet->{macaddr},
+                        $vmid,
+                        undef,
+                        1,
+                    );
                 }
 
-                if ($have_sdn) {
-                    PVE::Network::SDN::Zones::tap_plug(
-                        $iface,
-                        $newnet->{bridge},
-                        $newnet->{tag},
-                        $newnet->{firewall},
-                        $newnet->{trunks},
-                        $newnet->{rate},
-                    );
-                } else {
-                    PVE::Network::tap_plug(
-                        $iface,
-                        $newnet->{bridge},
-                        $newnet->{tag},
-                        $newnet->{firewall},
-                        $newnet->{trunks},
-                        $newnet->{rate},
-                    );
-                }
+                PVE::Network::SDN::Zones::tap_plug(
+                    $iface,
+                    $newnet->{bridge},
+                    $newnet->{tag},
+                    $newnet->{firewall},
+                    $newnet->{trunks},
+                    $newnet->{rate},
+                );
 
             } elsif (safe_num_ne($oldnet->{rate}, $newnet->{rate})) {
                 # Rate can be applied on its own but any change above needs to
@@ -5458,14 +5431,12 @@ sub vmconfig_update_net {
     }
 
     if ($hotplug) {
-        if ($have_sdn) {
-            PVE::Network::SDN::Vnets::add_next_free_cidr(
-                $newnet->{bridge}, $conf->{name}, $newnet->{macaddr}, $vmid, undef, 1,
-            );
-            PVE::Network::SDN::Vnets::add_dhcp_mapping(
-                $newnet->{bridge}, $newnet->{macaddr}, $vmid, $conf->{name},
-            );
-        }
+        PVE::Network::SDN::Vnets::add_next_free_cidr(
+            $newnet->{bridge}, $conf->{name}, $newnet->{macaddr}, $vmid, undef, 1,
+        );
+        PVE::Network::SDN::Vnets::add_dhcp_mapping(
+            $newnet->{bridge}, $newnet->{macaddr}, $vmid, $conf->{name},
+        );
         vm_deviceplug($storecfg, $conf, $vmid, $opt, $newnet, $arch, $machine_type);
     } else {
         die "skip\n";
@@ -9147,11 +9118,7 @@ sub add_nets_bridge_fdb {
             log_warn("Interface '$iface' not attached to any bridge.");
             next;
         }
-        if ($have_sdn) {
-            PVE::Network::SDN::Zones::add_bridge_fdb($iface, $mac, $bridge);
-        } elsif (-d "/sys/class/net/$bridge/bridge") { # avoid fdb management with OVS for now
-            PVE::Network::add_bridge_fdb($iface, $mac);
-        }
+        PVE::Network::SDN::Zones::add_bridge_fdb($iface, $mac, $bridge);
     }
 }
 
@@ -9166,19 +9133,13 @@ sub del_nets_bridge_fdb {
         my $mac = $net->{macaddr} or next;
 
         my $bridge = $net->{bridge};
-        if ($have_sdn) {
-            PVE::Network::SDN::Zones::del_bridge_fdb($iface, $mac, $bridge);
-        } elsif (-d "/sys/class/net/$bridge/bridge") { # avoid fdb management with OVS for now
-            PVE::Network::del_bridge_fdb($iface, $mac);
-        }
+        PVE::Network::SDN::Zones::del_bridge_fdb($iface, $mac, $bridge);
     }
 }
 
 sub create_ifaces_ipams_ips {
     my ($conf, $vmid) = @_;
 
-    return if !$have_sdn;
-
     foreach my $opt (keys %$conf) {
         if ($opt =~ m/^net(\d+)$/) {
             my $value = $conf->{$opt};
@@ -9196,8 +9157,6 @@ sub create_ifaces_ipams_ips {
 sub delete_ifaces_ipams_ips {
     my ($conf, $vmid) = @_;
 
-    return if !$have_sdn;
-
     foreach my $opt (keys %$conf) {
         if ($opt =~ m/^net(\d+)$/) {
             my $net = PVE::QemuServer::parse_net($conf->{$opt});
diff --git a/src/usr/pve-bridge b/src/usr/pve-bridge
index 299be1f3..2608e1a0 100755
--- a/src/usr/pve-bridge
+++ b/src/usr/pve-bridge
@@ -5,16 +5,10 @@ use warnings;
 
 use PVE::QemuServer;
 use PVE::Tools qw(run_command);
-use PVE::Network;
+use PVE::Network::SDN::Vnets;
+use PVE::Network::SDN::Zones;
 use PVE::Firewall;
 
-my $have_sdn;
-eval {
-    require PVE::Network::SDN::Zones;
-    require PVE::Network::SDN::Vnets;
-    $have_sdn = 1;
-};
-
 my $iface = shift;
 
 my $hotplug = 0;
@@ -48,13 +42,8 @@ die "unable to parse network config '$netid'\n" if !$net;
 # The nftable-based implementation from the newer proxmox-firewall does not requires FW bridges
 my $create_firewall_bridges = $net->{firewall} && !PVE::Firewall::is_nftables();
 
-if ($have_sdn) {
-    PVE::Network::SDN::Vnets::add_dhcp_mapping($net->{bridge}, $net->{macaddr}, $vmid, $conf->{name});
-    PVE::Network::SDN::Zones::tap_create($iface, $net->{bridge});
-    PVE::Network::SDN::Zones::tap_plug($iface, $net->{bridge}, $net->{tag}, $create_firewall_bridges, $net->{trunks}, $net->{rate});
-} else {
-    PVE::Network::tap_create($iface, $net->{bridge});
-    PVE::Network::tap_plug($iface, $net->{bridge}, $net->{tag}, $create_firewall_bridges, $net->{trunks}, $net->{rate});
-}
+PVE::Network::SDN::Vnets::add_dhcp_mapping($net->{bridge}, $net->{macaddr}, $vmid, $conf->{name});
+PVE::Network::SDN::Zones::tap_create($iface, $net->{bridge});
+PVE::Network::SDN::Zones::tap_plug($iface, $net->{bridge}, $net->{tag}, $create_firewall_bridges, $net->{trunks}, $net->{rate});
 
 exit 0;
-- 
2.47.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


  parent reply	other threads:[~2025-06-25 16:00 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-25 15:56 [pve-devel] [PATCH-SERIES qemu-server 00/31] preparation for blockdev, part three Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 01/31] print ovmf commandline: collect hardware parameters into hash argument Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 02/31] introduce OVMF module Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 03/31] ovmf: add support for using blockdev Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 04/31] cfg2cmd: ovmf: support print_ovmf_commandline() returning machine flags Fiona Ebner
2025-06-25 15:56 ` Fiona Ebner [this message]
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 06/31] schema: remove unused pve-qm-ipconfig standard option Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 07/31] remove unused $nic_model_list_txt variable Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 08/31] introduce Network module Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 09/31] agent: drop unused $noerr argument from helpers Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 10/31] agent: code style: order module imports according to style guide Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 11/31] agent: avoid dependency on QemuConfig module Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 12/31] agent: avoid use of deprecated check_running() function Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 13/31] agent: move qga_check_running() to agent module Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 14/31] move find_vmstate_storage() helper to QemuConfig module Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 15/31] introduce QemuMigrate::Helpers module Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 16/31] introduce RunState module Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 17/31] code cleanup: drive mirror: do not prefix calls to function in the same module Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 18/31] introduce BlockJob module Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 19/31] drive: die in get_drive_id() if argument misses relevant members Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 20/31] block job: add and use wrapper for mirror Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 21/31] drive mirror: add variable for device ID and make name for drive ID precise Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 22/31] test: migration: factor out common mocking for mirror Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 23/31] block job: factor out helper for common mirror QMP options Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [RFC qemu-server 24/31] block job: add blockdev mirror Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [RFC qemu-server 25/31] blockdev: support using zeroinit filter Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [PATCH qemu-server 26/31] blockdev: make some functions private Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [RFC qemu-server 27/31] clone disk: skip check for aio=default (io_uring) compatibility starting with machine version 10.0 Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [RFC qemu-server 28/31] print drive device: don't reference any drive for 'none' " Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [RFC qemu-server 29/31] blockdev: add support for NBD paths Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [RFC qemu-server 30/31] command line: switch to blockdev starting with machine version 10.0 Fiona Ebner
2025-06-25 15:56 ` [pve-devel] [RFC qemu-server 31/31] test: migration: update running machine to 10.0 Fiona Ebner
2025-06-26 13:09 ` [pve-devel] partially-applied: [PATCH-SERIES qemu-server 00/31] preparation for blockdev, part three Fabian Grünbichler

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=20250625155751.268047-6-f.ebner@proxmox.com \
    --to=f.ebner@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