...
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
use crate::process::CommandResult;
|
||||
use crate::virt::buildah::{execute_buildah_command, BuildahError, Image};
|
||||
use crate::virt::buildah::{execute_buildah_command, BuildahError, Image, thread_local_debug, set_thread_local_debug};
|
||||
use std::collections::HashMap;
|
||||
|
||||
/// Builder struct for buildah operations
|
||||
@@ -116,7 +116,19 @@ impl Builder {
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn run(&self, command: &str) -> Result<CommandResult, BuildahError> {
|
||||
if let Some(container_id) = &self.container_id {
|
||||
execute_buildah_command(&["run", container_id, "sh", "-c", command])
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag from the Builder's debug flag
|
||||
set_thread_local_debug(self.debug);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&["run", container_id, "sh", "-c", command]);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
} else {
|
||||
Err(BuildahError::Other("No container ID available".to_string()))
|
||||
}
|
||||
@@ -134,7 +146,19 @@ impl Builder {
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn run_with_isolation(&self, command: &str, isolation: &str) -> Result<CommandResult, BuildahError> {
|
||||
if let Some(container_id) = &self.container_id {
|
||||
execute_buildah_command(&["run", "--isolation", isolation, container_id, "sh", "-c", command])
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag from the Builder's debug flag
|
||||
set_thread_local_debug(self.debug);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&["run", "--isolation", isolation, container_id, "sh", "-c", command]);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
} else {
|
||||
Err(BuildahError::Other("No container ID available".to_string()))
|
||||
}
|
||||
@@ -152,7 +176,19 @@ impl Builder {
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn copy(&self, source: &str, dest: &str) -> Result<CommandResult, BuildahError> {
|
||||
if let Some(container_id) = &self.container_id {
|
||||
execute_buildah_command(&["copy", container_id, source, dest])
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag from the Builder's debug flag
|
||||
set_thread_local_debug(self.debug);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&["copy", container_id, source, dest]);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
} else {
|
||||
Err(BuildahError::Other("No container ID available".to_string()))
|
||||
}
|
||||
@@ -170,7 +206,19 @@ impl Builder {
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn add(&self, source: &str, dest: &str) -> Result<CommandResult, BuildahError> {
|
||||
if let Some(container_id) = &self.container_id {
|
||||
execute_buildah_command(&["add", container_id, source, dest])
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag from the Builder's debug flag
|
||||
set_thread_local_debug(self.debug);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&["add", container_id, source, dest]);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
} else {
|
||||
Err(BuildahError::Other("No container ID available".to_string()))
|
||||
}
|
||||
@@ -187,7 +235,19 @@ impl Builder {
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn commit(&self, image_name: &str) -> Result<CommandResult, BuildahError> {
|
||||
if let Some(container_id) = &self.container_id {
|
||||
execute_buildah_command(&["commit", container_id, image_name])
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag from the Builder's debug flag
|
||||
set_thread_local_debug(self.debug);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&["commit", container_id, image_name]);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
} else {
|
||||
Err(BuildahError::Other("No container ID available".to_string()))
|
||||
}
|
||||
@@ -200,7 +260,19 @@ impl Builder {
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn remove(&self) -> Result<CommandResult, BuildahError> {
|
||||
if let Some(container_id) = &self.container_id {
|
||||
execute_buildah_command(&["rm", container_id])
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag from the Builder's debug flag
|
||||
set_thread_local_debug(self.debug);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&["rm", container_id]);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
} else {
|
||||
Err(BuildahError::Other("No container ID available".to_string()))
|
||||
}
|
||||
@@ -213,9 +285,18 @@ impl Builder {
|
||||
/// * `Result<(), BuildahError>` - Success or error
|
||||
pub fn reset(&mut self) -> Result<(), BuildahError> {
|
||||
if let Some(container_id) = &self.container_id {
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag from the Builder's debug flag
|
||||
set_thread_local_debug(self.debug);
|
||||
|
||||
// Try to remove the container
|
||||
let result = execute_buildah_command(&["rm", container_id]);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
// Clear the container_id regardless of whether the removal succeeded
|
||||
self.container_id = None;
|
||||
|
||||
@@ -256,7 +337,19 @@ impl Builder {
|
||||
// Convert Vec<String> to Vec<&str> for execute_buildah_command
|
||||
let args: Vec<&str> = args_owned.iter().map(|s| s.as_str()).collect();
|
||||
|
||||
execute_buildah_command(&args)
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag from the Builder's debug flag
|
||||
set_thread_local_debug(self.debug);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&args);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
} else {
|
||||
Err(BuildahError::Other("No container ID available".to_string()))
|
||||
}
|
||||
@@ -268,6 +361,7 @@ impl Builder {
|
||||
///
|
||||
/// * `Result<Vec<Image>, BuildahError>` - List of images or error
|
||||
pub fn images() -> Result<Vec<Image>, BuildahError> {
|
||||
// Use default debug value (false) for static method
|
||||
let result = execute_buildah_command(&["images", "--json"])?;
|
||||
|
||||
// Try to parse the JSON output
|
||||
@@ -339,9 +433,36 @@ impl Builder {
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_remove(image: &str) -> Result<CommandResult, BuildahError> {
|
||||
// Use default debug value (false) for static method
|
||||
execute_buildah_command(&["rmi", image])
|
||||
}
|
||||
|
||||
/// Remove an image with debug output
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `image` - Image ID or name
|
||||
/// * `debug` - Whether to enable debug output
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_remove_with_debug(image: &str, debug: bool) -> Result<CommandResult, BuildahError> {
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag
|
||||
set_thread_local_debug(debug);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&["rmi", image]);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
/// Pull an image from a registry
|
||||
///
|
||||
/// # Arguments
|
||||
@@ -353,6 +474,7 @@ impl Builder {
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_pull(image: &str, tls_verify: bool) -> Result<CommandResult, BuildahError> {
|
||||
// Use default debug value (false) for static method
|
||||
let mut args = vec!["pull"];
|
||||
|
||||
if !tls_verify {
|
||||
@@ -364,6 +486,41 @@ impl Builder {
|
||||
execute_buildah_command(&args)
|
||||
}
|
||||
|
||||
/// Pull an image from a registry with debug output
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `image` - Image name
|
||||
/// * `tls_verify` - Whether to verify TLS
|
||||
/// * `debug` - Whether to enable debug output
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_pull_with_debug(image: &str, tls_verify: bool, debug: bool) -> Result<CommandResult, BuildahError> {
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag
|
||||
set_thread_local_debug(debug);
|
||||
|
||||
let mut args = vec!["pull"];
|
||||
|
||||
if !tls_verify {
|
||||
args.push("--tls-verify=false");
|
||||
}
|
||||
|
||||
args.push(image);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&args);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
/// Push an image to a registry
|
||||
///
|
||||
/// # Arguments
|
||||
@@ -376,6 +533,7 @@ impl Builder {
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_push(image: &str, destination: &str, tls_verify: bool) -> Result<CommandResult, BuildahError> {
|
||||
// Use default debug value (false) for static method
|
||||
let mut args = vec!["push"];
|
||||
|
||||
if !tls_verify {
|
||||
@@ -388,6 +546,43 @@ impl Builder {
|
||||
execute_buildah_command(&args)
|
||||
}
|
||||
|
||||
/// Push an image to a registry with debug output
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `image` - Image name
|
||||
/// * `destination` - Destination registry
|
||||
/// * `tls_verify` - Whether to verify TLS
|
||||
/// * `debug` - Whether to enable debug output
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_push_with_debug(image: &str, destination: &str, tls_verify: bool, debug: bool) -> Result<CommandResult, BuildahError> {
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag
|
||||
set_thread_local_debug(debug);
|
||||
|
||||
let mut args = vec!["push"];
|
||||
|
||||
if !tls_verify {
|
||||
args.push("--tls-verify=false");
|
||||
}
|
||||
|
||||
args.push(image);
|
||||
args.push(destination);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&args);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
/// Tag an image
|
||||
///
|
||||
/// # Arguments
|
||||
@@ -399,9 +594,37 @@ impl Builder {
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_tag(image: &str, new_name: &str) -> Result<CommandResult, BuildahError> {
|
||||
// Use default debug value (false) for static method
|
||||
execute_buildah_command(&["tag", image, new_name])
|
||||
}
|
||||
|
||||
/// Tag an image with debug output
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `image` - Image ID or name
|
||||
/// * `new_name` - New tag for the image
|
||||
/// * `debug` - Whether to enable debug output
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_tag_with_debug(image: &str, new_name: &str, debug: bool) -> Result<CommandResult, BuildahError> {
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag
|
||||
set_thread_local_debug(debug);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&["tag", image, new_name]);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
/// Commit a container to an image with advanced options
|
||||
///
|
||||
/// # Arguments
|
||||
@@ -416,6 +639,7 @@ impl Builder {
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_commit(container: &str, image_name: &str, format: Option<&str>, squash: bool, rm: bool) -> Result<CommandResult, BuildahError> {
|
||||
// Use default debug value (false) for static method
|
||||
let mut args = vec!["commit"];
|
||||
|
||||
if let Some(format_str) = format {
|
||||
@@ -437,6 +661,54 @@ impl Builder {
|
||||
execute_buildah_command(&args)
|
||||
}
|
||||
|
||||
/// Commit a container to an image with advanced options and debug output
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `container` - Container ID or name
|
||||
/// * `image_name` - Name for the new image
|
||||
/// * `format` - Optional format (oci or docker)
|
||||
/// * `squash` - Whether to squash layers
|
||||
/// * `rm` - Whether to remove the container after commit
|
||||
/// * `debug` - Whether to enable debug output
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn image_commit_with_debug(container: &str, image_name: &str, format: Option<&str>, squash: bool, rm: bool, debug: bool) -> Result<CommandResult, BuildahError> {
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag
|
||||
set_thread_local_debug(debug);
|
||||
|
||||
let mut args = vec!["commit"];
|
||||
|
||||
if let Some(format_str) = format {
|
||||
args.push("--format");
|
||||
args.push(format_str);
|
||||
}
|
||||
|
||||
if squash {
|
||||
args.push("--squash");
|
||||
}
|
||||
|
||||
if rm {
|
||||
args.push("--rm");
|
||||
}
|
||||
|
||||
args.push(container);
|
||||
args.push(image_name);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&args);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
/// Build an image from a Containerfile/Dockerfile
|
||||
///
|
||||
/// # Arguments
|
||||
@@ -450,6 +722,7 @@ impl Builder {
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn build(tag: Option<&str>, context_dir: &str, file: &str, isolation: Option<&str>) -> Result<CommandResult, BuildahError> {
|
||||
// Use default debug value (false) for static method
|
||||
let mut args = Vec::new();
|
||||
args.push("build");
|
||||
|
||||
@@ -470,4 +743,51 @@ impl Builder {
|
||||
|
||||
execute_buildah_command(&args)
|
||||
}
|
||||
|
||||
/// Build an image from a Containerfile/Dockerfile with debug output
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `tag` - Optional tag for the image
|
||||
/// * `context_dir` - Directory containing the Containerfile/Dockerfile
|
||||
/// * `file` - Path to the Containerfile/Dockerfile
|
||||
/// * `isolation` - Optional isolation method
|
||||
/// * `debug` - Whether to enable debug output
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn build_with_debug(tag: Option<&str>, context_dir: &str, file: &str, isolation: Option<&str>, debug: bool) -> Result<CommandResult, BuildahError> {
|
||||
// Save the current debug flag
|
||||
let previous_debug = thread_local_debug();
|
||||
|
||||
// Set the thread-local debug flag
|
||||
set_thread_local_debug(debug);
|
||||
|
||||
let mut args = Vec::new();
|
||||
args.push("build");
|
||||
|
||||
if let Some(tag_value) = tag {
|
||||
args.push("-t");
|
||||
args.push(tag_value);
|
||||
}
|
||||
|
||||
if let Some(isolation_value) = isolation {
|
||||
args.push("--isolation");
|
||||
args.push(isolation_value);
|
||||
}
|
||||
|
||||
args.push("-f");
|
||||
args.push(file);
|
||||
|
||||
args.push(context_dir);
|
||||
|
||||
// Execute the command
|
||||
let result = execute_buildah_command(&args);
|
||||
|
||||
// Restore the previous debug flag
|
||||
set_thread_local_debug(previous_debug);
|
||||
|
||||
result
|
||||
}
|
||||
}
|
@@ -14,7 +14,7 @@ use super::{BuildahError, Builder};
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn execute_buildah_command(args: &[&str]) -> Result<CommandResult, BuildahError> {
|
||||
// Get the current thread-local Builder instance if available
|
||||
// Get the debug flag from thread-local storage
|
||||
let debug = thread_local_debug();
|
||||
|
||||
if debug {
|
||||
@@ -37,6 +37,7 @@ pub fn execute_buildah_command(args: &[&str]) -> Result<CommandResult, BuildahEr
|
||||
code: output.status.code().unwrap_or(-1),
|
||||
};
|
||||
|
||||
// Always output stdout/stderr when debug is true
|
||||
if debug {
|
||||
if !result.stdout.is_empty() {
|
||||
println!("Command stdout: {}", result.stdout);
|
||||
@@ -45,26 +46,28 @@ pub fn execute_buildah_command(args: &[&str]) -> Result<CommandResult, BuildahEr
|
||||
if !result.stderr.is_empty() {
|
||||
println!("Command stderr: {}", result.stderr);
|
||||
}
|
||||
|
||||
if result.success {
|
||||
println!("Command succeeded with code {}", result.code);
|
||||
} else {
|
||||
println!("Command failed with code {}", result.code);
|
||||
}
|
||||
}
|
||||
|
||||
if result.success {
|
||||
if debug {
|
||||
println!("Command succeeded with code {}", result.code);
|
||||
}
|
||||
Ok(result)
|
||||
} else {
|
||||
let error_msg = format!("Command failed with code {}: {}",
|
||||
result.code, result.stderr.trim());
|
||||
if debug {
|
||||
println!("Command failed: {}", error_msg);
|
||||
// If command failed and debug is false, output stderr
|
||||
if !debug {
|
||||
println!("Command failed with code {}: {}", result.code, result.stderr.trim());
|
||||
}
|
||||
Err(BuildahError::CommandFailed(error_msg))
|
||||
Err(BuildahError::CommandFailed(format!("Command failed with code {}: {}",
|
||||
result.code, result.stderr.trim())))
|
||||
}
|
||||
},
|
||||
Err(e) => {
|
||||
if debug {
|
||||
println!("Command execution failed: {}", e);
|
||||
}
|
||||
// Always output error information
|
||||
println!("Command execution failed: {}", e);
|
||||
Err(BuildahError::CommandExecutionFailed(e))
|
||||
}
|
||||
}
|
||||
@@ -89,41 +92,4 @@ pub fn thread_local_debug() -> bool {
|
||||
})
|
||||
}
|
||||
|
||||
/// Execute a buildah command with debug output
|
||||
///
|
||||
/// # Arguments
|
||||
///
|
||||
/// * `args` - The command arguments
|
||||
/// * `builder` - Reference to a Builder instance for debug output
|
||||
///
|
||||
/// # Returns
|
||||
///
|
||||
/// * `Result<CommandResult, BuildahError>` - Command result or error
|
||||
pub fn execute_buildah_command_with_debug(args: &[&str], builder: &Builder) -> Result<CommandResult, BuildahError> {
|
||||
if builder.debug() {
|
||||
println!("Executing buildah command: buildah {}", args.join(" "));
|
||||
}
|
||||
|
||||
let result = execute_buildah_command(args);
|
||||
|
||||
if builder.debug() {
|
||||
match &result {
|
||||
Ok(cmd_result) => {
|
||||
if !cmd_result.stdout.is_empty() {
|
||||
println!("Command stdout: {}", cmd_result.stdout);
|
||||
}
|
||||
|
||||
if !cmd_result.stderr.is_empty() {
|
||||
println!("Command stderr: {}", cmd_result.stderr);
|
||||
}
|
||||
|
||||
println!("Command succeeded with code {}", cmd_result.code);
|
||||
},
|
||||
Err(e) => {
|
||||
println!("Command failed: {}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
// This function is no longer needed as the debug functionality is now integrated into execute_buildah_command
|
||||
|
Reference in New Issue
Block a user