use crate::docker_types::NetworkIpamConfig;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum SourceKind {
DockerDesktop,
OrbStack,
}
impl SourceKind {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::DockerDesktop => "docker-desktop",
Self::OrbStack => "orbstack",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceConfig {
pub kind: SourceKind,
pub socket_path: PathBuf,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceInfo {
pub kind: SourceKind,
pub socket_path: PathBuf,
pub daemon_name: String,
pub server_version: String,
pub operating_system: String,
pub architecture: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MigrationPlan {
pub source: SourceInfo,
pub helper_image: String,
pub images: Vec<ImagePlan>,
pub volumes: Vec<VolumePlan>,
pub networks: Vec<NetworkPlan>,
pub containers: Vec<ContainerPlan>,
pub unsupported_resources: Vec<String>,
pub replacements: ReplacementSummary,
pub blockers: Vec<RunningVolumeBlocker>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ImagePlan {
pub image_id: String,
pub export_reference: String,
pub repo_tags: Vec<String>,
pub replace_tags: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct VolumePlan {
pub name: String,
pub driver: String,
pub labels: HashMap<String, String>,
pub options: HashMap<String, String>,
pub replace_existing: bool,
pub attached_containers: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NetworkPlan {
pub name: String,
pub id: String,
pub driver: String,
pub internal: bool,
pub enable_ipv6: bool,
pub attachable: bool,
pub labels: HashMap<String, String>,
pub options: HashMap<String, String>,
pub ipam: Vec<NetworkIpamConfig>,
pub replace_existing: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ContainerPlan {
pub name: String,
pub id: String,
pub image_reference: String,
pub spec: ContainerSpec,
pub extra_networks: Vec<ContainerNetworkAttachment>,
pub replace_existing: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ContainerSpec {
pub hostname: Option<String>,
pub domainname: Option<String>,
pub user: Option<String>,
pub env: Vec<String>,
pub labels: HashMap<String, String>,
pub exposed_ports: Vec<String>,
pub tty: bool,
pub open_stdin: bool,
pub working_dir: Option<String>,
pub entrypoint: Vec<String>,
pub cmd: Vec<String>,
pub mounts: Vec<ContainerMount>,
pub publishes: Vec<PortPublish>,
pub restart_policy: Option<RestartPolicySpec>,
pub privileged: bool,
pub read_only_rootfs: bool,
pub extra_hosts: Vec<String>,
pub auto_remove: bool,
pub primary_network: Option<ContainerNetworkAttachment>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ContainerMount {
Volume {
source: String,
target: String,
rw: bool,
},
Bind {
source: String,
target: String,
rw: bool,
},
Tmpfs {
target: String,
options: Option<String>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PortPublish {
pub container_port: String,
pub host_ip: Option<String>,
pub host_port: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RestartPolicySpec {
pub name: String,
pub maximum_retry_count: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ContainerNetworkAttachment {
pub network: String,
pub aliases: Vec<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ReplacementSummary {
pub containers: Vec<String>,
pub volumes: Vec<String>,
pub networks: Vec<String>,
pub image_tags: Vec<String>,
}
impl ReplacementSummary {
#[must_use]
pub fn is_empty(&self) -> bool {
self.containers.is_empty()
&& self.volumes.is_empty()
&& self.networks.is_empty()
&& self.image_tags.is_empty()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RunningVolumeBlocker {
pub volume_name: String,
pub containers: Vec<String>,
}