
#!/bin/sh
# File	: noc_volume_update.sh
# By	: Maarten.deBoer@Atos.net, 230905, 231218
# Subject	: Netapp Ontap Cli script to create volumes based on CSV-file
#(0.2)	: Renamed to nao_ and renamed var's
#(0.3),240103	: Mod. $1, $2
#(0.4),240123	: Mod's & Add NAO_VOL_LANG
#(0.5),240216	: Added QOS
#(0.6),240301	: From noc_volume_create.sh, for RC-files
#(0.7),240307	: Add NAO_VOL_SNAPLOCK_AUTOCOMMIT + NAO_VOL_POLICY, Check POLICY
#(0.8),240320	: Upd. NAO_VOL_POLICY, Add: NAO_VOL_SNAPLOCK_MIN
#(0.9),241009	: Add AUTOSIZING
#(0.10),241030	: Add NAO_SNAPSHOT_POLICY
#(0.11),250908	: Mod. NAO_VOL_TYPE=XDP => NAO_VOL_TYPE=DP
#(0.12),251118	: Upd. autosizing
#(0.13),251119	: Upd: chk NAO_VOL_AGGR_NAME
#(0.14),251127	: Add: -space-guarantee
PGM=`basename $0|cut -d\. -f1`
VER="0.14"
LOG="${HOME}/log/${PGM}.log"
SSH="/usr/bin/ssh -n"

DATADIR="${HOME}/data"
CSVDIR="${DATADIR}/csv"

DATAINDIR="${DATADIR}/rc"

# NAO defaults
NAO_CLUSTERNAME="nlnaf999"
NAO_VSERVER_NAME="nlnafsmss99"
NAO_VOL_NAME="mss99_vol09999"
NAO_VOL_STOR_CLASS="gold"
NAO_VOL_SIZE=10
NAO_VOL_SIZE_UNIT="GB"
NAO_VOL_TYPE="RW"
ATOS_CH_NR="CHG123456789"
NAO_VOL_LANG="C.UTF-8"
NAO_VOL_POLICY="default"

NAO_VOL_SNAPLOCK_TYPE=""
NAO_VOL_SNAPLOCK_MAX="2 hours"
NAO_VOL_SNAPLOCK_MIN="1 hours"
NAO_VOL_SNAPLOCK_AUTOCOMMIT="none"

# AUTOSIZING
# grow_threshold_percent
# maximum_size [k|m|g|t]
# minimum_size [k|m|g|t]
# mode ("grow_shrink")
# shrink_threshold_percent
# vserver     volume         max-autosize min-autosize autosize-grow-threshold-percent autosize-shrink-threshold-percent autosize-mode
#NAO_VOL_AUTOSIZE_MODE="off"
NAO_VOL_AUTOSIZE_MODE="grow_shrink"
NAO_VOL_AUTOSIZE_MAXIMUM_SIZE="10g"
NAO_VOL_AUTOSIZE_MINIMUM_SIZE="1g"
NAO_VOL_AUTOSIZE_GROW_THRESHOLD_PERCENT="80%"
NAO_VOL_AUTOSIZE_SHRINK_THRESHOLD_PERCENT="50%"

NAO_SNAPSHOT_POLICY="none"

# 251127:Added
NAO_VOL_SPACE_GAR="none"

# Policy-filter
FILTER="mss"
#CSV="${CSVDIR}/noc_volume-snapmirror-vault_mss.csv"

if [ "${1}" != "" ]; then
  FILTER="${1}"
fi
if [ "${2}" != "" ]; then
  DATAINDIR="${2}"
fi

echo "`date` ${PGM} v${VER} started."|tee -a ${LOG}
echo "  FILTER(1)=${FILTER}"
echo "  DATAINDIR(2)=${DATAINDIR}"
sleep 1

if [ ! -d ${DATAINDIR} ]; then
  echo "  NO DATAINDIR (${DATAINDIR}) found. Exiting ..."|tee -a ${LOG}
  exit 4
fi  # ! DATAINDIR

cd ${DATAINDIR}
ls -1 *volume*.rc|grep "${FILTER}"|while read FNAME
do
  echo "FNAME=${FNAME}|"

# Reading VAR's of all RC-files in DATAINDIR
  if [ "${FNAME}" != "" ] && [ -f ${FNAME} ]; then
    . ${DATAINDIR}/${FNAME}

# When NAO_VOL_TYPE=XDP => NAO_VOL_TYPE=DP
    NAO_VOL_TYPE=`echo ${NAO_VOL_TYPE}|sed 's/XDP/DP/g'`

    echo "NAO_CLUSTERNAME=${NAO_CLUSTERNAME}|"
    echo "NAO_VSERVER_NAME=${NAO_VSERVER_NAME}|"
    echo "NAO_VOL_NAME=${NAO_VOL_NAME}|"
    echo "NAO_VOL_AGGR_NAME=${NAO_VOL_AGGR_NAME}|"
    echo "NAO_VOL_STOR_CLASS=${NAO_VOL_STOR_CLASS}|"
    echo "NAO_VOL_SIZE=${NAO_VOL_SIZE}|"
    echo "NAO_VOL_SIZE_UNIT=${NAO_VOL_SIZE_UNIT}|"
    echo "NAO_VOL_TYPE=${NAO_VOL_TYPE}|"
    echo "NAO_VOL_POLICY=${NAO_VOL_POLICY}|"
    echo "ATOS_CHANGE_NR=${ATOS_CHANGE_NR}|"
    echo "NAO_QTREE_NAME=${NAO_QTREE_NAME}|"
    echo "NAO_QUOTA_DISK_LIMIT=${NAO_QUOTA_DISK_LIMIT}|"
    echo "NAO_QTREE_SECURITY_STYLE=${NAO_QTREE_SECURITY_STYLE}|"
    echo "NAO_QTREE_EXPORT_POLICY=${NAO_QTREE_EXPORT_POLICY}|"
    echo "NAO_VOL_LANG=${NAO_VOL_LANG}|"

    echo "NAO_VOL_SNAPLOCK_TYPE=${NAO_VOL_SNAPLOCK_TYPE}|"
    echo "NAO_VOL_SNAPLOCK_MAX=${NAO_VOL_SNAPLOCK_MAX}|"
    echo "NAO_VOL_SNAPLOCK_MIN=${NAO_VOL_SNAPLOCK_MIN}|"
    echo "NAO_VOL_SNAPLOCK_AUTOCOMMIT=${NAO_VOL_SNAPLOCK_AUTOCOMMIT}|"

    echo "NAO_VOL_AUTOSIZE_MODE=${NAO_VOL_AUTOSIZE_MODE}"
    echo "NAO_VOL_AUTOSIZE_MAXIMUM_SIZE=${NAO_VOL_AUTOSIZE_MAXIMUM_SIZE}"
    echo "NAO_VOL_AUTOSIZE_MINIMUM_SIZE=${NAO_VOL_AUTOSIZE_MINIMUM_SIZE}"
    echo "NAO_VOL_AUTOSIZE_GROW_THRESHOLD_PERCENT=${NAO_VOL_AUTOSIZE_GROW_THRESHOLD_PERCENT}"
    echo "NAO_VOL_AUTOSIZE_SHRINK_THRESHOLD_PERCENT=${NAO_VOL_AUTOSIZE_SHRINK_THRESHOLD_PERCENT}"

    echo "NAO_SNAPSHOT_POLICY=${NAO_SNAPSHOT_POLICY}"

    sleep 1

# Volume create
    if [ "${NAO_CLUSTERNAME}" != "" ] && [ "${NAO_VSERVER_NAME}" != "" ] && [ "${NAO_VOL_NAME}" != "" ] && [ "${NAO_VOL_STOR_CLASS}" != "" ] && [ "${NAO_VOL_AGGR_NAME}" != "" ]; then

# Storage Class / QoS added (for billing purpose)
      QOS_POL_GROUP="${NAO_VSERVER_NAME}_${NAO_VOL_STOR_CLASS}"
      echo "    qos policy-group show ${QOS_POL_GROUP}..."
      CHK_QOS_POL_GROUP=`${SSH} ${NAO_CLUSTERNAME} "qos policy-group show -vserver ${NAO_VSERVER_NAME}"|grep "${QOS_POL_GROUP}"`
      echo "      CHK_QOS_POL_GROUP=${CHK_QOS_POL_GROUP}"
      if [ "${CHK_QOS_POL_GROUP}" = "" ]; then
# No QOS_POL_GROUP found, create
        echo "    qos policy-group create ..."
        ${SSH} ${NAO_CLUSTERNAME} "qos policy-group create -vserver ${NAO_VSERVER_NAME} -policy-group ${QOS_POL_GROUP} -max-throughput INF"
        EC=${?}
        echo "      EC=${EC}"
      fi  # CHK_QOS_POL_GROUP
      echo "    qos policy-group show ..."
      ${SSH} ${NAO_CLUSTERNAME} "qos policy-group show -vserver ${NAO_VSERVER_NAME} -policy-group ${QOS_POL_GROUP} -field policy-group,vserver,throughput-policy"

# Autosizing
      NAO_MAX_AUTOSIZE=`expr ${NAO_VOL_SIZE} \* 11 / 10`
      NAO_MAX_AUTOSIZE="${NAO_MAX_AUTOSIZE}${NAO_VOL_SIZE_UNIT}"
      echo "    NAO_MAX_AUTOSIZE=${NAO_MAX_AUTOSIZE}"

#      if [ "${NAO_VOL_SNAPLOCK_TYPE}" = "" ]; then
#        NAO_VOL_SNAPLOCK_TYPE="non-snaplock"
#      fi

      echo "  NAO_CLUSTERNAME=${NAO_CLUSTERNAME} NAO_VSERVER_NAME=${NAO_VSERVER_NAME} NAO_VOL_NAME=${NAO_VOL_NAME} NAO_VOL_SNAPLOCK_TYPE=${NAO_VOL_SNAPLOCK_TYPE} NAO_VOL_SIZE=${NAO_VOL_SIZE} NAO_VOL_SIZE_UNIT=${NAO_VOL_SIZE_UNIT} "|tee -a ${LOG}

# Check Volume -(export-)policy
      echo "    volume show -policy ..."
      VOL_POLICY=`${SSH} ${NAO_CLUSTERNAME} "volume show -policy \"${NAO_VOL_POLICY}\" -field policy -vserver ${NAO_VSERVER_NAME}"| grep ${NAO_VSERVER_NAME}`
      if [ "${VOL_POLICY}" = "" ]; then
        echo "    export-policy create ..."
        ${SSH} ${NAO_CLUSTERNAME} "export-policy create -policy \"${NAO_VOL_POLICY}\" -vserver ${NAO_VSERVER_NAME} "
      fi  # VOL_POLICY}" = ""

# Check is volume exists
      echo "    volume show ..."
      VOL_CHK=`${SSH} ${NAO_CLUSTERNAME} "volume show -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -field volume"|grep ${NAO_VOL_NAME} `
      if [ "${VOL_CHK}" = "" ]; then
# When no LANGUAGE, then use without
        if [ "${NAO_VOL_LANG}" = "" ]; then
# For "older" ONTAP when no -snaplock-type
          if [ "${NAO_VOL_SNAPLOCK_TYPE}" = "" ]; then
            echo "    volume create ..."
            ${SSH} ${NAO_CLUSTERNAME} "volume create -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -aggregate ${NAO_VOL_AGGR_NAME} -size ${NAO_VOL_SIZE}${NAO_VOL_SIZE_UNIT} -type ${NAO_VOL_TYPE} -qos-policy-group ${NAO_VSERVER_NAME}_${NAO_VOL_STOR_CLASS} -comment ${ATOS_CHANGE_NR} -min-autosize 1GB -max-autosize ${NAO_MAX_AUTOSIZE} -autosize-mode grow_shrink -space-guarantee ${NAO_VOL_SPACE_GAR}"
          else
            echo "    volume create ... -snaplock-type ..."
            ${SSH} ${NAO_CLUSTERNAME} "volume create -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -aggregate ${NAO_VOL_AGGR_NAME} -size ${NAO_VOL_SIZE}${NAO_VOL_SIZE_UNIT} -type ${NAO_VOL_TYPE} -qos-policy-group ${NAO_VSERVER_NAME}_${NAO_VOL_STOR_CLASS} -comment ${ATOS_CHANGE_NR} -min-autosize 1GB -max-autosize ${NAO_MAX_AUTOSIZE} -autosize-mode grow_shrink -snaplock-type ${NAO_VOL_SNAPLOCK_TYPE} "
          fi  # NAO_VOL_SNAPLOCK_TYPE}" = ""
        else
# For "older" ONTAP when no -snaplock-type
          if [ "${NAO_VOL_SNAPLOCK_TYPE}" = "" ]; then
            echo "    volume create ..."
            ${SSH} ${NAO_CLUSTERNAME} "volume create -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -aggregate ${NAO_VOL_AGGR_NAME} -size ${NAO_VOL_SIZE}${NAO_VOL_SIZE_UNIT} -type ${NAO_VOL_TYPE} -qos-policy-group ${NAO_VSERVER_NAME}_${NAO_VOL_STOR_CLASS} -comment ${ATOS_CHANGE_NR} -min-autosize 1GB -max-autosize ${NAO_MAX_AUTOSIZE} -autosize-mode grow_shrink -language ${NAO_VOL_LANG} "
          else
            echo "    volume create ... -snaplock-type ..."
            ${SSH} ${NAO_CLUSTERNAME} "volume create -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -aggregate ${NAO_VOL_AGGR_NAME} -size ${NAO_VOL_SIZE}${NAO_VOL_SIZE_UNIT} -type ${NAO_VOL_TYPE} -qos-policy-group ${NAO_VSERVER_NAME}_${NAO_VOL_STOR_CLASS} -comment ${ATOS_CHANGE_NR} -min-autosize 1GB -max-autosize ${NAO_MAX_AUTOSIZE} -autosize-mode grow_shrink -language ${NAO_VOL_LANG} -snaplock-type ${NAO_VOL_SNAPLOCK_TYPE} "
          fi  # NAO_VOL_SNAPLOCK_TYPE}" = ""

        fi  # NAO_VOL_LANG}" == ""
      fi  # ${VOL_CHK}" != "" 

# Volume Update / ModifyA
      echo "    volume modify ..."
      ${SSH} ${NAO_CLUSTERNAME} "volume modify -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -size ${NAO_VOL_SIZE}${NAO_VOL_SIZE_UNIT} -qos-policy-group ${NAO_VSERVER_NAME}_${NAO_VOL_STOR_CLASS} -comment ${ATOS_CHANGE_NR} -min-autosize 1GB -max-autosize ${NAO_MAX_AUTOSIZE} -autosize-mode grow_shrink -policy \"${NAO_VOL_POLICY}\" -snapshot-policy ${NAO_SNAPSHOT_POLICY} -space-guarantee ${NAO_VOL_SPACE_GAR}"

      if [ "${NAO_VOL_TYPE}" = "RW" ]; then
        echo "    volume mount ..."
        ${SSH} ${NAO_CLUSTERNAME} "volume mount -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -junction-path \"/${NAO_VOL_NAME}\" "
      fi  # RW

# When SNAPLOCK
      if [ "${NAO_VOL_SNAPLOCK_TYPE}" != "" ] && [ "${NAO_VOL_SNAPLOCK_TYPE}" != "non-snaplock" ]; then
        echo "    volume snaplock modify ..."
        ${SSH} ${NAO_CLUSTERNAME} "volume snaplock modify -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -maximum-retention-period \"${NAO_VOL_SNAPLOCK_MAX}\" -autocommit-period \"${NAO_VOL_SNAPLOCK_AUTOCOMMIT}\" -minimum-retention-period \"${NAO_VOL_SNAPLOCK_MIN}\" "
        echo "    volume snaplock show ..."
        ${SSH} ${NAO_CLUSTERNAME} "volume snaplock show -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -field type,maximum-retention-period,default-retention-period,autocommit-period,minimum-retention-period"
      fi  # != "non-snaplock" 

      echo "    volume show ..."
      ${SSH} ${NAO_CLUSTERNAME} "volume show -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -field volume,aggregate,size,qos-policy-group,junction-path,type,language,comment,max-autosize,used,policy,space-guarantee"


# Updating autosizing
      if [ "${NAO_VOL_AUTOSIZE_MODE}" == "off" ]; then
        ${SSH} ${NAO_CLUSTERNAME} "volume modify -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -autosize-mode ${NAO_VOL_AUTOSIZE_MODE} "
      else
# In parts. To avoind some sizing errors
# mode
echo "    -autosize-mode ${NAO_VOL_AUTOSIZE_MODE}"
        ${SSH} ${NAO_CLUSTERNAME} "volume modify -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -autosize-mode ${NAO_VOL_AUTOSIZE_MODE} "
# %
echo "    -autosize-grow-threshold-percent ${NAO_VOL_AUTOSIZE_GROW_THRESHOLD_PERCENT} -autosize-shrink-threshold-percent ${NAO_VOL_AUTOSIZE_SHRINK_THRESHOLD_PERCENT}"
        ${SSH} ${NAO_CLUSTERNAME} "volume modify -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -autosize-grow-threshold-percent ${NAO_VOL_AUTOSIZE_GROW_THRESHOLD_PERCENT} -autosize-shrink-threshold-percent ${NAO_VOL_AUTOSIZE_SHRINK_THRESHOLD_PERCENT} "

echo "    -max-autosize ${NAO_VOL_AUTOSIZE_MAXIMUM_SIZE}"
        ${SSH} ${NAO_CLUSTERNAME} "volume modify -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -max-autosize ${NAO_VOL_AUTOSIZE_MAXIMUM_SIZE}"

echo "    -size ${NAO_VOL_SIZE}${NAO_VOL_SIZE_UNIT}"
        ${SSH} ${NAO_CLUSTERNAME} "volume modify -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -size ${NAO_VOL_SIZE}${NAO_VOL_SIZE_UNIT}"

echo "    -min-autosize ${NAO_VOL_AUTOSIZE_MINIMUM_SIZE}"
        ${SSH} ${NAO_CLUSTERNAME} "volume modify -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -min-autosize ${NAO_VOL_AUTOSIZE_MINIMUM_SIZE}"

        ${SSH} ${NAO_CLUSTERNAME} "volume show -vserver ${NAO_VSERVER_NAME} -volume ${NAO_VOL_NAME} -field min-autosize,max-autosize,autosize-mode,autosize-grow-threshold-percent,autosize-shrink-threshold-percent,percent-used,snapshot-policy,used,total "
        sleep 1
      fi  # mode=off

      sleep 1
    else
      echo "  Not all necessary VAR's has a value."|tee -a ${LOG}
    fi  # != Volume create

  fi  # ${FNAME}" != "" 

done  # LINE

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

