ctdb-tests: Populate per-node known IPs inline
authorMartin Schwenke <martin@meltin.net>
Fri, 3 Feb 2017 03:41:57 +0000 (14:41 +1100)
committerMartin Schwenke <martins@samba.org>
Fri, 24 Feb 2017 06:47:11 +0000 (07:47 +0100)
At the moment this is done as a post-processing step for any nodes
that have no known IPs.  However, this doesn't allow testing of
scenarios where there no known IPs on one or more nodes.

Add relevant tests.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/tests/src/ipalloc_read_known_ips.c
ctdb/tests/takeover/lcp2.034.sh [new file with mode: 0755]
ctdb/tests/takeover_helper/030.sh [new file with mode: 0755]

index bd4366cf42f8b7387d8366debf6a8cc1b9a47d4a..5725d6dc5233795006b0ce7164905e77d6acca99 100644 (file)
@@ -53,6 +53,7 @@ static bool add_ip(TALLOC_CTX *mem_ctx,
 /* Format of each line is "IP CURRENT_PNN [ALLOWED_PNN,...]".
  * If multi is true then ALLOWED_PNNs are not allowed.  */
 static bool read_ctdb_public_ip_info_node(bool multi,
+                                         int numnodes,
                                          struct ctdb_public_ip_list **k,
                                          struct ctdb_public_ip_list *known)
 {
@@ -104,6 +105,14 @@ static bool read_ctdb_public_ip_info_node(bool multi,
 
                tok = strtok(NULL, " \t#");
                if (tok == NULL) {
+                       if (! multi) {
+                               for (n = 0; n < numnodes; n++) {
+                                       if (! add_ip(known, &known[n],
+                                                    &addr, pnn)) {
+                                               goto fail;
+                                       }
+                               }
+                       }
                        continue;
                }
 
@@ -146,31 +155,18 @@ struct ctdb_public_ip_list * ipalloc_read_known_ips(TALLOC_CTX *ctx,
 
        if (multi) {
                for (n = 0; n < numnodes; n++) {
-                       if (! read_ctdb_public_ip_info_node(multi, &k, known)) {
+                       if (! read_ctdb_public_ip_info_node(multi, numnodes,
+                                                           &k, known)) {
                                goto fail;
                        }
 
                        known[n] = *k;
                }
        } else {
-               if (! read_ctdb_public_ip_info_node(multi, &k, known)) {
+               if (! read_ctdb_public_ip_info_node(multi, numnodes,
+                                                   &k, known)) {
                        goto fail;
                }
-
-               /* Copy it to any nodes that don't have a
-                * list assigned
-                */
-               for (n = 0; n < numnodes; n++) {
-                       if (known[n].num == 0) {
-                               known[n].num = k->num;
-                               known[n].ip = talloc_memdup(
-                                       known, k->ip,
-                                       k->num * sizeof(struct ctdb_public_ip));
-                               if (known[n].ip == NULL) {
-                                       goto fail;
-                               }
-                       }
-               }
        }
 
        return known;
diff --git a/ctdb/tests/takeover/lcp2.034.sh b/ctdb/tests/takeover/lcp2.034.sh
new file mode 100755 (executable)
index 0000000..6cea2d5
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "3 nodes, 1 without IP addresses"
+
+export CTDB_TEST_LOGLEVEL=ERR
+
+required_result <<EOF
+192.168.140.4 0
+192.168.140.3 1
+192.168.140.2 0
+192.168.140.1 1
+EOF
+
+simple_test 0,0,0 <<EOF
+192.168.140.1          -1      0,1
+192.168.140.2          -1      0,1
+192.168.140.3          -1      0,1
+192.168.140.4          -1      0,1
+EOF
diff --git a/ctdb/tests/takeover_helper/030.sh b/ctdb/tests/takeover_helper/030.sh
new file mode 100755 (executable)
index 0000000..e6411c5
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "3 nodes, all ok, IPs defined on 2, IPs all unassigned"
+
+setup_ctdbd <<EOF
+NODEMAP
+0       192.168.20.41   0x0     CURRENT RECMASTER
+1       192.168.20.42   0x0
+2       192.168.20.43   0x0
+
+IFACES
+:Name:LinkStatus:References:
+:eth2:1:2:
+:eth1:1:4:
+
+PUBLICIPS
+10.0.0.31  -1 0,2
+10.0.0.32  -1 0,2
+10.0.0.33  -1 0,2
+10.0.0.34  -1 0,2
+EOF
+
+ok_null
+test_takeover_helper
+
+required_result 0 <<EOF
+Public IPs on ALL nodes
+10.0.0.31 0
+10.0.0.32 2
+10.0.0.33 2
+10.0.0.34 0
+EOF
+test_ctdb_ip_all