summaryrefslogtreecommitdiffstats
path: root/ctdb/tests/INTEGRATION/failover/pubips.020.moveip.sh
blob: 8daf3f516741d68e2405444af357bdb6fbc67310 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env bash

# Verify that 'ctdb moveip' allows movement of public IPs between nodes

# This test does not do any network level checks to make sure IP
# addresses are actually on interfaces.  It just consults "ctdb ip".

# To work, this test ensures that IPAllocAlgorithm is not set to 0
# (Deterministic IPs) and sets NoIPFailback.

. "${TEST_SCRIPTS_DIR}/integration.bash"

set -e

ctdb_test_init

select_test_node_and_ips

sanity_check_ips ()
{
    echo "Sanity checking IPs..."

    local x ipp prev
    prev=""
    while read x ipp ; do
	[ "$ipp" = "-1" ] && break
	if [ -n "$prev" -a "$ipp" != "$prev" ] ; then
	    echo "OK"
	    return 0
	fi
	prev="$ipp"
    done <"$outfile"

    echo "BAD: a node was -1 or IPs are only assigned to one node:"
    cat "$outfile"
    echo "Are you running an old version of CTDB?"
    return 1
}

sanity_check_ips

# Find a target node - it must be willing to host $test_ip

# $test_node set above by select_test_node_and_ips()
# shellcheck disable=SC2154
try_command_on_node "$test_node" "$CTDB listnodes | wc -l"
num_nodes="$out"
to_node=""
for i in $(seq 0 $(($num_nodes - 1)) ) ; do
    [ $i -ne $test_node ] || continue
    all_ips_on_node $i
    while read ip x ; do
	if [ "$ip" = "$test_ip" ] ; then
	    to_node="$i"
	    break 2
	fi
    done <"$outfile"
done

if [ -z "$to_node" ] ; then
    echo "Unable to find target node"
    exit 1
fi

echo "Target node is ${to_node}"

echo "Setting IPAllocAlgorithm=2 to avoid Deterministic IPs..."
try_command_on_node -q all $CTDB setvar IPAllocAlgorithm 2

echo "Turning on NoIPFailback..."
try_command_on_node -q all $CTDB setvar NoIPFailback 1

echo "Attempting to move ${test_ip} from node ${test_node} to node ${to_node}"
try_command_on_node $test_node $CTDB moveip $test_ip $to_node
wait_until_ips_are_on_node '!' $test_node $test_ip
wait_until_ips_are_on_node $to_node $test_ip