orca_core/backup/
config.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct BackupConfig {
6 #[serde(default)]
8 pub schedule: Option<String>,
9
10 #[serde(default = "default_retention_days")]
12 pub retention_days: u32,
13
14 #[serde(default)]
16 pub targets: Vec<BackupTarget>,
17}
18
19fn default_retention_days() -> u32 {
20 30
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize)]
25#[serde(tag = "type", rename_all = "lowercase")]
26pub enum BackupTarget {
27 Local {
28 path: String,
29 },
30 S3 {
31 bucket: String,
32 region: String,
33 #[serde(default)]
34 prefix: Option<String>,
35 #[serde(default)]
37 endpoint: Option<String>,
38 #[serde(default)]
40 access_key: Option<String>,
41 #[serde(default)]
43 secret_key: Option<String>,
44 },
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct ServiceBackupConfig {
50 #[serde(default)]
52 pub enabled: bool,
53
54 #[serde(default)]
56 pub pre_hook: Option<String>,
57}
58
59#[cfg(test)]
60mod tests {
61 use super::*;
62
63 #[test]
64 fn parse_backup_config() {
65 let toml = r#"
66schedule = "0 0 2 * * *"
67retention_days = 7
68
69[[targets]]
70type = "local"
71path = "/backups"
72
73[[targets]]
74type = "s3"
75bucket = "my-backups"
76region = "eu-central-1"
77prefix = "orca/"
78"#;
79 let config: BackupConfig = toml::from_str(toml).unwrap();
80 assert_eq!(config.retention_days, 7);
81 assert_eq!(config.targets.len(), 2);
82 }
83}