Signed-off-by: Angus Salkeld <[email protected]>
---
 cts/agents/Makefile.am         |   10 +-
 cts/agents/common_test_agent.c |  247 ++++++++++++++++++
 cts/agents/common_test_agent.h |   43 +++
 cts/agents/confdb_test_agent.c |  565 ++++++++++++++++++++++++++++++++++++++++
 cts/agents/cpg_test_agent.c    |  195 +--------------
 cts/corosync.py                |   48 +++-
 cts/corotests.py               |   96 ++++++-
 7 files changed, 988 insertions(+), 216 deletions(-)
 create mode 100644 cts/agents/common_test_agent.c
 create mode 100644 cts/agents/common_test_agent.h
 create mode 100644 cts/agents/confdb_test_agent.c

diff --git a/cts/agents/Makefile.am b/cts/agents/Makefile.am
index 8ae7ee7..19c6cc9 100644
--- a/cts/agents/Makefile.am
+++ b/cts/agents/Makefile.am
@@ -32,7 +32,7 @@
 MAINTAINERCLEANFILES = Makefile.in
 INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include
 
-TEST_AGENTS = cpg_test_agent
+TEST_AGENTS = cpg_test_agent confdb_test_agent
 
 if INSTALL_TESTAGENTS
 agentdir = $(datadir)/$(PACKAGE)/tests
@@ -43,8 +43,14 @@ noinst_PROGRAMS = $(TEST_AGENTS)
 noinst_SCRIPTS = mem_leak_test.sh net_breaker.sh
 endif
 
+
+cpg_test_agent_SOURCES = cpg_test_agent.c common_test_agent.c
 cpg_test_agent_LDADD =  -lcpg -lcoroipcc ../../exec/coropoll.o 
../../exec/crypto.o
-cpg_test_agent_LDFLAGS =  -L../../lib
+cpg_test_agent_LDFLAGS =  -L../../lib -L.
+
+confdb_test_agent_SOURCES = confdb_test_agent.c common_test_agent.c
+confdb_test_agent_LDADD =  -lconfdb -lcoroipcc ../../exec/coropoll.o
+confdb_test_agent_LDFLAGS =  -L../../lib 
 
 lint:
        -splint $(LINT_FLAGS) $(CFLAGS) *.c
diff --git a/cts/agents/common_test_agent.c b/cts/agents/common_test_agent.c
new file mode 100644
index 0000000..6626103
--- /dev/null
+++ b/cts/agents/common_test_agent.c
@@ -0,0 +1,247 @@
+/*
+ * Copyright (c) 2010 Red Hat, Inc.
+ *
+ * All rights reserved.
+ *
+ * Author: Angus Salkeld ([email protected])
+ *
+ * This software licensed under BSD license, the text of which follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * - Neither the name of the MontaVista Software, Inc. nor the names of its
+ *   contributors may be used to endorse or promote products derived from this
+ *   software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <syslog.h>
+#include <poll.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <corosync/hdb.h>
+#include <corosync/totem/coropoll.h>
+#include "common_test_agent.h"
+
+
+int32_t parse_debug = 0;
+static char big_and_buf_rx[HOW_BIG_AND_BUF];
+ta_do_command_fn do_command;
+static hdb_handle_t poll_handle;
+
+
+hdb_handle_t ta_poll_handle_get(void)
+{
+       return poll_handle;
+}
+
+static void ta_handle_command (int sock, char* msg)
+{
+       int num_args;
+       char *saveptr = NULL;
+       char *str = strdup (msg);
+       char *str_len;
+       char *str_arg;
+       char *args[5];
+       int i = 0;
+       int a = 0;
+       char* func = NULL;
+
+       if (parse_debug)
+               syslog (LOG_DEBUG,"%s (MSG:%s)\n", __func__, msg);
+
+       str_len = strtok_r (str, ":", &saveptr);
+       assert (str_len);
+
+       num_args = atoi (str_len) * 2;
+       for (i = 0; i < num_args / 2; i++) {
+               str_len = strtok_r (NULL, ":", &saveptr);
+               str_arg = strtok_r (NULL, ":", &saveptr);
+               if (func == NULL) {
+                       /* first "arg" is the function */
+                       if (parse_debug)
+                               syslog (LOG_DEBUG, "(LEN:%s, FUNC:%s)", 
str_len, str_arg);
+                       func = str_arg;
+                       a = 0;
+               } else {
+                       args[a] = str_arg;
+                       a++;
+                       if (parse_debug)
+                               syslog (LOG_DEBUG, "(LEN:%s, ARG:%s)", str_len, 
str_arg);
+               }
+       }
+       do_command (sock, func, args, a+1);
+
+       free (str);
+}
+
+static int server_process_data_fn (hdb_handle_t handle,
+       int fd,
+       int revents,
+       void *data)
+{
+       char *saveptr;
+       char *msg;
+       char *cmd;
+       int32_t nbytes;
+
+       if ((nbytes = recv (fd, big_and_buf_rx, sizeof (big_and_buf_rx), 0)) <= 
0) {
+               /* got error or connection closed by client */
+               if (nbytes == 0) {
+                       /* connection closed */
+                       syslog (LOG_WARNING, "socket %d hung up: exiting...\n", 
fd);
+               } else {
+                       syslog (LOG_ERR,"recv() failed: %s", strerror(errno));
+               }
+               close (fd);
+               poll_stop (handle);
+       } else {
+               big_and_buf_rx[nbytes] = '\0';
+
+               msg = strtok_r (big_and_buf_rx, ";", &saveptr);
+               assert (msg);
+               while (msg) {
+                       cmd = strdup (msg);
+                       ta_handle_command (fd, cmd);
+                       free (cmd);
+                       msg = strtok_r (NULL, ";", &saveptr);
+               }
+       }
+
+       return 0;
+}
+
+static int server_accept_fn (hdb_handle_t handle,
+       int fd, int revents, void *data)
+{
+       socklen_t addrlen;
+       struct sockaddr_in in_addr;
+       int new_fd;
+       int res;
+
+       addrlen = sizeof (struct sockaddr_in);
+
+retry_accept:
+       new_fd = accept (fd, (struct sockaddr *)&in_addr, &addrlen);
+       if (new_fd == -1 && errno == EINTR) {
+               goto retry_accept;
+       }
+
+       if (new_fd == -1) {
+               syslog (LOG_ERR,
+                       "Could not accept connection: %s\n", strerror (errno));
+               return (0); /* This is an error, but -1 would indicate 
disconnect from poll loop */
+       }
+
+       res = fcntl (new_fd, F_SETFL, O_NONBLOCK);
+       if (res == -1) {
+               syslog (LOG_ERR,
+                       "Could not set non-blocking operation on connection: 
%s\n",
+                       strerror (errno));
+               close (new_fd);
+               return (0); /* This is an error, but -1 would indicate 
disconnect from poll loop */
+       }
+
+       poll_dispatch_add (poll_handle, new_fd, POLLIN|POLLNVAL, NULL, 
server_process_data_fn);
+       return 0;
+}
+
+
+static int create_server_sockect (int server_port)
+{
+       int listener;
+       int yes = 1;
+       int rv;
+       struct addrinfo hints, *ai, *p;
+       char server_port_str[16];
+
+       /* get a socket and bind it
+        */
+       sprintf(server_port_str, "%d", server_port);
+       memset (&hints, 0, sizeof hints);
+       hints.ai_family = AF_UNSPEC;
+       hints.ai_socktype = SOCK_STREAM;
+       hints.ai_flags = AI_PASSIVE;
+       if ((rv = getaddrinfo (NULL, server_port_str, &hints, &ai)) != 0) {
+               syslog (LOG_ERR, "%s\n", gai_strerror (rv));
+               exit (1);
+       }
+
+       for (p = ai; p != NULL; p = p->ai_next) {
+               listener = socket (p->ai_family, p->ai_socktype, 
p->ai_protocol);
+               if (listener < 0) {
+                       continue;
+               }
+
+               /* lose the pesky "address already in use" error message
+                */
+               if (setsockopt (listener, SOL_SOCKET, SO_REUSEADDR,
+                               &yes, sizeof(int)) < 0) {
+                       syslog (LOG_ERR, "setsockopt() failed: %s\n", strerror 
(errno));
+               }
+
+               if (bind (listener, p->ai_addr, p->ai_addrlen) < 0) {
+                       syslog (LOG_ERR, "bind() failed: %s\n", strerror 
(errno));
+                       close (listener);
+                       continue;
+               }
+
+               break;
+       }
+
+       if (p == NULL) {
+               syslog (LOG_ERR, "failed to bind\n");
+               exit (2);
+       }
+
+       freeaddrinfo (ai);
+
+       if (listen (listener, 10) == -1) {
+               syslog (LOG_ERR, "listen() failed: %s", strerror(errno));
+               exit (3);
+       }
+
+       return listener;
+}
+
+int test_agent_run(int server_port, ta_do_command_fn func)
+{
+       int listener;
+
+       do_command = func;
+       poll_handle = poll_create ();
+
+       listener = create_server_sockect (server_port);
+       poll_dispatch_add (poll_handle, listener, POLLIN|POLLNVAL, NULL, 
server_accept_fn);
+
+       return poll_run (poll_handle);
+}
+
diff --git a/cts/agents/common_test_agent.h b/cts/agents/common_test_agent.h
new file mode 100644
index 0000000..fc8983c
--- /dev/null
+++ b/cts/agents/common_test_agent.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2010 Red Hat, Inc.
+ *
+ * All rights reserved.
+ *
+ * Author: Angus Salkeld ([email protected])
+ *
+ * This software licensed under BSD license, the text of which follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * - Neither the name of the MontaVista Software, Inc. nor the names of its
+ *   contributors may be used to endorse or promote products derived from this
+ *   software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+extern int32_t parse_debug;
+#define HOW_BIG_AND_BUF 4096
+
+typedef void (*ta_do_command_fn) (int sock, char* func, char*args[], int 
num_args);
+
+int test_agent_run(int server_port, ta_do_command_fn func);
+
+hdb_handle_t ta_poll_handle_get(void);
+
+
diff --git a/cts/agents/confdb_test_agent.c b/cts/agents/confdb_test_agent.c
new file mode 100644
index 0000000..6588526
--- /dev/null
+++ b/cts/agents/confdb_test_agent.c
@@ -0,0 +1,565 @@
+/*
+ * Copyright (c) 2008, 2009 Red Hat Inc
+ *
+ * All rights reserved.
+ *
+ * Author: Christine Caulfield <[email protected]>
+ *
+ * This software licensed under BSD license, the text of which follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ *   this list of conditions and the following disclaimer in the documentation
+ *   and/or other materials provided with the distribution.
+ * - Neither the name of the MontaVista Software, Inc. nor the names of its
+ *   contributors may be used to endorse or promote products derived from this
+ *   software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <sys/un.h>
+#include <syslog.h>
+
+#include <corosync/corotypes.h>
+#include <corosync/confdb.h>
+#include "common_test_agent.h"
+
+
+#define OK_STR "OK"
+#define FAIL_STR "FAIL"
+#define NOT_SUPPORTED_STR "NOT_SUPPORTED"
+
+#define INCDEC_VALUE 45
+
+confdb_callbacks_t callbacks = {
+       .confdb_key_change_notify_fn = NULL,
+       .confdb_object_create_change_notify_fn = NULL,
+       .confdb_object_delete_change_notify_fn = NULL
+};
+
+typedef enum {
+       NTF_OBJECT_CREATED,
+       NTF_OBJECT_DELETED,
+       NTF_KEY_CREATED,
+       NTF_KEY_REPLACED,
+       NTF_KEY_DELETED,
+       NTF_NONE,
+} ntf_callback_type_t;
+
+static ntf_callback_type_t callback_type;
+static char ntf_object_name[256];
+static size_t ntf_object_name_len;
+static char ntf_key_name[256];
+static size_t ntf_key_name_len;
+static char ntf_key_value[256];
+static size_t ntf_key_value_len;
+
+static void ta_key_change_notify (
+       confdb_handle_t handle,
+       confdb_change_type_t change_type,
+       hdb_handle_t parent_object_handle,
+       hdb_handle_t object_handle,
+       const void *object_name,
+       size_t  object_name_len,
+       const void *key_name,
+       size_t key_name_len,
+       const void *key_value,
+       size_t key_value_len)
+{
+       switch (change_type) {
+       case OBJECT_KEY_CREATED:
+               callback_type = NTF_KEY_CREATED;
+               break;
+       case OBJECT_KEY_DELETED:
+               callback_type = NTF_KEY_DELETED;
+               break;
+       case OBJECT_KEY_REPLACED:
+               callback_type = NTF_KEY_REPLACED;
+               break;
+       default:
+               assert (0);
+               break;
+       }
+       ntf_object_name_len = object_name_len;
+       memcpy (ntf_object_name, object_name, object_name_len);
+
+       ntf_key_name_len = key_name_len;
+       memcpy (ntf_key_name, key_name, key_name_len);
+
+       ntf_key_value_len = key_value_len;
+       memcpy (ntf_key_value, key_value, key_value_len);
+}
+
+static void ta_object_create_notify (
+       confdb_handle_t handle,
+       hdb_handle_t parent_object_handle,
+       hdb_handle_t object_handle,
+       const void *name_pt,
+       size_t name_len)
+{
+       callback_type = NTF_OBJECT_CREATED;
+       ntf_object_name_len = name_len;
+       memcpy (ntf_object_name, name_pt, name_len);
+}
+
+static void ta_object_delete_notify (
+       confdb_handle_t handle,
+       hdb_handle_t parent_object_handle,
+       const void *name_pt,
+       size_t name_len)
+{
+       callback_type = NTF_OBJECT_DELETED;
+       ntf_object_name_len = name_len;
+       memcpy (ntf_object_name, name_pt, name_len);
+}
+
+confdb_callbacks_t valid_callbacks = {
+       .confdb_key_change_notify_fn = ta_key_change_notify,
+       .confdb_object_create_change_notify_fn = ta_object_create_notify,
+       .confdb_object_delete_change_notify_fn = ta_object_delete_notify
+};
+
+static void set_get_test (int sock)
+{
+       confdb_handle_t handle;
+       char response[100];
+       int res;
+       hdb_handle_t object_handle;
+       confdb_value_types_t type;
+       char key_value[256];
+       char key2_value[256];
+       size_t value_len;
+       size_t value2_len;
+
+       syslog (LOG_ERR, "%s START", __func__);
+
+       snprintf (response, 100, "%s", OK_STR);
+
+       res = confdb_initialize (&handle, &callbacks);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "Could not initialize confdb error %d", res);
+               goto send_response;
+       }
+       /* Add a scratch object and put 2 keys into it */
+       res = confdb_object_create (handle, OBJECT_PARENT_HANDLE,
+               "testconfdb", strlen("testconfdb"), &object_handle);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error creating 'testconfdb' object: %d", res);
+               goto send_response;
+       }
+
+       res = confdb_key_create (handle, object_handle,
+              "testkey", strlen ("testkey"),
+               "one", strlen ("one"));
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error creating 'testconfdb' key 1: %d", res);
+               goto send_response;
+       }
+
+       res = confdb_key_replace (handle, object_handle,
+               "testkey", strlen ("testkey"),
+               "one", strlen ("one"),
+               "newone", strlen ("newone"));
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error replace 'testconfdb' key 2: %d", res);
+               goto send_response;
+       }
+
+       res = confdb_key_get_typed (handle, object_handle,
+               "testkey", key_value, &value_len, &type);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "Could not get \"testkey\" key: %d", res);
+               goto send_response;
+       }
+       if (strcmp (key_value, "newone") != 0) {
+               syslog (LOG_ERR, "Key not set correctly");
+               goto send_response;
+       }
+       if (type != CONFDB_VALUETYPE_ANY) {
+               syslog (LOG_ERR, "Key type not set correctly");
+               goto send_response;
+       }
+       res = confdb_key_get (handle, object_handle,
+               "testkey", strlen ("testkey"), key2_value, &value2_len);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "Could not get \"testkey\" key: %d", res);
+               goto send_response;
+       }
+       if (value2_len != value_len) {
+               syslog (LOG_ERR, "value length from confdb_key_get:%u and 
confdb_key_get_typed:%u differ.",
+                       (uint32_t)value_len, (uint32_t)value2_len);
+               goto send_response;
+       }
+
+       res = confdb_key_delete (handle, object_handle,
+               "testkey", strlen ("testkey"), key2_value, value2_len);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "Could not get \"testkey\" key: %d", res);
+               goto send_response;
+       }
+
+       /* Remove it.
+          Check that it doesn't exist when the full tree dump runs next */
+       res = confdb_object_destroy(handle, object_handle);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error destroying 'testconfdb' object: %d", 
res);
+               goto send_response;
+       }
+
+       snprintf (response, 100, "%s", OK_STR);
+
+send_response:
+       syslog (LOG_ERR, "%s %s", __func__, response);
+       send (sock, response, strlen (response) + 1, 0);
+       confdb_finalize (handle);
+}
+
+static void increment_decrement_test (int sock)
+{
+       char response[100];
+       int res;
+       uint32_t incdec_value;
+       hdb_handle_t object_handle;
+       confdb_handle_t handle;
+       confdb_handle_t par_handle;
+
+       snprintf (response, 100, "%s", FAIL_STR);
+
+       res = confdb_initialize (&handle, &callbacks);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "Could not initialize confdb error %d", res);
+               goto send_response;
+       }
+       /* Add a scratch object and put 1 keys into it */
+       res = confdb_object_create(handle, OBJECT_PARENT_HANDLE,
+              "testconfdb", strlen("testconfdb"), &object_handle);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error creating 'testconfdb' object: %d", res);
+               goto send_response;
+       }
+
+       res = confdb_object_parent_get (handle, object_handle, &par_handle);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error getting parent of 'testconfdb' object: 
%d", res);
+               goto send_response;
+       }
+       if (par_handle != OBJECT_PARENT_HANDLE) {
+               syslog (LOG_ERR, "wrong parent handle");
+               goto send_response;
+       }
+
+
+       incdec_value = INCDEC_VALUE;
+       res = confdb_key_create_typed (handle, object_handle, "incdec",
+               &incdec_value, sizeof(incdec_value), CONFDB_VALUETYPE_UINT32);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error creating 'testconfdb' key 4: %d\n", 
res);
+               goto send_response;
+       }
+       res = confdb_key_increment(handle, object_handle, "incdec", 
strlen("incdec"), &incdec_value);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error incrementing 'testconfdb' key 4: %d\n", 
res);
+               goto send_response;
+       }
+       if (incdec_value == INCDEC_VALUE + 1) {
+               syslog (LOG_INFO, "incremented value = %d\n", incdec_value);
+       }
+       else {
+               syslog (LOG_ERR, "ERROR: incremented value = %d (should be 
%d)\n", incdec_value, INCDEC_VALUE+1);
+               goto send_response;
+       }
+       res = confdb_key_decrement(handle, object_handle, "incdec", 
strlen("incdec"), &incdec_value);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error decrementing 'testconfdb' key 4: %d\n", 
res);
+               goto send_response;
+       }
+       if (incdec_value == INCDEC_VALUE) {
+               syslog (LOG_ERR, "decremented value = %d\n", incdec_value);
+       }
+       else {
+               syslog (LOG_ERR, "ERROR: decremented value = %d (should be 
%d)\n", incdec_value, INCDEC_VALUE);
+               goto send_response;
+       }
+       /* Remove it.
+          Check that it doesn't exist when the full tree dump runs next */
+       res = confdb_object_destroy(handle, object_handle);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error destroying 'testconfdb' object: %d\n", 
res);
+               goto send_response;
+       }
+
+       snprintf (response, 100, "%s", OK_STR);
+
+send_response:
+       confdb_finalize (handle);
+       send (sock, response, strlen (response) + 1, 0);
+}
+
+
+static void object_find_test (int sock)
+{
+       char response[100];
+       confdb_handle_t handle;
+       int result;
+       hdb_handle_t totem_handle;
+       char key_value[256];
+       size_t value_len;
+
+       snprintf (response, 100, "%s", FAIL_STR);
+
+       result = confdb_initialize (&handle, &callbacks);
+       if (result != CS_OK) {
+               syslog (LOG_ERR, "Could not initialize confdb error %d\n", 
result);
+               goto send_response;
+       }
+
+       /* Find "totem" and dump bits of it again, to test the direct APIs */
+       result = confdb_object_find_start(handle, OBJECT_PARENT_HANDLE);
+       if (result != CS_OK) {
+               syslog (LOG_ERR, "Could not start object_find %d\n", result);
+               goto send_response;
+       }
+
+       result = confdb_object_find(handle, OBJECT_PARENT_HANDLE, "totem", 
strlen("totem"), &totem_handle);
+       if (result != CS_OK) {
+               syslog (LOG_ERR, "Could not object_find \"totem\": %d\n", 
result);
+               goto send_response;
+       }
+
+       result = confdb_key_get(handle, totem_handle, "version", 
strlen("version"), key_value, &value_len);
+       if (result != CS_OK) {
+               syslog (LOG_ERR, "Could not get \"version\" key: %d\n", result);
+               goto send_response;
+       }
+
+       result = confdb_object_find_destroy (handle, OBJECT_PARENT_HANDLE);
+       if (result != CS_OK) {
+               syslog (LOG_ERR, "Could not destroy find object %d\n", result);
+               goto send_response;
+       }
+
+
+       snprintf (response, 100, "%s", OK_STR);
+
+send_response:
+       confdb_finalize (handle);
+       send (sock, response, strlen (response) + 1, 0);
+}
+
+static void notification_test (int sock)
+{
+       char response[100];
+       confdb_handle_t handle;
+       int res;
+       hdb_handle_t object_handle;
+       hdb_handle_t new_object_handle;
+       uint16_t incdec_value;
+       uint32_t incdec_value_out;
+
+       snprintf (response, 100, "%s", FAIL_STR);
+
+       res = confdb_initialize (&handle, &valid_callbacks);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "Could not initialize confdb error %d\n", res);
+               goto send_response;
+       }
+
+       /* Add a base scratch object (we don't want to track the parent object) 
*/
+       res = confdb_object_create(handle, OBJECT_PARENT_HANDLE,
+              "testconfdb", strlen("testconfdb"), &object_handle);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error creating 'testconfdb' object: %d", res);
+               goto send_response;
+       }
+
+       res = confdb_track_changes (handle, object_handle, 1 
/*OBJECT_TRACK_DEPTH_RECURSIVE*/);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "can't track changes on object: %d", res);
+               goto send_response;
+       }
+
+       /* Test 'object created' notification
+        */
+       callback_type = NTF_NONE;
+
+       res = confdb_object_create(handle, object_handle,
+              "duck", strlen("duck"), &new_object_handle);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error creating 'duck' object: %d", res);
+               goto send_response;
+       }
+
+       confdb_dispatch (handle, CS_DISPATCH_ALL);
+
+       if (callback_type != NTF_OBJECT_CREATED) {
+               syslog (LOG_ERR, "no notification received for the creation of 
'duck'");
+               goto send_response;
+       }
+       if (strcmp ("duck", ntf_object_name) != 0) {
+               syslog (LOG_ERR, "expected notification for 'duck' but got %s", 
ntf_object_name);
+               goto send_response;
+       }
+
+       /* Test 'key created' notification
+        */
+       callback_type = NTF_NONE;
+
+       incdec_value = INCDEC_VALUE;
+       res = confdb_key_create_typed (handle, new_object_handle, "incdec",
+               &incdec_value, sizeof(incdec_value), CONFDB_VALUETYPE_UINT16);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error creating 'testconfdb' key 4: %d\n", 
res);
+               goto send_response;
+       }
+
+       confdb_dispatch (handle, CS_DISPATCH_ALL);
+
+       if (callback_type != NTF_KEY_CREATED) {
+               syslog (LOG_ERR, "no notification received for the creation of 
key 'incdec'");
+               goto send_response;
+       }
+       if (strcmp ("incdec", ntf_key_name) != 0) {
+               syslog (LOG_ERR, "expected notification for 'incdec' but got 
%s", ntf_key_name);
+               goto send_response;
+       }
+
+       /* Test 'key replaced' notification
+        */
+       callback_type = NTF_NONE;
+
+       res = confdb_key_increment(handle, new_object_handle, "incdec", 
strlen("incdec"), &incdec_value_out);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error incrementing 'testconfdb' key 4: %d\n", 
res);
+               goto send_response;
+       }
+
+       confdb_dispatch (handle, CS_DISPATCH_ALL);
+
+       if (callback_type != NTF_KEY_REPLACED) {
+               syslog (LOG_ERR, "no notification received for the incrementing 
of key 'incdec'");
+               goto send_response;
+       }
+       if (strcmp ("incdec", ntf_key_name) != 0) {
+               syslog (LOG_ERR, "expected notification for 'incdec' but got 
%s", ntf_key_name);
+               goto send_response;
+       }
+
+       /* Test 'key destroyed' notification
+        */
+       callback_type = NTF_NONE;
+
+       res = confdb_key_delete (handle, new_object_handle,
+               "incdec", strlen ("incdec"), ntf_key_value, ntf_key_value_len);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "Could not delete \"incdec\" key: %d", res);
+               goto send_response;
+       }
+
+       confdb_dispatch (handle, CS_DISPATCH_ALL);
+
+       if (callback_type != NTF_KEY_DELETED) {
+               syslog (LOG_ERR, "no notification received for the deletion of 
key 'incdec'");
+               goto send_response;
+       }
+       if (strcmp ("incdec", ntf_key_name) != 0) {
+               syslog (LOG_ERR, "expected notification for 'incdec' but got 
%s", ntf_key_name);
+               goto send_response;
+       }
+
+       /* Test 'object destroyed' notification
+        */
+       callback_type = NTF_NONE;
+
+       res = confdb_object_destroy(handle, new_object_handle);
+       if (res != CS_OK) {
+               syslog (LOG_ERR, "error destroying 'testconfdb' object: %d", 
res);
+               goto send_response;
+       }
+
+       confdb_dispatch (handle, CS_DISPATCH_ALL);
+
+       if (callback_type != NTF_OBJECT_DELETED) {
+               syslog (LOG_ERR, "no notification received for the deletion of 
'duck'");
+               goto send_response;
+       }
+       if (strcmp ("duck", ntf_object_name) != 0) {
+               syslog (LOG_ERR, "expected notification for 'duck' but got %s", 
ntf_object_name);
+               goto send_response;
+       }
+       confdb_stop_track_changes (handle);
+       confdb_object_destroy(handle, object_handle);
+
+       snprintf (response, 100, "%s", OK_STR);
+
+send_response:
+       send (sock, response, strlen (response) + 1, 0);
+       confdb_finalize (handle);
+}
+
+
+
+static void do_command (int sock, char* func, char*args[], int num_args)
+{
+       char response[100];
+
+       if (parse_debug)
+               syslog (LOG_DEBUG,"RPC:%s() called.", func);
+
+       if (strcmp ("set_get_test", func) == 0) {
+               set_get_test (sock);
+       } else if (strcmp ("increment_decrement_test", func) == 0) {
+               increment_decrement_test (sock);
+       } else if (strcmp ("object_find_test", func) == 0) {
+               object_find_test (sock);
+       } else if (strcmp ("notification_test", func) == 0) {
+               notification_test (sock);
+       } else {
+               syslog (LOG_ERR,"%s RPC:%s not supported!", __func__, func);
+               snprintf (response, 100, "%s", NOT_SUPPORTED_STR);
+               send (sock, response, strlen (response) + 1, 0);
+       }
+}
+
+
+int main (int argc, char *argv[])
+{
+       int ret;
+
+       openlog (NULL, LOG_CONS|LOG_PID, LOG_DAEMON);
+       syslog (LOG_ERR, "confdb_test_agent STARTING");
+
+       parse_debug = 1;
+       ret = test_agent_run (9035, do_command);
+       syslog (LOG_ERR, "confdb_test_agent EXITING");
+
+       return ret;
+}
+
+
diff --git a/cts/agents/cpg_test_agent.c b/cts/agents/cpg_test_agent.c
index de47ca8..ac87af4 100644
--- a/cts/agents/cpg_test_agent.c
+++ b/cts/agents/cpg_test_agent.c
@@ -51,10 +51,9 @@
 #include <corosync/list.h>
 #include <corosync/cpg.h>
 #include "../../exec/crypto.h"
+#include "common_test_agent.h"
 

-#define SERVER_PORT "9034"
-
 typedef enum {
        MSG_OK,
        MSG_NODEID_ERR,
@@ -79,10 +78,7 @@ typedef struct {
        struct list_head list;
 } log_entry_t;
 
-#define HOW_BIG_AND_BUF 4096
 static char big_and_buf[HOW_BIG_AND_BUF];
-static char big_and_buf_rx[HOW_BIG_AND_BUF];
-static int32_t parse_debug = 0;
 static int32_t record_config_events_g = 0;
 static int32_t record_messages_g = 0;
 static cpg_handle_t cpg_handle = 0;
@@ -94,7 +90,6 @@ static uint32_t my_nodeid;
 static int32_t my_seq;
 static int32_t my_msgs_to_send;
 static int32_t total_stored_msgs = 0;
-static hdb_handle_t poll_handle;
 

 static void send_some_more_messages (void * unused);
@@ -289,7 +284,7 @@ static void send_some_more_messages_later (void)
        poll_timer_handle timer_handle;
        cpg_dispatch (cpg_handle, CS_DISPATCH_ALL);
        poll_timer_add (
-               poll_handle,
+               ta_poll_handle_get(),
                100, NULL,
                send_some_more_messages,
                &timer_handle);
@@ -384,7 +379,7 @@ static int cpg_dispatch_wrapper_fn (hdb_handle_t handle,
        cs_error_t error = cpg_dispatch (cpg_handle, CS_DISPATCH_ALL);
        if (error == CS_ERR_LIBRARY) {
                syslog (LOG_ERR, "%s() got LIB error disconnecting from 
corosync.", __func__);
-               poll_dispatch_delete (poll_handle, cpg_fd);
+               poll_dispatch_delete (ta_poll_handle_get(), cpg_fd);
                close (cpg_fd);
                cpg_fd = -1;
        }
@@ -450,7 +445,7 @@ static void do_command (int sock, char* func, char*args[], 
int num_args)
                }
 
                cpg_fd_get (cpg_handle, &cpg_fd);
-               poll_dispatch_add (poll_handle, cpg_fd, POLLIN|POLLNVAL, NULL, 
cpg_dispatch_wrapper_fn);
+               poll_dispatch_add (ta_poll_handle_get(), cpg_fd, 
POLLIN|POLLNVAL, NULL, cpg_dispatch_wrapper_fn);
 
        } else if (strcmp ("cpg_local_get", func) == 0) {
                unsigned int local_nodeid;
@@ -463,7 +458,7 @@ static void do_command (int sock, char* func, char*args[], 
int num_args)
        } else if (strcmp ("cpg_finalize",func) == 0) {
 
                cpg_finalize (cpg_handle);
-               poll_dispatch_delete (poll_handle, cpg_fd);
+               poll_dispatch_delete (ta_poll_handle_get(), cpg_fd);
                cpg_fd = -1;
 
        } else if (strcmp ("record_config_events",func) == 0) {
@@ -491,192 +486,14 @@ static void do_command (int sock, char* func, 
char*args[], int num_args)
        }
 }
 
-static void handle_command (int sock, char* msg)
-{
-       int num_args;
-       char *saveptr = NULL;
-       char *str = strdup (msg);
-       char *str_len;
-       char *str_arg;
-       char *args[5];
-       int i = 0;
-       int a = 0;
-       char* func = NULL;
-
-       if (parse_debug)
-               syslog (LOG_DEBUG,"%s (MSG:%s)\n", __func__, msg);
-
-       str_len = strtok_r (str, ":", &saveptr);
-       assert (str_len);
-
-       num_args = atoi (str_len) * 2;
-       for (i = 0; i < num_args / 2; i++) {
-               str_len = strtok_r (NULL, ":", &saveptr);
-               str_arg = strtok_r (NULL, ":", &saveptr);
-               if (func == NULL) {
-                       /* first "arg" is the function */
-                       if (parse_debug)
-                               syslog (LOG_DEBUG, "(LEN:%s, FUNC:%s)", 
str_len, str_arg);
-                       func = str_arg;
-                       a = 0;
-               } else {
-                       args[a] = str_arg;
-                       a++;
-                       if (parse_debug)
-                               syslog (LOG_DEBUG, "(LEN:%s, ARG:%s)", str_len, 
str_arg);
-               }
-       }
-       do_command (sock, func, args, a+1);
-
-       free (str);
-}
-
-static int server_process_data_fn (hdb_handle_t handle,
-       int fd,
-       int revents,
-       void *data)
-{
-       char *saveptr;
-       char *msg;
-       char *cmd;
-       int32_t nbytes;
-
-       if ((nbytes = recv (fd, big_and_buf_rx, sizeof (big_and_buf_rx), 0)) <= 
0) {
-               /* got error or connection closed by client */
-               if (nbytes == 0) {
-                       /* connection closed */
-                       syslog (LOG_WARNING, "socket %d hung up: exiting...\n", 
fd);
-               } else {
-                       syslog (LOG_ERR,"recv() failed: %s", strerror(errno));
-               }
-               close (fd);
-               exit (0);
-       } else {
-               if (my_msgs_to_send > 0)
-                       send_some_more_messages (NULL);
-
-               big_and_buf_rx[nbytes] = '\0';
-
-               msg = strtok_r (big_and_buf_rx, ";", &saveptr);
-               assert (msg);
-               while (msg) {
-                       cmd = strdup (msg);
-                       handle_command (fd, cmd);
-                       free (cmd);
-                       msg = strtok_r (NULL, ";", &saveptr);
-               }
-       }
-
-       return 0;
-}
-
-static int server_accept_fn (hdb_handle_t handle,
-       int fd,
-       int revents,
-       void *data)
-{
-       socklen_t addrlen;
-       struct sockaddr_in in_addr;
-       int new_fd;
-       int res;
-
-       addrlen = sizeof (struct sockaddr_in);
-
-retry_accept:
-       new_fd = accept (fd, (struct sockaddr *)&in_addr, &addrlen);
-       if (new_fd == -1 && errno == EINTR) {
-               goto retry_accept;
-       }
-
-       if (new_fd == -1) {
-               syslog (LOG_ERR,
-                       "Could not accept connection: %s\n", strerror (errno));
-               return (0); /* This is an error, but -1 would indicate 
disconnect from poll loop */
-       }
-
-       res = fcntl (new_fd, F_SETFL, O_NONBLOCK);
-       if (res == -1) {
-               syslog (LOG_ERR,
-                       "Could not set non-blocking operation on connection: 
%s\n",
-                       strerror (errno));
-               close (new_fd);
-               return (0); /* This is an error, but -1 would indicate 
disconnect from poll loop */
-       }
-
-       poll_dispatch_add (poll_handle, new_fd, POLLIN|POLLNVAL, NULL, 
server_process_data_fn);
-       return 0;
-}
-
-static int create_server_sockect (void)
-{
-       int listener;
-       int yes = 1;
-       int rv;
-       struct addrinfo hints, *ai, *p;
-
-       /* get a socket and bind it
-        */
-       memset (&hints, 0, sizeof hints);
-       hints.ai_family = AF_UNSPEC;
-       hints.ai_socktype = SOCK_STREAM;
-       hints.ai_flags = AI_PASSIVE;
-       if ((rv = getaddrinfo (NULL, SERVER_PORT, &hints, &ai)) != 0) {
-               syslog (LOG_ERR, "%s\n", gai_strerror (rv));
-               exit (1);
-       }
-
-       for (p = ai; p != NULL; p = p->ai_next) {
-               listener = socket (p->ai_family, p->ai_socktype, 
p->ai_protocol);
-               if (listener < 0) {
-                       continue;
-               }
-
-               /* lose the pesky "address already in use" error message
-                */
-               if (setsockopt (listener, SOL_SOCKET, SO_REUSEADDR,
-                               &yes, sizeof(int)) < 0) {
-                       syslog (LOG_ERR, "setsockopt() failed: %s\n", strerror 
(errno));
-               }
-
-               if (bind (listener, p->ai_addr, p->ai_addrlen) < 0) {
-                       syslog (LOG_ERR, "bind() failed: %s\n", strerror 
(errno));
-                       close (listener);
-                       continue;
-               }
-
-               break;
-       }
-
-       if (p == NULL) {
-               syslog (LOG_ERR, "failed to bind\n");
-               exit (2);
-       }
-
-       freeaddrinfo (ai);
-
-       if (listen (listener, 10) == -1) {
-               syslog (LOG_ERR, "listen() failed: %s", strerror(errno));
-               exit (3);
-       }
-
-       return listener;
-}
 
 int main (int argc, char *argv[])
 {
-       int listener;
-
        openlog (NULL, LOG_CONS|LOG_PID, LOG_DAEMON);
 
        list_init (&msg_log_head);
        list_init (&config_chg_log_head);
 
-       poll_handle = poll_create ();
-
-       listener = create_server_sockect ();
-       poll_dispatch_add (poll_handle, listener, POLLIN|POLLNVAL, NULL, 
server_accept_fn);
-
-       poll_run (poll_handle);
-       return -1;
+       return test_agent_run (9034, do_command);
 }
 
diff --git a/cts/corosync.py b/cts/corosync.py
index 9455a36..f54af4d 100644
--- a/cts/corosync.py
+++ b/cts/corosync.py
@@ -135,7 +135,8 @@ class corosync_flatiron(ClusterManager):
             ),
             "LogFileName"    : Environment["LogFileName"],
             })
-        self.agent={}
+        self.cpg_agent={}
+        self.confdb_agent={}
         self.config = CoroConfig ()
         self.node_to_ip = {}
         
@@ -209,8 +210,10 @@ class corosync_flatiron(ClusterManager):
 
         self.debug('starting corosync on : ' + node)
         ret = ClusterManager.StartaCM(self, node)
-        if self.agent.has_key(node):
-            self.agent[node].restart()
+        if self.cpg_agent.has_key(node):
+            self.cpg_agent[node].restart()
+        if self.confdb_agent.has_key(node):
+            self.confdb_agent[node].restart()
         return ret
 
     def StopaCM(self, node):
@@ -218,8 +221,10 @@ class corosync_flatiron(ClusterManager):
             return 1
 
         self.debug('stoping corosync on : ' + node)
-        if self.agent.has_key(node):
-            self.agent[node].stop()
+        if self.cpg_agent.has_key(node):
+            self.cpg_agent[node].stop()
+        if self.confdb_agent.has_key(node):
+            self.confdb_agent[node].stop()
         return ClusterManager.StopaCM(self, node)
 
     def test_node_CM(self, node):
@@ -318,15 +323,18 @@ class TestAgentComponent(ScenarioComponent):
             if not CM.StataCM(node):
                 raise RuntimeError ("corosync not up")
 
-            self.CM.agent[node] = CpgTestAgent(node, CM.Env)
-            self.CM.agent[node].start()
+            self.CM.cpg_agent[node] = CpgTestAgent(node, CM.Env)
+            self.CM.cpg_agent[node].start()
+            self.CM.confdb_agent[node] = ConfdbTestAgent(node, CM.Env)
+            self.CM.confdb_agent[node].start()
         return 1
 
     def TearDown(self, CM):
         '''Tear down (undo) the given ScenarioComponent'''
         self.CM = CM
         for node in self.Env["nodes"]:
-            self.CM.agent[node].stop()
+            self.CM.cpg_agent[node].stop()
+            self.CM.confdb_agent[node].stop()
 
 ###################################################################
 class TestAgent(object):
@@ -342,6 +350,7 @@ class TestAgent(object):
         self.func_name = None
         self.used = False
         self.env = env
+        self.send_recv = False
 
     def restart(self):
         self.stop()
@@ -416,7 +425,14 @@ class TestAgent(object):
             return object.__getattribute__(self, name)
         except:
             self.func_name = name
-            return self.send_dynamic
+            if self.send_recv:
+                return self.send_recv_dynamic
+            else:
+                return self.send_dynamic
+
+    def send_recv_dynamic (self, *args):
+        self.send_dynamic (args)
+        return self.read()
 
     def send_dynamic (self, *args):
         if not self.started:
@@ -484,7 +500,7 @@ class CpgTestAgent(TestAgent):
         try:
             self.send(["cpg_finalize"])
         except RuntimeError, msg:
-            # if agent is down, we are not going to stress
+            # if cpg_agent is down, we are not going to stress
             print msg
 
         TestAgent.stop(self)
@@ -519,3 +535,15 @@ class CpgTestAgent(TestAgent):
         else:
             return msg
 
+###################################################################
+class ConfdbTestAgent(TestAgent):
+
+    def __init__(self, node, Env=None):
+        TestAgent.__init__(self, "confdb_test_agent", node, 9035, env=Env)
+        self.initialized = False
+        self.nodeid = None
+        self.send_recv = True
+
+    def cpg_local_get(self):
+        return 1
+
diff --git a/cts/corotests.py b/cts/corotests.py
index fb28fc5..8fe5149 100644
--- a/cts/corotests.py
+++ b/cts/corotests.py
@@ -97,15 +97,15 @@ class CpgConfigChangeBase(CoroTest):
         self.listener = None
         self.wobbly = None
         for n in self.CM.Env["nodes"]:
-            self.CM.agent[n].clean_start()
-            self.CM.agent[n].cpg_join(self.name)
+            self.CM.cpg_agent[n].clean_start()
+            self.CM.cpg_agent[n].cpg_join(self.name)
             if self.listener is None:
                 self.listener = n
             elif self.wobbly is None:
                 self.wobbly = n
 
-        self.wobbly_id = self.CM.agent[self.wobbly].cpg_local_get()
-        self.CM.agent[self.listener].record_config_events(truncate=True)
+        self.wobbly_id = self.CM.cpg_agent[self.wobbly].cpg_local_get()
+        self.CM.cpg_agent[self.listener].record_config_events(truncate=True)
 
         return ret
 
@@ -117,9 +117,9 @@ class CpgConfigChangeBase(CoroTest):
         self.CM.log("Waiting for config change on " + self.listener)
         while not found:
             try:
-                event = self.CM.agent[self.listener].read_config_event()
+                event = self.CM.cpg_agent[self.listener].read_config_event()
             except:
-                return self.failure('connection to test agent failed.')
+                return self.failure('connection to test cpg_agent failed.')
             if not event == None:
                 self.CM.debug("RECEIVED: " + str(event))
             if event == None:
@@ -155,7 +155,7 @@ class CpgCfgChgOnGroupLeave(CpgConfigChangeBase):
 
     def failure_action(self):
         self.CM.log("calling cpg_leave() on " + self.wobbly)
-        self.CM.agent[self.wobbly].cpg_leave(self.name)
+        self.CM.cpg_agent[self.wobbly].cpg_leave(self.name)
 
     def __call__(self, node):
         self.incr("calls")
@@ -230,16 +230,16 @@ class CpgMsgOrderBase(CoroTest):
 
         for n in self.CM.Env["nodes"]:
             self.total_num_msgs = self.total_num_msgs + self.num_msgs_per_node
-            self.CM.agent[n].clean_start()
-            self.CM.agent[n].cpg_join(self.name)
-            self.CM.agent[n].record_messages()
+            self.CM.cpg_agent[n].clean_start()
+            self.CM.cpg_agent[n].cpg_join(self.name)
+            self.CM.cpg_agent[n].record_messages()
 
         time.sleep(1)
         return ret
 
     def cpg_msg_blaster(self):
         for n in self.CM.Env["nodes"]:
-            self.CM.agent[n].msg_blaster(self.num_msgs_per_node)
+            self.CM.cpg_agent[n].msg_blaster(self.num_msgs_per_node)
         
     def wait_and_validate_order(self):
         msgs = {}
@@ -251,7 +251,7 @@ class CpgMsgOrderBase(CoroTest):
 
             while len(msgs[n]) < self.total_num_msgs and waited < 60:
 
-                msg = self.CM.agent[n].read_messages(25)
+                msg = self.CM.cpg_agent[n].read_messages(25)
                 if not msg == None:
                     msgl = msg.split(";")
 
@@ -428,6 +428,67 @@ class ServiceLoadTest(CoroTest):
 
         return self.success()
 
+
+###################################################################
+class ConfdbReplaceTest(CoroTest):
+    def __init__(self, cm):
+        CoroTest.__init__(self, cm)
+        self.name="ConfdbReplaceTest"
+
+    def __call__(self, node):
+        self.incr("calls")
+        res = self.CM.confdb_agent[node].set_get_test()
+        if 'OK' in res:
+            return self.success()
+        else:
+            return self.failure('set_get_test failed')
+
+
+###################################################################
+class ConfdbIncrementTest(CoroTest):
+    def __init__(self, cm):
+        CoroTest.__init__(self, cm)
+        self.name="ConfdbIncrementTest"
+
+    def __call__(self, node):
+        self.incr("calls")
+        res = self.CM.confdb_agent[node].increment_decrement_test()
+        if 'OK' in res:
+            return self.success()
+        else:
+            return self.failure('increment_decrement_test failed')
+
+
+###################################################################
+class ConfdbObjectFindTest(CoroTest):
+    def __init__(self, cm):
+        CoroTest.__init__(self, cm)
+        self.name="ConfdbObjectFindTest"
+
+    def __call__(self, node):
+        self.incr("calls")
+        res = self.CM.confdb_agent[node].object_find_test()
+        if 'OK' in res:
+            return self.success()
+        else:
+            return self.failure('object_find_test failed')
+
+
+###################################################################
+class ConfdbNotificationTest(CoroTest):
+    def __init__(self, cm):
+        CoroTest.__init__(self, cm)
+        self.name="ConfdbNotificationTest"
+
+    def __call__(self, node):
+        self.incr("calls")
+        res = self.CM.confdb_agent[node].notification_test()
+        if 'OK' in res:
+            return self.success()
+        else:
+            return self.failure('notification_test failed')
+
+
 GenTestClasses = []
 GenTestClasses.append(CpgMsgOrderBasic)
 GenTestClasses.append(CpgCfgChgOnExecCrash)
@@ -436,6 +497,11 @@ GenTestClasses.append(CpgCfgChgOnNodeLeave)
 GenTestClasses.append(CpgCfgChgOnNodeIsolate)
 
 AllTestClasses = []
+AllTestClasses.append(ConfdbReplaceTest)
+AllTestClasses.append(ConfdbIncrementTest)
+AllTestClasses.append(ConfdbObjectFindTest)
+AllTestClasses.append(ConfdbNotificationTest)
+
 AllTestClasses.append(ServiceLoadTest)
 AllTestClasses.append(MemLeakObject)
 AllTestClasses.append(MemLeakSession)
@@ -488,9 +554,9 @@ def CoroTestList(cm, audits):
     configs.append(e)
 
     #quorum/provider=
-    f = {}
-    f['quorum/provider'] = 'corosync_quorum_ykd'
-    configs.append(f)
+    #f = {}
+    #f['quorum/provider'] = 'corosync_quorum_ykd'
+    #configs.append(f)
 
     num=1
     for cfg in configs:
-- 
1.6.6.1


_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to