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 && destroy_dataset $dataset -Rf
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		acltype		nfsv4
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	compression	gzip		compression	gzip-$((RANDOM%9 + 1))
88	compression     zstd		compression	zstd-$((RANDOM%9 + 1))
89	compression	zstd-fast	copies          $((RANDOM%3 + 1))
90	compression	zstd-fast-$((RANDOM%9 + 1))	xattr	sa
91	xattr		on		xattr		off
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))	acltype	off
119	acltype		posix		acltype		nfsv4
120)
121else
122#	property	value		property	value
123#
124props=(
125	quota		64M		recordsize	512
126	reservation	32M		reservation	none
127	mountpoint	/history.$$	mountpoint	legacy
128	mountpoint	none		sharenfs	on
129	sharenfs	off
130	compression	on		compression	off
131	compression	lzjb		aclmode		discard
132	aclmode		groupmask	aclmode		passthrough
133	atime		on		atime		off
134	devices		on		devices		off
135	exec		on		exec		off
136	setuid		on		setuid		off
137	readonly	on		readonly	off
138	zoned		on		zoned		off
139	snapdir		hidden		snapdir		visible
140	aclinherit	discard		aclinherit	noallow
141	aclinherit	secure		aclinherit	passthrough
142	canmount	off		canmount	on
143	xattr		on		xattr		off
144	compression	gzip		compression	gzip-$((RANDOM%9 + 1))
145	copies		$((RANDOM%3 + 1))
146)
147fi
148
149run_and_verify "zfs create $fs"
150# Set all the property for filesystem
151typeset -i i=0
152while ((i < ${#props[@]})) ; do
153	run_and_verify "zfs set ${props[$i]}=${props[((i+1))]} $fs"
154
155	# quota, reservation, canmount can not be inherited.
156	#
157	if [[ ${props[$i]} != "quota" && ${props[$i]} != "reservation" && \
158	    ${props[$i]} != "canmount" ]];
159	then
160		run_and_verify "zfs inherit ${props[$i]} $fs"
161	fi
162
163	((i += 2))
164done
165
166run_and_verify "zfs create -V 64M $vol"
167run_and_verify "zfs set volsize=32M $vol"
168run_and_verify "zfs snapshot $fssnap"
169run_and_verify "zfs hold tag $fssnap"
170run_and_verify "zfs release tag $fssnap"
171run_and_verify "zfs snapshot $volsnap"
172run_and_verify "zfs snapshot $fssnap2"
173run_and_verify "zfs snapshot $volsnap2"
174
175# Send isn't logged...
176log_must eval "zfs send -i $fssnap $fssnap2 > $tmpfile"
177log_must eval "zfs send -i $volsnap $volsnap2 > $tmpfile2"
178# Verify that's true
179zpool history $TESTPOOL | grep 'zfs send' >/dev/null 2>&1 && \
180    log_fail "'zfs send' found in history of \"$TESTPOOL\""
181
182run_and_verify "zfs destroy $fssnap2"
183run_and_verify "zfs destroy $volsnap2"
184run_and_verify "zfs receive $fs < $tmpfile"
185run_and_verify "zfs receive $vol < $tmpfile2"
186run_and_verify "zfs rollback -r $fssnap"
187run_and_verify "zfs rollback -r $volsnap"
188run_and_verify "zfs clone $fssnap $fsclone"
189run_and_verify "zfs clone $volsnap $volclone"
190run_and_verify "zfs rename $fs $newfs"
191run_and_verify "zfs rename $vol $newvol"
192run_and_verify "zfs promote $fsclone"
193run_and_verify "zfs promote $volclone"
194run_and_verify "zfs destroy $newfs"
195run_and_verify "zfs destroy $newvol"
196run_and_verify "zfs destroy -rf $fsclone"
197run_and_verify "zfs destroy -rf $volclone"
198
199log_pass "zfs sub-commands which modify state are logged passed."
200