]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
ctdb-tests: Add persistent TDB backup tests
authorMartin Schwenke <mschwenke@ddn.com>
Wed, 10 Apr 2024 06:55:01 +0000 (16:55 +1000)
committerMartin Schwenke <martins@samba.org>
Fri, 30 Aug 2024 00:08:41 +0000 (00:08 +0000)
Signed-off-by: Martin Schwenke <mschwenke@ddn.com>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
Autobuild-User(master): Martin Schwenke <martins@samba.org>
Autobuild-Date(master): Fri Aug 30 00:08:41 UTC 2024 on atb-devel-224

ctdb/tests/UNIT/eventscripts/95.database.monitor.001.sh [new file with mode: 0755]
ctdb/tests/UNIT/eventscripts/95.database.monitor.002.sh [new file with mode: 0755]
ctdb/tests/UNIT/eventscripts/95.database.monitor.003.sh [new file with mode: 0755]
ctdb/tests/UNIT/eventscripts/95.database.monitor.004.sh [new file with mode: 0755]
ctdb/tests/UNIT/eventscripts/95.database.monitor.005.sh [new file with mode: 0755]
ctdb/tests/UNIT/eventscripts/95.database.monitor.006.sh [new file with mode: 0755]
ctdb/tests/UNIT/eventscripts/scripts/local.sh
ctdb/tests/UNIT/eventscripts/stubs/ctdb

diff --git a/ctdb/tests/UNIT/eventscripts/95.database.monitor.001.sh b/ctdb/tests/UNIT/eventscripts/95.database.monitor.001.sh
new file mode 100755 (executable)
index 0000000..c2de3e0
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "No backup directory set, does nothing"
+
+setup
+
+ok_null
+simple_test
diff --git a/ctdb/tests/UNIT/eventscripts/95.database.monitor.002.sh b/ctdb/tests/UNIT/eventscripts/95.database.monitor.002.sh
new file mode 100755 (executable)
index 0000000..4ab9a23
--- /dev/null
@@ -0,0 +1,31 @@
+#!/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"
diff --git a/ctdb/tests/UNIT/eventscripts/95.database.monitor.003.sh b/ctdb/tests/UNIT/eventscripts/95.database.monitor.003.sh
new file mode 100755 (executable)
index 0000000..ea6a1e6
--- /dev/null
@@ -0,0 +1,40 @@
+#!/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"
diff --git a/ctdb/tests/UNIT/eventscripts/95.database.monitor.004.sh b/ctdb/tests/UNIT/eventscripts/95.database.monitor.004.sh
new file mode 100755 (executable)
index 0000000..167eb12
--- /dev/null
@@ -0,0 +1,40 @@
+#!/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"
diff --git a/ctdb/tests/UNIT/eventscripts/95.database.monitor.005.sh b/ctdb/tests/UNIT/eventscripts/95.database.monitor.005.sh
new file mode 100755 (executable)
index 0000000..48a1421
--- /dev/null
@@ -0,0 +1,26 @@
+#!/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
diff --git a/ctdb/tests/UNIT/eventscripts/95.database.monitor.006.sh b/ctdb/tests/UNIT/eventscripts/95.database.monitor.006.sh
new file mode 100755 (executable)
index 0000000..6b9c7b8
--- /dev/null
@@ -0,0 +1,36 @@
+#!/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
index d47626472d464e26fcaeaebf850ffac9cff1362b..3f335ac1d16d924cef04f7e293e6dba85c65a3a2 100644 (file)
@@ -15,6 +15,7 @@ else
 fi
 
 setup_ctdb_base "$CTDB_TEST_TMP_DIR" "etc-ctdb" \
+       ctdb-backup-persistent-tdbs.sh \
        debug_locks.sh \
        functions \
        nfs-checks.d \
@@ -309,6 +310,12 @@ ctdb_set_pnn()
        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
index 2106e25673a7d975ccfea6ee58403b743bf44047..eb823fda4690d2a699f9e137fbc54d29066058d5 100755 (executable)
@@ -141,6 +141,12 @@ ctdb_pnn()
        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"
@@ -311,9 +317,29 @@ ctdb_nodestatus()
 
 ######################################################################
 
+_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"
 }
 
@@ -334,30 +360,30 @@ _t_del()
 
 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')
@@ -371,9 +397,49 @@ ctdb_ptrans()
        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.
@@ -397,6 +463,19 @@ EOF
        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"