blob: 703ae8043d4856368c3c83ca8d837d89ab6957a7 [file] [log] [blame]
#!/bin/ksh -p
#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source. A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#
#
# Copyright 2019 Joyent, Inc.
#
. $STF_SUITE/include/libtest.shlib
. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib
#
# DESCRIPTION:
# zfs create -n should perform basic sanity checking but should never create a
# dataset. If -v and/or -P are used, it should verbose about what would be
# created if sanity checks pass.
#
# STRATEGY:
# 1. Attempt to create a file system and a volume using various combinations of
# -n with -v and -P.
#
verify_runnable "both"
#
# Verifies that valid commands with -n and without -[vP]:
# - succeed
# - do not create a dataset
# - do not generate output
#
function dry_create_no_output
{
typeset -a cmd=(zfs create -n "$@")
log_note "$0: ${cmd[@]}"
log_must "${cmd[@]}"
datasetexists "$TESTPOOL/$TESTFS1" &&
log_fail "$TESTPOOL/$TESTFS1 unexpectedly created by '${cmd[@]}'"
typeset out=$("${cmd[@]}" 2>&1)
[[ -z "$out" ]] ||
log_fail "unexpected output '$out' from '${cmd[@]}'"
}
#
# Verifies that commands with invalid properties or invalid property values
# - fail
# - do not create a dataset
# - generate a message on stderr
#
function dry_create_error
{
typeset -a cmd=(zfs create -n "$@")
log_note "$0: ${cmd[@]}"
log_mustnot "${cmd[@]}"
datasetexists "$TESTPOOL/$TESTFS1" &&
log_fail "$TESTPOOL/$TESTFS1 unexpectedly created by '${cmd[@]}'"
typeset out=$("${cmd[@]}" 2>&1 >/dev/null)
[[ -z "$out" ]] &&
log_fail "expected an error message but got none from '${cmd[@]}'"
}
#
# Verifies that dry-run commands with parseable output
# - succeed
# - do not create datasets
# - generate parseable output on stdout
# - output matches expectations
#
function dry_create_parseable
{
typeset -n exp=$1
shift
typeset -a cmd=(zfs create -Pn "$@")
typeset ds=${cmd[${#cmd[@]} - 1]}
typeset out
typeset -a toks
typeset -a props
typeset found_create=false
log_note "$0: ${cmd[@]}"
out=$("${cmd[@]}")
(( $? == 0 )) ||
log_fail "unexpected failure getting stdout from '${cmd[@]}'"
datasetexists "$TESTPOOL/$TESTFS1" &&
log_fail "$TESTPOOL/$TESTFS1 unexpectedly created by '${cmd[@]}'"
echo "$out" | while IFS=$'\t' read -A toks; do
log_note "verifying ${toks[@]}"
case ${toks[0]} in
create)
log_must test "${#toks[@]}" -eq 2
log_must test "${toks[1]}" == "$ds"
found_create="yes, I found create"
;;
property)
log_must test "${#toks[@]}" -eq 3
typeset prop=${toks[1]}
typeset val=${toks[2]}
if [[ -z "${exp[$prop]}" ]]; then
log_fail "unexpectedly got property '$prop'"
fi
# We may not know the exact value a property will take
# on. This is the case for at least refreservation.
if [[ ${exp[$prop]} != "*" ]]; then
log_must test "${exp[$prop]}" == "$val"
fi
unset exp[$prop]
;;
*)
log_fail "Unexpected line ${toks[@]}"
;;
esac
done
log_must test "$found_create" == "yes, I found create"
log_must test "extra props: ${!exp[@]}" == "extra props: "
}
function cleanup
{
datasetexists "$TESTPOOL/$TESTFS1" && \
destroy_dataset "$TESTPOOL/$TESTFS1" -r
}
log_onexit cleanup
log_assert "zfs create -n creates nothing but can describe what would be" \
"created"
# Typical creations should succeed
dry_create_no_output "$TESTPOOL/$TESTFS1"
dry_create_no_output -V 10m "$TESTPOOL/$TESTFS1"
# It shouldn't do a space check right now
dry_create_no_output -V 100t "$TESTPOOL/$TESTFS1"
# It shouldn't create parent datasets either
dry_create_no_output -p "$TESTPOOL/$TESTFS1/$TESTFS2"
dry_create_no_output -pV 10m "$TESTPOOL/$TESTFS1/$TESTFS2"
# Various invalid properties should be recognized and result in an error
dry_create_error -o nosuchprop=42 "$TESTPOOL/$TESTFS1"
dry_create_error -b 1234 -V 10m "$TESTPOOL/$TESTFS1"
# Parseable output should be parseable.
typeset -A expect
expect=([compression]=on)
dry_create_parseable expect -o compression=on "$TESTPOOL/$TESTFS1"
# Sparse volumes should not get a gratuitous refreservation
expect=([volblocksize]=4096 [volsize]=$((1024 * 1024 * 10)))
dry_create_parseable expect -b 4k -V 10m -s "$TESTPOOL/$TESTFS1"
# Non-sparse volumes should have refreservation
expect=(
[volblocksize]=4096
[volsize]=$((1024 * 1024 * 10))
[refreservation]="*"
)
dry_create_parseable expect -b 4k -V 10m "$TESTPOOL/$TESTFS1"
log_pass "zfs create -n creates nothing but can describe what would be" \
"created"