Skip to content

Instantly share code, notes, and snippets.

@fl64
Last active May 29, 2024 08:26
Show Gist options
  • Save fl64/c4ba9e72cdf24ca017e0df0b8a3ed36c to your computer and use it in GitHub Desktop.
Save fl64/c4ba9e72cdf24ca017e0df0b8a3ed36c to your computer and use it in GitHub Desktop.
get all vm resources in ns
#!/usr/bin/env bash
green=$(tput setaf 2)
red=$(tput setaf 1)
yellow=$(tput setaf 3)
cyan=$(tput setaf 6)
magenta=$(tput setaf 5)
blue=$(tput setaf 4)
sgr0=$(tput sgr0)
bold=$(tput bold)
system_resource_color=${yellow}${bold}
namespace_color=${blue}${bold}
node_color=${magenta}${bold}
resource_color=${cyan}${bold}
show_phase() {
case $1 in
Bound|Running|Ready) color="${green}";;
Pending|Starting) color="${yellow}";;
*) color="${red}";;
esac
echo -e "${color}${bold}${1}${sgr0}"
}
vm_query='
.items[] |
{
name: .metadata.name,
namespace: .metadata.namespace,
blockDeviceRefs: .spec.blockDeviceRefs,
nodeName: .status.nodeName,
phase: .status.phase,
ipAddress: .status.ipAddress
}
'
vm_pod_query='
.items[0] |
{
name: .metadata.name,
phase: .status.phase,
}
'
storage_query='
.items[] |
{
name: .metadata.name,
namespace: .metadata.namespace,
phase: .status.phase
}
'
ns_line="β—» ${namespace_color}%s${sgr0}\n"
node_line=" πŸ–₯ ${node_color}%s${sgr0}\n"
vm_line=" β•°-πŸ–³ ${resource_color}VirtualMachine${sgr0} %s / %s : %s\n"
pod_line=" ‧ β•°-βš™ ${system_resource_color}Pod${sgr0} %s : %s\n"
blk_line=" ‧ β•°-πŸ–΄ ${resource_color}%s${sgr0} %s : %s\n"
pvc_line=" ‧ ‧ β•°-⛃ ${system_resource_color}PVC${sgr0} %s : %s\n"
pv_line=" ‧ ‧ β•°-⛁ ${system_resource_color}PV${sgr0} %s : %s\n"
# ns_line="β—» ${namespace_color}%s${sgr0}\n"
# node_line=" πŸ–₯ ${node_color}%s${sgr0}\n"
# vm_line=" β•°-πŸ–₯️ ${resource_color}VirtualMachine${sgr0} %s / %s : %s\n"
# pod_line=" ‧ β•°-πŸ«› ${resource_color}%s${sgr0} %s : %s\n"
# blk_line=" ‧ β•°-πŸ“¦ ${resource_color}%s${sgr0} %s : %s\n"
# pvc_line=" ‧ ‧ β•°-⛃ ${resource_color}PVC${sgr0} %s : %s\n"
# pv_line=" ‧ ‧ β•°-⛁ ${resource_color}PV${sgr0} %s : %s\n"
show_vm_in_ns() {
ns=${1}
printf "${ns_line}" "${ns}"
vms=$(kubectl -n ${ns} get vm -o json | jq "${vm_query}")
if [[ -z "${vms}" ]]; then return; fi
pvcs=$(kubectl -n ${ns} get pvc -o json | jq "${storage_query}")
vm_nodes=$(kubectl -n ${ns} get vms -o json | jq '.items[].status.nodeName' | jq -s '. | sort | unique')
while IFS= read -r vm_node; do
printf "${node_line}" "${vm_node}"
vms_on_node=$(echo "${vms}" | jq -s --arg vm_node "${vm_node}" '.[] | select(.nodeName==$vm_node)' | jq -s)
while IFS= read -r vm; do
vm_name=$(echo ${vm} | jq -r '.name')
vm_blockdevices=$(echo ${vm} | jq -rc '.blockDeviceRefs[]|{name, kind}')
vm_node=$(echo ${vm} | jq -r '.nodeName')
vm_ip=$(echo ${vm} | jq -r '.ipAddress')
vm_phase=$(echo ${vm} | jq -r '.phase')
printf "${vm_line}" "${vm_name}" "${vm_ip}" "$(show_phase ${vm_phase})"
vm_pod=$(kubectl -n ${ns} get pod -l vm.kubevirt.io/name=${vm_name} -o json | jq "${vm_pod_query}")
vm_pod_name=$(echo ${vm_pod} | jq -cr '.name')
vm_pod_phase=$(echo ${vm_pod} | jq -cr '.phase')
printf "${pod_line}" "${vm_pod_name}" "$(show_phase ${vm_pod_phase})"
while IFS= read -r blockdevice; do
blockdevice_name=$(echo "${blockdevice}" | jq -r .name)
blockdevice_kind=$(echo "${blockdevice}" | jq -r .kind)
blockdevice_json=$(kubectl -n ${ns} get ${blockdevice_kind} ${blockdevice_name} -o json)
blockdevice_phase=$(echo ${blockdevice_json} | jq -r '.status.phase')
printf "${blk_line}" "${blockdevice_kind}" "${blockdevice_name}" "$(show_phase ${blockdevice_phase})"
if [[ "${blockdevice_kind}" == "VirtualDisk" ]]; then
pvc_name=$(echo ${blockdevice_json} | jq -r '.status.target.persistentVolumeClaimName')
pvc_json=$(kubectl -n ${ns} get pvc ${pvc_name} -o json)
pvc_phase=$(echo ${pvc_json} | jq -r '.status.phase')
pv_name=$(echo ${pvc_json} | jq -r '.spec.volumeName')
printf "${pvc_line}" "${pvc_name}" "$(show_phase ${pvc_phase})"
pv_json=$(kubectl get pv ${pv_name} -o json)
pv_phase=$(echo ${pv_json} | jq -r '.status.phase')
printf "${pv_line}" "${pv_name}" "$(show_phase ${pv_phase})"
fi
done <<< "${vm_blockdevices}"
done <<< $(echo $vms_on_node | jq -cr '.[]')
done <<< $(echo $vm_nodes | jq -cr '.[]')
}
ns="mvp-static"
if [ -z "$ns" ]; then
while IFS= read -r ns; do
show_vm_in_ns ${ns}
done <<< $(kubectl get ns -o json | jq .items[].metadata.name -r)
else
show_vm_in_ns ${ns}
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment