crabka_operator/
config.rs1use std::net::SocketAddr;
2
3use clap::Args;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Args, Serialize, Deserialize)]
11pub struct OperatorConfig {
12 #[arg(long, env = "WATCH_NAMESPACES", value_delimiter = ',', num_args = 0..)]
14 pub watch_namespaces: Vec<String>,
15
16 #[arg(long, env = "OPERATOR_NAMESPACE", default_value = "crabka-operator")]
18 pub operator_namespace: String,
19
20 #[arg(long, env = "LEASE_NAME", default_value = "crabka-operator-leader")]
22 pub lease_name: String,
23
24 #[arg(long, env = "POD_NAME", default_value = "crabka-operator-local")]
26 pub pod_name: String,
27
28 #[arg(long, env = "HEALTH_ADDR", default_value = "0.0.0.0:8080")]
30 pub health_addr: SocketAddr,
31
32 #[arg(
34 long,
35 env = "RUST_LOG",
36 default_value = "info,kube_client::client::builder=warn"
37 )]
38 pub log_filter: String,
39
40 #[arg(long, env = "DEFAULT_BROKER_IMAGE")]
42 pub default_broker_image: Option<String>,
43
44 #[arg(long, env = "DEFAULT_GATEWAY_IMAGE")]
46 pub default_gateway_image: Option<String>,
47 #[arg(long, env = "DEFAULT_SCHEMA_REGISTRY_IMAGE")]
49 pub default_schema_registry_image: Option<String>,
50}
51
52impl OperatorConfig {
53 #[must_use]
55 pub fn watched(&self) -> Option<&[String]> {
56 if self.watch_namespaces.is_empty() {
57 None
58 } else {
59 Some(&self.watch_namespaces)
60 }
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67 use assert2::assert;
68 use clap::Parser;
69
70 #[derive(Parser)]
71 struct Wrap {
72 #[command(flatten)]
73 cfg: OperatorConfig,
74 }
75
76 #[test]
77 fn cli_defaults_compute_cluster_scope() {
78 let parsed = Wrap::parse_from(["bin"]);
79 assert!(parsed.cfg.watched().is_none());
80 assert!(parsed.cfg.operator_namespace == "crabka-operator");
81 }
82
83 #[test]
84 fn comma_separated_namespaces_parse() {
85 let parsed = Wrap::parse_from(["bin", "--watch-namespaces=a,b,c"]);
86 assert!(parsed.cfg.watch_namespaces == vec!["a", "b", "c"]);
87 assert!(parsed.cfg.watched().is_some());
88 }
89}