use std::collections::HashMap;
use std::time::Duration;
use crate::state::{RestartPolicy, WorkloadState};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct DeployRequest {
pub name: String,
pub image: String,
pub command: Vec<String>,
pub args: Vec<String>,
pub environment: HashMap<String, String>,
pub labels: HashMap<String, String>,
pub annotations: HashMap<String, String>,
pub work_dir: String,
pub resources: Option<ResourceConfig>,
pub network: Option<NetworkConfig>,
pub volumes: Vec<VolumeMount>,
pub ports: Vec<PortMapping>,
pub restart_policy: RestartPolicy,
pub auto_remove: bool,
pub replicas: u32,
pub timeout: Option<Duration>,
pub platform: String,
pub namespace: String,
pub service_account: String,
}
impl DeployRequest {
#[must_use]
pub fn new(name: impl Into<String>, image: impl Into<String>) -> Self {
Self {
name: name.into(),
image: image.into(),
..Self::default()
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ResourceConfig {
pub cpu_limit: String,
pub cpu_request: String,
pub memory_limit: String,
pub memory_request: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct NetworkConfig {
pub mode: String,
pub dns: Vec<String>,
pub hosts: HashMap<String, String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PortMapping {
pub host: u16,
pub container: u16,
pub protocol: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct VolumeMount {
pub source: String,
pub target: String,
pub read_only: bool,
pub kind: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct LogOptions {
pub tail: usize,
pub since: Option<Duration>,
pub follow: bool,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ListFilter {
pub labels: HashMap<String, String>,
pub name: String,
pub state: Option<WorkloadState>,
pub namespace: String,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct ImageEventFilter {
pub actions: Vec<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_sets_name_and_image_with_defaults() {
let req = DeployRequest::new("api", "nginx:latest");
assert_eq!(req.name, "api");
assert_eq!(req.image, "nginx:latest");
assert_eq!(req.restart_policy, RestartPolicy::No);
assert!(req.timeout.is_none());
assert!(req.command.is_empty());
}
#[test]
fn deploy_request_is_cloneable_and_eq() {
let mut req = DeployRequest::new("api", "nginx");
req.labels.insert("team".into(), "core".into());
req.timeout = Some(Duration::from_secs(30));
assert_eq!(req.clone(), req);
}
#[test]
fn nested_specs_default_empty() {
assert_eq!(ResourceConfig::default(), ResourceConfig::default());
assert!(NetworkConfig::default().dns.is_empty());
assert!(ListFilter::default().state.is_none());
assert_eq!(LogOptions::default().tail, 0);
assert!(ImageEventFilter::default().actions.is_empty());
}
}