From 51aeea1ec9a9b9ccae285c8fbf31ffbfb26bc199 Mon Sep 17 00:00:00 2001 From: Sylvain Tremblay Date: Sat, 1 Mar 2025 10:51:01 -0500 Subject: [PATCH] feat: support new configurable field in dhcp config: filenameipxe --- harmony/src/domain/topology/ha_cluster.rs | 3 +++ harmony/src/domain/topology/network.rs | 1 + harmony/src/infra/opnsense/dhcp.rs | 10 ++++++++++ harmony/src/modules/dhcp.rs | 19 ++++++++++++++++--- harmony/src/modules/okd/dhcp.rs | 2 +- 5 files changed, 31 insertions(+), 4 deletions(-) diff --git a/harmony/src/domain/topology/ha_cluster.rs b/harmony/src/domain/topology/ha_cluster.rs index d7fc461..378916b 100644 --- a/harmony/src/domain/topology/ha_cluster.rs +++ b/harmony/src/domain/topology/ha_cluster.rs @@ -127,6 +127,9 @@ impl DhcpServer for DummyInfra { async fn set_filename64(&self, _filename: &str) -> Result<(), ExecutorError> { unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA) } + async fn set_filenameipxe(&self, _filenameipxe: &str) -> Result<(), ExecutorError> { + unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA) + } fn get_ip(&self) -> IpAddress { unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA) } diff --git a/harmony/src/domain/topology/network.rs b/harmony/src/domain/topology/network.rs index d875b08..cb4332e 100644 --- a/harmony/src/domain/topology/network.rs +++ b/harmony/src/domain/topology/network.rs @@ -50,6 +50,7 @@ pub trait DhcpServer: Send + Sync { async fn set_boot_filename(&self, boot_filename: &str) -> Result<(), ExecutorError>; async fn set_filename(&self, filename: &str) -> Result<(), ExecutorError>; async fn set_filename64(&self, filename64: &str) -> Result<(), ExecutorError>; + async fn set_filenameipxe(&self, filenameipxe: &str) -> Result<(), ExecutorError>; fn get_ip(&self) -> IpAddress; fn get_host(&self) -> LogicalHost; async fn commit_config(&self) -> Result<(), ExecutorError>; diff --git a/harmony/src/infra/opnsense/dhcp.rs b/harmony/src/infra/opnsense/dhcp.rs index d9a887e..bea44fe 100644 --- a/harmony/src/infra/opnsense/dhcp.rs +++ b/harmony/src/infra/opnsense/dhcp.rs @@ -89,4 +89,14 @@ impl DhcpServer for OPNSenseFirewall { Ok(()) } + + async fn set_filenameipxe(&self, filenameipxe: &str) -> Result<(), ExecutorError> { + { + let mut writable_opnsense = self.opnsense_config.write().await; + writable_opnsense.dhcp().set_filenameipxe(filenameipxe); + debug!("OPNsense dhcp server set filenameipxe {filenameipxe}"); + } + + Ok(()) + } } diff --git a/harmony/src/modules/dhcp.rs b/harmony/src/modules/dhcp.rs index db87c81..0821181 100644 --- a/harmony/src/modules/dhcp.rs +++ b/harmony/src/modules/dhcp.rs @@ -20,7 +20,7 @@ pub struct DhcpScore { pub boot_filename: Option, pub filename: Option, pub filename64: Option, - pub filename_ipxe: Option, + pub filenameipxe: Option, } impl Score for DhcpScore { @@ -152,10 +152,23 @@ impl DhcpInterpret { None => Outcome::noop(), }; + let filenameipxe_outcome = match &self.score.filenameipxe { + Some(filenameipxe) => { + let dhcp_server = Arc::new(topology.dhcp_server.clone()); + dhcp_server.set_filenameipxe(&filenameipxe).await?; + Outcome::new( + InterpretStatus::SUCCESS, + format!("Dhcp Interpret Set filenameipxe to {filenameipxe}"), + ) + } + None => Outcome::noop(), + }; + if next_server_outcome.status == InterpretStatus::NOOP && boot_filename_outcome.status == InterpretStatus::NOOP && filename_outcome.status == InterpretStatus::NOOP && filename64_outcome.status == InterpretStatus::NOOP + && filenameipxe_outcome.status == InterpretStatus::NOOP { return Ok(Outcome::noop()); } @@ -163,8 +176,8 @@ impl DhcpInterpret { Ok(Outcome::new( InterpretStatus::SUCCESS, format!( - "Dhcp Interpret Set next boot to [{:?}], boot_filename to [{:?}], filename to [{:?}], filename64 to [{:?}]", - self.score.boot_filename, self.score.boot_filename, self.score.filename, self.score.filename64 + "Dhcp Interpret Set next boot to [{:?}], boot_filename to [{:?}], filename to [{:?}], filename64 to [{:?}], filenameipxe to [:{:?}]", + self.score.boot_filename, self.score.boot_filename, self.score.filename, self.score.filename64, self.score.filenameipxe ), )) } diff --git a/harmony/src/modules/okd/dhcp.rs b/harmony/src/modules/okd/dhcp.rs index 627cf67..483293e 100644 --- a/harmony/src/modules/okd/dhcp.rs +++ b/harmony/src/modules/okd/dhcp.rs @@ -33,7 +33,7 @@ impl OKDDhcpScore { host_binding, next_server: Some(topology.router.get_gateway()), boot_filename: None, - filename_ipxe: Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())), + filenameipxe: Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())), filename: Some("undionly.kpxe".to_string()), filename64: Some("ipxe.efi".to_string()), },