Merge pull request #174 from phreaker0/tests
implemented a simple test which will take snapshots over a whole year…
This commit is contained in:
commit
50bd897cb7
|
@ -0,0 +1,55 @@
|
|||
#!/bin/bash
|
||||
set -x
|
||||
|
||||
# this test will take hourly, daily and monthly snapshots
|
||||
# for the whole year of 2017 in the timezone Europe/Vienna
|
||||
# sanoid is run hourly and no snapshots are pruned
|
||||
|
||||
. ../common/lib.sh
|
||||
|
||||
POOL_NAME="sanoid-test-1"
|
||||
POOL_TARGET="" # root
|
||||
RESULT="/tmp/sanoid_test_result"
|
||||
RESULT_CHECKSUM="aa15e5595b0ed959313289ecb70323dad9903328ac46e881da5c4b0f871dd7cf"
|
||||
|
||||
# UTC timestamp of start and end
|
||||
START="1483225200"
|
||||
END="1514761199"
|
||||
|
||||
# prepare
|
||||
setup
|
||||
checkEnvironment
|
||||
disableTimeSync
|
||||
|
||||
# set timezone
|
||||
ln -sf /usr/share/zoneinfo/Europe/Vienna /etc/localtime
|
||||
|
||||
timestamp=$START
|
||||
|
||||
mkdir -p "${POOL_TARGET}"
|
||||
truncate -s 5120M "${POOL_TARGET}"/zpool.img
|
||||
|
||||
zpool create -f "${POOL_NAME}" "${POOL_TARGET}"/zpool.img
|
||||
|
||||
function cleanUp {
|
||||
zpool export "${POOL_NAME}"
|
||||
}
|
||||
|
||||
# export pool in any case
|
||||
trap cleanUp EXIT
|
||||
|
||||
while [ $timestamp -le $END ]; do
|
||||
date --utc --set @$timestamp; date; "${SANOID}" --cron --verbose
|
||||
timestamp=$((timestamp+3600))
|
||||
done
|
||||
|
||||
saveSnapshotList "${POOL_NAME}" "${RESULT}"
|
||||
|
||||
# hourly daily monthly
|
||||
verifySnapshotList "${RESULT}" 8759 366 12 "${RESULT_CHECKSUM}"
|
||||
|
||||
# hourly count should be 8760 but one hour get's lost because of DST
|
||||
|
||||
# daily count should be 365 but one additional daily is taken
|
||||
# because the DST change leads to a day with 25 hours
|
||||
# which will trigger an additional daily snapshot
|
|
@ -0,0 +1,10 @@
|
|||
[sanoid-test-1]
|
||||
use_template = production
|
||||
|
||||
[template_production]
|
||||
hourly = 36
|
||||
daily = 30
|
||||
monthly = 3
|
||||
yearly = 0
|
||||
autosnap = yes
|
||||
autoprune = no
|
|
@ -0,0 +1,107 @@
|
|||
#!/bin/bash
|
||||
|
||||
function setup {
|
||||
export LANG=C
|
||||
export LANGUAGE=C
|
||||
export LC_ALL=C
|
||||
|
||||
export SANOID="../../sanoid"
|
||||
|
||||
# make sure that there is no cache file
|
||||
rm -f /var/cache/sanoidsnapshots.txt
|
||||
|
||||
# install needed sanoid configuration files
|
||||
[ -f sanoid.conf ] && cp sanoid.conf /etc/sanoid/sanoid.conf
|
||||
cp ../../sanoid.defaults.conf /etc/sanoid/sanoid.defaults.conf
|
||||
}
|
||||
|
||||
function checkEnvironment {
|
||||
ASK=1
|
||||
|
||||
which systemd-detect-virt > /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
systemd-detect-virt --vm > /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
# we are in a vm
|
||||
ASK=0
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $ASK -eq 1 ]; then
|
||||
set +x
|
||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
||||
echo "you should be running this test in a"
|
||||
echo "dedicated vm, as it will mess with your system!"
|
||||
echo "Are you sure you wan't to continue? (y)"
|
||||
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
||||
set -x
|
||||
|
||||
read -n 1 c
|
||||
if [ "$c" != "y" ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function disableTimeSync {
|
||||
# disable ntp sync
|
||||
which timedatectl > /dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
timedatectl set-ntp 0
|
||||
fi
|
||||
}
|
||||
|
||||
function saveSnapshotList {
|
||||
POOL_NAME="$1"
|
||||
RESULT="$2"
|
||||
|
||||
zfs list -t snapshot -o name -Hr "${POOL_NAME}" | sort > "${RESULT}"
|
||||
|
||||
# clear the seconds for comparing
|
||||
sed -i 's/\(autosnap_[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_[0-9][0-9]:[0-9][0-9]:\)[0-9][0-9]_/\100_/g' "${RESULT}"
|
||||
}
|
||||
|
||||
function verifySnapshotList {
|
||||
RESULT="$1"
|
||||
HOURLY_COUNT=$2
|
||||
DAILY_COUNT=$3
|
||||
MONTHLY_COUNT=$4
|
||||
CHECKSUM="$5"
|
||||
|
||||
failed=0
|
||||
message=""
|
||||
|
||||
hourly_count=$(grep -c "autosnap_.*_hourly" < "${RESULT}")
|
||||
daily_count=$(grep -c "autosnap_.*_daily" < "${RESULT}")
|
||||
monthly_count=$(grep -c "autosnap_.*_monthly" < "${RESULT}")
|
||||
|
||||
if [ "${hourly_count}" -ne "${HOURLY_COUNT}" ]; then
|
||||
failed=1
|
||||
message="${message}hourly snapshot count is wrong: ${hourly_count}\n"
|
||||
fi
|
||||
|
||||
if [ "${daily_count}" -ne "${DAILY_COUNT}" ]; then
|
||||
failed=1
|
||||
message="${message}daily snapshot count is wrong: ${daily_count}\n"
|
||||
fi
|
||||
|
||||
if [ "${monthly_count}" -ne "${MONTHLY_COUNT}" ]; then
|
||||
failed=1
|
||||
message="${message}monthly snapshot count is wrong: ${monthly_count}\n"
|
||||
fi
|
||||
|
||||
checksum=$(sha256sum "${RESULT}" | cut -d' ' -f1)
|
||||
if [ "${checksum}" != "${CHECKSUM}" ]; then
|
||||
failed=1
|
||||
message="${message}result checksum mismatch\n"
|
||||
fi
|
||||
|
||||
if [ "${failed}" -eq 0 ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "TEST FAILED:" >&2
|
||||
echo -n -e "${message}" >&2
|
||||
|
||||
exit 1
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
#!/bin/bash
|
||||
|
||||
# run's all the available tests
|
||||
|
||||
for test in */; do
|
||||
if [ ! -x "${test}/run.sh" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
testName="${test%/}"
|
||||
|
||||
LOGFILE=/tmp/sanoid_test_run_"${testName}".log
|
||||
|
||||
pushd . > /dev/null
|
||||
|
||||
echo -n "Running test ${testName} ... "
|
||||
cd "${test}"
|
||||
echo | bash run.sh > "${LOGFILE}" 2>&1
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "[PASS]"
|
||||
else
|
||||
echo "[FAILED] (see ${LOGFILE})"
|
||||
fi
|
||||
|
||||
popd > /dev/null
|
||||
done
|
Loading…
Reference in New Issue