All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6)
@ 2010-01-08 14:55 Jeff Layton
  2010-01-08 14:56 ` [PATCH 1/4] nfs-utils: make private cookie to hex conversion a library routine Jeff Layton
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Jeff Layton @ 2010-01-08 14:55 UTC (permalink / raw)
  To: steved; +Cc: chuck.lever, bfields, linux-nfs

This is an updated patchset for adding test infrastructure to nfs-utils.
The main differences in this patchset are:

1) some bugfixes in the statdb_dump program

2) an extra check for root privs in the t0001 test. If the caller
doesn't have root privs, then the test is skipped

This patchset is intended as a starting point for an automated test
suite for nfs-utils. The idea here is to start simply and add a suite of
tests that we can run via "make check" -- the standard automake method
for running tests.

Clearly there are limits to what we can test without a multi-host test
harness. My hope is that this should help keep us from breaking basic
functionality by allowing us to test it in a very simple fashion. At
some point in the future we should also consider how to best handle
multi-machine testing, but I see that as complimenting this code rather
than replacing it.

For this set, the focus is on testing statd, which is particularly
susceptible to subtle breakage. Problems with it are often not noticed
until lock recovery breaks, and that may greatly lag the actual
breakage.

To faciitate statd testing, I've added a "nsm_client" program that can
serve as a synthetic statd client and an NLM simulator. It's very
loosely based on the old statd simulator code. That program is dependent
on some of Chuck Lever's recent statd patches -- notably the ones that
break out common NSM code into libnsm.a.

For this initial drop, I'm just adding a single test that tests mon and
unmon functionality with statd. Adding more tests should be fairly simple
to do.

Jeff Layton (4):
  nfs-utils: make private cookie to hex conversion a library routine
  nfs-utils: introduce new statd testing simulator
  nfs-utils: add statdb_dump utility
  nfs-utils: add initial tests for statd that run via "make check"

 Makefile.am                          |    2 +-
 configure.ac                         |    4 +-
 support/include/nsm.h                |    2 +
 support/nsm/file.c                   |   44 +++-
 tests/Makefile.am                    |   13 +
 tests/nsm_client/Makefile.am         |   45 ++++
 tests/nsm_client/README              |   12 +
 tests/nsm_client/nlm_sm_inter.x      |   43 +++
 tests/nsm_client/nsm_client.c        |  465 ++++++++++++++++++++++++++++++++++
 tests/statdb_dump.c                  |   99 +++++++
 tests/t0001-statd-basic-mon-unmon.sh |   58 +++++
 tests/test-lib.sh                    |   60 +++++
 12 files changed, 835 insertions(+), 12 deletions(-)
 create mode 100644 tests/Makefile.am
 create mode 100644 tests/nsm_client/Makefile.am
 create mode 100644 tests/nsm_client/README
 create mode 100644 tests/nsm_client/nlm_sm_inter.x
 create mode 100644 tests/nsm_client/nsm_client.c
 create mode 100644 tests/statdb_dump.c
 create mode 100755 tests/t0001-statd-basic-mon-unmon.sh
 create mode 100755 tests/test-lib.sh


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/4] nfs-utils: make private cookie to hex conversion a library routine
  2010-01-08 14:55 [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6) Jeff Layton
@ 2010-01-08 14:56 ` Jeff Layton
  2010-01-08 14:56 ` [PATCH 2/4] nfs-utils: introduce new statd testing simulator Jeff Layton
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Jeff Layton @ 2010-01-08 14:56 UTC (permalink / raw)
  To: steved; +Cc: chuck.lever, bfields, linux-nfs

Signed-off-by: Jeff Layton <jlayton@redhat.com>
---
 support/include/nsm.h |    2 ++
 support/nsm/file.c    |   44 ++++++++++++++++++++++++++++++++++----------
 2 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/support/include/nsm.h b/support/include/nsm.h
index 850c191..db53eb2 100644
--- a/support/include/nsm.h
+++ b/support/include/nsm.h
@@ -71,6 +71,8 @@ extern void	nsm_delete_monitored_host(const char *hostname,
 			const char *mon_name, const char *my_name);
 extern void	nsm_delete_notified_host(const char *hostname,
 			const char *mon_name, const char *my_name);
+extern size_t	nsm_priv_to_hex(const char *priv, char *buf,
+				const size_t buflen);
 
 /* rpc.c */
 
diff --git a/support/nsm/file.c b/support/nsm/file.c
index 635fb4e..7e923ef 100644
--- a/support/nsm/file.c
+++ b/support/nsm/file.c
@@ -677,6 +677,33 @@ nsm_retire_monitored_hosts(void)
 }
 
 /*
+ * nsm_priv_to_hex - convert a NSM private cookie to a hex string.
+ *
+ * @priv: buffer holding the binary NSM private cookie
+ * @buf: output buffer for NULL terminated hex string
+ * @buflen: size of output buffer
+ *
+ * Returns the length of the resulting string or 0 on error
+ */
+size_t
+nsm_priv_to_hex(const char *priv, char *buf, const size_t buflen)
+{
+	int i, len;
+	size_t remaining = buflen;
+
+	for (i = 0; i < SM_PRIV_SIZE; i++) {
+		len = snprintf(buf, remaining, "%02x",
+				(unsigned int)(0xff & priv[i]));
+		if (error_check(len, remaining))
+			return 0;
+		buf += len;
+		remaining -= (size_t)len;
+	}
+
+	return buflen - remaining;
+}
+
+/*
  * Returns the length in bytes of the created record.
  */
 __attribute_noinline__
@@ -685,8 +712,8 @@ nsm_create_monitor_record(char *buf, const size_t buflen,
 		const struct sockaddr *sap, const struct mon *m)
 {
 	const struct sockaddr_in *sin = (const struct sockaddr_in *)sap;
-	size_t remaining = buflen;
-	int i, len;
+	size_t hexlen, remaining = buflen;
+	int len;
 
 	len = snprintf(buf, remaining, "%08x %08x %08x %08x ",
 			(unsigned int)sin->sin_addr.s_addr,
@@ -698,14 +725,11 @@ nsm_create_monitor_record(char *buf, const size_t buflen,
 	buf += len;
 	remaining -= (size_t)len;
 
-	for (i = 0; i < SM_PRIV_SIZE; i++) {
-		len = snprintf(buf, remaining, "%02x",
-				(unsigned int)(0xff & m->priv[i]));
-		if (error_check(len, remaining))
-			return 0;
-		buf += len;
-		remaining -= (size_t)len;
-	}
+	hexlen = nsm_priv_to_hex(m->priv, buf, remaining);
+	if (hexlen == 0)
+		return 0;
+	buf += hexlen;
+	remaining -= hexlen;
 
 	len = snprintf(buf, remaining, " %s %s\n",
 			m->mon_id.mon_name, m->mon_id.my_id.my_name);
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/4] nfs-utils: introduce new statd testing simulator
  2010-01-08 14:55 [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6) Jeff Layton
  2010-01-08 14:56 ` [PATCH 1/4] nfs-utils: make private cookie to hex conversion a library routine Jeff Layton
@ 2010-01-08 14:56 ` Jeff Layton
  2010-01-08 14:56 ` [PATCH 3/4] nfs-utils: add statdb_dump utility Jeff Layton
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Jeff Layton @ 2010-01-08 14:56 UTC (permalink / raw)
  To: steved; +Cc: chuck.lever, bfields, linux-nfs

rpc.statd is often prone to subtle, difficult to detect breakage. When
it has problems, they're often invisible and only manifest themselves
as failed lock recovery.

This program is intended to function as part of a test harness for
statd. It's a multicall binary that serves as a synthetic NSM client
program, and a daemon that can simulate lockd for purposes of testing
the NSM to NLM downcall.

A new top level "tests/" directory is also added to nfs-utils to start
as a repository for automated tests of nfs-utils components.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
---
 Makefile.am                     |    2 +-
 configure.ac                    |    4 +-
 tests/Makefile.am               |    5 +
 tests/nsm_client/Makefile.am    |   45 ++++
 tests/nsm_client/README         |   12 +
 tests/nsm_client/nlm_sm_inter.x |   43 ++++
 tests/nsm_client/nsm_client.c   |  465 +++++++++++++++++++++++++++++++++++++++
 7 files changed, 574 insertions(+), 2 deletions(-)
 create mode 100644 tests/Makefile.am
 create mode 100644 tests/nsm_client/Makefile.am
 create mode 100644 tests/nsm_client/README
 create mode 100644 tests/nsm_client/nlm_sm_inter.x
 create mode 100644 tests/nsm_client/nsm_client.c

diff --git a/Makefile.am b/Makefile.am
index b3a6e91..ae7cd16 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,7 +2,7 @@
 
 AUTOMAKE_OPTIONS = foreign
 
-SUBDIRS = tools support utils linux-nfs
+SUBDIRS = tools support utils linux-nfs tests
 
 MAINTAINERCLEANFILES = Makefile.in
 
diff --git a/configure.ac b/configure.ac
index 7dffeaf..1dc4249 100644
--- a/configure.ac
+++ b/configure.ac
@@ -420,6 +420,8 @@ AC_CONFIG_FILES([
 	utils/nfsd/Makefile
 	utils/nfsstat/Makefile
 	utils/showmount/Makefile
-	utils/statd/Makefile])
+	utils/statd/Makefile
+	tests/Makefile
+	tests/nsm_client/Makefile])
 AC_OUTPUT
 
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..375af80
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,5 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = nsm_client
+
+MAINTAINERCLEANFILES = Makefile.in
diff --git a/tests/nsm_client/Makefile.am b/tests/nsm_client/Makefile.am
new file mode 100644
index 0000000..4bf0a45
--- /dev/null
+++ b/tests/nsm_client/Makefile.am
@@ -0,0 +1,45 @@
+## Process this file with automake to produce Makefile.in
+
+GENFILES_CLNT	= nlm_sm_inter_clnt.c
+GENFILES_SVC	= nlm_sm_inter_svc.c
+GENFILES_XDR	= nlm_sm_inter_xdr.c
+GENFILES_H	= nlm_sm_inter.h
+
+GENFILES	= $(GENFILES_CLNT) $(GENFILES_SVC) $(GENFILES_XDR) $(GENFILES_H)
+
+
+check_PROGRAMS	= nsm_client
+nsm_client_SOURCES = $(GENFILES) nsm_client.c
+
+BUILT_SOURCES = $(GENFILES)
+nsm_client_LDADD = ../../support/nfs/libnfs.a \
+		   ../../support/nsm/libnsm.a $(LIBCAP)
+
+if CONFIG_RPCGEN
+RPCGEN	= $(top_builddir)/tools/rpcgen/rpcgen
+$(RPCGEN):
+	make -C ../../tools/rpcgen all
+else
+RPCGEN = @RPCGEN_PATH@
+endif
+
+$(GENFILES_CLNT): %_clnt.c: %.x $(RPCGEN)
+	test -f $@ && rm -rf $@ || true
+	$(RPCGEN) -l -o $@ $<
+
+$(GENFILES_SVC): %_svc.c: %.x $(RPCGEN)
+	test -f $@ && rm -rf $@ || true
+	$(RPCGEN) -m -o $@ $<
+
+$(GENFILES_XDR): %_xdr.c: %.x $(RPCGEN)
+	test -f $@ && rm -rf $@ || true
+	$(RPCGEN) -c -o $@ $<
+
+$(GENFILES_H): %.h: %.x $(RPCGEN)
+	test -f $@ && rm -rf $@ || true
+	$(RPCGEN) -h -o $@ $<
+
+MAINTAINERCLEANFILES = Makefile.in
+
+CLEANFILES = $(GENFILES)
+
diff --git a/tests/nsm_client/README b/tests/nsm_client/README
new file mode 100644
index 0000000..85379dd
--- /dev/null
+++ b/tests/nsm_client/README
@@ -0,0 +1,12 @@
+The nsm_client program is intended for testing statd. It has the ability
+to act as a synthetic NSM client for sending artificial NSM calls to any
+host you choose.
+
+It also has an NLM simulator that implements the call that statd uses to
+communicate with lockd. The daemon simulator will start itself up,
+register as an NLM service and listen for "downcalls" from statd. When
+it gets one, it will log a message.
+
+Note that lockd will need to be down when using the daemon simulator. It
+also does not implement the entire NLM protocol and is only really
+useful for testing statd's downcall.
diff --git a/tests/nsm_client/nlm_sm_inter.x b/tests/nsm_client/nlm_sm_inter.x
new file mode 100644
index 0000000..95fa326
--- /dev/null
+++ b/tests/nsm_client/nlm_sm_inter.x
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 1995, 1997-1999 Jeffrey A. Uphoff
+ * Modified by Olaf Kirch, 1996.
+ * Modified by H.J. Lu, 1998.
+ * Modified by Jeff Layton, 2010.
+ *
+ * NLM similator for Linux
+ */
+
+#ifdef RPC_CLNT
+%#include <string.h>
+#endif
+
+/*
+ * statd rejects monitor registrations for any non-lockd services, so pretend
+ * to be lockd when testing. Furthermore, the only call we care about from
+ * statd is #16, which is the downcall to notify the kernel of a host's status
+ * change.
+ */
+program NLM_SM_PROG {
+	/* version 3 of the NLM protocol */
+	version NLM_SM_VERS3 {
+		void	 NLM_SM_NOTIFY(struct nlm_sm_notify) = 16;
+	} = 3;
+
+	/* version 2 of NLM protocol */
+	version NLM_SM_VERS4 {
+		void	 NLM_SM_NOTIFY(struct nlm_sm_notify) = 16;
+	} = 4;
+} = 100021;
+
+const  SM_MAXSTRLEN = 1024;
+const  SM_PRIV_SIZE = 16;
+
+/*
+ * structure of the status message sent back by the status monitor
+ * when monitor site status changes
+ */
+struct nlm_sm_notify {
+	string mon_name<SM_MAXSTRLEN>;
+	int state;
+	opaque priv[SM_PRIV_SIZE]; /* stored private information */
+};
diff --git a/tests/nsm_client/nsm_client.c b/tests/nsm_client/nsm_client.c
new file mode 100644
index 0000000..0d1159a
--- /dev/null
+++ b/tests/nsm_client/nsm_client.c
@@ -0,0 +1,465 @@
+/*
+ * nsm_client.c -- synthetic client and lockd simulator for testing statd
+ *
+ * Copyright (C) 2010  Red Hat, Jeff Layton <jlayton@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * Very loosely based on "simulator.c" in the statd directory. Original
+ * copyright for that program follows:
+ *
+ * Copyright (C) 1995-1997, 1999 Jeffrey A. Uphoff
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <errno.h>
+#include <getopt.h>
+#include <netdb.h>
+#include <signal.h>
+#include <string.h>
+#include <rpc/rpc.h>
+#include <rpc/pmap_clnt.h>
+#include <rpcmisc.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "nfslib.h"
+#include "nfsrpc.h"
+#include "nsm.h"
+#include "sm_inter.h"
+#include "nlm_sm_inter.h"
+#include "sockaddr.h"
+#include "xcommon.h"
+
+static void daemon_simulator(void);
+static void sim_killer(int sig);
+static int nsm_client_crash(char *);
+static int nsm_client_mon(char *, char *, char *, char *, int, int);
+static int nsm_client_stat(char *, char *);
+static int nsm_client_notify(char *, char *, char *);
+static int nsm_client_unmon(char *, char *, char *, int, int);
+static int nsm_client_unmon_all(char *, char *, int, int);
+
+extern void nlm_sm_prog_4(struct svc_req *rqstp, register SVCXPRT *transp);
+extern void svc_exit(void);
+
+/*
+ * default to 15 retransmit interval, which seems to be the default for
+ * UDP clients w/ legacy glibc RPC
+ */
+static struct timeval retrans_interval =
+{
+	.tv_sec = 15,
+};
+
+static struct option longopts[] =
+{
+	{ "help", 0, 0, 'h' },
+	{ "host", 0, 0, 'H' },
+	{ "name", 1, 0, 'n' },
+	{ "program", 1, 0, 'P' },
+	{ "version", 1, 0, 'v' },
+	{ NULL, 0, 0, 0 },
+};
+
+static int
+usage(char *program)
+{
+	printf("Usage:\n");
+	printf("%s [options] <command> [arg]...\n", program);
+	printf("where command is one of these with the specified args:\n");
+	printf("crash\t\t\t\ttell host to simulate crash\n");
+	printf("daemon\t\t\t\t\tstart up lockd daemon simulator\n");
+	printf("notify <mon_name> <state>\tsend a reboot notification to host\n");
+	printf("stat <mon_name>\t\t\tget status of <mon_name> on host\n");
+	printf("unmon_all\t\t\ttell host to unmon everything\n");
+	printf("unmon <mon_name>\t\t\ttell host to unmon <mon_name>\n");
+	printf("mon <mon_name> <cookie>\t\ttell host to monitor <mon_name> with private <cookie>\n");
+	return 1;
+}
+
+static int
+hex2bin(char *dst, size_t dstlen, char *src)
+{
+	int i;
+	unsigned int tmp;
+
+	for (i = 0; *src && i < dstlen; i++) {
+		if (sscanf(src, "%2x", &tmp) != 1)
+			return 0;
+		dst[i] = tmp;
+		src++;
+		if (!*src)
+			break;
+		src++;
+	}
+
+	return 1;
+}
+
+static void
+bin2hex(char *dst, char *src, size_t srclen)
+{
+	int i;
+
+	for (i = 0; i < srclen; i++)
+		dst += sprintf(dst, "%02x", 0xff & src[i]);
+}
+
+int
+main(int argc, char **argv)
+{
+	int arg, err = 0;
+	int remaining_args;
+	char my_name[NI_MAXHOST], host[NI_MAXHOST];
+	char cookie[SM_PRIV_SIZE];
+	int my_prog = NLM_SM_PROG;
+	int my_vers = NLM_SM_VERS4;
+
+	my_name[0] = '\0';
+	host[0] = '\0';
+
+	while ((arg = getopt_long(argc, argv, "hHn:P:v:", longopts,
+				  NULL)) != EOF) {
+		switch (arg) {
+		case 'H':
+			strncpy(host, optarg, sizeof(host));
+		case 'n':
+			strncpy(my_name, optarg, sizeof(my_name));
+		case 'P':
+			my_prog = atoi(optarg);
+		case 'v':
+			my_vers = atoi(optarg);
+		}
+	}
+
+	remaining_args = argc - optind;
+	if (remaining_args <= 0)
+		usage(argv[0]);
+
+	if (!my_name[0])
+		gethostname(my_name, sizeof(my_name));
+	if (!host[0])
+		strncpy(host, "127.0.0.1", sizeof(host));
+
+	if (!strcasecmp(argv[optind], "daemon")) {
+		daemon_simulator();
+	} else if (!strcasecmp(argv[optind], "crash")) {
+		err = nsm_client_crash(host);
+	} else if (!strcasecmp(argv[optind], "stat")) {
+		if (remaining_args < 2)
+			usage(argv[0]);
+		err = nsm_client_stat(host, argv[optind + 2]);
+	} else if (!strcasecmp(argv[optind], "unmon_all")) {
+		err = nsm_client_unmon_all(host, my_name, my_prog, my_vers);
+	} else if (!strcasecmp(argv[optind], "unmon")) {
+		if (remaining_args < 2)
+			usage(argv[0]);
+		err = nsm_client_unmon(host, argv[optind + 1], my_name, my_prog,
+					my_vers);
+	} else if (!strcasecmp(argv[optind], "notify")) {
+		if (remaining_args < 2)
+			usage(argv[0]);
+		err = nsm_client_notify(host, argv[optind + 1],
+					argv[optind + 2]);
+	} else if (!strcasecmp(argv[optind], "mon")) {
+		if (remaining_args < 2)
+			usage(argv[0]);
+
+		memset(cookie, '\0', SM_PRIV_SIZE);
+		if (!hex2bin(cookie, sizeof(cookie), argv[optind + 2])) {
+			fprintf(stderr, "SYS:%d\n", EINVAL);
+			printf("Unable to convert hex cookie %s to binary.\n",
+				argv[optind + 2]);
+			return 1;
+		}
+
+		err = nsm_client_mon(host, argv[optind + 1], cookie, my_name,
+					my_prog, my_vers);
+	} else {
+		err = usage(argv[0]);
+	}
+
+	return err;
+}
+
+static CLIENT *
+nsm_client_get_rpcclient(const char *node)
+{
+	unsigned short		port;
+	struct addrinfo		*ai;
+	struct addrinfo		hints = { .ai_flags	= AI_ADDRCONFIG };
+	int			err;
+	CLIENT			*client = NULL;
+
+#ifndef IPV6_ENABLED
+	hints.ai_family	= AF_INET;
+#endif /* IPV6_ENABLED */
+
+	/* FIXME: allow support for providing port? */
+	err = getaddrinfo(node, NULL, &hints, &ai);
+	if (err) {
+		fprintf(stderr, "EAI:%d\n", err);
+		if (err == EAI_SYSTEM)
+			fprintf(stderr, "SYS:%d\n", errno);
+		printf("Unable to translate host to address: %s\n",
+			err == EAI_SYSTEM ? strerror(errno) :
+			gai_strerror(err));
+		return client;
+	}
+
+	/* FIXME: allow for TCP too? */
+	port = nfs_getport(ai->ai_addr, ai->ai_addrlen, SM_PROG,
+			   SM_VERS, IPPROTO_UDP);
+	if (!port) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		printf("Unable to determine port for service\n");
+		goto out;
+	}
+
+	nfs_set_port(ai->ai_addr, port);
+
+	client = nfs_get_rpcclient(ai->ai_addr, ai->ai_addrlen, IPPROTO_UDP,
+				   SM_PROG, SM_VERS, &retrans_interval);
+	if (!client) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		printf("RPC client creation failed\n");
+	}
+out:
+	freeaddrinfo(ai);
+	return client;
+}
+
+static int
+nsm_client_mon(char *calling, char *monitoring, char *cookie, char *my_name,
+		int my_prog, int my_vers)
+{
+	CLIENT *client;
+	sm_stat_res *result;
+	mon mon;
+	int err = 0;
+
+	printf("Calling %s (as %s) to monitor %s\n", calling, my_name,
+		monitoring);
+
+	if ((client = nsm_client_get_rpcclient(calling)) == NULL)
+		return 1;
+
+	memcpy(mon.priv, cookie, SM_PRIV_SIZE);
+	mon.mon_id.my_id.my_name = my_name;
+	mon.mon_id.my_id.my_prog = my_prog;
+	mon.mon_id.my_id.my_vers = my_vers;
+	mon.mon_id.my_id.my_proc = NLM_SM_NOTIFY;
+	mon.mon_id.mon_name = monitoring;
+
+	if (!(result = sm_mon_1(&mon, client))) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		printf("%s\n", clnt_sperror(client, "sm_mon_1"));
+		err = 1;
+		goto mon_out;
+	}
+
+	printf("SM_MON request %s, state: %d\n",
+		result->res_stat == stat_succ ? "successful" : "failed",
+		result->state);
+
+	if (result->res_stat != stat_succ) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		err = 1;
+	}
+
+mon_out:
+	clnt_destroy(client);
+	return err;
+}
+
+static int
+nsm_client_unmon(char *calling, char *unmonitoring, char *my_name, int my_prog,
+		int my_vers)
+{
+	CLIENT *client;
+	sm_stat *result;
+	mon_id mon_id;
+	int err = 0;
+
+	printf("Calling %s (as %s) to unmonitor %s\n", calling, my_name,
+		unmonitoring);
+
+	if ((client = nsm_client_get_rpcclient(calling)) == NULL)
+		return 1;
+
+	mon_id.my_id.my_name = my_name;
+	mon_id.my_id.my_prog = my_prog;
+	mon_id.my_id.my_vers = my_vers;
+	mon_id.my_id.my_proc = NLM_SM_NOTIFY;
+	mon_id.mon_name = unmonitoring;
+
+	if (!(result = sm_unmon_1(&mon_id, client))) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		printf("%s\n", clnt_sperror(client, "sm_unmon_1"));
+		err = 1;
+		goto unmon_out;
+	}
+
+	printf("SM_UNMON state: %d\n", result->state);
+
+unmon_out:
+	clnt_destroy(client);
+	return err;
+}
+
+static int
+nsm_client_unmon_all(char *calling, char *my_name, int my_prog, int my_vers)
+{
+	CLIENT *client;
+	sm_stat *result;
+	my_id my_id;
+	int err = 0;
+
+	printf("Calling %s (as %s) to unmonitor all hosts\n", calling, my_name);
+
+	if ((client = nsm_client_get_rpcclient(calling)) == NULL) {
+		printf("RPC client creation failed\n");
+		return 1;
+	}
+
+	my_id.my_name = my_name;
+	my_id.my_prog = my_prog;
+	my_id.my_vers = my_vers;
+	my_id.my_proc = NLM_SM_NOTIFY;
+
+	if (!(result = sm_unmon_all_1(&my_id, client))) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		printf("%s\n", clnt_sperror(client, "sm_unmon_all_1"));
+		err = 1;
+		goto unmon_all_out;
+	}
+
+	printf("SM_UNMON_ALL state: %d\n", result->state);
+
+unmon_all_out:
+	return err;
+}
+
+static int
+nsm_client_crash(char *host)
+{
+	CLIENT *client;
+
+	if ((client = nsm_client_get_rpcclient(host)) == NULL)
+		return 1;
+
+	if (!sm_simu_crash_1(NULL, client)) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		printf("%s\n", clnt_sperror(client, "sm_simu_crash_1"));
+		return 1;
+	}
+
+	return 0;
+}
+
+static int
+nsm_client_stat(char *calling, char *monitoring)
+{
+	CLIENT *client;
+	sm_name checking;
+	sm_stat_res *result;
+
+	if ((client = nsm_client_get_rpcclient(calling)) == NULL)
+		return 1;
+
+	checking.mon_name = monitoring;
+
+	if (!(result = sm_stat_1(&checking, client))) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		printf("%s\n", clnt_sperror(client, "sm_stat_1"));
+		return 1;
+	}
+
+	if (result->res_stat != stat_succ) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		printf("stat_fail from %s for %s, state: %d\n", calling,
+			monitoring, result->state);
+		return 1;
+	}
+
+	printf("stat_succ from %s for %s, state: %d\n", calling,
+		monitoring, result->state);
+
+	return 0;
+}
+
+static int
+nsm_client_notify(char *calling, char *mon_name, char *statestr)
+{
+	CLIENT *client;
+
+	stat_chge stat_chge = { .mon_name	= mon_name };
+
+	stat_chge.state = atoi(statestr);
+
+	if ((client = nsm_client_get_rpcclient(calling)) == NULL)
+		return 1;
+
+	if (!sm_notify_1(&stat_chge, client)) {
+		fprintf(stderr, "RPC:%d\n", rpc_createerr.cf_stat);
+		printf("%s\n", clnt_sperror(client, "sm_notify_1"));
+		return 1;
+	}
+
+	return 0;
+}
+
+static void sim_killer(int sig)
+{
+#ifdef HAVE_LIBTIRPC
+	(void) rpcb_unset(NLM_SM_PROG, NLM_SM_VERS4, NULL);
+#else
+	(void) pmap_unset(NLM_SM_PROG, NLM_SM_VERS4);
+#endif
+	exit(0);
+}
+
+static void daemon_simulator(void)
+{
+	signal(SIGHUP, sim_killer);
+	signal(SIGINT, sim_killer);
+	signal(SIGTERM, sim_killer);
+	/* FIXME: allow for different versions? */
+	nfs_svc_create("nlmsim", NLM_SM_PROG, NLM_SM_VERS4, nlm_sm_prog_4, 0);
+	svc_run();
+}
+
+void *nlm_sm_notify_4_svc(struct nlm_sm_notify *argp, struct svc_req *rqstp)
+{
+	static char *result;
+	char	    priv[SM_PRIV_SIZE * 2 + 1];
+
+	bin2hex(priv, argp->priv, SM_PRIV_SIZE);
+
+	printf("state=%d:mon_name=%s:private=%s\n", argp->state,
+		argp->mon_name, priv);
+	return (void *) &result;
+}
+
+void *nlm_sm_notify_3_svc(struct nlm_sm_notify *argp, struct svc_req *rqstp)
+{
+	return nlm_sm_notify_4_svc(argp, rqstp);
+}
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/4] nfs-utils: add statdb_dump utility
  2010-01-08 14:55 [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6) Jeff Layton
  2010-01-08 14:56 ` [PATCH 1/4] nfs-utils: make private cookie to hex conversion a library routine Jeff Layton
  2010-01-08 14:56 ` [PATCH 2/4] nfs-utils: introduce new statd testing simulator Jeff Layton
@ 2010-01-08 14:56 ` Jeff Layton
  2010-01-08 14:56 ` [PATCH 4/4] nfs-utils: add initial tests for statd that run via "make check" Jeff Layton
  2010-01-12 12:25 ` [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6) Steve Dickson
  4 siblings, 0 replies; 10+ messages in thread
From: Jeff Layton @ 2010-01-08 14:56 UTC (permalink / raw)
  To: steved; +Cc: chuck.lever, bfields, linux-nfs

To dump contents of statd's monitor DB.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
---
 tests/Makefile.am   |    6 +++
 tests/statdb_dump.c |   99 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 105 insertions(+), 0 deletions(-)
 create mode 100644 tests/statdb_dump.c

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 375af80..a20b42b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,5 +1,11 @@
 ## Process this file with automake to produce Makefile.in
 
+check_PROGRAMS = statdb_dump
+statdb_dump_SOURCES = statdb_dump.c
+
+statdb_dump_LDADD = ../support/nfs/libnfs.a \
+		    ../support/nsm/libnsm.a $(LIBCAP)
+
 SUBDIRS = nsm_client
 
 MAINTAINERCLEANFILES = Makefile.in
diff --git a/tests/statdb_dump.c b/tests/statdb_dump.c
new file mode 100644
index 0000000..92d63f2
--- /dev/null
+++ b/tests/statdb_dump.c
@@ -0,0 +1,99 @@
+/*
+ * statdb_dump.c -- dump contents of statd's monitor DB
+ *
+ * Copyright (C) 2010  Red Hat, Jeff Layton <jlayton@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+#include <arpa/inet.h>
+
+#include "nsm.h"
+#include "xlog.h"
+
+static char cookiebuf[(SM_PRIV_SIZE * 2) + 1];
+static char addrbuf[INET6_ADDRSTRLEN + 1];
+
+static unsigned int
+dump_host(const char *hostname, const struct sockaddr *sa, const struct mon *m,
+	  const time_t timestamp)
+{
+	int ret;
+	const char *addr;
+	const struct sockaddr_in *sin;
+	const struct sockaddr_in6 *sin6;
+
+	ret = nsm_priv_to_hex(m->priv, cookiebuf, sizeof(cookiebuf));
+	if (!ret) {
+		xlog(L_ERROR, "Unable to convert cookie to hex string.\n");
+		return ret;
+	}
+
+	switch (sa->sa_family) {
+	case AF_INET:
+		sin = (struct sockaddr_in *)(char *)sa;
+		addr = inet_ntop(sa->sa_family, &sin->sin_addr.s_addr, addrbuf,
+				 (socklen_t)sizeof(addrbuf));
+		break;
+	case AF_INET6:
+		sin6 = (struct sockaddr_in6 *)(char *)sa;
+		addr = inet_ntop(sa->sa_family, &sin6->sin6_addr, addrbuf,
+				 (socklen_t)sizeof(addrbuf));
+		break;
+	default:
+		xlog(L_ERROR, "Unrecognized address family: %hu\n",
+			sa->sa_family);
+		return 0;
+	}
+
+	if (addr == NULL) {
+		xlog(L_ERROR, "Unable to convert sockaddr to string: %s\n",
+				strerror(errno));
+		return 0;
+	}
+
+	/*
+	 * Callers of this program should assume that in the future, extra
+	 * fields may be added to the output. Anyone adding extra fields to
+	 * the output should add them to the end of the line.
+	 */
+	printf("%s %s %s %s %s %d %d %d\n",
+			hostname, addr, cookiebuf,
+			m->mon_id.mon_name,
+			m->mon_id.my_id.my_name,
+			m->mon_id.my_id.my_prog,
+			m->mon_id.my_id.my_vers,
+			m->mon_id.my_id.my_proc); 
+
+	return 1;
+}
+
+int
+main(int argc, char **argv)
+{
+	xlog_syslog(0);
+	xlog_stderr(1);
+	xlog_open(argv[0]);
+	
+	nsm_load_monitor_list(dump_host);
+	return 0;
+}
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/4] nfs-utils: add initial tests for statd that run via "make check"
  2010-01-08 14:55 [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6) Jeff Layton
                   ` (2 preceding siblings ...)
  2010-01-08 14:56 ` [PATCH 3/4] nfs-utils: add statdb_dump utility Jeff Layton
@ 2010-01-08 14:56 ` Jeff Layton
  2010-01-08 16:49   ` Chuck Lever
  2010-01-12 12:25 ` [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6) Steve Dickson
  4 siblings, 1 reply; 10+ messages in thread
From: Jeff Layton @ 2010-01-08 14:56 UTC (permalink / raw)
  To: steved; +Cc: chuck.lever, bfields, linux-nfs

Leverage the support that automake already has for running tests via
make check. Add a simple test that just checks that the statd mon and
unmon calls actually work.

Adding more tests should be a simple matter of adding new scripts
exit 0 on success and non-zero on fail, and adding those to the
Makefile.am.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
---
 tests/Makefile.am                    |    2 +
 tests/t0001-statd-basic-mon-unmon.sh |   58 ++++++++++++++++++++++++++++++++
 tests/test-lib.sh                    |   60 ++++++++++++++++++++++++++++++++++
 3 files changed, 120 insertions(+), 0 deletions(-)
 create mode 100755 tests/t0001-statd-basic-mon-unmon.sh
 create mode 100755 tests/test-lib.sh

diff --git a/tests/Makefile.am b/tests/Makefile.am
index a20b42b..faa8197 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -9,3 +9,5 @@ statdb_dump_LDADD = ../support/nfs/libnfs.a \
 SUBDIRS = nsm_client
 
 MAINTAINERCLEANFILES = Makefile.in
+
+TESTS = t0001-statd-basic-mon-unmon.sh
diff --git a/tests/t0001-statd-basic-mon-unmon.sh b/tests/t0001-statd-basic-mon-unmon.sh
new file mode 100755
index 0000000..00127fb
--- /dev/null
+++ b/tests/t0001-statd-basic-mon-unmon.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+#
+# statd_basic_mon_unmon -- test basic mon/unmon functionality with statd
+#
+# Copyright (C) 2010  Red Hat, Jeff Layton <jlayton@redhat.com>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+
+. ./test-lib.sh
+
+# This test needs root privileges
+check_root
+
+start_statd
+if [ $? -ne 0 ]; then
+	echo "FAIL: problem starting statd"
+	exit 1
+fi
+
+COOKIE=`echo $$ | md5sum | cut -d' ' -f1`
+MON_NAME=`hostname`
+
+nsm_client mon $MON_NAME $COOKIE
+if [ $? -ne 0 ]; then
+	echo "FAIL: mon failed"
+	kill_statd
+	exit 1
+fi
+
+statdb_dump | grep $MON_NAME | grep -q $COOKIE
+if [ $? -ne 0 ]; then
+	echo "FAIL: monitor DB doesn't seem to contain entry"
+	kill_statd
+	exit 1
+fi
+
+nsm_client unmon $MON_NAME
+if [ $? -ne 0 ]; then
+	echo "FAIL: unmon failed"
+	kill_statd
+	exit 1
+fi
+
+kill_statd
+
diff --git a/tests/test-lib.sh b/tests/test-lib.sh
new file mode 100755
index 0000000..3d47264
--- /dev/null
+++ b/tests/test-lib.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+#
+# test-lib.sh -- library of functions for nfs-utils tests
+#
+# Copyright (C) 2010  Red Hat, Jeff Layton <jlayton@redhat.com>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+
+# make sure $srcdir is set and sanity check it
+srcdir=${srcdir-.}
+if [ ! -d ${srcdir} ]; then
+	echo "***ERROR***: bad installation -- \$srcdir=${srcdir}"
+	exit 1
+fi
+
+export PATH=$PATH:${srcdir}:${srcdir}/nsm_client
+
+# Some tests require root privileges. Check for them and skip the test (exit 77)
+# if the caller doesn't have them.
+check_root() {
+	if [ $EUID -ne 0 ]; then
+		echo "*** Skipping this test as it requires root privs ***"
+		exit 77
+	fi
+}
+
+# is lockd registered as a service?
+lockd_registered() {
+	rpcinfo -p | grep -q nlockmgr
+	return $?
+}
+
+# start up statd
+start_statd() {
+	rpcinfo -u 127.0.0.1 status 1 &> /dev/null
+	if [ $? -eq 0 ]; then
+		echo "***ERROR***: statd is already running and should "
+		echo "             be down when starting this test"
+		return 1
+	fi
+	$srcdir/../utils/statd/statd --no-notify
+}
+
+# shut down statd
+kill_statd() {
+	kill `cat /var/run/rpc.statd.pid`
+}
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/4] nfs-utils: add initial tests for statd that run via "make check"
  2010-01-08 14:56 ` [PATCH 4/4] nfs-utils: add initial tests for statd that run via "make check" Jeff Layton
@ 2010-01-08 16:49   ` Chuck Lever
  2010-01-08 16:56     ` Jeff Layton
  2010-01-08 16:59     ` J. Bruce Fields
  0 siblings, 2 replies; 10+ messages in thread
From: Chuck Lever @ 2010-01-08 16:49 UTC (permalink / raw)
  To: Jeff Layton; +Cc: steved, bfields, linux-nfs


On Jan 8, 2010, at 9:56 AM, Jeff Layton wrote:

> Leverage the support that automake already has for running tests via
> make check. Add a simple test that just checks that the statd mon and
> unmon calls actually work.
>
> Adding more tests should be a simple matter of adding new scripts
> exit 0 on success and non-zero on fail, and adding those to the
> Makefile.am.
>
> Signed-off-by: Jeff Layton <jlayton@redhat.com>
> ---
> tests/Makefile.am                    |    2 +
> tests/t0001-statd-basic-mon-unmon.sh |   58 +++++++++++++++++++++++++ 
> +++++++
> tests/test-lib.sh                    |   60 +++++++++++++++++++++++++ 
> +++++++++
> 3 files changed, 120 insertions(+), 0 deletions(-)
> create mode 100755 tests/t0001-statd-basic-mon-unmon.sh
> create mode 100755 tests/test-lib.sh
>
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index a20b42b..faa8197 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -9,3 +9,5 @@ statdb_dump_LDADD = ../support/nfs/libnfs.a \
> SUBDIRS = nsm_client
>
> MAINTAINERCLEANFILES = Makefile.in
> +
> +TESTS = t0001-statd-basic-mon-unmon.sh
> diff --git a/tests/t0001-statd-basic-mon-unmon.sh b/tests/t0001- 
> statd-basic-mon-unmon.sh
> new file mode 100755
> index 0000000..00127fb
> --- /dev/null
> +++ b/tests/t0001-statd-basic-mon-unmon.sh
> @@ -0,0 +1,58 @@
> +#!/bin/bash
> +#
> +# statd_basic_mon_unmon -- test basic mon/unmon functionality with  
> statd
> +#
> +# Copyright (C) 2010  Red Hat, Jeff Layton <jlayton@redhat.com>
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License
> +# as published by the Free Software Foundation; either version 2
> +# of the License, or (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software  
> Foundation, Inc.,
> +# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
> +#
> +
> +. ./test-lib.sh
> +
> +# This test needs root privileges
> +check_root
> +
> +start_statd
> +if [ $? -ne 0 ]; then
> +	echo "FAIL: problem starting statd"
> +	exit 1
> +fi
> +
> +COOKIE=`echo $$ | md5sum | cut -d' ' -f1`
> +MON_NAME=`hostname`
> +
> +nsm_client mon $MON_NAME $COOKIE
> +if [ $? -ne 0 ]; then
> +	echo "FAIL: mon failed"
> +	kill_statd
> +	exit 1
> +fi
> +
> +statdb_dump | grep $MON_NAME | grep -q $COOKIE
> +if [ $? -ne 0 ]; then
> +	echo "FAIL: monitor DB doesn't seem to contain entry"
> +	kill_statd
> +	exit 1
> +fi
> +
> +nsm_client unmon $MON_NAME
> +if [ $? -ne 0 ]; then
> +	echo "FAIL: unmon failed"
> +	kill_statd
> +	exit 1
> +fi
> +
> +kill_statd
> +
> diff --git a/tests/test-lib.sh b/tests/test-lib.sh
> new file mode 100755
> index 0000000..3d47264
> --- /dev/null
> +++ b/tests/test-lib.sh
> @@ -0,0 +1,60 @@
> +#!/bin/bash
> +#
> +# test-lib.sh -- library of functions for nfs-utils tests
> +#
> +# Copyright (C) 2010  Red Hat, Jeff Layton <jlayton@redhat.com>
> +#
> +# This program is free software; you can redistribute it and/or
> +# modify it under the terms of the GNU General Public License
> +# as published by the Free Software Foundation; either version 2
> +# of the License, or (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software  
> Foundation, Inc.,
> +# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
> +#
> +
> +# make sure $srcdir is set and sanity check it
> +srcdir=${srcdir-.}
> +if [ ! -d ${srcdir} ]; then
> +	echo "***ERROR***: bad installation -- \$srcdir=${srcdir}"
> +	exit 1
> +fi
> +
> +export PATH=$PATH:${srcdir}:${srcdir}/nsm_client
> +
> +# Some tests require root privileges. Check for them and skip the  
> test (exit 77)
> +# if the caller doesn't have them.
> +check_root() {
> +	if [ $EUID -ne 0 ]; then
> +		echo "*** Skipping this test as it requires root privs ***"
> +		exit 77
> +	fi
> +}
> +
> +# is lockd registered as a service?
> +lockd_registered() {
> +	rpcinfo -p | grep -q nlockmgr
> +	return $?
> +}
> +
> +# start up statd
> +start_statd() {
> +	rpcinfo -u 127.0.0.1 status 1 &> /dev/null
> +	if [ $? -eq 0 ]; then
> +		echo "***ERROR***: statd is already running and should "
> +		echo "             be down when starting this test"
> +		return 1

Basically what this tells me is that you can't runs these tests at all  
if your development tree lives on an NFSv2/3 mount point.

> +	fi
> +	$srcdir/../utils/statd/statd --no-notify

Is --no-notify really needed?  I guess that's just a safety net.

> +}
> +
> +# shut down statd
> +kill_statd() {
> +	kill `cat /var/run/rpc.statd.pid`
> +}
> -- 
> 1.6.5.2

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/4] nfs-utils: add initial tests for statd that run via "make check"
  2010-01-08 16:49   ` Chuck Lever
@ 2010-01-08 16:56     ` Jeff Layton
       [not found]       ` <20100108115651.7a84a3c5-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
  2010-01-08 16:59     ` J. Bruce Fields
  1 sibling, 1 reply; 10+ messages in thread
From: Jeff Layton @ 2010-01-08 16:56 UTC (permalink / raw)
  To: Chuck Lever; +Cc: steved, bfields, linux-nfs

On Fri, 8 Jan 2010 11:49:16 -0500
Chuck Lever <chuck.lever@oracle.com> wrote:

> 
> Basically what this tells me is that you can't runs these tests at all  
> if your development tree lives on an NFSv2/3 mount point.
> 

I don't think the test I have so far will do any fcntl locking, so that
one would probably work. No guarantees on any that are added later though.

It's probably best to assume that doing so would be problematic.

> > +	fi
> > +	$srcdir/../utils/statd/statd --no-notify
> 
> Is --no-notify really needed?  I guess that's just a safety net.
> 

Yeah. On the off chance that someone has monitored hosts in the db
after shutting down statd, I don't think we want to start spraying
notifications when we start the test.

> > +}
> > +
> > +# shut down statd
> > +kill_statd() {
> > +	kill `cat /var/run/rpc.statd.pid`
> > +}
> > -- 
> > 1.6.5.2
> 
> --
> Chuck Lever
> chuck[dot]lever[at]oracle[dot]com
> 
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


-- 
Jeff Layton <jlayton@redhat.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/4] nfs-utils: add initial tests for statd that run via "make check"
  2010-01-08 16:49   ` Chuck Lever
  2010-01-08 16:56     ` Jeff Layton
@ 2010-01-08 16:59     ` J. Bruce Fields
  1 sibling, 0 replies; 10+ messages in thread
From: J. Bruce Fields @ 2010-01-08 16:59 UTC (permalink / raw)
  To: Chuck Lever; +Cc: Jeff Layton, steved, linux-nfs

On Fri, Jan 08, 2010 at 11:49:16AM -0500, Chuck Lever wrote:
>
> On Jan 8, 2010, at 9:56 AM, Jeff Layton wrote:
>
>> Leverage the support that automake already has for running tests via
>> make check. Add a simple test that just checks that the statd mon and
>> unmon calls actually work.
>>
>> Adding more tests should be a simple matter of adding new scripts
>> exit 0 on success and non-zero on fail, and adding those to the
>> Makefile.am.
>>
>> Signed-off-by: Jeff Layton <jlayton@redhat.com>
>> ---
>> tests/Makefile.am                    |    2 +
>> tests/t0001-statd-basic-mon-unmon.sh |   58 +++++++++++++++++++++++++ 
>> +++++++
>> tests/test-lib.sh                    |   60 +++++++++++++++++++++++++ 
>> +++++++++
>> 3 files changed, 120 insertions(+), 0 deletions(-)
>> create mode 100755 tests/t0001-statd-basic-mon-unmon.sh
>> create mode 100755 tests/test-lib.sh
>>
>> diff --git a/tests/Makefile.am b/tests/Makefile.am
>> index a20b42b..faa8197 100644
>> --- a/tests/Makefile.am
>> +++ b/tests/Makefile.am
>> @@ -9,3 +9,5 @@ statdb_dump_LDADD = ../support/nfs/libnfs.a \
>> SUBDIRS = nsm_client
>>
>> MAINTAINERCLEANFILES = Makefile.in
>> +
>> +TESTS = t0001-statd-basic-mon-unmon.sh
>> diff --git a/tests/t0001-statd-basic-mon-unmon.sh b/tests/t0001- 
>> statd-basic-mon-unmon.sh
>> new file mode 100755
>> index 0000000..00127fb
>> --- /dev/null
>> +++ b/tests/t0001-statd-basic-mon-unmon.sh
>> @@ -0,0 +1,58 @@
>> +#!/bin/bash
>> +#
>> +# statd_basic_mon_unmon -- test basic mon/unmon functionality with  
>> statd
>> +#
>> +# Copyright (C) 2010  Red Hat, Jeff Layton <jlayton@redhat.com>
>> +#
>> +# This program is free software; you can redistribute it and/or
>> +# modify it under the terms of the GNU General Public License
>> +# as published by the Free Software Foundation; either version 2
>> +# of the License, or (at your option) any later version.
>> +#
>> +# This program is distributed in the hope that it will be useful,
>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +# GNU General Public License for more details.
>> +#
>> +# You should have received a copy of the GNU General Public License
>> +# along with this program; if not, write to the Free Software  
>> Foundation, Inc.,
>> +# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
>> +#
>> +
>> +. ./test-lib.sh
>> +
>> +# This test needs root privileges
>> +check_root
>> +
>> +start_statd
>> +if [ $? -ne 0 ]; then
>> +	echo "FAIL: problem starting statd"
>> +	exit 1
>> +fi
>> +
>> +COOKIE=`echo $$ | md5sum | cut -d' ' -f1`
>> +MON_NAME=`hostname`
>> +
>> +nsm_client mon $MON_NAME $COOKIE
>> +if [ $? -ne 0 ]; then
>> +	echo "FAIL: mon failed"
>> +	kill_statd
>> +	exit 1
>> +fi
>> +
>> +statdb_dump | grep $MON_NAME | grep -q $COOKIE
>> +if [ $? -ne 0 ]; then
>> +	echo "FAIL: monitor DB doesn't seem to contain entry"
>> +	kill_statd
>> +	exit 1
>> +fi
>> +
>> +nsm_client unmon $MON_NAME
>> +if [ $? -ne 0 ]; then
>> +	echo "FAIL: unmon failed"
>> +	kill_statd
>> +	exit 1
>> +fi
>> +
>> +kill_statd
>> +
>> diff --git a/tests/test-lib.sh b/tests/test-lib.sh
>> new file mode 100755
>> index 0000000..3d47264
>> --- /dev/null
>> +++ b/tests/test-lib.sh
>> @@ -0,0 +1,60 @@
>> +#!/bin/bash
>> +#
>> +# test-lib.sh -- library of functions for nfs-utils tests
>> +#
>> +# Copyright (C) 2010  Red Hat, Jeff Layton <jlayton@redhat.com>
>> +#
>> +# This program is free software; you can redistribute it and/or
>> +# modify it under the terms of the GNU General Public License
>> +# as published by the Free Software Foundation; either version 2
>> +# of the License, or (at your option) any later version.
>> +#
>> +# This program is distributed in the hope that it will be useful,
>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> +# GNU General Public License for more details.
>> +#
>> +# You should have received a copy of the GNU General Public License
>> +# along with this program; if not, write to the Free Software  
>> Foundation, Inc.,
>> +# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
>> +#
>> +
>> +# make sure $srcdir is set and sanity check it
>> +srcdir=${srcdir-.}
>> +if [ ! -d ${srcdir} ]; then
>> +	echo "***ERROR***: bad installation -- \$srcdir=${srcdir}"
>> +	exit 1
>> +fi
>> +
>> +export PATH=$PATH:${srcdir}:${srcdir}/nsm_client
>> +
>> +# Some tests require root privileges. Check for them and skip the  
>> test (exit 77)
>> +# if the caller doesn't have them.
>> +check_root() {
>> +	if [ $EUID -ne 0 ]; then
>> +		echo "*** Skipping this test as it requires root privs ***"
>> +		exit 77
>> +	fi
>> +}
>> +
>> +# is lockd registered as a service?
>> +lockd_registered() {
>> +	rpcinfo -p | grep -q nlockmgr
>> +	return $?
>> +}
>> +
>> +# start up statd
>> +start_statd() {
>> +	rpcinfo -u 127.0.0.1 status 1 &> /dev/null
>> +	if [ $? -eq 0 ]; then
>> +		echo "***ERROR***: statd is already running and should "
>> +		echo "             be down when starting this test"
>> +		return 1
>
> Basically what this tells me is that you can't runs these tests at all  
> if your development tree lives on an NFSv2/3 mount point.

Personally what I'll do is run this on a kvm guest or otherwise
dedicated test machine.  So I can live with that assumption.

--b.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/4] nfs-utils: add initial tests for statd that run via "make check"
       [not found]       ` <20100108115651.7a84a3c5-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
@ 2010-01-08 18:21         ` Chuck Lever
  0 siblings, 0 replies; 10+ messages in thread
From: Chuck Lever @ 2010-01-08 18:21 UTC (permalink / raw)
  To: Jeff Layton; +Cc: steved, bfields, linux-nfs


On Jan 8, 2010, at 11:56 AM, Jeff Layton wrote:

> On Fri, 8 Jan 2010 11:49:16 -0500
> Chuck Lever <chuck.lever@oracle.com> wrote:
>
>>
>> Basically what this tells me is that you can't runs these tests at  
>> all
>> if your development tree lives on an NFSv2/3 mount point.
>>
>
> I don't think the test I have so far will do any fcntl locking, so  
> that
> one would probably work. No guarantees on any that are added later  
> though.
>
> It's probably best to assume that doing so would be problematic.
>
>>> +	fi
>>> +	$srcdir/../utils/statd/statd --no-notify
>>
>> Is --no-notify really needed?  I guess that's just a safety net.
>>
>
> Yeah. On the off chance that someone has monitored hosts in the db
> after shutting down statd, I don't think we want to start spraying
> notifications when we start the test.

statd/sm-notify are supposed to be smart enough to send reboot  
notifications once per reboot anyway.  But it can't hurt to enforce it  
here.

>>> +}
>>> +
>>> +# shut down statd
>>> +kill_statd() {
>>> +	kill `cat /var/run/rpc.statd.pid`
>>> +}
>>> -- 
>>> 1.6.5.2
>>
>> --
>> Chuck Lever
>> chuck[dot]lever[at]oracle[dot]com
>>
>>
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux- 
>> nfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>
>
> -- 
> Jeff Layton <jlayton@redhat.com>

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6)
  2010-01-08 14:55 [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6) Jeff Layton
                   ` (3 preceding siblings ...)
  2010-01-08 14:56 ` [PATCH 4/4] nfs-utils: add initial tests for statd that run via "make check" Jeff Layton
@ 2010-01-12 12:25 ` Steve Dickson
  4 siblings, 0 replies; 10+ messages in thread
From: Steve Dickson @ 2010-01-12 12:25 UTC (permalink / raw)
  To: Jeff Layton; +Cc: chuck.lever, bfields, linux-nfs



On 01/08/2010 09:55 AM, Jeff Layton wrote:
> This is an updated patchset for adding test infrastructure to nfs-utils.
> The main differences in this patchset are:
> 
> 1) some bugfixes in the statdb_dump program
> 
> 2) an extra check for root privs in the t0001 test. If the caller
> doesn't have root privs, then the test is skipped
> 
> This patchset is intended as a starting point for an automated test
> suite for nfs-utils. The idea here is to start simply and add a suite of
> tests that we can run via "make check" -- the standard automake method
> for running tests.
> 
> Clearly there are limits to what we can test without a multi-host test
> harness. My hope is that this should help keep us from breaking basic
> functionality by allowing us to test it in a very simple fashion. At
> some point in the future we should also consider how to best handle
> multi-machine testing, but I see that as complimenting this code rather
> than replacing it.
> 
> For this set, the focus is on testing statd, which is particularly
> susceptible to subtle breakage. Problems with it are often not noticed
> until lock recovery breaks, and that may greatly lag the actual
> breakage.
> 
> To faciitate statd testing, I've added a "nsm_client" program that can
> serve as a synthetic statd client and an NLM simulator. It's very
> loosely based on the old statd simulator code. That program is dependent
> on some of Chuck Lever's recent statd patches -- notably the ones that
> break out common NSM code into libnsm.a.
> 
> For this initial drop, I'm just adding a single test that tests mon and
> unmon functionality with statd. Adding more tests should be fairly simple
> to do.
> 
> Jeff Layton (4):
>   nfs-utils: make private cookie to hex conversion a library routine
>   nfs-utils: introduce new statd testing simulator
>   nfs-utils: add statdb_dump utility
>   nfs-utils: add initial tests for statd that run via "make check"
> 
Committed...

steved.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2010-01-12 12:26 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-01-08 14:55 [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6) Jeff Layton
2010-01-08 14:56 ` [PATCH 1/4] nfs-utils: make private cookie to hex conversion a library routine Jeff Layton
2010-01-08 14:56 ` [PATCH 2/4] nfs-utils: introduce new statd testing simulator Jeff Layton
2010-01-08 14:56 ` [PATCH 3/4] nfs-utils: add statdb_dump utility Jeff Layton
2010-01-08 14:56 ` [PATCH 4/4] nfs-utils: add initial tests for statd that run via "make check" Jeff Layton
2010-01-08 16:49   ` Chuck Lever
2010-01-08 16:56     ` Jeff Layton
     [not found]       ` <20100108115651.7a84a3c5-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2010-01-08 18:21         ` Chuck Lever
2010-01-08 16:59     ` J. Bruce Fields
2010-01-12 12:25 ` [PATCH 0/4] nfs-utils: add testing infrastructure to nfs-utils (try #6) Steve Dickson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.