orca_core/config/
cluster.rs1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::ai::AiConfig;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct ClusterConfig {
10 pub cluster: ClusterMeta,
11 #[serde(default)]
12 pub node: Vec<NodeConfig>,
13 #[serde(default)]
14 pub observability: Option<ObservabilityConfig>,
15 #[serde(default)]
16 pub ai: Option<AiConfig>,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct ClusterMeta {
21 pub name: String,
22 pub domain: Option<String>,
23 pub acme_email: Option<String>,
24 #[serde(default = "default_log_level")]
25 pub log_level: String,
26 #[serde(default = "default_api_port")]
27 pub api_port: u16,
28 #[serde(default = "default_grpc_port")]
29 pub grpc_port: u16,
30}
31
32pub(crate) fn default_log_level() -> String {
33 "info".into()
34}
35
36pub(crate) fn default_api_port() -> u16 {
37 6880
38}
39
40pub(crate) fn default_grpc_port() -> u16 {
41 6881
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct NodeConfig {
46 pub address: String,
47 #[serde(default)]
48 pub labels: HashMap<String, String>,
49 #[serde(default)]
51 pub gpus: Vec<NodeGpuConfig>,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct NodeGpuConfig {
56 pub vendor: String,
58 #[serde(default = "default_gpu_count")]
60 pub count: u32,
61 pub model: Option<String>,
63}
64
65pub(crate) fn default_gpu_count() -> u32 {
66 1
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct ObservabilityConfig {
71 pub otlp_endpoint: Option<String>,
72 pub alerts: Option<AlertChannelConfig>,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct AlertChannelConfig {
77 pub webhook: Option<String>,
78 pub email: Option<String>,
79}