The multiprogress wasn't used properly and leading to conflicting progress bars (within our own progress bars, as well as the log wrapper). This PR introduce a layer on top of `indicatif::MultiProgress` to properly handle sections of progress bars, where we can dynamically add/update/remove progress bars from any sections. We can see in the demo that new sections + progress bars are added on the fly and that extra logs (e.g. info logs) are appended on top of the progress bars. Progress are also grouped together based on their parent score. Co-authored-by: Ian Letourneau <letourneau.ian@gmail.com> Co-authored-by: johnride <jg@nationtech.io> Reviewed-on: #101
71 lines
1.5 KiB
Rust
71 lines
1.5 KiB
Rust
mod credentials;
|
|
pub use credentials::*;
|
|
|
|
use async_trait::async_trait;
|
|
use serde::Serialize;
|
|
|
|
use crate::{
|
|
data::{Id, Version},
|
|
interpret::{Interpret, InterpretError, InterpretName, InterpretStatus, Outcome},
|
|
inventory::Inventory,
|
|
score::Score,
|
|
topology::{
|
|
Topology,
|
|
tenant::{TenantConfig, TenantManager},
|
|
},
|
|
};
|
|
|
|
#[derive(Debug, Serialize, Clone)]
|
|
pub struct TenantScore {
|
|
pub config: TenantConfig,
|
|
}
|
|
|
|
impl<T: Topology + TenantManager> Score<T> for TenantScore {
|
|
fn create_interpret(&self) -> Box<dyn crate::interpret::Interpret<T>> {
|
|
Box::new(TenantInterpret {
|
|
tenant_config: self.config.clone(),
|
|
})
|
|
}
|
|
|
|
fn name(&self) -> String {
|
|
format!("{} [TenantScore]", self.config.name)
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct TenantInterpret {
|
|
tenant_config: TenantConfig,
|
|
}
|
|
|
|
#[async_trait]
|
|
impl<T: Topology + TenantManager> Interpret<T> for TenantInterpret {
|
|
async fn execute(
|
|
&self,
|
|
_inventory: &Inventory,
|
|
topology: &T,
|
|
) -> Result<Outcome, InterpretError> {
|
|
topology.provision_tenant(&self.tenant_config).await?;
|
|
|
|
Ok(Outcome::success(format!(
|
|
"Tenant provisioned with id '{}'",
|
|
self.tenant_config.id
|
|
)))
|
|
}
|
|
|
|
fn get_name(&self) -> InterpretName {
|
|
InterpretName::TenantInterpret
|
|
}
|
|
|
|
fn get_version(&self) -> Version {
|
|
todo!()
|
|
}
|
|
|
|
fn get_status(&self) -> InterpretStatus {
|
|
todo!()
|
|
}
|
|
|
|
fn get_children(&self) -> Vec<Id> {
|
|
todo!()
|
|
}
|
|
}
|