]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sbin/bectl/tests/bectl_test.sh
Merge llvm-project main llvmorg-18-init-18359-g93248729cfae
[FreeBSD/FreeBSD.git] / sbin / bectl / tests / bectl_test.sh
1 #
2 # SPDX-License-Identifier: BSD-2-Clause
3 #
4 # Copyright (c) 2018 Kyle Evans <kevans@FreeBSD.org>
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
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.
14 #
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
25 # SUCH DAMAGE.
26 #
27
28 ZPOOL_NAME_FILE=zpool_name
29 get_zpool_name()
30 {
31         cat $ZPOOL_NAME_FILE
32 }
33 make_zpool_name()
34 {
35         mktemp -u bectl_test_XXXXXX > $ZPOOL_NAME_FILE
36         get_zpool_name
37 }
38
39 # Establishes a bectl_create zpool that can be used for some light testing; contains
40 # a 'default' BE and not much else.
41 bectl_create_setup()
42 {
43         zpool=$1
44         disk=$2
45         mnt=$3
46
47         # Sanity check to make sure `make_zpool_name` succeeded
48         atf_check test -n "$zpool"
49
50         kldload -n -q zfs || atf_skip "ZFS module not loaded on the current system"
51         if ! getconf MIN_HOLE_SIZE "$(pwd)"; then
52                 echo "getconf MIN_HOLE_SIZE $(pwd) failed; sparse files " \
53                     "probably not supported by file system"
54                 mount
55                 atf_skip "Test's work directory does not support sparse files;" \
56                     "try with a different TMPDIR?"
57         fi
58         atf_check mkdir -p ${mnt}
59         atf_check truncate -s 1G ${disk}
60         atf_check zpool create -R ${mnt} ${zpool} ${disk}
61         atf_check zfs create -o mountpoint=none ${zpool}/ROOT
62         atf_check zfs create -o mountpoint=/ -o canmount=noauto \
63             ${zpool}/ROOT/default
64 }
65 bectl_create_deep_setup()
66 {
67         zpool=$1
68         disk=$2
69         mnt=$3
70
71         # Sanity check to make sure `make_zpool_name` succeeded
72         atf_check test -n "$zpool"
73
74         bectl_create_setup ${zpool} ${disk} ${mnt}
75         atf_check mkdir -p ${root}
76         atf_check -o ignore bectl -r ${zpool}/ROOT mount default ${root}
77         atf_check mkdir -p ${root}/usr
78         atf_check zfs create -o mountpoint=/usr -o canmount=noauto \
79             ${zpool}/ROOT/default/usr
80         atf_check -o ignore bectl -r ${zpool}/ROOT umount default
81 }
82
83 bectl_cleanup()
84 {
85         zpool=$1
86         if [ -z "$zpool" ]; then
87                 echo "Skipping cleanup; zpool not set up"
88         elif zpool get health ${zpool} >/dev/null 2>&1; then
89                 zpool destroy -f ${zpool}
90         fi
91 }
92
93 atf_test_case bectl_create cleanup
94 bectl_create_head()
95 {
96         atf_set "descr" "Check the various forms of bectl create"
97         atf_set "require.user" root
98 }
99 bectl_create_body()
100 {
101         if [ "$(atf_config_get ci false)" = "true" ] && \
102                 [ "$(uname -p)" = "i386" ]; then
103                 atf_skip "https://bugs.freebsd.org/249055"
104         fi
105
106         if [ "$(atf_config_get ci false)" = "true" ] && \
107                 [ "$(uname -p)" = "armv7" ]; then
108                 atf_skip "https://bugs.freebsd.org/249229"
109         fi
110
111         cwd=$(realpath .)
112         zpool=$(make_zpool_name)
113         disk=${cwd}/disk.img
114         mount=${cwd}/mnt
115
116         bectl_create_setup ${zpool} ${disk} ${mount}
117
118         # Create a child dataset that will be used to test creation
119         # of recursive and non-recursive boot environments.
120         atf_check zfs create -o mountpoint=/usr -o canmount=noauto \
121             ${zpool}/ROOT/default/usr
122
123         # BE datasets with spaces are not bootable, PR 254441.
124         atf_check -e not-empty -s not-exit:0 \
125                 bectl -r ${zpool}/ROOT create "foo bar"
126
127         # Test standard creation, creation of a snapshot, and creation from a
128         # snapshot.
129         atf_check bectl -r ${zpool}/ROOT create -e default default2
130         atf_check bectl -r ${zpool}/ROOT create default2@test_snap
131         atf_check bectl -r ${zpool}/ROOT create -e default2@test_snap default3
132
133         # Test standard creation, creation of a snapshot, and creation from a
134         # snapshot for recursive boot environments.
135         atf_check bectl -r ${zpool}/ROOT create -r -e default recursive
136         atf_check bectl -r ${zpool}/ROOT create -r recursive@test_snap
137         atf_check bectl -r ${zpool}/ROOT create -r -e recursive@test_snap recursive-snap
138
139         # Test that non-recursive boot environments have no child datasets.
140         atf_check -e not-empty -s not-exit:0 \
141                 zfs list "${zpool}/ROOT/default2/usr"
142         atf_check -e not-empty -s not-exit:0 \
143                 zfs list "${zpool}/ROOT/default3/usr"
144
145         # Test that recursive boot environments have child datasets.
146         atf_check -o not-empty \
147                 zfs list "${zpool}/ROOT/recursive/usr"
148         atf_check -o not-empty \
149                 zfs list "${zpool}/ROOT/recursive-snap/usr"
150 }
151 bectl_create_cleanup()
152 {
153         bectl_cleanup $(get_zpool_name)
154 }
155
156 atf_test_case bectl_destroy cleanup
157 bectl_destroy_head()
158 {
159         atf_set "descr" "Check bectl destroy"
160         atf_set "require.user" root
161 }
162 bectl_destroy_body()
163 {
164         if [ "$(atf_config_get ci false)" = "true" ] && \
165                 [ "$(uname -p)" = "i386" ]; then
166                 atf_skip "https://bugs.freebsd.org/249055"
167         fi
168
169         if [ "$(atf_config_get ci false)" = "true" ] && \
170                 [ "$(uname -p)" = "armv7" ]; then
171                 atf_skip "https://bugs.freebsd.org/249229"
172         fi
173
174         cwd=$(realpath .)
175         zpool=$(make_zpool_name)
176         disk=${cwd}/disk.img
177         mount=${cwd}/mnt
178         root=${mount}/root
179
180         bectl_create_setup ${zpool} ${disk} ${mount}
181         atf_check bectl -r ${zpool}/ROOT create -e default default2
182         atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
183         atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
184         atf_check -e not-empty -s not-exit:0 zfs get mountpoint ${zpool}/ROOT/default2
185
186         # Test origin snapshot deletion when the snapshot to be destroyed
187         # belongs to a mounted dataset, see PR 236043.
188         atf_check mkdir -p ${root}
189         atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
190         atf_check bectl -r ${zpool}/ROOT create -e default default3
191         atf_check bectl -r ${zpool}/ROOT destroy -o default3
192         atf_check bectl -r ${zpool}/ROOT unmount default
193
194         # create two be from the same parent and destroy the parent
195         atf_check bectl -r ${zpool}/ROOT create -e default default2
196         atf_check bectl -r ${zpool}/ROOT create -e default default3
197         atf_check bectl -r ${zpool}/ROOT destroy default
198         atf_check bectl -r ${zpool}/ROOT destroy default2
199         atf_check bectl -r ${zpool}/ROOT rename default3 default
200
201         # Create a BE, have it be the parent for another and repeat, then start
202         # deleting environments.  Arbitrarily chose default3 as the first.
203         # Sleeps are required to prevent conflicting snapshots- libbe will
204         # use the time with a serial at the end as needed to prevent collisions,
205         # but as BEs get promoted the snapshot names will convert and conflict
206         # anyways.  libbe should perhaps consider adding something extra to the
207         # default name to prevent collisions like this, but the default name
208         # includes down to the second and creating BEs this rapidly is perhaps
209         # uncommon enough.
210         atf_check bectl -r ${zpool}/ROOT create -e default default2
211         sleep 1
212         atf_check bectl -r ${zpool}/ROOT create -e default2 default3
213         sleep 1
214         atf_check bectl -r ${zpool}/ROOT create -e default3 default4
215         atf_check bectl -r ${zpool}/ROOT destroy default3
216         atf_check bectl -r ${zpool}/ROOT destroy default2
217         atf_check bectl -r ${zpool}/ROOT destroy default4
218
219         # Create two BEs, then create an unrelated snapshot on the originating
220         # BE and destroy it.  We shouldn't have promoted the second BE, and it's
221         # only possible to tell if we promoted it by making sure we didn't
222         # demote the first BE at some point -- if we did, it's origin will no
223         # longer be empty.
224         atf_check bectl -r ${zpool}/ROOT create -e default default2
225         atf_check bectl -r ${zpool}/ROOT create default@test
226
227         atf_check bectl -r ${zpool}/ROOT destroy default@test
228         atf_check -o inline:"-\n" zfs get -Ho value origin ${zpool}/ROOT/default
229         atf_check bectl -r ${zpool}/ROOT destroy default2
230
231         # As observed by beadm, if we explicitly try to destroy a snapshot that
232         # leads to clones, we shouldn't have allowed it.
233         atf_check bectl -r ${zpool}/ROOT create default@test
234         atf_check bectl -r ${zpool}/ROOT create -e default@test default2
235
236         atf_check -e  not-empty -s not-exit:0 bectl -r ${zpool}/ROOT destroy \
237             default@test
238 }
239 bectl_destroy_cleanup()
240 {
241         bectl_cleanup $(get_zpool_name)
242 }
243
244 atf_test_case bectl_export_import cleanup
245 bectl_export_import_head()
246 {
247         atf_set "descr" "Check bectl export and import"
248         atf_set "require.user" root
249 }
250 bectl_export_import_body()
251 {
252         if [ "$(atf_config_get ci false)" = "true" ] && \
253                 [ "$(uname -p)" = "i386" ]; then
254                 atf_skip "https://bugs.freebsd.org/249055"
255         fi
256
257         if [ "$(atf_config_get ci false)" = "true" ] && \
258                 [ "$(uname -p)" = "armv7" ]; then
259                 atf_skip "https://bugs.freebsd.org/249229"
260         fi
261
262         cwd=$(realpath .)
263         zpool=$(make_zpool_name)
264         disk=${cwd}/disk.img
265         mount=${cwd}/mnt
266
267         bectl_create_setup ${zpool} ${disk} ${mount}
268         atf_check -o save:exported bectl -r ${zpool}/ROOT export default
269         atf_check -x "bectl -r ${zpool}/ROOT import default2 < exported"
270         atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
271         atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
272         atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
273             ${zpool}/ROOT/default2
274 }
275 bectl_export_import_cleanup()
276 {
277         bectl_cleanup $(get_zpool_name)
278 }
279
280 atf_test_case bectl_list cleanup
281 bectl_list_head()
282 {
283         atf_set "descr" "Check bectl list"
284         atf_set "require.user" root
285 }
286 bectl_list_body()
287 {
288         if [ "$(atf_config_get ci false)" = "true" ] && \
289                 [ "$(uname -p)" = "i386" ]; then
290                 atf_skip "https://bugs.freebsd.org/249055"
291         fi
292
293         if [ "$(atf_config_get ci false)" = "true" ] && \
294                 [ "$(uname -p)" = "armv7" ]; then
295                 atf_skip "https://bugs.freebsd.org/249229"
296         fi
297
298         cwd=$(realpath .)
299         zpool=$(make_zpool_name)
300         disk=${cwd}/disk.img
301         mount=${cwd}/mnt
302
303         bectl_create_setup ${zpool} ${disk} ${mount}
304         # Test the list functionality, including that BEs come and go away
305         # as they're created and destroyed.  Creation and destruction tests
306         # use the 'zfs' utility to verify that they're actually created, so
307         # these are just light tests that 'list' is picking them up.
308         atf_check -o save:list.out bectl -r ${zpool}/ROOT list
309         atf_check -o not-empty grep 'default' list.out
310         atf_check bectl -r ${zpool}/ROOT create -e default default2
311         atf_check -o save:list.out bectl -r ${zpool}/ROOT list
312         atf_check -o not-empty grep 'default2' list.out
313         atf_check -e ignore bectl -r ${zpool}/ROOT destroy default2
314         atf_check -o save:list.out bectl -r ${zpool}/ROOT list
315         atf_check -s not-exit:0 grep 'default2' list.out
316         # XXX TODO: Formatting checks
317 }
318 bectl_list_cleanup()
319 {
320         bectl_cleanup $(get_zpool_name)
321 }
322
323 atf_test_case bectl_mount cleanup
324 bectl_mount_head()
325 {
326         atf_set "descr" "Check bectl mount/unmount"
327         atf_set "require.user" root
328 }
329 bectl_mount_body()
330 {
331         if [ "$(atf_config_get ci false)" = "true" ] && \
332                 [ "$(uname -p)" = "i386" ]; then
333                 atf_skip "https://bugs.freebsd.org/249055"
334         fi
335
336         if [ "$(atf_config_get ci false)" = "true" ] && \
337                 [ "$(uname -p)" = "armv7" ]; then
338                 atf_skip "https://bugs.freebsd.org/249229"
339         fi
340
341         cwd=$(realpath .)
342         zpool=$(make_zpool_name)
343         disk=${cwd}/disk.img
344         mount=${cwd}/mnt
345         root=${mount}/root
346
347         bectl_create_deep_setup ${zpool} ${disk} ${mount}
348         atf_check mkdir -p ${root}
349         # Test unmount first...
350         atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
351         atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
352         atf_check bectl -r ${zpool}/ROOT unmount default
353         atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
354         # Then umount!
355         atf_check -o not-empty bectl -r ${zpool}/ROOT mount default ${root}
356         atf_check -o not-empty -x "mount | grep '^${zpool}/ROOT/default'"
357         atf_check bectl -r ${zpool}/ROOT umount default
358         atf_check -s not-exit:0 -x "mount | grep '^${zpool}/ROOT/default'"
359 }
360 bectl_mount_cleanup()
361 {
362         bectl_cleanup $(get_zpool_name)
363 }
364
365 atf_test_case bectl_rename cleanup
366 bectl_rename_head()
367 {
368         atf_set "descr" "Check bectl rename"
369         atf_set "require.user" root
370 }
371 bectl_rename_body()
372 {
373         if [ "$(atf_config_get ci false)" = "true" ] && \
374                 [ "$(uname -p)" = "i386" ]; then
375                 atf_skip "https://bugs.freebsd.org/249055"
376         fi
377
378         if [ "$(atf_config_get ci false)" = "true" ] && \
379                 [ "$(uname -p)" = "armv7" ]; then
380                 atf_skip "https://bugs.freebsd.org/249229"
381         fi
382
383         cwd=$(realpath .)
384         zpool=$(make_zpool_name)
385         disk=${cwd}/disk.img
386         mount=${cwd}/mnt
387
388         bectl_create_setup ${zpool} ${disk} ${mount}
389         atf_check bectl -r ${zpool}/ROOT rename default default2
390         atf_check -o not-empty zfs get mountpoint ${zpool}/ROOT/default2
391         atf_check -e not-empty -s not-exit:0 zfs get mountpoint \
392             ${zpool}/ROOT/default
393 }
394 bectl_rename_cleanup()
395 {
396         bectl_cleanup $(get_zpool_name)
397 }
398
399 atf_test_case bectl_jail cleanup
400 bectl_jail_head()
401 {
402         atf_set "descr" "Check bectl rename"
403         atf_set "require.user" root
404         atf_set "require.progs" jail
405 }
406 bectl_jail_body()
407 {
408         if [ "$(atf_config_get ci false)" = "true" ] && \
409                 [ "$(uname -p)" = "i386" ]; then
410                 atf_skip "https://bugs.freebsd.org/249055"
411         fi
412
413         if [ "$(atf_config_get ci false)" = "true" ] && \
414                 [ "$(uname -p)" = "armv7" ]; then
415                 atf_skip "https://bugs.freebsd.org/249229"
416         fi
417
418         cwd=$(realpath .)
419         zpool=$(make_zpool_name)
420         disk=${cwd}/disk.img
421         mount=${cwd}/mnt
422         root=${mount}/root
423
424         if [ ! -f /rescue/rescue ]; then
425                 atf_skip "This test requires a rescue binary"
426         fi
427         bectl_create_deep_setup ${zpool} ${disk} ${mount}
428         # Prepare our minimal BE... plop a rescue binary into it
429         atf_check mkdir -p ${root}
430         atf_check -o ignore bectl -r ${zpool}/ROOT mount default ${root}
431         atf_check mkdir -p ${root}/rescue
432         atf_check cp /rescue/rescue ${root}/rescue/rescue
433         atf_check bectl -r ${zpool}/ROOT umount default
434
435         # Prepare some more boot environments
436         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT create -e default target
437         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT create -e default 1234
438
439         # Attempt to unjail a BE with numeric name; jail_getid at one point
440         # did not validate that the input was a valid jid before returning the
441         # jid.
442         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b 1234
443         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail 1234
444
445         # When a jail name is not explicit, it should match the jail id.
446         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b -o jid=233637 default
447         atf_check -o inline:"233637\n" -s exit:0 -x "jls -j 233637 name"
448         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail default
449
450         # Basic command-mode tests, with and without jail cleanup
451         atf_check -o inline:"rescue\nusr\n" bectl -r ${zpool}/ROOT \
452             jail default /rescue/rescue ls -1
453         atf_check -o inline:"rescue\nusr\n" bectl -r ${zpool}/ROOT \
454             jail -Uo path=${root} default /rescue/rescue ls -1
455         atf_check [ -f ${root}/rescue/rescue ]
456         atf_check bectl -r ${zpool}/ROOT ujail default
457
458         # Batch mode tests
459         atf_check bectl -r ${zpool}/ROOT jail -bo path=${root} default
460         atf_check -o not-empty -x "jls | grep -F \"${root}\""
461         atf_check bectl -r ${zpool}/ROOT ujail default
462         atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
463         # 'unjail' naming
464         atf_check bectl -r ${zpool}/ROOT jail -b default
465         atf_check bectl -r ${zpool}/ROOT unjail default
466         atf_check -s not-exit:0 -x "jls | grep -F \"${root}\""
467         # 'unjail' by BE name. Force bectl to lookup jail id by the BE name.
468         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b default
469         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT jail -b -o name=bectl_test target
470         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail target
471         atf_check -o empty -s exit:0 bectl -r ${zpool}/ROOT unjail default
472         # cannot unjail an unjailed BE (by either command name)
473         atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT ujail default
474         atf_check -e ignore -s not-exit:0 bectl -r ${zpool}/ROOT unjail default
475
476         # set+unset
477         atf_check bectl -r ${zpool}/ROOT jail -b -o path=${root} -u path default
478         # Ensure that it didn't mount at ${root}
479         atf_check -s not-exit:0 -x "mount | grep -F '${root}'"
480         atf_check bectl -r ${zpool}/ROOT ujail default
481 }
482
483 # If a test has failed, it's possible that the boot environment hasn't
484 # been 'unjail'ed. We want to remove the jail before 'bectl_cleanup'
485 # attempts to destroy the zpool.
486 bectl_jail_cleanup()
487 {
488         if [ "$(atf_config_get ci false)" = "true" ] && \
489                 [ "$(uname -p)" = "i386" ]; then
490                 atf_skip "https://bugs.freebsd.org/249055"
491         fi
492
493         if [ "$(atf_config_get ci false)" = "true" ] && \
494                 [ "$(uname -p)" = "armv7" ]; then
495                 atf_skip "https://bugs.freebsd.org/249229"
496         fi
497
498         zpool=$(get_zpool_name)
499         for bootenv in "default" "target" "1234"; do
500                 # mountpoint of the boot environment
501                 mountpoint="$(bectl -r ${zpool}/ROOT list -H | grep ${bootenv} | awk '{print $3}')"
502
503                 # see if any jail paths match the boot environment mountpoint
504                 jailid="$(jls | grep ${mountpoint} | awk '{print $1}')"
505
506                 if [ -z "$jailid" ]; then
507                        continue;
508                 fi
509                 jail -r ${jailid}
510         done;
511
512         bectl_cleanup ${zpool}
513 }
514
515 atf_test_case bectl_promotion cleanup
516 bectl_promotion_head()
517 {
518         atf_set "descr" "Check bectl promotion upon activation"
519         atf_set "require.user" root
520 }
521 bectl_promotion_body()
522 {
523         if [ "$(atf_config_get ci false)" = "true" ] && \
524                 [ "$(uname -p)" = "i386" ]; then
525                 atf_skip "https://bugs.freebsd.org/249055"
526         fi
527
528         if [ "$(atf_config_get ci false)" = "true" ] && \
529                 [ "$(uname -p)" = "armv7" ]; then
530                 atf_skip "https://bugs.freebsd.org/249229"
531         fi
532
533         cwd=$(realpath .)
534         zpool=$(make_zpool_name)
535         disk=${cwd}/disk.img
536         mount=${cwd}/mnt
537         root=${mount}/root
538
539         bectl_create_deep_setup ${zpool} ${disk} ${mount}
540         atf_check mkdir -p ${root}
541
542         # Sleeps interspersed to workaround some naming quirks; notably,
543         # bectl will append a serial if two snapshots were created within
544         # the same second, but it can only do that for the one root it's
545         # operating on.  It won't check that other roots don't have a snapshot
546         # with the same name, and the promotion will fail.
547         atf_check bectl -r ${zpool}/ROOT rename default A
548         sleep 1
549         atf_check bectl -r ${zpool}/ROOT create -r -e A B
550         sleep 1
551         atf_check bectl -r ${zpool}/ROOT create -r -e B C
552
553         # C should be a clone of B to start with
554         atf_check -o not-inline:"-" zfs list -Hr -o origin ${zpool}/ROOT/C
555
556         # Activating it should then promote it all the way out of clone-hood.
557         # This entails two promotes internally, as the first would promote it to
558         # a snapshot of A before finally promoting it the second time out of
559         # clone status.
560         atf_check -o not-empty bectl -r ${zpool}/ROOT activate C
561         atf_check -o inline:"-\n-\n" zfs list -Hr -o origin ${zpool}/ROOT/C
562 }
563 bectl_promotion_cleanup()
564 {
565         bectl_cleanup $(get_zpool_name)
566 }
567
568 atf_test_case bectl_destroy_bootonce cleanup
569 bectl_destroy_bootonce_head()
570 {
571         atf_set "descr" "Check bectl destroy (bootonce)"
572         atf_set "require.user" root
573 }
574 bectl_destroy_bootonce_body()
575 {
576         if [ "$(atf_config_get ci false)" = "true" ] && \
577                 [ "$(uname -p)" = "i386" ]; then
578                 atf_skip "https://bugs.freebsd.org/249055"
579         fi
580
581         if [ "$(atf_config_get ci false)" = "true" ] && \
582                 [ "$(uname -p)" = "armv7" ]; then
583                 atf_skip "https://bugs.freebsd.org/249229"
584         fi
585
586         cwd=$(realpath .)
587         zpool=$(make_zpool_name)
588         disk=${cwd}/disk.img
589         mount=${cwd}/mnt
590         root=${mount}/root
591
592         be=default2
593
594         bectl_create_setup ${zpool} ${disk} ${mount}
595         atf_check -s exit:0 -o empty bectl -r ${zpool}/ROOT create -e default ${be}
596
597         # Create boot environment and bootonce activate it
598         atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT activate -t ${be}
599         atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}:\n" zfsbootcfg -z ${zpool}
600
601         # Destroy it
602         atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT destroy ${be}
603
604         # Should be empty
605         atf_check -s exit:0 -o empty zfsbootcfg -z ${zpool}
606 }
607 bectl_destroy_bootonce_cleanup()
608 {
609         bectl_cleanup $(get_zpool_name)
610 }
611
612 atf_test_case bectl_rename_bootonce cleanup
613 bectl_rename_bootonce_head()
614 {
615         atf_set "descr" "Check bectl destroy (bootonce)"
616         atf_set "require.user" root
617 }
618 bectl_rename_bootonce_body()
619 {
620         if [ "$(atf_config_get ci false)" = "true" ] && \
621                 [ "$(uname -p)" = "i386" ]; then
622                 atf_skip "https://bugs.freebsd.org/249055"
623         fi
624
625         if [ "$(atf_config_get ci false)" = "true" ] && \
626                 [ "$(uname -p)" = "armv7" ]; then
627                 atf_skip "https://bugs.freebsd.org/249229"
628         fi
629
630         cwd=$(realpath .)
631         zpool=$(make_zpool_name)
632         disk=${cwd}/disk.img
633         mount=${cwd}/mnt
634         root=${mount}/root
635
636         be=default2
637
638         bectl_create_setup ${zpool} ${disk} ${mount}
639         atf_check -s exit:0 -o empty bectl -r ${zpool}/ROOT create -e default ${be}
640
641         # Create boot environment and bootonce activate it
642         atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT activate -t ${be}
643         atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}:\n" zfsbootcfg -z ${zpool}
644
645         # Rename it
646         atf_check -s exit:0 -o ignore bectl -r ${zpool}/ROOT rename ${be} ${be}_renamed
647
648         # Should be renamed
649         atf_check -s exit:0 -o inline:"zfs:${zpool}/ROOT/${be}_renamed:\n" zfsbootcfg -z ${zpool}
650 }
651 bectl_rename_bootonce_cleanup()
652 {
653         bectl_cleanup $(get_zpool_name)
654 }
655
656 atf_init_test_cases()
657 {
658         atf_add_test_case bectl_create
659         atf_add_test_case bectl_destroy
660         atf_add_test_case bectl_export_import
661         atf_add_test_case bectl_list
662         atf_add_test_case bectl_mount
663         atf_add_test_case bectl_rename
664         atf_add_test_case bectl_jail
665         atf_add_test_case bectl_promotion
666         atf_add_test_case bectl_destroy_bootonce
667         atf_add_test_case bectl_rename_bootonce
668 }