use crate::application_types::ApplicationValues;
use crate::dsh_api_client::DshApiClient;
use crate::error::DshApiResult;
use crate::types::{Application, NodeFeatures, NodepoolActual};
use crate::DependantApplication;
#[allow(unused_imports)]
use crate::DshApiError;
use futures::future::try_join_all;
use futures::try_join;
use itertools::Itertools;
use std::collections::HashMap;
impl DshApiClient {
pub async fn nodepools(&self) -> DshApiResult<Vec<(String, NodepoolActual)>> {
let nodepool_ids = self.get_nodepool_ids().await?;
let nodepool_actuals = try_join_all(nodepool_ids.iter().map(|nodepool_id| self.get_nodepool_actual(nodepool_id))).await?;
Ok(nodepool_ids.into_iter().zip(nodepool_actuals).collect_vec())
}
pub async fn nodepool_with_dependant_applications(&self, nodepool_id: &str) -> DshApiResult<(NodepoolActual, Vec<DependantApplication<NodeFeatures>>)> {
let (nodepool_actual, applications) = try_join!(self.get_nodepool_actual(nodepool_id), self.get_application_configuration_map(),)?;
let mut dependants: Vec<DependantApplication<NodeFeatures>> = vec![];
for ApplicationValues { id, application, values } in nodepool_from_applications(nodepool_id, &applications) {
dependants.push(DependantApplication::new(
id.to_string(),
application.instances,
values.into_iter().cloned().collect_vec(),
));
}
Ok((nodepool_actual, dependants))
}
pub async fn nodepools_with_dependant_applications(&self) -> DshApiResult<Vec<(String, NodepoolActual, Vec<DependantApplication<NodeFeatures>>)>> {
let (nodepools, applications): (Vec<(String, NodepoolActual)>, HashMap<String, Application>) = try_join!(self.nodepools(), self.get_application_configuration_map())?;
let mut nodepools_tuples = Vec::<(String, NodepoolActual, Vec<DependantApplication<NodeFeatures>>)>::new();
for (nodepool_id, nodepool_actual) in nodepools {
let mut dependant_applications: Vec<DependantApplication<NodeFeatures>> = vec![];
for ApplicationValues { id, application, values } in nodepool_from_applications(&nodepool_id, &applications) {
dependant_applications.push(DependantApplication::new(
id.to_string(),
application.instances,
values.into_iter().cloned().collect_vec(),
));
}
nodepools_tuples.push((nodepool_id, nodepool_actual, dependant_applications));
}
Ok(nodepools_tuples)
}
}
pub fn nodepool_from_applications<'a>(nodepool_id: &str, applications: &'a HashMap<String, Application>) -> Vec<ApplicationValues<'a, &'a NodeFeatures>> {
let mut application_tuples = applications
.iter()
.filter_map(|(application_id, application)| match &application.node_features {
Some(node_features) => {
if node_features.nodepool == nodepool_id {
Some(ApplicationValues::new(application_id, application, vec![node_features]))
} else {
None
}
}
None => None,
})
.collect_vec();
application_tuples.sort();
application_tuples
}
pub fn nodepools_from_applications(applications: &HashMap<String, Application>) -> Vec<ApplicationValues<&NodeFeatures>> {
let mut application_tuples = applications
.iter()
.filter_map(|(application_id, application)| match &application.node_features {
Some(node_features) => Some(ApplicationValues::new(application_id, application, vec![node_features])),
None => None,
})
.collect_vec();
application_tuples.sort();
application_tuples
}