xref: /freebsd/sbin/bectl/tests/bectl_test.sh (revision 54d2737e7fe48226c908dcccfbda2ca1c08e07fc)
19c1535e9SKyle Evans#
29c1535e9SKyle Evans# Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
39c1535e9SKyle Evans#
4*54d2737eSAlexander Ziaee# SPDX-License-Identifier: BSD-2-Clause
59c1535e9SKyle Evans#
69c1535e9SKyle Evans
7794022b0SEnji CooperZPOOL_NAME_FILE=zpool_name
8794022b0SEnji Cooperget_zpool_name()
9794022b0SEnji Cooper{
10794022b0SEnji Cooper	cat $ZPOOL_NAME_FILE
11794022b0SEnji Cooper}
12794022b0SEnji Coopermake_zpool_name()
13794022b0SEnji Cooper{
14794022b0SEnji Cooper	mktemp -u bectl_test_XXXXXX > $ZPOOL_NAME_FILE
15794022b0SEnji Cooper	get_zpool_name
16794022b0SEnji Cooper}
17794022b0SEnji Cooper
189c1535e9SKyle Evans# Establishes a bectl_create zpool that can be used for some light testing; contains
199c1535e9SKyle Evans# a 'default' BE and not much else.
209c1535e9SKyle Evansbectl_create_setup()
219c1535e9SKyle Evans{
229c1535e9SKyle Evans	zpool=$1
239c1535e9SKyle Evans	disk=$2
249c1535e9SKyle Evans	mnt=$3
259c1535e9SKyle Evans
26794022b0SEnji Cooper	# Sanity check to make sure `make_zpool_name` succeeded
27794022b0SEnji Cooper	atf_check test -n "$zpool"
28794022b0SEnji Cooper
296fc21012SKyle Evans	kldload -n -q zfs || atf_skip "ZFS module not loaded on the current system"
30d6f4e1a8SAlex Richardson	if ! getconf MIN_HOLE_SIZE "$(pwd)"; then
31d6f4e1a8SAlex Richardson		echo "getconf MIN_HOLE_SIZE $(pwd) failed; sparse files " \
32d6f4e1a8SAlex Richardson		    "probably not supported by file system"
33d6f4e1a8SAlex Richardson		mount
34d6f4e1a8SAlex Richardson		atf_skip "Test's work directory does not support sparse files;" \
35d6f4e1a8SAlex Richardson		    "try with a different TMPDIR?"
36d6f4e1a8SAlex Richardson	fi
379c1535e9SKyle Evans	atf_check mkdir -p ${mnt}
389c1535e9SKyle Evans	atf_check truncate -s 1G ${disk}
39de661c9fSKyle Evans	atf_check zpool create -R ${mnt} ${zpool} ${disk}
409c1535e9SKyle Evans	atf_check zfs create -o mountpoint=none ${zpool}/ROOT
419c1535e9SKyle Evans	atf_check zfs create -o mountpoint=/ -o canmount=noauto \
429c1535e9SKyle Evans	    ${zpool}/ROOT/default
439c1535e9SKyle Evans}
440a603a6eSKyle Evansbectl_create_deep_setup()
450a603a6eSKyle Evans{
460a603a6eSKyle Evans	zpool=$1
470a603a6eSKyle Evans	disk=$2
480a603a6eSKyle Evans	mnt=$3
490a603a6eSKyle Evans
50794022b0SEnji Cooper	# Sanity check to make sure `make_zpool_name` succeeded
51794022b0SEnji Cooper	atf_check test -n "$zpool"
52794022b0SEnji Cooper
530a603a6eSKyle Evans	bectl_create_setup ${zpool} ${disk} ${mnt}
540a603a6eSKyle Evans	atf_check mkdir -p ${root}
550a603a6eSKyle Evans	atf_check -o ignore bectl -r ${zpool}/ROOT mount default ${root}
560a603a6eSKyle Evans	atf_check mkdir -p ${root}/usr
570a603a6eSKyle Evans	atf_check zfs create -o mountpoint=/usr -o canmount=noauto \
580a603a6eSKyle Evans	    ${zpool}/ROOT/default/usr
590a603a6eSKyle Evans	atf_check -o ignore bectl -r ${zpool}/ROOT umount default
600a603a6eSKyle Evans}
619c1535e9SKyle Evans
629c1535e9SKyle Evansbectl_cleanup()
639c1535e9SKyle Evans{
649c1535e9SKyle Evans	zpool=$1
65794022b0SEnji Cooper	if [ -z "$zpool" ]; then
66794022b0SEnji Cooper		echo "Skipping cleanup; zpool not set up"
67794022b0SEnji Cooper	elif zpool get health ${zpool} >/dev/null 2>&1; then
68bf05ccc3SKyle Evans		zpool destroy -f ${zpool}
699c1535e9SKyle Evans	fi
709c1535e9SKyle Evans}
719c1535e9SKyle Evans
729c1535e9SKyle Evansatf_test_case bectl_create cleanup
739c1535e9SKyle Evansbectl_create_head()
749c1535e9SKyle Evans{
759c1535e9SKyle Evans	atf_set "descr" "Check the various forms of bectl create"
769c1535e9SKyle Evans	atf_set "require.user" root
779c1535e9SKyle Evans}
789c1535e9SKyle Evansbectl_create_body()
799c1535e9SKyle Evans{
800932ee9fSLi-Wen Hsu	if [ "$(atf_config_get ci false)" = "true" ] && \
810932ee9fSLi-Wen Hsu		[ "$(uname -p)" = "i386" ]; then
820932ee9fSLi-Wen Hsu		atf_skip "https://bugs.freebsd.org/249055"
830932ee9fSLi-Wen Hsu	fi
840932ee9fSLi-Wen Hsu
852ccf8a82SEdward Tomasz Napierala	if [ "$(atf_config_get ci false)" = "true" ] && \
862ccf8a82SEdward Tomasz Napierala		[ "$(uname -p)" = "armv7" ]; then
872ccf8a82SEdward Tomasz Napierala		atf_skip "https://bugs.freebsd.org/249229"
882ccf8a82SEdward Tomasz Napierala	fi
892ccf8a82SEdward Tomasz Napierala
909c1535e9SKyle Evans	cwd=$(realpath .)
91794022b0SEnji Cooper	zpool=$(make_zpool_name)
929c1535e9SKyle Evans	disk=${cwd}/disk.img
939c1535e9SKyle Evans	mount=${cwd}/mnt
949c1535e9SKyle Evans
959c1535e9SKyle Evans	bectl_create_setup ${zpool} ${disk} ${mount}
96d05fa0d9SKyle Evans
97d05fa0d9SKyle Evans	# Create a child dataset that will be used to test creation
98d05fa0d9SKyle Evans	# of recursive and non-recursive boot environments.
99d05fa0d9SKyle Evans	atf_check zfs create -o mountpoint=/usr -o canmount=noauto \
100d05fa0d9SKyle Evans	    ${zpool}/ROOT/default/usr
101d05fa0d9SKyle Evans
1020e6549c8SRobert Wing	# BE datasets with spaces are not bootable, PR 254441.
1030e6549c8SRobert Wing	atf_check -e not-empty -s not-exit:0 \
1040e6549c8SRobert Wing		bectl -r ${zpool}/ROOT create "foo bar"
1050e6549c8SRobert Wing
1069c1535e9SKyle Evans	# Test standard creation, creation of a snapshot, and creation from a
1079c1535e9SKyle Evans	# snapshot.
1089c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default default2
1099c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT create default2@test_snap
1109c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default2@test_snap default3
111d05fa0d9SKyle Evans
112d05fa0d9SKyle Evans	# Test standard creation, creation of a snapshot, and creation from a
113d05fa0d9SKyle Evans	# snapshot for recursive boot environments.
114d05fa0d9SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -r -e default recursive
115d05fa0d9SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -r recursive@test_snap
116d05fa0d9SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -r -e recursive@test_snap recursive-snap
117d05fa0d9SKyle Evans
118d05fa0d9SKyle Evans	# Test that non-recursive boot environments have no child datasets.
119d05fa0d9SKyle Evans	atf_check -e not-empty -s not-exit:0 \
120d05fa0d9SKyle Evans		zfs list "${zpool}/ROOT/default2/usr"
121d05fa0d9SKyle Evans	atf_check -e not-empty -s not-exit:0 \
122d05fa0d9SKyle Evans		zfs list "${zpool}/ROOT/default3/usr"
123d05fa0d9SKyle Evans
124d05fa0d9SKyle Evans	# Test that recursive boot environments have child datasets.
125d05fa0d9SKyle Evans	atf_check -o not-empty \
126d05fa0d9SKyle Evans		zfs list "${zpool}/ROOT/recursive/usr"
127d05fa0d9SKyle Evans	atf_check -o not-empty \
128d05fa0d9SKyle Evans		zfs list "${zpool}/ROOT/recursive-snap/usr"
1299c1535e9SKyle Evans}
1309c1535e9SKyle Evansbectl_create_cleanup()
1319c1535e9SKyle Evans{
132794022b0SEnji Cooper	bectl_cleanup $(get_zpool_name)
1339c1535e9SKyle Evans}
1349c1535e9SKyle Evans
1359c1535e9SKyle Evansatf_test_case bectl_destroy cleanup
1369c1535e9SKyle Evansbectl_destroy_head()
1379c1535e9SKyle Evans{
1389c1535e9SKyle Evans	atf_set "descr" "Check bectl destroy"
1399c1535e9SKyle Evans	atf_set "require.user" root
1409c1535e9SKyle Evans}
1419c1535e9SKyle Evansbectl_destroy_body()
1429c1535e9SKyle Evans{
1437c570021SLi-Wen Hsu	if [ "$(atf_config_get ci false)" = "true" ] && \
1447c570021SLi-Wen Hsu		[ "$(uname -p)" = "i386" ]; then
1457c570021SLi-Wen Hsu		atf_skip "https://bugs.freebsd.org/249055"
1467c570021SLi-Wen Hsu	fi
1477c570021SLi-Wen Hsu
1482ccf8a82SEdward Tomasz Napierala	if [ "$(atf_config_get ci false)" = "true" ] && \
1492ccf8a82SEdward Tomasz Napierala		[ "$(uname -p)" = "armv7" ]; then
1502ccf8a82SEdward Tomasz Napierala		atf_skip "https://bugs.freebsd.org/249229"
1512ccf8a82SEdward Tomasz Napierala	fi
1522ccf8a82SEdward Tomasz Napierala
1539c1535e9SKyle Evans	cwd=$(realpath .)
154794022b0SEnji Cooper	zpool=$(make_zpool_name)
1559c1535e9SKyle Evans	disk=${cwd}/disk.img
1569c1535e9SKyle Evans	mount=${cwd}/mnt
157e1ee6230SKyle Evans	root=${mount}/root
1589c1535e9SKyle Evans
1599c1535e9SKyle Evans	bectl_create_setup ${zpool} ${disk} ${mount}
1609c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default default2
1619c1535e9SKyle Evans	atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
1626286a643SKyle Evans	atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
1639c1535e9SKyle Evans	atf_check -e not-empty -s not-exit:0 zfs get mountpoint ${zpool}/ROOT/default2
164e1ee6230SKyle Evans
165e1ee6230SKyle Evans	# Test origin snapshot deletion when the snapshot to be destroyed
166e1ee6230SKyle Evans	# belongs to a mounted dataset, see PR 236043.
167e1ee6230SKyle Evans	atf_check mkdir -p ${root}
168e1ee6230SKyle Evans	atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
169e1ee6230SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default default3
170e1ee6230SKyle Evans	atf_check bectl -r ${zpool}/ROOT destroy -o default3
171e1ee6230SKyle Evans	atf_check bectl -r ${zpool}/ROOT unmount default
1728f5c6c31SKyle Evans
1738f5c6c31SKyle Evans	# create two be from the same parent and destroy the parent
1748f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default default2
1758f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default default3
1768f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT destroy default
1778f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT destroy default2
1788f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT rename default3 default
1798f5c6c31SKyle Evans
1808f5c6c31SKyle Evans	# Create a BE, have it be the parent for another and repeat, then start
1818f5c6c31SKyle Evans	# deleting environments.  Arbitrarily chose default3 as the first.
1828f5c6c31SKyle Evans	# Sleeps are required to prevent conflicting snapshots- libbe will
1838f5c6c31SKyle Evans	# use the time with a serial at the end as needed to prevent collisions,
1848f5c6c31SKyle Evans	# but as BEs get promoted the snapshot names will convert and conflict
1858f5c6c31SKyle Evans	# anyways.  libbe should perhaps consider adding something extra to the
1868f5c6c31SKyle Evans	# default name to prevent collisions like this, but the default name
1878f5c6c31SKyle Evans	# includes down to the second and creating BEs this rapidly is perhaps
1888f5c6c31SKyle Evans	# uncommon enough.
1898f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default default2
1908f5c6c31SKyle Evans	sleep 1
1918f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default2 default3
1928f5c6c31SKyle Evans	sleep 1
1938f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default3 default4
1948f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT destroy default3
1958f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT destroy default2
1968f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT destroy default4
1978f5c6c31SKyle Evans
1988f5c6c31SKyle Evans	# Create two BEs, then create an unrelated snapshot on the originating
1998f5c6c31SKyle Evans	# BE and destroy it.  We shouldn't have promoted the second BE, and it's
2008f5c6c31SKyle Evans	# only possible to tell if we promoted it by making sure we didn't
2018f5c6c31SKyle Evans	# demote the first BE at some point -- if we did, it's origin will no
2028f5c6c31SKyle Evans	# longer be empty.
2038f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default default2
2048f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT create default@test
2058f5c6c31SKyle Evans
2068f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT destroy default@test
2078f5c6c31SKyle Evans	atf_check -o inline:"-\n" zfs get -Ho value origin ${zpool}/ROOT/default
2088f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT destroy default2
2098f5c6c31SKyle Evans
2108f5c6c31SKyle Evans	# As observed by beadm, if we explicitly try to destroy a snapshot that
2118f5c6c31SKyle Evans	# leads to clones, we shouldn't have allowed it.
2128f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT create default@test
2138f5c6c31SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default@test default2
2148f5c6c31SKyle Evans
2158f5c6c31SKyle Evans	atf_check -e  not-empty -s not-exit:0 bectl -r ${zpool}/ROOT destroy \
2168f5c6c31SKyle Evans	    default@test
2179c1535e9SKyle Evans}
2189c1535e9SKyle Evansbectl_destroy_cleanup()
2199c1535e9SKyle Evans{
220794022b0SEnji Cooper	bectl_cleanup $(get_zpool_name)
2219c1535e9SKyle Evans}
2229c1535e9SKyle Evans
2239c1535e9SKyle Evansatf_test_case bectl_export_import cleanup
2249c1535e9SKyle Evansbectl_export_import_head()
2259c1535e9SKyle Evans{
2269c1535e9SKyle Evans	atf_set "descr" "Check bectl export and import"
2279c1535e9SKyle Evans	atf_set "require.user" root
2289c1535e9SKyle Evans}
2299c1535e9SKyle Evansbectl_export_import_body()
2309c1535e9SKyle Evans{
2317c570021SLi-Wen Hsu	if [ "$(atf_config_get ci false)" = "true" ] && \
2327c570021SLi-Wen Hsu		[ "$(uname -p)" = "i386" ]; then
2337c570021SLi-Wen Hsu		atf_skip "https://bugs.freebsd.org/249055"
2347c570021SLi-Wen Hsu	fi
2357c570021SLi-Wen Hsu
2362ccf8a82SEdward Tomasz Napierala	if [ "$(atf_config_get ci false)" = "true" ] && \
2372ccf8a82SEdward Tomasz Napierala		[ "$(uname -p)" = "armv7" ]; then
2382ccf8a82SEdward Tomasz Napierala		atf_skip "https://bugs.freebsd.org/249229"
2392ccf8a82SEdward Tomasz Napierala	fi
2402ccf8a82SEdward Tomasz Napierala
2419c1535e9SKyle Evans	cwd=$(realpath .)
242794022b0SEnji Cooper	zpool=$(make_zpool_name)
2439c1535e9SKyle Evans	disk=${cwd}/disk.img
2449c1535e9SKyle Evans	mount=${cwd}/mnt
2459c1535e9SKyle Evans
2469c1535e9SKyle Evans	bectl_create_setup ${zpool} ${disk} ${mount}
2479c1535e9SKyle Evans	atf_check -o save:exported bectl -r ${zpool}/ROOT export default
2489c1535e9SKyle Evans	atf_check -x "bectl -r ${zpool}/ROOT import default2 < exported"
2499c1535e9SKyle Evans	atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
2506286a643SKyle Evans	atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
2519c1535e9SKyle Evans	atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
2529c1535e9SKyle Evans	    ${zpool}/ROOT/default2
2539c1535e9SKyle Evans}
2549c1535e9SKyle Evansbectl_export_import_cleanup()
2559c1535e9SKyle Evans{
256794022b0SEnji Cooper	bectl_cleanup $(get_zpool_name)
2579c1535e9SKyle Evans}
2589c1535e9SKyle Evans
2599c1535e9SKyle Evansatf_test_case bectl_list cleanup
2609c1535e9SKyle Evansbectl_list_head()
2619c1535e9SKyle Evans{
2629c1535e9SKyle Evans	atf_set "descr" "Check bectl list"
2639c1535e9SKyle Evans	atf_set "require.user" root
2649c1535e9SKyle Evans}
2659c1535e9SKyle Evansbectl_list_body()
2669c1535e9SKyle Evans{
2677c570021SLi-Wen Hsu	if [ "$(atf_config_get ci false)" = "true" ] && \
2687c570021SLi-Wen Hsu		[ "$(uname -p)" = "i386" ]; then
2697c570021SLi-Wen Hsu		atf_skip "https://bugs.freebsd.org/249055"
2707c570021SLi-Wen Hsu	fi
2717c570021SLi-Wen Hsu
2722ccf8a82SEdward Tomasz Napierala	if [ "$(atf_config_get ci false)" = "true" ] && \
2732ccf8a82SEdward Tomasz Napierala		[ "$(uname -p)" = "armv7" ]; then
2742ccf8a82SEdward Tomasz Napierala		atf_skip "https://bugs.freebsd.org/249229"
2752ccf8a82SEdward Tomasz Napierala	fi
2762ccf8a82SEdward Tomasz Napierala
2779c1535e9SKyle Evans	cwd=$(realpath .)
278794022b0SEnji Cooper	zpool=$(make_zpool_name)
2799c1535e9SKyle Evans	disk=${cwd}/disk.img
2809c1535e9SKyle Evans	mount=${cwd}/mnt
2819c1535e9SKyle Evans
2829c1535e9SKyle Evans	bectl_create_setup ${zpool} ${disk} ${mount}
2839c1535e9SKyle Evans	# Test the list functionality, including that BEs come and go away
2849c1535e9SKyle Evans	# as they're created and destroyed.  Creation and destruction tests
2859c1535e9SKyle Evans	# use the 'zfs' utility to verify that they're actually created, so
2869c1535e9SKyle Evans	# these are just light tests that 'list' is picking them up.
2879c1535e9SKyle Evans	atf_check -o save:list.out bectl -r ${zpool}/ROOT list
2889c1535e9SKyle Evans	atf_check -o not-empty grep 'default' list.out
2899c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT create -e default default2
2909c1535e9SKyle Evans	atf_check -o save:list.out bectl -r ${zpool}/ROOT list
2919c1535e9SKyle Evans	atf_check -o not-empty grep 'default2' list.out
2926286a643SKyle Evans	atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
2939c1535e9SKyle Evans	atf_check -o save:list.out bectl -r ${zpool}/ROOT list
2949c1535e9SKyle Evans	atf_check -s not-exit:0 grep 'default2' list.out
2959c1535e9SKyle Evans	# XXX TODO: Formatting checks
2969c1535e9SKyle Evans}
2979c1535e9SKyle Evansbectl_list_cleanup()
2989c1535e9SKyle Evans{
299794022b0SEnji Cooper	bectl_cleanup $(get_zpool_name)
3009c1535e9SKyle Evans}
3019c1535e9SKyle Evans
3029c1535e9SKyle Evansatf_test_case bectl_mount cleanup
3039c1535e9SKyle Evansbectl_mount_head()
3049c1535e9SKyle Evans{
3059c1535e9SKyle Evans	atf_set "descr" "Check bectl mount/unmount"
3069c1535e9SKyle Evans	atf_set "require.user" root
3079c1535e9SKyle Evans}
3089c1535e9SKyle Evansbectl_mount_body()
3099c1535e9SKyle Evans{
3107c570021SLi-Wen Hsu	if [ "$(atf_config_get ci false)" = "true" ] && \
3117c570021SLi-Wen Hsu		[ "$(uname -p)" = "i386" ]; then
3127c570021SLi-Wen Hsu		atf_skip "https://bugs.freebsd.org/249055"
3137c570021SLi-Wen Hsu	fi
3147c570021SLi-Wen Hsu
3152ccf8a82SEdward Tomasz Napierala	if [ "$(atf_config_get ci false)" = "true" ] && \
3162ccf8a82SEdward Tomasz Napierala		[ "$(uname -p)" = "armv7" ]; then
3172ccf8a82SEdward Tomasz Napierala		atf_skip "https://bugs.freebsd.org/249229"
3182ccf8a82SEdward Tomasz Napierala	fi
3192ccf8a82SEdward Tomasz Napierala
3209c1535e9SKyle Evans	cwd=$(realpath .)
321794022b0SEnji Cooper	zpool=$(make_zpool_name)
3229c1535e9SKyle Evans	disk=${cwd}/disk.img
3239c1535e9SKyle Evans	mount=${cwd}/mnt
3249c1535e9SKyle Evans	root=${mount}/root
3259c1535e9SKyle Evans
3260a603a6eSKyle Evans	bectl_create_deep_setup ${zpool} ${disk} ${mount}
3279c1535e9SKyle Evans	atf_check mkdir -p ${root}
3289c1535e9SKyle Evans	# Test unmount first...
3299c1535e9SKyle Evans	atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
3309c1535e9SKyle Evans	atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
3319c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT unmount default
3329c1535e9SKyle Evans	atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
3339c1535e9SKyle Evans	# Then umount!
3349c1535e9SKyle Evans	atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
3359c1535e9SKyle Evans	atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
3369c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT umount default
3379c1535e9SKyle Evans	atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
3389c1535e9SKyle Evans}
3399c1535e9SKyle Evansbectl_mount_cleanup()
3409c1535e9SKyle Evans{
341794022b0SEnji Cooper	bectl_cleanup $(get_zpool_name)
3429c1535e9SKyle Evans}
3439c1535e9SKyle Evans
3449c1535e9SKyle Evansatf_test_case bectl_rename cleanup
3459c1535e9SKyle Evansbectl_rename_head()
3469c1535e9SKyle Evans{
3479c1535e9SKyle Evans	atf_set "descr" "Check bectl rename"
3489c1535e9SKyle Evans	atf_set "require.user" root
3499c1535e9SKyle Evans}
3509c1535e9SKyle Evansbectl_rename_body()
3519c1535e9SKyle Evans{
3527c570021SLi-Wen Hsu	if [ "$(atf_config_get ci false)" = "true" ] && \
3537c570021SLi-Wen Hsu		[ "$(uname -p)" = "i386" ]; then
3547c570021SLi-Wen Hsu		atf_skip "https://bugs.freebsd.org/249055"
3557c570021SLi-Wen Hsu	fi
3567c570021SLi-Wen Hsu
3572ccf8a82SEdward Tomasz Napierala	if [ "$(atf_config_get ci false)" = "true" ] && \
3582ccf8a82SEdward Tomasz Napierala		[ "$(uname -p)" = "armv7" ]; then
3592ccf8a82SEdward Tomasz Napierala		atf_skip "https://bugs.freebsd.org/249229"
3602ccf8a82SEdward Tomasz Napierala	fi
3612ccf8a82SEdward Tomasz Napierala
3629c1535e9SKyle Evans	cwd=$(realpath .)
363794022b0SEnji Cooper	zpool=$(make_zpool_name)
3649c1535e9SKyle Evans	disk=${cwd}/disk.img
3659c1535e9SKyle Evans	mount=${cwd}/mnt
3669c1535e9SKyle Evans
3679c1535e9SKyle Evans	bectl_create_setup ${zpool} ${disk} ${mount}
3689c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT rename default default2
3699c1535e9SKyle Evans	atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
3709c1535e9SKyle Evans	atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
3719c1535e9SKyle Evans	    ${zpool}/ROOT/default
3729c1535e9SKyle Evans}
3739c1535e9SKyle Evansbectl_rename_cleanup()
3749c1535e9SKyle Evans{
375794022b0SEnji Cooper	bectl_cleanup $(get_zpool_name)
3769c1535e9SKyle Evans}
3779c1535e9SKyle Evans
3789c1535e9SKyle Evansatf_test_case bectl_jail cleanup
3799c1535e9SKyle Evansbectl_jail_head()
3809c1535e9SKyle Evans{
3819c1535e9SKyle Evans	atf_set "descr" "Check bectl rename"
3829c1535e9SKyle Evans	atf_set "require.user" root
383b33e1eddSOlivier Cochard	atf_set "require.progs" jail
3849c1535e9SKyle Evans}
3859c1535e9SKyle Evansbectl_jail_body()
3869c1535e9SKyle Evans{
3877c570021SLi-Wen Hsu	if [ "$(atf_config_get ci false)" = "true" ] && \
3887c570021SLi-Wen Hsu		[ "$(uname -p)" = "i386" ]; then
3897c570021SLi-Wen Hsu		atf_skip "https://bugs.freebsd.org/249055"
3907c570021SLi-Wen Hsu	fi
3917c570021SLi-Wen Hsu
3922ccf8a82SEdward Tomasz Napierala	if [ "$(atf_config_get ci false)" = "true" ] && \
3932ccf8a82SEdward Tomasz Napierala		[ "$(uname -p)" = "armv7" ]; then
3942ccf8a82SEdward Tomasz Napierala		atf_skip "https://bugs.freebsd.org/249229"
3952ccf8a82SEdward Tomasz Napierala	fi
3962ccf8a82SEdward Tomasz Napierala
3979c1535e9SKyle Evans	cwd=$(realpath .)
398794022b0SEnji Cooper	zpool=$(make_zpool_name)
3999c1535e9SKyle Evans	disk=${cwd}/disk.img
4009c1535e9SKyle Evans	mount=${cwd}/mnt
4019c1535e9SKyle Evans	root=${mount}/root
4029c1535e9SKyle Evans
4039c1535e9SKyle Evans	if [ ! -f /rescue/rescue ]; then
4049c1535e9SKyle Evans		atf_skip "This test requires a rescue binary"
4059c1535e9SKyle Evans	fi
4060a603a6eSKyle Evans	bectl_create_deep_setup ${zpool} ${disk} ${mount}
4079c1535e9SKyle Evans	# Prepare our minimal BE... plop a rescue binary into it
4089c1535e9SKyle Evans	atf_check mkdir -p ${root}
4099c1535e9SKyle Evans	atf_check -o ignore bectl -r ${zpool}/ROOT mount default ${root}
4109c1535e9SKyle Evans	atf_check mkdir -p ${root}/rescue
4119c1535e9SKyle Evans	atf_check cp /rescue/rescue ${root}/rescue/rescue
4129c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT umount default
4139c1535e9SKyle Evans
41422554a34SKyle Evans	# Prepare some more boot environments
4157ce09314SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT create -e default target
41622554a34SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT create -e default 1234
41722554a34SKyle Evans
41822554a34SKyle Evans	# Attempt to unjail a BE with numeric name; jail_getid at one point
41922554a34SKyle Evans	# did not validate that the input was a valid jid before returning the
42022554a34SKyle Evans	# jid.
42122554a34SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b 1234
42222554a34SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail 1234
4237ce09314SKyle Evans
4247ce09314SKyle Evans	# When a jail name is not explicit, it should match the jail id.
4257ce09314SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b -o jid=233637 default
4267ce09314SKyle Evans	atf_check -o inline:"233637\n" -s exit:0 -x "jls -j 233637 name"
4277ce09314SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail default
4287ce09314SKyle Evans
4299c1535e9SKyle Evans	# Basic command-mode tests, with and without jail cleanup
4300a603a6eSKyle Evans	atf_check -o inline:"rescue\nusr\n" bectl -r ${zpool}/ROOT \
4319c1535e9SKyle Evans	    jail default /rescue/rescue ls -1
4320a603a6eSKyle Evans	atf_check -o inline:"rescue\nusr\n" bectl -r ${zpool}/ROOT \
4339c1535e9SKyle Evans	    jail -Uo path=${root} default /rescue/rescue ls -1
4349c1535e9SKyle Evans	atf_check [ -f ${root}/rescue/rescue ]
4359c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT ujail default
4369c1535e9SKyle Evans
4379c1535e9SKyle Evans	# Batch mode tests
4389c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT jail -bo path=${root} default
4399c1535e9SKyle Evans	atf_check -o not-empty -x "jls | grep -F \"${root}\""
4409c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT ujail default
4419c1535e9SKyle Evans	atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
4429c1535e9SKyle Evans	# 'unjail' naming
4439c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT jail -b default
4449c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT unjail default
4459c1535e9SKyle Evans	atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
4467ce09314SKyle Evans	# 'unjail' by BE name. Force bectl to lookup jail id by the BE name.
4477ce09314SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b default
4487ce09314SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b -o name=bectl_test target
4497ce09314SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail target
4507ce09314SKyle Evans	atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail default
4519c1535e9SKyle Evans	# cannot unjail an unjailed BE (by either command name)
4529c1535e9SKyle Evans	atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT ujail default
4539c1535e9SKyle Evans	atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT unjail default
4549c1535e9SKyle Evans
4559c1535e9SKyle Evans	# set+unset
4569c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT jail -b -o path=${root} -u path default
4579c1535e9SKyle Evans	# Ensure that it didn't mount at ${root}
4589c1535e9SKyle Evans	atf_check -s not-exit:0 -x "mount | grep -F '${root}'"
4599c1535e9SKyle Evans	atf_check bectl -r ${zpool}/ROOT ujail default
4609c1535e9SKyle Evans}
4617ce09314SKyle Evans
4627ce09314SKyle Evans# If a test has failed, it's possible that the boot environment hasn't
4637ce09314SKyle Evans# been 'unjail'ed. We want to remove the jail before 'bectl_cleanup'
4647ce09314SKyle Evans# attempts to destroy the zpool.
4659c1535e9SKyle Evansbectl_jail_cleanup()
4669c1535e9SKyle Evans{
467d8bdfeb6SLi-Wen Hsu	if [ "$(atf_config_get ci false)" = "true" ] && \
468d8bdfeb6SLi-Wen Hsu		[ "$(uname -p)" = "i386" ]; then
469d8bdfeb6SLi-Wen Hsu		atf_skip "https://bugs.freebsd.org/249055"
470d8bdfeb6SLi-Wen Hsu	fi
471d8bdfeb6SLi-Wen Hsu
4722ccf8a82SEdward Tomasz Napierala	if [ "$(atf_config_get ci false)" = "true" ] && \
4732ccf8a82SEdward Tomasz Napierala		[ "$(uname -p)" = "armv7" ]; then
4742ccf8a82SEdward Tomasz Napierala		atf_skip "https://bugs.freebsd.org/249229"
4752ccf8a82SEdward Tomasz Napierala	fi
4762ccf8a82SEdward Tomasz Napierala
47722554a34SKyle Evans	zpool=$(get_zpool_name)
47822554a34SKyle Evans	for bootenv in "default" "target" "1234"; do
4797ce09314SKyle Evans		# mountpoint of the boot environment
48022554a34SKyle Evans		mountpoint="$(bectl -r ${zpool}/ROOT list -H | grep ${bootenv} | awk '{print $3}')"
4817ce09314SKyle Evans
4827ce09314SKyle Evans		# see if any jail paths match the boot environment mountpoint
4837ce09314SKyle Evans		jailid="$(jls | grep ${mountpoint} | awk '{print $1}')"
4847ce09314SKyle Evans
4857ce09314SKyle Evans		if [ -z "$jailid" ]; then
4867ce09314SKyle Evans		       continue;
4877ce09314SKyle Evans		fi
4887ce09314SKyle Evans		jail -r ${jailid}
4897ce09314SKyle Evans	done;
4909c1535e9SKyle Evans
49122554a34SKyle Evans	bectl_cleanup ${zpool}
4929c1535e9SKyle Evans}
4939c1535e9SKyle Evans
4945d082601SKyle Evansatf_test_case bectl_promotion cleanup
4955d082601SKyle Evansbectl_promotion_head()
4965d082601SKyle Evans{
4975d082601SKyle Evans	atf_set "descr" "Check bectl promotion upon activation"
4985d082601SKyle Evans	atf_set "require.user" root
4995d082601SKyle Evans}
5005d082601SKyle Evansbectl_promotion_body()
5015d082601SKyle Evans{
5025d082601SKyle Evans	if [ "$(atf_config_get ci false)" = "true" ] && \
5035d082601SKyle Evans		[ "$(uname -p)" = "i386" ]; then
5045d082601SKyle Evans		atf_skip "https://bugs.freebsd.org/249055"
5055d082601SKyle Evans	fi
5065d082601SKyle Evans
5075d082601SKyle Evans	if [ "$(atf_config_get ci false)" = "true" ] && \
5085d082601SKyle Evans		[ "$(uname -p)" = "armv7" ]; then
5095d082601SKyle Evans		atf_skip "https://bugs.freebsd.org/249229"
5105d082601SKyle Evans	fi
5115d082601SKyle Evans
5125d082601SKyle Evans	cwd=$(realpath .)
5135d082601SKyle Evans	zpool=$(make_zpool_name)
5145d082601SKyle Evans	disk=${cwd}/disk.img
5155d082601SKyle Evans	mount=${cwd}/mnt
5165d082601SKyle Evans	root=${mount}/root
5175d082601SKyle Evans
5184b426cf3SR. Christian McDonald	bectl_create_deep_setup ${zpool} ${disk} ${mount}
5195d082601SKyle Evans	atf_check mkdir -p ${root}
5205d082601SKyle Evans
5215d082601SKyle Evans	# Sleeps interspersed to workaround some naming quirks; notably,
5225d082601SKyle Evans	# bectl will append a serial if two snapshots were created within
5235d082601SKyle Evans	# the same second, but it can only do that for the one root it's
5245d082601SKyle Evans	# operating on.  It won't check that other roots don't have a snapshot
5255d082601SKyle Evans	# with the same name, and the promotion will fail.
5265d082601SKyle Evans	atf_check bectl -r ${zpool}/ROOT rename default A
5275d082601SKyle Evans	sleep 1
5284b426cf3SR. Christian McDonald	atf_check bectl -r ${zpool}/ROOT create -r -e A B
5295d082601SKyle Evans	sleep 1
5304b426cf3SR. Christian McDonald	atf_check bectl -r ${zpool}/ROOT create -r -e B C
5315d082601SKyle Evans
5325d082601SKyle Evans	# C should be a clone of B to start with
5334b426cf3SR. Christian McDonald	atf_check -o not-inline:"-" zfs list -Hr -o origin ${zpool}/ROOT/C
5345d082601SKyle Evans
5355d082601SKyle Evans	# Activating it should then promote it all the way out of clone-hood.
5365d082601SKyle Evans	# This entails two promotes internally, as the first would promote it to
5375d082601SKyle Evans	# a snapshot of A before finally promoting it the second time out of
5385d082601SKyle Evans	# clone status.
5395d082601SKyle Evans	atf_check -o not-empty bectl -r ${zpool}/ROOT activate C
5404b426cf3SR. Christian McDonald	atf_check -o inline:"-\n-\n" zfs list -Hr -o origin ${zpool}/ROOT/C
5415d082601SKyle Evans}
5425d082601SKyle Evansbectl_promotion_cleanup()
5435d082601SKyle Evans{
5445d082601SKyle Evans	bectl_cleanup $(get_zpool_name)
5455d082601SKyle Evans}
5465d082601SKyle Evans
5475086b6ecSR. Christian McDonaldatf_test_case bectl_destroy_bootonce cleanup
5485086b6ecSR. Christian McDonaldbectl_destroy_bootonce_head()
5495086b6ecSR. Christian McDonald{
5505086b6ecSR. Christian McDonald	atf_set "descr" "Check bectl destroy (bootonce)"
5515086b6ecSR. Christian McDonald	atf_set "require.user" root
5525086b6ecSR. Christian McDonald}
5535086b6ecSR. Christian McDonaldbectl_destroy_bootonce_body()
5545086b6ecSR. Christian McDonald{
5555086b6ecSR. Christian McDonald	if [ "$(atf_config_get ci false)" = "true" ] && \
5565086b6ecSR. Christian McDonald		[ "$(uname -p)" = "i386" ]; then
5575086b6ecSR. Christian McDonald		atf_skip "https://bugs.freebsd.org/249055"
5585086b6ecSR. Christian McDonald	fi
5595086b6ecSR. Christian McDonald
5605086b6ecSR. Christian McDonald	if [ "$(atf_config_get ci false)" = "true" ] && \
5615086b6ecSR. Christian McDonald		[ "$(uname -p)" = "armv7" ]; then
5625086b6ecSR. Christian McDonald		atf_skip "https://bugs.freebsd.org/249229"
5635086b6ecSR. Christian McDonald	fi
5645086b6ecSR. Christian McDonald
5655086b6ecSR. Christian McDonald	cwd=$(realpath .)
5665086b6ecSR. Christian McDonald	zpool=$(make_zpool_name)
5675086b6ecSR. Christian McDonald	disk=${cwd}/disk.img
5685086b6ecSR. Christian McDonald	mount=${cwd}/mnt
5695086b6ecSR. Christian McDonald	root=${mount}/root
5705086b6ecSR. Christian McDonald
5715086b6ecSR. Christian McDonald	be=default2
5725086b6ecSR. Christian McDonald
5735086b6ecSR. Christian McDonald	bectl_create_setup ${zpool} ${disk} ${mount}
5745086b6ecSR. Christian McDonald	atf_check -s exit:0 -o empty bectl -r ${zpool}/ROOT create -e default ${be}
5755086b6ecSR. Christian McDonald
5765086b6ecSR. Christian McDonald	# Create boot environment and bootonce activate it
5775086b6ecSR. Christian McDonald	atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT activate -t ${be}
5785086b6ecSR. Christian McDonald	atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}:\n" zfsbootcfg -z ${zpool}
5795086b6ecSR. Christian McDonald
5805086b6ecSR. Christian McDonald	# Destroy it
5815086b6ecSR. Christian McDonald	atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT destroy ${be}
5825086b6ecSR. Christian McDonald
5835086b6ecSR. Christian McDonald	# Should be empty
5845086b6ecSR. Christian McDonald	atf_check -s exit:0 -o empty zfsbootcfg -z ${zpool}
5855086b6ecSR. Christian McDonald}
5865086b6ecSR. Christian McDonaldbectl_destroy_bootonce_cleanup()
5875086b6ecSR. Christian McDonald{
5885086b6ecSR. Christian McDonald	bectl_cleanup $(get_zpool_name)
5895086b6ecSR. Christian McDonald}
5905086b6ecSR. Christian McDonald
5915086b6ecSR. Christian McDonaldatf_test_case bectl_rename_bootonce cleanup
5925086b6ecSR. Christian McDonaldbectl_rename_bootonce_head()
5935086b6ecSR. Christian McDonald{
5945086b6ecSR. Christian McDonald	atf_set "descr" "Check bectl destroy (bootonce)"
5955086b6ecSR. Christian McDonald	atf_set "require.user" root
5965086b6ecSR. Christian McDonald}
5975086b6ecSR. Christian McDonaldbectl_rename_bootonce_body()
5985086b6ecSR. Christian McDonald{
5995086b6ecSR. Christian McDonald	if [ "$(atf_config_get ci false)" = "true" ] && \
6005086b6ecSR. Christian McDonald		[ "$(uname -p)" = "i386" ]; then
6015086b6ecSR. Christian McDonald		atf_skip "https://bugs.freebsd.org/249055"
6025086b6ecSR. Christian McDonald	fi
6035086b6ecSR. Christian McDonald
6045086b6ecSR. Christian McDonald	if [ "$(atf_config_get ci false)" = "true" ] && \
6055086b6ecSR. Christian McDonald		[ "$(uname -p)" = "armv7" ]; then
6065086b6ecSR. Christian McDonald		atf_skip "https://bugs.freebsd.org/249229"
6075086b6ecSR. Christian McDonald	fi
6085086b6ecSR. Christian McDonald
6095086b6ecSR. Christian McDonald	cwd=$(realpath .)
6105086b6ecSR. Christian McDonald	zpool=$(make_zpool_name)
6115086b6ecSR. Christian McDonald	disk=${cwd}/disk.img
6125086b6ecSR. Christian McDonald	mount=${cwd}/mnt
6135086b6ecSR. Christian McDonald	root=${mount}/root
6145086b6ecSR. Christian McDonald
6155086b6ecSR. Christian McDonald	be=default2
6165086b6ecSR. Christian McDonald
6175086b6ecSR. Christian McDonald	bectl_create_setup ${zpool} ${disk} ${mount}
6185086b6ecSR. Christian McDonald	atf_check -s exit:0 -o empty bectl -r ${zpool}/ROOT create -e default ${be}
6195086b6ecSR. Christian McDonald
6205086b6ecSR. Christian McDonald	# Create boot environment and bootonce activate it
6215086b6ecSR. Christian McDonald	atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT activate -t ${be}
6225086b6ecSR. Christian McDonald	atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}:\n" zfsbootcfg -z ${zpool}
6235086b6ecSR. Christian McDonald
6245086b6ecSR. Christian McDonald	# Rename it
6255086b6ecSR. Christian McDonald	atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT rename ${be} ${be}_renamed
6265086b6ecSR. Christian McDonald
6275086b6ecSR. Christian McDonald	# Should be renamed
6285086b6ecSR. Christian McDonald	atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}_renamed:\n" zfsbootcfg -z ${zpool}
6295086b6ecSR. Christian McDonald}
6305086b6ecSR. Christian McDonaldbectl_rename_bootonce_cleanup()
6315086b6ecSR. Christian McDonald{
6325086b6ecSR. Christian McDonald	bectl_cleanup $(get_zpool_name)
6335086b6ecSR. Christian McDonald}
6345086b6ecSR. Christian McDonald
6359c1535e9SKyle Evansatf_init_test_cases()
6369c1535e9SKyle Evans{
6379c1535e9SKyle Evans	atf_add_test_case bectl_create
6389c1535e9SKyle Evans	atf_add_test_case bectl_destroy
6399c1535e9SKyle Evans	atf_add_test_case bectl_export_import
6409c1535e9SKyle Evans	atf_add_test_case bectl_list
6419c1535e9SKyle Evans	atf_add_test_case bectl_mount
6429c1535e9SKyle Evans	atf_add_test_case bectl_rename
6439c1535e9SKyle Evans	atf_add_test_case bectl_jail
6445d082601SKyle Evans	atf_add_test_case bectl_promotion
6455086b6ecSR. Christian McDonald	atf_add_test_case bectl_destroy_bootonce
6465086b6ecSR. Christian McDonald	atf_add_test_case bectl_rename_bootonce
6479c1535e9SKyle Evans}
648