Skip to content

Commit e1dc5c0

Browse files
author
Gina
committed
fix(rabbitmq): support both restore target path shapes
1 parent 80f98fe commit e1dc5c0

2 files changed

Lines changed: 96 additions & 3 deletions

File tree

addons/rabbitmq/dataprotection/restore.sh

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,26 @@ set -Eeuo pipefail
33

44
DATA_DIR="${DATA_DIR:-/var/lib/rabbitmq}"
55
# Backup jobs inject DP_TARGET_POD_NAME. Volume-populator AsDataSource prepareData
6-
# may only inject DP_TARGET_RELATIVE_PATH (= pod identity / archive stem). Prefer
7-
# POD_NAME when present; otherwise accept RELATIVE_PATH so KB12 dataSource restore works.
8-
TARGET_POD_NAME="${DP_TARGET_POD_NAME:-${DP_TARGET_RELATIVE_PATH:?DP_TARGET_POD_NAME or DP_TARGET_RELATIVE_PATH is required}}"
6+
# may only inject DP_TARGET_RELATIVE_PATH, either as <pod-name> or
7+
# <target-name>/<pod-name>. DP_BACKUP_BASE_PATH is already scoped to that path,
8+
# so the archive key always uses only the final pod-name segment.
9+
if [ -n "${DP_TARGET_POD_NAME:-}" ]; then
10+
TARGET_POD_NAME="${DP_TARGET_POD_NAME}"
11+
else
12+
TARGET_RELATIVE_PATH="${DP_TARGET_RELATIVE_PATH:?DP_TARGET_POD_NAME or DP_TARGET_RELATIVE_PATH is required}"
13+
case "${TARGET_RELATIVE_PATH}" in
14+
/*|*/|*/*/*)
15+
echo "ERROR: DP_TARGET_RELATIVE_PATH must be one pod segment or <target-name>/<target-pod-name>" >&2
16+
exit 1
17+
;;
18+
*/*)
19+
TARGET_POD_NAME="${TARGET_RELATIVE_PATH##*/}"
20+
;;
21+
*)
22+
TARGET_POD_NAME="${TARGET_RELATIVE_PATH}"
23+
;;
24+
esac
25+
fi
926
ARCHIVE_NAME="${TARGET_POD_NAME}.tar.zst"
1027

1128
[ -n "${DP_DATASAFED_BIN_PATH:-}" ] && export PATH="${PATH}:${DP_DATASAFED_BIN_PATH}"

addons/rabbitmq/scripts-ut-spec/backup_restore_contract_spec.sh

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ DATASAFED
132132
PATH="${bin_dir}:${PATH}" \
133133
DATA_DIR="${data_dir}" \
134134
DP_TARGET_POD_NAME="rabbitmq-cluster-rabbitmq-0" \
135+
DP_TARGET_RELATIVE_PATH="ignored/extra/depth" \
135136
DP_BACKUP_BASE_PATH="/backup/base" \
136137
FAKE_ARCHIVE_PATH="${tmp_dir}/payload.tar" \
137138
bash "${restore_script}"
@@ -191,6 +192,81 @@ DATASAFED
191192
The stdout should include "restore prepareData completed"
192193
End
193194

195+
It "uses the final pod segment from a two-segment volume-populator target path"
196+
When call bash -c '
197+
set -Eeuo pipefail
198+
restore_script="$1"
199+
tmp_dir="$(mktemp -d)"
200+
trap "rm -rf \"${tmp_dir}\"" EXIT
201+
data_dir="${tmp_dir}/data"
202+
bin_dir="${tmp_dir}/bin"
203+
payload_dir="${tmp_dir}/payload"
204+
mkdir -p "${data_dir}" "${bin_dir}" "${payload_dir}"
205+
printf "restored-via-relative\n" > "${payload_dir}/restored.txt"
206+
tar -cf "${tmp_dir}/payload.tar" -C "${payload_dir}" .
207+
cat > "${bin_dir}/datasafed" <<'"'"'DATASAFED'"'"'
208+
#!/bin/bash
209+
set -e
210+
case "$1" in
211+
list)
212+
test "${DATASAFED_BACKEND_BASE_PATH}" = "${EXPECTED_BACKUP_BASE_PATH}"
213+
printf "%s\n" "${EXPECTED_TARGET_POD_NAME}.tar.zst"
214+
;;
215+
pull)
216+
cat "${FAKE_ARCHIVE_PATH}"
217+
;;
218+
*)
219+
echo "unexpected datasafed command: $*" >&2
220+
exit 1
221+
;;
222+
esac
223+
DATASAFED
224+
printf "#!/bin/bash\nexit 0\n" > "${bin_dir}/chown"
225+
chmod +x "${bin_dir}/datasafed" "${bin_dir}/chown"
226+
unset DP_TARGET_POD_NAME || true
227+
PATH="${bin_dir}:${PATH}" \
228+
DATA_DIR="${data_dir}" \
229+
DP_TARGET_RELATIVE_PATH="rabbitmq/rmq-br-5400-rabbitmq-2" \
230+
DP_BACKUP_BASE_PATH="/backup/base/rabbitmq/rmq-br-5400-rabbitmq-2" \
231+
EXPECTED_BACKUP_BASE_PATH="/backup/base/rabbitmq/rmq-br-5400-rabbitmq-2" \
232+
EXPECTED_TARGET_POD_NAME="rmq-br-5400-rabbitmq-2" \
233+
FAKE_ARCHIVE_PATH="${tmp_dir}/payload.tar" \
234+
bash "${restore_script}"
235+
test -f "${data_dir}/restored.txt"
236+
test ! -f "${data_dir}/.kb-data-protection"
237+
' _ "${restore_script}"
238+
The status should be success
239+
The stdout should include "restore prepareData completed"
240+
End
241+
242+
It "fails closed when the target relative path has an empty final segment"
243+
When call bash -c '
244+
set -Eeuo pipefail
245+
restore_script="$1"
246+
unset DP_TARGET_POD_NAME || true
247+
DATA_DIR="$(mktemp -d)" \
248+
DP_TARGET_RELATIVE_PATH="rabbitmq/" \
249+
DP_BACKUP_BASE_PATH="/backup/base/rabbitmq" \
250+
bash "${restore_script}"
251+
' _ "${restore_script}"
252+
The status should be failure
253+
The stderr should include "must be one pod segment or <target-name>/<target-pod-name>"
254+
End
255+
256+
It "fails closed when the target relative path has extra depth"
257+
When call bash -c '
258+
set -Eeuo pipefail
259+
restore_script="$1"
260+
unset DP_TARGET_POD_NAME || true
261+
DATA_DIR="$(mktemp -d)" \
262+
DP_TARGET_RELATIVE_PATH="repo/rabbitmq/rmq-br-5400-rabbitmq-2" \
263+
DP_BACKUP_BASE_PATH="/backup/base/repo/rabbitmq/rmq-br-5400-rabbitmq-2" \
264+
bash "${restore_script}"
265+
' _ "${restore_script}"
266+
The status should be failure
267+
The stderr should include "must be one pod segment or <target-name>/<target-pod-name>"
268+
End
269+
194270
It "fails closed when neither DP_TARGET_POD_NAME nor DP_TARGET_RELATIVE_PATH is set"
195271
When call bash -c '
196272
set -Eeuo pipefail

0 commit comments

Comments
 (0)