| #!/bin/bash | |
| # Run xfstests for a given file system configuration. | |
| set -eu | |
| set -o pipefail | |
| readonly PROG_NAME=$(basename "$0") | |
| readonly XFSTESTS_BLD_DIR="/home/fstests" | |
| readonly XFSTESTS_CFG_DIR="test-appliance/files/root/fs/" | |
| CONFIG="" | |
| INSTANCE_NAME="" | |
| RESULTS_BUCKET="" | |
| PROJECT="" | |
| ZONE="" | |
| GROUP="auto" | |
| XFSTESTS_EXCLUDED="" | |
| ARCH="x86_64" | |
| # | |
| # usage <exit_code> | |
| # | |
| # Print usage and exit. | |
| # | |
| usage() { | |
| local exit_code="${1}" | |
| cat <<EOF | |
| Usage: | |
| ${PROG_NAME} [-x <xfstests_config>] [-n <instance_name>] | |
| -x, --xfstests_config the configuration to run xfstests on | |
| -n, --instance_name the name of the instance running xfstests | |
| -r, --result_bucket the GCS bucket to store test result | |
| -p, --project the GCP project to run the test VM | |
| -z, --zone the GCE zone to run the test VM | |
| -g, --group the xfstest group to run | |
| -b, --blocked_tests the list of tests to not run | |
| -i, --rootfs_image the test appliance image to use | |
| -a, --arch the architecture of the image | |
| Note that this script expect kernel to be located at [result_bucket]/bzImage. | |
| Examples: | |
| $ ${PROG_NAME} -x overlay -n xfs-vm -r gs://xfstests/R93-11647.62.0 -p cos-xfstests -z us-west1-c -b generic/269,generic/500 | |
| EOF | |
| exit "${exit_code}" | |
| } | |
| # | |
| # parse_args <args...> | |
| # | |
| # Parse command line arguments. | |
| # | |
| parse_args() { | |
| local args | |
| args=$(getopt \ | |
| --options "x:n:r:p:z:g:b:a:" \ | |
| --longoptions "xfstests_config: instance_name: result_bucket: project: zone: group: blocked_tests: arch:" \ | |
| -- "$@") | |
| [[ $? -eq 0 ]] || usage 1 | |
| eval set -- "${args}" | |
| while :; do | |
| arg="${1}" | |
| shift | |
| case "${arg}" in | |
| -x|--xfstests_config) CONFIG="${1}"; shift ;; | |
| -n|--instance_name) INSTANCE_NAME="${1}"; shift ;; | |
| -r|--result_bucket) RESULTS_BUCKET="${1}"; shift ;; | |
| -p|--project) PROJECT="${1}"; shift ;; | |
| -z|--zone) ZONE="${1}"; shift ;; | |
| -g|--group) GROUP="${1}"; shift ;; | |
| -b|--blocked_tests) XFSTESTS_EXCLUDED="${1}"; shift ;; | |
| -i|--rootfs_image) TEST_APPLIANCE_IMAGE="${1}"; shift ;; | |
| -a|--arch) ARCH="${1}"; shift ;; | |
| --) break ;; | |
| *) echo "internal error parsing arguments!"; usage 1 ;; | |
| esac | |
| done | |
| if [[ -z "$CONFIG" || -z "$RESULTS_BUCKET" || -z "$PROJECT" || -z "$ZONE" ]] ; then | |
| usage 1 | |
| fi | |
| if [[ -z "$INSTANCE_NAME" ]] ; then | |
| echo "Instance name missing. Randomly generating one." | |
| CONFIG_ALNUM=${CONFIG//[^[:alnum:]]/} | |
| INSTANCE_NAME="cos-xfstests-$(date +"%Y%m%d%H%M")${RANDOM}-${CONFIG_ALNUM}" | |
| echo "Instance name: $INSTANCE_NAME" | |
| else | |
| echo "Given instance name: $INSTANCE_NAME" | |
| fi | |
| INSTANCE_NAME=$(echo "${INSTANCE_NAME}" | sed 's/_/-/g') | |
| echo "Using instance name: $INSTANCE_NAME" | |
| } | |
| setup_xfstests_bld() { | |
| git clone https://github.com/tytso/xfstests-bld $XFSTESTS_BLD_DIR | |
| cd "$XFSTESTS_BLD_DIR" | |
| sed -i -E 's/XFSPROGS_COMMIT=v[0-9]+\.[0-9]+\.[0-9]+/XFSPROGS_COMMIT=v6.13.0/' "fstests-bld/config" # XFSPROGS version is pinned in this file - override it to get a newer vesion | |
| make | |
| } | |
| # | |
| # gce_xfstests_run | |
| # | |
| # Run the gce_xfstests command | |
| # | |
| gce_xfstests_run() { | |
| # The result bucket name without gs:// prefix. | |
| local bucket_name="${RESULTS_BUCKET#gs://}" | |
| if [[ "${ARCH}" = "x86_64" ]]; then | |
| kernel="${RESULTS_BUCKET}/bzImage" | |
| elif [[ "${ARCH}" = "arm64" ]]; then | |
| kernel="${RESULTS_BUCKET}/Image" | |
| else | |
| echo "Unknown architecture: ${ARCH}" | |
| exit 1 | |
| fi | |
| # Sets up the config file for gce-xfstests. | |
| mkdir -p /root/.config | |
| cat <<EOF > /root/.config/gce-xfstests | |
| GS_BUCKET=${bucket_name} | |
| GCE_PROJECT=${PROJECT} | |
| GCE_IMAGE_PROJECT=${PROJECT} | |
| GCE_ZONE=${ZONE} | |
| GCE_KERNEL=${kernel} | |
| GCE_UPLOAD_SUMMARY=true | |
| EOF | |
| local excluded_arg="" | |
| local excluded_val="" | |
| if [[ ! -z "${XFSTESTS_EXCLUDED}" ]] ; then | |
| # In COS xfsquick test suite has many excluded test cases(~120 test cases), | |
| # which are passed as command line arguments to gce-xfstests script. | |
| # The arguments that we are passing to gce-xfstests is passed as kernel | |
| # command line to kexec(This is added recently ). Since cos xfs is having | |
| # too many excluded test cases, the kernel command line becomes too big and | |
| # kexec fails with "Kernel command line too long for kernel! Cannot load /root/bzImage" | |
| # Hence adding the excluded tests in a file instead of passing as an argument. | |
| if [[ "${CONFIG}" = "xfs" ]] ; then | |
| echo "${XFSTESTS_EXCLUDED}" | sed 's/,/\n/g' >> \ | |
| "${XFSTESTS_BLD_DIR}"/"${XFSTESTS_CFG_DIR}"/"${CONFIG}"/exclude | |
| excluded_arg="--update-files" | |
| else | |
| excluded_arg="-X" | |
| excluded_val="${XFSTESTS_EXCLUDED}" | |
| fi | |
| fi | |
| echo $XFSTESTS_BLD_DIR/gce-xfstests --instance-name "${INSTANCE_NAME}" \ | |
| --kernel "${RESULTS_BUCKET}/bzImage" ${excluded_arg} "${excluded_val}" \ | |
| -c "${CONFIG}" -g "${GROUP}" --arch "${ARCH}" | |
| # shellcheck disable=SC2086 | |
| # putting ${excluded_val} in quotes causes gce-xfstests to fail because it | |
| # it takes empty value as an argument. | |
| $XFSTESTS_BLD_DIR/gce-xfstests --instance-name "${INSTANCE_NAME}" \ | |
| --kernel "${kernel}" ${excluded_arg} ${excluded_val} \ | |
| -c "${CONFIG}" -g "${GROUP}" --arch "${ARCH}" | |
| } | |
| main() { | |
| parse_args "$@" | |
| setup_xfstests_bld | |
| gce_xfstests_run | |
| } | |
| main "$@" |