use super::{
runtime::{docker::DockerRuntimeConfig, unix_socket::UnixSocketRuntimeConfig},
DroneConfig, ExecutorConfig,
};
use crate::util::resolve_hostname;
use anyhow::Result;
use chrono::Duration;
use clap::Parser;
use plane_common::{
names::{DroneName, OrRandom},
types::{ClusterName, DronePoolName},
};
use std::{net::IpAddr, path::PathBuf};
use url::Url;
#[derive(Parser)]
pub struct DroneOpts {
#[clap(long)]
name: Option<DroneName>,
#[clap(long)]
controller_url: Url,
#[clap(long)]
cluster: ClusterName,
#[clap(long, default_value = "127.0.0.1")]
ip: String,
#[clap(long)]
db: Option<PathBuf>,
#[clap(long)]
docker_runtime: Option<String>,
#[clap(long)]
executor_socket: Option<PathBuf>,
#[clap(long)]
log_config: Option<String>,
#[clap(long, default_value_t = DronePoolName::default())]
pool: DronePoolName,
#[clap(long)]
mount_base: Option<PathBuf>,
#[clap(long)]
auto_prune_images: bool,
#[clap(long, default_value = "0")]
auto_prune_containers_older_than_seconds: i32,
}
impl DroneOpts {
pub fn into_config(self) -> Result<DroneConfig> {
let name = self.name.or_random();
let log_config = self
.log_config
.map(|s| serde_json::from_str(&s))
.transpose()?;
let cleanup_min_age =
Duration::try_seconds(self.auto_prune_containers_older_than_seconds as i64)
.expect("valid duration");
let executor_config = if let Some(socket_path) = self.executor_socket {
ExecutorConfig::UnixSocket(UnixSocketRuntimeConfig { socket_path })
} else {
ExecutorConfig::Docker(DockerRuntimeConfig {
runtime: self.docker_runtime,
log_config,
mount_base: self.mount_base,
auto_prune: Some(self.auto_prune_images),
cleanup_min_age: Some(cleanup_min_age),
})
};
let ip: IpAddr = resolve_hostname(&self.ip)
.ok_or_else(|| anyhow::anyhow!("Failed to resolve hostname to IP address."))?;
#[allow(deprecated)]
let drone_config = DroneConfig {
controller_url: self.controller_url,
name: name.clone(),
cluster: self.cluster.clone(),
ip,
db_path: self.db,
pool: self.pool,
auto_prune: None, cleanup_min_age: None, docker_config: None, executor_config: Some(executor_config),
};
Ok(drone_config)
}
}