use k8s_openapi::api::core::v1::ConfigMap; use kube::api::ObjectMeta; use kube::Resource; use crate::types::ErgoNetwork; pub fn build_configmap(network: &ErgoNetwork, oper_hash: Option<&str>) -> ConfigMap { let name = network.metadata.name.clone().unwrap(); let ns = network.metadata.namespace.clone().unwrap(); let oref = network.controller_owner_ref(&()).unwrap(); let config = generate_ergo_config(network, oper_hash); ConfigMap { metadata: ObjectMeta { name: Some(format!("{name}-config")), namespace: Some(ns), owner_references: Some(vec![oref]), ..Default::default() }, data: Some([("ircd.yaml".to_string(), config)].into()), ..Default::default() } } fn generate_ergo_config(network: &ErgoNetwork, oper_hash: Option<&str>) -> String { let spec = &network.spec; let network_name = spec .network_name .as_deref() .unwrap_or(&spec.hostname); let mut listeners = serde_json::Map::new(); for listener in &spec.listeners { let addr = &listener.address; if listener.tls { listeners.insert( addr.clone(), serde_json::json!({ "tls": { "cert": "/etc/ergo/tls/tls.crt", "key": "/etc/ergo/tls/tls.key" } }), ); } else { listeners.insert(addr.clone(), serde_json::json!({})); } } let mut config = serde_json::json!({ "server": { "name": spec.hostname }, "network": { "name": network_name }, "listeners": listeners, "datastore": { "path": "/ircd/ircd.db", "autoupgrade": true } }); if let Some(hash) = oper_hash { config["opers"] = serde_json::json!({ "admin": { "class": "server-admin", "password": hash } }); } serde_yaml::to_string(&config).unwrap() } #[cfg(test)] mod tests { use super::*; use crate::testutil::test_network; #[test] fn config_contains_hostname() { let cm = build_configmap(&test_network(), None); let data = cm.data.unwrap(); let config = &data["ircd.yaml"]; assert!(config.contains("test-network.irc.now")); } #[test] fn config_contains_network_name() { let cm = build_configmap(&test_network(), None); let data = cm.data.unwrap(); let config = &data["ircd.yaml"]; assert!(config.contains("Test Network")); } #[test] fn config_contains_listeners() { let cm = build_configmap(&test_network(), None); let data = cm.data.unwrap(); let config = &data["ircd.yaml"]; assert!(config.contains(":6697")); assert!(config.contains(":6667")); } #[test] fn config_contains_tls_paths() { let cm = build_configmap(&test_network(), None); let data = cm.data.unwrap(); let config = &data["ircd.yaml"]; assert!(config.contains("/etc/ergo/tls/tls.crt")); assert!(config.contains("/etc/ergo/tls/tls.key")); } #[test] fn config_contains_oper_hash() { let hash = "$2a$10$examplehash"; let cm = build_configmap(&test_network(), Some(hash)); let data = cm.data.unwrap(); let config = &data["ircd.yaml"]; assert!(config.contains(hash)); assert!(config.contains("server-admin")); } #[test] fn config_without_oper_omits_opers_section() { let cm = build_configmap(&test_network(), None); let data = cm.data.unwrap(); let config = &data["ircd.yaml"]; assert!(!config.contains("opers")); } #[test] fn network_name_defaults_to_hostname() { let mut network = test_network(); network.spec.network_name = None; let cm = build_configmap(&network, None); let data = cm.data.unwrap(); let config = &data["ircd.yaml"]; assert!(config.contains("test-network.irc.now")); } #[test] fn configmap_named_correctly() { let cm = build_configmap(&test_network(), None); assert_eq!(cm.metadata.name.unwrap(), "test-network-config"); } #[test] fn configmap_has_owner_reference() { let cm = build_configmap(&test_network(), None); let orefs = cm.metadata.owner_references.unwrap(); assert_eq!(orefs.len(), 1); assert_eq!(orefs[0].name, "test-network"); } }