From fde732ea68d44f41d37ad8ad37607a8688f77ff3 Mon Sep 17 00:00:00 2001 From: Oded Viner <61982127+OdedViner@users.noreply.github.com> Date: Fri, 25 Oct 2024 14:18:02 +0300 Subject: [PATCH] Collect ceph data for External mode (#10594) * Collect ceph data for External mode Signed-off-by: oviner --- ocs_ci/ocs/utils.py | 27 +++++++ scripts/bash/mg_external.sh | 146 ++++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 scripts/bash/mg_external.sh diff --git a/ocs_ci/ocs/utils.py b/ocs_ci/ocs/utils.py index 1b323008f20..5e36530befd 100644 --- a/ocs_ci/ocs/utils.py +++ b/ocs_ci/ocs/utils.py @@ -13,6 +13,7 @@ import yaml from gevent import sleep +from pathlib import Path from libcloud.common.exceptions import BaseHTTPError from libcloud.common.types import LibcloudError from libcloud.compute.providers import get_driver @@ -970,6 +971,8 @@ def run_must_gather(log_dir_path, image, command=None, cluster_config=None): timeout=must_gather_timeout, cluster_config=cluster_config, ) + if config.DEPLOYMENT["external_mode"]: + collect_ceph_external(path=log_dir_path) except CommandFailed as ex: log.error( f"Failed during must gather logs! Error: {ex}" @@ -986,6 +989,30 @@ def run_must_gather(log_dir_path, image, command=None, cluster_config=None): return mg_output +def collect_ceph_external(path): + """ + Collect ceph commands via cli tool on External mode cluster + + Args: + path(str): The destination for saving the ceph files [output ceph commands] + + """ + try: + kubeconfig_path = os.path.join( + config.ENV_DATA["cluster_path"], config.RUN["kubeconfig_location"] + ) + current_dir = Path(__file__).parent.parent.parent + script_path = os.path.join(current_dir, "scripts", "bash", "mg_external.sh") + run_cmd( + f"sh {script_path} {os.path.join(path, 'ceph_external')} {kubeconfig_path}", + timeout=140, + ) + except Exception as ex: + log.info( + f"Failed to execute the ceph commands script due to the error {str(ex)}" + ) + + def export_mg_pods_logs(log_dir_path): """ Export must gather pods logs diff --git a/scripts/bash/mg_external.sh b/scripts/bash/mg_external.sh new file mode 100644 index 00000000000..968bad726c6 --- /dev/null +++ b/scripts/bash/mg_external.sh @@ -0,0 +1,146 @@ +#!/usr/bin/env bash +set -x + +# Function to print usage information +usage() { + echo "Usage: $0 [BASE_COLLECTION_PATH [KUBECONFIG [NAMESPACE]]]" + echo + echo "Parameters:" + echo " BASE_COLLECTION_PATH Optional. Path where debug logs will be stored. Default is the current directory." + echo " KUBECONFIG Optional. Path to the kubeconfig file. Default is '~/.kube/config'." + echo " NAMESPACE Optional. OpenShift namespace. Default is 'openshift-storage'." + exit 0 +} + +# Check for help flag +if [[ "$1" == "-h" || "$1" == "--help" ]]; then + usage +fi + +dbglog() { + # Allow the input to be piped + declare msg=${1:-$(>"${COMMAND_OUTPUT_DIR}/config_$i"; } >>"${COMMAND_ERR_OUTPUT_DIR}"/gather-config-"$i"-debug.log 2>&1 & + pids_ceph+=($!) +done +# Check if PID array has any values, if so, wait for them to finish +if [ ${#pids_ceph[@]} -ne 0 ]; then + dbglog "Waiting on subprocesses to finish execution." + wait "${pids_ceph[@]}" +fi + + +# Collecting output of ceph commands +for ((i = 0; i < ${#ceph_commands[@]}; i++)); do + dbglog "collecting command output for: ${ceph_commands[$i]}" + COMMAND_OUTPUT_FILE=${COMMAND_OUTPUT_DIR}/${ceph_commands[$i]// /_} + JSON_COMMAND_OUTPUT_FILE=${COMMAND_JSON_OUTPUT_DIR}/${ceph_commands[$i]// /_}_--format_json-pretty + { timeout 120 oc --kubeconfig="${KUBECONFIG}" -n "${NS}" exec "${TOOL_POD_NAME}" -- bash -c "${ceph_commands[$i]} --connect-timeout=15" >>"${COMMAND_OUTPUT_FILE}"; } >>"${COMMAND_ERR_OUTPUT_DIR}"/gather-"${ceph_commands[$i]}"-debug.log 2>&1 & + pids_ceph+=($!) + { timeout 120 oc --kubeconfig="${KUBECONFIG}" -n "${NS}" exec "${TOOL_POD_NAME}" -- bash -c "${ceph_commands[$i]} --connect-timeout=15 --format json-pretty" >>"${JSON_COMMAND_OUTPUT_FILE}"; } >>"${COMMAND_ERR_OUTPUT_DIR}"/gather-"${ceph_commands[$i]}"-json-debug.log 2>&1 & + pids_ceph+=($!) + # If batch_size is reached or last command, wait for processes to finish + if (( (i + 1) % batch_size == 0 || i + 1 == ${#ceph_commands[@]} )); then + dbglog "Waiting on subprocesses to finish execution for batch." + wait "${pids_ceph[@]}" + # Reset pids array after waiting + pids_ceph=() + fi +done