forked from NationTech/harmony
118 lines
3.7 KiB
Rust
118 lines
3.7 KiB
Rust
use crate::{
|
|
data::Version,
|
|
hardware::PhysicalHost,
|
|
infra::inventory::InventoryRepositoryFactory,
|
|
interpret::{Interpret, InterpretError, InterpretName, InterpretStatus, Outcome},
|
|
inventory::{HostRole, Inventory},
|
|
modules::inventory::DiscoverHostForRoleScore,
|
|
score::Score,
|
|
topology::HAClusterTopology,
|
|
};
|
|
use async_trait::async_trait;
|
|
use derive_new::new;
|
|
use harmony_types::id::Id;
|
|
use log::info;
|
|
use serde::Serialize;
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
// Step 01: Inventory (default PXE + Kickstart in RAM + Rust agent)
|
|
// - This score exposes/ensures the default inventory assets and waits for discoveries.
|
|
// - No early bonding. Simple access DHCP.
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
#[derive(Debug, Clone, Serialize, new)]
|
|
pub struct OKDSetup01InventoryScore {}
|
|
|
|
impl Score<HAClusterTopology> for OKDSetup01InventoryScore {
|
|
fn create_interpret(&self) -> Box<dyn Interpret<HAClusterTopology>> {
|
|
Box::new(OKDSetup01InventoryInterpret::new(self.clone()))
|
|
}
|
|
|
|
fn name(&self) -> String {
|
|
"OKDSetup01InventoryScore".to_string()
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct OKDSetup01InventoryInterpret {
|
|
score: OKDSetup01InventoryScore,
|
|
version: Version,
|
|
status: InterpretStatus,
|
|
}
|
|
|
|
impl OKDSetup01InventoryInterpret {
|
|
pub fn new(score: OKDSetup01InventoryScore) -> Self {
|
|
let version = Version::from("1.0.0").unwrap();
|
|
Self {
|
|
version,
|
|
score,
|
|
status: InterpretStatus::QUEUED,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl Interpret<HAClusterTopology> for OKDSetup01InventoryInterpret {
|
|
fn get_name(&self) -> InterpretName {
|
|
InterpretName::Custom("OKDSetup01Inventory")
|
|
}
|
|
|
|
fn get_version(&self) -> Version {
|
|
self.version.clone()
|
|
}
|
|
|
|
fn get_status(&self) -> InterpretStatus {
|
|
self.status.clone()
|
|
}
|
|
|
|
fn get_children(&self) -> Vec<Id> {
|
|
vec![]
|
|
}
|
|
|
|
async fn execute(
|
|
&self,
|
|
inventory: &Inventory,
|
|
topology: &HAClusterTopology,
|
|
) -> Result<Outcome, InterpretError> {
|
|
info!("Setting up base DNS config for OKD");
|
|
let cluster_domain = &topology.domain_name;
|
|
let load_balancer_ip = &topology.load_balancer.get_ip();
|
|
inquire::Confirm::new(&format!(
|
|
"Set hostnames manually in your opnsense dnsmasq config :
|
|
*.apps.{cluster_domain} -> {load_balancer_ip}
|
|
api.{cluster_domain} -> {load_balancer_ip}
|
|
api-int.{cluster_domain} -> {load_balancer_ip}
|
|
|
|
When you can dig them, confirm to continue.
|
|
"
|
|
))
|
|
.prompt()
|
|
.expect("Prompt error");
|
|
// TODO reactivate automatic dns config when migration from unbound to dnsmasq is done
|
|
// OKDDnsScore::new(topology)
|
|
// .interpret(inventory, topology)
|
|
// .await?;
|
|
|
|
// TODO refactor this section into a function discover_hosts_for_role(...) that can be used
|
|
// from anywhere in the project, not a member of this struct
|
|
|
|
let mut bootstrap_host: Option<PhysicalHost> = None;
|
|
let repo = InventoryRepositoryFactory::build().await?;
|
|
|
|
while bootstrap_host.is_none() {
|
|
let hosts = repo.get_host_for_role(&HostRole::Bootstrap).await?;
|
|
bootstrap_host = hosts.into_iter().next().to_owned();
|
|
DiscoverHostForRoleScore {
|
|
role: HostRole::Bootstrap,
|
|
}
|
|
.interpret(inventory, topology)
|
|
.await?;
|
|
}
|
|
|
|
Ok(Outcome::success(format!(
|
|
"Found and assigned bootstrap node: {}",
|
|
bootstrap_host.unwrap().summary()
|
|
)))
|
|
}
|
|
}
|