diff --git a/rustainers/src/runner/inner.rs b/rustainers/src/runner/inner.rs index f1b572f..1d3e96e 100644 --- a/rustainers/src/runner/inner.rs +++ b/rustainers/src/runner/inner.rs @@ -41,14 +41,6 @@ pub(crate) trait InnerRunner: Display + Debug + Send + Sync { Ok(result) } - #[tracing::instrument(level = "debug", skip(self), fields(runner = %self))] - async fn list_networks(&self) -> Result, ContainerError> { - let mut cmd = self.command(); - cmd.push_args(["network", "ls", "--no-trunc", "--format={{json .}}"]); - let result = cmd.json_stream::().await?; - Ok(result) - } - #[tracing::instrument(level = "debug", skip(self), fields(runner = %self))] async fn create_network(&self, name: &str) -> Result<(), ContainerError> { let mut cmd = self.command(); @@ -57,6 +49,14 @@ pub(crate) trait InnerRunner: Display + Debug + Send + Sync { Ok(()) } + #[tracing::instrument(level = "debug", skip(self), fields(runner = %self))] + async fn list_networks(&self) -> Result, ContainerError> { + let mut cmd = self.command(); + cmd.push_args(["network", "ls", "--no-trunc", "--format={{json .}}"]); + let result = cmd.json_stream::().await?; + Ok(result) + } + #[tracing::instrument(level = "debug", skip(self), fields(runner = %self))] async fn create_volume(&self, name: &str) -> Result<(), ContainerError> { let mut cmd = self.command(); diff --git a/rustainers/src/runner/runner_network.rs b/rustainers/src/runner/runner_network.rs index 3956c2e..f0c53f9 100644 --- a/rustainers/src/runner/runner_network.rs +++ b/rustainers/src/runner/runner_network.rs @@ -23,22 +23,16 @@ pub enum Driver { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] pub struct RunnerNetwork { + #[serde(alias = "name")] /// The network name pub name: String, + #[serde(alias = "scope")] /// The network scope - pub scope: String, + pub scope: Option, + #[serde(alias = "driver")] /// The network driver pub driver: Driver, } -impl RunnerNetwork { - #[allow(dead_code)] - #[must_use] - /// Check network is from the host - /// - pub fn is_host_bridge_network(&self) -> bool { - self.scope == "local" && self.driver == Driver::Bridge && self.name != "bridge" - } -} #[cfg(test)] mod tests { @@ -56,14 +50,11 @@ mod tests { } #[test] - fn should_filter_network() { - let json_stream = include_str!("../../tests/assets/docker_networks.jsonl"); + fn should_serde_podman_network() { + let json_stream = include_str!("../../tests/assets/podman_networks.jsonl"); let stream = serde_json::Deserializer::from_str(json_stream).into_iter::(); - let networks = stream.collect::, _>>().unwrap(); - let host_network = networks - .into_iter() - .filter(RunnerNetwork::is_host_bridge_network) - .collect::>(); - assert_eq!(host_network.len(), 1); + let networks = stream.collect::, _>>(); + let_assert!(Ok(data) = networks); + insta::assert_debug_snapshot!(data); } } diff --git a/rustainers/src/runner/snapshots/rustainers__runner__runner_network__tests__should_serde_network.snap b/rustainers/src/runner/snapshots/rustainers__runner__runner_network__tests__should_serde_network.snap index 456ecc1..c1a1c33 100644 --- a/rustainers/src/runner/snapshots/rustainers__runner__runner_network__tests__should_serde_network.snap +++ b/rustainers/src/runner/snapshots/rustainers__runner__runner_network__tests__should_serde_network.snap @@ -1,27 +1,35 @@ --- source: rustainers/src/runner/runner_network.rs -assertion_line: 54 +assertion_line: 49 expression: data --- [ RunnerNetwork { name: "bridge", - scope: "local", + scope: Some( + "local", + ), driver: Bridge, }, RunnerNetwork { name: "dummy_network", - scope: "local", + scope: Some( + "local", + ), driver: Bridge, }, RunnerNetwork { name: "host", - scope: "local", + scope: Some( + "local", + ), driver: Host, }, RunnerNetwork { name: "none", - scope: "local", + scope: Some( + "local", + ), driver: Null, }, ] diff --git a/rustainers/src/runner/snapshots/rustainers__runner__runner_network__tests__should_serde_podman_network.snap b/rustainers/src/runner/snapshots/rustainers__runner__runner_network__tests__should_serde_podman_network.snap new file mode 100644 index 0000000..cf552a7 --- /dev/null +++ b/rustainers/src/runner/snapshots/rustainers__runner__runner_network__tests__should_serde_podman_network.snap @@ -0,0 +1,52 @@ +--- +source: rustainers/src/runner/runner_network.rs +assertion_line: 59 +expression: data +--- +[ + RunnerNetwork { + name: "my_network_01HTY22KXBHP2MVFPFSSK9CQCG", + scope: None, + driver: Bridge, + }, + RunnerNetwork { + name: "my_network_01HTY4NQF1GH56JNA8MXNN0ZMF", + scope: None, + driver: Bridge, + }, + RunnerNetwork { + name: "my_network_01HTY4NQSHF5Y6Q572X1G748ZJ", + scope: None, + driver: Bridge, + }, + RunnerNetwork { + name: "my_network_01HTY4T0FHGZF5ZYYXG9SJM69R", + scope: None, + driver: Bridge, + }, + RunnerNetwork { + name: "my_network_01HTY4T1SWV848BEX4VXAR9FVE", + scope: None, + driver: Bridge, + }, + RunnerNetwork { + name: "podman", + scope: None, + driver: Bridge, + }, + RunnerNetwork { + name: "tc_redpanda-single_01hty22k12cw846sk95pafkxpz_redpanda_network", + scope: None, + driver: Bridge, + }, + RunnerNetwork { + name: "tc_redpanda-single_01hty4npgg9c0x5d536qjc88tx_redpanda_network", + scope: None, + driver: Bridge, + }, + RunnerNetwork { + name: "tc_redpanda-single_01hty4sweerk2zmv3exqj4xzte_redpanda_network", + scope: None, + driver: Bridge, + }, +] diff --git a/rustainers/tests/assets/podman_networks.jsonl b/rustainers/tests/assets/podman_networks.jsonl new file mode 100644 index 0000000..361e75e --- /dev/null +++ b/rustainers/tests/assets/podman_networks.jsonl @@ -0,0 +1,9 @@ +{"name":"my_network_01HTY22KXBHP2MVFPFSSK9CQCG","id":"11a444f0e98861bf82d6c58cef9583ad39a468a778bacf1d401004b99999d47c","driver":"bridge","network_interface":"podman1","created":"2024-04-08T07:14:43.658508378+02:00","subnets":[{"subnet":"10.89.0.0/24","gateway":"10.89.0.1"}],"ipv6_enabled":false,"internal":false,"dns_enabled":true,"ipam_options":{"driver":"host-local"}} +{"name":"my_network_01HTY4NQF1GH56JNA8MXNN0ZMF","id":"f06861da391bf5987da4195270f9b7a0742c9948c107e90fdc4a7c075bec4d52","driver":"bridge","network_interface":"podman3","created":"2024-04-08T08:00:07.007654609+02:00","subnets":[{"subnet":"10.89.2.0/24","gateway":"10.89.2.1"}],"ipv6_enabled":false,"internal":false,"dns_enabled":true,"ipam_options":{"driver":"host-local"}} +{"name":"my_network_01HTY4NQSHF5Y6Q572X1G748ZJ","id":"fb8774638c5797653104cb117807d1605fd0e565f783717d263df9053fcfd7a0","driver":"bridge","network_interface":"podman5","created":"2024-04-08T08:00:07.372278026+02:00","subnets":[{"subnet":"10.89.4.0/24","gateway":"10.89.4.1"}],"ipv6_enabled":false,"internal":false,"dns_enabled":true,"ipam_options":{"driver":"host-local"}} +{"name":"my_network_01HTY4T0FHGZF5ZYYXG9SJM69R","id":"dcb0b272c10ada5fc4a37717799ea79c877b1325cfcec7874312390fee5d8b89","driver":"bridge","network_interface":"podman7","created":"2024-04-08T08:02:27.672925944+02:00","subnets":[{"subnet":"10.89.6.0/24","gateway":"10.89.6.1"}],"ipv6_enabled":false,"internal":false,"dns_enabled":true,"ipam_options":{"driver":"host-local"}} +{"name":"my_network_01HTY4T1SWV848BEX4VXAR9FVE","id":"f5708bf41b9deca0861c7d2f89dbbee3d0578712f834cdc74c970991c164dfea","driver":"bridge","network_interface":"podman8","created":"2024-04-08T08:02:28.698748018+02:00","subnets":[{"subnet":"10.89.7.0/24","gateway":"10.89.7.1"}],"ipv6_enabled":false,"internal":false,"dns_enabled":true,"ipam_options":{"driver":"host-local"}} +{"name":"podman","id":"2f259bab93aaaaa2542ba43ef33eb990d0999ee1b9924b557b7be53c0b7a1bb9","driver":"bridge","network_interface":"podman0","created":"2024-04-08T08:02:55.570741081+02:00","subnets":[{"subnet":"10.88.0.0/16","gateway":"10.88.0.1"}],"ipv6_enabled":false,"internal":false,"dns_enabled":false,"ipam_options":{"driver":"host-local"}} +{"name":"tc_redpanda-single_01hty22k12cw846sk95pafkxpz_redpanda_network","id":"3852824d1fe0b54cb562c8a61d9e1f8c322e15581c5cf896b65a3bcaed38003e","driver":"bridge","network_interface":"podman2","created":"2024-04-08T07:14:43.896262214+02:00","subnets":[{"subnet":"10.89.1.0/24","gateway":"10.89.1.1"}],"ipv6_enabled":false,"internal":false,"dns_enabled":true,"labels":{"com.docker.compose.project":"tc_redpanda-single_01hty22k12cw846sk95pafkxpz","io.podman.compose.project":"tc_redpanda-single_01hty22k12cw846sk95pafkxpz"},"ipam_options":{"driver":"host-local"}} +{"name":"tc_redpanda-single_01hty4npgg9c0x5d536qjc88tx_redpanda_network","id":"1ac44fabbc45480f6589260026ca13d3b1c6a11d49d428fa87f966e3cd905062","driver":"bridge","network_interface":"podman4","created":"2024-04-08T08:00:07.335695949+02:00","subnets":[{"subnet":"10.89.3.0/24","gateway":"10.89.3.1"}],"ipv6_enabled":false,"internal":false,"dns_enabled":true,"labels":{"com.docker.compose.project":"tc_redpanda-single_01hty4npgg9c0x5d536qjc88tx","io.podman.compose.project":"tc_redpanda-single_01hty4npgg9c0x5d536qjc88tx"},"ipam_options":{"driver":"host-local"}} +{"name":"tc_redpanda-single_01hty4sweerk2zmv3exqj4xzte_redpanda_network","id":"afca1d8e59e32a874f2e6f16946e84f36ff233b6ad28f499782c4bf0041d5e33","driver":"bridge","network_interface":"podman6","created":"2024-04-08T08:02:23.869210731+02:00","subnets":[{"subnet":"10.89.5.0/24","gateway":"10.89.5.1"}],"ipv6_enabled":false,"internal":false,"dns_enabled":true,"labels":{"com.docker.compose.project":"tc_redpanda-single_01hty4sweerk2zmv3exqj4xzte","io.podman.compose.project":"tc_redpanda-single_01hty4sweerk2zmv3exqj4xzte"},"ipam_options":{"driver":"host-local"}} \ No newline at end of file