#!/bin/bash
# 
# check_longhorn_volumes
#
# Quick & Dirty
#

temp_ok=$(mktemp)
temp_crit=$(mktemp)
temp_warn=$(mktemp)
crit=0
warn=0
ok=0
source /etc/profile.d/env.sh

# Defaults thresolds
warn_thresold=85
crit_thresold=90

type kubectl &> /dev/null || { echo >&2 "UNKNOWN: This script need the kubectl utility to run."; exit 3; }

# Check kubectl command
if ( ! kubectl get volumes -n longhorn-system &> /dev/null ) ; then
    echo "UNKNOWN: Kubectl command doesn't seems to be working"
    exit 3
fi

while getopts ":w:c:" opt; do
    case "$opt" in
        w)
            warn_thresold="$OPTARG"
            ;;
        c)
            crit_thresold="$OPTARG"
            ;;
    esac
done


#
# Let's go
#
for volume in $(kubectl get volumes -n longhorn-system --no-headers | awk '{print $1}') ; do

    volume_json=$(kubectl get volume -n longhorn-system $volume -o json)
    volume_ns=$(echo $volume_json | jq -r .status.kubernetesStatus.namespace)
    volume_pvc_name=$(echo $volume_json | jq -r .status.kubernetesStatus.pvcName)


    if ( ! echo $LH_VOLUME_NS_EXCLUDE | grep -q "$volume_ns\," ) && ( ! echo $LH_VOLUME_VOL_EXCLUDE | grep -q $volume_pvc_name ) ; then

        volume_pv_name=$(echo $volume_json | jq -r .status.kubernetesStatus.pvName)
        volume_name="$volume_ns/$volume_pvc_name"

        robustness=$(echo $volume_json | jq -r .status.kubernetesStatus.pvName)
    
        size=$(echo $volume_json | jq -r .spec.size)
        size_gb=$((size/1024/1024/1024))
        used_size=$(echo $volume_json | jq -r .status.actualSize)
        used_size_gb=$((used_size/1024/1024/1024))
    
        percentage_usage=$((used_size*100/size))
    
        if [[ $percentage_usage -gt $crit_thresold ]] ; then
            echo "$volume_name $percentage_usage% (${used_size_gb}GB/${size_gb}GB)" >> $temp_crit
            crit=$((crit+1))
        elif [[ $percentage_usage -gt $warn_thresold ]] ; then
            echo "$volume_name $percentage_usage% (${used_size_gb}GB/${size_gb}GB)" >> $temp_warn
            warn=$((warn+1))
        else
            echo "$volume_name $percentage_usage% (${used_size_gb}GB/${size_gb}GB)" >> $temp_ok
            ok=$((ok+1))
        fi
    fi
done

if [[ $crit -gt 0 ]] ; then
    if [[ $crit -eq 1 ]] ; then
        echo "CRITICAL: 1 volume est rempli a plus de $crit_thresold%"
    else
        echo "CRITICAL: $crit volumes sont remplis a plus de $crit_thresold%"
    fi
    sort $temp_crit -k 2 -rn
    if [[ $warn -gt 0 ]] ; then
        if [[ $warn -eq 1 ]] ; then
            echo "WARNING: 1 volume est rempli a plus de $warn_thresold%"
        else
            echo "WARNING: $warn volumes sont remplis a plus de $warn_thresold%"
        fi
        sort $temp_warn -k 2 -rn
    fi
    rm -f $temp_crit $temp_warn $temp_ok
    exit 2
fi

if [[ $warn -gt 0 ]] ; then
    if [[ $warn -eq 1 ]] ; then
        echo "WARNING: 1 volume est rempli a plus de $warn_thresold%"
    else
        echo "WARNING: $warn volumes sont remplis a plus de $warn_thresold%"
    fi
    sort $temp_warn -k 2 -rn
    rm -f $temp_crit $temp_warn $temp_ok
    exit 1
fi

echo "OK: Tous les volumes sont sous la barre des $warn_thresold% d'utilisation"
sort $temp_ok -k 2 -rn
rm -f $temp_crit $temp_ok $temp_warn
exit 0

