aboutsummaryrefslogtreecommitdiff
path: root/scripts/zimport.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/zimport.sh')
-rwxr-xr-xscripts/zimport.sh512
1 files changed, 0 insertions, 512 deletions
diff --git a/scripts/zimport.sh b/scripts/zimport.sh
deleted file mode 100755
index 2549a483b148..000000000000
--- a/scripts/zimport.sh
+++ /dev/null
@@ -1,512 +0,0 @@
-#!/usr/bin/env bash
-#
-# Verify that an assortment of known good reference pools can be imported
-# using different versions of OpenZFS code.
-#
-# By default references pools for the major ZFS implementation will be
-# checked against the most recent OpenZFS tags and the master development branch.
-# Alternate tags or branches may be verified with the '-s <src-tag> option.
-# Passing the keyword "installed" will instruct the script to test whatever
-# version is installed.
-#
-# Preferentially a reference pool is used for all tests. However, if one
-# does not exist and the pool-tag matches one of the src-tags then a new
-# reference pool will be created using binaries from that source build.
-# This is particularly useful when you need to test your changes before
-# opening a pull request. The keyword 'all' can be used as short hand
-# refer to all available reference pools.
-#
-# New reference pools may be added by placing a bzip2 compressed tarball
-# of the pool in the scripts/zfs-images directory and then passing
-# the -p <pool-tag> option. To increase the test coverage reference pools
-# should be collected for all the major ZFS implementations. Having these
-# pools easily available is also helpful to the developers.
-#
-# Care should be taken to run these tests with a kernel supported by all
-# the listed tags. Otherwise build failure will cause false positives.
-#
-#
-# EXAMPLES:
-#
-# The following example will verify the zfs-0.6.2 tag, the master branch,
-# and the installed zfs version can correctly import the listed pools.
-# Note there is no reference pool available for master and installed but
-# because binaries are available one is automatically constructed. The
-# working directory is also preserved between runs (-k) preventing the
-# need to rebuild from source for multiple runs.
-#
-# zimport.sh -k -f /var/tmp/zimport \
-# -s "zfs-0.6.2 master installed" \
-# -p "zevo-1.1.1 zol-0.6.2 zol-0.6.2-173 master installed"
-#
-# ------------------------ OpenZFS Source Versions ----------------
-# zfs-0.6.2 master 0.6.2-175_g36eb554
-# -----------------------------------------------------------------
-# Clone ZFS Local Local Skip
-# Build ZFS Pass Pass Skip
-# -----------------------------------------------------------------
-# zevo-1.1.1 Pass Pass Pass
-# zol-0.6.2 Pass Pass Pass
-# zol-0.6.2-173 Fail Pass Pass
-# master Pass Pass Pass
-# installed Pass Pass Pass
-#
-
-BASE_DIR=$(dirname "$0")
-SCRIPT_COMMON=common.sh
-if [[ -f "${BASE_DIR}/${SCRIPT_COMMON}" ]]; then
- . "${BASE_DIR}/${SCRIPT_COMMON}"
-else
- echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
-fi
-
-PROG=zimport.sh
-SRC_TAGS="zfs-0.6.5.11 master"
-POOL_TAGS="all master"
-POOL_CREATE_OPTIONS=
-TEST_DIR=$(mktemp -u -d -p /var/tmp zimport.XXXXXXXX)
-KEEP="no"
-VERBOSE="no"
-COLOR="yes"
-REPO="https://github.com/openzfs"
-IMAGES_DIR="${BASE_DIR}/zfs-images/"
-IMAGES_TAR="https://github.com/openzfs/zfs-images/tarball/master"
-ERROR=0
-
-CONFIG_LOG="configure.log"
-CONFIG_OPTIONS=${CONFIG_OPTIONS:-""}
-MAKE_LOG="make.log"
-MAKE_OPTIONS=${MAKE_OPTIONS:-"-s -j$(nproc)"}
-
-COLOR_GREEN="\033[0;32m"
-COLOR_RED="\033[0;31m"
-COLOR_BROWN="\033[0;33m"
-COLOR_RESET="\033[0m"
-
-usage() {
-cat << EOF
-USAGE:
-zimport.sh [hvl] [-r repo] [-s src-tag] [-i pool-dir] [-p pool-tag]
- [-f path] [-o options]
-
-DESCRIPTION:
- ZPOOL import verification tests
-
-OPTIONS:
- -h Show this message
- -v Verbose
- -c No color
- -k Keep temporary directory
- -r <repo> Source repository ($REPO)
- -s <src-tag>... Verify OpenZFS versions with the listed tags
- -i <pool-dir> Pool image directory
- -p <pool-tag>... Verify pools created with the listed tags
- -f <path> Temporary directory to use
- -o <options> Additional options to pass to 'zpool create'
-
-EOF
-}
-
-while getopts 'hvckr:s:i:p:f:o:?' OPTION; do
- case $OPTION in
- h)
- usage
- exit 1
- ;;
- v)
- VERBOSE="yes"
- ;;
- c)
- COLOR="no"
- ;;
- k)
- KEEP="yes"
- ;;
- r)
- REPO="$OPTARG"
- ;;
- s)
- SRC_TAGS="$OPTARG"
- ;;
- i)
- IMAGES_DIR="$OPTARG"
- ;;
- p)
- POOL_TAGS="$OPTARG"
- ;;
- f)
- TEST_DIR="$OPTARG"
- ;;
- o)
- POOL_CREATE_OPTIONS="$OPTARG"
- ;;
- *)
- usage
- exit 1
- ;;
- esac
-done
-
-#
-# Verify the module start is not loaded
-#
-if lsmod | grep zfs >/dev/null; then
- echo "ZFS modules must be unloaded"
- exit 1
-fi
-
-#
-# Create a random directory tree of files and sub-directories to
-# to act as a copy source for the various regression tests.
-#
-populate() {
- local ROOT=$1
- local MAX_DIR_SIZE=$2
- local MAX_FILE_SIZE=$3
-
- mkdir -p "$ROOT"/{a,b,c,d,e,f,g}/{h,i}
- DIRS=$(find "$ROOT")
-
- for DIR in $DIRS; do
- COUNT=$((RANDOM % MAX_DIR_SIZE))
-
- for _ in $(seq "$COUNT"); do
- FILE=$(mktemp -p "$DIR")
- SIZE=$((RANDOM % MAX_FILE_SIZE))
- dd if=/dev/urandom of="$FILE" bs=1k \
- count="$SIZE" &>/dev/null
- done
- done
-
- return 0
-}
-
-SRC_DIR=$(mktemp -d -p /var/tmp/ zfs.src.XXXXXXXX)
-trap 'rm -Rf "$SRC_DIR"' INT TERM EXIT
-populate "$SRC_DIR" 10 100
-
-SRC_DIR="$TEST_DIR/src"
-SRC_DIR_ZFS="$SRC_DIR/zfs"
-
-if [[ "$COLOR" = "no" ]]; then
- COLOR_GREEN=""
- COLOR_BROWN=""
- COLOR_RED=""
- COLOR_RESET=""
-fi
-
-pass_nonewline() {
- echo -n -e "${COLOR_GREEN}Pass${COLOR_RESET}\t\t"
-}
-
-skip_nonewline() {
- echo -n -e "${COLOR_BROWN}Skip${COLOR_RESET}\t\t"
-}
-
-fail_nonewline() {
- echo -n -e "${COLOR_RED}Fail${COLOR_RESET}\t\t"
-}
-
-#
-# Log a failure message, cleanup, and return an error.
-#
-fail() {
- echo -e "$PROG: $1" >&2
- $ZFS_SH -u >/dev/null 2>&1
- exit 1
-}
-
-#
-# Set several helper variables which are derived from a source tag.
-#
-# ZFS_TAG - The passed zfs-x.y.z tag
-# ZFS_DIR - The zfs directory name
-# ZFS_URL - The zfs github URL to fetch the tarball
-#
-src_set_vars() {
- local TAG=$1
-
- ZFS_TAG="$TAG"
- ZFS_DIR="$SRC_DIR_ZFS/$ZFS_TAG"
- ZFS_URL="$REPO/zfs/tarball/$ZFS_TAG"
-
- if [[ "$TAG" = "installed" ]]; then
- ZPOOL_CMD=$(command -v zpool)
- ZFS_CMD=$(command -v zfs)
- ZFS_SH="/usr/share/zfs/zfs.sh"
- else
- ZPOOL_CMD="./zpool"
- ZFS_CMD="./zfs"
- ZFS_SH="./scripts/zfs.sh"
- fi
-}
-
-#
-# Set several helper variables which are derived from a pool name such
-# as zol-0.6.x, zevo-1.1.1, etc. These refer to example pools from various
-# ZFS implementations which are used to verify compatibility.
-#
-# POOL_TAG - The example pools name in scripts/zfs-images/.
-# POOL_BZIP - The full path to the example bzip2 compressed pool.
-# POOL_DIR - The top level test path for this pool.
-# POOL_DIR_PRISTINE - The directory containing a pristine version of the pool.
-# POOL_DIR_COPY - The directory containing a working copy of the pool.
-# POOL_DIR_SRC - Location of a source build if it exists for this pool.
-#
-pool_set_vars() {
- local TAG=$1
-
- POOL_TAG=$TAG
- POOL_BZIP=$IMAGES_DIR/$POOL_TAG.tar.bz2
- POOL_DIR=$TEST_DIR/pools/$POOL_TAG
- POOL_DIR_PRISTINE=$POOL_DIR/pristine
- POOL_DIR_COPY=$POOL_DIR/copy
- POOL_DIR_SRC="$SRC_DIR_ZFS/${POOL_TAG//zol/zfs}"
-}
-
-#
-# Construct a non-trivial pool given a specific version of the source. More
-# interesting pools provide better test coverage so this function should
-# extended as needed to create more realistic pools.
-#
-pool_create() {
- pool_set_vars "$1"
- src_set_vars "$1"
-
- if [[ "$POOL_TAG" != "installed" ]]; then
- cd "$POOL_DIR_SRC" || fail "Failed 'cd $POOL_DIR_SRC'"
- fi
-
- $ZFS_SH zfs="spa_config_path=$POOL_DIR_PRISTINE" || \
- fail "Failed to load kmods"
-
- # Create a file vdev RAIDZ pool.
- truncate -s 1G \
- "$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
- "$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4" || \
- fail "Failed 'truncate -s 1G ...'"
- # shellcheck disable=SC2086
- $ZPOOL_CMD create $POOL_CREATE_OPTIONS "$POOL_TAG" raidz \
- "$POOL_DIR_PRISTINE/vdev1" "$POOL_DIR_PRISTINE/vdev2" \
- "$POOL_DIR_PRISTINE/vdev3" "$POOL_DIR_PRISTINE/vdev4" || \
- fail "Failed '$ZPOOL_CMD create $POOL_CREATE_OPTIONS $POOL_TAG ...'"
-
- # Create a pool/fs filesystem with some random contents.
- $ZFS_CMD create "$POOL_TAG/fs" || \
- fail "Failed '$ZFS_CMD create $POOL_TAG/fs'"
- populate "/$POOL_TAG/fs/" 10 100
-
- # Snapshot that filesystem, clone it, remove the files/dirs,
- # replace them with new files/dirs.
- $ZFS_CMD snap "$POOL_TAG/fs@snap" || \
- fail "Failed '$ZFS_CMD snap $POOL_TAG/fs@snap'"
- $ZFS_CMD clone "$POOL_TAG/fs@snap" "$POOL_TAG/clone" || \
- fail "Failed '$ZFS_CMD clone $POOL_TAG/fs@snap $POOL_TAG/clone'"
- # shellcheck disable=SC2086
- rm -Rf /$POOL_TAG/clone/*
- populate "/$POOL_TAG/clone/" 10 100
-
- # Scrub the pool, delay slightly, then export it. It is now
- # somewhat interesting for testing purposes.
- $ZPOOL_CMD scrub "$POOL_TAG" || \
- fail "Failed '$ZPOOL_CMD scrub $POOL_TAG'"
- sleep 10
- $ZPOOL_CMD export "$POOL_TAG" || \
- fail "Failed '$ZPOOL_CMD export $POOL_TAG'"
-
- $ZFS_SH -u || fail "Failed to unload kmods"
-}
-
-# If the zfs-images directory doesn't exist fetch a copy from Github then
-# cache it in the $TEST_DIR and update $IMAGES_DIR.
-if [[ ! -d "$IMAGES_DIR" ]]; then
- IMAGES_DIR="$TEST_DIR/zfs-images"
- mkdir -p "$IMAGES_DIR"
- curl -sL "$IMAGES_TAR" | \
- tar -xz -C "$IMAGES_DIR" --strip-components=1 || \
- fail "Failed to download pool images"
-fi
-
-# Given the available images in the zfs-images directory substitute the
-# list of available images for the reserved keyword 'all'.
-for TAG in $POOL_TAGS; do
-
- if [[ "$TAG" = "all" ]]; then
- ALL_TAGS=$(echo "$IMAGES_DIR"/*.tar.bz2 | \
- sed "s|$IMAGES_DIR/||g;s|.tar.bz2||g")
- NEW_TAGS="$NEW_TAGS $ALL_TAGS"
- else
- NEW_TAGS="$NEW_TAGS $TAG"
- fi
-done
-POOL_TAGS="$NEW_TAGS"
-
-if [[ "$VERBOSE" = "yes" ]]; then
- echo "---------------------------- Options ----------------------------"
- echo "VERBOSE=$VERBOSE"
- echo "KEEP=$KEEP"
- echo "REPO=$REPO"
- echo "SRC_TAGS=$SRC_TAGS"
- echo "POOL_TAGS=$POOL_TAGS"
- echo "PATH=$TEST_DIR"
- echo "POOL_CREATE_OPTIONS=$POOL_CREATE_OPTIONS"
- echo
-fi
-
-if [[ ! -d "$TEST_DIR" ]]; then
- mkdir -p "$TEST_DIR"
-fi
-
-if [[ ! -d "$SRC_DIR" ]]; then
- mkdir -p "$SRC_DIR"
-fi
-
-# Print a header for all tags which are being tested.
-echo "------------------------ OpenZFS Source Versions ----------------"
-printf "%-16s" " "
-for TAG in $SRC_TAGS; do
- src_set_vars "$TAG"
-
- if [[ "$TAG" = "installed" ]]; then
- ZFS_VERSION=$(modinfo zfs | awk '/version:/ { print $2; exit }')
- if [[ -n "$ZFS_VERSION" ]]; then
- printf "%-16s" "$ZFS_VERSION"
- else
- fail "ZFS is not installed"
- fi
- else
- printf "%-16s" "$TAG"
- fi
-done
-echo -e "\n-----------------------------------------------------------------"
-
-#
-# Attempt to generate the tarball from your local git repository, if that
-# fails then attempt to download the tarball from Github.
-#
-printf "%-16s" "Clone ZFS"
-for TAG in $SRC_TAGS; do
- src_set_vars "$TAG"
-
- if [[ -d "$ZFS_DIR" ]]; then
- skip_nonewline
- elif [[ "$ZFS_TAG" = "installed" ]]; then
- skip_nonewline
- else
- cd "$SRC_DIR" || fail "Failed 'cd $SRC_DIR'"
-
- if [[ ! -d "$SRC_DIR_ZFS" ]]; then
- mkdir -p "$SRC_DIR_ZFS"
- fi
-
- git archive --format=tar --prefix="$ZFS_TAG/ $ZFS_TAG" \
- -o "$SRC_DIR_ZFS/$ZFS_TAG.tar" &>/dev/null || \
- rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
- if [[ -s "$SRC_DIR_ZFS/$ZFS_TAG.tar" ]]; then
- tar -xf "$SRC_DIR_ZFS/$ZFS_TAG.tar" -C "$SRC_DIR_ZFS"
- rm "$SRC_DIR_ZFS/$ZFS_TAG.tar"
- echo -n -e "${COLOR_GREEN}Local${COLOR_RESET}\t\t"
- else
- mkdir -p "$ZFS_DIR" || fail "Failed to create $ZFS_DIR"
- curl -sL "$ZFS_URL" | tar -xz -C "$ZFS_DIR" \
- --strip-components=1 || \
- fail "Failed to download $ZFS_URL"
- echo -n -e "${COLOR_GREEN}Remote${COLOR_RESET}\t\t"
- fi
- fi
-done
-printf "\n"
-
-# Build the listed tags
-printf "%-16s" "Build ZFS"
-for TAG in $SRC_TAGS; do
- src_set_vars "$TAG"
-
- if [[ -f "$ZFS_DIR/module/zfs/zfs.ko" ]]; then
- skip_nonewline
- elif [[ "$ZFS_TAG" = "installed" ]]; then
- skip_nonewline
- else
- cd "$ZFS_DIR" || fail "Failed 'cd $ZFS_DIR'"
- make distclean &>/dev/null
- ./autogen.sh >>"$CONFIG_LOG" 2>&1 || \
- fail "Failed ZFS 'autogen.sh'"
- # shellcheck disable=SC2086
- ./configure $CONFIG_OPTIONS >>"$CONFIG_LOG" 2>&1 || \
- fail "Failed ZFS 'configure $CONFIG_OPTIONS'"
- # shellcheck disable=SC2086
- make $MAKE_OPTIONS >>"$MAKE_LOG" 2>&1 || \
- fail "Failed ZFS 'make $MAKE_OPTIONS'"
- pass_nonewline
- fi
-done
-printf "\n"
-echo "-----------------------------------------------------------------"
-
-# Either create a new pool using 'zpool create', or alternately restore an
-# existing pool from another ZFS implementation for compatibility testing.
-for TAG in $POOL_TAGS; do
- pool_set_vars "$TAG"
- SKIP=0
-
- printf "%-16s" "$POOL_TAG"
- rm -Rf "$POOL_DIR"
- mkdir -p "$POOL_DIR_PRISTINE"
-
- # Use the existing compressed image if available.
- if [[ -f "$POOL_BZIP" ]]; then
- tar -xjf "$POOL_BZIP" -C "$POOL_DIR_PRISTINE" \
- --strip-components=1 || \
- fail "Failed 'tar -xjf $POOL_BZIP"
- # Use the installed version to create the pool.
- elif [[ "$TAG" = "installed" ]]; then
- pool_create "$TAG"
- # A source build is available to create the pool.
- elif [[ -d "$POOL_DIR_SRC" ]]; then
- pool_create "$TAG"
- else
- SKIP=1
- fi
-
- # Verify 'zpool import' works for all listed source versions.
- for SRC_TAG in $SRC_TAGS; do
-
- if [[ "$SKIP" -eq 1 ]]; then
- skip_nonewline
- continue
- fi
-
- src_set_vars "$SRC_TAG"
- if [[ "$SRC_TAG" != "installed" ]]; then
- cd "$ZFS_DIR" || fail "Failed 'cd $ZFS_DIR'"
- fi
- $ZFS_SH zfs="spa_config_path=$POOL_DIR_COPY"
-
- cp -a --sparse=always "$POOL_DIR_PRISTINE" \
- "$POOL_DIR_COPY" || \
- fail "Failed to copy $POOL_DIR_PRISTINE to $POOL_DIR_COPY"
- POOL_NAME=$($ZPOOL_CMD import -d "$POOL_DIR_COPY" | \
- awk '/pool:/ { print $2; exit }')
-
- if ! $ZPOOL_CMD import -N -d "$POOL_DIR_COPY"
- "$POOL_NAME" &>/dev/null; then
- fail_nonewline
- ERROR=1
- else
- $ZPOOL_CMD export "$POOL_NAME" || \
- fail "Failed to export pool"
- pass_nonewline
- fi
-
- rm -Rf "$POOL_DIR_COPY"
-
- $ZFS_SH -u || fail "Failed to unload kmods"
- done
- printf "\n"
-done
-
-if [[ "$KEEP" = "no" ]]; then
- rm -Rf "$TEST_DIR"
-fi
-
-exit "$ERROR"