1#!/bin/ksh -p
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23#
24# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25# Use is subject to license terms.
26
27#
28# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
29#
30
31. $STF_SUITE/tests/functional/history/history_common.kshlib
32
33#
34# DESCRIPTION:
35#	Create a  scenario to verify the following zfs subcommands are logged.
36#	create, destroy, clone, rename, snapshot, rollback, set, inherit,
37#	receive, promote, hold and release.
38#
39# STRATEGY:
40#	1. Verify that all the zfs commands listed (barring send) produce an
41#	   entry in the pool history.
42#
43
44verify_runnable "global"
45
46function cleanup
47{
48
49	[[ -f $tmpfile ]] && rm -f $tmpfile
50	[[ -f $tmpfile2 ]] && rm -f $tmpfile2
51	for dataset in $fs $newfs $fsclone $vol $newvol $volclone; do
52		datasetexists $dataset && zfs destroy -Rf $dataset
53	done
54	rm -rf /history.$$
55}
56
57log_assert "Verify zfs sub-commands which modify state are logged."
58log_onexit cleanup
59
60fs=$TESTPOOL/$TESTFS1; newfs=$TESTPOOL/newfs; fsclone=$TESTPOOL/clone
61vol=$TESTPOOL/$TESTVOL ; newvol=$TESTPOOL/newvol; volclone=$TESTPOOL/volclone
62fssnap=$fs@fssnap; fssnap2=$fs@fssnap2
63volsnap=$vol@volsnap; volsnap2=$vol@volsnap2
64tmpfile=$TEST_BASE_DIR/tmpfile.$$ ; tmpfile2=$TEST_BASE_DIR/tmpfile2.$$
65
66if is_linux; then
67#	property	value		property	value
68#
69props=(
70	quota		64M		recordsize	512
71	reservation	32M		reservation	none
72	mountpoint	/history.$$	mountpoint	legacy
73	mountpoint	none		compression	lz4
74	compression	on		compression	off
75	compression	lzjb		acltype		off
76	acltype		posix		xattr		sa
77	atime		on		atime		off
78	devices		on		devices		off
79	exec		on		exec		off
80	setuid		on		setuid		off
81	readonly	on		readonly	off
82	zoned		on		zoned		off
83	snapdir		hidden		snapdir		visible
84	aclinherit	discard		aclinherit	noallow
85	aclinherit	secure		aclinherit	passthrough
86	canmount	off		canmount	on
87	xattr		on		xattr		off
88	compression	gzip		compression	gzip-$((RANDOM%9 + 1))
89	compression     zstd		compression	zstd-$((RANDOM%9 + 1))
90	compression	zstd-fast	copies          $((RANDOM%3 + 1))
91	compression	zstd-fast-$((RANDOM%9 + 1))
92)
93elif is_freebsd; then
94#	property	value		property	value
95#
96props=(
97	quota		64M		recordsize	512
98	reservation	32M		reservation	none
99	mountpoint	/history.$$	mountpoint	legacy
100	mountpoint	none		sharenfs	on
101	sharenfs	off
102	compression	on		compression	off
103	compression	lzjb		aclmode		discard
104	aclmode		groupmask	aclmode		passthrough
105	atime		on		atime		off
106	devices		on		devices		off
107	exec		on		exec		off
108	setuid		on		setuid		off
109	readonly	on		readonly	off
110	jailed		on		jailed		off
111	snapdir		hidden		snapdir		visible
112	aclinherit	discard		aclinherit	noallow
113	aclinherit	secure		aclinherit	passthrough
114	canmount	off		canmount	on
115	compression	gzip		compression	gzip-$((RANDOM%9 + 1))
116	compression     zstd		compression	zstd-$((RANDOM%9 + 1))
117	compression	zstd-fast	copies          $((RANDOM%3 + 1))
118	compression	zstd-fast-$((RANDOM%9 + 1))
119)
120else
121#	property	value		property	value
122#
123props=(
124	quota		64M		recordsize	512
125	reservation	32M		reservation	none
126	mountpoint	/history.$$	mountpoint	legacy
127	mountpoint	none		sharenfs	on
128	sharenfs	off
129	compression	on		compression	off
130	compression	lzjb		aclmode		discard
131	aclmode		groupmask	aclmode		passthrough
132	atime		on		atime		off
133	devices		on		devices		off
134	exec		on		exec		off
135	setuid		on		setuid		off
136	readonly	on		readonly	off
137	zoned		on		zoned		off
138	snapdir		hidden		snapdir		visible
139	aclinherit	discard		aclinherit	noallow
140	aclinherit	secure		aclinherit	passthrough
141	canmount	off		canmount	on
142	xattr		on		xattr		off
143	compression	gzip		compression	gzip-$((RANDOM%9 + 1))
144	copies		$((RANDOM%3 + 1))
145)
146fi
147
148run_and_verify "zfs create $fs"
149# Set all the property for filesystem
150typeset -i i=0
151while ((i < ${#props[@]})) ; do
152	run_and_verify "zfs set ${props[$i]}=${props[((i+1))]} $fs"
153
154	# quota, reservation, canmount can not be inherited.
155	#
156	if [[ ${props[$i]} != "quota" && ${props[$i]} != "reservation" && \
157	    ${props[$i]} != "canmount" ]];
158	then
159		run_and_verify "zfs inherit ${props[$i]} $fs"
160	fi
161
162	((i += 2))
163done
164
165run_and_verify "zfs create -V 64M $vol"
166run_and_verify "zfs set volsize=32M $vol"
167run_and_verify "zfs snapshot $fssnap"
168run_and_verify "zfs hold tag $fssnap"
169run_and_verify "zfs release tag $fssnap"
170run_and_verify "zfs snapshot $volsnap"
171run_and_verify "zfs snapshot $fssnap2"
172run_and_verify "zfs snapshot $volsnap2"
173
174# Send isn't logged...
175log_must eval "zfs send -i $fssnap $fssnap2 > $tmpfile"
176log_must eval "zfs send -i $volsnap $volsnap2 > $tmpfile2"
177# Verify that's true
178zpool history $TESTPOOL | grep 'zfs send' >/dev/null 2>&1 && \
179    log_fail "'zfs send' found in history of \"$TESTPOOL\""
180
181run_and_verify "zfs destroy $fssnap2"
182run_and_verify "zfs destroy $volsnap2"
183run_and_verify "zfs receive $fs < $tmpfile"
184run_and_verify "zfs receive $vol < $tmpfile2"
185run_and_verify "zfs rollback -r $fssnap"
186run_and_verify "zfs rollback -r $volsnap"
187run_and_verify "zfs clone $fssnap $fsclone"
188run_and_verify "zfs clone $volsnap $volclone"
189run_and_verify "zfs rename $fs $newfs"
190run_and_verify "zfs rename $vol $newvol"
191run_and_verify "zfs promote $fsclone"
192run_and_verify "zfs promote $volclone"
193run_and_verify "zfs destroy $newfs"
194run_and_verify "zfs destroy $newvol"
195run_and_verify "zfs destroy -rf $fsclone"
196run_and_verify "zfs destroy -rf $volclone"
197
198log_pass "zfs sub-commands which modify state are logged passed."
199