use super::types::DockerManager;
use anyhow::Result;
use std::path::Path;
use tracing::{debug, info, warn};
impl DockerManager {
pub async fn load_image<P: AsRef<Path>>(&self, image_path: P) -> Result<String> {
let image_path = image_path.as_ref();
if !image_path.exists() {
return Err(anyhow::anyhow!("Image file does not exist: {}", image_path.display()));
}
info!(
"Running docker load command: docker load -i {}",
image_path.display()
);
let output = self
.run_docker_command(&["load", "-i", &image_path.to_string_lossy()])
.await?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
warn!("docker load command failed:");
warn!(" Exit status: {}", output.status);
warn!(" stdout: {}", stdout);
warn!(" stderr: {}", stderr);
return Err(anyhow::anyhow!("Failed to load image: {stderr}"));
}
let stdout = String::from_utf8_lossy(&output.stdout);
debug!("docker load command completed successfully");
debug!("Full stdout output:");
for (i, line) in stdout.lines().enumerate() {
debug!(" Line {}: {}", i + 1, line);
}
for line in stdout.lines() {
if line.starts_with("Loaded image:") {
if let Some(image_name) = line.strip_prefix("Loaded image:").map(|s| s.trim()) {
info!("Parsed loaded image name successfully: {}", image_name);
return Ok(image_name.to_string());
}
}
}
warn!("docker load succeeded but image name could not be parsed");
warn!("Full output: {}", stdout);
Err(anyhow::anyhow!("Unable to parse docker load output: {stdout}"))
}
pub async fn pull_images(&self) -> Result<()> {
let output = self.run_compose_command(&["pull"]).await?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
return Err(anyhow::anyhow!("Failed to pull images: {stderr}"));
}
Ok(())
}
}