use std::str::FromStr; use harmony::{ inventory::Inventory, modules::helm::chart::{HelmChartScore, HelmRepository, NonBlankString}, topology::{HelmCommand, K8sAnywhereConfig, K8sAnywhereTopology, TlsRouter, Topology}, }; use harmony_macros::hurl; use log::info; #[tokio::main] async fn main() { let site1_topo = K8sAnywhereTopology::with_config(K8sAnywhereConfig::remote_k8s_from_env_var( "HARMONY_NATS_SITE_1", )); let site2_topo = K8sAnywhereTopology::with_config(K8sAnywhereConfig::remote_k8s_from_env_var( "HARMONY_NATS_SITE_2", )); let site1_domain = site1_topo.get_internal_domain().await.unwrap().unwrap(); let site2_domain = site2_topo.get_internal_domain().await.unwrap().unwrap(); let site1_gateway = format!("nats-gateway.{}", site1_domain); let site2_gateway = format!("nats-gateway.{}", site2_domain); tokio::join!( deploy_nats( site1_topo, "site-1", vec![("site-2".to_string(), site2_gateway)] ), deploy_nats( site2_topo, "site-2", vec![("site-1".to_string(), site1_gateway)] ), ); } async fn deploy_nats( topology: T, cluster_name: &str, remote_gateways: Vec<(String, String)>, ) { topology.ensure_ready().await.unwrap(); let mut gateway_gateways = String::new(); for (name, url) in remote_gateways { gateway_gateways.push_str(&format!( r#" - name: {name} urls: - nats://{url}:7222"# )); } let values_yaml = Some(format!( r#"config: cluster: enabled: true replicas: 3 jetstream: enabled: true fileStorage: enabled: true size: 10Gi storageDirectory: /data/jetstream leafnodes: enabled: false # port: 7422 websocket: enabled: true ingress: enabled: true className: openshift-default pathType: Prefix hosts: - nats-ws.{} gateway: enabled: true name: {} port: 7222 gateways: {} service: ports: gateway: enabled: true natsBox: container: image: tag: nonroot"#, topology.get_internal_domain().await.unwrap().unwrap(), cluster_name, gateway_gateways, )); let namespace = "nats"; let nats = HelmChartScore { namespace: Some(NonBlankString::from_str(namespace).unwrap()), release_name: NonBlankString::from_str("nats").unwrap(), chart_name: NonBlankString::from_str("nats/nats").unwrap(), chart_version: None, values_overrides: None, values_yaml, create_namespace: true, install_only: false, repository: Some(HelmRepository::new( "nats".to_string(), hurl!("https://nats-io.github.io/k8s/helm/charts/"), true, )), }; harmony_cli::run(Inventory::autoload(), topology, vec![Box::new(nats)], None) .await .unwrap(); info!( "Enjoy! You can test your nats cluster by running : `kubectl exec -n {namespace} -it deployment/nats-box -- nats pub test hi`" ); }