all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Christoph Heiss <c.heiss@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH installer v4 13/30] install: config: add option for setting up bond on management interface
Date: Mon,  2 Nov 2026 13:45:19 +0100	[thread overview]
Message-ID: <20261102124539.1008075-14-c.heiss@proxmox.com> (raw)
In-Reply-To: <20261102124539.1008075-1-c.heiss@proxmox.com>

Prerequisite for the rest of the installer to support setting up a bond
as management interface during installations.

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
Changes v3 -> v4:
  * no changes

Changes v2 -> v3:
  * add comments to new Proxmox::Sys::Net subroutines
  * fix up line length on comments
  * compare MAC addresses case-insensitively (@thanks Thomas)
  * allow clearing the primary bond interface (@thanks Thomas)

Changes v1 -> v2:
  * no changes

 Proxmox/Install/Config.pm | 47 +++++++++++++++++++++++++++++++++++++++
 Proxmox/Sys/Net.pm        | 34 ++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+)

diff --git a/Proxmox/Install/Config.pm b/Proxmox/Install/Config.pm
index dba3692..967712a 100644
--- a/Proxmox/Install/Config.pm
+++ b/Proxmox/Install/Config.pm
@@ -103,6 +103,21 @@ my sub init_cfg {
         # network related
         mngmt_nic => undef,
 
+        # Options for creating a bond for the management interface with the given physical
+        # interfaces and mode.
+        mngmt_bond => {
+            # MAC addresses of member interfaces. If empty, bonding is disabled.
+            members => [],
+            # must be one of: 'balance-rr', 'active-backup', 'balance-xor', 'broadcast',
+            # '802.3ad', 'balance-tlb', 'balance-alb'
+            mode => 'active-backup', # recommended by our docs
+            # hash policy, only used with '802.3ad' and 'balance-xor' mode
+            # must be one of 'layer2', 'layer2+3', 'layer3+4'
+            hash_policy => 'layer2',
+            # MAC address of primary bond interface, only used with 'active-backup' mode, optional
+            primary_interface => undef,
+        },
+
         # maps mac address -> custom name
         # if set to a hash, enables interface name pinning for all interfaces
         network_interface_pin_map => undef,
@@ -257,6 +272,38 @@ sub get_subscription_key { return get('subscription_key'); }
 sub set_mngmt_nic { set_key('mngmt_nic', $_[0]); }
 sub get_mngmt_nic { return get('mngmt_nic'); }
 
+sub set_mngmt_bond_opt {
+    my ($k, $v) = @_;
+    my $opts = get('mngmt_bond');
+
+    croak "unknown management bond option key '$k'" if !exists($opts->{$k});
+
+    die "unknown bond mode '$v'\n"
+        if $k eq 'mode' && !Proxmox::Sys::Net::is_valid_bond_mode($v);
+    die "unknown bond hash policy '$v'\n"
+        if $k eq 'hash_policy' && !Proxmox::Sys::Net::is_valid_bond_hash_policy($v);
+
+    # allow setting no interfaces (disabling bonding), or 2+ for enabling it
+    die "at least 2 member interfaces are required for bond\n"
+        if $k eq 'members' && scalar($v->@*) == 1;
+    die "primary interface '$v' is not a member of the bond\n"
+        if $k eq 'primary_interface'
+        && defined($v)
+        && !grep { lc($_) eq lc($v) } $opts->{members}->@*;
+
+    $opts->{$k} = $v;
+}
+
+sub get_mngmt_bond_opt {
+    my ($k) = @_;
+    my $opts = get('mngmt_bond');
+    return defined($k) ? $opts->{$k} : $opts;
+}
+
+sub get_mngmt_bond_enabled { # virtual config
+    return scalar(get_mngmt_bond_opt('members')->@*) >= 2;
+}
+
 sub set_network_interface_pin_map { set_key('network_interface_pin_map', $_[0]); }
 sub get_network_interface_pin_map { return get('network_interface_pin_map'); }
 
diff --git a/Proxmox/Sys/Net.pm b/Proxmox/Sys/Net.pm
index c43311d..630d96a 100644
--- a/Proxmox/Sys/Net.pm
+++ b/Proxmox/Sys/Net.pm
@@ -15,6 +15,8 @@ our @EXPORT_OK = qw(
     parse_ip_mask
     parse_fqdn
     validate_link_pin_map
+    is_valid_bond_mode
+    is_valid_bond_hash_policy
     MIN_IFNAME_LEN
     MAX_IFNAME_LEN
     DEFAULT_PIN_PREFIX
@@ -450,4 +452,36 @@ sub validate_link_pin_map : prototype($) {
     }
 }
 
+# Checks whether the given string is a valid network bond mode, as accepted by
+# ifupdown2.
+sub is_valid_bond_mode {
+    my ($mode) = @_;
+
+    my $valid = {
+        'active-backup' => 1,
+        'balance-alb' => 1,
+        'balance-rr' => 1,
+        'balance-tlb' => 1,
+        'balance-xor' => 1,
+        'broadcast' => 1,
+        '802.3ad' => 1,
+    };
+
+    return exists($valid->{$mode});
+}
+
+# Checks whether the given string is a valid network bond hash policy, as
+# accepted by ifupdown2.
+sub is_valid_bond_hash_policy {
+    my ($policy) = @_;
+
+    my $valid = {
+        layer2 => 1,
+        'layer2+3' => 1,
+        'layer3+4' => 1,
+    };
+
+    return exists($valid->{$policy});
+}
+
 1;
-- 
2.55.0





  parent reply	other threads:[~2026-11-02 12:47 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-02 12:45 [PATCH installer/proxmox v4 00/30] fix #2164: add bond setup across all installers Christoph Heiss
2026-11-02 12:45 ` [PATCH proxmox v4 01/30] installer-types: clippy: use .is_multiple_of() instead of manual modulo Christoph Heiss
2026-11-02 12:45 ` [PATCH proxmox v4 02/30] installer-types: use `MacAddress` type where applicable Christoph Heiss
2026-11-02 12:45 ` [PATCH proxmox v4 03/30] installer-types: derive Display for RebootMode and FilterMatch Christoph Heiss
2026-11-02 12:45 ` [PATCH proxmox v4 04/30] installer-types: answer: add options for configuring management bond Christoph Heiss
2026-11-02 12:45 ` [PATCH proxmox v4 05/30] installer-types: answer: add options for configuring management vlan Christoph Heiss
2026-11-02 12:45 ` [PATCH proxmox v4 06/30] installer-types: bump fetch schema for bond and VLAN answer options Christoph Heiss
2026-11-02 12:45 ` [PATCH proxmox v4 07/30] installer-types: bump version to 0.3.0-1 Christoph Heiss
2026-11-02 12:45 ` [PATCH proxmox v4 08/30] network-api: derive Display and FromStr for network bond types Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 09/30] install: run make tidy Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 10/30] tree-wide: use `MacAddress` type instead of string for MAC addresses Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 11/30] install: factor out ifupdown2 config generation into own subroutine Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 12/30] install: do not rely on interface name map to be fully populated Christoph Heiss
2026-11-02 12:45 ` Christoph Heiss [this message]
2026-11-02 12:45 ` [PATCH installer v4 14/30] install: config: add option for setting up vlan on management interface Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 15/30] install: network: set up management bond if requested Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 16/30] install: network: set up vlan on management interface " Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 17/30] gui: network: factor out name pinning into advanced options dialog Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 18/30] gui: network: add bond setup options to " Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 19/30] gui: network: add vlan setup options to advanced network dialog Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 20/30] auto: pass through management network bond options to low-level installer Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 21/30] auto: pass through management network vlan " Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 22/30] tui: drop long obsolete comment about logo formatting Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 23/30] tui: views: add widget for displaying a group of checkboxes Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 24/30] tui: network: factor out name pinning into advanced options dialog Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 25/30] tui: network: add bond setup options to advanced network dialog Christoph Heiss
2026-11-02 14:55   ` Lukas Sichert
2026-11-02 12:45 ` [PATCH installer v4 26/30] tui: network: add vlan " Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 27/30] gui: network: split advanced options dialog into tabs Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 28/30] tui: " Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 29/30] gui: network: list bond member candidates sharing a MAC address once Christoph Heiss
2026-11-02 12:45 ` [PATCH installer v4 30/30] tui: " Christoph Heiss

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=20261102124539.1008075-14-c.heiss@proxmox.com \
    --to=c.heiss@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