|  | #!/bin/bash | 
|  | ############################################################################### | 
|  | # | 
|  | # This script creates an NFS Persistent Volumes(PV) and also claims that PV | 
|  | # with a PVC of the same size. | 
|  | # Note: PVs can be claimed by one PVC at a time | 
|  | # | 
|  | ############################################################################### | 
|  | # | 
|  | # Requirements: | 
|  | #  - NFS server with directory to use as path for mount | 
|  | #  - Access to an existing Kubernetes Cluster | 
|  | #  - Kubectl installed and configured on machine running script | 
|  | # | 
|  | ############################################################################### | 
|  | # | 
|  | # The script expects a few variables which are needed to define PV's and PVC's | 
|  | #  NS      = Namespace under which to create the mounts on the cluster | 
|  | #  NFSIP   = Server IP for NFS server that will be used | 
|  | #  NFSPATH = Path of the directory that will be mounted from NFS server | 
|  | #  SIZE    = The size of the volume, numeric value followed by Gi or Mi | 
|  | #  NAME    = The name of the PV and PVC that will be used by the Kubernetes | 
|  | #            system to refer to PV/PVC | 
|  | #  MODE    = ReadWriteOnce|ReadOnlyMany|ReadWriteMany | 
|  | #            Access Mode used by NFS normally uses ReadWriteMany | 
|  | #  RECLAIM = recycle|delete|retain | 
|  | #            The policy, defines what occurs when claim on PV is released, can | 
|  | #            be either: recycle, delete, or retain. | 
|  | # | 
|  | # Note: Kubernetes Systems permissions vary by implementation | 
|  | #       some will require permissions to create PV's or PVC's | 
|  | # | 
|  | ############################################################################### | 
|  |  | 
|  | NS=${NS:-openbmc} | 
|  | NFSIP=${NFSIP:-NFS-Server} | 
|  | NFSPATH=${NFSPATH:-/san/dir} | 
|  | SIZE=${SIZE:-10Gi} | 
|  | NAME=${NAME:-placeholder} | 
|  | MODE=${MODE:-ReadWriteMany} | 
|  | RECLAIM=${RECLAIM:-Retain} | 
|  |  | 
|  | # Generate the PV | 
|  | pv=$(cat << EOF | 
|  | apiVersion: v1 | 
|  | kind: PersistentVolume | 
|  | metadata: | 
|  | labels: | 
|  | app: ${NS} | 
|  | name: ${NAME} | 
|  | namespace: ${NS} | 
|  | spec: | 
|  | accessModes: | 
|  | - ${MODE} | 
|  | capacity: | 
|  | storage: ${SIZE} | 
|  | nfs: | 
|  | path: ${NFSPATH} | 
|  | server: ${NFSIP} | 
|  | persistentVolumeReclaimPolicy: ${RECLAIM} | 
|  | EOF | 
|  | ) | 
|  |  | 
|  | # create the volume | 
|  | if [ -z $(kubectl get pv --namespace=${NS} | grep '^'${NAME}' ' | cut -d " " -f1) ];then | 
|  | echo "Creating Persistent Volume ${NAME}" | 
|  | kubectl create -f - <<< "${pv}" | 
|  | else | 
|  | echo "Persistent Volume already Exists" | 
|  | fi | 
|  |  | 
|  |  | 
|  | # Generate the PVC | 
|  | pvc=$(cat << EOF | 
|  | apiVersion: v1 | 
|  | kind: PersistentVolumeClaim | 
|  | metadata: | 
|  | name: ${NAME} | 
|  | namespace: ${NS} | 
|  | spec: | 
|  | accessModes: | 
|  | - ${MODE} | 
|  | resources: | 
|  | requests: | 
|  | storage: ${SIZE} | 
|  | selector: | 
|  | matchLabels: | 
|  | app: ${NS} | 
|  | EOF | 
|  | ) | 
|  |  | 
|  | # create PVC's to bind the PV's | 
|  | if [ -z $(kubectl get pvc --namespace=${NS} | grep '^'${NAME}' ' | cut -d " " -f1) ];then | 
|  | echo "Creating Persistent Volume Claim ${NAME}" | 
|  | kubectl create -f - <<< "${pvc}" | 
|  | else | 
|  | echo "Persistent volume claim already exists." | 
|  | fi |