public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH pve-manager 3/3] sdn-commit: only reload ifupdown if sdn configuration changed
Date: Fri, 18 Jul 2025 14:33:13 +0200	[thread overview]
Message-ID: <20250718123313.208460-4-s.hanreich@proxmox.com> (raw)
In-Reply-To: <20250718123313.208460-1-s.hanreich@proxmox.com>

Check for any changes between the running config and the currently
applied config and guard against executing pve-sdn-commit if the
configuration is unchanged.

Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
---
 bin/pve-sdn-commit | 65 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/bin/pve-sdn-commit b/bin/pve-sdn-commit
index 7536608d6..d75e14440 100644
--- a/bin/pve-sdn-commit
+++ b/bin/pve-sdn-commit
@@ -7,6 +7,11 @@ use Time::HiRes qw(usleep);
 
 use PVE::Cluster;
 use PVE::Network::SDN;
+use PVE::Network::SDN::Zones;
+use PVE::Network::SDN::Vnets;
+use PVE::Network::SDN::Subnets;
+use PVE::Network::SDN::Controllers;
+use PVE::Network::SDN::Fabrics;
 use PVE::Tools;
 
 for (my $i = 0; !PVE::Cluster::check_cfs_quorum(1); $i++) {
@@ -16,6 +21,66 @@ for (my $i = 0; !PVE::Cluster::check_cfs_quorum(1); $i++) {
     usleep(100 * 1000);
 }
 
+sub has_pending_changes {
+    my ($pending_config) = @_;
+
+    for my $entity (values $pending_config->{ids}->%*) {
+        return 1 if $entity->{state};
+    }
+
+    return 0;
+}
+
+sub fabrics_changed {
+    my $current_config = PVE::Network::SDN::Fabrics::config();
+    my $running_config = PVE::Network::SDN::Fabrics::config(1);
+
+    my ($running_fabrics, $running_nodes) = $running_config->list_all();
+    my ($current_fabrics, $current_nodes) = $current_config->list_all();
+
+    my $pending_fabrics = PVE::Network::SDN::pending_config(
+        { fabrics => { ids => $running_fabrics } },
+        { ids => $current_fabrics },
+        'fabrics',
+    );
+
+    my $pending_nodes = PVE::Network::SDN::pending_config(
+        { nodes => { ids => $running_nodes } },
+        { ids => $current_nodes },
+        'nodes',
+    );
+
+    return has_pending_changes($pending_fabrics) || has_pending_changes($pending_nodes);
+}
+
+sub sdn_changed {
+    my $running_config = PVE::Network::SDN::running_config();
+
+    my $configs = {
+        zones => PVE::Network::SDN::Zones::config(),
+        vnets => PVE::Network::SDN::Vnets::config(),
+        subnets => PVE::Network::SDN::Subnets::config(),
+        controllers => PVE::Network::SDN::Controllers::config(),
+    };
+
+    for my $type (keys $configs->%*) {
+        my $pending_config = PVE::Network::SDN::pending_config(
+            $running_config,
+            $configs->{$type},
+            $type,
+        );
+
+        return 1 if has_pending_changes($pending_config);
+    }
+
+    return fabrics_changed();
+}
+
+if (!sdn_changed()) {
+    print "No changes to SDN configuration detected, skipping reload\n";
+    exit 0;
+}
+
 my $previous_config_has_frr = PVE::Network::SDN::running_config_has_frr();
 PVE::Network::SDN::commit_config();
 
-- 
2.39.5


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


  parent reply	other threads:[~2025-07-18 12:32 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-18 12:33 [pve-devel] [PATCH manager 0/3] network interface pinning fixes Stefan Hanreich
2025-07-18 12:33 ` [pve-devel] [PATCH pve-manager 1/3] network-interface-pinning: avoid comparing undefined string Stefan Hanreich
2025-07-18 12:33 ` [pve-devel] [PATCH pve-manager 2/3] {sdn, firewall}-commit: wait for quorum Stefan Hanreich
2025-07-18 12:33 ` Stefan Hanreich [this message]
2025-07-18 12:45 ` [pve-devel] applied: [PATCH manager 0/3] network interface pinning fixes Thomas Lamprecht

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=20250718123313.208460-4-s.hanreich@proxmox.com \
    --to=s.hanreich@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