From: Dominik Csapak <d.csapak@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup 1/2] api2/network: add bond-primary parameter
Date: Wed, 16 Sep 2020 14:12:29 +0200 [thread overview]
Message-ID: <20200916121230.12906-1-d.csapak@proxmox.com> (raw)
needed for 'active-backup' bond mode
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
this needs my previous patches for the api-macro (and a bump)
src/api2/node/network.rs | 34 ++++++++++++++++++++++++++++++++--
src/api2/types/mod.rs | 9 ++++++++-
src/config/network.rs | 6 ++++++
src/config/network/lexer.rs | 4 +++-
src/config/network/parser.rs | 6 ++++++
5 files changed, 55 insertions(+), 4 deletions(-)
diff --git a/src/api2/node/network.rs b/src/api2/node/network.rs
index 7266da05..4de12ef2 100644
--- a/src/api2/node/network.rs
+++ b/src/api2/node/network.rs
@@ -198,6 +198,10 @@ pub fn read_interface(iface: String) -> Result<Value, Error> {
type: LinuxBondMode,
optional: true,
},
+ "bond-primary": {
+ schema: NETWORK_INTERFACE_NAME_SCHEMA,
+ optional: true,
+ },
slaves: {
schema: NETWORK_INTERFACE_LIST_SCHEMA,
optional: true,
@@ -224,6 +228,7 @@ pub fn create_interface(
bridge_ports: Option<String>,
bridge_vlan_aware: Option<bool>,
bond_mode: Option<LinuxBondMode>,
+ bond_primary: Option<String>,
slaves: Option<String>,
param: Value,
) -> Result<(), Error> {
@@ -284,7 +289,15 @@ pub fn create_interface(
if bridge_vlan_aware.is_some() { interface.bridge_vlan_aware = bridge_vlan_aware; }
}
NetworkInterfaceType::Bond => {
- if bond_mode.is_some() { interface.bond_mode = bond_mode; }
+ if let Some(mode) = bond_mode {
+ interface.bond_mode = bond_mode;
+ if bond_primary.is_some() {
+ if mode != LinuxBondMode::active_backup {
+ bail!("bond-primary is only valid with Active/Backup mode");
+ }
+ interface.bond_primary = bond_primary;
+ }
+ }
if let Some(slaves) = slaves {
let slaves = split_interface_list(&slaves)?;
interface.set_bond_slaves(slaves)?;
@@ -343,6 +356,9 @@ pub enum DeletableProperty {
bridge_vlan_aware,
/// Delete bond-slaves (set to 'none')
slaves,
+ /// Delete bond-primary
+ #[serde(rename = "bond-primary")]
+ bond_primary,
}
@@ -420,6 +436,10 @@ pub enum DeletableProperty {
type: LinuxBondMode,
optional: true,
},
+ "bond-primary": {
+ schema: NETWORK_INTERFACE_NAME_SCHEMA,
+ optional: true,
+ },
slaves: {
schema: NETWORK_INTERFACE_LIST_SCHEMA,
optional: true,
@@ -458,6 +478,7 @@ pub fn update_interface(
bridge_ports: Option<String>,
bridge_vlan_aware: Option<bool>,
bond_mode: Option<LinuxBondMode>,
+ bond_primary: Option<String>,
slaves: Option<String>,
delete: Option<Vec<DeletableProperty>>,
digest: Option<String>,
@@ -501,6 +522,7 @@ pub fn update_interface(
DeletableProperty::bridge_ports => { interface.set_bridge_ports(Vec::new())?; }
DeletableProperty::bridge_vlan_aware => { interface.bridge_vlan_aware = None; }
DeletableProperty::slaves => { interface.set_bond_slaves(Vec::new())?; }
+ DeletableProperty::bond_primary => { interface.bond_primary = None; }
}
}
}
@@ -518,7 +540,15 @@ pub fn update_interface(
let slaves = split_interface_list(&slaves)?;
interface.set_bond_slaves(slaves)?;
}
- if bond_mode.is_some() { interface.bond_mode = bond_mode; }
+ if let Some(mode) = bond_mode {
+ interface.bond_mode = bond_mode;
+ if bond_primary.is_some() {
+ if mode != LinuxBondMode::active_backup {
+ bail!("bond-primary is only valid with Active/Backup mode");
+ }
+ interface.bond_primary = bond_primary;
+ }
+ }
if let Some(cidr) = cidr {
let (_, _, is_v6) = network::parse_cidr(&cidr)?;
diff --git a/src/api2/types/mod.rs b/src/api2/types/mod.rs
index 5495d693..e2eb08aa 100644
--- a/src/api2/types/mod.rs
+++ b/src/api2/types/mod.rs
@@ -812,7 +812,11 @@ pub const NETWORK_INTERFACE_LIST_SCHEMA: Schema = StringSchema::new(
bond_mode: {
type: LinuxBondMode,
optional: true,
- }
+ },
+ "bond-primary": {
+ schema: NETWORK_INTERFACE_NAME_SCHEMA,
+ optional: true,
+ },
}
)]
#[derive(Debug, Serialize, Deserialize)]
@@ -869,6 +873,9 @@ pub struct Interface {
pub slaves: Option<Vec<String>>,
#[serde(skip_serializing_if="Option::is_none")]
pub bond_mode: Option<LinuxBondMode>,
+ #[serde(skip_serializing_if="Option::is_none")]
+ #[serde(rename = "bond-primary")]
+ pub bond_primary: Option<String>,
}
// Regression tests
diff --git a/src/config/network.rs b/src/config/network.rs
index 53693283..6e3b9ea1 100644
--- a/src/config/network.rs
+++ b/src/config/network.rs
@@ -67,6 +67,7 @@ impl Interface {
bridge_vlan_aware: None,
slaves: None,
bond_mode: None,
+ bond_primary: None,
}
}
@@ -169,6 +170,11 @@ impl Interface {
NetworkInterfaceType::Bond => {
let mode = self.bond_mode.unwrap_or(LinuxBondMode::balance_rr);
writeln!(w, "\tbond-mode {}", bond_mode_to_str(mode))?;
+ if let Some(primary) = &self.bond_primary {
+ if mode == LinuxBondMode::active_backup {
+ writeln!(w, "\tbond-primary {}", primary)?;
+ }
+ }
let slaves = self.slaves.as_ref().unwrap_or(&EMPTY_LIST);
if slaves.is_empty() {
diff --git a/src/config/network/lexer.rs b/src/config/network/lexer.rs
index c050745f..c29d4f37 100644
--- a/src/config/network/lexer.rs
+++ b/src/config/network/lexer.rs
@@ -26,6 +26,7 @@ pub enum Token {
BridgeVlanAware,
BondSlaves,
BondMode,
+ BondPrimary,
EOF,
}
@@ -51,7 +52,8 @@ lazy_static! {
map.insert("bond-slaves", Token::BondSlaves);
map.insert("bond_slaves", Token::BondSlaves);
map.insert("bond-mode", Token::BondMode);
- map.insert("bond_mode", Token::BondMode);
+ map.insert("bond-primary", Token::BondPrimary);
+ map.insert("bond_primary", Token::BondPrimary);
map
};
}
diff --git a/src/config/network/parser.rs b/src/config/network/parser.rs
index a97d0f79..b9b7ddc3 100644
--- a/src/config/network/parser.rs
+++ b/src/config/network/parser.rs
@@ -243,6 +243,12 @@ impl <R: BufRead> NetworkParser<R> {
interface.bond_mode = Some(bond_mode_from_str(&mode)?);
self.eat(Token::Newline)?;
}
+ Token::BondPrimary => {
+ self.eat(Token::BondPrimary)?;
+ let primary = self.next_text()?;
+ interface.bond_primary = Some(primary);
+ self.eat(Token::Newline)?;
+ }
Token::Netmask => bail!("netmask is deprecated and no longer supported"),
_ => { // parse addon attributes
--
2.20.1
next reply other threads:[~2020-09-16 12:12 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-16 12:12 Dominik Csapak [this message]
2020-09-16 12:12 ` [pbs-devel] [PATCH proxmox-backup 2/2] fix #2942: implement lacp bond mode and bond_xmit_hash_policy Dominik Csapak
2020-09-17 6:37 ` [pbs-devel] applied: [PATCH proxmox-backup 1/2] api2/network: add bond-primary parameter Dietmar Maurer
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=20200916121230.12906-1-d.csapak@proxmox.com \
--to=d.csapak@proxmox.com \
--cc=pbs-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