6 Verify that the CTDB_NFS_SKIP_SHARE_CHECK configuration option is respected.
8 We create a file in /etc/ctdb/rc.local.d/ that creates a function
9 called exportfs. This effectively hooks the exportfs command,
10 allowing us to provide a fake list of shares to check or not check.
12 We create another file in the same directory to set and unset the
13 CTDB_NFS_SKIP_SHARE_CHECK option, utilising the shell's "readonly"
14 built-in to ensure that our value for the option is used.
18 * An active CTDB cluster with at least 2 nodes with public addresses.
20 * Test must be run on a real or virtual cluster rather than against
21 local daemons. There is nothing intrinsic to this test that forces
22 this - it is because tests run against local daemons don't use the
27 1. Verify that the cluster is healthy.
28 2. Determine a timeout for state changes by adding MonitorInterval
29 and EventScriptTimeout.
30 3. Create a temporary directory on the test node using mktemp,
31 remember the name in $mydir.
32 4. On the test node create an executable file
33 /etc/ctdb/rc.local.d/fake-exportfs that contains a definiton for
34 the function exportfs, which prints a share definition for a
35 directory $mydir/foo (which does not currently exist).
36 5. On the test node create an executable file
37 /etc/ctdb/rc.local.d/nfs-skip-share-check that replaces the
38 loadconfig() function by one with equivalent functionality, but
39 which also sets CTDB_NFS_SKIP_SHARE_CHECK="no" if loading
41 6. Wait for the test node to become unhealthy.
42 7. Create the directory $mydir/foo.
43 8. Wait for the test node to become healthy.
44 9. Modify /etc/ctdb/rc.local.d/nfs-skip-share-check so that it sets
45 CTDB_NFS_SKIP_SHARE_CHECK to "yes".
46 10. Remove the directory $mydir/foo.
47 11. Wait for a monitor event and confirm that the the node is still
52 * When an NFS share directory is missing CTDB should only mark a node
53 as unhealthy if CTDB_NFS_SKIP_SHARE_CHECK is set to "no".
57 . "${TEST_SCRIPTS_DIR}/integration.bash"
63 ctdb_test_check_real_cluster
67 select_test_node_and_ips
69 # We need this for later, so we know how long to sleep.
70 try_command_on_node $test_node $CTDB getvar MonitorInterval
71 monitor_interval=${out#*= }
72 try_command_on_node $test_node $CTDB getvar EventScriptTimeout
73 event_script_timeout=${out#*= }
75 monitor_timeout=$(($monitor_interval + $event_script_timeout))
77 echo "Using timeout of ${monitor_timeout}s (MonitorInterval + EventScriptTimeout)..."
80 mydir=$(onnode -q $test_node mktemp -d)
81 rc_local_d="${CTDB_BASE:-/etc/ctdb}/rc.local.d"
85 ctdb_test_eventscript_uninstall
86 onnode -q $test_node "rm -f $mydir/*"
87 onnode -q $test_node "rmdir --ignore-fail-on-non-empty $mydir"
88 onnode -q $test_node "rm -f \"$rc_local_d/\"*"
89 onnode -q $test_node "rmdir --ignore-fail-on-non-empty \"$rc_local_d\""
92 ctdb_test_exit_hook_add my_exit_hook
94 ctdb_test_eventscript_install
98 try_command_on_node -v $test_node "mkdir -p \"$rc_local_d\""
100 f="$rc_local_d/fake-exportfs"
101 echo "Installing \"$f\"..."
102 try_command_on_node $test_node "echo \"function exportfs () { echo \\\"$foo_dir 127.0.0.1/32(rw)\\\" ; }\" >\"$f\" ; chmod +x \"$f\""
104 n="$rc_local_d/nfs-skip-share-check"
105 n_contents='loadconfig() {
108 if [ "$1" = "ctdb" -o "$1" = "nfs" ] ; then
109 CTDB_NFS_SKIP_SHARE_CHECK=no
113 echo "Installing \"$n\" with CTDB_NSF_SKIP_SHARE_CHECK=no..."
114 try_command_on_node $test_node "echo '$n_contents' >\"$n\" ; chmod +x \"$n\""
116 wait_until_node_has_status $test_node unhealthy $monitor_timeout
118 try_command_on_node -v $test_node "mkdir $foo_dir"
120 wait_until_node_has_status $test_node healthy $monitor_timeout
122 echo "Re-installing \"$n\" with CTDB_NFS_SKIP_SHARE_CHECK=yes..."
123 try_command_on_node $test_node "echo '${n_contents/=no/=yes}' >\"$n\" ; chmod +x \"$n\""
125 try_command_on_node -v $test_node "rmdir $foo_dir"
127 wait_for_monitor_event $test_node
129 wait_until_node_has_status $test_node healthy 1