diff --git a/Cargo.lock b/Cargo.lock index aabfb9d..9d602ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1754,6 +1754,24 @@ dependencies = [ "url", ] +[[package]] +name = "example-ha-cluster" +version = "0.1.0" +dependencies = [ + "brocade", + "cidr", + "env_logger", + "harmony", + "harmony_macros", + "harmony_secret", + "harmony_tui", + "harmony_types", + "log", + "serde", + "tokio", + "url", +] + [[package]] name = "example-kube-rs" version = "0.1.0" @@ -1942,9 +1960,9 @@ dependencies = [ "cidr", "env_logger", "harmony", + "harmony_cli", "harmony_macros", "harmony_secret", - "harmony_tui", "harmony_types", "log", "serde", diff --git a/examples/nanodc/src/main.rs b/examples/nanodc/src/main.rs index bffd659..5f41054 100644 --- a/examples/nanodc/src/main.rs +++ b/examples/nanodc/src/main.rs @@ -3,13 +3,12 @@ use std::{ sync::{Arc, OnceLock}, }; -use brocade::BrocadeOptions; use cidr::Ipv4Cidr; use harmony::{ config::secret::SshKeyPair, data::{FileContent, FilePath}, hardware::{HostCategory, Location, PhysicalHost, SwitchGroup}, - infra::{brocade::BrocadeSwitchClient, opnsense::OPNSenseManagementInterface}, + infra::{brocade::UnmanagedSwitch, opnsense::OPNSenseManagementInterface}, inventory::Inventory, modules::{ http::StaticFilesHttpScore, @@ -23,10 +22,11 @@ use harmony::{ topology::{LogicalHost, UnmanagedRouter}, }; use harmony_macros::{ip, mac_address}; -use harmony_secret::{Secret, SecretManager}; +use harmony_secret::SecretManager; use harmony_types::net::Url; -use serde::{Deserialize, Serialize}; +/// This example can be run this way +/// KUBECONFIG=~/path/to/ncd/kubeconfig HARMONY_USE_LOCAL_K3D=false HARMONY_SECRET_STORE=file HARMONY_SECRET_NAMESPACE=ncd0 cargo run #[tokio::main] async fn main() { let firewall = harmony::topology::LogicalHost { @@ -34,24 +34,7 @@ async fn main() { name: String::from("fw0"), }; - let switch_auth = SecretManager::get_or_prompt::() - .await - .expect("Failed to get credentials"); - - let switches: Vec = vec![ip!("192.168.33.101")]; - let brocade_options = BrocadeOptions { - dry_run: *harmony::config::DRY_RUN, - ..Default::default() - }; - let switch_client = BrocadeSwitchClient::init( - &switches, - &switch_auth.username, - &switch_auth.password, - brocade_options, - ) - .await - .expect("Failed to connect to switch"); - + let switch_client = UnmanagedSwitch {}; let switch_client = Arc::new(switch_client); let opnsense = Arc::new( @@ -191,9 +174,3 @@ async fn main() { .await .unwrap(); } - -#[derive(Secret, Serialize, Deserialize, Debug)] -pub struct BrocadeSwitchAuth { - pub username: String, - pub password: String, -} diff --git a/harmony/src/modules/okd/bootstrap_01_prepare.rs b/harmony/src/modules/okd/bootstrap_01_prepare.rs index 1bf1b40..7d73bcd 100644 --- a/harmony/src/modules/okd/bootstrap_01_prepare.rs +++ b/harmony/src/modules/okd/bootstrap_01_prepare.rs @@ -21,7 +21,9 @@ use serde::Serialize; // ------------------------------------------------------------------------------------------------- #[derive(Debug, Clone, Serialize, new)] -pub struct OKDSetup01InventoryScore {} +pub struct OKDSetup01InventoryScore { + discovery_strategy: HarmonyDiscoveryStrategy, +} impl Score for OKDSetup01InventoryScore { fn create_interpret(&self) -> Box> { @@ -77,6 +79,8 @@ impl Interpret for OKDSetup01InventoryInterpret { info!("Setting up base DNS config for OKD"); let cluster_domain = &topology.domain_name; let load_balancer_ip = &topology.load_balancer.get_ip(); + // TODO reactivate automatic dns config when migration from unbound to dnsmasq is done + // For now we output the instruction for the user to do it manually inquire::Confirm::new(&format!( "Set hostnames manually in your opnsense dnsmasq config : *.apps.{cluster_domain} -> {load_balancer_ip} @@ -88,7 +92,6 @@ 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?; @@ -105,7 +108,7 @@ When you can dig them, confirm to continue. DiscoverHostForRoleScore { role: HostRole::Bootstrap, number_desired_hosts: 1, - discovery_strategy: HarmonyDiscoveryStrategy::MDNS, + discovery_strategy: self.score.discovery_strategy.clone(), } .interpret(inventory, topology) .await?; diff --git a/harmony/src/modules/okd/bootstrap_02_bootstrap.rs b/harmony/src/modules/okd/bootstrap_02_bootstrap.rs index e9b3a6a..e558e87 100644 --- a/harmony/src/modules/okd/bootstrap_02_bootstrap.rs +++ b/harmony/src/modules/okd/bootstrap_02_bootstrap.rs @@ -76,6 +76,8 @@ impl OKDSetup02BootstrapInterpret { } } + /// Runs the openshift-install commands locally to prepare ignition files + /// Uploads the ignition files to the statis http server async fn prepare_ignition_files( &self, inventory: &Inventory, diff --git a/harmony/src/modules/okd/installation.rs b/harmony/src/modules/okd/installation.rs index dce2457..80198f4 100644 --- a/harmony/src/modules/okd/installation.rs +++ b/harmony/src/modules/okd/installation.rs @@ -67,7 +67,7 @@ impl OKDInstallationPipeline { discovery_strategy: HarmonyDiscoveryStrategy, ) -> Vec>> { vec![ - Box::new(OKDSetup01InventoryScore::new()), + Box::new(OKDSetup01InventoryScore::new(discovery_strategy.clone())), Box::new(OKDSetup02BootstrapScore::new()), Box::new(OKDSetup03ControlPlaneScore { discovery_strategy: discovery_strategy.clone(),