Skip to content

Instantly share code, notes, and snippets.

@fl64
Last active September 18, 2024 10:45
Show Gist options
  • Save fl64/75a5904f9bbadcb3d5a12c3dec3c7708 to your computer and use it in GitHub Desktop.
Save fl64/75a5904f9bbadcb3d5a12c3dec3c7708 to your computer and use it in GitHub Desktop.
dump-vm-debug-bundle

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 $@
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment