1d583b39bSJohn Wren Kennedy#!/bin/ksh 2d583b39bSJohn Wren Kennedy# 3d583b39bSJohn Wren Kennedy# CDDL HEADER START 4d583b39bSJohn Wren Kennedy# 5d583b39bSJohn Wren Kennedy# This file and its contents are supplied under the terms of the 6d583b39bSJohn Wren Kennedy# Common Development and Distribution License ("CDDL"), version 1.0. 7d583b39bSJohn Wren Kennedy# You may only use this file in accordance with the terms of version 8d583b39bSJohn Wren Kennedy# 1.0 of the CDDL. 9d583b39bSJohn Wren Kennedy 10d583b39bSJohn Wren Kennedy# A full copy of the text of the CDDL should have accompanied this 11d583b39bSJohn Wren Kennedy# source. A copy of the CDDL is also available via the Internet at 12d583b39bSJohn Wren Kennedy# http://www.illumos.org/license/CDDL. 13d583b39bSJohn Wren Kennedy# 14d583b39bSJohn Wren Kennedy# CDDL HEADER END 15d583b39bSJohn Wren Kennedy# 16d583b39bSJohn Wren Kennedy 17d583b39bSJohn Wren Kennedy# 181d32ba66SJohn Wren Kennedy# Copyright (c) 2012, 2016 by Delphix. All rights reserved. 19d583b39bSJohn Wren Kennedy# 20d583b39bSJohn Wren Kennedy 21d583b39bSJohn Wren Kennedy. $STF_SUITE/include/libtest.shlib 22d583b39bSJohn Wren Kennedy 23d583b39bSJohn Wren Kennedy# 24d583b39bSJohn Wren Kennedy# DESCRIPTION: 25d583b39bSJohn Wren Kennedy# Verify 'zfs list -t all -o name,origin,clones' prints the correct 26d583b39bSJohn Wren Kennedy# clone information 27d583b39bSJohn Wren Kennedy# 28d583b39bSJohn Wren Kennedy# STRATEGY: 29d583b39bSJohn Wren Kennedy# 1. Create datasets 30d583b39bSJohn Wren Kennedy# 2. Create recursive snapshots and their clones 31d583b39bSJohn Wren Kennedy# 3. Verify zfs clones property displays right information for different 32d583b39bSJohn Wren Kennedy# cases 33d583b39bSJohn Wren Kennedy# 34d583b39bSJohn Wren Kennedy 35d583b39bSJohn Wren Kennedyverify_runnable "both" 36d583b39bSJohn Wren Kennedy 37d583b39bSJohn Wren Kennedyfunction local_cleanup 38d583b39bSJohn Wren Kennedy{ 39d583b39bSJohn Wren Kennedy typeset -i i=1 40d583b39bSJohn Wren Kennedy for ds in $datasets; do 41d583b39bSJohn Wren Kennedy datasetexists $ds/$TESTCLONE.$i && \ 421d32ba66SJohn Wren Kennedy log_must zfs destroy -rf $ds/$TESTCLONE.$i 431d32ba66SJohn Wren Kennedy datasetexists $ds && log_must zfs destroy -Rf $ds 44d583b39bSJohn Wren Kennedy ((i=i+1)) 45d583b39bSJohn Wren Kennedy done 46d583b39bSJohn Wren Kennedy} 47d583b39bSJohn Wren Kennedy 48d583b39bSJohn Wren Kennedy# Set up filesystem with clones 49d583b39bSJohn Wren Kennedyfunction setup_ds 50d583b39bSJohn Wren Kennedy{ 51d583b39bSJohn Wren Kennedy typeset -i i=1 52d583b39bSJohn Wren Kennedy # create nested datasets 531d32ba66SJohn Wren Kennedy log_must zfs create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3 54d583b39bSJohn Wren Kennedy 55d583b39bSJohn Wren Kennedy # verify dataset creation 56d583b39bSJohn Wren Kennedy for ds in $datasets; do 57d583b39bSJohn Wren Kennedy datasetexists $ds || log_fail "Create $ds dataset fail." 58d583b39bSJohn Wren Kennedy done 59d583b39bSJohn Wren Kennedy 60d583b39bSJohn Wren Kennedy # create recursive nested snapshot 611d32ba66SJohn Wren Kennedy log_must zfs snapshot -r $TESTPOOL/$TESTFS1@snap 62d583b39bSJohn Wren Kennedy for ds in $datasets; do 63d583b39bSJohn Wren Kennedy datasetexists $ds@snap || \ 64d583b39bSJohn Wren Kennedy log_fail "Create $ds@snap snapshot fail." 65d583b39bSJohn Wren Kennedy done 66d583b39bSJohn Wren Kennedy for ds in $datasets; do 67d583b39bSJohn Wren Kennedy for fs in $datasets; do 681d32ba66SJohn Wren Kennedy log_must zfs clone $ds@snap $fs/$TESTCLONE.$i 69d583b39bSJohn Wren Kennedy done 70d583b39bSJohn Wren Kennedy ((i=i+1)) 71d583b39bSJohn Wren Kennedy done 72d583b39bSJohn Wren Kennedy} 73d583b39bSJohn Wren Kennedy 74d583b39bSJohn Wren Kennedy# Verify clone list 75d583b39bSJohn Wren Kennedyfunction verify_clones 76d583b39bSJohn Wren Kennedy{ 77d583b39bSJohn Wren Kennedy typeset -i no_clones=$1 78d583b39bSJohn Wren Kennedy typeset unexpected=$2 79d583b39bSJohn Wren Kennedy typeset clone_snap=$3 80d583b39bSJohn Wren Kennedy typeset -i i=1 81d583b39bSJohn Wren Kennedy for ds in $datasets; do 82d583b39bSJohn Wren Kennedy if [[ -n $clone_snap ]]; then 83d583b39bSJohn Wren Kennedy clone_snap=/$TESTCLONE.$i 84d583b39bSJohn Wren Kennedy fi 851d32ba66SJohn Wren Kennedy snapshot=$(echo "$names" | grep $ds$clone_snap@snap) 861d32ba66SJohn Wren Kennedy actual_clone=$(zfs list -t all -o clones $snapshot | tail -1) 87d583b39bSJohn Wren Kennedy save=$IFS 88d583b39bSJohn Wren Kennedy IFS=',' 89d583b39bSJohn Wren Kennedy typeset -a clones=() 90d583b39bSJohn Wren Kennedy for token in $actual_clone; do 91d583b39bSJohn Wren Kennedy clones=( "${clones[@]}" "$token" ) 92d583b39bSJohn Wren Kennedy done 93d583b39bSJohn Wren Kennedy IFS=$save 94d583b39bSJohn Wren Kennedy [[ ${#clones[*]} -ne $no_clones ]] && \ 95d583b39bSJohn Wren Kennedy log_fail "$snapshot has unexpected number of clones" \ 96d583b39bSJohn Wren Kennedy " ${#clones[*]}" 97d583b39bSJohn Wren Kennedy expected_clone="" 98d583b39bSJohn Wren Kennedy unexpected_clone="" 99d583b39bSJohn Wren Kennedy if [[ $unexpected -eq 1 ]]; then 100d583b39bSJohn Wren Kennedy for fs in $datasets; do 101d583b39bSJohn Wren Kennedy if [[ $fs == $ds ]]; then 102d583b39bSJohn Wren Kennedy if [[ -z $clone_snap ]]; then 103d583b39bSJohn Wren Kennedy unexpected_clone=$fs/$TESTCLONE.$i 104d583b39bSJohn Wren Kennedy (for match in ${clones[@]};do 105d583b39bSJohn Wren Kennedy [[ $match != $unexpected_clone ]] && \ 106d583b39bSJohn Wren Kennedy exit 0; done) || log_fail \ 107d583b39bSJohn Wren Kennedy "Unexpected clones of the snapshot" 108d583b39bSJohn Wren Kennedy else 109d583b39bSJohn Wren Kennedy expected_clone=$fs 110d583b39bSJohn Wren Kennedy unexpected_clone=$fs/$TESTCLONE.$i 111d583b39bSJohn Wren Kennedy (for match in ${clones[@]};do 112d583b39bSJohn Wren Kennedy [[ $match == $expected_clone ]] && \ 113d583b39bSJohn Wren Kennedy [[ $match != $unexpected_clone ]] \ 114d583b39bSJohn Wren Kennedy && exit 0; done) || log_fail \ 115d583b39bSJohn Wren Kennedy "Unexpected clones of the snapshot" 116d583b39bSJohn Wren Kennedy fi 117d583b39bSJohn Wren Kennedy else 118d583b39bSJohn Wren Kennedy expected_clone=$fs/$TESTCLONE.$i 119d583b39bSJohn Wren Kennedy (for match in ${clones[@]};do 120d583b39bSJohn Wren Kennedy [[ $match == $expected_clone ]] && \ 121d583b39bSJohn Wren Kennedy exit 0; done) || log_fail \ 122d583b39bSJohn Wren Kennedy "Unexpected clones of the snapshot" 123d583b39bSJohn Wren Kennedy fi 124d583b39bSJohn Wren Kennedy done 125d583b39bSJohn Wren Kennedy else 126d583b39bSJohn Wren Kennedy for fs in $datasets; do 127d583b39bSJohn Wren Kennedy expected_clone=$fs/$TESTCLONE.$i 128d583b39bSJohn Wren Kennedy (for match in ${clones[@]};do 129d583b39bSJohn Wren Kennedy [[ $match == $expected_clone ]] && exit 0; \ 130d583b39bSJohn Wren Kennedy done) || log_fail "Unexpected clones" \ 131d583b39bSJohn Wren Kennedy " of the snapshot" 132d583b39bSJohn Wren Kennedy done 133d583b39bSJohn Wren Kennedy fi 134d583b39bSJohn Wren Kennedy ((i=i+1)) 135d583b39bSJohn Wren Kennedy done 136d583b39bSJohn Wren Kennedy} 137d583b39bSJohn Wren Kennedy 138d583b39bSJohn Wren Kennedy 139d583b39bSJohn Wren Kennedylog_onexit local_cleanup 140d583b39bSJohn Wren Kennedydatasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 141d583b39bSJohn Wren Kennedy $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3" 142d583b39bSJohn Wren Kennedy 143d583b39bSJohn Wren Kennedytypeset -a d_clones 144d583b39bSJohn Wren Kennedytypeset -a deferred_snaps 145d583b39bSJohn Wren Kennedytypeset -i i 146d583b39bSJohn Wren Kennedyi=1 147d583b39bSJohn Wren Kennedylog_must setup_ds 148d583b39bSJohn Wren Kennedy 149d583b39bSJohn Wren Kennedylog_note "Verify zfs clone propery for multiple clones" 1501d32ba66SJohn Wren Kennedynames=$(zfs list -rt all -o name $TESTPOOL) 151d583b39bSJohn Wren Kennedylog_must verify_clones 3 0 152d583b39bSJohn Wren Kennedy 153d583b39bSJohn Wren Kennedylog_note "verfify clone property for clone deletion" 154d583b39bSJohn Wren Kennedyi=1 155d583b39bSJohn Wren Kennedyfor ds in $datasets; do 1561d32ba66SJohn Wren Kennedy log_must zfs destroy $ds/$TESTCLONE.$i 157d583b39bSJohn Wren Kennedy ((i=i+1)) 158d583b39bSJohn Wren Kennedydone 1591d32ba66SJohn Wren Kennedynames=$(zfs list -rt all -o name $TESTPOOL) 160d583b39bSJohn Wren Kennedyi=1 161d583b39bSJohn Wren Kennedylog_must verify_clones 2 1 162d583b39bSJohn Wren Kennedy 163d583b39bSJohn Wren Kennedylog_must local_cleanup 164d583b39bSJohn Wren Kennedylog_must setup_ds 165d583b39bSJohn Wren Kennedy 166d583b39bSJohn Wren Kennedylog_note "verify zfs deferred destroy on clones property" 167d583b39bSJohn Wren Kennedyi=1 1681d32ba66SJohn Wren Kennedynames=$(zfs list -rt all -o name $TESTPOOL) 169d583b39bSJohn Wren Kennedyfor ds in $datasets; do 1701d32ba66SJohn Wren Kennedy log_must zfs destroy -d $ds@snap 171d583b39bSJohn Wren Kennedy deferred_snaps=( "${deferred_snaps[@]}" "$ds@snap" ) 172d583b39bSJohn Wren Kennedy ((i=i+1)) 173d583b39bSJohn Wren Kennedydone 174d583b39bSJohn Wren Kennedylog_must verify_clones 3 0 175d583b39bSJohn Wren Kennedy 176d583b39bSJohn Wren Kennedylog_note "verify zfs deferred destroy by destroying clones on clones property" 177d583b39bSJohn Wren Kennedyd_clones=() 178d583b39bSJohn Wren Kennedyi=1 179d583b39bSJohn Wren Kennedyfor ds in $datasets; do 180d583b39bSJohn Wren Kennedy for fs in $datasets; do 1811d32ba66SJohn Wren Kennedy log_must zfs destroy $fs/$TESTCLONE.$i 182d583b39bSJohn Wren Kennedy d_clones=( "${d_clones[@]}" "$fs/$TESTCLONE.$i" ) 183d583b39bSJohn Wren Kennedy done 184d583b39bSJohn Wren Kennedy ((i=i+1)) 185d583b39bSJohn Wren Kennedydone 1861d32ba66SJohn Wren Kennedynames=$(zfs list -rtall -o name $TESTPOOL) 187d583b39bSJohn Wren Kennedyfor snap in ${deferred_snaps[@]}; do 1881d32ba66SJohn Wren Kennedy status=$(echo "$names" | grep $snap) 189d583b39bSJohn Wren Kennedy [[ -z $status ]] || \ 190d583b39bSJohn Wren Kennedy log_fail "$snap exist after deferred destroy" 191d583b39bSJohn Wren Kennedydone 192d583b39bSJohn Wren Kennedyfor dclone in ${d_clones[@]}; do 193d583b39bSJohn Wren Kennedy log_note "D CLONE = $dclone" 1941d32ba66SJohn Wren Kennedy status=$(echo "$names" | grep $dclone) 195d583b39bSJohn Wren Kennedy [[ -z $status ]] || \ 196d583b39bSJohn Wren Kennedy log_fail "$dclone exist after deferred destroy" 197d583b39bSJohn Wren Kennedydone 198d583b39bSJohn Wren Kennedy 199d583b39bSJohn Wren Kennedylog_must local_cleanup 200d583b39bSJohn Wren Kennedylog_must setup_ds 201d583b39bSJohn Wren Kennedylog_note "verify clone property for zfs promote" 202d583b39bSJohn Wren Kennedyi=1 203d583b39bSJohn Wren Kennedyfor ds in $datasets; do 2041d32ba66SJohn Wren Kennedy log_must zfs promote $ds/$TESTCLONE.$i 205d583b39bSJohn Wren Kennedy ((i=i+1)) 206d583b39bSJohn Wren Kennedydone 2071d32ba66SJohn Wren Kennedynames=$(zfs list -rt all -o name,clones $TESTPOOL) 208d583b39bSJohn Wren Kennedylog_must verify_clones 3 1 $TESTCLONE 209d583b39bSJohn Wren Kennedyi=1 210d583b39bSJohn Wren Kennedyfor ds in $datasets; do 2111d32ba66SJohn Wren Kennedy log_must zfs promote $ds 212d583b39bSJohn Wren Kennedy ((i=i+1)) 213d583b39bSJohn Wren Kennedydone 214d583b39bSJohn Wren Kennedylog_must local_cleanup 215d583b39bSJohn Wren Kennedy 216d583b39bSJohn Wren Kennedylog_note "verify clone list truncated correctly" 217d583b39bSJohn Wren Kennedytypeset -i j=200 218d583b39bSJohn Wren Kennedyi=1 219d583b39bSJohn Wren Kennedyfs=$TESTPOOL/$TESTFS1 2201d32ba66SJohn Wren Kennedylog_must zfs create $fs 2211d32ba66SJohn Wren Kennedylog_must zfs snapshot $fs@snap 222d583b39bSJohn Wren Kennedywhile((i < 7)); do 223*4e320a8aSToomas Soome log_must zfs clone $fs@snap $fs/$TESTCLONE$(printf %0.sx {1..200}).$i 224d583b39bSJohn Wren Kennedy ((i=i+1)) 225d583b39bSJohn Wren Kennedy ((j=j+200)) 226d583b39bSJohn Wren Kennedydone 2271d32ba66SJohn Wren Kennedyclone_list=$(zfs list -o clones $fs@snap) 2281d32ba66SJohn Wren Kennedychar_count=$(echo "$clone_list" | tail -1 | wc | awk '{print $3}') 229d583b39bSJohn Wren Kennedy[[ $char_count -eq 1024 ]] || \ 230d583b39bSJohn Wren Kennedy log_fail "Clone list not truncated correctly. Unexpected character count" \ 231d583b39bSJohn Wren Kennedy "$char_count" 232d583b39bSJohn Wren Kennedy 233d583b39bSJohn Wren Kennedylog_pass "'zfs list -o name,origin,clones prints the correct clone information." 234