
#!/bin/sh
# File	: upd_qos_cap_to_graphite.sh
# By	: Maarten.deBoer@Atos.net, 160310, 200421
# Subject	: Upload QoS capacity (max) to Graphite(-Grafana)
#(0.2),200422	: Update calculate in GB (was TB)
PGM="`basename $0|cut -d\. -f1`"
VER="0.2"
TMP="/tmp/${PGM}.$$"
HOSTNAME="`hostname|cut -d\. -f1`"
LOG="${HOME}/log/${PGM}.log"
GRAPHITESRV="10.192.109.224 2003"  # aoxnlfsd06
GRAPHITE=""
NC="${HOME}/bin/nc"

CLUSTERS="${HOME}/etc/clusters"
CFILTER="[?]*"
SFILTER="[?]*"

# Max IOPS values /storage class
MIN_BRONZE=25
MAX_BRONZE=25
PEAK_BRONZE=50
MIN_SILVER=250
MAX_SILVER=250
PEAK_SILVER=375
MIN_GOLD=150
MAX_GOLD=500
PEAK_GOLD=1000
MIN_PLATINUM=450
MAX_PLATINUM=150
PEAK_PLATINUM=3000
MIN_DIAMOND=1500
MAX_DIAMOND=5000
PEAK_DIAMOND=6000

# atos.qos.nl.<cluster>.svm.<svm>.vol.<volume>.max-iops.<max-iops>
# Upload graphite header
GROUP="nl"
HDR="atos.qos.${GROUP}"
# ${HDR}.${GROUP}.<cluster>.svm.<svm>.vol.<volume>.max-iops.<max-iops>

# File	: sshcmd.func
# VER="0.1", <node>-04
# VER="0.2", <node>-06
# VER="0.3", <node>-10
SSHCMD()
# 1: Filername 2:Command-string
# When issue with connection to cluster, try the nodes (-01 & -02)
# "There are no entries matching your query." => EC=255
# "no connection" is also EC=255
{
  TMPERR="/tmp/${PGM}.$$.tmperr"
  touch ${TMPERR}
  /usr/bin/ssh -n ${1} "${2}" 2> ${TMPERR}
  EC=${?}
  # Check if "ssh: connect to host 10.192.109.202 port 22: Connection refused" If so (EC2=0), the 2nd
  grep 'Connection refused' ${TMPERR}
  EC2=${?}
  if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
    sleep 1
    /usr/bin/ssh -n ${1}-01 "${2}" 2> ${TMPERR}
    EC=${?}
    grep 'Connection refused' ${TMPERR}
    EC2=${?}
    if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
      sleep 1
      /usr/bin/ssh -n ${1}-02 "${2}" 2> ${TMPERR}
      EC=${?}
      grep 'Connection refused' ${TMPERR}
      EC2=${?}
      if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
        sleep 1
        /usr/bin/ssh -n ${1}-03 "${2}" 2> ${TMPERR}
        EC=${?}
        grep 'Connection refused' ${TMPERR}
        EC2=${?}
        if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
          sleep 1
          /usr/bin/ssh -n ${1}-04 "${2}" 2> ${TMPERR}
          EC=${?}
          grep 'Connection refused' ${TMPERR}
          EC2=${?}
          if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
            sleep 1
            /usr/bin/ssh -n ${1}-05 "${2}" 2> ${TMPERR}
            EC=${?}
            grep 'Connection refused' ${TMPERR}
            EC2=${?}
            if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
              sleep 1
              /usr/bin/ssh -n ${1}-06 "${2}" 2> ${TMPERR}
              EC=${?}
              grep 'Connection refused' ${TMPERR}
              EC2=${?}
              if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
                sleep 1
                /usr/bin/ssh -n ${1}-07 "${2}" 2> ${TMPERR}
                EC=${?}
                grep 'Connection refused' ${TMPERR}
                EC2=${?}
                if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
                  sleep 1
                  /usr/bin/ssh -n ${1}-08 "${2}" 2> ${TMPERR}
                  EC=${?}
                  grep 'Connection refused' ${TMPERR}
                  EC2=${?}
                  if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
                    sleep 1
                    /usr/bin/ssh -n ${1}-09 "${2}" 2> ${TMPERR}
                    EC=${?}
                    grep 'Connection refused' ${TMPERR}
                    EC2=${?}
                    if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
                      sleep 1
                      /usr/bin/ssh -n ${1}-10 "${2}" 2> ${TMPERR}
                      EC=${?}
                      grep 'Connection refused' ${TMPERR}
                      EC2=${?}
                      if [ ${EC} -ne 0 ] && [ ${EC2} -eq 0 ]; then
                        echo  "`date` ${PGM} ERROR with communication to ${1}. Connection to -01 .. -10 failed too."|tee -a ${LOG} 
                      fi  # -10
                    fi  # -09
                  fi  # -08
                fi  # -07
              fi  # -06
            fi  # -05
          fi  # -04
        fi  # -03
      fi  # -02
    fi  # -01
  fi  # 
  rm ${TMPERR}
}


USAGE()
{
  echo "Usage: $PGM [options] "
  echo "  Version: ${VER}"
  echo "  options:"
  echo "    -c | --cluster  : Cluster filter (${CFILTER})"
  echo "    -g | --graphite : send to Graphite"
  echo "    -s | --svm      : SVM filter (${SFILTER})"
  echo "    -h              : this help"
  echo "    -V              : Version"
  echo "    -x              : set -x"
}

# Check options
while [ $# -gt 0 ]
  do
  case ${1} in
    -s | --svm) SFILTER=${2}; shift ;;
    -c | --cluster) CFILTER=${2}; shift ;;
    -g | --graphite) GRAPHITE="1" ;;
    -h | --help) USAGE; exit 1 ;;
    -V) echo "${PGM}: v${VER}"; exit 3 ;;
    -x)  set -x ;;
    *)  echo "Option ${1} not known."; USAGE; exit 1 ;;
  esac
    shift
done

echo "`date` ${PGM} v${VER} started." | tee -a ${LOG}
touch ${TMP}

echo "  CFILTER=${CFILTER}"| tee -a ${LOG}
echo "  SFILTER=${SFILTER}"| tee -a ${LOG}
echo "  GRAPHITE=${GRAPHITE}"| tee -a ${LOG}
sleep 1



cat "${CLUSTERS}"|grep -v \^#|awk -F\; '{print $1}'|sort|grep "${CFILTER}"|while read CLUSTER REST
do
  echo "  ${CLUSTER} ..."
  SSHCMD ${CLUSTER} "vserver show -field vserver,operational-state"|grep running|grep ${SFILTER}|awk '{print $1}'|while read SVM REST
  do
    echo " ${SVM}"
    SSHCMD ${CLUSTER} "set -units GB; volume show -vserver ${SVM} -field qos-policy-group,total"|awk '{print $2,$3,$4}'|grep ${SVM}|while read VOL TOTAL_SIZE QOS_POLICY REST
    do
      STOR_CLASS=`echo ${QOS_POLICY}|cut -d\_ -f2|cut -d\_ -f1`
      TOTAL_GB=`echo ${TOTAL_SIZE}|sed 's/GB//g'`
      case ${STOR_CLASS} in
      bronze)  
        if [ ${TOTAL_GB} -gt 0 ]; then
          MAX_IOPS=`expr ${PEAK_BRONZE} \* ${TOTAL_GB} / 1024`
        fi 
        if [ ${MAX_IOPS} -lt ${MIN_BRONZE} ]; then
          MAX_IOPS=${MIN_BRONZE}
        fi
        ;;
      silver) 
        if [ ${TOTAL_GB} -gt 0 ]; then
          MAX_IOPS=`expr ${PEAK_SILVER} \* ${TOTAL_GB} / 1024`
        fi
        if [ ${MAX_IOPS} -lt ${MIN_SILVER} ]; then
          MAX_IOPS=${MIN_SILVER}
        fi
        ;;
      gold) 
        if [ ${TOTAL_GB} -gt 0 ]; then
          MAX_IOPS=`expr ${PEAK_GOLD} \* ${TOTAL_GB} / 1024`
        fi 
        if [ ${MAX_IOPS} -lt ${MIN_GOLD} ]; then
          MAX_IOPS=${MIN_GOLD}
        fi 
        ;;
      platinum)  
        if [ ${TOTAL_GB} -gt 0 ]; then
          MAX_IOPS=`expr ${PEAK_PLATINUM} \* ${TOTAL_GB} / 1024`
        fi 
        if [ ${MAX_IOPS} -lt ${MIN_PLATINUM} ]; then
          MAX_IOPS=${MIN_PLATINUM}
        fi 
        ;;
      diamond)
        if [ ${TOTAL_GB} -gt 0 ]; then
          MAX_IOPS=`expr ${PEAK_DIAMOND} \* ${TOTAL_GB} / 1024`
        fi
        if [ ${MAX_IOPS} -lt ${MIN_DIAMOND} ]; then
          MAX_IOPS=${MIN_DIAMOND}
        fi 
        ;;
      esac


      echo -n "  ${VOL} ${TOTAL_GB}GB ${STOR_CLASS} => "

      if [ ${GRAPHITE} ]; then
        DATES="`date +%s`"
        if [ "${MAX_IOPS}" != "" ]; then
          echo "${HDR}.${CLUSTER}.svm.${SVM}.vol.${VOL}.max-iops ${MAX_IOPS} ${DATES} "
          echo "${HDR}.${CLUSTER}.svm.${SVM}.vol.${VOL}.max-iops ${MAX_IOPS} ${DATES}"|${NC} ${GRAPHITESRV}
        fi
      else
        echo " ${MAX_IOPS} iops (NOT send to Graphite)"
      fi

    done  # VOL
  done  # SVM
done  # CLUSTER


rm ${TMP}
echo "`date` ${PGM} v${VER} finished." | tee -a ${LOG}
exit 0

