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