Skip to main content

arcbox_migration/
docker_types.rs

1//! Docker CLI JSON DTOs used by migration planning.
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// Docker daemon info needed by migration.
7#[derive(Debug, Clone, Deserialize)]
8pub struct DockerInfo {
9    /// Daemon name.
10    #[serde(rename = "Name")]
11    pub name: String,
12    /// Server version.
13    #[serde(rename = "ServerVersion")]
14    pub server_version: String,
15    /// Operating system.
16    #[serde(rename = "OperatingSystem")]
17    pub operating_system: String,
18    /// Architecture.
19    #[serde(rename = "Architecture")]
20    pub architecture: String,
21}
22
23/// Image inspect response subset.
24#[derive(Debug, Clone, Deserialize)]
25pub struct ImageInspect {
26    /// Image identifier.
27    #[serde(rename = "Id")]
28    pub id: String,
29    /// Repo tags.
30    #[serde(rename = "RepoTags", default)]
31    pub repo_tags: Vec<String>,
32    /// Repo digests.
33    #[serde(rename = "RepoDigests", default)]
34    pub repo_digests: Vec<String>,
35}
36
37/// Volume inspect response subset.
38#[derive(Debug, Clone, Deserialize)]
39pub struct VolumeInspect {
40    /// Volume name.
41    #[serde(rename = "Name")]
42    pub name: String,
43    /// Driver name.
44    #[serde(rename = "Driver")]
45    pub driver: String,
46    /// Labels.
47    #[serde(rename = "Labels", default)]
48    pub labels: Option<HashMap<String, String>>,
49    /// Driver options.
50    #[serde(rename = "Options", default)]
51    pub options: Option<HashMap<String, String>>,
52}
53
54/// Network inspect response subset.
55#[derive(Debug, Clone, Deserialize)]
56pub struct NetworkInspect {
57    /// Network name.
58    #[serde(rename = "Name")]
59    pub name: String,
60    /// Network identifier.
61    #[serde(rename = "Id")]
62    pub id: String,
63    /// Driver.
64    #[serde(rename = "Driver")]
65    pub driver: String,
66    /// Whether the network is internal.
67    #[serde(rename = "Internal", default)]
68    pub internal: bool,
69    /// Whether IPv6 is enabled.
70    #[serde(rename = "EnableIPv6", default)]
71    pub enable_ipv6: bool,
72    /// Whether the network is attachable.
73    #[serde(rename = "Attachable", default)]
74    pub attachable: bool,
75    /// Labels.
76    #[serde(rename = "Labels", default)]
77    pub labels: Option<HashMap<String, String>>,
78    /// Driver options.
79    #[serde(rename = "Options", default)]
80    pub options: Option<HashMap<String, String>>,
81    /// IPAM settings.
82    #[serde(rename = "IPAM", default)]
83    pub ipam: NetworkIpam,
84}
85
86/// Network IPAM settings.
87#[derive(Debug, Clone, Default, Deserialize)]
88pub struct NetworkIpam {
89    /// IPAM driver.
90    #[serde(rename = "Driver", default)]
91    pub driver: String,
92    /// IPAM config entries.
93    #[serde(rename = "Config", default)]
94    pub config: Vec<NetworkIpamConfig>,
95}
96
97/// Network IPAM config entry.
98#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq)]
99pub struct NetworkIpamConfig {
100    /// Subnet CIDR.
101    #[serde(rename = "Subnet", default)]
102    pub subnet: String,
103    /// Gateway address.
104    #[serde(rename = "Gateway", default)]
105    pub gateway: String,
106    /// IP range.
107    #[serde(rename = "IPRange", default)]
108    pub ip_range: String,
109}
110
111/// Container inspect response subset.
112#[derive(Debug, Clone, Deserialize)]
113pub struct ContainerInspect {
114    /// Container identifier.
115    #[serde(rename = "Id")]
116    pub id: String,
117    /// Container name (leading slash included).
118    #[serde(rename = "Name")]
119    pub name: String,
120    /// Image ID.
121    #[serde(rename = "Image")]
122    pub image: String,
123    /// Creation timestamp, RFC 3339 in UTC.
124    ///
125    /// Docker formats this with Go's RFC3339Nano, which strips trailing zeros
126    /// from the fractional seconds, so the field is **variable width** and must
127    /// be parsed before comparing — byte order can invert real order.
128    #[serde(rename = "Created", default)]
129    pub created: String,
130    /// Container state.
131    #[serde(rename = "State")]
132    pub state: ContainerState,
133    /// Container config.
134    #[serde(rename = "Config")]
135    pub config: ContainerConfig,
136    /// Host config.
137    #[serde(rename = "HostConfig")]
138    pub host_config: HostConfig,
139    /// Network settings.
140    #[serde(rename = "NetworkSettings")]
141    pub network_settings: NetworkSettings,
142    /// Mounts.
143    #[serde(rename = "Mounts", default)]
144    pub mounts: Vec<MountPoint>,
145}
146
147/// Container state subset.
148#[derive(Debug, Clone, Deserialize)]
149pub struct ContainerState {
150    /// Status string.
151    #[serde(rename = "Status")]
152    pub status: String,
153    /// Whether the container is running.
154    #[serde(rename = "Running", default)]
155    pub running: bool,
156}
157
158/// Container config subset.
159#[derive(Debug, Clone, Default, Deserialize)]
160pub struct ContainerConfig {
161    /// Hostname.
162    #[serde(rename = "Hostname", default)]
163    pub hostname: String,
164    /// Domain name.
165    #[serde(rename = "Domainname", default)]
166    pub domainname: String,
167    /// User.
168    #[serde(rename = "User", default)]
169    pub user: String,
170    /// Environment variables.
171    #[serde(rename = "Env", default)]
172    pub env: Option<Vec<String>>,
173    /// Command.
174    #[serde(rename = "Cmd", default)]
175    pub cmd: Option<Vec<String>>,
176    /// Image reference string.
177    #[serde(rename = "Image", default)]
178    pub image: String,
179    /// Working directory.
180    #[serde(rename = "WorkingDir", default)]
181    pub working_dir: String,
182    /// Entrypoint.
183    #[serde(rename = "Entrypoint", default)]
184    pub entrypoint: Option<Vec<String>>,
185    /// Labels.
186    #[serde(rename = "Labels", default)]
187    pub labels: Option<HashMap<String, String>>,
188    /// TTY mode.
189    #[serde(rename = "Tty", default)]
190    pub tty: bool,
191    /// Open stdin.
192    #[serde(rename = "OpenStdin", default)]
193    pub open_stdin: bool,
194    /// Exposed ports.
195    #[serde(rename = "ExposedPorts", default)]
196    pub exposed_ports: Option<HashMap<String, serde_json::Value>>,
197}
198
199/// Host config subset.
200#[derive(Debug, Clone, Default, Deserialize)]
201pub struct HostConfig {
202    /// Network mode: `bridge`, `host`, `none`, `container:<name|id>`, or the
203    /// name of a user-defined network.
204    #[serde(rename = "NetworkMode", default)]
205    pub network_mode: String,
206    /// Port bindings.
207    #[serde(rename = "PortBindings", default)]
208    pub port_bindings: Option<HashMap<String, Option<Vec<PortBinding>>>>,
209    /// Restart policy.
210    #[serde(rename = "RestartPolicy", default)]
211    pub restart_policy: Option<RestartPolicy>,
212    /// Privileged mode.
213    #[serde(rename = "Privileged", default)]
214    pub privileged: bool,
215    /// Read-only root filesystem.
216    #[serde(rename = "ReadonlyRootfs", default)]
217    pub readonly_rootfs: bool,
218    /// Extra hosts.
219    #[serde(rename = "ExtraHosts", default)]
220    pub extra_hosts: Option<Vec<String>>,
221    /// Auto remove.
222    #[serde(rename = "AutoRemove", default)]
223    pub auto_remove: bool,
224    /// Memory limit in bytes.
225    #[serde(rename = "Memory", default)]
226    pub memory: i64,
227    /// CPU quota in units of 10^-9 CPUs. Note the casing: `NanoCPUs` is a
228    /// separate Swarm-only field and is not what container inspect returns.
229    #[serde(rename = "NanoCpus", default)]
230    pub nano_cpus: i64,
231    /// Added Linux capabilities.
232    #[serde(rename = "CapAdd", default)]
233    pub cap_add: Option<Vec<String>>,
234}
235
236/// Restart policy subset.
237#[derive(Debug, Clone, Default, Deserialize)]
238pub struct RestartPolicy {
239    /// Policy name.
240    #[serde(rename = "Name", default)]
241    pub name: String,
242    /// Maximum retry count.
243    #[serde(rename = "MaximumRetryCount", default)]
244    pub maximum_retry_count: i64,
245}
246
247/// Network settings subset.
248#[derive(Debug, Clone, Default, Deserialize)]
249pub struct NetworkSettings {
250    /// Networks keyed by name.
251    #[serde(rename = "Networks", default)]
252    pub networks: HashMap<String, EndpointSettings>,
253}
254
255/// Endpoint settings subset.
256#[derive(Debug, Clone, Default, Deserialize)]
257pub struct EndpointSettings {
258    /// Aliases.
259    #[serde(rename = "Aliases", default)]
260    pub aliases: Option<Vec<String>>,
261}
262
263/// Mount description subset.
264#[derive(Debug, Clone, Deserialize)]
265pub struct MountPoint {
266    /// Mount type.
267    #[serde(rename = "Type")]
268    pub mount_type: String,
269    /// Volume name when applicable.
270    #[serde(rename = "Name", default)]
271    pub name: String,
272    /// Source path or volume mountpoint.
273    #[serde(rename = "Source", default)]
274    pub source: String,
275    /// Destination path inside the container.
276    #[serde(rename = "Destination")]
277    pub destination: String,
278    /// Mount mode.
279    #[serde(rename = "Mode", default)]
280    pub mode: String,
281    /// Whether the mount is writable.
282    #[serde(rename = "RW", default)]
283    pub rw: bool,
284}
285
286/// Port binding subset.
287#[derive(Debug, Clone, Deserialize)]
288pub struct PortBinding {
289    /// Host IP.
290    #[serde(rename = "HostIp", default)]
291    pub host_ip: String,
292    /// Host port.
293    #[serde(rename = "HostPort", default)]
294    pub host_port: String,
295}