good for merge On Thu, 2010-03-25 at 07:38 +1100, Angus Salkeld wrote: > 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:
_______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
