[SCM] Samba Shared Repository - branch master updated

Amitay Isaacs amitay at samba.org
Tue Sep 23 02:32:04 MDT 2014


The branch, master has been updated
       via  93423cb ctdb-logging: Add forward declaration of debug_level
       via  3715432 ctdb-tests: Clean up some tests where IP movement is checked
       via  81a8758 ctdb-tests: Remove dependency on log ringbuffer from missing IP test
       via  e3089d7 ctdb-tests: Make all_ips_on_node() do what it should
       via  81213af ctdb-tests: Factor out new function get_test_ip_mask_and_iface()
       via  4b8cfe4 ctdb-tests: Simplify and rename wait_until_ips_are_on_nodeglob()
      from  8a6445d WHATSNEW: some fixes

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 93423cb1f594244e916e4ac3cb1d32220c48c172
Author: Martin Schwenke <martin at meltin.net>
Date:   Tue Sep 23 06:07:47 2014 +1000

    ctdb-logging: Add forward declaration of debug_level
    
    Warnings are currently produced when compiling Samba and
    ctdb_private.h is included.  A forward enum declaration avoids the
    warning.
    
    This is a temporary measure.  The log ringbuffer should be removed
    soon.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    
    Autobuild-User(master): Amitay Isaacs <amitay at samba.org>
    Autobuild-Date(master): Tue Sep 23 10:31:50 CEST 2014 on sn-devel-104

commit 371543207e8955d6665fcec03b261d80cde2401b
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Sep 12 13:20:43 2014 +1000

    ctdb-tests: Clean up some tests where IP movement is checked
    
    Some of this implements logic that exists in functions.  Some of it is
    overly complicated and potentially failure-prone.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 81a8758b9b24bbb7200be4682016f989b904bda8
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Sep 12 15:21:49 2014 +1000

    ctdb-tests: Remove dependency on log ringbuffer from missing IP test
    
    The log ringbuffer will probably be removed.  The test can be
    implemented just as reliably by checking IP assignments using "ctdb
    ip".
    
    Update wait_until_ips_are_on_node() to print a more useful log
    message.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit e3089d7da17e2f25d426005eca0fe55397f2689f
Author: Martin Schwenke <martin at meltin.net>
Date:   Wed Sep 17 20:34:39 2014 +1000

    ctdb-tests: Make all_ips_on_node() do what it should
    
    The "-n all" is wrong.
    
    Simplify the implementation and tighten up some uses of this function.
    
    _select_test_node_and_ips() can't use this function anymore.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 81213af32ae17eaae33f9d27c9b7ce63c84ce5df
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Sep 12 13:40:01 2014 +1000

    ctdb-tests: Factor out new function get_test_ip_mask_and_iface()
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 4b8cfe4847477e3cfdb3f4dd7070226a6604bc38
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Sep 12 13:34:51 2014 +1000

    ctdb-tests: Simplify and rename wait_until_ips_are_on_nodeglob()
    
    The glob functionality is unsed so simplify the code by removing it.
    Rename this function to wait_until_ips_are_on_node().  Update all
    calls.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

-----------------------------------------------------------------------

Summary of changes:
 ctdb/include/ctdb_private.h                    |    1 +
 ctdb/tests/complex/11_ctdb_delip_removes_ip.sh |   81 ++---------------
 ctdb/tests/scripts/integration.bash            |   78 +++++++++++++----
 ctdb/tests/simple/16_ctdb_config_add_ip.sh     |  111 +++---------------------
 ctdb/tests/simple/17_ctdb_config_delete_ip.sh  |   59 ++-----------
 ctdb/tests/simple/23_ctdb_moveip.sh            |   94 ++++++--------------
 ctdb/tests/simple/31_ctdb_disable.sh           |   35 ++------
 ctdb/tests/simple/32_ctdb_enable.sh            |   41 ++-------
 ctdb/tests/simple/41_ctdb_stop.sh              |   33 ++------
 ctdb/tests/simple/42_ctdb_continue.sh          |   37 ++-------
 ctdb/tests/simple/60_recoverd_missing_ip.sh    |   58 ++++---------
 11 files changed, 158 insertions(+), 470 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index 43daf36..02602e1 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -1461,6 +1461,7 @@ struct ctdb_get_log_addr {
 
 extern int log_ringbuf_size;
 
+enum debug_level;
 TDB_DATA ctdb_log_ringbuffer_collect_log(TALLOC_CTX *mem_ctx,
 					 enum debug_level max_level);
 void ctdb_collect_log(struct ctdb_context *ctdb, struct ctdb_get_log_addr *log_addr);
diff --git a/ctdb/tests/complex/11_ctdb_delip_removes_ip.sh b/ctdb/tests/complex/11_ctdb_delip_removes_ip.sh
index 043c345..d67cb07 100755
--- a/ctdb/tests/complex/11_ctdb_delip_removes_ip.sh
+++ b/ctdb/tests/complex/11_ctdb_delip_removes_ip.sh
@@ -5,36 +5,7 @@ test_info()
     cat <<EOF
 Verify that a node's public IP address can be deleted using 'ctdb deleteip'.
 
-Check that the address is actually deleted from the interface.
-
-Prerequisites:
-
-* An active CTDB cluster with at least 2 active nodes.
-
-* Test must be run on a real or virtual cluster rather than against
-  local daemons.  There is nothing intrinsic to this test that forces
-  this - it is because tests run against local daemons don't use the
-  regular eventscripts.  Local daemons put public addresses on
-  loopback, so we can't reliably test when IPs have moved between
-  nodes.
-
-Steps:
-
-1. Verify that the status on all of the ctdb nodes is 'OK'.
-2. Use 'ctdb ip' on one of the nodes to list the IP addresses being
-   served.
-3. Select an IP address being served by the node and check that it
-   actually appears on the interface it is supposed to be on.
-4. Delete the IP address using 'ctdb delip'.
-5. Verify that the deleted IP address is no longer listed using the
-   all_ips_on_node helper function.
-6. Verify that the deleted IP address no longer appears on the
-   interface it was on.
-
-Expected results:
-
-* 'ctdb delip' removes an IP address from the list of public IP
-  addresses being served by a node and from the network interface.
+This is an extended version of simple/17_ctdb_config_delete_ip.sh
 EOF
 }
 
@@ -51,55 +22,23 @@ cluster_is_healthy
 # Reset configuration
 ctdb_restart_when_done
 
-echo "Getting list of public IPs..."
-all_ips_on_node -v 0
-
-# Select an IP/node to remove.
-num_ips=$(echo "$out" | wc -l)
-num_to_remove=$(($RANDOM % $num_ips))
-
-# Find the details in the list.
-i=0
-while [ $i -le $num_to_remove ] ; do
-    read ip_to_remove test_node
-    i=$(($i + 1))
-done <<<"$out"
-
-echo "Determining interface for ${ip_to_remove} on ${test_node}."
-try_command_on_node $test_node "ctdb ip -Y -v"
-iface=$(echo "$out" | awk -F: -v ip=${ip_to_remove} -v pnn=${test_node} '$2 == ip && $3 == pnn { print $4 }')
-echo "$iface"
-[ -n "$iface" ]
-
-echo "Checking that node ${test_node} hosts ${ip_to_remove} on interface ${iface}..."
-try_command_on_node $test_node "ip addr show dev $iface | grep -E 'inet[[:space:]]*${ip_to_remove}/'"
-
-echo "Attempting to remove ${ip_to_remove} from node ${test_node}."
-try_command_on_node $test_node $CTDB delip $ip_to_remove
-
-echo "Sleeping..."
-sleep_for 1
+select_test_node_and_ips
+get_test_ip_mask_and_iface
 
-test_node_ips=""
-while read ip pnn ; do
-    [ "$pnn" = "$test_node" ] && \
-	test_node_ips="${test_node_ips}${test_node_ips:+ }${ip}"
-done <<<"$out" # bashism to avoid problem setting variable in pipeline.
+echo "Checking that node ${test_node} hosts ${test_ip} on interface ${iface}..."
+try_command_on_node $test_node "ip addr show dev $iface | grep -E 'inet[[:space:]]*${test_ip}/'"
 
-if [ "${test_node_ips/${ip_to_remove}}" = "$test_node_ips" ] ; then
-    echo "GOOD: That worked!"
-else
-    echo "BAD: The remove IP address is still there!"
-    testfailures=1
-fi
+echo "Attempting to remove ${test_ip} from node ${test_node}."
+try_command_on_node $test_node $CTDB delip $test_ip
+wait_until_ips_are_on_node '!' $test_node $test_ip
 
 timeout=60
 increment=5
 count=0
-echo "Waiting for ${ip_to_remove} to disappear from ${iface}..."
+echo "Waiting for ${test_ip} to disappear from ${iface}..."
 while : ; do
     try_command_on_node -v $test_node "ip addr show dev $iface"
-    if echo "$out" | grep -E 'inet[[:space:]]*${ip_to_remove}/'; then
+    if echo "$out" | grep -E 'inet[[:space:]]*${test_ip}/'; then
 	echo "Still there..."
 	if [ $(($count * $increment)) -ge $timeout ] ; then
 	    echo "BAD: Timed out waiting..."
diff --git a/ctdb/tests/scripts/integration.bash b/ctdb/tests/scripts/integration.bash
index dec60a2..1835949 100644
--- a/ctdb/tests/scripts/integration.bash
+++ b/ctdb/tests/scripts/integration.bash
@@ -152,7 +152,8 @@ sanity_check_ips ()
 	prev="$ipp"
     done <<<"$ips"
 
-    echo "BAD: a node was -1 or IPs are only assigned to one node"
+    echo "BAD: a node was -1 or IPs are only assigned to one node:"
+    echo "$ips"
     echo "Are you running an old version of CTDB?"
     return 1
 }
@@ -160,13 +161,15 @@ sanity_check_ips ()
 # This returns a list of "ip node" lines in $out
 all_ips_on_node()
 {
-    local node=$@
-    try_command_on_node $node "$CTDB ip -Y -n all | cut -d ':' -f1-3 | sed -e '1d' -e 's@^:@@' -e 's@:@ @g'"
+    local node="$1"
+    try_command_on_node $node \
+	"$CTDB ip -Y | awk -F: 'NR > 1 { print \$2, \$3 }'"
 }
 
 _select_test_node_and_ips ()
 {
-    all_ips_on_node 0
+    try_command_on_node any \
+	"$CTDB ip -Y -n all | awk -F: 'NR > 1 { print \$2, \$3 }'"
 
     test_node=""  # this matches no PNN
     test_node_ips=""
@@ -202,6 +205,25 @@ select_test_node_and_ips ()
     return 0
 }
 
+# Sets: mask, iface
+get_test_ip_mask_and_iface ()
+{
+    # Find the interface
+    try_command_on_node $test_node "$CTDB ip -v -Y | awk -F: -v ip=$test_ip '\$2 == ip { print \$4 }'"
+    iface="$out"
+
+    if [ -z "$TEST_LOCAL_DAEMONS" ] ; then
+	# Find the netmask
+	try_command_on_node $test_node ip addr show to $test_ip
+	mask="${out##*/}"
+	mask="${mask%% *}"
+    else
+	mask="24"
+    fi
+
+    echo "$test_ip/$mask is on $iface"
+}
+
 #######################################
 
 # Wait until either timeout expires or command succeeds.  The command
@@ -380,29 +402,31 @@ wait_until_node_has_status ()
 }
 
 # Useful for superficially testing IP failover.
-# IPs must be on nodes matching nodeglob.
-# If the first argument is '!' then the IPs must not be on nodes
-# matching nodeglob.
-ips_are_on_nodeglob ()
+# IPs must be on the given node.
+# If the first argument is '!' then the IPs must not be on the given node.
+ips_are_on_node ()
 {
     local negating=false
     if [ "$1" = "!" ] ; then
 	negating=true ; shift
     fi
-    local nodeglob="$1" ; shift
+    local node="$1" ; shift
     local ips="$*"
 
     local out
 
-    all_ips_on_node 1
+    all_ips_on_node $node
 
+    local check
     for check in $ips ; do
+	local ip pnn
 	while read ip pnn ; do
 	    if [ "$check" = "$ip" ] ; then
-		case "$pnn" in
-		    ($nodeglob) if $negating ; then return 1 ; fi ;;
-		    (*) if ! $negating ; then return 1 ; fi  ;;
-		esac
+		if [ "$pnn" = "$node" ] ; then
+		    if $negating ; then return 1 ; fi
+		else
+		    if ! $negating ; then return 1 ; fi
+		fi
 		ips="${ips/${ip}}" # Remove from list
 		break
 	    fi
@@ -418,11 +442,27 @@ ips_are_on_nodeglob ()
     [ -z "$ips" ]
 }
 
-wait_until_ips_are_on_nodeglob ()
+wait_until_ips_are_on_node ()
 {
-    echo "Waiting for IPs to fail over..."
+    # Go to some trouble to print a use description of what is happening
+    local not=""
+    if [ "$1" == "!" ] ; then
+	not="no longer "
+    fi
+    local node=""
+    local ips=""
+    local i
+    for i ; do
+	[ "$i" != "!" ] || continue
+	if [ -z "$node" ] ; then
+	    node="$i"
+	    continue
+	fi
+	ips="${ips}${ips:+, }${i}"
+    done
+    echo "Waiting for ${ips} to ${not}be assigned to node ${node}"
 
-    wait_until 60 ips_are_on_nodeglob "$@"
+    wait_until 60 ips_are_on_node "$@"
 }
 
 node_has_some_ips ()
@@ -431,7 +471,7 @@ node_has_some_ips ()
 
     local out
 
-    all_ips_on_node 1
+    all_ips_on_node $node
 
     while read ip pnn ; do
 	if [ "$node" = "$pnn" ] ; then
@@ -444,7 +484,7 @@ node_has_some_ips ()
 
 wait_until_node_has_some_ips ()
 {
-    echo "Waiting for node to have some IPs..."
+    echo "Waiting for some IPs to be assigned to node ${test_node}"
 
     wait_until 60 node_has_some_ips "$@"
 }
diff --git a/ctdb/tests/simple/16_ctdb_config_add_ip.sh b/ctdb/tests/simple/16_ctdb_config_add_ip.sh
index dc28130..b5d76ea 100755
--- a/ctdb/tests/simple/16_ctdb_config_add_ip.sh
+++ b/ctdb/tests/simple/16_ctdb_config_add_ip.sh
@@ -5,32 +5,8 @@ test_info()
     cat <<EOF
 Verify that an IP address can be added to a node using 'ctdb addip'.
 
-This test goes to some trouble to figure out which IP address to add
-but assumes a 24-bit subnet mask.  It does not handle IPv6.  It does
-not do any network level checks that the new IP address is reachable
-but simply trusts 'ctdb ip' that the address has been added.  There is
-also an extra prerequisite that the node being added to already has
-public addresses - this is difficult to avoid if the extra address is
-to be sensibly chosen.
-
-Prerequisites:
-
-* An active CTDB cluster with at least 2 active nodes.
-
-Steps:
-
-1. Verify that the status on all of the ctdb nodes is 'OK'.
-2. Use 'ctdb ip' on one of the nodes to list the IP addresses being
-   served.
-3. Add an additional public address to be served by the node, using
-   'ctdb addip'.
-4. Verify that this IP address has been added to the list of IP
-   addresses being served by the node, using the 'ctdb ip' command.
-
-Expected results:
-
-* 'ctdb ip' adds an IP address to the list of public IP addresses
-  being served by a node.
+This test does not do any network level checks to make sure IP
+addresses are actually on interfaces.  It just consults "ctdb ip".
 EOF
 }
 
@@ -45,79 +21,16 @@ cluster_is_healthy
 # Reset configuration
 ctdb_restart_when_done
 
-echo "Getting list of public IPs..."
-all_ips_on_node 0
-
-# When selecting test_node we just want a node that has public IPs.
-# This will work and is economically semi-randomly.  :-)
-read x test_node <<<"$out"
-
-test_node_ips=""
-all_ips=""
-while read ip pnn ; do
-    all_ips="${all_ips}${all_ips:+ }${ip}"
-    [ "$pnn" = "$test_node" ] && \
-	test_node_ips="${test_node_ips}${test_node_ips:+ }${ip}"
-done <<<"$out"
-
-echo "Selected node ${test_node} with IPs: $test_node_ips"
-
-# Try to find a free IP adddress.  This is inefficient but should
-# succeed quickly.
-if [ -z "$TEST_LOCAL_DAEMONS" ] ; then
-    try_command_on_node $test_node "ip addr show"
-    all_test_node_ips=$(echo "$out" | sed -rn -e 's@^[[:space:]]+inet[[:space:]]+([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+/[[:digit:]]+).*[[:space:]]([^[:space:]]+)+$@\1:\2 at p')
-else
-    all_test_node_ips=""
-fi
-add_ip=""
-
-# Use an IP already on one of the nodes, remove the last octet and
-# loop through the possible IP addreses.
-for i in $test_node_ips ; do
-    prefix="${i%.*}"
-    for j in $(seq 101 199) ; do
-	try="${prefix}.${j}"
-	# Try to make sure it isn't used anywhere!
-
-	# First, make sure it isn't an existing public address on the
-	# cluster.
-	for k in $all_ips ; do
-	    [ "$try" = "$k" ] && continue 2
-	done
-
-	# Also make sure it isn't some other address in use on the
-	# node.
-	for k in $all_test_node_ips ; do
-	    [ "$try" = "${k%/*}" ] && continue 2
-	done
-
-	# Get the interface details for $i, which our address is a
-	# close relative of.  This should never fail but it can't hurt
-	# to be careful...
-	try_command_on_node $test_node "ctdb ip -v -Y"
-	while IFS=":" read x ip pnn iface x ; do
-	    if [ "$i" = "$ip" ]; then
-		add_ip="$try/32:$iface"
-		break 3
-	    fi
-	done <<<"$out"
-    done
-done
+select_test_node_and_ips
+get_test_ip_mask_and_iface
 
-if [ -z "$add_ip" ] ; then
-    echo "BAD: Unable to find IP address to add."
-    exit 1
-fi
+echo "Deleting IP $test_ip from all nodes"
+try_command_on_node $test_node $CTDB delip -n all $test_ip
+wait_until_ips_are_on_node '!' $test_node $test_ip
 
-echo "Adding IP: ${add_ip/:/ on interface }"
-try_command_on_node $test_node $CTDB addip ${add_ip/:/ }
+# Debugging...
+try_command_on_node -v all $CTDB ip
 
-echo "Waiting for IP to be added..."
-if wait_until 60 ips_are_on_nodeglob $test_node ${add_ip%/*} ; then
-    echo "That worked!"
-else
-    echo "BAD: IP didn't get added."
-    try_command_on_node $test_node $CTDB ip -n all
-    exit 1
-fi
+echo "Adding IP ${test_ip}/${mask} on ${iface}, node ${test_node}"
+try_command_on_node $test_node $CTDB addip ${test_ip}/${mask} $iface
+wait_until_ips_are_on_node $test_node $test_ip
diff --git a/ctdb/tests/simple/17_ctdb_config_delete_ip.sh b/ctdb/tests/simple/17_ctdb_config_delete_ip.sh
index 1ad9f33..80d2699 100755
--- a/ctdb/tests/simple/17_ctdb_config_delete_ip.sh
+++ b/ctdb/tests/simple/17_ctdb_config_delete_ip.sh
@@ -5,28 +5,8 @@ test_info()
     cat <<EOF
 Verify that a node's public IP address can be deleted using 'ctdb deleteip'.
 
-This test does not do any network level checks that the IP address is
-no longer reachable but simply trusts 'ctdb ip' that the address has
-been deleted.
-
-Prerequisites:
-
-* An active CTDB cluster with at least 2 active nodes.
-
-Steps:
-
-1. Verify that the status on all of the ctdb nodes is 'OK'.
-2. Use 'ctdb ip' on one of the nodes to list the IP addresses being
-   served.
-3. Delete one public IP address being be served by the node, using
-   'ctdb delip'.
-4. Verify that the delete IP address is no longer listed using the
-   all_ips_on_node helper function.
-
-Expected results:
-
-* 'ctdb delip' removes an IP address from the list of public IP
-  addresses being served by a node.
+This test does not do any network level checks to make sure IP
+addresses are actually on interfaces.  It just consults "ctdb ip".
 EOF
 }
 
@@ -41,35 +21,8 @@ cluster_is_healthy
 # Reset configuration
 ctdb_restart_when_done
 
-echo "Getting list of public IPs..."
-all_ips_on_node -v 0
-
-# Select an IP/node to remove.
-num_ips=$(echo "$out" | wc -l)
-num_to_remove=$(($RANDOM % $num_ips))
-
-# Find the details in the list.
-i=0
-while [ $i -le $num_to_remove ] ; do
-    read ip_to_remove test_node
-    i=$(($i + 1))
-done <<<"$out"
-
-echo "Attempting to remove ${ip_to_remove} from node ${test_node}."
-try_command_on_node $test_node $CTDB delip $ip_to_remove
-
-echo "Sleeping..."
-sleep_for 1
-
-test_node_ips=""
-while read ip pnn ; do
-    [ "$pnn" = "$test_node" ] && \
-	test_node_ips="${test_node_ips}${test_node_ips:+ }${ip}"
-done <<<"$out" # bashism to avoid problem setting variable in pipeline.
+select_test_node_and_ips
 
-if [ "${test_node_ips/${ip_to_remove}}" = "$test_node_ips" ] ; then
-    echo "GOOD: That worked!"
-else
-    echo "BAD: The remove IP address is still there!"
-    testfailures=1
-fi
+echo "Deleting IP ${test_ip} from node ${test_node}"
+try_command_on_node $test_node $CTDB delip $test_ip
+wait_until_ips_are_on_node '!' $test_node $test_ip
diff --git a/ctdb/tests/simple/23_ctdb_moveip.sh b/ctdb/tests/simple/23_ctdb_moveip.sh
index 7c09e58..f6e9027 100755
--- a/ctdb/tests/simple/23_ctdb_moveip.sh
+++ b/ctdb/tests/simple/23_ctdb_moveip.sh
@@ -5,27 +5,10 @@ test_info()
     cat <<EOF
 Verify that  'ctdb moveip' allows movement of public IPs between cluster nodes.
 
-To work, this test unsets DeterministicIPs and sets NoIPFailback.
-
-This test does not do any network level checks that the IP address is
-no longer reachable but simply trusts 'ctdb ip' that the address has
-been deleted.
-
-Prerequisites:
-
-* An active CTDB cluster with at least 2 active nodes.
-
-Steps:
-
-1. Verify that the status on all of the ctdb nodes is 'OK'.
-2. Use 'ctdb ip' on one of the nodes to list the IP addresses being
-   served.
-3. Use 'ctdb moveip' to move an address from one node to another.
-4. Verify that the IP is no longer being hosted by the first node and is now being hosted by the second node.
+This test does not do any network level checks to make sure IP
+addresses are actually on interfaces.  It just consults "ctdb ip".


-- 
Samba Shared Repository


More information about the samba-cvs mailing list