All checks were successful
Run Check Script / check (pull_request) Successful in 1m24s
84 lines
3.6 KiB
Rust
84 lines
3.6 KiB
Rust
//! OKDInstallationScore
|
||
//!
|
||
//! Overview
|
||
//! --------
|
||
//! OKDInstallationScore orchestrates an end-to-end, bare-metal OKD (OpenShift/OKD 4.19).
|
||
//! It follows principles of “discovery-first, then provision” strategy with strict ordering,
|
||
//! observable progress, and minimal assumptions about the underlying network.
|
||
//!
|
||
//! High-level flow
|
||
//! 1) OKDSetup01Inventory
|
||
//! - Serve default iPXE + Kickstart (in-RAM CentOS Stream 9) for discovery only.
|
||
//! - Enable SSH with the cluster’s pubkey, start a Rust inventory agent.
|
||
//! - Harmony discovers nodes by scraping the agent endpoint and collects MACs/NICs.
|
||
//!
|
||
//! 2) OKDSetup02Bootstrap
|
||
//! - User selects which discovered node becomes bootstrap.
|
||
//! - Prepare the OKD cluster installation files
|
||
//! - Render per-MAC iPXE for bootstrap with OKD 4.19 SCOS live assets + ignition.
|
||
//! - Reboot node via SSH; install bootstrap; wait for bootstrap-complete.
|
||
//!
|
||
//! 3) OKDSetup03ControlPlane
|
||
//! - Render per-MAC iPXE for cp0/cp1/cp2 with ignition. Reboot via SSH, join masters.
|
||
//! - Configure network bond (where relevant) using OKD NMState MachineConfig
|
||
//!
|
||
//! 4) OKDSetup04Workers
|
||
//! - Render per-MAC iPXE for worker set; join workers.
|
||
//! - Configure network bond (where relevant) using OKD NMState MachineConfig
|
||
//!
|
||
//! 5) OKDSetup05SanityCheck
|
||
//! - Validate API/ingress/clusteroperators; ensure healthy control plane and SDN.
|
||
//!
|
||
//! 6) OKDSetup06InstallationReport
|
||
//! - Produce a concise, machine-readable report (JSON) and a human summary.
|
||
//!
|
||
//! Network notes
|
||
//! - During Inventory: ports must be simple access (no LACP). DHCP succeeds; iPXE
|
||
//! loads CentOS Stream live with Kickstart and starts the inventory endpoint.
|
||
//! - During Provisioning: only after SCOS is on disk and Ignition/MC can be applied
|
||
//! do we set the bond persistently. If early bonding is truly required on a host,
|
||
//! use kernel args selectively in the per-MAC PXE for that host, but never for the
|
||
//! generic discovery path.
|
||
//! - This is caused by the inherent race condition between PXE, which cannot perform
|
||
//! its DHCP recovery process on a bonded network, and the bond configuration itself,
|
||
//! which must be configured on host AND switch to connect properly.
|
||
//!
|
||
//! Configuration knobs
|
||
//! - public_domain: External wildcard/apps domain (e.g., apps.example.com).
|
||
//! - internal_domain: Internal cluster domain (e.g., cluster.local or harmony.mcd).
|
||
|
||
use crate::{
|
||
modules::{
|
||
inventory::HarmonyDiscoveryStrategy,
|
||
okd::{
|
||
OKDSetup01InventoryScore, OKDSetup02BootstrapScore, OKDSetup03ControlPlaneScore,
|
||
OKDSetup04WorkersScore, OKDSetup05SanityCheckScore, OKDSetupPersistNetworkBondScore,
|
||
bootstrap_06_installation_report::OKDSetup06InstallationReportScore,
|
||
},
|
||
},
|
||
score::Score,
|
||
topology::HAClusterTopology,
|
||
};
|
||
|
||
pub struct OKDInstallationPipeline;
|
||
|
||
impl OKDInstallationPipeline {
|
||
pub async fn get_all_scores(
|
||
discovery_strategy: HarmonyDiscoveryStrategy,
|
||
) -> Vec<Box<dyn Score<HAClusterTopology>>> {
|
||
vec![
|
||
Box::new(OKDSetup01InventoryScore::new()),
|
||
Box::new(OKDSetup02BootstrapScore::new()),
|
||
Box::new(OKDSetup03ControlPlaneScore {
|
||
discovery_strategy: discovery_strategy.clone(),
|
||
}),
|
||
Box::new(OKDSetupPersistNetworkBondScore::new()),
|
||
Box::new(OKDSetup04WorkersScore {
|
||
discovery_strategy: discovery_strategy.clone(),
|
||
}),
|
||
Box::new(OKDSetup05SanityCheckScore::new()),
|
||
Box::new(OKDSetup06InstallationReportScore::new()),
|
||
]
|
||
}
|
||
}
|