feat: started to prepare inventory / topoplogy for NCD #1
| @ -124,6 +124,9 @@ impl DhcpServer for DummyInfra { | ||||
|     async fn set_filename(&self, _filename: &str) -> Result<(), ExecutorError> { | ||||
|         unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA) | ||||
|     } | ||||
|     async fn set_filename64(&self, _filename: &str) -> Result<(), ExecutorError> { | ||||
|         unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA) | ||||
|     } | ||||
|     fn get_ip(&self) -> IpAddress { | ||||
|         unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA) | ||||
|     } | ||||
|  | ||||
| @ -49,6 +49,7 @@ pub trait DhcpServer: Send + Sync { | ||||
|     async fn set_next_server(&self, ip: IpAddress) -> Result<(), ExecutorError>; | ||||
|     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>; | ||||
|     fn get_ip(&self) -> IpAddress; | ||||
|     fn get_host(&self) -> LogicalHost; | ||||
|     async fn commit_config(&self) -> Result<(), ExecutorError>; | ||||
|  | ||||
| @ -79,4 +79,14 @@ impl DhcpServer for OPNSenseFirewall { | ||||
| 
 | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     async fn set_filename64(&self, filename: &str) -> Result<(), ExecutorError> { | ||||
|         { | ||||
|             let mut writable_opnsense = self.opnsense_config.write().await; | ||||
|             writable_opnsense.dhcp().set_filename64(filename); | ||||
|             debug!("OPNsense dhcp server set filename {filename}"); | ||||
|         } | ||||
| 
 | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -19,6 +19,7 @@ pub struct DhcpScore { | ||||
|     pub next_server: Option<IpAddress>, | ||||
|     pub boot_filename: Option<String>, | ||||
|     pub filename: Option<String>, | ||||
|     pub filename64: Option<String>, | ||||
|     pub filename_ipxe: Option<String>, | ||||
| } | ||||
| 
 | ||||
| @ -139,9 +140,22 @@ impl DhcpInterpret { | ||||
|             None => Outcome::noop(), | ||||
|         }; | ||||
| 
 | ||||
|         let filename64_outcome = match &self.score.filename64 { | ||||
|             Some(filename64) => { | ||||
|                 let dhcp_server = Arc::new(topology.dhcp_server.clone()); | ||||
|                 dhcp_server.set_filename64(&filename64).await?; | ||||
|                 Outcome::new( | ||||
|                     InterpretStatus::SUCCESS, | ||||
|                     format!("Dhcp Interpret Set filename64 to {filename64}"), | ||||
|                 ) | ||||
|             } | ||||
|             None => Outcome::noop(), | ||||
|         }; | ||||
| 
 | ||||
|         if next_server_outcome.status == InterpretStatus::NOOP | ||||
| 
				
					
						johnride
						commented  Rendu a 5 copier-coller du meme bout de code ca meriterait un refactor pour une fonction qui prend une closure qui a le minimum d'information. Un petit coup de Claude m'a donne ceci qui semble legit : Rendu a 5 copier-coller du meme bout de code ca meriterait un refactor pour une fonction qui prend une closure qui a le minimum d'information.
Un petit coup de Claude m'a donne ceci qui semble legit :
```rust
async fn set_pxe_options(
    &self,
    _inventory: &Inventory,
    topology: &HAClusterTopology,
) -> Result<Outcome, InterpretError> {
    async fn process_option<T, F, Fut>(
        option: &Option<T>, 
        description: &str,
        action: F
    ) -> Result<Outcome, InterpretError> 
    where
        T: std::fmt::Display,
        F: FnOnce(&T) -> Fut,
        Fut: std::future::Future<Output = Result<(), InterpretError>>,
    {
        match option {
            Some(value) => {
                action(value).await?;
                Ok(Outcome::new(
                    InterpretStatus::SUCCESS,
                    format!("Dhcp Interpret Set {} to {}", description, value),
                ))
            }
            None => Ok(Outcome::noop()),
        }
    }
    let dhcp_server = Arc::new(topology.dhcp_server.clone());
    
    let next_server_outcome = process_option(
        &self.score.next_server,
        "next boot",
        |next_server| dhcp_server.set_next_server(*next_server)
    ).await?;
    
    let boot_filename_outcome = process_option(
        &self.score.boot_filename,
        "boot filename",
        |boot_filename| dhcp_server.set_boot_filename(boot_filename)
    ).await?;
    
    let filename_outcome = process_option(
        &self.score.filename,
        "filename",
        |filename| dhcp_server.set_filename(filename)
    ).await?;
    
    let filename64_outcome = process_option(
        &self.score.filename64,
        "filename64",
        |filename64| dhcp_server.set_filename64(filename64)
    ).await?;
    
    let filenameipxe_outcome = process_option(
        &self.score.filenameipxe,
        "filenameipxe",
        |filenameipxe| dhcp_server.set_filenameipxe(filenameipxe)
    ).await?;
    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());
    }
    Ok(Outcome::new(
        InterpretStatus::SUCCESS,
        format!(
            "Dhcp Interpret Set next boot to [{:?}], boot_filename to [{:?}], filename to [{:?}], filename64 to [{:?}], filenameipxe to [{:?}]",
            self.score.next_server, self.score.boot_filename, self.score.filename, self.score.filename64, self.score.filenameipxe
        ),
    ))
}
``` | ||||
|             && boot_filename_outcome.status == InterpretStatus::NOOP | ||||
|             && filename_outcome.status == InterpretStatus::NOOP | ||||
|             && filename64_outcome.status == InterpretStatus::NOOP | ||||
|         { | ||||
|             return Ok(Outcome::noop()); | ||||
|         } | ||||
| @ -149,8 +163,8 @@ impl DhcpInterpret { | ||||
|         Ok(Outcome::new( | ||||
|             InterpretStatus::SUCCESS, | ||||
|             format!( | ||||
|                 "Dhcp Interpret Set next boot to [{:?}], boot_filename to [{:?}], filename to [{:?}]", | ||||
|                 self.score.boot_filename, self.score.boot_filename, self.score.filename | ||||
|                 "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 | ||||
|             ), | ||||
|         )) | ||||
|     } | ||||
|  | ||||
| @ -41,8 +41,9 @@ impl OKDBootstrapDhcpScore { | ||||
|                 // router address, this is leaking implementation details
 | ||||
|                 Some(topology.router.get_gateway()), | ||||
|                 Some("bootx64.efi".to_string()), | ||||
|                 Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())), | ||||
|                 Some("undionly.kpxe".to_string()), | ||||
|                 Some("ipxe.efi".to_string()), | ||||
|                 Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())), | ||||
|             ), | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -35,6 +35,7 @@ impl OKDDhcpScore { | ||||
|                 boot_filename: None, | ||||
|                 filename_ipxe: Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())), | ||||
|                 filename: Some("undionly.kpxe".to_string()), | ||||
|                 filename64: Some("ipxe.efi".to_string()), | ||||
|             }, | ||||
|         } | ||||
|     } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	
Ca gosse de devoir fix ces dummy la tout le temps. Peut-etre qu'on pourrait creer une macro assez facilement qui cree une implementation dummy? Pas urgent.