Mercurial > illumos > illumos-gate
diff usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_010_pos.ksh @ 13899:0bcf78798346
3311 Want a test framework for arbitrary OS unit tests
3312 Add a testrunner package for OS unit tests
3313 Add a testrunner package to convert ZFS tests from STF
Reviewed by: Matt Ahrens <matthew.ahrens@delphix.com>
Reviewed by: Will Guyette <will.guyette@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Henrik Mattson <henrik.mattson@delphix.com>
Reviewed by: Sonu Pillai <sonu.pillai@delphix.com>
Reviewed by: Christopher Siden <chris.siden@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Approved by: Richard Lowe <richlowe@richlowe.net>
author | John Wren Kennedy <john.kennedy@delphix.com> |
---|---|
date | Wed, 05 Dec 2012 22:04:50 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_010_pos.ksh Wed Dec 05 22:04:50 2012 -0500 @@ -0,0 +1,233 @@ +#!/bin/ksh +# +# CDDL HEADER START +# +# 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. +# +# CDDL HEADER END +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify 'zfs list -t all -o name,origin,clones' prints the correct +# clone information +# +# STRATEGY: +# 1. Create datasets +# 2. Create recursive snapshots and their clones +# 3. Verify zfs clones property displays right information for different +# cases +# + +verify_runnable "both" + +function local_cleanup +{ + typeset -i i=1 + for ds in $datasets; do + datasetexists $ds/$TESTCLONE.$i && \ + log_must $ZFS destroy -rf $ds/$TESTCLONE.$i + datasetexists $ds && log_must $ZFS destroy -Rf $ds + ((i=i+1)) + done +} + +# Set up filesystem with clones +function setup_ds +{ + typeset -i i=1 + # create nested datasets + log_must $ZFS create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3 + + # verify dataset creation + for ds in $datasets; do + datasetexists $ds || log_fail "Create $ds dataset fail." + done + + # create recursive nested snapshot + log_must $ZFS snapshot -r $TESTPOOL/$TESTFS1@snap + for ds in $datasets; do + datasetexists $ds@snap || \ + log_fail "Create $ds@snap snapshot fail." + done + for ds in $datasets; do + for fs in $datasets; do + log_must $ZFS clone $ds@snap $fs/$TESTCLONE.$i + done + ((i=i+1)) + done +} + +# Verify clone list +function verify_clones +{ + typeset -i no_clones=$1 + typeset unexpected=$2 + typeset clone_snap=$3 + typeset -i i=1 + for ds in $datasets; do + if [[ -n $clone_snap ]]; then + clone_snap=/$TESTCLONE.$i + fi + snapshot=$($ECHO "$names" | $GREP $ds$clone_snap@snap) + actual_clone=$($ZFS list -t all -o clones $snapshot | $TAIL -1) + save=$IFS + IFS=',' + typeset -a clones=() + for token in $actual_clone; do + clones=( "${clones[@]}" "$token" ) + done + IFS=$save + [[ ${#clones[*]} -ne $no_clones ]] && \ + log_fail "$snapshot has unexpected number of clones" \ + " ${#clones[*]}" + expected_clone="" + unexpected_clone="" + if [[ $unexpected -eq 1 ]]; then + for fs in $datasets; do + if [[ $fs == $ds ]]; then + if [[ -z $clone_snap ]]; then + unexpected_clone=$fs/$TESTCLONE.$i + (for match in ${clones[@]};do + [[ $match != $unexpected_clone ]] && \ + exit 0; done) || log_fail \ + "Unexpected clones of the snapshot" + else + expected_clone=$fs + unexpected_clone=$fs/$TESTCLONE.$i + (for match in ${clones[@]};do + [[ $match == $expected_clone ]] && \ + [[ $match != $unexpected_clone ]] \ + && exit 0; done) || log_fail \ + "Unexpected clones of the snapshot" + fi + else + expected_clone=$fs/$TESTCLONE.$i + (for match in ${clones[@]};do + [[ $match == $expected_clone ]] && \ + exit 0; done) || log_fail \ + "Unexpected clones of the snapshot" + fi + done + else + for fs in $datasets; do + expected_clone=$fs/$TESTCLONE.$i + (for match in ${clones[@]};do + [[ $match == $expected_clone ]] && exit 0; \ + done) || log_fail "Unexpected clones" \ + " of the snapshot" + done + fi + ((i=i+1)) + done +} + + +log_onexit local_cleanup +datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 + $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3" + +typeset -a d_clones +typeset -a deferred_snaps +typeset -i i +i=1 +log_must setup_ds + +log_note "Verify zfs clone propery for multiple clones" +names=$($ZFS list -rt all -o name $TESTPOOL) +log_must verify_clones 3 0 + +log_note "verfify clone property for clone deletion" +i=1 +for ds in $datasets; do + log_must $ZFS destroy $ds/$TESTCLONE.$i + ((i=i+1)) +done +names=$($ZFS list -rt all -o name $TESTPOOL) +i=1 +log_must verify_clones 2 1 + +log_must local_cleanup +log_must setup_ds + +log_note "verify zfs deferred destroy on clones property" +i=1 +names=$($ZFS list -rt all -o name $TESTPOOL) +for ds in $datasets; do + log_must $ZFS destroy -d $ds@snap + deferred_snaps=( "${deferred_snaps[@]}" "$ds@snap" ) + ((i=i+1)) +done +log_must verify_clones 3 0 + +log_note "verify zfs deferred destroy by destroying clones on clones property" +d_clones=() +i=1 +for ds in $datasets; do + for fs in $datasets; do + log_must $ZFS destroy $fs/$TESTCLONE.$i + d_clones=( "${d_clones[@]}" "$fs/$TESTCLONE.$i" ) + done + ((i=i+1)) +done +names=$($ZFS list -rtall -o name $TESTPOOL) +for snap in ${deferred_snaps[@]}; do + status=$($ECHO "$names" | $GREP $snap) + [[ -z $status ]] || \ + log_fail "$snap exist after deferred destroy" +done +for dclone in ${d_clones[@]}; do + log_note "D CLONE = $dclone" + status=$($ECHO "$names" | $GREP $dclone) + [[ -z $status ]] || \ + log_fail "$dclone exist after deferred destroy" +done + +log_must local_cleanup +log_must setup_ds +log_note "verify clone property for zfs promote" +i=1 +for ds in $datasets; do + log_must $ZFS promote $ds/$TESTCLONE.$i + ((i=i+1)) +done +names=$($ZFS list -rt all -o name,clones $TESTPOOL) +log_must verify_clones 3 1 $TESTCLONE +i=1 +for ds in $datasets; do + log_must $ZFS promote $ds + ((i=i+1)) +done +log_must local_cleanup + +log_note "verify clone list truncated correctly" +typeset -i j=200 +i=1 +fs=$TESTPOOL/$TESTFS1 +log_must $ZFS create $fs +log_must $ZFS snapshot $fs@snap +while((i < 7)); do + log_must $ZFS clone $fs@snap $fs/$TESTCLONE$(python -c 'print "x" * 200').$i + ((i=i+1)) + ((j=j+200)) +done +clone_list=$($ZFS list -o clones $fs@snap) +char_count=$($ECHO "$clone_list" | $TAIL -1 | wc | $AWK '{print $3}') +[[ $char_count -eq 1024 ]] || \ + log_fail "Clone list not truncated correctly. Unexpected character count" \ + "$char_count" + +log_pass "'zfs list -o name,origin,clones prints the correct clone information."