#!/bin/sh

#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#

#
# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

#
# Copyright (c) 2016 by Delphix. All rights reserved.
# Copyright (c) 2017 Lawrence Livermore National Security, LLC.
#

. $STF_SUITE/include/commands.cfg

# ZFS Directories
export ZEDLET_ETC_DIR=${ZEDLET_ETC_DIR:-@sysconfdir@/zfs/zed.d}
export ZEDLET_LIBEXEC_DIR=${ZEDLET_LIBEXEC_DIR:-@zfsexecdir@/zed.d}
export ZPOOL_SCRIPT_DIR=${ZPOOL_SCRIPT_DIR:-@sysconfdir@/zfs/zpool.d}
export ZPOOL_COMPAT_DIR=${ZPOOL_COMPAT_DIR:-@datadir@/zfs/compatibility.d}

# Define run length constants
export RT_LONG="3"
export RT_MEDIUM="2"
export RT_SHORT="1"

# Define macro for zone test
export ZONE_POOL="zonepool"
export ZONE_CTR="zonectr"

# ensure we're running in the C locale, since
# localised messages may result in test failures
export LC_ALL="C"
export LANG="C"

#
# pattern to ignore from 'zpool list'.
#
export NO_POOLS="no pools available"

# pattern to ignore from 'zfs list'.
export NO_DATASETS="no datasets available"

# Default directory used for test files
# NOTE: remove trailing "/", some functions rely on this to do pattern matching
export TEST_BASE_DIR="$(dirname ${FILEDIR:-/var/tmp}/.)"

# Default to compression ON
export COMPRESSION_PROP=on

# Default to using the checksum
export CHECKSUM_PROP=on

# some common variables used by test scripts :
export FIO_SCRIPTS=$STF_SUITE/tests/perf/fio
export PERF_SCRIPTS=$STF_SUITE/tests/perf/scripts

# some test pool names
export TESTPOOL=testpool
export TESTPOOL1=testpool1
export TESTPOOL2=testpool2
export TESTPOOL3=testpool3
export PERFPOOL=perfpool

# some test file system names
export TESTFS=testfs
export TESTFS1=testfs1
export TESTFS2=testfs2
export TESTFS3=testfs3

# some test directory names
export TESTDIR=${TEST_BASE_DIR%%/}/testdir
export TESTDIR0=${TEST_BASE_DIR%%/}/testdir0
export TESTDIR1=${TEST_BASE_DIR%%/}/testdir1
export TESTDIR2=${TEST_BASE_DIR%%/}/testdir2

# some test sub file system names
export TESTSUBFS=subfs
export TESTSUBFS1=subfs1
export TESTSUBFS2=subfs2

# some temp files
export TEMPFILE=${TEST_BASE_DIR%%/}/tempfile$$
export TEMPFILE0=${TEST_BASE_DIR%%/}/tempfile0$$
export TEMPFILE1=${TEST_BASE_DIR%%/}/tempfile1$$
export TEMPFILE2=${TEST_BASE_DIR%%/}/tempfile2$$

export ZFSROOT=

export TESTSNAP=testsnap
export TESTSNAP1=testsnap1
export TESTSNAP2=testsnap2
export TESTCLONE=testclone
export TESTCLONE1=testclone1
export TESTCLONE2=testclone2
export TESTCLCT=testclct
export TESTCTR=testctr
export TESTCTR1=testctr1
export TESTCTR2=testctr2
export TESTVOL=testvol
export TESTVOL1=testvol1
export TESTVOL2=testvol2
export TESTFILE0=testfile0
export TESTFILE1=testfile1
export TESTFILE2=testfile2
export TESTBKMARK=testbkmark

export LONGPNAME="poolname50charslong_012345678901234567890123456789"
export LONGFSNAME="fsysname50charslong_012345678901234567890123456789"
export SNAPFS="$TESTPOOL/$TESTFS@$TESTSNAP"
export SNAPFS1="$TESTPOOL/$TESTVOL@$TESTSNAP"

export VOLSIZE=150m
export BIGVOLSIZE=1eb

# Default to limit disks to be checked
export MAX_FINDDISKSNUM=6

# Default minimum size for file based vdevs in the test suite
export MINVDEVSIZE=$((256 * 1024 * 1024))

# Minimum vdev size possible as defined in the OS
export SPA_MINDEVSIZE=$((64 * 1024 * 1024))

# For iscsi target support
export ISCSITGTFILE=/tmp/iscsitgt_file
export ISCSITGT_FMRI=svc:/system/iscsitgt:default

export ZFS_VERSION=5
export ZFS_ALL_VERSIONS="1 2 3 4 5"

for i in $ZFS_ALL_VERSIONS; do
	eval 'export ZFS_VERSION_$i="v${i}-fs"'
done

export MAX_PARTITIONS=8

case $(uname -o) in
GNU/Linux)
	unpack_opts="--sparse -xf"
	pack_opts="--sparse -cf"
	verbose=" -v"
	unpack_preserve=" -xpf"
	pack_preserve=" -cpf"

	ZVOL_DEVDIR="/dev/zvol"
	ZVOL_RDEVDIR="/dev/zvol"
	DEV_DSKDIR="/dev"
	DEV_RDSKDIR="/dev"
	DEV_MPATHDIR="/dev/mapper"

	ZEDLET_DIR="/var/tmp/zed"
	ZED_LOG="$ZEDLET_DIR/zed.log"
	ZED_DEBUG_LOG="$ZEDLET_DIR/zed.debug.log"
	VDEVID_CONF="$ZEDLET_DIR/vdev_id.conf"
	VDEVID_CONF_ETC="/etc/zfs/vdev_id.conf"

	NEWFS_DEFAULT_FS="ext2"
	SLICE_PREFIX=""
	;;
FreeBSD)
	unpack_opts="xv"
	pack_opts="cf"
	verbose="v"
	unpack_preserve="xpf"
	pack_preserve="cpf"

	ZVOL_DEVDIR="/dev/zvol"
	ZVOL_RDEVDIR="/dev/zvol"
	DEV_DSKDIR="/dev"
	DEV_RDSKDIR="/dev"
	DEV_MPATHDIR="/dev/multipath"

	NEWFS_DEFAULT_FS="ufs"
	SLICE_PREFIX="p"
	;;
illumos)
	export AUTO_SNAP=$(svcs -a | \
	    awk '/auto-snapshot/ && /online/ { print $3 }')
	# finally, if we're running in a local zone
	# we take some additional actions
	if [ "$(zonename 2>/dev/null)" != "global" ]; then
		reexport_pool
	fi

	unpack_opts="xv"
	pack_opts="cf"
	verbose="v"
	unpack_preserve="xpf"
	pack_preserve="cpf"

	ZVOL_DEVDIR="/dev/zvol/dsk"
	ZVOL_RDEVDIR="/dev/zvol/rdsk"
	DEV_DSKDIR="/dev/dsk"
	DEV_RDSKDIR="/dev/rdsk"

	NEWFS_DEFAULT_FS="ufs"
	SLICE_PREFIX="s"
	;;
esac
export unpack_opts pack_opts verbose unpack_preserve pack_preserve \
       ZVOL_DEVDIR ZVOL_RDEVDIR DEV_DSKDIR DEV_RDSKDIR DEV_MPATHDIR \
       ZEDLET_DIR ZED_LOG ZED_DEBUG_LOG VDEVID_CONF VDEVID_CONF_ETC \
       NEWFS_DEFAULT_FS SLICE_PREFIX
