All checks were successful
Run Check Script / check (pull_request) Successful in 59s
Co-authored-by: Jean-Gabriel Gill-Couture <jeangabriel.gc@gmail.com> Co-authored-by: Ian Letourneau <ian@noma.to> Reviewed-on: https://git.nationtech.io/NationTech/harmony/pulls/130 Reviewed-by: Ian Letourneau <ian@noma.to> Co-authored-by: Jean-Gabriel Gill-Couture <jg@nationtech.io> Co-committed-by: Jean-Gabriel Gill-Couture <jg@nationtech.io>
169 lines
5.6 KiB
Rust
169 lines
5.6 KiB
Rust
use std::{
|
|
net::{IpAddr, Ipv4Addr},
|
|
sync::Arc,
|
|
};
|
|
|
|
use cidr::Ipv4Cidr;
|
|
use harmony::{
|
|
config::secret::SshKeyPair,
|
|
data::{FileContent, FilePath},
|
|
hardware::{HostCategory, Location, PhysicalHost, SwitchGroup},
|
|
infra::opnsense::OPNSenseManagementInterface,
|
|
inventory::Inventory,
|
|
modules::{
|
|
http::StaticFilesHttpScore,
|
|
okd::{
|
|
bootstrap_dhcp::OKDBootstrapDhcpScore,
|
|
bootstrap_load_balancer::OKDBootstrapLoadBalancerScore, dhcp::OKDDhcpScore,
|
|
dns::OKDDnsScore, ipxe::OKDIpxeScore,
|
|
},
|
|
tftp::TftpScore,
|
|
},
|
|
topology::{LogicalHost, UnmanagedRouter},
|
|
};
|
|
use harmony_macros::{ip, mac_address};
|
|
use harmony_secret::SecretManager;
|
|
use harmony_types::net::Url;
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let firewall = harmony::topology::LogicalHost {
|
|
ip: ip!("192.168.33.1"),
|
|
name: String::from("fw0"),
|
|
};
|
|
|
|
let opnsense = Arc::new(
|
|
harmony::infra::opnsense::OPNSenseFirewall::new(firewall, None, "root", "opnsense").await,
|
|
);
|
|
let lan_subnet = Ipv4Addr::new(192, 168, 33, 0);
|
|
let gateway_ipv4 = Ipv4Addr::new(192, 168, 33, 1);
|
|
let gateway_ip = IpAddr::V4(gateway_ipv4);
|
|
let topology = harmony::topology::HAClusterTopology {
|
|
domain_name: "ncd0.harmony.mcd".to_string(), // TODO this must be set manually correctly
|
|
// when setting up the opnsense firewall
|
|
router: Arc::new(UnmanagedRouter::new(
|
|
gateway_ip,
|
|
Ipv4Cidr::new(lan_subnet, 24).unwrap(),
|
|
)),
|
|
load_balancer: opnsense.clone(),
|
|
firewall: opnsense.clone(),
|
|
tftp_server: opnsense.clone(),
|
|
http_server: opnsense.clone(),
|
|
dhcp_server: opnsense.clone(),
|
|
dns_server: opnsense.clone(),
|
|
control_plane: vec![
|
|
LogicalHost {
|
|
ip: ip!("192.168.33.20"),
|
|
name: "cp0".to_string(),
|
|
},
|
|
LogicalHost {
|
|
ip: ip!("192.168.33.21"),
|
|
name: "cp1".to_string(),
|
|
},
|
|
LogicalHost {
|
|
ip: ip!("192.168.33.22"),
|
|
name: "cp2".to_string(),
|
|
},
|
|
],
|
|
bootstrap_host: LogicalHost {
|
|
ip: ip!("192.168.33.66"),
|
|
name: "bootstrap".to_string(),
|
|
},
|
|
workers: vec![
|
|
LogicalHost {
|
|
ip: ip!("192.168.33.30"),
|
|
name: "wk0".to_string(),
|
|
},
|
|
LogicalHost {
|
|
ip: ip!("192.168.33.31"),
|
|
name: "wk1".to_string(),
|
|
},
|
|
LogicalHost {
|
|
ip: ip!("192.168.33.32"),
|
|
name: "wk2".to_string(),
|
|
},
|
|
],
|
|
switch: vec![],
|
|
};
|
|
|
|
let inventory = Inventory {
|
|
location: Location::new("I am mobile".to_string(), "earth".to_string()),
|
|
switch: SwitchGroup::from([]),
|
|
firewall_mgmt: Box::new(OPNSenseManagementInterface::new()),
|
|
storage_host: vec![],
|
|
worker_host: vec![
|
|
PhysicalHost::empty(HostCategory::Server)
|
|
.mac_address(mac_address!("C4:62:37:02:61:0F")),
|
|
PhysicalHost::empty(HostCategory::Server)
|
|
.mac_address(mac_address!("C4:62:37:02:61:26")),
|
|
// thisone
|
|
// Then create the ipxe file
|
|
// set the dns static leases
|
|
// bootstrap nodes
|
|
// start ceph cluster
|
|
// try installation of lampscore
|
|
// bingo?
|
|
PhysicalHost::empty(HostCategory::Server)
|
|
.mac_address(mac_address!("C4:62:37:02:61:70")),
|
|
],
|
|
control_plane_host: vec![
|
|
PhysicalHost::empty(HostCategory::Server)
|
|
.mac_address(mac_address!("C4:62:37:02:60:FA")),
|
|
PhysicalHost::empty(HostCategory::Server)
|
|
.mac_address(mac_address!("C4:62:37:02:61:1A")),
|
|
PhysicalHost::empty(HostCategory::Server)
|
|
.mac_address(mac_address!("C4:62:37:01:BC:68")),
|
|
],
|
|
};
|
|
|
|
// TODO regroup smaller scores in a larger one such as this
|
|
// let okd_boostrap_preparation();
|
|
|
|
let bootstrap_dhcp_score = OKDBootstrapDhcpScore::new(&topology, &inventory);
|
|
let bootstrap_load_balancer_score = OKDBootstrapLoadBalancerScore::new(&topology);
|
|
let dhcp_score = OKDDhcpScore::new(&topology, &inventory);
|
|
let dns_score = OKDDnsScore::new(&topology);
|
|
let load_balancer_score =
|
|
harmony::modules::okd::load_balancer::OKDLoadBalancerScore::new(&topology);
|
|
|
|
let ssh_key = SecretManager::get_or_prompt::<SshKeyPair>().await.unwrap();
|
|
|
|
let tftp_score = TftpScore::new(Url::LocalFolder("./data/watchguard/tftpboot".to_string()));
|
|
let http_score = StaticFilesHttpScore {
|
|
folder_to_serve: Some(Url::LocalFolder(
|
|
"./data/watchguard/pxe-http-files".to_string(),
|
|
)),
|
|
files: vec![],
|
|
remote_path: None,
|
|
};
|
|
|
|
let kickstart_filename = "inventory.kickstart".to_string();
|
|
let harmony_inventory_agent = "harmony_inventory_agent".to_string();
|
|
|
|
let ipxe_score = OKDIpxeScore {
|
|
kickstart_filename,
|
|
harmony_inventory_agent,
|
|
cluster_pubkey: FileContent {
|
|
path: FilePath::Relative("cluster_ssh_key.pub".to_string()),
|
|
content: ssh_key.public,
|
|
},
|
|
};
|
|
|
|
harmony_tui::run(
|
|
inventory,
|
|
topology,
|
|
vec![
|
|
Box::new(dns_score),
|
|
Box::new(bootstrap_dhcp_score),
|
|
Box::new(bootstrap_load_balancer_score),
|
|
Box::new(load_balancer_score),
|
|
Box::new(tftp_score),
|
|
Box::new(http_score),
|
|
Box::new(ipxe_score),
|
|
Box::new(dhcp_score),
|
|
],
|
|
)
|
|
.await
|
|
.unwrap();
|
|
}
|