how to run
curl -s https://gist.githubusercontent.com/fl64/75a5904f9bbadcb3d5a12c3dec3c7708/raw/7bffcc1fb47fa0297da4c1331fa4fa3a535bc530/vm-debug-bundle.sh | bash -s -- -n demo-pure-virtualization -v vm-3
#!/usr/bin/env bash | |
#set -x | |
: ${BUNDLE_PATH:=/tmp} | |
: ${KEEP_FILES:=0} | |
say_green() { | |
echo -e "\033[1;32m${1}\033[0m" | |
} | |
say_red() { | |
echo -e "\033[1;31m${1}\033[0m" | |
} | |
say_yellow() { | |
echo -e "\033[1;33m${1}\033[0m" | |
} | |
say_magenta() { | |
echo -e "\033[1;35m${1}\033[0m" | |
} | |
parse_args(){ | |
while [[ -n "$1" ]]; do | |
case $1 in | |
--ns|-n) | |
shift | |
NAMESPACE=$1 | |
;; | |
--vm-name|-v) | |
shift | |
VM_NAME=$1 | |
;; | |
--bundle-path) | |
shift | |
BUNDLE_PATH=$1 | |
;; | |
--keep) | |
KEEP_FILES=1 | |
;; | |
*) say_red "Unknown arg $1" | |
exit 1 | |
esac | |
shift | |
done | |
if [[ -z ${NAMESPACE} || -z ${VM_NAME} ]]; then | |
say_red "Namespace and virtualmachine name parameters missed but required" | |
say_red "Namespace: ${NAMESPACE}" | |
say_red "Virtualmachine: ${VM_NAME}" | |
exit 1 | |
fi | |
} | |
dump_block_device(){ | |
local NAMESPACE=$1 | |
local BD_KIND=$2 | |
local BD_NAME=$3 | |
local BUNDLE_DIR_PATH=$4 | |
# Get blockdevice | |
BD_JSON=$(kubectl -n ${NAMESPACE} get ${BD_KIND} ${BD_NAME} -o json) | |
BD_YAML=$(kubectl -n ${NAMESPACE} get ${BD_KIND} ${BD_NAME} -o yaml) | |
[[ -n "${BD_YAML}" ]] && echo "${BD_YAML}" > "${BUNDLE_DIR_PATH}/${BD_KIND,,}-${BD_NAME}.yaml" | |
if [[ "${BD_KIND}" == "VirtualDisk" ]]; then | |
# Get PVC | |
PVC_NAME=$(echo ${BD_JSON} | jq '.status.target.persistentVolumeClaimName' -cr) | |
say_yellow " - PVC ${PVC_NAME}" | |
PVC_JSON=$(kubectl -n ${NAMESPACE} get persistentvolumeclaim ${PVC_NAME} -o json) | |
PVC_YAML=$(kubectl -n ${NAMESPACE} get persistentvolumeclaim ${PVC_NAME} -o yaml) | |
[[ -n "${PVC_YAML}" ]] && echo "${PVC_YAML}" > "${BUNDLE_DIR_PATH}/pvc-${PVC_NAME}.yaml" | |
# Get PV | |
PV_NAME=$(echo ${PVC_JSON} | jq '.spec.volumeName' -cr) | |
say_yellow " - PV ${PV_NAME}" | |
PV_YAML=$(kubectl get persistentvolume ${PV_NAME} -o yaml) | |
[[ -n "${PV_YAML}" ]] && echo "${PV_YAML}" > "${BUNDLE_DIR_PATH}/pv-${PV_NAME}.yaml" | |
fi | |
} | |
create_bundle(){ | |
local BUNDLE_DIR_PATH=$1 | |
mkdir -p "${BUNDLE_DIR_PATH}" | |
# VM | |
VM_JSON=$(kubectl -n "${NAMESPACE}" get vms "${VM_NAME}" -o json) | |
VM_YAML=$(kubectl -n "${NAMESPACE}" get vms "${VM_NAME}" -o yaml) | |
say_green "Dump VM ${NAMESPACE} / ${VM_NAME}" | |
[[ -n "${VM_YAML}" ]] && echo "${VM_YAML}" > "${BUNDLE_DIR_PATH}/vm-${VM_NAME}.yaml" | |
# VM PODS | |
say_green "Dump VM PODs" | |
VM_PODS=$(kubectl -n "${NAMESPACE}" get pods -l vm.kubevirt.internal.virtualization.deckhouse.io/name=${VM_NAME} -o name | cut -d'/' -f2) | |
for VM_POD in ${VM_PODS}; do | |
say_yellow "- POD ${VM_POD}" | |
VM_POD_YAML=$(kubectl -n "${NAMESPACE}" get pods ${VM_POD} -o yaml) | |
[[ -n "${VM_POD_YAML}" ]] && echo "${VM_POD_YAML}" > "${BUNDLE_DIR_PATH}/pod-${VM_POD}.yaml" | |
VM_POD_LOGS=$(kubectl logs -n "${NAMESPACE}" ${VM_POD}) | |
[[ -n "${VM_POD_LOGS}" ]] && echo "${VM_POD_LOGS}" > "${BUNDLE_DIR_PATH}/pod-logs-${VM_POD}.yaml" | |
done | |
# KVVM | |
say_green "Dump KVVM" | |
KVVM_YAML=$(kubectl -n "${NAMESPACE}" get internalvirtualizationvirtualmachines "${VM_NAME}" -o yaml) | |
[[ -n "${KVVM_YAML}" ]] && echo "${KVVM_YAML}" > "${BUNDLE_DIR_PATH}/kvvm-${VM_NAME}.yaml" | |
# KVVMI | |
say_green "Dump KVVMI" | |
KVVMI_YAML=$(kubectl -n "${NAMESPACE}" get internalvirtualizationvirtualmachineinstances "${VM_NAME}" -o yaml) | |
[[ -n "${KVVMI_YAML}" ]] && echo "${KVVM_YAML}" > "${BUNDLE_DIR_PATH}/kvvmi-${VM_NAME}.yaml" | |
say_green "Dump static blockdevices" | |
while IFS= read -r VM_BD; do | |
[[ ${VM_BD} == "" ]] && break | |
BD_KIND=$(echo ${VM_BD} | jq .kind -cr) | |
BD_NAME=$(echo ${VM_BD} | jq .name -cr) | |
say_yellow "- ${BD_KIND} ${BD_NAME}" | |
dump_block_device "${NAMESPACE}" "${BD_KIND}" "${BD_NAME}" "${BUNDLE_DIR_PATH}" | |
done <<< $(echo ${VM_JSON} | jq -cr '.spec.blockDeviceRefs[]') | |
say_green "Dump hotplug blockdevices" | |
while IFS= read -r VM_HOTPLUG_BD; do | |
[[ ${VM_HOTPLUG_BD} == "" ]] && break | |
BD_KIND=$(echo ${VM_HOTPLUG_BD} | jq .kind -cr) | |
BD_NAME=$(echo ${VM_HOTPLUG_BD} | jq .name -cr) | |
say_green "- ${BD_KIND} ${BD_NAME}" | |
dump_block_device "${NAMESPACE}" "${BD_KIND}" "${BD_NAME}" "${BUNDLE_DIR_PATH}" | |
say_green "- VMBDA ${BD_NAME}" | |
VMBDA_NAME=$(echo ${VM_HOTPLUG_BD} | jq .virtualMachineBlockDeviceAttachmentName -cr) | |
VMBDA_YAML=$(kubectl -n "${NAMESPACE}" get vmbda "${VMBDA_NAME}" -o yaml) | |
[[ -n "${VMBDA_YAML}" ]] && echo "${VMBDA_YAML}" > "${BUNDLE_DIR_PATH}/${VMBDA_NAME}.yaml" | |
done <<< $(echo ${VM_JSON} | jq -cr '.status.blockDeviceRefs[] | select(.hotplugged==true)' ) | |
} | |
main(){ | |
parse_args "$@" | |
TS=$(date +"%Y-%m-%d-%H-%M") | |
BUNDLE_DIR_PATH="${BUNDLE_PATH}/v12n-vm-${VM_NAME}-${TS}" | |
say_magenta "Collecting vm manifests..." | |
create_bundle "${BUNDLE_DIR_PATH}" | |
say_magenta "Compressing data..." | |
tar -czf "${BUNDLE_DIR_PATH}.tar.gz" "${BUNDLE_DIR_PATH}" | |
# say_magenta "Test tar..." | |
# tar -tvf "${BUNDLE_DIR_PATH}.tar.gz" | |
say_magenta "Bundle:" | |
echo "${BUNDLE_DIR_PATH}.tar.gz" | |
[[ ${KEEP_FILES} -ne 1 ]] && (say_magenta "Cleanup...";rm -rf "${BUNDLE_DIR_PATH}") | |
say_magenta "Done" | |
} | |
main $@ |