#!/bin/bash
# This creates a persistent volume and claim.
# Params:
# -p|--pv <pv-name> -c|--pvc <pvc-name> -s|--nfs-server <nfs-server> -n|--nfs-path <nfs-path> -N|--namespace <name>
# pv-name    - the name used for the persistent volume
# pvc-name   - the name used for the claim
# nfs-server - IP or hostname of the NFS server
# nfs-path   - Path on the NFS server
# namespace  - Kubernetes namespace 

PV_NAME=
PVC_NAME=
NFS_SERVER=
NFS_PATH=
SIZE=
NAMESPACE=default

usage()
{
echo "Usage: provision-volume-claim.sh < -p | --pv-name name > < -c | --pvc-name name >
                        < -n | --nfs-server server > 
                        < -m | --nfs-path path >
                        < -s | --size size >
                        < -N | --namespace name >"
  exit 2
}

PARSED_ARGUMENTS=$(getopt -a -n provision-volume-claim -o p:c:n:m:s:N: --long pv-name:,pvc-name:,nfs-server:,nfs-path:,size:,namespace: -- "$@")
VALID_ARGUMENTS=$?
if [ "$VALID_ARGUMENTS" != "0" ]; then
  usage
fi

eval set -- "$PARSED_ARGUMENTS"
while :
do
  case "$1" in
    -p | --pv-name)    PV_NAME="$2"    ; shift 2 ;;
    -c | --pvc-name)   PVC_NAME="$2"   ; shift 2 ;;
    -n | --nfs-server) NFS_SERVER="$2" ; shift 2 ;;
    -m | --nfs-path)   NFS_PATH="$2"   ; shift 2 ;;
    -s | --size)       SIZE="$2"       ; shift 2 ;;
    -N | --namespace)  NAMESPACE="$2"  ; shift 2 ;;
    # -- means the end of the arguments; drop this, and break out of the while loop
    --) shift; break ;;
    *) echo "Unexpected option: $1 - this should not happen."
       usage ;;
  esac
done

if [ -z $PV_NAME ] || [ -z $PVC_NAME ] || [ -z $NFS_SERVER ] || [ -z $NFS_PATH ] || [ -z $SIZE ];
then
  echo "Missing required option(s)"
  usage
fi

PV_MANIFEST=$(mktemp /tmp/pvc.XXXXXXX) || exit 1
PVC_MANIFEST=$(mktemp /tmp/pv.XXXXXXX) || exit 1

# Create the PV manifest
cat > $PV_MANIFEST << EOM
apiVersion: v1
kind: PersistentVolume
metadata:
  name: $PV_NAME
  labels:
    is_nf_pv: "yes"
spec:
  capacity:
    storage: $SIZE
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: $NFS_PATH
    server: $NFS_SERVER
EOM
echo "Created PV Manifest $PV_MANIFEST:"
cat $PV_MANIFEST

# kubectl apply -f $PV_MANIFEST || exit 1

# Create the pvc manifest
cat > $PVC_MANIFEST << EOM
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: $PVC_NAME
  namespace: $NAMESPACE
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  resources:
    requests:
      storage: $SIZE
  storageClassName: slow
  selector:
    matchLabels:
      is_nf_pv: "yes"
EOM
echo "Created PVC Manifest: $PVC_MANIFEST"
cat $PVC_MANIFEST

# Generate cleanup script
cat > cleanup-volume-claim.sh << EOM
#!/bin/bash
kubectl delete pvc $PVC_NAME -n $NAMESPACE
kubectl delete pv $PV_NAME
EOM
chmod +x cleanup-volume-claim.sh

kubectl apply -f $PV_MANIFEST || exit 1
kubectl apply -f $PVC_MANIFEST || exit 1
