2 # SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 # Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
15 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 ZPOOL_NAME_FILE=zpool_name
36 mktemp -u bectl_test_XXXXXX > $ZPOOL_NAME_FILE
40 # Establishes a bectl_create zpool that can be used for some light testing; contains
41 # a 'default' BE and not much else.
48 # Sanity check to make sure `make_zpool_name` succeeded
49 atf_check test -n "$zpool"
51 kldload -n -q zfs || atf_skip "ZFS module not loaded on the current system"
52 atf_check mkdir -p ${mnt}
53 atf_check truncate -s 1G ${disk}
54 atf_check zpool create -o altroot=${mnt} ${zpool} ${disk}
55 atf_check zfs create -o mountpoint=none ${zpool}/ROOT
56 atf_check zfs create -o mountpoint=/ -o canmount=noauto \
59 bectl_create_deep_setup()
65 # Sanity check to make sure `make_zpool_name` succeeded
66 atf_check test -n "$zpool"
68 bectl_create_setup ${zpool} ${disk} ${mnt}
69 atf_check mkdir -p ${root}
70 atf_check -o ignore bectl -r ${zpool}/ROOT mount default ${root}
71 atf_check mkdir -p ${root}/usr
72 atf_check zfs create -o mountpoint=/usr -o canmount=noauto \
73 ${zpool}/ROOT/default/usr
74 atf_check -o ignore bectl -r ${zpool}/ROOT umount default
80 if [ -z "$zpool" ]; then
81 echo "Skipping cleanup; zpool not set up"
82 elif zpool get health ${zpool} >/dev/null 2>&1; then
83 zpool destroy -f ${zpool}
87 atf_test_case bectl_create cleanup
91 atf_set "descr" "Check the various forms of bectl create"
92 atf_set "require.user" root
97 zpool=$(make_zpool_name)
101 bectl_create_setup ${zpool} ${disk} ${mount}
102 # Test standard creation, creation of a snapshot, and creation from a
104 atf_check bectl -r ${zpool}/ROOT create -e default default2
105 atf_check bectl -r ${zpool}/ROOT create default2@test_snap
106 atf_check bectl -r ${zpool}/ROOT create -e default2@test_snap default3
108 bectl_create_cleanup()
110 bectl_cleanup $(get_zpool_name)
113 atf_test_case bectl_destroy cleanup
117 atf_set "descr" "Check bectl destroy"
118 atf_set "require.user" root
123 zpool=$(make_zpool_name)
128 bectl_create_setup ${zpool} ${disk} ${mount}
129 atf_check bectl -r ${zpool}/ROOT create -e default default2
130 atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
131 atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
132 atf_check -e not-empty -s not-exit:0 zfs get mountpoint ${zpool}/ROOT/default2
134 # Test origin snapshot deletion when the snapshot to be destroyed
135 # belongs to a mounted dataset, see PR 236043.
136 atf_check mkdir -p ${root}
137 atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
138 atf_check bectl -r ${zpool}/ROOT create -e default default3
139 atf_check bectl -r ${zpool}/ROOT destroy -o default3
140 atf_check bectl -r ${zpool}/ROOT unmount default
142 bectl_destroy_cleanup()
145 bectl_cleanup $(get_zpool_name)
148 atf_test_case bectl_export_import cleanup
149 bectl_export_import_head()
152 atf_set "descr" "Check bectl export and import"
153 atf_set "require.user" root
155 bectl_export_import_body()
158 zpool=$(make_zpool_name)
162 bectl_create_setup ${zpool} ${disk} ${mount}
163 atf_check -o save:exported bectl -r ${zpool}/ROOT export default
164 atf_check -x "bectl -r ${zpool}/ROOT import default2 < exported"
165 atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
166 atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
167 atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
168 ${zpool}/ROOT/default2
170 bectl_export_import_cleanup()
173 bectl_cleanup $(get_zpool_name)
176 atf_test_case bectl_list cleanup
180 atf_set "descr" "Check bectl list"
181 atf_set "require.user" root
186 zpool=$(make_zpool_name)
190 bectl_create_setup ${zpool} ${disk} ${mount}
191 # Test the list functionality, including that BEs come and go away
192 # as they're created and destroyed. Creation and destruction tests
193 # use the 'zfs' utility to verify that they're actually created, so
194 # these are just light tests that 'list' is picking them up.
195 atf_check -o save:list.out bectl -r ${zpool}/ROOT list
196 atf_check -o not-empty grep 'default' list.out
197 atf_check bectl -r ${zpool}/ROOT create -e default default2
198 atf_check -o save:list.out bectl -r ${zpool}/ROOT list
199 atf_check -o not-empty grep 'default2' list.out
200 atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
201 atf_check -o save:list.out bectl -r ${zpool}/ROOT list
202 atf_check -s not-exit:0 grep 'default2' list.out
203 # XXX TODO: Formatting checks
208 bectl_cleanup $(get_zpool_name)
211 atf_test_case bectl_mount cleanup
215 atf_set "descr" "Check bectl mount/unmount"
216 atf_set "require.user" root
221 zpool=$(make_zpool_name)
226 bectl_create_deep_setup ${zpool} ${disk} ${mount}
227 atf_check mkdir -p ${root}
228 # Test unmount first...
229 atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
230 atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
231 atf_check bectl -r ${zpool}/ROOT unmount default
232 atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
234 atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
235 atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
236 atf_check bectl -r ${zpool}/ROOT umount default
237 atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
239 bectl_mount_cleanup()
242 bectl_cleanup $(get_zpool_name)
245 atf_test_case bectl_rename cleanup
249 atf_set "descr" "Check bectl rename"
250 atf_set "require.user" root
255 zpool=$(make_zpool_name)
259 bectl_create_setup ${zpool} ${disk} ${mount}
260 atf_check bectl -r ${zpool}/ROOT rename default default2
261 atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
262 atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
263 ${zpool}/ROOT/default
265 bectl_rename_cleanup()
268 bectl_cleanup $(get_zpool_name)
271 atf_test_case bectl_jail cleanup
275 atf_set "descr" "Check bectl rename"
276 atf_set "require.user" root
281 zpool=$(make_zpool_name)
286 if [ ! -f /rescue/rescue ]; then
287 atf_skip "This test requires a rescue binary"
289 bectl_create_deep_setup ${zpool} ${disk} ${mount}
290 # Prepare our minimal BE... plop a rescue binary into it
291 atf_check mkdir -p ${root}
292 atf_check -o ignore bectl -r ${zpool}/ROOT mount default ${root}
293 atf_check mkdir -p ${root}/rescue
294 atf_check cp /rescue/rescue ${root}/rescue/rescue
295 atf_check bectl -r ${zpool}/ROOT umount default
297 # Prepare a second boot environment
298 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT create -e default target
300 # When a jail name is not explicit, it should match the jail id.
301 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b -o jid=233637 default
302 atf_check -o inline:"233637\n" -s exit:0 -x "jls -j 233637 name"
303 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail default
305 # Basic command-mode tests, with and without jail cleanup
306 atf_check -o inline:"rescue\nusr\n" bectl -r ${zpool}/ROOT \
307 jail default /rescue/rescue ls -1
308 atf_check -o inline:"rescue\nusr\n" bectl -r ${zpool}/ROOT \
309 jail -Uo path=${root} default /rescue/rescue ls -1
310 atf_check [ -f ${root}/rescue/rescue ]
311 atf_check bectl -r ${zpool}/ROOT ujail default
314 atf_check bectl -r ${zpool}/ROOT jail -bo path=${root} default
315 atf_check -o not-empty -x "jls | grep -F \"${root}\""
316 atf_check bectl -r ${zpool}/ROOT ujail default
317 atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
319 atf_check bectl -r ${zpool}/ROOT jail -b default
320 atf_check bectl -r ${zpool}/ROOT unjail default
321 atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
322 # 'unjail' by BE name. Force bectl to lookup jail id by the BE name.
323 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b default
324 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b -o name=bectl_test target
325 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail target
326 atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail default
327 # cannot unjail an unjailed BE (by either command name)
328 atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT ujail default
329 atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT unjail default
332 atf_check bectl -r ${zpool}/ROOT jail -b -o path=${root} -u path default
333 # Ensure that it didn't mount at ${root}
334 atf_check -s not-exit:0 -x "mount | grep -F '${root}'"
335 atf_check bectl -r ${zpool}/ROOT ujail default
338 # If a test has failed, it's possible that the boot environment hasn't
339 # been 'unjail'ed. We want to remove the jail before 'bectl_cleanup'
340 # attempts to destroy the zpool.
343 for bootenv in "default" "target"; do
344 # mountpoint of the boot environment
345 mountpoint="$(bectl -r bectl_test/ROOT list -H | grep ${bootenv} | awk '{print $3}')"
347 # see if any jail paths match the boot environment mountpoint
348 jailid="$(jls | grep ${mountpoint} | awk '{print $1}')"
350 if [ -z "$jailid" ]; then
356 bectl_cleanup $(get_zpool_name)
359 atf_init_test_cases()
361 atf_add_test_case bectl_create
362 atf_add_test_case bectl_destroy
363 atf_add_test_case bectl_export_import
364 atf_add_test_case bectl_list
365 atf_add_test_case bectl_mount
366 atf_add_test_case bectl_rename
367 atf_add_test_case bectl_jail