use crate::{cert::acme::AcmeConfiguration, ip::IpSource, keys::KeyCertPathPair};
use plane_core::{nats_connection::NatsConnectionSpec, types::DroneId};
use serde::{Deserialize, Serialize};
use std::{
net::{IpAddr, Ipv4Addr},
path::PathBuf,
};
#[derive(Serialize, Deserialize)]
#[serde(untagged)]
enum NatsAuthentication {
Token { token: String },
User { username: String, password: String },
}
#[derive(Serialize, Deserialize)]
#[serde(untagged)]
pub enum DockerConnection {
Socket { socket: String },
Http { http: String },
}
impl Default for DockerConnection {
fn default() -> Self {
DockerConnection::Socket {
socket: "/var/run/docker.sock".into(),
}
}
}
#[derive(Serialize, Deserialize, Default)]
pub struct DockerConfig {
pub runtime: Option<String>,
#[serde(default)]
pub connection: DockerConnection,
pub network: Option<String>,
}
#[derive(Serialize, Deserialize)]
struct CertRefreshOptions {
acme: AcmeConfiguration,
}
#[derive(Serialize, Deserialize)]
pub struct ProxyOptions {
#[serde(default = "default_bind_address")]
pub bind_ip: IpAddr,
#[serde(default = "default_https_port")]
pub https_port: u16,
}
fn default_bind_address() -> IpAddr {
IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))
}
fn default_https_port() -> u16 {
443
}
#[derive(Serialize, Deserialize)]
pub struct AgentOptions {
#[serde(default)]
pub docker: DockerConfig,
pub ip: IpSource,
pub drone_id: Option<DroneId>,
}
#[derive(Serialize, Deserialize)]
pub struct DroneConfig {
pub drone_id: Option<DroneId>,
#[serde(default = "default_db_path")]
pub db_path: PathBuf,
pub cluster_domain: String,
pub nats: Option<NatsConnectionSpec>,
pub cert: Option<KeyCertPathPair>,
pub acme: Option<AcmeConfiguration>,
pub agent: Option<AgentOptions>,
pub proxy: Option<ProxyOptions>,
}
fn default_db_path() -> PathBuf {
PathBuf::from("drone.sqlite3")
}