--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "No backup directory set, does nothing"
+
+setup
+
+ok_null
+simple_test
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "Backup directory set, no persistent databases attached"
+
+setup
+
+backup_dir="${CTDB_TEST_TMP_DIR}/backup"
+mkdir "$backup_dir"
+
+setup_date "20240101010101"
+
+ctdb attach foo_volatile.tdb
+
+setup_script_options <<EOF
+CTDB_PERSISTENT_DB_BACKUP_DIR=${backup_dir}
+EOF
+
+prefix="ctdb-persistent-db-backup-$(date)"
+backup_file="${backup_dir}/${prefix}.tgz"
+
+ok <<EOF
+Created backup tarball ${backup_file}
+EOF
+simple_test
+
+ok <<EOF
+${prefix}/
+EOF
+simple_test_command tar -t -f "$backup_file"
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "Backup directory set, several databases attached"
+
+setup
+
+backup_dir="${CTDB_TEST_TMP_DIR}/backup"
+mkdir "$backup_dir"
+
+setup_date "20240101010101"
+
+ctdb attach foo_volatile.tdb
+ctdb attach foo_persistent_001.tdb persistent
+ctdb attach foo_persistent_002.tdb persistent
+ctdb attach foo_persistent_003.tdb persistent
+
+setup_script_options <<EOF
+CTDB_PERSISTENT_DB_BACKUP_DIR=${backup_dir}
+EOF
+
+prefix="ctdb-persistent-db-backup-$(date)"
+backup_file="${backup_dir}/${prefix}.tgz"
+
+ok <<EOF
+Database backed up to foo_persistent_001.tdb.backup
+Database backed up to foo_persistent_002.tdb.backup
+Database backed up to foo_persistent_003.tdb.backup
+Created backup tarball ${backup_file}
+EOF
+simple_test
+
+ok <<EOF
+${prefix}/
+${prefix}/foo_persistent_001.tdb.backup
+${prefix}/foo_persistent_002.tdb.backup
+${prefix}/foo_persistent_003.tdb.backup
+EOF
+simple_test_command sh -c "tar -t -f '$backup_file' | sort"
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "Backup directory set, several databases attached, directory missing"
+
+setup
+
+backup_dir="${CTDB_TEST_TMP_DIR}/backup"
+
+setup_date "20240101010101"
+
+ctdb attach foo_volatile.tdb
+ctdb attach foo_persistent_001.tdb persistent
+ctdb attach foo_persistent_002.tdb persistent
+ctdb attach foo_persistent_003.tdb persistent
+
+setup_script_options <<EOF
+CTDB_PERSISTENT_DB_BACKUP_DIR=${backup_dir}
+EOF
+
+prefix="ctdb-persistent-db-backup-$(date)"
+backup_file="${backup_dir}/${prefix}.tgz"
+
+ok <<EOF
+Creating CTDB_PERSISTENT_DB_BACKUP_DIR=${backup_dir}
+Database backed up to foo_persistent_001.tdb.backup
+Database backed up to foo_persistent_002.tdb.backup
+Database backed up to foo_persistent_003.tdb.backup
+Created backup tarball ${backup_file}
+EOF
+simple_test
+
+ok <<EOF
+${prefix}/
+${prefix}/foo_persistent_001.tdb.backup
+${prefix}/foo_persistent_002.tdb.backup
+${prefix}/foo_persistent_003.tdb.backup
+EOF
+simple_test_command sh -c "tar -t -f '$backup_file' | sort"
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "Backup directory set, several databases attached, not leader"
+
+setup
+
+ctdb_set_leader 1
+
+backup_dir="${CTDB_TEST_TMP_DIR}/backup"
+mkdir "$backup_dir"
+
+setup_date "20240101010101"
+
+ctdb attach foo_volatile.tdb
+ctdb attach foo_persistent_001.tdb persistent
+ctdb attach foo_persistent_002.tdb persistent
+ctdb attach foo_persistent_003.tdb persistent
+
+setup_script_options <<EOF
+CTDB_PERSISTENT_DB_BACKUP_DIR=${backup_dir}
+EOF
+
+ok_null
+simple_test
--- /dev/null
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "Backup directory set, several databases attached, 2 runs"
+
+setup
+
+backup_dir="${CTDB_TEST_TMP_DIR}/backup"
+mkdir "$backup_dir"
+
+setup_date "20240101010101"
+
+ctdb attach foo_volatile.tdb
+ctdb attach foo_persistent_001.tdb persistent
+ctdb attach foo_persistent_002.tdb persistent
+ctdb attach foo_persistent_003.tdb persistent
+
+setup_script_options <<EOF
+CTDB_PERSISTENT_DB_BACKUP_DIR=${backup_dir}
+EOF
+
+prefix="ctdb-persistent-db-backup-$(date)"
+backup_file="${backup_dir}/${prefix}.tgz"
+
+ok <<EOF
+Database backed up to foo_persistent_001.tdb.backup
+Database backed up to foo_persistent_002.tdb.backup
+Database backed up to foo_persistent_003.tdb.backup
+Created backup tarball ${backup_file}
+EOF
+simple_test
+
+# 2nd attempt does not create a backup, since previous one is too new
+ok_null
+simple_test
fi
setup_ctdb_base "$CTDB_TEST_TMP_DIR" "etc-ctdb" \
+ ctdb-backup-persistent-tdbs.sh \
debug_locks.sh \
functions \
nfs-checks.d \
fi
}
+ctdb_set_leader()
+{
+ export FAKE_CTDB_LEADER="$1"
+ echo "Setting up leader ${FAKE_CTDB_LEADER}"
+}
+
ctdb_get_interfaces()
{
ctdb ifaces -X | awk -F'|' 'FNR > 1 {print $2}' | xargs
echo "${FAKE_CTDB_PNN:-0}"
}
+ctdb_leader()
+{
+ # Defaults to 0
+ echo "${FAKE_CTDB_LEADER:-${FAKE_CTDB_PNN:-0}}"
+}
+
######################################################################
FAKE_CTDB_NODE_STATE="$FAKE_CTDB_STATE/node-state"
######################################################################
+_fake_db_prefix_dir="${CTDB_TEST_TMP_DIR}/fake-ctdb/fake-tdb"
_t_setup()
{
- _t_dir="${CTDB_TEST_TMP_DIR}/fake-ctdb/fake-tdb/$1"
+ _db="$1"
+ _type="${2:-volatile}"
+
+ case "$2" in
+ persistent)
+ _t_dir="${_fake_db_prefix_dir}/persistent/$1"
+ ;;
+ auto)
+ _t_dir="${_fake_db_prefix_dir}/persistent/$1"
+ if [ ! -d "$_t_dir" ]; then
+ _t_dir="${_fake_db_prefix_dir}/volatile/$1"
+ if [ ! -d "$_t_dir" ]; then
+ die 'Unknown database for "auto"'
+ fi
+ fi
+ ;;
+ *)
+ _t_dir="${_fake_db_prefix_dir}/volatile/$1"
+ esac
+
mkdir -p "$_t_dir"
}
ctdb_attach()
{
- _t_setup "$1"
+ _t_setup "$1" "$2"
}
ctdb_pstore()
{
- _t_setup "$1"
+ _t_setup "$1" "persistent"
_t_put "$2" "$3"
}
ctdb_pdelete()
{
- _t_setup "$1"
+ _t_setup "$1" "persistent"
_t_del "$2"
}
ctdb_pfetch()
{
- _t_setup "$1"
+ _t_setup "$1" "persistent"
_t_get "$2" >"$3" 2>/dev/null
}
ctdb_ptrans()
{
- _t_setup "$1"
+ _t_setup "$1" "persistent"
while IFS="" read -r _line; do
_k=$(echo "$_line" | sed -n -e 's@^"\([^"]*\)" "[^"]*"$@\1@p')
done
}
+getdbmap_1()
+{
+ _path="$1"
+ _persistent="${2:-0}"
+
+ _mypnn=$(ctdb_pnn)
+ _tpath="${_path}.${_mypnn}"
+
+ _name=$(basename "$_path")
+ _id=$(echo "${_name}:${_path}" |
+ od -A n -t x4 |
+ tr '[:lower:]' '[:upper:]' |
+ sed -n -e 's| ||g' -e '1s|\(........\).*|0x\1|p')
+
+ echo "|${_id}|${_name}|${_tpath}|${_persistent}|0|0|0|0|"
+}
+
+ctdb_getdbmap()
+{
+ if ! $machine_readable; then
+ not_implemented "getdbmap without -X"
+ fi
+
+ echo '|ID|Name|Path|Persistent|Sticky|Unhealthy|Readonly|Replicated|'
+
+ for i in "${_fake_db_prefix_dir}/volatile/"* ; do
+ if [ ! -d "$i" ]; then
+ continue
+ fi
+ getdbmap_1 "$i" 0
+ done
+
+ for i in "${_fake_db_prefix_dir}/persistent/"* ; do
+ if [ ! -d "$i" ]; then
+ continue
+ fi
+ getdbmap_1 "$i" 1
+ done
+}
+
ctdb_catdb()
{
- _t_setup "$1"
+ _t_setup "$1" "auto"
# This will break on keys with spaces but we don't have any of
# those yet.
echo "Dumped ${_count} records"
}
+ctdb_backupdb()
+{
+ _db="$1"
+ _file="$2"
+
+ if {
+ echo "Fake backup of ${_db}"
+ ctdb_catdb "$_db"
+ }>"$_file"; then
+ echo "Database backed up to ${_file}"
+ fi
+}
+
######################################################################
FAKE_CTDB_IFACES_DOWN="${FAKE_CTDB_STATE}/ifaces-down"