truestuff/work-the-pvc

146 lines
4.0 KiB
Plaintext
Raw Permalink Normal View History

2023-08-26 00:42:43 +00:00
#! /usr/bin/env bash
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
USER_HOME=$HOME
[[ -n "${SUDO_USER}" ]] && USER_HOME="$(eval "echo ~${SUDO_USER}")"
. ${SHRC_D:-$SCRIPT_DIR}/01_util.functions
set -e
JSON=0
if [[ $# -gt 0 && "$1" =~ ^-- ]]; then
if [[ "$1" == "--help" ]]; then
cat <<USAGE
Usage:
./$(basename $0) --help
sudo ./$(basename $0) <pvc-search-pattern>
sudo ./$(basename $0) <pvc-name> <restore-from> [<tmp-dest>]
NOTE:
DBG=' ' will add debug output
without ZFS_DO=' ' zfs operations will not happen.
Description:
<pvc-search-pattern>
a simple match pattern, that will list any matching pvc names
<pvc-name>
Must match a unique pvc name, most commonly these are
<app-name>-config or <app-name>-data.
<restore-from>
  zfs path to the dataset contianing the restore data
<tmp-dest> (optional)
default value for this is:
\${ZFS_POOL\}/backup/tmp-\${APP_NAME\}-\${PVC\}
available variables are:
NAME,APP_NAME,PVC,ZFS_POOL
Examples:
List all PVCs ending with either '-data' or '-config':
sudo ./$(basename $0) '-(data|config)$'
Replace gitea-data's pvc with the one stored in tank/backup/gitea/pvc-backup
preserving the current gitea-data pvc in the default location:
tank/backup/tmp-gitea-data-pvc-... :
sudo ./$(basename $0) 'gitea-data' 'tank/backup/gitea/pvc-backup'
USAGE
exit 0
elif [[ "$1" == "--json" ]]; then
JSON=1
fi
shift
fi
require_root
PVCS="$(
k3s kubectl get persistentvolume --output json \
| jq '
.items[]
| select( .spec.claimRef.name | test("'"${1}"'") )
| {
name: .spec.claimRef.name
,app: .spec.claimRef.namespace | sub("ix-"; "")
,pvc: .spec.csi.volumeHandle
,zfs_pvc: "\(
.spec.csi.volumeAttributes."openebs.io/poolname"
)/\(
.spec.csi.volumeHandle
)"
,zfs_pool:
.spec.csi.volumeAttributes."openebs.io/poolname"
| split("/")[0]
#,raw: .
}
'
)"
DISPLAY_ONLY=0
LEN="$(jq -s 'length' <<<"$PVCS")"
if [[ $# -eq 1 || "$LEN" -ne 1 ]]; then
DISPLAY_ONLY=1
fi
if [[ "$LEN" -eq 0 ]]; then
PVCS='"ERROR: EMPTY query results"'
fi
if [[ "${DISPLAY_ONLY}" != 0 ]]; then
jq -r <<<"$PVCS"
exit 0
fi
ENV="$(
<<<"$PVCS" jq -r "[
\"NAME='\(.name)'\"
,\"APP_NAME='\(.app)'\"
,\"PVC='\(.pvc)'\"
,\"ZFS_PVC='\(.zfs_pvc)'\"
,\"ZFS_POOL='\(.zfs_pool)'\"
] | join (\"\n\")
"
)"
${DBG:-:} echo "$ENV" 1>&2
eval $ENV
TMP_DEST="${3:-\${ZFS_POOL\}/backup/tmp-\${APP_NAME\}-\${PVC\}}"
${DBG:-:} echo "$TMP_DEST" 1>&2
eval "TMP_DEST=\"${TMP_DEST}\""
${DBG:-:} echo "$TMP_DEST" 1>&2
if [[ -z "$(type -fp zfs)" ]]; then
printf "ERROR: zfs is not a valid command (is your PATH correct?)\n" 1>&2
exit 2
fi
VALIDATE=()
zfs list -Ho name "$ZFS_PVC" >/dev/null 2>&1 || VALIDATE=( "${VALIDATE[@]}"
"ZFS_PVC '$ZFS_PVC' cannot be found")
zfs list -Ho name "${2}" >/dev/null 2>&1 || VALIDATE=( "${VALIDATE[@]}"
"Restore source '${2}' cannot be found") || true
zfs list -Ho name "${TMP_DEST%/*}" >/dev/null 2>&1 || VALIDATE=( "${VALIDATE[@]}"
"Parent of temp-dset '${TMP_DEST%/*}' cannot be found")
zfs list -Ho name "$TMP_DEST" >/dev/null 2>&1 && VALIDATE=( "${VALIDATE[@]}"
"Temp dest '${TMP_DEST}' already exists") || true
if [[ ${#VALIDATE[@]} -ne 0 ]]; then
${DBG:-:} echo "" 1>&2
printf 'ERROR: %s\n' "${VALIDATE[@]}" 1>&2
exit 1
fi
printf '%s\n' \
"Performing the following actions:" \
" zfs rename '$ZFS_PVC' '${TMP_DEST}'" \
" zfs rename '${2}' '$ZFS_PVC'" \
'' '' \
'To revert these changes manualy run:' \
" sudo zfs rename '$ZFS_PVC' '${2}' " \
" sudo zfs rename '${TMP_DEST}' '$ZFS_PVC' " \
'' ''
${ZFS_DO:-:} zfs rename "$ZFS_PVC" "${TMP_DEST}"
${ZFS_DO:-:} zfs rename "${2}" "$ZFS_PVC"