Last active
May 29, 2024 08:26
-
-
Save fl64/c4ba9e72cdf24ca017e0df0b8a3ed36c to your computer and use it in GitHub Desktop.
get all vm resources in ns
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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