| #!/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 -P without -n should be verbose about dataset creation. |
| # |
| # STRATEGY: |
| # 1. Attempt to create a file system and a volume using various properties |
| # and -P |
| # 2. Exercise the combination of -p and -P. |
| # |
| |
| verify_runnable "both" |
| |
| # |
| # Verifies that non dry-run commands with parseable output |
| # - succeed |
| # - create datasets |
| # - generate parseable output on stdout |
| # - output matches expectations |
| # |
| function dry_create_parseable |
| { |
| typeset -n exp=$1 |
| shift |
| typeset -a cmd=(zfs create -P "$@") |
| typeset ds=${cmd[${#cmd[@]} - 1]} |
| typeset out |
| typeset -a toks |
| typeset -a props |
| typeset found_create=false |
| typeset create_ancestors= |
| typeset opt |
| |
| # Parse the arguments to see if -p was used. |
| while getopts :PV:b:ospv opt; do |
| case $opt in |
| p) create_ancestors=needed ;; |
| *) continue ;; |
| esac |
| done |
| |
| 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_ancestors) |
| case "$create_ancestors" in |
| needed) |
| log_must test "${toks[1]}" == "$ds" |
| create_ancestors="found ${toks[1]}" |
| ;; |
| found*) |
| log_fail "multiple ancestor creation" \ |
| "$create_ancestors and ${toks[1]}" |
| ;; |
| "") |
| log_fail "unexpected create_ancestors" |
| ;; |
| *) |
| log_fail "impossible error: fix the test" |
| ;; |
| esac |
| ;; |
| 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: " |
| |
| case "$create_ancestors" in |
| "") |
| log_must_busy zfs destroy "$ds" |
| ;; |
| "found $ds") |
| log_must_busy zfs destroy -r "$(echo "$ds" | cut -d/ -f1-2)" |
| ;; |
| needed) |
| log_fail "Expected but did not find create_ancestors" |
| ;; |
| *) |
| log_fail "Unexpected value for create_ancestors:" \ |
| "$create_ancestors" |
| ;; |
| esac |
| } |
| |
| function cleanup |
| { |
| datasetexists "$TESTPOOL/$TESTFS1" && \ |
| destroy_dataset "$TESTPOOL/$TESTFS1" -r |
| } |
| log_onexit cleanup |
| |
| log_assert "zfs create -v creates datasets verbosely" |
| |
| # Parseable output should be parseable. |
| typeset -A expect |
| expect=([compression]=on) |
| dry_create_parseable expect -o compression=on "$TESTPOOL/$TESTFS1" |
| |
| # Ancestor creation with -p should emit relevant line |
| expect=([compression]=on) |
| dry_create_parseable expect -p -o compression=on "$TESTPOOL/$TESTFS1" |
| expect=([compression]=on) |
| dry_create_parseable expect -p -o compression=on "$TESTPOOL/$TESTFS1/$TESTVOL" |
| |
| # 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 -v creates datasets verbosely" |