Introduce a new module and interface for serving files via TFTP in the HAClusterTopology structure. This includes adding the necessary dependencies, creating the `TftpServer` trait, implementing it where appropriate, and integrating its usage within the topology struct. Reviewed-on: https://git.nationtech.io/NationTech/harmony/pulls/10 Co-authored-by: Jean-Gabriel Gill-Couture <jg@nationtech.io> Co-committed-by: Jean-Gabriel Gill-Couture <jg@nationtech.io>
109 lines
2.5 KiB
Rust
109 lines
2.5 KiB
Rust
use std::error::Error;
|
|
|
|
use async_trait::async_trait;
|
|
use derive_new::new;
|
|
|
|
use super::{
|
|
data::{Id, Version},
|
|
executors::ExecutorError,
|
|
inventory::Inventory,
|
|
topology::HAClusterTopology,
|
|
};
|
|
|
|
pub enum InterpretName {
|
|
OPNSenseDHCP,
|
|
OPNSenseDns,
|
|
LoadBalancer,
|
|
Tftp
|
|
}
|
|
|
|
impl std::fmt::Display for InterpretName {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
match self {
|
|
InterpretName::OPNSenseDHCP => f.write_str("OPNSenseDHCP"),
|
|
InterpretName::OPNSenseDns => f.write_str("OPNSenseDns"),
|
|
InterpretName::LoadBalancer => f.write_str("LoadBalancer"),
|
|
InterpretName::Tftp => f.write_str("Tftp"),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
pub trait Interpret {
|
|
async fn execute(
|
|
&self,
|
|
inventory: &Inventory,
|
|
topology: &HAClusterTopology,
|
|
) -> Result<Outcome, InterpretError>;
|
|
fn get_name(&self) -> InterpretName;
|
|
fn get_version(&self) -> Version;
|
|
fn get_status(&self) -> InterpretStatus;
|
|
fn get_children(&self) -> Vec<Id>;
|
|
}
|
|
|
|
#[derive(Debug, new)]
|
|
pub struct Outcome {
|
|
pub status: InterpretStatus,
|
|
pub message: String,
|
|
}
|
|
|
|
impl Outcome {
|
|
pub fn noop() -> Self {
|
|
Self {
|
|
status: InterpretStatus::NOOP,
|
|
message: String::new(),
|
|
}
|
|
}
|
|
|
|
pub fn success(message: String) -> Self {
|
|
Self {
|
|
status: InterpretStatus::SUCCESS,
|
|
message,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub enum InterpretStatus {
|
|
SUCCESS,
|
|
FAILURE,
|
|
RUNNING,
|
|
QUEUED,
|
|
BLOCKED,
|
|
NOOP,
|
|
}
|
|
|
|
impl std::fmt::Display for InterpretStatus {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
let msg = match self {
|
|
InterpretStatus::SUCCESS => "SUCCESS",
|
|
InterpretStatus::FAILURE => "FAILURE",
|
|
InterpretStatus::RUNNING => "RUNNING",
|
|
InterpretStatus::QUEUED => "QUEUED",
|
|
InterpretStatus::BLOCKED => "BLOCKED",
|
|
InterpretStatus::NOOP => "NO_OP",
|
|
};
|
|
f.write_str(msg)
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct InterpretError {
|
|
msg: String,
|
|
}
|
|
|
|
impl std::fmt::Display for InterpretError {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
f.write_str(&self.msg)
|
|
}
|
|
}
|
|
impl Error for InterpretError {}
|
|
|
|
impl From<ExecutorError> for InterpretError {
|
|
fn from(value: ExecutorError) -> Self {
|
|
Self {
|
|
msg: format!("InterpretError : {value}"),
|
|
}
|
|
}
|
|
}
|