Linux kernel kdevops project
 help / color / mirror / Atom feed
From: cel@kernel.org
To: <kdevops@lists.linux.dev>
Cc: Chuck Lever <chuck.lever@oracle.com>
Subject: [PATCH 1/4] workflows: Workflow stub for Jorge Mora's nfstest suite
Date: Wed, 10 Apr 2024 10:50:48 -0400	[thread overview]
Message-ID: <20240410145051.257980-1-cel@kernel.org> (raw)

From: Chuck Lever <chuck.lever@oracle.com>

The nfstest suite is a detailed test of NFS functionality for NFS
versions 3 and newer, including delegation, attribute cache
consistency, sparse files, and server-to-server copy offload.

When configured in dedicated mode, each nfstest suite is run in a
separate target node to achieve good parallelism. You can select
specific test groups to run via Kconfig options.

This commit introduces the workflow's documentation and Kconfig
apparatus to show how this workflow can be configured. Following
commits will bring in the kdevops components to get the workflow
working.

The careful reader will note that not every nfstest group is
available here. Three groups require the use of a second client,
and I haven't figured out how that needs to work. For now, those
groups are not included in this series.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 .gitignore                                    |  1 +
 README.md                                     | 12 ++-
 docs/nfstest.md                               | 21 ++++
 kconfigs/workflows/Kconfig                    | 25 +++++
 scripts/workflows/nfstest/run_kernel_ci.sh    |  1 +
 .../workflows/nfstest/run_kernel_ci_kotd.sh   |  1 +
 scripts/workflows/nfstest/run_loop.sh         | 58 +++++++++++
 workflows/Makefile                            |  5 +
 workflows/nfstest/Kconfig                     | 87 ++++++++++++++++
 workflows/nfstest/Makefile                    | 99 +++++++++++++++++++
 10 files changed, 309 insertions(+), 1 deletion(-)
 create mode 100644 docs/nfstest.md
 create mode 120000 scripts/workflows/nfstest/run_kernel_ci.sh
 create mode 120000 scripts/workflows/nfstest/run_kernel_ci_kotd.sh
 create mode 100755 scripts/workflows/nfstest/run_loop.sh
 create mode 100644 workflows/nfstest/Kconfig
 create mode 100644 workflows/nfstest/Makefile

diff --git a/.gitignore b/.gitignore
index 5cb41682dd45..3a1ecd48d84f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -62,6 +62,7 @@ workflows/demos/reboot-limit/results/
 
 workflows/gitr/results/
 workflows/ltp/results/
+workflows/nfstest/results/
 
 playbooks/roles/linux-mirror/linux-mirror-systemd/mirrors.yaml
 # We should strive to ignore all and port them to the new mirrors.yaml
diff --git a/README.md b/README.md
index 96e048bc8405..ea6b41004767 100644
--- a/README.md
+++ b/README.md
@@ -135,7 +135,17 @@ To test a kernel using the ltp suite, enable the ltp workflow and then run:
   * `make ltp`
   * `make ltp-baseline`
 
-For more details see [kdevops gitr docs](docs/gitr.md)
+For more details see [kdevops ltp docs](docs/ltp.md)
+
+### Start running the nfstest suite in 2 commands
+
+To test a kernel using the nfstest suite, enable the nfstest workflow and
+then run:
+
+  * `make nfstest`
+  * `make nfstest-baseline`
+
+For more details see [kdevops nfstest docs](docs/nfstest.md)
 
 ### Runs some kernel selftests in a parallel manner
 
diff --git a/docs/nfstest.md b/docs/nfstest.md
new file mode 100644
index 000000000000..b358389c2571
--- /dev/null
+++ b/docs/nfstest.md
@@ -0,0 +1,21 @@
+# kdevops nfstest suite
+
+kdevops can run Jorge Mora's nfstest suite against an NFS server.
+
+Run `make menuconfig` and select:
+
+  Target workflows -> Dedicated target Linux test workflow ->nfstest
+
+Then configure the test parameters by going to:
+
+  Target workflows -> Configure and run the nfstest suite
+
+Choose the location of the repo that contains the version of nfstest
+you want to use for the test.
+
+Then, run:
+
+  * `make`
+  * `make bringup`
+  * `make nfstest`
+  * `make nfstest-baseline`
diff --git a/kconfigs/workflows/Kconfig b/kconfigs/workflows/Kconfig
index ff6372b7e98f..2fd5bf31347f 100644
--- a/kconfigs/workflows/Kconfig
+++ b/kconfigs/workflows/Kconfig
@@ -166,6 +166,13 @@ config KDEVOPS_WORKFLOW_DEDICATE_LTP
 	  This will dedicate your configuration to running only the
 	  ltp workflow in separate target nodes per testing group.
 
+config KDEVOPS_WORKFLOW_DEDICATE_NFSTEST
+	bool "nfstest"
+	select KDEVOPS_WORKFLOW_ENABLE_NFSTEST
+	help
+	  This will dedicate your configuration to running only the
+	  nfstest workflow in separate target nodes per testing group.
+
 endchoice
 
 endif
@@ -239,6 +246,14 @@ config KDEVOPS_WORKFLOW_NOT_DEDICATED_ENABLE_LTP
 	  Select this option if you want to provision ltp on a single
 	  target node for by-hand testing.
 
+config KDEVOPS_WORKFLOW_NOT_DEDICATED_ENABLE_NFSTEST
+	bool "nfstest"
+	select KDEVOPS_WORKFLOW_ENABLE_NFSTEST
+	depends on LIBVIRT || TERRAFORM_PRIVATE_NET
+	help
+	  Select this option if you want to provision nfstest on a
+	  single target node for by-hand testing.
+
 endif # !WORKFLOWS_DEDICATED_WORKFLOW
 
 config KDEVOPS_WORKFLOW_ENABLE_FSTESTS
@@ -312,6 +327,16 @@ source "workflows/ltp/Kconfig"
 endmenu
 endif # KDEVOPS_WORKFLOW_ENABLE_GITR
 
+config KDEVOPS_WORKFLOW_ENABLE_NFSTEST
+	bool
+	default y if KDEVOPS_WORKFLOW_NOT_DEDICATED_ENABLE_NFSTEST || KDEVOPS_WORKFLOW_DEDICATE_NFSTEST
+
+if KDEVOPS_WORKFLOW_ENABLE_NFSTEST
+menu "Configure and run the nfstest suite"
+source "workflows/nfstest/Kconfig"
+endmenu
+endif # KDEVOPS_WORKFLOW_ENABLE_NFSTEST
+
 config KDEVOPS_WORKFLOW_GIT_CLONES_KDEVOPS_GIT
 	bool
 	default y if KDEVOPS_WORKFLOW_ENABLE_FSTESTS || KDEVOPS_WORKFLOW_ENABLE_BLKTESTS
diff --git a/scripts/workflows/nfstest/run_kernel_ci.sh b/scripts/workflows/nfstest/run_kernel_ci.sh
new file mode 120000
index 000000000000..4fd5dc5e8e13
--- /dev/null
+++ b/scripts/workflows/nfstest/run_kernel_ci.sh
@@ -0,0 +1 @@
+../generic/run_kernel_ci.sh
\ No newline at end of file
diff --git a/scripts/workflows/nfstest/run_kernel_ci_kotd.sh b/scripts/workflows/nfstest/run_kernel_ci_kotd.sh
new file mode 120000
index 000000000000..8f94d6ba4f52
--- /dev/null
+++ b/scripts/workflows/nfstest/run_kernel_ci_kotd.sh
@@ -0,0 +1 @@
+../kotd/run_kernel_ci_kotd.sh
\ No newline at end of file
diff --git a/scripts/workflows/nfstest/run_loop.sh b/scripts/workflows/nfstest/run_loop.sh
new file mode 100755
index 000000000000..22f80ca4e04a
--- /dev/null
+++ b/scripts/workflows/nfstest/run_loop.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+# SPDX-License-Identifier: copyleft-next-0.3.1
+
+# Part of kdevops kernel-ci, this is the script which will run the test workflow
+# as many times as indicated up to CONFIG_KERNEL_CI_STEADY_STATE_GOAL
+
+source ${TOPDIR}/.config
+source ${TOPDIR}/scripts/lib.sh
+
+WORKFLOWDIR=${TOPDIR}/workflows/nfstest
+
+COUNT=1
+
+run_loop()
+{
+	while true; do
+		echo "== kernel-ci nfstest test loop $COUNT start: $(date)" > $KERNEL_CI_FAIL_LOG
+		echo "/usr/bin/time -f %E make nfstest-baseline" >> $KERNEL_CI_FAIL_LOG
+		/usr/bin/time -p -o $KERNEL_CI_LOGTIME make nfstest-baseline >> $KERNEL_CI_FAIL_LOG
+		ANSIBLE_CALL_RET=$?
+		echo "End   $COUNT: $(date)" >> $KERNEL_CI_FAIL_LOG
+		cat $KERNEL_CI_LOGTIME >> $KERNEL_CI_FAIL_LOG
+		echo "git status:" >> $KERNEL_CI_FAIL_LOG
+		git status >> $KERNEL_CI_FAIL_LOG
+		echo "Results:" >> $KERNEL_CI_FAIL_LOG
+
+		rm -f $KERNEL_CI_DIFF_LOG
+
+		if [[ "$ANSIBLE_CALL_RET" -ne 0 ]]; then
+			echo "Test  $COUNT: FAILED!" >> $KERNEL_CI_DIFF_LOG
+			echo "== Test loop count $COUNT" >> $KERNEL_CI_DIFF_LOG
+			echo "$(git describe)" >> $KERNEL_CI_DIFF_LOG
+			git diff >> $KERNEL_CI_DIFF_LOG
+			cat $KERNEL_CI_DIFF_LOG >> $KERNEL_CI_FAIL_LOG
+			cat $KERNEL_CI_FAIL_LOG >> $KERNEL_CI_FULL_LOG
+			echo $COUNT > $KERNEL_CI_FAIL_FILE
+			exit 1
+		else
+			echo "Test  $COUNT: OK!" >> $KERNEL_CI_FAIL_LOG
+			echo "----------------------------------------------------------------" >> $KERNEL_CI_FAIL_LOG
+			cat $KERNEL_CI_FAIL_LOG >> $KERNEL_CI_FULL_LOG
+		fi
+
+		# This let's us keep track of which loop count was last successful
+		echo $COUNT > $KERNEL_CI_OK_FILE
+
+		let COUNT=$COUNT+1
+		if [[ "$CONFIG_KERNEL_CI_ENABLE_STEADY_STATE" == "y" &&
+		      "$COUNT" -gt "$CONFIG_KERNEL_CI_STEADY_STATE_GOAL" ]]; then
+			exit 0
+		fi
+		sleep 1
+	done
+}
+
+rm -f $KERNEL_CI_FAIL_FILE $KERNEL_CI_OK_FILE
+echo "= kernel-ci full log" > $KERNEL_CI_FULL_LOG
+run_loop
diff --git a/workflows/Makefile b/workflows/Makefile
index 7e3e5e351a49..e305f2629abf 100644
--- a/workflows/Makefile
+++ b/workflows/Makefile
@@ -53,6 +53,11 @@ WORKFLOW_ARGS += kdevops_workflow_enable_ltp='True'
 include workflows/ltp/Makefile
 endif # CONFIG_KDEVOPS_WORKFLOW_ENABLE_LTP == y
 
+ifeq (y,$(CONFIG_KDEVOPS_WORKFLOW_ENABLE_NFSTEST))
+WORKFLOW_ARGS += kdevops_workflow_enable_nfstest='True'
+include workflows/nfstest/Makefile
+endif # CONFIG_KDEVOPS_WORKFLOW_ENABLE_NFSTEST == y
+
 ANSIBLE_EXTRA_ARGS += $(WORKFLOW_ARGS)
 ANSIBLE_EXTRA_ARGS_SEPARATED += $(WORKFLOW_ARGS_SEPARATED)
 ANSIBLE_EXTRA_ARGS_DIRECT += $(WORKFLOW_ARGS_DIRECT)
diff --git a/workflows/nfstest/Kconfig b/workflows/nfstest/Kconfig
new file mode 100644
index 000000000000..921ce5fe0a83
--- /dev/null
+++ b/workflows/nfstest/Kconfig
@@ -0,0 +1,87 @@
+if KDEVOPS_WORKFLOW_ENABLE_NFSTEST
+
+config NFSTEST_USE_KDEVOPS_NFSD
+	bool "Provision and use the kdevops NFS server"
+	select KDEVOPS_SETUP_NFSD
+	default y
+	help
+	  Select this option to have kdevops provision an additional
+	  target node to be used as the NFS server for testing.
+
+	  Say N if you have a reachable NFS server to test against, and
+	  specify that server's hostname using the
+	  NFSTEST_NFS_SERVER_HOST option.
+
+config NFSTEST_NFS_SERVER_HOST
+	string "Test NFS Server hostname"
+	default ""
+	depends on !NFSTEST_USE_KDEVOPS_NFSD
+	help
+	  The NFS server hostname or address to test against. Tests
+	  expect that an appropriate share is already available for
+	  them to mount and use.
+
+config NFSTEST_MNT
+	string "Where clients mount the file system under test"
+	default "/mnt/t"
+	help
+	  The directory over which to mount the file system under test.
+
+config NFSTEST_REPO
+	string "The nfstest repository"
+	default "git://git.linux-nfs.org/projects/mora/nfstest.git"
+	help
+	  The nfstest repository to clone.
+
+config NFSTEST_REPO_COMMIT
+	string "The version of nfstest to check out"
+	default "v3.2"
+	help
+	  The version of nfstest to be used for the test.
+
+if KDEVOPS_WORKFLOW_DEDICATE_NFSTEST
+
+config NFSTEST_TEST_GROUP_ALLOC
+	bool "Enable the nfstest_alloc testing section"
+	default n
+	help
+	  Provision a target node to test NFSv4.2 space reservation.
+
+config NFSTEST_TEST_GROUP_DIO
+	bool "Enable the nfstest_dio testing section"
+	default n
+	help
+	  Provision target nodes to run direct I/O tests.
+
+config NFSTEST_TEST_GROUP_INTEROP
+	bool "Enable the nfstest_interop testing section"
+	default y
+	help
+	  Provision target nodes to run NFS interoperability tests.
+
+config NFSTEST_TEST_GROUP_LOCK
+	bool "Enable the nfstest_lock testing section"
+	default n
+	help
+	  Provision target nodes to test NFS file locking.
+
+config NFSTEST_TEST_GROUP_POSIX
+	bool "Enable the nfstest_posix testing section"
+	default n
+	help
+	  Provision a target node to run POSIX file access tests.
+
+config NFSTEST_TEST_GROUP_SPARSE
+	bool "Enable the nfstest_sparse testing section"
+	help
+	  Provision a target node to test support for sparse files.
+
+config NFSTEST_TEST_GROUP_SSC
+	bool "Enable the nfstest_ssc testing section"
+	help
+	  Provision target nodes to test the operation of server-side
+	  copy.
+
+endif # KDEVOPS_WORKFLOW_DEDICATE_NFSTEST
+
+endif # KDEVOPS_WORKFLOW_ENABLE_GITR
diff --git a/workflows/nfstest/Makefile b/workflows/nfstest/Makefile
new file mode 100644
index 000000000000..638ec1fc83dd
--- /dev/null
+++ b/workflows/nfstest/Makefile
@@ -0,0 +1,99 @@
+ifeq (y,$(CONFIG_WORKFLOWS_DEDICATED_WORKFLOW))
+export KDEVOPS_HOSTS_TEMPLATE := nfstest.j2
+endif # CONFIG_WORKFLOWS_DEDICATED_WORKFLOW
+
+ifeq (y,$(CONFIG_NFSTEST_USE_KDEVOPS_NFSD))
+NFSTEST_ARGS += nfstest_nfs_server_host='$(subst ",,$(CONFIG_KDEVOPS_HOSTS_PREFIX))-nfsd'
+NFSTEST_ARGS += nfstest_nfs_use_kdevops_nfsd='true'
+else # CONFIG_NFSTEST_USE_KDEVOPS_NFSD
+NFSTEST_ARGS += nfstest_nfs_server_host='$(subst ",,$(CONFIG_NFSTEST_NFS_SERVER_HOSTNAME))'
+NFSTEST_ARGS += nfstest_nfs_server_export='$(subst ",,$(CONFIG_NFSTEST_NFS_SERVER_EXPORT))'
+NFSTEST_ARGS += nfstest_nfs_use_kdevops_nfsd='false'
+endif # CONFIG_NFSTEST_USE_KDEVOPS_NFSD
+
+NFSTEST_MNT:=$(subst ",,$(CONFIG_NFSTEST_MNT))
+NFSTEST_ARGS += nfstest_mnt=$(NFSTEST_MNT)
+
+NFSTEST_REPO:=$(subst ",,$(CONFIG_NFSTEST_REPO))
+NFSTEST_ARGS += nfstest_repo=$(NFSTEST_REPO)
+
+NFSTEST_REPO_COMMIT:=$(subst ",,$(CONFIG_NFSTEST_REPO_COMMIT))
+NFSTEST_ARGS += nfstest_repo_commit=$(NFSTEST_REPO_COMMIT)
+
+ifeq (y,$(CONFIG_NFSTEST_TEST_GROUP_ALLOC))
+NFSTEST_ENABLED_TEST_GROUPS += alloc
+endif
+ifeq (y,$(CONFIG_NFSTEST_TEST_GROUP_DIO))
+NFSTEST_ENABLED_TEST_GROUPS += dio
+endif
+ifeq (y,$(CONFIG_NFSTEST_TEST_GROUP_INTEROP))
+NFSTEST_ENABLED_TEST_GROUPS += interop
+endif
+ifeq (y,$(CONFIG_NFSTEST_TEST_GROUP_LOCK))
+NFSTEST_ENABLED_TEST_GROUPS += lock
+endif
+ifeq (y,$(CONFIG_NFSTEST_TEST_GROUP_POSIX))
+NFSTEST_ENABLED_TEST_GROUPS += posix
+endif
+ifeq (y,$(CONFIG_NFSTEST_TEST_GROUP_SPARSE))
+NFSTEST_ENABLED_TEST_GROUPS += sparse
+endif
+ifeq (y,$(CONFIG_NFSTEST_TEST_GROUP_SSC))
+NFSTEST_ENABLED_TEST_GROUPS += ssc
+endif
+
+WORKFLOW_ARGS += $(NFSTEST_ARGS)
+WORKFLOW_ARGS_SEPARATED += nfstest_enabled_test_groups='$(subst $(space),+,$(NFSTEST_ENABLED_TEST_GROUPS))'
+
+NFSTEST_KERNEL_CI_LOOP := false
+NFSTEST_KERNEL_CI_LOOP_KOTD := false
+
+ifeq (y,$(CONFIG_KERNEL_CI))
+NFSTEST_KERNEL_CI_LOOP      := scripts/workflows/nfstest/run_kernel_ci.sh
+NFSTEST_KERNEL_CI_LOOP_KOTD := scripts/workflows/nfstest/run_kernel_ci_kotd.sh
+endif # CONFIG_KERNEL_CI
+
+nfstest:
+	$(Q)ansible-playbook $(ANSIBLE_VERBOSE) -l baseline,dev \
+		-f 30 -i hosts playbooks/nfstest.yml \
+		--skip-tags run_tests,copy_results
+
+nfstest-baseline:
+	$(Q)ansible-playbook $(ANSIBLE_VERBOSE) \
+		-f 30 -i hosts -l baseline playbooks/nfstest.yml \
+		--tags vars,run_tests,copy_results \
+		--extra-vars=@./extra_vars.yaml
+
+nfstest-baseline-loop:
+	$(Q)$(NFSTEST_KERNEL_CI_LOOP) baseline
+
+nfstest-baseline-kernelci:
+	$(Q)$(NFSTEST_KERNEL_CI_LOOP_KOTD) baseline
+
+nfstest-dev-baseline:
+	$(Q)ansible-playbook $(ANSIBLE_VERBOSE) \
+		-f 30 -i hosts -l dev playbooks/nfstest.yml \
+		--tags vars,run_tests,copy_results \
+		--extra-vars=@./extra_vars.yaml
+
+nfstest-dev-loop:
+	$(Q)$(NFSTEST_KERNEL_CI_LOOP) dev
+
+nfstest-dev-kernelci:
+	$(Q)$(NFSTEST_KERNEL_CI_LOOP_KOTD) dev
+
+nfstest-dev-reset:
+	$(Q)ansible-playbook $(ANSIBLE_VERBOSE) \
+		-f 30 -i hosts -l dev playbooks/nfstest.yml \
+		--tags vars,reset \
+		--extra-vars=@./extra_vars.yaml
+
+nfstest-help-menu:
+	@echo "nfstest options:"
+	@echo "nfstest                              - Git clone nfstest and install it"
+	@echo "nfstest-{baseline,dev}               - Run selected nfstests on baseline or dev hosts and collect results"
+	@echo "nfstest-{baseline,dev}-loop"         - Run nfstest in a loop until error or steady state
+	@echo "nfstest-{baseline,dev}-kernelci      - Run nfstest kernel-ci loop"
+	@echo ""
+
+HELP_TARGETS += nfstest-help-menu
-- 
2.44.0


             reply	other threads:[~2024-04-10 14:51 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-10 14:50 cel [this message]
2024-04-10 14:50 ` [PATCH 2/4] gen_nodes: Add support for the nfstest workflow cel
2024-04-10 14:50 ` [PATCH 3/4] gen_hosts: Add gen_hosts " cel
2024-04-10 14:50 ` [PATCH 4/4] roles: Add a playbook to run the nfstest suite cel
2024-04-11 17:49   ` Luis Chamberlain
2024-04-11 18:05     ` Chuck Lever
2024-04-11 18:51       ` Luis Chamberlain
2024-04-11 19:25         ` Chuck Lever
2024-04-11 19:55           ` Luis Chamberlain
2024-04-12 15:34   ` Scott Mayhew
2024-04-12 15:36     ` Chuck Lever III
2024-04-10 14:56 ` [PATCH 1/4] workflows: Workflow stub for Jorge Mora's " Chuck Lever
2024-04-11 16:43 ` Luis Chamberlain
2024-04-11 17:41   ` Chuck Lever
2024-04-12 15:45 ` Scott Mayhew
2024-04-12 15:50   ` Chuck Lever III
2024-04-12 19:03     ` Chuck Lever III

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240410145051.257980-1-cel@kernel.org \
    --to=cel@kernel.org \
    --cc=chuck.lever@oracle.com \
    --cc=kdevops@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).