truestuff/work-the-pvc

146 lines
4.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#! /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"