83 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/bin/bash
 | |
| 
 | |
| ######## REQUIRMENTS #########
 | |
| # kubectl
 | |
| # yq (https://github.com/mikefarah/yq)
 | |
| # a valid EDITOR env variable set
 | |
| 
 | |
| set -e
 | |
| #set -x
 | |
| 
 | |
| function yes_or_no {
 | |
| 	while true; do
 | |
| 		read -p "$* [y/n]: " yn
 | |
| 		case $yn in
 | |
| 		[Yy]*) return 0 ;;
 | |
| 		[Nn]*)
 | |
| 			return 1
 | |
| 			;;
 | |
| 		esac
 | |
| 	done
 | |
| }
 | |
| 
 | |
| PV=${1}
 | |
| 
 | |
| if [[ -z ${PV} ]]; then
 | |
| 	echo "must supply a PV name"
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| PV_ORIG_FILE="/tmp/${PV}-orig.yaml"
 | |
| PV_TMP_FILE="/tmp/${PV}-tmp.yaml"
 | |
| 
 | |
| # save original
 | |
| if [[ -f ${PV_ORIG_FILE} ]]; then
 | |
| 	yes_or_no "It appears we already made a backup of ${PV}. Would you like to use the existing backup? (if no, a fresh backup will be created)" && {
 | |
| 		:
 | |
| 	} || {
 | |
| 		rm "${PV_ORIG_FILE}"
 | |
| 	}
 | |
| fi
 | |
| 
 | |
| if [[ ! -f ${PV_ORIG_FILE} ]]; then
 | |
| 	kubectl get pv "${PV}" -o yaml >"${PV_ORIG_FILE}"
 | |
| fi
 | |
| 
 | |
| reclaimPolicy=$(yq eval '.spec.persistentVolumeReclaimPolicy' "${PV_ORIG_FILE}")
 | |
| 
 | |
| # copy file for editing
 | |
| cp "${PV_ORIG_FILE}" "${PV_TMP_FILE}"
 | |
| 
 | |
| # pre-process before edit
 | |
| yq -i eval 'del(.metadata.resourceVersion)' "${PV_TMP_FILE}"
 | |
| 
 | |
| # manually edit
 | |
| ${EDITOR} "${PV_TMP_FILE}"
 | |
| 
 | |
| # ask if looks good
 | |
| yq eval '.' "${PV_TMP_FILE}"
 | |
| yes_or_no "Would you like to delete the existing PV object and recreate with the above data?"
 | |
| 
 | |
| # set relaim to Retain on PV
 | |
| kubectl patch pv "${PV}" -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
 | |
| 
 | |
| # delete PV from API
 | |
| kubectl delete pv "${PV}" --wait=false
 | |
| kubectl patch pv "${PV}" -p '{"metadata":{"finalizers": null }}' &>/dev/null || true
 | |
| 
 | |
| # re-apply newly updated file
 | |
| kubectl apply -f "${PV_TMP_FILE}"
 | |
| 
 | |
| # restore original reclaim value
 | |
| kubectl patch pv "${PV}" -p "{\"spec\":{\"persistentVolumeReclaimPolicy\":\"${reclaimPolicy}\"}}"
 | |
| 
 | |
| # spit out any zfs properties updates
 | |
| yes_or_no "Would you like to delete the PV backup file?" && {
 | |
| 	rm "${PV_ORIG_FILE}"
 | |
| } || {
 | |
| 	:
 | |
| }
 | |
| 
 | |
| rm "${PV_TMP_FILE}"
 | |
| echo "Edit complete!"
 |