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