/tests/zfs-tests/tests/functional/cli_root/zfs_bookmark/zfs_bookmark_cliargs.ksh
https://github.com/adilger/zfs · Korn Shell · 238 lines · 151 code · 20 blank · 67 comment · 3 complexity · 88dfd5a9d59aa19674e55f487452b7d3 MD5 · raw file
- #!/bin/ksh -p
- #
- # CDDL HEADER START
- #
- # The contents of this file are subject to the terms of the
- # Common Development and Distribution License (the "License").
- # You may not use this file except in compliance with the License.
- #
- # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- # or http://www.opensolaris.org/os/licensing.
- # See the License for the specific language governing permissions
- # and limitations under the License.
- #
- # When distributing Covered Code, include this CDDL HEADER in each
- # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- # If applicable, add the following below this CDDL HEADER, with the
- # fields enclosed by brackets "[]" replaced with your own identifying
- # information: Portions Copyright [yyyy] [name of copyright owner]
- #
- # CDDL HEADER END
- #
- #
- # Copyright 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
- # Copyright 2019, 2020 by Christian Schwarz. All rights reserved.
- #
- . $STF_SUITE/include/libtest.shlib
- #
- # DESCRIPTION:
- # 'zfs bookmark' should work with both full and short arguments.
- #
- # STRATEGY:
- # 1. Create initial snapshot
- #
- # 2. Verify we can create a bookmark specifying snapshot and bookmark full paths
- # 3. Verify we can create a bookmark specifying the short snapshot name
- # 4. Verify we can create a bookmark specifying the short bookmark name
- # 5. Verify at least a full dataset path is required and both snapshot and
- # bookmark name must be valid
- #
- # 6. Verify we can copy a bookmark by specifying the source bookmark and new
- # bookmark full paths.
- # 7. Verify we can copy a bookmark specifying the short source name
- # 8. Verify we can copy a bookmark specifying the short new name
- # 9. Verify two short paths are not allowed, and test empty paths
- # 10. Verify we cannot copy a bookmark if the new bookmark already exists
- # 11. Verify that copying a bookmark only works if new and source name
- # have the same dataset
- #
- verify_runnable "both"
- function cleanup
- {
- if snapexists "$DATASET@$TESTSNAP"; then
- log_must zfs destroy "$DATASET@$TESTSNAP"
- fi
- if bkmarkexists "$DATASET#$TESTBM"; then
- log_must zfs destroy "$DATASET#$TESTBM"
- fi
- if bkmarkexists "$DATASET#$TESTBMCOPY"; then
- log_must zfs destroy "$DATASET#$TESTBMCOPY"
- fi
- }
- log_assert "'zfs bookmark' should work only when passed valid arguments."
- log_onexit cleanup
- DATASET="$TESTPOOL/$TESTFS"
- DATASET_TWO="$TESTPOOL/${TESTFS}_two"
- TESTSNAP='snapshot'
- TESTSNAP2='snapshot2'
- TESTBM='bookmark'
- TESTBMCOPY='bookmark_copy'
- # Create initial snapshot
- log_must zfs snapshot "$DATASET@$TESTSNAP"
- #
- # Bookmark creation tests
- #
- # Verify we can create a bookmark specifying snapshot and bookmark full paths
- log_must zfs bookmark "$DATASET@$TESTSNAP" "$DATASET#$TESTBM"
- log_must eval "bkmarkexists $DATASET#$TESTBM"
- log_must zfs destroy "$DATASET#$TESTBM"
- # Verify we can create a bookmark specifying the snapshot name
- log_must zfs bookmark "@$TESTSNAP" "$DATASET#$TESTBM"
- log_must eval "bkmarkexists $DATASET#$TESTBM"
- log_must zfs destroy "$DATASET#$TESTBM"
- # Verify we can create a bookmark specifying the bookmark name
- log_must zfs bookmark "$DATASET@$TESTSNAP" "#$TESTBM"
- log_must eval "bkmarkexists $DATASET#$TESTBM"
- log_must zfs destroy "$DATASET#$TESTBM"
- # Verify at least a full dataset path is required and both snapshot and
- # bookmark name must be valid
- log_mustnot zfs bookmark "@$TESTSNAP" "#$TESTBM"
- log_mustnot zfs bookmark "$TESTSNAP" "#$TESTBM"
- log_mustnot zfs bookmark "@$TESTSNAP" "$TESTBM"
- log_mustnot zfs bookmark "$TESTSNAP" "$TESTBM"
- log_mustnot zfs bookmark "$TESTSNAP" "$DATASET#$TESTBM"
- log_mustnot zfs bookmark "$DATASET" "$TESTBM"
- log_mustnot zfs bookmark "$DATASET@" "$TESTBM"
- log_mustnot zfs bookmark "$DATASET" "#$TESTBM"
- log_mustnot zfs bookmark "$DATASET@" "#$TESTBM"
- log_mustnot zfs bookmark "$DATASET@$TESTSNAP" "$TESTBM"
- log_mustnot zfs bookmark "@" "#$TESTBM"
- log_mustnot zfs bookmark "@" "#"
- log_mustnot zfs bookmark "@$TESTSNAP" "#"
- log_mustnot zfs bookmark "@$TESTSNAP" "$DATASET#"
- log_mustnot zfs bookmark "@$TESTSNAP" "$DATASET"
- log_mustnot zfs bookmark "$TESTSNAP" "$DATASET#"
- log_mustnot zfs bookmark "$TESTSNAP" "$DATASET"
- log_mustnot eval "bkmarkexists $DATASET#$TESTBM"
- # Verify that we can create a bookmarks on another origin filesystem
- log_must zfs clone "$DATASET@$TESTSNAP" "$DATASET_TWO"
- log_must zfs bookmark "$DATASET@$TESTSNAP" "$DATASET_TWO#$TESTBM"
- log_must eval "destroy_dataset $DATASET_TWO"
- # Verify that we can cannot create bookmarks on a non-origin filesystem
- log_must zfs create "$DATASET_TWO"
- log_mustnot_expect "source is not an ancestor of the new bookmark's dataset" zfs bookmark "$DATASET@$TESTSNAP" "$DATASET_TWO#$TESTBM"
- log_must zfs destroy "$DATASET_TWO"
- # Verify that we can create bookmarks of snapshots on the pool dataset
- log_must zfs snapshot "$TESTPOOL@$TESTSNAP"
- log_must zfs bookmark "$TESTPOOL@$TESTSNAP" "$TESTPOOL#$TESTBM"
- log_must zfs destroy "$TESTPOOL#$TESTBM"
- log_must zfs destroy "$TESTPOOL@$TESTSNAP"
- #
- # Bookmark copying tests
- #
- # create the source bookmark
- log_must zfs bookmark "$DATASET@$TESTSNAP" "$DATASET#$TESTBM"
- # Verify we can copy a bookmark by specifying the source bookmark
- # and new bookmark full paths.
- log_must eval "bkmarkexists $DATASET#$TESTBM"
- log_must zfs bookmark "$DATASET#$TESTBM" "$DATASET#$TESTBMCOPY"
- log_must eval "bkmarkexists $DATASET#$TESTBMCOPY"
- ## validate destroy once (should be truly independent bookmarks)
- log_must zfs destroy "$DATASET#$TESTBM"
- log_mustnot eval "bkmarkexists $DATASET#$TESTBM"
- log_must eval "bkmarkexists $DATASET#$TESTBMCOPY"
- log_must zfs destroy "$DATASET#$TESTBMCOPY"
- log_mustnot eval "bkmarkexists $DATASET#$TESTBMCOPY"
- log_mustnot eval "bkmarkexists $DATASET#$TESTBM"
- ## recreate the source bookmark
- log_must zfs bookmark "$DATASET@$TESTSNAP" "$DATASET#$TESTBM"
- # Verify we can copy a bookmark specifying the short source name
- log_must zfs bookmark "#$TESTBM" "$DATASET#$TESTBMCOPY"
- log_must eval "bkmarkexists $DATASET#$TESTBMCOPY"
- log_must zfs destroy "$DATASET#$TESTBMCOPY"
- # Verify we can copy a bookmark specifying the short bookmark name
- log_must zfs bookmark "$DATASET#$TESTBM" "#$TESTBMCOPY"
- log_must eval "bkmarkexists $DATASET#$TESTBMCOPY"
- log_must zfs destroy "$DATASET#$TESTBMCOPY"
- # Verify two short paths are not allowed, and test empty paths
- log_mustnot zfs bookmark "#$TESTBM" "#$TESTBMCOPY"
- log_mustnot zfs bookmark "#$TESTBM" "#"
- log_mustnot zfs bookmark "#" "#$TESTBMCOPY"
- log_mustnot zfs bookmark "#" "#"
- log_mustnot zfs bookmark "#" ""
- log_mustnot zfs bookmark "" "#"
- log_mustnot zfs bookmark "" ""
- # Verify that we can copy bookmarks on another origin filesystem
- log_must zfs clone "$DATASET@$TESTSNAP" "$DATASET_TWO"
- log_must zfs bookmark "$DATASET#$TESTBM" "$DATASET_TWO#$TESTBMCOPY"
- log_must zfs destroy "$DATASET_TWO"
- # Verify that we can cannot create bookmarks on another non-origin filesystem
- log_must zfs create "$DATASET_TWO"
- log_mustnot_expect "source is not an ancestor of the new bookmark's dataset" zfs bookmark "$DATASET#$TESTBM" "$DATASET_TWO#$TESTBMCOPY"
- log_must zfs destroy "$DATASET_TWO"
- # Verify that we can copy bookmarks on the pool dataset
- log_must zfs snapshot "$TESTPOOL@$TESTSNAP"
- log_must zfs bookmark "$TESTPOOL@$TESTSNAP" "$TESTPOOL#$TESTBM"
- log_must zfs bookmark "$TESTPOOL#$TESTBM" "$TESTPOOL#$TESTBMCOPY"
- log_must zfs destroy "$TESTPOOL#$TESTBM"
- log_must zfs destroy "$TESTPOOL#$TESTBMCOPY"
- log_must zfs destroy "$TESTPOOL@$TESTSNAP"
- # Verify that copied 'normal' bookmarks are independent of the source bookmark
- log_must zfs bookmark "$DATASET#$TESTBM" "$DATASET#$TESTBMCOPY"
- log_must zfs destroy "$DATASET#$TESTBM"
- log_must eval "zfs send $DATASET@$TESTSNAP > $TEST_BASE_DIR/zfstest_datastream.$$"
- log_must eval "destroy_dataset $TESTPOOL/$TESTFS/recv"
- log_must eval "zfs recv -o mountpoint=none $TESTPOOL/$TESTFS/recv < $TEST_BASE_DIR/zfstest_datastream.$$"
- log_must zfs snapshot "$DATASET@$TESTSNAP2"
- log_must eval "zfs send -i \#$TESTBMCOPY $DATASET@$TESTSNAP2 > $TEST_BASE_DIR/zfstest_datastream.$$"
- log_must eval "zfs recv $TESTPOOL/$TESTFS/recv < $TEST_BASE_DIR/zfstest_datastream.$$"
- # cleanup
- log_must eval "destroy_dataset $DATASET@$TESTSNAP2"
- log_must zfs destroy "$DATASET#$TESTBMCOPY"
- log_must zfs bookmark "$DATASET@$TESTSNAP" "$DATASET#$TESTBM"
- # Verify that copied redaction bookmarks are independent of the source bookmark
- ## create redaction bookmark
- log_must zfs destroy "$DATASET#$TESTBM"
- log_must zfs destroy "$DATASET@$TESTSNAP"
- log_must eval "echo secret > $TESTDIR/secret"
- log_must zfs snapshot "$DATASET@$TESTSNAP"
- log_must eval "echo redacted > $TESTDIR/secret"
- log_must zfs snapshot "$DATASET@$TESTSNAP2" # TESTSNAP2 is the redaction snapshot
- log_must zfs list -t all -o name,createtxg,guid,mountpoint,written
- log_must zfs redact "$DATASET@$TESTSNAP" "$TESTBM" "$DATASET@$TESTSNAP2"
- # ensure our primitive for testing whether a bookmark is a redaction bookmark works
- log_must eval "zfs get all $DATASET#$TESTBM | grep redact_snaps"
- ## copy the redaction bookmark
- log_must zfs bookmark "$DATASET#$TESTBM" "#$TESTBMCOPY"
- log_mustnot eval "zfs get all $DATASET#$TESTBMCOPY | grep redact_snaps"
- log_must eval "zfs send --redact "$TESTBMCOPY" -i $DATASET@$TESTSNAP $DATASET@$TESTSNAP2 2>&1 | head -n 100 | grep 'not a redaction bookmark'"
- # try the above again after destroying the source bookmark, preventive measure for future work
- log_must zfs destroy "$DATASET#$TESTBM"
- log_mustnot eval "zfs get all $DATASET#$TESTBMCOPY | grep redact_snaps"
- log_must eval "zfs send --redact "$TESTBMCOPY" -i $DATASET@$TESTSNAP $DATASET@$TESTSNAP2 2>&1 | head -n 100 | grep 'not a redaction bookmark'"
- ## cleanup
- log_must eval "destroy_dataset $DATASET@$TESTSNAP2"
- log_must zfs destroy "$DATASET#$TESTBMCOPY"
- log_must eval "destroy_dataset $DATASET@$TESTSNAP"
- log_must zfs snapshot "$DATASET@$TESTSNAP"
- log_must zfs bookmark "$DATASET@$TESTSNAP" "$DATASET#$TESTBM"
- log_pass "'zfs bookmark' works as expected"