Skip to main content

orca_core/config/
cluster.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::ai::AiConfig;
6
7/// Top-level cluster configuration (`cluster.toml`).
8#[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    /// GPU devices available on this node.
50    #[serde(default)]
51    pub gpus: Vec<NodeGpuConfig>,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
55pub struct NodeGpuConfig {
56    /// Vendor: "nvidia" or "amd".
57    pub vendor: String,
58    /// Number of GPUs of this type.
59    #[serde(default = "default_gpu_count")]
60    pub count: u32,
61    /// Model name for scheduling (e.g., "A100", "RTX4090").
62    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}