From cc1601a5a0f65cb3245b9330fa25b38e967e8f17 Mon Sep 17 00:00:00 2001 From: Zhiying Lin Date: Tue, 2 Dec 2025 14:32:12 +0800 Subject: [PATCH 1/5] chore: fix the collect-logs.sh Signed-off-by: Zhiying Lin --- test/e2e/collect-logs.sh | 133 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 124 insertions(+), 9 deletions(-) diff --git a/test/e2e/collect-logs.sh b/test/e2e/collect-logs.sh index 3fb39dadb..6a5bf0405 100755 --- a/test/e2e/collect-logs.sh +++ b/test/e2e/collect-logs.sh @@ -34,31 +34,125 @@ echo -e "${GREEN}Starting log collection at ${TIMESTAMP}${NC}" echo "Logs will be saved to: ${LOG_DIR}" echo "" -# Function to collect logs from a pod -collect_pod_logs() { +# Function to get pod UID for log file lookup +get_pod_uid() { + local pod_name=$1 + kubectl get pod "${pod_name}" -n "${NAMESPACE}" -o jsonpath='{.metadata.uid}' 2>/dev/null || echo "" +} + +# Function to get Kind node name for cluster +get_kind_node_name() { + local cluster_name=$1 + echo "${cluster_name}-control-plane" +} + +# Function to collect logs directly from Kind node filesystem (much faster and complete) +collect_pod_logs_direct() { local pod_name=$1 local cluster_name=$2 local log_file_prefix=$3 - - echo -e "${YELLOW}Collecting logs from pod ${pod_name} in cluster ${cluster_name}${NC}" - + + echo -e "${YELLOW}Collecting logs from pod ${pod_name} in cluster ${cluster_name} (direct access)${NC}" + + # Get pod UID for log directory lookup + local pod_uid + pod_uid=$(get_pod_uid "${pod_name}") + if [ -z "$pod_uid" ]; then + echo -e "${RED}Could not get UID for pod ${pod_name}, falling back to kubectl logs${NC}" + collect_pod_logs_kubectl "$@" + return + fi + # Get all containers in the pod + local containers containers=$(kubectl get pod "${pod_name}" -n "${NAMESPACE}" -o jsonpath='{.spec.containers[*].name}' 2>/dev/null || echo "") - if [ -z "$containers" ]; then echo -e "${RED}No containers found in pod ${pod_name}${NC}" return fi - + + # Get Kind node name + local node_name + node_name=$(get_kind_node_name "${cluster_name}") + + # Construct log directory path inside the Kind node + local log_dir="/var/log/pods/${NAMESPACE}_${pod_name}_${pod_uid}" + + # Collect logs for each container + for container in $containers; do + echo " - Container ${container}:" + + # Get all log files for this container from the Kind node + local container_log_dir="${log_dir}/${container}" + local log_files + log_files=$(docker exec "${node_name}" find "${container_log_dir}" -name "*.log" 2>/dev/null | sort -V || echo "") + + if [ -z "$log_files" ]; then + echo -e " ${RED}No direct log files found, falling back to kubectl logs${NC}" + # Fallback to kubectl approach for this container + local log_file="${log_file_prefix}-${container}.log" + if kubectl logs "${pod_name}" -n "${NAMESPACE}" -c "${container}" > "${log_file}" 2>&1; then + echo " -> ${log_file} (via kubectl)" + else + echo " -> Failed to get logs via kubectl" > "${log_file}" + fi + continue + fi + + # Copy individual log files for this container + local file_count=0 + for log_file_path in $log_files; do + file_count=$((file_count + 1)) + local base_name + base_name=$(basename "${log_file_path}") + local individual_log_file="${log_file_prefix}-${container}-${base_name}" + + { + echo "# Log file metadata" + echo "# Timestamp: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" + echo "# Source: ${log_file_path}" + echo "# Pod: ${pod_name}" + echo "# Container: ${container}" + echo "# Cluster: ${cluster_name}" + echo "# Namespace: ${NAMESPACE}" + echo "# Method: Direct file access from Kind node" + echo "# Node: ${node_name}" + echo "# Part: ${file_count} of $(echo "$log_files" | wc -l)" + echo "# ==================================" + echo "" + docker exec "${node_name}" cat "${log_file_path}" 2>/dev/null || echo "Failed to read ${log_file_path}" + } > "${individual_log_file}" + + echo " -> ${individual_log_file}" + done + done +} + +# Function to collect logs using kubectl (fallback method) +collect_pod_logs_kubectl() { + local pod_name=$1 + local cluster_name=$2 + local log_file_prefix=$3 + + echo -e "${YELLOW}Collecting logs from pod ${pod_name} in cluster ${cluster_name} (kubectl fallback)${NC}" + + # Get all containers in the pod + containers=$(kubectl get pod "${pod_name}" -n "${NAMESPACE}" -o jsonpath='{.spec.containers[*].name}' 2>/dev/null || echo "") + + if [ -z "$containers" ]; then + echo -e "${RED}No containers found in pod ${pod_name}${NC}" + return + fi + # Collect logs for each container for container in $containers; do log_file="${log_file_prefix}-${container}.log" echo " - Container ${container} -> ${log_file}" - + # Get current logs kubectl logs "${pod_name}" -n "${NAMESPACE}" -c "${container}" > "${log_file}" 2>&1 || \ echo "Failed to get logs for container ${container}" > "${log_file}" - + # Try to get previous logs if pod was restarted previous_log_file="${log_file_prefix}-${container}-previous.log" if kubectl logs "${pod_name}" -n "${NAMESPACE}" -c "${container}" --previous > "${previous_log_file}" 2>&1; then @@ -69,6 +163,27 @@ collect_pod_logs() { done } +# Function to collect logs from a pod (tries direct access first, falls back to kubectl) +collect_pod_logs() { + local pod_name=$1 + local cluster_name=$2 + local log_file_prefix=$3 + + # Get pod info for debugging + local pod_info_file="${log_file_prefix}-pod-info.txt" + echo " - Pod info -> ${pod_info_file}" + { + echo "=== Pod Description ===" + kubectl describe pod "${pod_name}" -n "${NAMESPACE}" + echo "" + echo "=== Pod YAML ===" + kubectl get pod "${pod_name}" -n "${NAMESPACE}" -o yaml + } > "${pod_info_file}" 2>&1 + + # Try direct access first (much better), fallback to kubectl if needed + collect_pod_logs_direct "$@" +} + # Collect hub cluster logs echo -e "${GREEN}=== Collecting Hub Cluster Logs ===${NC}" kind export kubeconfig --name "${HUB_CLUSTER}" 2>/dev/null || { From 1caa15dff4e0b5037f3337a8b29988be8d080321 Mon Sep 17 00:00:00 2001 From: Zhiying Lin Date: Mon, 8 Dec 2025 17:34:30 +0800 Subject: [PATCH 2/5] update script Signed-off-by: Zhiying Lin --- test/e2e/collect-logs.sh | 215 +++++++++++---------------------------- 1 file changed, 62 insertions(+), 153 deletions(-) diff --git a/test/e2e/collect-logs.sh b/test/e2e/collect-logs.sh index 6a5bf0405..c54b45155 100755 --- a/test/e2e/collect-logs.sh +++ b/test/e2e/collect-logs.sh @@ -34,156 +34,81 @@ echo -e "${GREEN}Starting log collection at ${TIMESTAMP}${NC}" echo "Logs will be saved to: ${LOG_DIR}" echo "" -# Function to get pod UID for log file lookup -get_pod_uid() { - local pod_name=$1 - kubectl get pod "${pod_name}" -n "${NAMESPACE}" -o jsonpath='{.metadata.uid}' 2>/dev/null || echo "" -} -# Function to get Kind node name for cluster -get_kind_node_name() { + +# Function to collect fleet agent logs from node filesystem using kubectl debug +collect_node_agent_logs() { local cluster_name=$1 - echo "${cluster_name}-control-plane" -} + local node_log_dir=$2 + local agent_type=$3 # "hub-agent" or "member-agent" -# Function to collect logs directly from Kind node filesystem (much faster and complete) -collect_pod_logs_direct() { - local pod_name=$1 - local cluster_name=$2 - local log_file_prefix=$3 + echo -e "${YELLOW}Collecting ${agent_type} logs from cluster ${cluster_name} nodes${NC}" - echo -e "${YELLOW}Collecting logs from pod ${pod_name} in cluster ${cluster_name} (direct access)${NC}" + # Get all nodes in the cluster + local nodes + nodes=$(kubectl get nodes -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo "") - # Get pod UID for log directory lookup - local pod_uid - pod_uid=$(get_pod_uid "${pod_name}") - if [ -z "$pod_uid" ]; then - echo -e "${RED}Could not get UID for pod ${pod_name}, falling back to kubectl logs${NC}" - collect_pod_logs_kubectl "$@" + if [ -z "$nodes" ]; then + echo -e "${RED}No nodes found in cluster ${cluster_name}${NC}" return fi - # Get all containers in the pod - local containers - containers=$(kubectl get pod "${pod_name}" -n "${NAMESPACE}" -o jsonpath='{.spec.containers[*].name}' 2>/dev/null || echo "") - if [ -z "$containers" ]; then - echo -e "${RED}No containers found in pod ${pod_name}${NC}" - return - fi + # Create node logs directory + mkdir -p "${node_log_dir}" - # Get Kind node name - local node_name - node_name=$(get_kind_node_name "${cluster_name}") - - # Construct log directory path inside the Kind node - local log_dir="/var/log/pods/${NAMESPACE}_${pod_name}_${pod_uid}" - - # Collect logs for each container - for container in $containers; do - echo " - Container ${container}:" - - # Get all log files for this container from the Kind node - local container_log_dir="${log_dir}/${container}" - local log_files - log_files=$(docker exec "${node_name}" find "${container_log_dir}" -name "*.log" 2>/dev/null | sort -V || echo "") - - if [ -z "$log_files" ]; then - echo -e " ${RED}No direct log files found, falling back to kubectl logs${NC}" - # Fallback to kubectl approach for this container - local log_file="${log_file_prefix}-${container}.log" - if kubectl logs "${pod_name}" -n "${NAMESPACE}" -c "${container}" > "${log_file}" 2>&1; then - echo " -> ${log_file} (via kubectl)" - else - echo " -> Failed to get logs via kubectl" > "${log_file}" - fi - continue - fi - - # Copy individual log files for this container - local file_count=0 - for log_file_path in $log_files; do - file_count=$((file_count + 1)) - local base_name - base_name=$(basename "${log_file_path}") - local individual_log_file="${log_file_prefix}-${container}-${base_name}" - - { - echo "# Log file metadata" - echo "# Timestamp: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" - echo "# Source: ${log_file_path}" - echo "# Pod: ${pod_name}" - echo "# Container: ${container}" - echo "# Cluster: ${cluster_name}" - echo "# Namespace: ${NAMESPACE}" - echo "# Method: Direct file access from Kind node" - echo "# Node: ${node_name}" - echo "# Part: ${file_count} of $(echo "$log_files" | wc -l)" - echo "# ==================================" - echo "" - docker exec "${node_name}" cat "${log_file_path}" 2>/dev/null || echo "Failed to read ${log_file_path}" - } > "${individual_log_file}" + for node in $nodes; do + echo " - Collecting ${agent_type} logs from node ${node}" + local node_specific_dir="${node_log_dir}/${node}" + mkdir -p "${node_specific_dir}" - echo " -> ${individual_log_file}" - done + # Collect specific agent logs from node filesystem + collect_agent_logs_from_node "${node}" "${cluster_name}" "${node_specific_dir}" "${agent_type}" done } -# Function to collect logs using kubectl (fallback method) -collect_pod_logs_kubectl() { - local pod_name=$1 +# Function to collect specific agent logs from node filesystem +collect_agent_logs_from_node() { + local node=$1 local cluster_name=$2 - local log_file_prefix=$3 + local node_log_dir=$3 + local agent_type=$4 # "hub-agent" or "member-agent" - echo -e "${YELLOW}Collecting logs from pod ${pod_name} in cluster ${cluster_name} (kubectl fallback)${NC}" + echo " -> Collecting ${agent_type} logs from node filesystem" - # Get all containers in the pod - containers=$(kubectl get pod "${pod_name}" -n "${NAMESPACE}" -o jsonpath='{.spec.containers[*].name}' 2>/dev/null || echo "") + # Find and collect specific agent logs from /var/log/pods + local agent_logs_file="${node_log_dir}/${agent_type}-logs.log" - if [ -z "$containers" ]; then - echo -e "${RED}No containers found in pod ${pod_name}${NC}" - return - fi + # First check if any agent logs exist on this node + local log_files + log_files=$(docker exec "${node}" find /var/log/pods -path "*/fleet-system_*${agent_type}*/*.log" -type f 2>/dev/null || echo "") - # Collect logs for each container - for container in $containers; do - log_file="${log_file_prefix}-${container}.log" - echo " - Container ${container} -> ${log_file}" - - # Get current logs - kubectl logs "${pod_name}" -n "${NAMESPACE}" -c "${container}" > "${log_file}" 2>&1 || \ - echo "Failed to get logs for container ${container}" > "${log_file}" - - # Try to get previous logs if pod was restarted - previous_log_file="${log_file_prefix}-${container}-previous.log" - if kubectl logs "${pod_name}" -n "${NAMESPACE}" -c "${container}" --previous > "${previous_log_file}" 2>&1; then - echo " - Previous logs for ${container} -> ${previous_log_file}" - else - rm -f "${previous_log_file}" - fi - done -} + if [ -n "$log_files" ]; then + # Agent logs found, create the log file + { + echo "# ${agent_type} logs from node filesystem" + echo "# Timestamp: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" + echo "# Node: ${node}" + echo "# Cluster: ${cluster_name}" + echo "# Method: Direct access to /var/log/pods via docker exec" + echo "# ==================================" + echo "" -# Function to collect logs from a pod (tries direct access first, falls back to kubectl) -collect_pod_logs() { - local pod_name=$1 - local cluster_name=$2 - local log_file_prefix=$3 - - # Get pod info for debugging - local pod_info_file="${log_file_prefix}-pod-info.txt" - echo " - Pod info -> ${pod_info_file}" - { - echo "=== Pod Description ===" - kubectl describe pod "${pod_name}" -n "${NAMESPACE}" - echo "" - echo "=== Pod YAML ===" - kubectl get pod "${pod_name}" -n "${NAMESPACE}" -o yaml - } > "${pod_info_file}" 2>&1 - - # Try direct access first (much better), fallback to kubectl if needed - collect_pod_logs_direct "$@" + # Use docker exec to collect agent logs directly from Kind node container + echo "$log_files" | while read logfile; do + echo "--- Log file: $logfile ---" + docker exec "${node}" cat "$logfile" 2>/dev/null || echo "Failed to read $logfile" + echo "" + done + } > "${agent_logs_file}" + echo " -> ${agent_type}-logs.log" + else + # No agent logs found, don't create the file and remove directory if empty + echo " -> No ${agent_type} logs found on node ${node}" + rmdir "${node_log_dir}" 2>/dev/null || true + fi } + # Collect hub cluster logs echo -e "${GREEN}=== Collecting Hub Cluster Logs ===${NC}" kind export kubeconfig --name "${HUB_CLUSTER}" 2>/dev/null || { @@ -195,42 +120,26 @@ kind export kubeconfig --name "${HUB_CLUSTER}" 2>/dev/null || { HUB_LOG_DIR="${LOG_DIR}/hub" mkdir -p "${HUB_LOG_DIR}" -# Get all hub-agent pods -hub_pods=$(kubectl get pods -n "${NAMESPACE}" -l app.kubernetes.io/name=hub-agent -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo "") - -if [ -z "$hub_pods" ]; then - echo -e "${RED}No hub-agent pods found${NC}" -else - for pod in $hub_pods; do - collect_pod_logs "${pod}" "${HUB_CLUSTER}" "${HUB_LOG_DIR}/${pod}" - done -fi +# Collect hub-agent logs from hub cluster nodes +collect_node_agent_logs "${HUB_CLUSTER}" "${HUB_LOG_DIR}/nodes" "hub-agent" # Collect member cluster logs for cluster in "${MEMBER_CLUSTERS[@]}"; do echo -e "${GREEN}=== Collecting Member Cluster Logs: ${cluster} ===${NC}" - + # Export kubeconfig for the member cluster if ! kind export kubeconfig --name "${cluster}" 2>/dev/null; then echo -e "${RED}Failed to export kubeconfig for cluster ${cluster}, skipping...${NC}" continue fi - + # Create member logs directory MEMBER_LOG_DIR="${LOG_DIR}/${cluster}" mkdir -p "${MEMBER_LOG_DIR}" - - # Get all member-agent pods - member_pods=$(kubectl get pods -n "${NAMESPACE}" -l app.kubernetes.io/name=member-agent -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo "") - - if [ -z "$member_pods" ]; then - echo -e "${RED}No member-agent pods found in cluster ${cluster}${NC}" - else - for pod in $member_pods; do - collect_pod_logs "${pod}" "${cluster}" "${MEMBER_LOG_DIR}/${pod}" - done - fi - + + # Collect member-agent logs from member cluster nodes + collect_node_agent_logs "${cluster}" "${MEMBER_LOG_DIR}/nodes" "member-agent" + echo "" done From 18f2ad9a07ee75d2ae6b54ebfa6a2a6f72ca57c0 Mon Sep 17 00:00:00 2001 From: Zhiying Lin Date: Tue, 9 Dec 2025 11:08:11 +0800 Subject: [PATCH 3/5] update the script Signed-off-by: Zhiying Lin --- test/e2e/collect-logs.sh | 83 +++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/test/e2e/collect-logs.sh b/test/e2e/collect-logs.sh index c54b45155..c600987ab 100755 --- a/test/e2e/collect-logs.sh +++ b/test/e2e/collect-logs.sh @@ -74,33 +74,70 @@ collect_agent_logs_from_node() { local agent_type=$4 # "hub-agent" or "member-agent" echo " -> Collecting ${agent_type} logs from node filesystem" + echo `docker exec "${node}" find /var/log/pods -path "*/fleet-system_*${agent_type}*"` - # Find and collect specific agent logs from /var/log/pods - local agent_logs_file="${node_log_dir}/${agent_type}-logs.log" - - # First check if any agent logs exist on this node + # First check if any agent logs exist on this node (including .log, .log.*, and .gz files) local log_files - log_files=$(docker exec "${node}" find /var/log/pods -path "*/fleet-system_*${agent_type}*/*.log" -type f 2>/dev/null || echo "") + log_files=$(docker exec "${node}" find /var/log/pods -path "*/fleet-system_*${agent_type}*" -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) 2>/dev/null || echo "") if [ -n "$log_files" ]; then - # Agent logs found, create the log file - { - echo "# ${agent_type} logs from node filesystem" - echo "# Timestamp: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" - echo "# Node: ${node}" - echo "# Cluster: ${cluster_name}" - echo "# Method: Direct access to /var/log/pods via docker exec" - echo "# ==================================" - echo "" - - # Use docker exec to collect agent logs directly from Kind node container - echo "$log_files" | while read logfile; do - echo "--- Log file: $logfile ---" - docker exec "${node}" cat "$logfile" 2>/dev/null || echo "Failed to read $logfile" - echo "" - done - } > "${agent_logs_file}" - echo " -> ${agent_type}-logs.log" + local files_processed=false + + # Process each log file separately + echo "$log_files" | while read -r logfile; do + if [ -n "$logfile" ]; then + files_processed=true + + # Extract a meaningful filename from the log path + local base_path=$(basename "$(dirname "$logfile")") + local original_filename=$(basename "$logfile") + local sanitized_filename="${base_path}_${original_filename}" + + # Remove .gz extension for the output filename if present + local output_filename="${sanitized_filename%.gz}" + # Ensure output filename ends with .log + if [[ ! "$output_filename" =~ \.log$ ]]; then + output_filename="${output_filename}.log" + fi + + # Create individual log file for this specific log + local individual_log_file="${node_log_dir}/${agent_type}-${output_filename}" + + { + echo "# ${agent_type} logs from node filesystem" + echo "# Timestamp: $(date -u '+%Y-%m-%d %H:%M:%S UTC')" + echo "# Node: ${node}" + echo "# Cluster: ${cluster_name}" + echo "# Source log file: ${logfile}" + echo "# Method: Direct access to /var/log/pods via docker exec" + echo "# ==================================" + echo "" + + # Handle different file types + if [[ "$logfile" == *.gz ]]; then + echo "# Note: This is a compressed log file that has been decompressed" + echo "" + # Decompress and read the file + docker exec "${node}" zcat "$logfile" 2>/dev/null || echo "Failed to decompress and read $logfile" + else + # Regular log file (including rotated .log.* files) + docker exec "${node}" cat "$logfile" 2>/dev/null || echo "Failed to read $logfile" + fi + } > "${individual_log_file}" + + echo " -> ${agent_type}-${output_filename}" + fi + done + + # Check if any files were created in the directory + local created_files + created_files=$(find "${node_log_dir}" -name "${agent_type}-*.log" 2>/dev/null | wc -l) + + # If no log files were actually created, clean up empty directory + if [ "$created_files" -eq 0 ]; then + echo " -> No valid ${agent_type} logs processed on node ${node}" + rmdir "${node_log_dir}" 2>/dev/null || true + fi else # No agent logs found, don't create the file and remove directory if empty echo " -> No ${agent_type} logs found on node ${node}" From 60fad0dc32c9ffa46b6d3c2a29ffd31a165367ad Mon Sep 17 00:00:00 2001 From: Zhiying Lin Date: Tue, 9 Dec 2025 14:42:21 +0800 Subject: [PATCH 4/5] address copilot comments Signed-off-by: Zhiying Lin --- test/e2e/collect-logs.sh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/test/e2e/collect-logs.sh b/test/e2e/collect-logs.sh index c600987ab..0f8c8bd67 100755 --- a/test/e2e/collect-logs.sh +++ b/test/e2e/collect-logs.sh @@ -36,7 +36,9 @@ echo "" -# Function to collect fleet agent logs from node filesystem using kubectl debug +# Function to collect fleet agent logs directly from node filesystem using docker exec +# This approach bypasses kubectl logs limitations and accesses the full log history +# including rotated and compressed log files stored in /var/log/pods. collect_node_agent_logs() { local cluster_name=$1 local node_log_dir=$2 @@ -67,6 +69,12 @@ collect_node_agent_logs() { } # Function to collect specific agent logs from node filesystem +# Collects all log files including rotated (*.log.*) and compressed (*.gz) files +# Args: +# node: The node name to collect logs from +# cluster_name: The cluster name for logging context +# node_log_dir: The directory to save the collected logs +# agent_type: The type of agent ("hub-agent" or "member-agent") collect_agent_logs_from_node() { local node=$1 local cluster_name=$2 @@ -74,19 +82,17 @@ collect_agent_logs_from_node() { local agent_type=$4 # "hub-agent" or "member-agent" echo " -> Collecting ${agent_type} logs from node filesystem" - echo `docker exec "${node}" find /var/log/pods -path "*/fleet-system_*${agent_type}*"` + echo " -> Found log paths: $(docker exec "${node}" find /var/log/pods -path "*/fleet-system_*${agent_type}*")" # First check if any agent logs exist on this node (including .log, .log.*, and .gz files) local log_files log_files=$(docker exec "${node}" find /var/log/pods -path "*/fleet-system_*${agent_type}*" -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) 2>/dev/null || echo "") if [ -n "$log_files" ]; then - local files_processed=false # Process each log file separately echo "$log_files" | while read -r logfile; do if [ -n "$logfile" ]; then - files_processed=true # Extract a meaningful filename from the log path local base_path=$(basename "$(dirname "$logfile")") @@ -96,7 +102,7 @@ collect_agent_logs_from_node() { # Remove .gz extension for the output filename if present local output_filename="${sanitized_filename%.gz}" # Ensure output filename ends with .log - if [[ ! "$output_filename" =~ \.log$ ]]; then + if [[ ! "$output_filename" =~ "\.log$" ]]; then output_filename="${output_filename}.log" fi From 44896bd774edba39c2f85bcc602848622d8ac1bb Mon Sep 17 00:00:00 2001 From: Zhiying Lin Date: Wed, 10 Dec 2025 16:41:38 +0800 Subject: [PATCH 5/5] address comments Signed-off-by: Zhiying Lin --- test/e2e/collect-logs.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/e2e/collect-logs.sh b/test/e2e/collect-logs.sh index 0f8c8bd67..9c533c7cc 100755 --- a/test/e2e/collect-logs.sh +++ b/test/e2e/collect-logs.sh @@ -82,27 +82,27 @@ collect_agent_logs_from_node() { local agent_type=$4 # "hub-agent" or "member-agent" echo " -> Collecting ${agent_type} logs from node filesystem" - echo " -> Found log paths: $(docker exec "${node}" find /var/log/pods -path "*/fleet-system_*${agent_type}*")" + echo " -> Found log paths: $(docker exec "${node}" find /var/log/pods -path "*/${NAMESPACE}_*${agent_type}*")" # First check if any agent logs exist on this node (including .log, .log.*, and .gz files) local log_files - log_files=$(docker exec "${node}" find /var/log/pods -path "*/fleet-system_*${agent_type}*" -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) 2>/dev/null || echo "") + log_files=$(docker exec "${node}" find /var/log/pods -path "*/${NAMESPACE}_*${agent_type}*" -type f \( -name "*.log" -o -name "*.log.*" -o -name "*.gz" \) 2>/dev/null || echo "") if [ -n "$log_files" ]; then - # Process each log file separately - echo "$log_files" | while read -r logfile; do + # Process each log file separately using process substitution to avoid subshell + while read -r logfile; do if [ -n "$logfile" ]; then # Extract a meaningful filename from the log path local base_path=$(basename "$(dirname "$logfile")") - local original_filename=$(basename "$logfile") + local original_filename="$(basename "$logfile")" local sanitized_filename="${base_path}_${original_filename}" # Remove .gz extension for the output filename if present local output_filename="${sanitized_filename%.gz}" # Ensure output filename ends with .log - if [[ ! "$output_filename" =~ "\.log$" ]]; then + if [[ ! "$output_filename" =~ \.log$ ]]; then output_filename="${output_filename}.log" fi @@ -133,7 +133,7 @@ collect_agent_logs_from_node() { echo " -> ${agent_type}-${output_filename}" fi - done + done < <(echo "$log_files") # Check if any files were created in the directory local created_files