refactor: Interpret score with a provided method on Score
Some checks failed
Run Check Script / check (pull_request) Has been cancelled

This commit is contained in:
Ian Letourneau 2025-08-07 11:36:13 -04:00
parent f876b5e67b
commit 2c8f45c44e
11 changed files with 36 additions and 42 deletions

View File

@ -84,10 +84,8 @@ impl<T: Topology> Maestro<T> {
self.topology.name(), self.topology.name(),
); );
} }
debug!("Running score {score:?}"); debug!("Interpreting score {score:?}");
let interpret = score.create_interpret(); let result = score.interpret(&self.inventory, &self.topology).await;
debug!("Launching interpret {interpret:?}");
let result = interpret.execute(&self.inventory, &self.topology).await;
debug!("Got result {result:?}"); debug!("Got result {result:?}");
result result
} }

View File

@ -1,15 +1,32 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use async_trait::async_trait;
use serde::Serialize; use serde::Serialize;
use serde_value::Value; use serde_value::Value;
use super::{interpret::Interpret, topology::Topology}; use super::{
interpret::{Interpret, InterpretError, Outcome},
inventory::Inventory,
topology::Topology,
};
#[async_trait]
pub trait Score<T: Topology>: pub trait Score<T: Topology>:
std::fmt::Debug + ScoreToString<T> + Send + Sync + CloneBoxScore<T> + SerializeScore<T> std::fmt::Debug + ScoreToString<T> + Send + Sync + CloneBoxScore<T> + SerializeScore<T>
{ {
fn create_interpret(&self) -> Box<dyn Interpret<T>>; async fn interpret(
&self,
inventory: &Inventory,
topology: &T,
) -> Result<Outcome, InterpretError> {
let interpret = self.create_interpret();
interpret.execute(inventory, topology).await
}
fn name(&self) -> String; fn name(&self) -> String;
#[doc(hidden)]
fn create_interpret(&self) -> Box<dyn Interpret<T>>;
} }
pub trait SerializeScore<T: Topology> { pub trait SerializeScore<T: Topology> {

View File

@ -86,8 +86,7 @@ impl PrometheusApplicationMonitoring<CRDPrometheus> for K8sAnywhereTopology {
let result = self let result = self
.get_k8s_prometheus_application_score(sender.clone(), receivers) .get_k8s_prometheus_application_score(sender.clone(), receivers)
.await .await
.create_interpret() .interpret(inventory, self)
.execute(inventory, self)
.await; .await;
match result { match result {
@ -173,8 +172,7 @@ impl K8sAnywhereTopology {
async fn try_install_k3d(&self) -> Result<(), PreparationError> { async fn try_install_k3d(&self) -> Result<(), PreparationError> {
let result = self let result = self
.get_k3d_installation_score() .get_k3d_installation_score()
.create_interpret() .interpret(&Inventory::empty(), self)
.execute(&Inventory::empty(), self)
.await; .await;
match result { match result {
@ -293,10 +291,7 @@ impl K8sAnywhereTopology {
debug!("installing prometheus operator"); debug!("installing prometheus operator");
let op_score = let op_score =
prometheus_operator_helm_chart_score(sender.namespace.clone()); prometheus_operator_helm_chart_score(sender.namespace.clone());
let result = op_score let result = op_score.interpret(&Inventory::empty(), self).await;
.create_interpret()
.execute(&Inventory::empty(), self)
.await;
return match result { return match result {
Ok(outcome) => match outcome.status { Ok(outcome) => match outcome.status {

View File

@ -236,7 +236,7 @@ impl K8sTenantManager {
//need to find a way to automatically detect the ip address from the docker //need to find a way to automatically detect the ip address from the docker
//network //network
"ipBlock": { "ipBlock": {
"cidr": "172.24.0.0/16", "cidr": "172.18.0.0/16",
} }
} }
] ]

View File

@ -193,8 +193,7 @@ impl<
})], })],
}; };
score score
.create_interpret() .interpret(&Inventory::empty(), topology)
.execute(&Inventory::empty(), topology)
.await .await
.unwrap(); .unwrap();
} }

View File

@ -51,10 +51,7 @@ impl<T: Topology + K8sclient + HelmCommand> Interpret<T> for ArgoInterpret {
topology: &T, topology: &T,
) -> Result<Outcome, InterpretError> { ) -> Result<Outcome, InterpretError> {
error!("Uncomment below, only disabled for debugging"); error!("Uncomment below, only disabled for debugging");
self.score self.score.interpret(inventory, topology).await?;
.create_interpret()
.execute(inventory, topology)
.await?;
let k8s_client = topology.k8s_client().await?; let k8s_client = topology.k8s_client().await?;
k8s_client k8s_client

View File

@ -57,8 +57,7 @@ impl<
namespace: namespace.clone(), namespace: namespace.clone(),
host: "localhost".to_string(), host: "localhost".to_string(),
}; };
ntfy.create_interpret() ntfy.interpret(&Inventory::empty(), topology)
.execute(&Inventory::empty(), topology)
.await .await
.expect("couldn't create interpret for ntfy"); .expect("couldn't create interpret for ntfy");
@ -95,8 +94,7 @@ impl<
alerting_score.receivers.push(Box::new(ntfy_receiver)); alerting_score.receivers.push(Box::new(ntfy_receiver));
alerting_score alerting_score
.create_interpret() .interpret(&Inventory::empty(), topology)
.execute(&Inventory::empty(), topology)
.await .await
.unwrap(); .unwrap();
Ok(()) Ok(())

View File

@ -128,10 +128,7 @@ impl<T: Topology + K8sclient + HelmCommand> Interpret<T> for LAMPInterpret {
info!("Deploying score {deployment_score:#?}"); info!("Deploying score {deployment_score:#?}");
deployment_score deployment_score.interpret(inventory, topology).await?;
.create_interpret()
.execute(inventory, topology)
.await?;
info!("LAMP deployment_score {deployment_score:?}"); info!("LAMP deployment_score {deployment_score:?}");
@ -153,10 +150,7 @@ impl<T: Topology + K8sclient + HelmCommand> Interpret<T> for LAMPInterpret {
.map(|nbs| fqdn!(nbs.to_string().as_str())), .map(|nbs| fqdn!(nbs.to_string().as_str())),
}; };
lamp_ingress lamp_ingress.interpret(inventory, topology).await?;
.create_interpret()
.execute(inventory, topology)
.await?;
info!("LAMP lamp_ingress {lamp_ingress:?}"); info!("LAMP lamp_ingress {lamp_ingress:?}");
@ -215,7 +209,7 @@ impl LAMPInterpret {
repository: None, repository: None,
}; };
score.create_interpret().execute(inventory, topology).await score.interpret(inventory, topology).await
} }
fn build_dockerfile(&self, score: &LAMPScore) -> Result<PathBuf, Box<dyn std::error::Error>> { fn build_dockerfile(&self, score: &LAMPScore) -> Result<PathBuf, Box<dyn std::error::Error>> {
let mut dockerfile = Dockerfile::new(); let mut dockerfile = Dockerfile::new();

View File

@ -119,8 +119,7 @@ impl KubePrometheus {
topology: &T, topology: &T,
) -> Result<Outcome, InterpretError> { ) -> Result<Outcome, InterpretError> {
kube_prometheus_helm_chart_score(self.config.clone()) kube_prometheus_helm_chart_score(self.config.clone())
.create_interpret() .interpret(inventory, topology)
.execute(inventory, topology)
.await .await
} }
} }

View File

@ -96,8 +96,7 @@ impl<T: Topology + HelmCommand + K8sclient> Interpret<T> for NtfyInterpret {
topology: &T, topology: &T,
) -> Result<Outcome, InterpretError> { ) -> Result<Outcome, InterpretError> {
ntfy_helm_chart_score(self.score.namespace.clone(), self.score.host.clone()) ntfy_helm_chart_score(self.score.namespace.clone(), self.score.host.clone())
.create_interpret() .interpret(inventory, topology)
.execute(inventory, topology)
.await?; .await?;
debug!("installed ntfy helm chart"); debug!("installed ntfy helm chart");

View File

@ -100,8 +100,7 @@ impl Prometheus {
topology: &T, topology: &T,
) -> Result<Outcome, InterpretError> { ) -> Result<Outcome, InterpretError> {
prometheus_helm_chart_score(self.config.clone()) prometheus_helm_chart_score(self.config.clone())
.create_interpret() .interpret(inventory, topology)
.execute(inventory, topology)
.await .await
} }
pub async fn install_grafana<T: Topology + HelmCommand + Send + Sync>( pub async fn install_grafana<T: Topology + HelmCommand + Send + Sync>(
@ -116,8 +115,7 @@ impl Prometheus {
if let Some(ns) = namespace.as_deref() { if let Some(ns) = namespace.as_deref() {
grafana_helm_chart_score(ns) grafana_helm_chart_score(ns)
.create_interpret() .interpret(inventory, topology)
.execute(inventory, topology)
.await .await
} else { } else {
Err(InterpretError::new( Err(InterpretError::new(