//! Rust representations of docker json structures #[cfg(feature = "chrono")] use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct SearchResult { pub description: String, pub is_official: bool, pub is_automated: bool, pub name: String, pub star_count: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Image { #[cfg(feature = "chrono")] #[serde(deserialize_with = "datetime_from_unix_timestamp")] pub created: DateTime, #[cfg(not(feature = "chrono"))] pub created: u64, pub id: String, pub parent_id: String, pub labels: Option>, pub repo_tags: Option>, pub repo_digests: Option>, pub virtual_size: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct ImageDetails { pub architecture: String, pub author: String, pub comment: String, pub config: Config, #[cfg(feature = "chrono")] pub created: DateTime, #[cfg(not(feature = "chrono"))] pub created: String, pub docker_version: String, pub id: String, pub os: String, pub parent: String, pub repo_tags: Option>, pub repo_digests: Option>, pub size: u64, pub virtual_size: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Container { #[cfg(feature = "chrono")] #[serde(deserialize_with = "datetime_from_unix_timestamp")] pub created: DateTime, #[cfg(not(feature = "chrono"))] pub created: u64, pub command: String, pub id: String, pub image: String, #[serde(rename = "ImageID")] pub image_id: String, pub labels: HashMap, pub names: Vec, pub ports: Vec, pub state: String, pub status: String, pub size_rw: Option, pub size_root_fs: Option, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct ContainerDetails { pub app_armor_profile: String, pub args: Vec, pub config: Config, #[cfg(feature = "chrono")] pub created: DateTime, #[cfg(not(feature = "chrono"))] pub created: String, pub driver: String, // pub ExecIDs: ?? pub host_config: HostConfig, pub hostname_path: String, pub hosts_path: String, pub log_path: String, pub id: String, pub image: String, pub mount_label: String, pub name: String, pub network_settings: NetworkSettings, pub path: String, pub process_label: String, pub resolv_conf_path: String, pub restart_count: u64, pub state: State, pub mounts: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Mount { pub source: String, pub destination: String, pub mode: String, #[serde(rename = "RW")] pub rw: bool, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct State { pub error: String, pub exit_code: u64, #[cfg(feature = "chrono")] pub finished_at: DateTime, #[cfg(not(feature = "chrono"))] pub finished_at: String, #[serde(rename = "OOMKilled")] pub oom_killed: bool, pub paused: bool, pub pid: u64, pub restarting: bool, pub running: bool, #[cfg(feature = "chrono")] pub started_at: DateTime, #[cfg(not(feature = "chrono"))] pub started_at: String, pub status: String, } type PortDescription = HashMap>>>; #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct NetworkSettings { pub bridge: String, pub gateway: String, #[serde(rename = "IPAddress")] pub ip_address: String, #[serde(rename = "IPPrefixLen")] pub ip_prefix_len: u64, pub mac_address: String, pub ports: Option, pub networks: HashMap, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct NetworkEntry { #[serde(rename = "NetworkID")] pub network_id: String, #[serde(rename = "EndpointID")] pub endpoint_id: String, pub gateway: String, #[serde(rename = "IPAddress")] pub ip_address: String, #[serde(rename = "IPPrefixLen")] pub ip_prefix_len: u64, #[serde(rename = "IPv6Gateway")] pub ipv6_gateway: String, #[serde(rename = "GlobalIPv6Address")] pub global_ipv6_address: String, #[serde(rename = "GlobalIPv6PrefixLen")] pub global_ipv6_prefix_len: u64, pub mac_address: String, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct HostConfig { pub cgroup_parent: Option, #[serde(rename = "ContainerIDFile")] pub container_id_file: String, pub cpu_shares: Option, pub cpuset_cpus: Option, pub memory: Option, pub memory_swap: Option, pub network_mode: String, pub pid_mode: Option, pub port_bindings: Option>>>, pub privileged: bool, pub publish_all_ports: bool, pub readonly_rootfs: Option, /* pub RestartPolicy: ??? * pub SecurityOpt: Option, * pub Ulimits: Option * pub VolumesFrom: Option */ } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Config { pub attach_stderr: bool, pub attach_stdin: bool, pub attach_stdout: bool, pub cmd: Option>, pub domainname: String, pub entrypoint: Option>, pub env: Option>, pub exposed_ports: Option>>, pub hostname: String, pub image: String, pub labels: Option>, // pub MacAddress: String, pub on_build: Option>, // pub NetworkDisabled: bool, pub open_stdin: bool, pub stdin_once: bool, pub tty: bool, pub user: String, pub working_dir: String, } impl Config { pub fn env(&self) -> HashMap { let mut map = HashMap::new(); if let Some(ref vars) = self.env { for e in vars { let pair: Vec<&str> = e.split('=').collect(); map.insert(pair[0].to_owned(), pair[1].to_owned()); } } map } } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Port { pub ip: Option, pub private_port: u64, pub public_port: Option, #[serde(rename = "Type")] pub typ: String, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Stats { pub read: String, pub networks: HashMap, pub memory_stats: MemoryStats, pub blkio_stats: BlkioStats, pub cpu_stats: CpuStats, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Network { pub rx_dropped: u64, pub rx_bytes: u64, pub rx_errors: u64, pub tx_packets: u64, pub tx_dropped: u64, pub rx_packets: u64, pub tx_errors: u64, pub tx_bytes: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct IPAM { pub driver: String, pub config: Vec>, pub options: Option>, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct NetworkDetails { pub name: String, pub id: String, pub scope: String, pub driver: String, #[serde(rename = "EnableIPv6")] pub enable_ipv6: bool, #[serde(rename = "IPAM")] pub ipam: IPAM, pub internal: bool, pub attachable: bool, pub containers: HashMap, pub options: Option>, pub labels: Option>, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct NetworkContainerDetails { #[serde(rename = "EndpointID")] pub endpoint_id: String, pub mac_address: String, #[serde(rename = "IPv4Address")] pub ipv4_address: String, #[serde(rename = "IPv6Address")] pub ipv6_address: String, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct NetworkCreateInfo { pub id: String, pub warning: String, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct MemoryStats { pub max_usage: u64, pub usage: u64, pub failcnt: Option, pub limit: u64, pub stats: MemoryStat, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct MemoryStat { pub total_pgmajfault: u64, pub cache: u64, pub mapped_file: u64, pub total_inactive_file: u64, pub pgpgout: u64, pub rss: u64, pub total_mapped_file: u64, pub writeback: u64, pub unevictable: u64, pub pgpgin: u64, pub total_unevictable: u64, pub pgmajfault: u64, pub total_rss: u64, pub total_rss_huge: u64, pub total_writeback: u64, pub total_inactive_anon: u64, pub rss_huge: u64, pub hierarchical_memory_limit: u64, pub hierarchical_memsw_limit: u64, pub total_pgfault: u64, pub total_active_file: u64, pub active_anon: u64, pub total_active_anon: u64, pub total_pgpgout: u64, pub total_cache: u64, pub inactive_anon: u64, pub active_file: u64, pub pgfault: u64, pub inactive_file: u64, pub total_pgpgin: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct CpuStats { pub cpu_usage: CpuUsage, pub system_cpu_usage: u64, pub throttling_data: ThrottlingData, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct CpuUsage { pub percpu_usage: Vec, pub usage_in_usermode: u64, pub total_usage: u64, pub usage_in_kernelmode: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ThrottlingData { pub periods: u64, pub throttled_periods: u64, pub throttled_time: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct BlkioStats { pub io_service_bytes_recursive: Vec, pub io_serviced_recursive: Vec, pub io_queue_recursive: Vec, pub io_service_time_recursive: Vec, pub io_wait_time_recursive: Vec, pub io_merged_recursive: Vec, pub io_time_recursive: Vec, pub sectors_recursive: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct BlkioStat { pub major: u64, pub minor: u64, pub op: String, pub value: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Change { pub kind: u64, pub path: String, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Top { pub titles: Vec, pub processes: Vec>, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Version { pub version: String, pub api_version: String, pub git_commit: String, pub go_version: String, pub os: String, pub arch: String, pub kernel_version: String, #[cfg(feature = "chrono")] pub build_time: DateTime, #[cfg(not(feature = "chrono"))] pub build_time: String, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Info { pub containers: u64, pub images: u64, pub driver: String, pub docker_root_dir: String, pub driver_status: Vec>, #[serde(rename = "ID")] pub id: String, pub kernel_version: String, // pub Labels: Option, pub mem_total: u64, pub memory_limit: bool, #[serde(rename = "NCPU")] pub n_cpu: u64, pub n_events_listener: u64, pub n_goroutines: u64, pub name: String, pub operating_system: String, // pub RegistryConfig:??? pub swap_limit: bool, pub system_time: Option, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct ContainerCreateInfo { pub id: String, pub warnings: Option>, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct History { pub id: String, #[cfg(feature = "chrono")] #[serde(deserialize_with = "datetime_from_unix_timestamp")] pub created: DateTime, #[cfg(not(feature = "chrono"))] pub created: u64, pub created_by: String, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Exit { pub status_code: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Event { #[serde(rename = "Type")] pub typ: String, #[serde(rename = "Action")] pub action: String, #[serde(rename = "Actor")] pub actor: Actor, pub status: Option, pub id: Option, pub from: Option, #[cfg(feature = "chrono")] #[serde(deserialize_with = "datetime_from_unix_timestamp")] pub time: DateTime, #[cfg(not(feature = "chrono"))] pub time: u64, #[cfg(feature = "chrono")] #[serde(deserialize_with = "datetime_from_nano_timestamp", rename = "timeNano")] pub time_nano: DateTime, #[cfg(not(feature = "chrono"))] #[serde(rename = "timeNano")] pub time_nano: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Actor { #[serde(rename = "ID")] pub id: String, #[serde(rename = "Attributes")] pub attributes: HashMap, } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum Status { Untagged(String), Deleted(String), } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct VolumeCreateInfo { pub name: String, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Volumes { pub volumes: Option>, pub warnings: Option>, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct Volume { #[cfg(feature = "chrono")] pub created_at: DateTime, #[cfg(not(feature = "chrono"))] pub created_at: String, pub driver: String, pub labels: Option>, pub name: String, pub mountpoint: String, pub options: Option>, pub scope: String, } #[cfg(feature = "chrono")] fn datetime_from_unix_timestamp<'de, D>(deserializer: D) -> Result, D::Error> where D: serde::Deserializer<'de>, { let timestamp = chrono::NaiveDateTime::from_timestamp(i64::deserialize(deserializer)?, 0); Ok(DateTime::::from_utc(timestamp, Utc)) } #[cfg(feature = "chrono")] fn datetime_from_nano_timestamp<'de, D>(deserializer: D) -> Result, D::Error> where D: serde::Deserializer<'de>, { let timestamp_nano = u64::deserialize(deserializer)?; let timestamp = chrono::NaiveDateTime::from_timestamp( (timestamp_nano / 1_000_000_000) as i64, (timestamp_nano % 1_000_000_000) as u32, ); Ok(DateTime::::from_utc(timestamp, Utc)) }