ctdb-tests: Support fake capabilities in CTDB tool stub
authorMartin Schwenke <martin@meltin.net>
Tue, 18 Feb 2014 00:34:11 +0000 (11:34 +1100)
committerAmitay Isaacs <amitay@samba.org>
Sun, 23 Mar 2014 03:20:14 +0000 (04:20 +0100)
... and add a test to make sure it works.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/tests/src/ctdb_test_stubs.c
ctdb/tests/tool/stubby.getcapabilities.004.sh [new file with mode: 0755]

index 456b1fdc0ce8fe66d1724c028687842144ab821e..3ca7b9112ea577a91c11f39ac1281db0016b4bdb 100644 (file)
 */
 
 /* Read a nodemap from stdin.  Each line looks like:
- *  <PNN> <FLAGS> [RECMASTER] [CURRENT]
+ *  <PNN> <FLAGS> [RECMASTER] [CURRENT] [CAPABILITIES]
  * EOF or a blank line terminates input.
+ *
+ * By default, capablities for each node are
+ * CTDB_CAP_RECMASTER|CTDB_CAP_LMASTER|CTDB_CAP_NATGW.  These 3
+ * capabilities can be faked off by adding, for example,
+ * -CTDB_CAP_RECMASTER.  LVS can be faked on by adding
+ * CTDB_CAP_LVS.
  */
 void ctdb_test_stubs_read_nodemap(struct ctdb_context *ctdb)
 {
@@ -33,7 +39,7 @@ void ctdb_test_stubs_read_nodemap(struct ctdb_context *ctdb)
 
        while ((fgets(line, sizeof(line), stdin) != NULL) &&
               (line[0] != '\n')) {
-               uint32_t pnn, flags;
+               uint32_t pnn, flags, capabilities;
                char *tok, *t;
                const char *ip;
                ctdb_sock_addr saddr;
@@ -70,6 +76,7 @@ void ctdb_test_stubs_read_nodemap(struct ctdb_context *ctdb)
                        continue;
                }
                flags = (uint32_t)strtoul(tok, NULL, 0);
+               capabilities = CTDB_CAP_RECMASTER|CTDB_CAP_LMASTER|CTDB_CAP_NATGW;
 
                tok = strtok(NULL, " \t");
                while (tok != NULL) {
@@ -77,6 +84,14 @@ void ctdb_test_stubs_read_nodemap(struct ctdb_context *ctdb)
                                ctdb->pnn = pnn;
                        } else if (strcmp(tok, "RECMASTER") == 0) {
                                ctdb->recovery_master = pnn;
+                       } else if (strcmp(tok, "-CTDB_CAP_RECMASTER") == 0) {
+                               capabilities &= ~CTDB_CAP_RECMASTER;
+                       } else if (strcmp(tok, "-CTDB_CAP_LMASTER") == 0) {
+                               capabilities &= ~CTDB_CAP_LMASTER;
+                       } else if (strcmp(tok, "-CTDB_CAP_NATGW") == 0) {
+                               capabilities &= ~CTDB_CAP_NATGW;
+                       } else if (strcmp(tok, "CTDB_CAP_LVS") == 0) {
+                               capabilities |= CTDB_CAP_LVS;
                        }
                        tok = strtok(NULL, " \t");
                }
@@ -98,6 +113,7 @@ void ctdb_test_stubs_read_nodemap(struct ctdb_context *ctdb)
                ctdb->nodes[ctdb->num_nodes]->address.address = ip;
                ctdb->nodes[ctdb->num_nodes]->address.port = 0;
                ctdb->nodes[ctdb->num_nodes]->flags = flags;
+               ctdb->nodes[ctdb->num_nodes]->capabilities = capabilities;
                ctdb->num_nodes++;
        }
 }
@@ -524,6 +540,6 @@ int ctdb_ctrl_getcapabilities_stub(struct ctdb_context *ctdb,
                                   struct timeval timeout, uint32_t destnode,
                                   uint32_t *capabilities)
 {
-       *capabilities = CTDB_CAP_RECMASTER|CTDB_CAP_LMASTER|CTDB_CAP_NATGW;
-       return 0;
+       *capabilities = ctdb->nodes[destnode]->capabilities;
+       return 0;
 }
diff --git a/ctdb/tests/tool/stubby.getcapabilities.004.sh b/ctdb/tests/tool/stubby.getcapabilities.004.sh
new file mode 100755 (executable)
index 0000000..d3e24b4
--- /dev/null
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "3 nodes, all ok, non-default capabilities"
+
+set -e
+
+input="\
+NODEMAP
+0       192.168.20.41   0x0     CURRENT RECMASTER CTDB_CAP_LVS
+1       192.168.20.42   0x0    -CTDB_CAP_LMASTER
+2       192.168.20.43   0x0    -CTDB_CAP_RECMASTER -CTDB_CAP_NATGW
+
+IFACES
+:Name:LinkStatus:References:
+:eth2:1:2:
+:eth1:1:4:
+
+VNNMAP
+654321
+0
+1
+2"
+
+required_result 0 <<EOF
+RECMASTER: YES
+LMASTER: YES
+LVS: YES
+NATGW: YES
+EOF
+
+simple_test -n 0 <<EOF
+$input
+EOF
+
+required_result 0 <<EOF
+RECMASTER: YES
+LMASTER: NO
+LVS: NO
+NATGW: YES
+EOF
+
+simple_test -n 1 <<EOF
+$input
+EOF
+
+required_result 0 <<EOF
+RECMASTER: NO
+LMASTER: YES
+LVS: NO
+NATGW: NO
+EOF
+
+simple_test -n 2 <<EOF
+$input
+EOF