diff options
author | John Wren Kennedy <john.kennedy@delphix.com> | 2012-12-05 22:04:50 -0500 |
---|---|---|
committer | Richard Lowe <richlowe@richlowe.net> | 2012-12-07 19:37:53 -0500 |
commit | d583b39bfb4e2571d3e41097c5c357ffe353ad45 (patch) | |
tree | 2be8d2b56579c537563ac4ab3d923374c889210e /usr | |
parent | 7646c8f36bab39004fcffc7287250ea06924088e (diff) | |
download | illumos-joyent-d583b39bfb4e2571d3e41097c5c357ffe353ad45.tar.gz |
3311 Want a test framework for arbitrary OS unit tests
3312 Add a testrunner package for OS unit tests
3313 Add a testrunner package to convert ZFS tests from STF
Reviewed by: Matt Ahrens <matthew.ahrens@delphix.com>
Reviewed by: Will Guyette <will.guyette@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Henrik Mattson <henrik.mattson@delphix.com>
Reviewed by: Sonu Pillai <sonu.pillai@delphix.com>
Reviewed by: Christopher Siden <chris.siden@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr')
681 files changed, 58678 insertions, 1 deletions
diff --git a/usr/src/Makefile b/usr/src/Makefile index c9cccb4502..722fa72f8a 100644 --- a/usr/src/Makefile +++ b/usr/src/Makefile @@ -18,9 +18,12 @@ # # CDDL HEADER END # + # # Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012 by Delphix. All rights reserved. # + # # Makefile for system source # @@ -31,7 +34,7 @@ include Makefile.master # it defines TARGETDIRS and ROOTDIRS. include Targetdirs -COMMON_SUBDIRS= uts lib cmd ucblib ucbcmd psm man +COMMON_SUBDIRS= uts lib cmd ucblib ucbcmd psm man test sparc_SUBDIRS= stand i386_SUBDIRS= grub diff --git a/usr/src/Makefile.lint b/usr/src/Makefile.lint index 5cb986e614..6c8b973928 100644 --- a/usr/src/Makefile.lint +++ b/usr/src/Makefile.lint @@ -469,6 +469,7 @@ COMMON_SUBDIRS = \ lib/udapl \ lib/watchmalloc \ psm \ + test \ ucbcmd/basename \ ucbcmd/biff \ ucbcmd/echo \ diff --git a/usr/src/pkg/manifests/system-test-ostest.mf b/usr/src/pkg/manifests/system-test-ostest.mf new file mode 100644 index 0000000000..bbf2500a07 --- /dev/null +++ b/usr/src/pkg/manifests/system-test-ostest.mf @@ -0,0 +1,33 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +set name=pkg.fmri value=pkg:/system/test/ostest@$(PKGVERS) +set name=pkg.description value="Miscellaneous OS Unit Tests" +set name=pkg.summary value="OS Unit Test Suite" +set name=info.classification \ + value=org.opensolaris.category.2008:Development/System +set name=variant.arch value=$(ARCH) +dir path=opt/os-tests +dir path=opt/os-tests/bin +dir path=opt/os-tests/runfiles +dir path=opt/os-tests/tests +file path=opt/os-tests/README mode=0444 +file path=opt/os-tests/bin/ostest mode=0555 +file path=opt/os-tests/runfiles/delphix.run mode=0444 +file path=opt/os-tests/runfiles/openindiana.run mode=0444 +file path=opt/os-tests/tests/poll_test mode=0555 +license cr_Sun license=cr_Sun +license lic_CDDL license=lic_CDDL +depend fmri=system/test/testrunner type=require diff --git a/usr/src/pkg/manifests/system-test-testrunner.mf b/usr/src/pkg/manifests/system-test-testrunner.mf new file mode 100644 index 0000000000..b6fbfb6309 --- /dev/null +++ b/usr/src/pkg/manifests/system-test-testrunner.mf @@ -0,0 +1,36 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +set name=pkg.fmri value=pkg:/system/test/testrunner@$(PKGVERS) +set name=pkg.description value="Test Runner" +set name=pkg.summary value="Unit Test Framework" +set name=info.classification \ + value=org.opensolaris.category.2008:Development/System +set name=variant.arch value=$(ARCH) +dir path=opt/test-runner +dir path=opt/test-runner/bin +dir path=opt/test-runner/man +dir path=opt/test-runner/man/man1 +dir path=opt/test-runner/stf +dir path=opt/test-runner/stf/contrib +dir path=opt/test-runner/stf/contrib/include +dir path=opt/test-runner/stf/include +file path=opt/test-runner/bin/run mode=0555 +file path=opt/test-runner/man/man1/run.1 mode=0444 +file path=opt/test-runner/stf/contrib/include/logapi.shlib mode=0555 +file path=opt/test-runner/stf/include/stf.shlib mode=0555 +license cr_Sun license=cr_Sun +license lic_CDDL license=lic_CDDL +depend fmri=security/sudo type=require diff --git a/usr/src/pkg/manifests/system-test-zfstest.mf b/usr/src/pkg/manifests/system-test-zfstest.mf new file mode 100644 index 0000000000..7c5beaec2b --- /dev/null +++ b/usr/src/pkg/manifests/system-test-zfstest.mf @@ -0,0 +1,1401 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +set name=pkg.fmri value=pkg:/system/test/zfstest@$(PKGVERS) +set name=pkg.description value="ZFS Test Suite" +set name=pkg.summary value="ZFS Functional and Stress Tests" +set name=info.classification \ + value=org.opensolaris.category.2008:Development/System +set name=variant.arch value=$(ARCH) +dir path=opt/zfs-tests +dir path=opt/zfs-tests/bin +dir path=opt/zfs-tests/include +dir path=opt/zfs-tests/runfiles +dir path=opt/zfs-tests/tests +dir path=opt/zfs-tests/tests/functional +dir path=opt/zfs-tests/tests/functional/acl +dir path=opt/zfs-tests/tests/functional/acl/cifs +dir path=opt/zfs-tests/tests/functional/acl/nontrivial +dir path=opt/zfs-tests/tests/functional/acl/trivial +dir path=opt/zfs-tests/tests/functional/atime +dir path=opt/zfs-tests/tests/functional/bootfs +dir path=opt/zfs-tests/tests/functional/cli_root +dir path=opt/zfs-tests/tests/functional/cli_root/zdb +dir path=opt/zfs-tests/tests/functional/cli_root/zfs +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_clone +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_copies +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_create +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_get +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_inherit +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_mount +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_promote +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_property +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_receive +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_rename +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_reservation +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_rollback +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_send +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_set +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_share +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_unshare +dir path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade +dir path=opt/zfs-tests/tests/functional/cli_root/zpool +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_add +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_attach +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_clear +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_create +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_destroy +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_detach +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_expand +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_export +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_get +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_history +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_import +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_offline +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_online +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_remove +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_replace +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_scrub +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_set +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_status +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade +dir path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles +dir path=opt/zfs-tests/tests/functional/nopwrite +dir path=opt/zfs-tests/tests/functional/truncate +file path=opt/zfs-tests/README mode=0444 +file path=opt/zfs-tests/bin/chg_usr_exec mode=0555 +file path=opt/zfs-tests/bin/devname2devid mode=0555 +file path=opt/zfs-tests/bin/dir_rd_update mode=0555 +file path=opt/zfs-tests/bin/file_check mode=0555 +file path=opt/zfs-tests/bin/file_trunc mode=0555 +file path=opt/zfs-tests/bin/file_write mode=0555 +file path=opt/zfs-tests/bin/largest_file mode=0555 +file path=opt/zfs-tests/bin/mkbusy mode=0555 +file path=opt/zfs-tests/bin/mktree mode=0555 +file path=opt/zfs-tests/bin/mmapwrite mode=0555 +file path=opt/zfs-tests/bin/randfree_file mode=0555 +file path=opt/zfs-tests/bin/readmmap mode=0555 +file path=opt/zfs-tests/bin/rename_dir mode=0555 +file path=opt/zfs-tests/bin/rm_lnkcnt_zero_file mode=0555 +file path=opt/zfs-tests/bin/zfstest mode=0555 +file path=opt/zfs-tests/include/commands.cfg mode=0555 +file path=opt/zfs-tests/include/default.cfg mode=0555 +file path=opt/zfs-tests/include/libtest.shlib mode=0555 +file path=opt/zfs-tests/include/math.shlib mode=0555 +file path=opt/zfs-tests/include/properties.shlib mode=0555 +file path=opt/zfs-tests/runfiles/delphix.run mode=0444 +file path=opt/zfs-tests/runfiles/openindiana.run mode=0444 +file path=opt/zfs-tests/tests/functional/acl/acl.cfg mode=0555 +file path=opt/zfs-tests/tests/functional/acl/acl_common.kshlib mode=0555 +file path=opt/zfs-tests/tests/functional/acl/cifs/cifs.kshlib mode=0555 +file path=opt/zfs-tests/tests/functional/acl/cifs/cifs_attr_001_pos mode=0555 +file path=opt/zfs-tests/tests/functional/acl/cifs/cifs_attr_002_pos mode=0555 +file path=opt/zfs-tests/tests/functional/acl/cifs/cifs_attr_003_pos mode=0555 +file path=opt/zfs-tests/tests/functional/acl/cifs/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/acl/cifs/setup mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/setup mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_aclmode_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_compact_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_delete_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_002_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_owner_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwacl_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_xattr_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_xattr_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cp_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cp_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cpio_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cpio_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_find_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_ls_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_mv_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_tar_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_tar_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/setup mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_chmod_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_compress_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_002_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_003_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_find_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_find_002_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_ls_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_ls_002_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_mv_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_pack_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_004_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_005_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_006_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_tar_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/acl/trivial/zfs_acl_tar_002_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/atime/atime.cfg mode=0555 +file path=opt/zfs-tests/tests/functional/atime/atime_001_pos mode=0555 +file path=opt/zfs-tests/tests/functional/atime/atime_002_neg mode=0555 +file path=opt/zfs-tests/tests/functional/atime/atime_common.kshlib mode=0555 +file path=opt/zfs-tests/tests/functional/atime/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/atime/setup mode=0555 +file path=opt/zfs-tests/tests/functional/bootfs/bootfs_001_pos mode=0555 +file path=opt/zfs-tests/tests/functional/bootfs/bootfs_002_neg mode=0555 +file path=opt/zfs-tests/tests/functional/bootfs/bootfs_003_pos mode=0555 +file path=opt/zfs-tests/tests/functional/bootfs/bootfs_004_neg mode=0555 +file path=opt/zfs-tests/tests/functional/bootfs/bootfs_005_neg mode=0555 +file path=opt/zfs-tests/tests/functional/bootfs/bootfs_006_pos mode=0555 +file path=opt/zfs-tests/tests/functional/bootfs/bootfs_007_neg mode=0555 +file path=opt/zfs-tests/tests/functional/bootfs/bootfs_008_neg mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/cli_common.kshlib mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zdb/zdb_001_neg mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs/zfs_001_neg mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs/zfs_002_pos mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs/zfs_003_neg mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_004_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_005_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_006_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_007_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_008_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_009_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_010_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.cfg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_004_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_005_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_006_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_create/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_create/properties.kshlib \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_create/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_005_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_006_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_007_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_008_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_009_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_010_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_011_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_012_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_013_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_005_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_006_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_007_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_008_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_009_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_010_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_011_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_012_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_013_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_014_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_015_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_016_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_004_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_005_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_006_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_007_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_008_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_009_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_010_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_inherit/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_inherit/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_001_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_002_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.cfg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_004_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_005_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_006_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_007_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_008_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_009_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_010_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_011_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_005_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_006_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_007_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_008_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_property/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_property/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_004_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_005_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_006_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_007_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_008_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_009_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.cfg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_004_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_005_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_006_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_007_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_008_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_009_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_010_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_011_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_012_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_013_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_reservation/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_reservation/setup \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_rollback/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_rollback/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_003_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_004_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_send/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_send/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send.cfg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_004_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_005_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_006_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/cache_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/cache_002_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/canmount_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/canmount_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/canmount_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/canmount_004_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/checksum_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/compression_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/onoffs_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_set/property_alias_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/readonly_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/reservation_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/ro_props_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/share_mount_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/snapdir_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_set/user_property_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_set/user_property_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_set/user_property_003_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_set/user_property_004_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/version_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_002_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_003_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share.cfg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_004_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_005_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_006_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_007_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_008_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_009_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_010_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_011_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_001_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_002_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_003_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_004_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_005_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_006_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_007_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_008_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_009_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_005_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_006_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_007_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_008_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_009_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_all_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_unshare/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_unshare/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_004_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_005_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_005_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_006_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_007_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool/zpool_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool/zpool_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool/zpool_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.cfg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.kshlib \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_004_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_005_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_006_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_007_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_008_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_009_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_attach/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_attach/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_attach/zpool_attach_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_clear/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_clear/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_002_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_003_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_create/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_create/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.shlib \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_005_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_006_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_007_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_008_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_009_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_010_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_011_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_012_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_013_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_014_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_015_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_016_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_017_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_018_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_019_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_020_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_021_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_022_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_023_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_004_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_003_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_detach/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_detach/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_detach/zpool_detach_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_expand/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_expand/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_003_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_export/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_export/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_003_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_004_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_get/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_get/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get.cfg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_004_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_history/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_history/setup \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_001_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/unclean_export.dat.bz2 \ + mode=0444 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_import/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_import/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_005_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_006_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_007_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_008_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_009_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_010_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_011_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_012_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_013_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_all_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_002_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_rename_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_offline/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_offline/setup \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_002_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_online/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_online/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_002_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_remove/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_remove/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_001_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_003_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_replace/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_replace/setup \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_replace/zpool_replace_001_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_scrub/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_scrub/setup mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_001_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_005_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_001_pos \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_002_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_003_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_status/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_status/setup mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v10.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v11.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v12.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v13.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v14.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v15.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz21.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz22.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz23.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe1.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe2.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe3.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v4.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v6.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v7.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v8.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v9.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v999.dat.bz2 \ + mode=0444 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-vBROKEN.dat.bz2 \ + mode=0444 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/cleanup \ + mode=0555 +file path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/setup \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.cfg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_001_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_002_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_003_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_004_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_005_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_006_neg \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_007_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_008_pos \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_009_neg \ + mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite.shlib mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_copies mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_mtime mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_negative mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_promoted_clone \ + mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_recsize mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_sync mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_varying_compression \ + mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/nopwrite_volume mode=0555 +file path=opt/zfs-tests/tests/functional/nopwrite/setup mode=0555 +file path=opt/zfs-tests/tests/functional/truncate/cleanup mode=0555 +file path=opt/zfs-tests/tests/functional/truncate/setup mode=0555 +file path=opt/zfs-tests/tests/functional/truncate/truncate.cfg mode=0555 +file path=opt/zfs-tests/tests/functional/truncate/truncate_001_pos mode=0555 +file path=opt/zfs-tests/tests/functional/truncate/truncate_002_pos mode=0555 +license cr_Sun license=cr_Sun +license lic_CDDL license=lic_CDDL +depend fmri=system/file-system/zfs/tests type=require +depend fmri=system/test/testrunner type=require diff --git a/usr/src/test/Makefile b/usr/src/test/Makefile new file mode 100644 index 0000000000..53740cb557 --- /dev/null +++ b/usr/src/test/Makefile @@ -0,0 +1,20 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +SUBDIRS = os-tests test-runner zfs-tests + +include Makefile.com diff --git a/usr/src/test/Makefile.com b/usr/src/test/Makefile.com new file mode 100644 index 0000000000..aabe39d22b --- /dev/null +++ b/usr/src/test/Makefile.com @@ -0,0 +1,35 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +all := TARGET = all +install := TARGET = install +clean := TARGET = clean +clobber := TARGET = clobber +lint := TARGET = lint + +.KEEP_STATE: + +all clean clobber install lint: $(SUBDIRS) + +lint_PROG: + $(LINT.c) $(PROG).c $(LDLIBS) + +lint_SRCS: + $(LINT.c) $(SRCS) $(LDLIBS) + +$(SUBDIRS): FRC + @cd $@; pwd; $(MAKE) $(TARGET) + +FRC: diff --git a/usr/src/test/os-tests/Makefile b/usr/src/test/os-tests/Makefile new file mode 100644 index 0000000000..74df70ba50 --- /dev/null +++ b/usr/src/test/os-tests/Makefile @@ -0,0 +1,20 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +SUBDIRS = cmd runfiles tests doc + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/os-tests/cmd/Makefile b/usr/src/test/os-tests/cmd/Makefile new file mode 100644 index 0000000000..29745f1213 --- /dev/null +++ b/usr/src/test/os-tests/cmd/Makefile @@ -0,0 +1,37 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master +include $(SRC)/test/Makefile.com + +ROOTOPTPKG = $(ROOT)/opt/os-tests +ROOTBIN = $(ROOTOPTPKG)/bin + +PROGS = ostest + +CMDS = $(PROGS:%=$(ROOTBIN)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(ROOTBIN) + +$(ROOTBIN): + $(INS.dir) + +$(ROOTBIN)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/os-tests/cmd/ostest.ksh b/usr/src/test/os-tests/cmd/ostest.ksh new file mode 100644 index 0000000000..2f3bcec218 --- /dev/null +++ b/usr/src/test/os-tests/cmd/ostest.ksh @@ -0,0 +1,54 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export OS_TESTS="/opt/os-tests" +runner="/opt/test-runner/bin/run" + +function fail +{ + echo $1 + exit ${2:-1} +} + +function find_runfile +{ + typeset distro= + if [[ -d /opt/delphix && -h /etc/delphix/version ]]; then + distro=delphix + elif [[ 0 -ne $(grep -c OpenIndiana /etc/release 2>/dev/null) ]]; then + distro=openindiana + fi + + [[ -n $distro ]] && echo $OS_TESTS/runfiles/$distro.run +} + +while getopts c: c; do + case $c in + 'c') + runfile=$OPTARG + [[ -f $runfile ]] || fail "Cannot read file: $runfile" + ;; + esac +done +shift $((OPTIND - 1)) + +[[ -z $runfile ]] && runfile=$(find_runfile) +[[ -z $runfile ]] && fail "Couldn't determine distro" + +$runner -c $runfile + +exit $? diff --git a/usr/src/test/os-tests/doc/Makefile b/usr/src/test/os-tests/doc/Makefile new file mode 100644 index 0000000000..31631a017b --- /dev/null +++ b/usr/src/test/os-tests/doc/Makefile @@ -0,0 +1,35 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +READMES = README + +ROOTOPTPKG = $(ROOT)/opt/os-tests + +FILES = $(READMES:%=$(ROOTOPTPKG)/%) +$(FILES) := FILEMODE = 0444 + +all: $(READMES) + +install: $(ROOTOPTPKG) $(FILES) + +clean lint clobber: + +$(ROOTOPTPKG): + $(INS.dir) + +$(ROOTOPTPKG)/%: % + $(INS.file) diff --git a/usr/src/test/os-tests/doc/README b/usr/src/test/os-tests/doc/README new file mode 100644 index 0000000000..e7d0b3f527 --- /dev/null +++ b/usr/src/test/os-tests/doc/README @@ -0,0 +1,59 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +OS Unit Test Suite README + +1. Building and installing the OS Unit Test Suite +2. Running the OS Unit Test Suite +3. Test results + +-------------------------------------------------------------------------------- + +1. Building and installing the OS Unit Test Suite + +The OS Unit Test Suite runs under the testrunner framework (which can be +installed as pkg:/system/test/testrunner). To build both the OS Unit Test Suite +and the testrunner without running a full nightly: + + build_machine$ bldenv [-d] <your_env_file> + build_machine$ cd $SRC/test + build_machine$ dmake install + build_machine$ cd $SRC/pkg + build_machine$ dmake install + +Then set the publisher on the test machine to point to your repository and +install the OS Unit Test Suite. + + test_machine# pkg install pkg:/system/test/zfstest + +Note, the framework will be installed automatically, as the OS Unit Test Suite +depends on it. + +2. Running the OS Unit Test Suite + +The pre-requisites for running the OS Unit Test Suite are: + - A non-root user with the ability to sudo(1M) to root without a + password or the root user must run the test. + +Once the pre-requisites are satisfied, simply run the ostest script: + + test_machine$ /opt/os-tests/bin/ostest + +3. Test results + +While the OS Unit Test Suite is running, one informational line is printed at +the end of each test, and a results summary is printed at the end of the run. +The results summary includes the location of the complete logs, which is of the +form /var/tmp/test_results/<ISO 8601 date>. diff --git a/usr/src/test/os-tests/runfiles/Makefile b/usr/src/test/os-tests/runfiles/Makefile new file mode 100644 index 0000000000..9b69928d8d --- /dev/null +++ b/usr/src/test/os-tests/runfiles/Makefile @@ -0,0 +1,39 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +SRCS = delphix.run \ + openindiana.run + +ROOTOPTPKG = $(ROOT)/opt/os-tests +RUNFILES = $(ROOTOPTPKG)/runfiles + +CMDS = $(SRCS:%=$(RUNFILES)/%) +$(CMDS) := FILEMODE = 0444 + +all: $(SRCS) + +install: $(CMDS) + +clean lint clobber: + +$(CMDS): $(RUNFILES) $(SRCS) + +$(RUNFILES): + $(INS.dir) + +$(RUNFILES)/%: % + $(INS.file) diff --git a/usr/src/test/os-tests/runfiles/delphix.run b/usr/src/test/os-tests/runfiles/delphix.run new file mode 100644 index 0000000000..abded0e67b --- /dev/null +++ b/usr/src/test/os-tests/runfiles/delphix.run @@ -0,0 +1,26 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +[DEFAULT] +pre = +verbose = False +quiet = False +user = root +timeout = 60 +post = +outputdir = /var/tmp/test_results + +[/opt/os-tests/tests/poll_test] + diff --git a/usr/src/test/os-tests/runfiles/openindiana.run b/usr/src/test/os-tests/runfiles/openindiana.run new file mode 100644 index 0000000000..abded0e67b --- /dev/null +++ b/usr/src/test/os-tests/runfiles/openindiana.run @@ -0,0 +1,26 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +[DEFAULT] +pre = +verbose = False +quiet = False +user = root +timeout = 60 +post = +outputdir = /var/tmp/test_results + +[/opt/os-tests/tests/poll_test] + diff --git a/usr/src/test/os-tests/tests/Makefile b/usr/src/test/os-tests/tests/Makefile new file mode 100644 index 0000000000..4c556c13a1 --- /dev/null +++ b/usr/src/test/os-tests/tests/Makefile @@ -0,0 +1,18 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +SUBDIRS = poll + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/os-tests/tests/poll/Makefile b/usr/src/test/os-tests/tests/poll/Makefile new file mode 100644 index 0000000000..5e2d6e8ad9 --- /dev/null +++ b/usr/src/test/os-tests/tests/poll/Makefile @@ -0,0 +1,57 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/cmd/Makefile.cmd +include $(SRC)/test/Makefile.com + +PROG = poll_test +OBJS = $(PROG:%=%.o) +SRCS = $(OBJS:%.o=%.c) + +LDLIBS += -lsocket +C99MODE = -xc99=%all + +ROOTOPTPKG = $(ROOT)/opt/os-tests +TESTDIR = $(ROOTOPTPKG)/tests + +CMDS = $(PROG:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all: $(PROG) + +$(PROG): $(OBJS) + $(LINK.c) $(OBJS) -o $@ $(LDLIBS) + $(POST_PROCESS) + +%.o: ../%.c + $(COMPILE.c) $< + +install: all $(CMDS) + +lint: lint_SRCS + +clobber: clean + -$(RM) $(PROG) + +clean: + -$(RM) $(OBJS) + +$(CMDS): $(TESTDIR) $(PROG) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) diff --git a/usr/src/test/os-tests/tests/poll/poll_test.c b/usr/src/test/os-tests/tests/poll/poll_test.c new file mode 100644 index 0000000000..c242d5ef29 --- /dev/null +++ b/usr/src/test/os-tests/tests/poll/poll_test.c @@ -0,0 +1,559 @@ +/* + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <fcntl.h> +#include <pthread.h> +#include <assert.h> +#include <errno.h> +#include <ctype.h> +#include <unistd.h> +#include <poll.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <sys/stat.h> +#include <sys/socket.h> +#include <sys/devpoll.h> + +/* + * poll_test.c -- + * + * This file implements some simple tests to verify the behavior of the + * poll system call and the DP_POLL ioctl on /dev/poll. + * + * Background: + * + * Several customers recently ran into an issue where threads in grizzly + * (java http server implementation) would randomly wake up from a java + * call to select against a java.nio.channels.Selector with no events ready + * but well before the specified timeout expired. The + * java.nio.channels.Selector select logic is implemented via /dev/poll. + * The selector opens /dev/poll, writes the file descriptors it wants to + * select on to the file descritpor, and then issues a DP_POLL ioctl to + * wait for events to be ready. + * + * The DP_POLL ioctl arguments include a relative timeout in milliseconds, + * according to man poll.7d the ioctl should block until events are ready, + * the timeout expires, or a signal was received. In this case we noticed + * that DP_POLL was returning before the timeout expired despite no events + * being ready and no signal being delivered. + * + * Using dtrace we discovered that DP_POLL was returning in cases where the + * system time was changed and the thread calling DP_POLL was woken up as + * a result of the process forking. The DP_POLL logic was in a loop + * checking if events were ready and then calling cv_waituntil_sig to + * block. cv_waituntil_sig will return -1 if the system time has changed, + * causing the DP_POLL to complete prematurely. + * + * Looking at the code it turns out the same problem exists in + * the implementation for poll.2 as well. + * + * Fix: + * + * The fix changes dpioctl and poll_common to use cv_relwaituntil_sig + * rather then cv_waituntil_sig. cv_reltimedwait_sig expects a + * relative timeout rather then an absolute timeout, so we avoid the + * problem. + * + * Test: + * + * The test verifies that changing the date does not wake up threads + * blocked processing a poll request or a DP_POLL ioctl. The test spawns + * one thread that changes the date and forks (to force the threads to + * wakeup from cv_reltimedwait_sig) every two seconds. The test spawns + * a second thread that issues poll / DP_POLL on an fd set that will + * never have events ready and verifies that it does not return until + * the specified timeout expires. + */ + +/* + * The maximum amount of skew in seconds allowed between the + * expected an actual time that a test takes. + */ +#define TIME_DRIFT 1 + +static pthread_mutex_t exitLock = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t exitCond = PTHREAD_COND_INITIALIZER; +static int terminated = 0; + +/* + * Set via -d to enable debug logging + */ +static int debug = 0; + +static void +debug_log(const char *format, ...) +{ + va_list args; + + if (!debug) { + return; + } + + (void) printf("DEBUG: "); + + va_start(args, format); + (void) vprintf(format, args); + va_end(args); +} + +static void +test_start(const char *testName, const char *format, ...) +{ + va_list args; + + (void) printf("TEST STARTING %s: ", testName); + + va_start(args, format); + (void) vprintf(format, args); + va_end(args); + (void) fflush(stdout); +} + +static void +test_failed(const char *testName, const char *format, ...) +{ + va_list args; + + (void) printf("TEST FAILED %s: ", testName); + + va_start(args, format); + (void) vprintf(format, args); + va_end(args); + + (void) exit(-1); +} + +static void +test_passed(const char *testName) +{ + (void) printf("TEST PASS: %s\n", testName); + (void) fflush(stdout); +} + +static int +check_time(time_t elapsed, time_t expected) +{ + time_t diff = expected - elapsed; + + /* + * We may take slightly more or less time then expected, + * we allow for a small fudge factor if things completed + * before we expect them to. + */ + return (elapsed >= expected || diff <= TIME_DRIFT); +} + +static int +poll_wrapper(pollfd_t *fds, nfds_t nfds, int timeout, time_t *elapsed) +{ + int ret; + time_t start = time(NULL); + + debug_log("POLL start: (0x%p, %d, %d)\n", fds, nfds, timeout); + + ret = poll(fds, nfds, timeout); + + *elapsed = time(NULL) - start; + + debug_log("POLL end: (0x%p, %d, %d) returns %d (elapse=%d)\n", + fds, nfds, timeout, ret, (*elapsed)); + + return (ret); +} + +static int +dppoll(int pollfd, pollfd_t *fds, nfds_t nfds, int timeout, time_t *elapsed) +{ + struct dvpoll arg; + int ret; + time_t start = time(NULL); + + arg.dp_fds = fds; + arg.dp_nfds = nfds; + arg.dp_timeout = timeout; + + debug_log("DP_POLL start: (0x%p, %d, %d)\n", fds, nfds, timeout); + + ret = ioctl(pollfd, DP_POLL, &arg); + + *elapsed = time(NULL) - start; + + debug_log("DP_POLL end: (0x%p, %d, %d) returns %d (elapse=%d)\n", + fds, arg.dp_nfds, arg.dp_timeout, ret, (*elapsed)); + + return (ret); +} + +static void +clear_fd(const char *testName, int pollfd, int testfd) +{ + int ret; + pollfd_t fd; + + fd.fd = testfd; + fd.events = POLLREMOVE; + fd.revents = 0; + + ret = write(pollfd, &fd, sizeof (pollfd_t)); + + if (ret != sizeof (pollfd_t)) { + if (ret < 0) { + test_failed(testName, "Failed to clear fd %d: %s", + testfd, strerror(ret)); + } + + + test_failed(testName, "Failed to clear fd %d: %d", testfd, ret); + } +} + +/* + * TEST: poll with no FDs set, verify we wait the appropriate amount of time. + */ +static void +poll_no_fd_test(void) +{ + const char *testName = __func__; + time_t elapsed; + int timeout = 10; + int ret; + + test_start(testName, "poll for %d sec with no fds\n", timeout); + + ret = poll_wrapper(NULL, 0, timeout * 1000, &elapsed); + + if (ret != 0) { + test_failed(testName, "POLL returns %d (expected 0)\n", ret); + } + + if (!check_time(elapsed, timeout)) { + test_failed(testName, "took %d (expected %d)\n", + elapsed, timeout); + } + + test_passed(testName); +} + +/* + * TEST: POLL with a valid FD set, verify that we wait the appropriate amount + * of time. + */ +static void +poll_with_fds_test(int testfd) +{ + const char *testName = __func__; + time_t elapsed; + int timeout = 10; + int ret; + pollfd_t fd; + + fd.fd = testfd; + fd.events = 0; + fd.revents = 0; + + test_start(testName, "poll for %d sec with fds\n", timeout); + + ret = poll_wrapper(&fd, 1, timeout * 1000, &elapsed); + + if (ret != 0) { + test_failed(testName, "POLL returns %d (expected 0)\n", ret); + } + + if (!check_time(elapsed, timeout)) { + test_failed(testName, "took %d (expected %d)\n", + elapsed, timeout); + } + + test_passed(testName); +} + +/* + * TEST: DP_POLL with no FDs set, verify we wait the appropriate + * amount of time. + */ +static void +dev_poll_no_fd_test(int pollfd) +{ + const char *testName = __func__; + time_t elapsed; + int timeout = 10; + int ret; + + test_start(testName, "poll for %d sec with no fds\n", timeout); + + ret = dppoll(pollfd, NULL, 0, timeout * 1000, &elapsed); + + if (ret != 0) { + test_failed(testName, "DP_POLL returns %d (expected 0)\n", ret); + } + + if (!check_time(elapsed, timeout)) { + test_failed(testName, "took %d (expected %d)\n", + elapsed, timeout); + } + + test_passed(testName); +} + +/* + * TEST: DP_POLL with a valid FD set, verify that we wait + * the appropriate amount of time. + */ +static void +dev_poll_with_fds_test(int pollfd, int testfd) +{ + const char *testName = __func__; + time_t elapsed; + int timeout = 10; + int ret; + pollfd_t fds[5]; + + test_start(testName, "poll for %d sec with fds\n", timeout); + + /* + * Clear the FD in case it's already in the cached set + */ + clear_fd(testName, pollfd, testfd); + + /* + * Add the FD with POLLIN + */ + fds[0].fd = testfd; + fds[0].events = POLLIN; + fds[0].revents = 0; + + ret = write(pollfd, fds, sizeof (pollfd_t)); + + if (ret != sizeof (pollfd_t)) { + if (ret < 0) { + test_failed(testName, "Failed to set fds: %s", + strerror(ret)); + } + + test_failed(testName, "Failed to set fds: %d", ret); + } + + ret = dppoll(pollfd, fds, 5, timeout * 1000, &elapsed); + + if (ret != 0) { + test_failed(testName, "DP_POLL returns %d (expected 0)\n", ret); + } + + if (!check_time(elapsed, timeout)) { + test_failed(testName, "took %d (expected %d)\n", + elapsed, timeout); + } + + clear_fd(testName, pollfd, testfd); + + test_passed(testName); +} + +/* ARGSUSED */ +static void * +poll_thread(void *data) +{ + int pollfd; + int testfd; + + pollfd = open("/dev/poll", O_RDWR); + + if (pollfd < 0) { + perror("Failed to open /dev/poll: "); + exit(-1); + } + + /* + * Create a dummy FD that will never have POLLIN set + */ + testfd = socket(PF_INET, SOCK_STREAM, 0); + + poll_no_fd_test(); + poll_with_fds_test(testfd); + + dev_poll_no_fd_test(pollfd); + dev_poll_with_fds_test(pollfd, testfd); + + (void) close(testfd); + (void) close(pollfd); + + pthread_exit(0); + return (NULL); +} + +/* + * This function causes any threads blocked in cv_timedwait_sig_hires + * to wakeup, which allows us to test how dpioctl handles spurious + * wakeups. + */ +static void +trigger_wakeup(void) +{ + pid_t child; + + /* + * Forking will force all of the threads to be woken up so + * they can be moved to a well known state. + */ + child = vfork(); + + if (child == -1) { + perror("Fork failed: "); + exit(-1); + } else if (child == 0) { + _exit(0); + } else { + pid_t result = -1; + int status; + + do { + result = waitpid(child, &status, 0); + + if (result == -1 && errno != EINTR) { + (void) printf("Waitpid for %ld failed: %s\n", + child, strerror(errno)); + exit(-1); + } + } while (result != child); + + if (status != 0) { + (void) printf("Child pid %ld failed: %d\n", + child, status); + exit(-1); + } + } +} + +/* + * This function changes the system time, which has the side + * effect of updating timechanged in the kernel. + */ +static void +change_date(void) +{ + int ret; + struct timeval tp; + + ret = gettimeofday(&tp, NULL); + assert(ret == 0); + + tp.tv_usec++; + ret = settimeofday(&tp, NULL); + assert(ret == 0); +} + +/* + * The helper thread runs in a loop changing the time and + * forcing wakeups every 2 seconds. + */ +/* ARGSUSED */ +static void * +helper_thread(void *data) +{ + int exit; + struct timespec ts = {2, 0}; + + debug_log("Helper thread started ...\n"); + + /* CONSTCOND */ + while (1) { + (void) pthread_mutex_lock(&exitLock); + (void) pthread_cond_reltimedwait_np(&exitCond, &exitLock, &ts); + exit = terminated; + (void) pthread_mutex_unlock(&exitLock); + + if (exit) { + break; + } + + change_date(); + trigger_wakeup(); + debug_log("Time changed and force wakeup issued\n"); + } + + debug_log("Helper thread exiting ...\n"); + + pthread_exit(0); + return (NULL); +} + +static void +stop_threads(void) +{ + (void) pthread_mutex_lock(&exitLock); + terminated = 1; + (void) pthread_cond_broadcast(&exitCond); + (void) pthread_mutex_unlock(&exitLock); +} + +static void +run_tests(void) +{ + pthread_t pollThread; + pthread_t helperThread; + int ret; + + ret = pthread_create(&helperThread, NULL, helper_thread, NULL); + + if (ret != 0) { + (void) printf("Failed to create date thread: %s", + strerror(ret)); + exit(-1); + } + + ret = pthread_create(&pollThread, NULL, poll_thread, NULL); + + if (ret != 0) { + (void) printf("Failed to create poll thread: %s", + strerror(ret)); + exit(-1); + } + + (void) pthread_join(pollThread, NULL); + stop_threads(); + (void) pthread_join(helperThread, NULL); +} + +int +main(int argc, char * const argv[]) +{ + int c; + + while ((c = getopt(argc, argv, "d")) != -1) { + switch (c) { + case 'd': + debug = 1; + break; + default: + break; + } + } + + /* + * We need to be root to change the system time + */ + if (getuid() != 0 && geteuid() != 0) { + (void) printf("%s must be run as root\n", argv[0]); + exit(-1); + } + + run_tests(); + + exit(0); +} diff --git a/usr/src/test/test-runner/Makefile b/usr/src/test/test-runner/Makefile new file mode 100644 index 0000000000..363ee51c06 --- /dev/null +++ b/usr/src/test/test-runner/Makefile @@ -0,0 +1,20 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +SUBDIRS = cmd stf man + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/test-runner/cmd/Makefile b/usr/src/test/test-runner/cmd/Makefile new file mode 100644 index 0000000000..33e7a61275 --- /dev/null +++ b/usr/src/test/test-runner/cmd/Makefile @@ -0,0 +1,37 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master +include $(SRC)/test/Makefile.com + +ROOTOPTPKG = $(ROOT)/opt/test-runner +ROOTBIN = $(ROOTOPTPKG)/bin + +PROGS = run + +CMDS = $(PROGS:%=$(ROOTBIN)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(ROOTBIN) + +$(ROOTBIN): + $(INS.dir) + +$(ROOTBIN)/%: %.py + $(INS.rename) diff --git a/usr/src/test/test-runner/cmd/run.py b/usr/src/test/test-runner/cmd/run.py new file mode 100644 index 0000000000..c7cead43e8 --- /dev/null +++ b/usr/src/test/test-runner/cmd/run.py @@ -0,0 +1,839 @@ +#!/usr/bin/python2.6 + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +import ConfigParser +import os +import logging +from datetime import datetime +from optparse import OptionParser +from pwd import getpwnam +from pwd import getpwuid +from select import select +from subprocess import PIPE +from subprocess import Popen +from sys import argv +from sys import exit +from threading import Timer +from time import time + +BASEDIR = '/var/tmp/test_results' +KILL = '/usr/bin/kill' +TRUE = '/usr/bin/true' +SUDO = '/usr/bin/sudo' + + +class Result(object): + total = 0 + runresults = {'PASS': 0, 'FAIL': 0, 'SKIP': 0, 'KILLED': 0} + + def __init__(self): + self.starttime = None + self.returncode = None + self.runtime = '' + self.stdout = [] + self.stderr = [] + self.result = '' + + def done(self, proc, killed): + """ + Finalize the results of this Cmd. + """ + Result.total += 1 + m, s = divmod(time() - self.starttime, 60) + self.runtime = '%02d:%02d' % (m, s) + self.returncode = proc.returncode + if killed: + self.result = 'KILLED' + Result.runresults['KILLED'] += 1 + elif self.returncode is 0: + self.result = 'PASS' + Result.runresults['PASS'] += 1 + elif self.returncode is not 0: + self.result = 'FAIL' + Result.runresults['FAIL'] += 1 + + +class Output(object): + """ + This class is a slightly modified version of the 'Stream' class found + here: http://goo.gl/aSGfv + """ + def __init__(self, stream): + self.stream = stream + self._buf = '' + self.lines = [] + + def fileno(self): + return self.stream.fileno() + + def read(self, drain=0): + """ + Read from the file descriptor. If 'drain' set, read until EOF. + """ + while self._read() is not None: + if not drain: + break + + def _read(self): + """ + Read up to 4k of data from this output stream. Collect the output + up to the last newline, and append it to any leftover data from a + previous call. The lines are stored as a (timestamp, data) tuple + for easy sorting/merging later. + """ + fd = self.fileno() + buf = os.read(fd, 4096) + if not buf: + return None + if '\n' not in buf: + self._buf += buf + return [] + + buf = self._buf + buf + tmp, rest = buf.rsplit('\n', 1) + self._buf = rest + now = datetime.now() + rows = tmp.split('\n') + self.lines += [(now, r) for r in rows] + + +class Cmd(object): + verified_users = [] + + def __init__(self, pathname, outputdir=None, timeout=None, user=None): + self.pathname = pathname + self.outputdir = outputdir or 'BASEDIR' + self.timeout = timeout or 60 + self.user = user or '' + self.killed = False + self.result = Result() + + def __str__(self): + return "Pathname: %s\nOutputdir: %s\nTimeout: %s\nUser: %s\n" % ( + self.pathname, self.outputdir, self.timeout, self.user) + + def kill_cmd(self, proc): + """ + Kill a running command due to timeout, or ^C from the keyboard. If + sudo is required, this user was verified previously. + """ + self.killed = True + do_sudo = len(self.user) != 0 + signal = '-TERM' + + cmd = [SUDO, KILL, signal, str(proc.pid)] + if not do_sudo: + del cmd[0] + + try: + kp = Popen(cmd) + kp.wait() + except: + pass + + def update_cmd_privs(self, cmd, user): + """ + If a user has been specified to run this Cmd and we're not already + running as that user, prepend the appropriate sudo command to run + as that user. + """ + me = getpwuid(os.getuid()) + + if not user or user is me: + return cmd + + ret = '%s -E -u %s %s' % (SUDO, user, cmd) + return ret.split(' ') + + def collect_output(self, proc): + """ + Read from stdout/stderr as data becomes available, until the + process is no longer running. Return the lines from the stdout and + stderr Output objects. + """ + out = Output(proc.stdout) + err = Output(proc.stderr) + res = [] + while proc.returncode is None: + proc.poll() + res = select([out, err], [], [], .1) + for fd in res[0]: + fd.read() + for fd in res[0]: + fd.read(drain=1) + + return out.lines, err.lines + + def run(self, options): + """ + This is the main function that runs each individual test. + Determine whether or not the command requires sudo, and modify it + if needed. Run the command, and update the result object. + """ + if options.dryrun is True: + print self + return + + privcmd = self.update_cmd_privs(self.pathname, self.user) + try: + old = os.umask(0) + if not os.path.isdir(self.outputdir): + os.makedirs(self.outputdir, mode=0777) + os.umask(old) + except OSError, e: + fail('%s' % e) + + try: + self.result.starttime = time() + proc = Popen(privcmd, stdout=PIPE, stderr=PIPE) + t = Timer(int(self.timeout), self.kill_cmd, [proc]) + t.start() + self.result.stdout, self.result.stderr = self.collect_output(proc) + except KeyboardInterrupt: + self.kill_cmd(proc) + fail('\nRun terminated at user request.') + finally: + t.cancel() + + self.result.done(proc, self.killed) + + def skip(self): + """ + Initialize enough of the test result that we can log a skipped + command. + """ + Result.total += 1 + Result.runresults['SKIP'] += 1 + self.result.stdout = self.result.stderr = [] + self.result.starttime = time() + m, s = divmod(time() - self.result.starttime, 60) + self.result.runtime = '%02d:%02d' % (m, s) + self.result.result = 'SKIP' + + def log(self, logger, options): + """ + This function is responsible for writing all output. This includes + the console output, the logfile of all results (with timestamped + merged stdout and stderr), and for each test, the unmodified + stdout/stderr/merged in it's own file. + """ + if logger is None: + return + + user = ' (run as %s)' % self.user if len(self.user) else '' + msga = 'Test: %s%s ' % (self.pathname, user) + msgb = '[%s] [%s]' % (self.result.runtime, self.result.result) + pad = ' ' * (80 - (len(msga) + len(msgb))) + + # If -q is specified, only print a line for tests that didn't pass. + # This means passing tests need to be logged as DEBUG, or the one + # line summary will only be printed in the logfile for failures. + if not options.quiet: + logger.info('%s%s%s' % (msga, pad, msgb)) + elif self.result.result is not 'PASS': + logger.info('%s%s%s' % (msga, pad, msgb)) + else: + logger.debug('%s%s%s' % (msga, pad, msgb)) + + lines = self.result.stdout + self.result.stderr + for dt, line in sorted(lines): + logger.debug('%s %s' % (dt.strftime("%H:%M:%S.%f ")[:11], line)) + + if len(self.result.stdout): + with open(os.path.join(self.outputdir, 'stdout'), 'w') as out: + for _, line in self.result.stdout: + os.write(out.fileno(), '%s\n' % line) + if len(self.result.stderr): + with open(os.path.join(self.outputdir, 'stderr'), 'w') as err: + for _, line in self.result.stderr: + os.write(err.fileno(), '%s\n' % line) + if len(self.result.stdout) and len(self.result.stderr): + with open(os.path.join(self.outputdir, 'merged'), 'w') as merged: + for _, line in sorted(lines): + os.write(merged.fileno(), '%s\n' % line) + + +class Test(Cmd): + props = ['outputdir', 'timeout', 'user', 'pre', 'pre_user', 'post', + 'post_user'] + + def __init__(self, pathname, outputdir=None, timeout=None, user=None, + pre=None, pre_user=None, post=None, post_user=None): + super(Test, self).__init__(pathname, outputdir, timeout, user) + self.pre = pre or '' + self.pre_user = pre_user or '' + self.post = post or '' + self.post_user = post_user or '' + + def __str__(self): + post_user = pre_user = '' + if len(self.pre_user): + pre_user = ' (as %s)' % (self.pre_user) + if len(self.post_user): + post_user = ' (as %s)' % (self.post_user) + return "Pathname: %s\nOutputdir: %s\nTimeout: %s\nPre: %s%s\nPost: " \ + "%s%s\nUser: %s\n" % (self.pathname, self.outputdir, + self.timeout, self.pre, pre_user, self.post, post_user, + self.user) + + def verify(self, logger): + """ + Check the pre/post scripts, user and Test. Omit the Test from this + run if there are any problems. + """ + files = [self.pre, self.pathname, self.post] + users = [self.pre_user, self.user, self.post_user] + + for f in [f for f in files if len(f)]: + if not verify_file(f): + logger.info("Warning: Test '%s' not added to this run because" + " it failed verification." % f) + return False + + for user in [user for user in users if len(user)]: + if not verify_user(user, logger): + logger.info("Not adding Test '%s' to this run." % + self.pathname) + return False + + return True + + def run(self, logger, options): + """ + Create Cmd instances for the pre/post scripts. If the pre script + doesn't pass, skip this Test. Run the post script regardless. + """ + pretest = Cmd(self.pre, outputdir=os.path.join(self.outputdir, + os.path.basename(self.pre)), timeout=self.timeout, + user=self.pre_user) + test = Cmd(self.pathname, outputdir=self.outputdir, + timeout=self.timeout, user=self.user) + posttest = Cmd(self.post, outputdir=os.path.join(self.outputdir, + os.path.basename(self.post)), timeout=self.timeout, + user=self.post_user) + + cont = True + if len(pretest.pathname): + pretest.run(options) + cont = pretest.result.result is 'PASS' + pretest.log(logger, options) + + if cont: + test.run(options) + else: + test.skip() + + test.log(logger, options) + + if len(posttest.pathname): + posttest.run(options) + posttest.log(logger, options) + + +class TestGroup(Test): + props = Test.props + ['tests'] + + def __init__(self, pathname, outputdir=None, timeout=None, user=None, + pre=None, pre_user=None, post=None, post_user=None, + tests=None): + super(TestGroup, self).__init__(pathname, outputdir, timeout, user, + pre, pre_user, post, post_user) + self.tests = tests or [] + + def __str__(self): + post_user = pre_user = '' + if len(self.pre_user): + pre_user = ' (as %s)' % (self.pre_user) + if len(self.post_user): + post_user = ' (as %s)' % (self.post_user) + return "Pathname: %s\nOutputdir: %s\nTests: %s\nTimeout: %s\n" \ + "Pre: %s%s\nPost: %s%s\nUser: %s\n" % (self.pathname, + self.outputdir, self.tests, self.timeout, self.pre, pre_user, + self.post, post_user, self.user) + + def verify(self, logger): + """ + Check the pre/post scripts, user and tests in this TestGroup. Omit + the TestGroup entirely, or simply delete the relevant tests in the + group, if that's all that's required. + """ + # If the pre or post scripts are relative pathnames, convert to + # absolute, so they stand a chance of passing verification. + if len(self.pre) and not os.path.isabs(self.pre): + self.pre = os.path.join(self.pathname, self.pre) + if len(self.post) and not os.path.isabs(self.post): + self.post = os.path.join(self.pathname, self.post) + + auxfiles = [self.pre, self.post] + users = [self.pre_user, self.user, self.post_user] + + for f in [f for f in auxfiles if len(f)]: + if self.pathname != os.path.dirname(f): + logger.info("Warning: TestGroup '%s' not added to this run. " + "Auxiliary script '%s' exists in a different " + "directory." % (self.pathname, f)) + return False + + if not verify_file(f): + logger.info("Warning: TestGroup '%s' not added to this run. " + "Auxiliary script '%s' failed verification." % + (self.pathname, f)) + return False + + for user in [user for user in users if len(user)]: + if not verify_user(user, logger): + logger.info("Not adding TestGroup '%s' to this run." % + self.pathname) + return False + + # If one of the tests is invalid, delete it, log it, and drive on. + for test in self.tests: + if not verify_file(os.path.join(self.pathname, test)): + del self.tests[self.tests.index(test)] + logger.info("Warning: Test '%s' removed from TestGroup '%s' " + "because it failed verification." % (test, + self.pathname)) + + return len(self.tests) is not 0 + + def run(self, logger, options): + """ + Create Cmd instances for the pre/post scripts. If the pre script + doesn't pass, skip all the tests in this TestGroup. Run the post + script regardless. + """ + pretest = Cmd(self.pre, outputdir=os.path.join(self.outputdir, + os.path.basename(self.pre)), timeout=self.timeout, + user=self.pre_user) + posttest = Cmd(self.post, outputdir=os.path.join(self.outputdir, + os.path.basename(self.post)), timeout=self.timeout, + user=self.post_user) + + cont = True + if len(pretest.pathname): + pretest.run(options) + cont = pretest.result.result is 'PASS' + pretest.log(logger, options) + + for fname in self.tests: + test = Cmd(os.path.join(self.pathname, fname), + outputdir=os.path.join(self.outputdir, fname), + timeout=self.timeout, user=self.user) + if cont: + test.run(options) + else: + test.skip() + + test.log(logger, options) + + if len(posttest.pathname): + posttest.run(options) + posttest.log(logger, options) + + +class TestRun(object): + props = ['quiet', 'outputdir'] + + def __init__(self, options): + self.tests = {} + self.testgroups = {} + self.starttime = time() + self.timestamp = datetime.now().strftime('%Y%m%dT%H%M%S') + self.outputdir = os.path.join(options.outputdir, self.timestamp) + self.logger = self.setup_logging(options) + self.defaults = [ + ('outputdir', BASEDIR), + ('quiet', False), + ('timeout', 60), + ('user', ''), + ('pre', ''), + ('pre_user', ''), + ('post', ''), + ('post_user', '') + ] + + def __str__(self): + s = 'TestRun:\n outputdir: %s\n' % self.outputdir + s += 'TESTS:\n' + for key in sorted(self.tests.keys()): + s += '%s%s' % (self.tests[key].__str__(), '\n') + s += 'TESTGROUPS:\n' + for key in sorted(self.testgroups.keys()): + s += '%s%s' % (self.testgroups[key].__str__(), '\n') + return s + + def addtest(self, pathname, options): + """ + Create a new Test, and apply any properties that were passed in + from the command line. If it passes verification, add it to the + TestRun. + """ + test = Test(pathname) + for prop in Test.props: + setattr(test, prop, getattr(options, prop)) + + if test.verify(self.logger): + self.tests[pathname] = test + + def addtestgroup(self, dirname, filenames, options): + """ + Create a new TestGroup, and apply any properties that were passed + in from the command line. If it passes verification, add it to the + TestRun. + """ + if dirname not in self.testgroups: + testgroup = TestGroup(dirname) + for prop in Test.props: + setattr(testgroup, prop, getattr(options, prop)) + + # Prevent pre/post scripts from running as regular tests + for f in [testgroup.pre, testgroup.post]: + if f in filenames: + del filenames[filenames.index(f)] + + self.testgroups[dirname] = testgroup + self.testgroups[dirname].tests = sorted(filenames) + + testgroup.verify(self.logger) + + def read(self, logger, options): + """ + Read in the specified runfile, and apply the TestRun properties + listed in the 'DEFAULT' section to our TestRun. Then read each + section, and apply the appropriate properties to the Test or + TestGroup. Properties from individual sections override those set + in the 'DEFAULT' section. If the Test or TestGroup passes + verification, add it to the TestRun. + """ + config = ConfigParser.RawConfigParser() + if not len(config.read(options.runfile)): + fail("Coulnd't read config file %s" % options.runfile) + + for opt in TestRun.props: + if config.has_option('DEFAULT', opt): + setattr(self, opt, config.get('DEFAULT', opt)) + self.outputdir = os.path.join(self.outputdir, self.timestamp) + + for section in config.sections(): + if 'tests' in config.options(section): + testgroup = TestGroup(section) + for prop in TestGroup.props: + try: + setattr(testgroup, prop, config.get('DEFAULT', prop)) + setattr(testgroup, prop, config.get(section, prop)) + except ConfigParser.NoOptionError: + pass + + # Repopulate tests using eval to convert the string to a list + testgroup.tests = eval(config.get(section, 'tests')) + + if testgroup.verify(logger): + self.testgroups[section] = testgroup + else: + test = Test(section) + for prop in Test.props: + try: + setattr(test, prop, config.get('DEFAULT', prop)) + setattr(test, prop, config.get(section, prop)) + except ConfigParser.NoOptionError: + pass + if test.verify(logger): + self.tests[section] = test + + def write(self, options): + """ + Create a configuration file for editing and later use. The + 'DEFAULT' section of the config file is created from the + properties that were specified on the command line. Tests are + simply added as sections that inherit everything from the + 'DEFAULT' section. TestGroups are the same, except they get an + option including all the tests to run in that directory. + """ + + defaults = dict([(prop, getattr(options, prop)) for prop, _ in + self.defaults]) + config = ConfigParser.RawConfigParser(defaults) + + for test in sorted(self.tests.keys()): + config.add_section(test) + + for testgroup in sorted(self.testgroups.keys()): + config.add_section(testgroup) + config.set(testgroup, 'tests', self.testgroups[testgroup].tests) + + try: + with open(options.template, 'w') as f: + return config.write(f) + except IOError: + fail('Could not open \'%s\' for writing.' % options.template) + + def complete_outputdirs(self, options): + """ + Collect all the pathnames for Tests, and TestGroups. Work + backwards one pathname component at a time, to create a unique + directory name in which to deposit test output. Tests will be able + to write output files directly in the newly modified outputdir. + TestGroups will be able to create one subdirectory per test in the + outputdir, and are guaranteed uniqueness because a group can only + contain files in one directory. Pre and post tests will create a + directory rooted at the outputdir of the Test or TestGroup in + question for their output. + """ + done = False + components = 0 + tmp_dict = dict(self.tests.items() + self.testgroups.items()) + total = len(tmp_dict) + base = self.outputdir + + while not done: + l = [] + components -= 1 + for testfile in tmp_dict.keys(): + uniq = '/'.join(testfile.split('/')[components:]).lstrip('/') + if not uniq in l: + l.append(uniq) + tmp_dict[testfile].outputdir = os.path.join(base, uniq) + else: + break + done = total == len(l) + + def setup_logging(self, options): + """ + Two loggers are set up here. The first is for the logfile which + will contain one line summarizing the test, including the test + name, result, and running time. This logger will also capture the + timestamped combined stdout and stderr of each run. The second + logger is optional console output, which will contain only the one + line summary. The loggers are initialized at two different levels + to facilitate segregating the output. + """ + if options.dryrun is True: + return + + testlogger = logging.getLogger(__name__) + testlogger.setLevel(logging.DEBUG) + + if options.cmd is not 'wrconfig': + try: + old = os.umask(0) + os.makedirs(self.outputdir, mode=0777) + os.umask(old) + except OSError, e: + fail('%s' % e) + filename = os.path.join(self.outputdir, 'log') + + logfile = logging.FileHandler(filename) + logfile.setLevel(logging.DEBUG) + logfilefmt = logging.Formatter('%(message)s') + logfile.setFormatter(logfilefmt) + testlogger.addHandler(logfile) + + cons = logging.StreamHandler() + cons.setLevel(logging.INFO) + consfmt = logging.Formatter('%(message)s') + cons.setFormatter(consfmt) + testlogger.addHandler(cons) + + return testlogger + + def run(self, options): + """ + Walk through all the Tests and TestGroups, calling run(). + """ + try: + os.chdir(self.outputdir) + except OSError: + fail('Could not change to directory %s' % self.outputdir) + for test in sorted(self.tests.keys()): + self.tests[test].run(self.logger, options) + for testgroup in sorted(self.testgroups.keys()): + self.testgroups[testgroup].run(self.logger, options) + + def summary(self): + if Result.total is 0: + return + + print '\nResults Summary' + for key in Result.runresults.keys(): + if Result.runresults[key] is not 0: + print '%s\t% 4d' % (key, Result.runresults[key]) + + m, s = divmod(time() - self.starttime, 60) + h, m = divmod(m, 60) + print '\nRunning Time:\t%02d:%02d:%02d' % (h, m, s) + print 'Percent passed:\t%.1f%%' % ((float(Result.runresults['PASS']) / + float(Result.total)) * 100) + print 'Log directory:\t%s' % self.outputdir + + +def verify_file(pathname): + """ + Verify that the supplied pathname is an executable regular file. + """ + if os.path.isdir(pathname) or os.path.islink(pathname): + return False + + if os.path.isfile(pathname) and os.access(pathname, os.X_OK): + return True + + return False + + +def verify_user(user, logger): + """ + Verify that the specified user exists on this system, and can execute + sudo without being prompted for a password. + """ + testcmd = [SUDO, '-n', '-u', user, TRUE] + can_sudo = exists = True + + if user in Cmd.verified_users: + return True + + try: + _ = getpwnam(user) + except KeyError: + exists = False + logger.info("Warning: user '%s' does not exist.", user) + return False + + p = Popen(testcmd) + p.wait() + if p.returncode is not 0: + logger.info("Warning: user '%s' cannot use paswordless sudo.", user) + return False + else: + Cmd.verified_users.append(user) + + return True + + +def find_tests(testrun, options): + """ + For the given list of pathnames, add files as Tests. For directories, + if do_groups is True, add the directory as a TestGroup. If False, + recursively search for executable files. + """ + + for p in sorted(options.pathnames): + if os.path.isdir(p): + for dirname, _, filenames in os.walk(p): + if options.do_groups: + testrun.addtestgroup(dirname, filenames, options) + else: + for f in sorted(filenames): + testrun.addtest(os.path.join(dirname, f), options) + else: + testrun.addtest(p, options) + + +def fail(retstr, ret=1): + print '%s: %s' % (argv[0], retstr) + exit(ret) + + +def options_cb(option, opt_str, value, parser): + path_options = ['runfile', 'outputdir', 'template'] + + if option.dest is 'runfile' and '-w' in parser.rargs or \ + option.dest is 'template' and '-c' in parser.rargs: + fail('-c and -w are mutually exclusive.') + + if opt_str in parser.rargs: + fail('%s may only be specified once.' % opt_str) + + if option.dest is 'runfile': + parser.values.cmd = 'rdconfig' + if option.dest is 'template': + parser.values.cmd = 'wrconfig' + + setattr(parser.values, option.dest, value) + if option.dest in path_options: + setattr(parser.values, option.dest, os.path.abspath(value)) + + +def parse_args(): + parser = OptionParser() + parser.add_option('-c', action='callback', callback=options_cb, + type='string', dest='runfile', metavar='runfile', + help='Specify tests to run via config file.') + parser.add_option('-d', action='store_true', default=False, dest='dryrun', + help='Dry run. Print tests, but take no other action.') + parser.add_option('-g', action='store_true', default=False, + dest='do_groups', help='Make directories TestGroups.') + parser.add_option('-o', action='callback', callback=options_cb, + default=BASEDIR, dest='outputdir', type='string', + metavar='outputdir', help='Specify an output directory.') + parser.add_option('-p', action='callback', callback=options_cb, + default='', dest='pre', metavar='script', + type='string', help='Specify a pre script.') + parser.add_option('-P', action='callback', callback=options_cb, + default='', dest='post', metavar='script', + type='string', help='Specify a post script.') + parser.add_option('-q', action='store_true', default=False, dest='quiet', + help='Silence on the console during a test run.') + parser.add_option('-t', action='callback', callback=options_cb, default=60, + dest='timeout', metavar='seconds', type='int', + help='Timeout (in seconds) for an individual test.') + parser.add_option('-u', action='callback', callback=options_cb, + default='', dest='user', metavar='user', type='string', + help='Specify a different user name to run as.') + parser.add_option('-w', action='callback', callback=options_cb, + default=None, dest='template', metavar='template', + type='string', help='Create a new config file.') + parser.add_option('-x', action='callback', callback=options_cb, default='', + dest='pre_user', metavar='pre_user', type='string', + help='Specify a user to execute the pre script.') + parser.add_option('-X', action='callback', callback=options_cb, default='', + dest='post_user', metavar='post_user', type='string', + help='Specify a user to execute the post script.') + (options, pathnames) = parser.parse_args() + + if not options.runfile and not options.template: + options.cmd = 'runtests' + + if options.runfile and len(pathnames): + fail('Extraneous arguments.') + + options.pathnames = [os.path.abspath(path) for path in pathnames] + + return options + + +def main(args): + options = parse_args() + testrun = TestRun(options) + + if options.cmd is 'runtests': + find_tests(testrun, options) + elif options.cmd is 'rdconfig': + testrun.read(testrun.logger, options) + elif options.cmd is 'wrconfig': + find_tests(testrun, options) + testrun.write(options) + exit(0) + else: + fail('Unknown command specified') + + testrun.complete_outputdirs(options) + testrun.run(options) + testrun.summary() + exit(0) + + +if __name__ == '__main__': + main(argv[1:]) diff --git a/usr/src/test/test-runner/man/Makefile b/usr/src/test/test-runner/man/Makefile new file mode 100644 index 0000000000..9a23a26106 --- /dev/null +++ b/usr/src/test/test-runner/man/Makefile @@ -0,0 +1,38 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +MANSRCS = run.1 + +ROOTOPTPKG = $(ROOT)/opt/test-runner +MANDIR = $(ROOTOPTPKG)/man/man1 + +FILES = $(MANSRCS:%=$(MANDIR)/%) +$(FILES) := FILEMODE = 0444 + +all: $(MANSRCS) + +install: $(FILES) + +clean lint clobber: + +$(FILES): $(MANDIR) $(MANSRCS) + +$(MANDIR): + $(INS.dir) + +$(MANDIR)/%: % + $(INS.file) diff --git a/usr/src/test/test-runner/man/run.1 b/usr/src/test/test-runner/man/run.1 new file mode 100644 index 0000000000..31cd412452 --- /dev/null +++ b/usr/src/test/test-runner/man/run.1 @@ -0,0 +1,370 @@ +.\" +.\" This file and its contents are supplied under the terms of the +.\" Common Development and Distribution License ("CDDL"), version 1.0. +.\" You may only use this file in accordance with the terms of version +.\" 1.0 of the CDDL. +.\" +.\" A full copy of the text of the CDDL should have accompanied this +.\" source. A copy of the CDDL is also available via the Internet at +.\" http://www.illumos.org/license/CDDL. +.\" +.\" +.\" Copyright (c) 2012 by Delphix. All rights reserved. +.\" +.TH run 1 "23 Sep 2012" +.SH NAME +run \- find, execute, and log the results of tests +.SH SYNOPSIS +.LP +.nf +\fBrun\fR [\fB-dgq] [\fB-o\fR \fIoutputdir\fR] [\fB-pP\fR \fIscript\fR] [\fB-t\fR \fIseconds\fR] [\fB-uxX\fR \fIusername\fR] + \fIpathname\fR ... +.fi + +.LP +.nf +\fBrun\fR \fB-w\fR \fIrunfile\fR [\fB-gq\fR] [\fB-o\fR \fIoutputdir\fR] [\fB-pP\fR \fIscript\fR] [\fB-t\fR \fIseconds\fR] + [\fB-uxX\fR \fIusername\fR] \fIpathname\fR ... +.fi + +.LP +.nf +\fBrun\fR \fB-c\fR \fIrunfile\fR [\fB-dq\fR] +.fi + +.LP +.nf +\fBrun\fR [\fB-h\fR] +.fi + +.SH DESCRIPTION +.sp +.LP +The \fBrun\fR command has three basic modes of operation. With neither the +\fB-c\fR nor the \fB-w\fR option, \fBrun\fR processes the arguments provided on +the command line, adding them to the list for this run. If a specified +\fIpathname\fR is an executable file, it is added as a test. If a specified +\fIpathname\fR is a directory, the behavior depends upon the \fB-g\fR option. +If \fB-g\fR is specified, the directory is treated as a test group. See the +section on "Test Groups" below. Without the \fB-g\fR option, \fBrun\fR simply +descends into the directory looking for executable files. The tests are then +executed, and the results are logged. + +With the \fB-w\fR option, \fBrun\fR finds tests in the manner described above. +Rather than executing the tests and logging the results, the test configuration +is stored in a \fIrunfile\fR which can be used in future invocations, or edited +to modify which tests are executed and which options are applied. Options +included on the command line with \fB-w\fR become defaults in the +\fIrunfile\fR. + +With the \fB-c\fR option, \fBrun\fR parses a \fIrunfile\fR, which can specify a +series of tests and test groups to be executed. The tests are then executed, +and the results are logged. +.sp +.SS "Test Groups" +.sp +.LP +A test group is comprised of a set of executable files, all of which exist in +one directory. The options specified on the command line or in a \fIrunfile\fR +apply to individual tests in the group. The exception is options pertaining to +pre and post scripts, which act on all tests as a group. Rather than running +before and after each test, these scripts are run only once each at the start +and end of the test group. +.SS "Test Execution" +.sp +.LP +The specified tests run serially, and are typically assigned results according +to exit values. Tests that exit zero and non-zero are marked "PASS" and "FAIL" +respectively. When a pre script fails for a test group, only the post script is +executed, and the remaining tests are marked "SKIPPED." Any test that exceeds +its \fItimeout\fR is terminated, and marked "KILLED." + +By default, tests are executed with the credentials of the \fBrun\fR script. +Executing tests with other credentials is done via \fBsudo\fR(1m), which must +be configured to allow execution without prompting for a password. Environment +variables from the calling shell are available to individual tests. During test +execution, the working directory is changed to \fIoutputdir\fR. +.SS "Output Logging" +.sp +.LP +By default, \fBrun\fR will print one line on standard output at the conclusion +of each test indicating the test name, result and elapsed time. Additionally, +for each invocation of \fBrun\fR, a directory is created using the ISO 8601 +date format. Within this directory is a file named \fIlog\fR containing all the +test output with timestamps, and a directory for each test. Within the test +directories, there is one file each for standard output, standard error and +merged output. The default location for the \fIoutputdir\fR is +\fI/var/tmp/test_results\fR. +.SS "Runfiles" +.sp +.LP +The \fIrunfile\fR is an ini style configuration file that describes a test run. +The file has one section named "DEFAULT," which contains configuration option +names and their values in "name = value" format. The values in this section +apply to all the subsequent sections, unless they are also specified there, in +which case the default is overridden. The remaining section names are the +absolute pathnames of files and direcotries, describing tests and test groups +respectively. The legal option names are: +.sp +.ne 2 +.na +\fBoutputdir\fR = \fIpathname\fR +.ad +.sp .6 +.RS 4n +The name of the directory that holds test logs. +.RE +.sp +.ne 2 +.na +\fBpre\fR = \fIscript\fR +.ad +.sp .6 +.RS 4n +Run \fIscript\fR prior to the test or test group. +.RE +.sp +.ne 2 +.na +\fBpre_user\fR = \fIusername\fR +.ad +.sp .6 +.RS 4n +Execute the pre script as \fIusername\fR. +.RE +.sp +.ne 2 +.na +\fBpost\fR = \fIscript\fR +.ad +.sp .6 +.RS 4n +Run \fIscript\fR after the test or test group. +.RE +.sp +.ne 2 +.na +\fBpost_user\fR = \fIusername\fR +.ad +.sp .6 +.RS 4n +Execute the post script as \fIusername\fR. +.RE +.sp +.ne 2 +.na +\fBquiet\fR = [\fITrue\fR|\fIFalse\fR] +.ad +.sp .6 +.RS 4n +If set to True, only the results summary is printed to standard out. +.RE +.sp +.ne 2 +.na +\fBtests\fR = [\fI'filename'\fR [,...]] +.ad +.sp .6 +.RS 4n +Specify a list of \fIfilenames\fR for this test group. Only the basename of the +absolute path is required. This option is only valid for test groups, and each +\fIfilename\fR must be single quoted. +.RE +.sp +.ne 2 +.na +\fBtimeout\fR = \fIn\fR +.ad +.sp .6 +.RS 4n +A timeout value of \fIn\fR seconds. +.RE +.sp +.ne 2 +.na +\fBuser\fR = \fIusername\fR +.ad +.sp .6 +.RS 4n +Execute the test or test group as \fIusername\fR. +.RE + +.SH OPTIONS +.sp +.LP +The following options are available for the \fBrun\fR command. +.sp +.ne 2 +.na +\fB-c\fR \fIrunfile\fR +.ad +.RS 6n +Specify a \fIrunfile\fR to be consumed by the run command. +.RE + +.ne 2 +.na +\fB-d\fR +.ad +.RS 6n +Dry run mode. Execute no tests, but print a description of each test that would +have been run. +.RE + +.ne 2 +.na +\fB-g\fR +.ad +.RS 6n +Create test groups from any directories found while searching for tests. +.RE + +.ne 2 +.na +\fB-o\fR \fIoutputdir\fR +.ad +.RS 6n +Specify the directory in which to write test results. +.RE + +.ne 2 +.na +\fB-p\fR \fIscript\fR +.ad +.RS 6n +Run \fIscript\fR prior to any test or test group. +.RE + +.ne 2 +.na +\fB-P\fR \fIscript\fR +.ad +.RS 6n +Run \fIscript\fR after any test or test group. +.RE + +.ne 2 +.na +\fB-q\fR +.ad +.RS 6n +Print only the results sumary to the standard output. +.RE + +.ne 2 +.na +\fB-t\fR \fIn\fR +.ad +.RS 6n +Specify a timeout value of \fIn\fR seconds per test. +.RE + +.ne 2 +.na +\fB-u\fR \fIusername\fR +.ad +.RS 6n +Execute tests or test groups as \fIusername\fR. +.RE + +.ne 2 +.na +\fB-w\fR \fIrunfile\fR +.ad +.RS 6n +Specify the name of the \fIrunfile\fR to create. +.RE + +.ne 2 +.na +\fB-x\fR \fIusername\fR +.ad +.RS 6n +Execute the pre script as \fIusername\fR. +.RE + +.ne 2 +.na +\fB-X\fR \fIusername\fR +.ad +.RS 6n +Execute the post script as \fIusername\fR. +.RE + +.SH EXAMPLES +.LP +\fBExample 1\fR Running ad-hoc tests. +.sp +.LP +This example demonstrates the simplest invocation of \fBrun\fR. + +.sp +.in +2 +.nf +% \fBrun my-tests\fR +Test: /home/jkennedy/my-tests/test-01 [00:02] [PASS] +Test: /home/jkennedy/my-tests/test-02 [00:04] [PASS] +Test: /home/jkennedy/my-tests/test-03 [00:01] [PASS] + +Results Summary +PASS 3 + +Running Time: 00:00:07 +Percent passed: 100.0% +Log directory: /var/tmp/test_results/20120923T180654 +.fi +.in -2 + +.LP +\fBExample 2\fR Creating a \fIrunfile\fR for future use. +.sp +.LP +This example demonstrates creating a \fIrunfile\fR with non default options. + +.sp +.in +2 +.nf +% \fBrun -p setup -x root -g -w new-tests.run new-tests\fR +% \fBcat new-tests.run\fR +[DEFAULT] +pre = setup +post_user = +quiet = False +user = +timeout = 60 +post = +pre_user = root +outputdir = /var/tmp/test_results + +[/home/jkennedy/new-tests] +tests = ['test-01', 'test-02', 'test-03'] +.fi +.in -2 + +.SH EXIT STATUS +.sp +.LP +The following exit values are returned: +.sp +.ne 2 +.na +\fB\fB0\fR\fR +.ad +.sp .6 +.RS 4n +Successful completion. +.RE +.sp +.ne 2 +.na +\fB\fB1\fR\fR +.ad +.sp .6 +.RS 4n +An error occurred. +.RE + +.SH SEE ALSO +.sp +.LP +\fBsudo\fR(1m) diff --git a/usr/src/test/test-runner/stf/Makefile b/usr/src/test/test-runner/stf/Makefile new file mode 100644 index 0000000000..26e662d72f --- /dev/null +++ b/usr/src/test/test-runner/stf/Makefile @@ -0,0 +1,20 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +SUBDIRS = contrib/include include + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/test-runner/stf/README b/usr/src/test/test-runner/stf/README new file mode 100644 index 0000000000..1cd9a878fd --- /dev/null +++ b/usr/src/test/test-runner/stf/README @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +This directory contains shell libraries used by the Solaris Test +Framework (STF). They are duplicated here to allow test suites (like +the ZFS Test Suite) that were written for STF to be easily ported +to this framework. diff --git a/usr/src/test/test-runner/stf/contrib/include/Makefile b/usr/src/test/test-runner/stf/contrib/include/Makefile new file mode 100644 index 0000000000..7740bf0f1e --- /dev/null +++ b/usr/src/test/test-runner/stf/contrib/include/Makefile @@ -0,0 +1,37 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master +include $(SRC)/test/Makefile.com + +ROOTOPTPKG = $(ROOT)/opt/test-runner +INCLUDEDIR = $(ROOTOPTPKG)/stf/contrib/include + +PROGS = logapi.shlib + +CMDS = $(PROGS:%=$(INCLUDEDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(INCLUDEDIR) + +$(INCLUDEDIR): + $(INS.dir) + +$(INCLUDEDIR)/%: % + $(INS.file) diff --git a/usr/src/test/test-runner/stf/contrib/include/logapi.shlib b/usr/src/test/test-runner/stf/contrib/include/logapi.shlib new file mode 100644 index 0000000000..6bd81b8521 --- /dev/null +++ b/usr/src/test/test-runner/stf/contrib/include/logapi.shlib @@ -0,0 +1,384 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. ${STF_TOOLS}/include/stf.shlib + +# Output an assertion +# +# $@ - assertion text + +function log_assert +{ + _printline ASSERTION: "$@" +} + +# Output a comment +# +# $@ - comment text + +function log_note +{ + _printline NOTE: "$@" +} + +# Execute and print command with status where success equals non-zero result +# +# $@ - command to execute +# +# return 0 if command fails, otherwise return 1 + +function log_neg +{ + log_neg_expect "" "$@" + return $? +} + +# Execute a positive test and exit $STF_FAIL is test fails +# +# $@ - command to execute + +function log_must +{ + log_pos "$@" + (( $? != 0 )) && log_fail +} + +# Execute a negative test and exit $STF_FAIL if test passes +# +# $@ - command to execute + +function log_mustnot +{ + log_neg "$@" + (( $? != 0 )) && log_fail +} + +# Execute a negative test with keyword expected, and exit +# $STF_FAIL if test passes +# +# $1 - keyword expected +# $2-$@ - command to execute + +function log_mustnot_expect +{ + log_neg_expect "$@" + (( $? != 0 )) && log_fail +} + +# Execute and print command with status where success equals non-zero result +# or output includes expected keyword +# +# $1 - keyword expected +# $2-$@ - command to execute +# +# return 0 if command fails, or the output contains the keyword expected, +# return 1 otherwise + +function log_neg_expect +{ + typeset out="" + typeset logfile="/tmp/log.$$" + typeset ret=1 + typeset expect=$1 + shift + + while [[ -e $logfile ]]; do + logfile="$logfile.$$" + done + + "$@" 2>$logfile + typeset status=$? + out="/usr/bin/cat $logfile" + + # unexpected status + if (( $status == 0 )); then + print -u2 $($out) + _printerror "$@" "unexpectedly exited $status" + # missing binary + elif (( $status == 127 )); then + print -u2 $($out) + _printerror "$@" "unexpectedly exited $status (File not found)" + # bus error - core dump + elif (( $status == 138 )); then + print -u2 $($out) + _printerror "$@" "unexpectedly exited $status (Bus Error)" + # segmentation violation - core dump + elif (( $status == 139 )); then + print -u2 $($out) + _printerror "$@" "unexpectedly exited $status (SEGV)" + else + $out | /usr/bin/egrep -i "internal error|assertion failed" \ + > /dev/null 2>&1 + # internal error or assertion failed + if (( $? == 0 )); then + print -u2 $($out) + _printerror "$@" "internal error or assertion failure" \ + " exited $status" + elif [[ -n $expect ]] ; then + $out | /usr/bin/grep -i "$expect" > /dev/null 2>&1 + if (( $? == 0 )); then + ret=0 + else + print -u2 $($out) + _printerror "$@" "unexpectedly exited $status" + fi + else + ret=0 + fi + + if (( $ret == 0 )); then + [[ -n $LOGAPI_DEBUG ]] && print $($out) + _printsuccess "$@" "exited $status" + fi + fi + _recursive_output $logfile "false" + return $ret +} + +# Execute and print command with status where success equals zero result +# +# $@ command to execute +# +# return command exit status + +function log_pos +{ + typeset out="" + typeset logfile="/tmp/log.$$" + + while [[ -e $logfile ]]; do + logfile="$logfile.$$" + done + + "$@" 2>$logfile + typeset status=$? + out="/usr/bin/cat $logfile" + + if (( $status != 0 )) ; then + print -u2 $($out) + _printerror "$@" "exited $status" + else + $out | /usr/bin/egrep -i "internal error|assertion failed" \ + > /dev/null 2>&1 + # internal error or assertion failed + if [[ $? -eq 0 ]]; then + print -u2 $($out) + _printerror "$@" "internal error or assertion failure" \ + " exited $status" + status=1 + else + [[ -n $LOGAPI_DEBUG ]] && print $($out) + _printsuccess "$@" + fi + fi + _recursive_output $logfile "false" + return $status +} + +# Set an exit handler +# +# $@ - function(s) to perform on exit + +function log_onexit +{ + _CLEANUP="$@" +} + +# +# Exit functions +# + +# Perform cleanup and exit $STF_PASS +# +# $@ - message text + +function log_pass +{ + _endlog $STF_PASS "$@" +} + +# Perform cleanup and exit $STF_FAIL +# +# $@ - message text + +function log_fail +{ + _endlog $STF_FAIL "$@" +} + +# Perform cleanup and exit $STF_UNRESOLVED +# +# $@ - message text + +function log_unresolved +{ + _endlog $STF_UNRESOLVED "$@" +} + +# Perform cleanup and exit $STF_NOTINUSE +# +# $@ - message text + +function log_notinuse +{ + _endlog $STF_NOTINUSE "$@" +} + +# Perform cleanup and exit $STF_UNSUPPORTED +# +# $@ - message text + +function log_unsupported +{ + _endlog $STF_UNSUPPORTED "$@" +} + +# Perform cleanup and exit $STF_UNTESTED +# +# $@ - message text + +function log_untested +{ + _endlog $STF_UNTESTED "$@" +} + +# Perform cleanup and exit $STF_UNINITIATED +# +# $@ - message text + +function log_uninitiated +{ + _endlog $STF_UNINITIATED "$@" +} + +# Perform cleanup and exit $STF_NORESULT +# +# $@ - message text + +function log_noresult +{ + _endlog $STF_NORESULT "$@" +} + +# Perform cleanup and exit $STF_WARNING +# +# $@ - message text + +function log_warning +{ + _endlog $STF_WARNING "$@" +} + +# Perform cleanup and exit $STF_TIMED_OUT +# +# $@ - message text + +function log_timed_out +{ + _endlog $STF_TIMED_OUT "$@" +} + +# Perform cleanup and exit $STF_OTHER +# +# $@ - message text + +function log_other +{ + _endlog $STF_OTHER "$@" +} + +# +# Internal functions +# + +# Perform cleanup and exit +# +# $1 - stf exit code +# $2-$n - message text + +function _endlog +{ + typeset logfile="/tmp/log.$$" + _recursive_output $logfile + + if [[ -n $_CLEANUP ]] ; then + typeset cleanup=$_CLEANUP + log_onexit "" + log_note "Performing local cleanup via log_onexit ($cleanup)" + $cleanup + fi + typeset exitcode=$1 + shift + (( ${#@} > 0 )) && _printline "$@" + exit $exitcode +} + +# Output a formatted line +# +# $@ - message text + +function _printline +{ + print "$@" +} + +# Output an error message +# +# $@ - message text + +function _printerror +{ + _printline ERROR: "$@" +} + +# Output a success message +# +# $@ - message text + +function _printsuccess +{ + _printline SUCCESS: "$@" +} + +# Output logfiles recursively +# +# $1 - start file +# $2 - indicate whether output the start file itself, default as yes. + +function _recursive_output #logfile +{ + typeset logfile=$1 + + while [[ -e $logfile ]]; do + if [[ -z $2 || $logfile != $1 ]]; then + /usr/bin/cat $logfile + fi + /usr/bin/rm -f $logfile + logfile="$logfile.$$" + done +} diff --git a/usr/src/test/test-runner/stf/include/Makefile b/usr/src/test/test-runner/stf/include/Makefile new file mode 100644 index 0000000000..009b4c33a0 --- /dev/null +++ b/usr/src/test/test-runner/stf/include/Makefile @@ -0,0 +1,37 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master +include $(SRC)/test/Makefile.com + +ROOTOPTPKG = $(ROOT)/opt/test-runner +INCLUDEDIR = $(ROOTOPTPKG)/stf/include + +PROGS = stf.shlib + +CMDS = $(PROGS:%=$(INCLUDEDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(INCLUDEDIR) + +$(INCLUDEDIR): + $(INS.dir) + +$(INCLUDEDIR)/%: % + $(INS.file) diff --git a/usr/src/test/test-runner/stf/include/stf.shlib b/usr/src/test/test-runner/stf/include/stf.shlib new file mode 100644 index 0000000000..ea879a84c1 --- /dev/null +++ b/usr/src/test/test-runner/stf/include/stf.shlib @@ -0,0 +1,57 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + + +STF_PASS=0 +STF_FAIL=1 +STF_UNRESOLVED=2 +STF_NOTINUSE=3 +STF_UNSUPPORTED=4 +STF_UNTESTED=5 +STF_UNINITIATED=6 +STF_NORESULT=7 +STF_WARNING=8 +STF_TIMED_OUT=9 +STF_OTHER=10 + +# do this to use the names: eval echo \$STF_RESULT_NAME_${result} +STF_RESULT_NAME_0="PASS" +STF_RESULT_NAME_1="FAIL" +STF_RESULT_NAME_2="UNRESOLVED" +STF_RESULT_NAME_3="NOTINUSE" +STF_RESULT_NAME_4="UNSUPPORTED" +STF_RESULT_NAME_5="UNTESTED" +STF_RESULT_NAME_6="UNINITIATED" +STF_RESULT_NAME_7="NORESULT" +STF_RESULT_NAME_8="WARNING" +STF_RESULT_NAME_9="TIMED_OUT" +STF_RESULT_NAME_10="OTHER" + +# do this to use the array: ${STF_RESULT_NAMES[$result]} +STF_RESULT_NAMES=( "PASS" "FAIL" "UNRESOLVED" "NOTINUSE" "UNSUPPORTED" \ + "UNTESTED" "UNINITIATED" "NORESULT" "WARNING" "TIMED_OUT" "OTHER" ) diff --git a/usr/src/test/zfs-tests/Makefile b/usr/src/test/zfs-tests/Makefile new file mode 100644 index 0000000000..ff003abfbb --- /dev/null +++ b/usr/src/test/zfs-tests/Makefile @@ -0,0 +1,20 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +SUBDIRS = cmd include runfiles tests doc + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/zfs-tests/cmd/Makefile b/usr/src/test/zfs-tests/cmd/Makefile new file mode 100644 index 0000000000..d3f9661a29 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/Makefile @@ -0,0 +1,34 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +SUBDIRS = chg_usr_exec \ + devname2devid \ + dir_rd_update \ + file_check \ + file_trunc \ + file_write \ + largest_file \ + mkbusy \ + mktree \ + mmapwrite \ + randfree_file \ + readmmap \ + rename_dir \ + rm_lnkcnt_zero_file \ + scripts + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/zfs-tests/cmd/Makefile.subdirs b/usr/src/test/zfs-tests/cmd/Makefile.subdirs new file mode 100644 index 0000000000..05fa61de69 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/Makefile.subdirs @@ -0,0 +1,54 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/test/Makefile.com + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +ROOTBIN = $(ROOTOPTPKG)/bin + +OBJS = $(PROG:%=%.o) +SRCS = $(OBJS:%.o=%.c) + +CMDS = $(PROG:%=$(ROOTBIN)/%) +$(CMDS) := FILEMODE = 0555 + +CPPFLAGS += -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 + +all: $(PROG) + +$(PROG): $(OBJS) + $(LINK.c) $(OBJS) -o $@ $(LDLIBS) + $(POST_PROCESS) + +%.o: ../%.c + $(COMPILE.c) $< + +install: all $(CMDS) + +lint: lint_SRCS + +clobber: clean + -$(RM) $(PROG) + +clean: + -$(RM) $(OBJS) + +$(CMDS): $(ROOTBIN) $(PROG) + +$(ROOTBIN): + $(INS.dir) + +$(ROOTBIN)/%: % + $(INS.file) diff --git a/usr/src/test/zfs-tests/cmd/chg_usr_exec/Makefile b/usr/src/test/zfs-tests/cmd/chg_usr_exec/Makefile new file mode 100644 index 0000000000..5f3d4bbbf5 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/chg_usr_exec/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = chg_usr_exec + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/chg_usr_exec/chg_usr_exec.c b/usr/src/test/zfs-tests/cmd/chg_usr_exec/chg_usr_exec.c new file mode 100644 index 0000000000..af09d21ebb --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/chg_usr_exec/chg_usr_exec.c @@ -0,0 +1,77 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <pwd.h> + +/* extern int errno = 0; */ + +int +main(int argc, char *argv[]) +{ + char *plogin = NULL; + char cmds[BUFSIZ] = { 0 }; + char sep[] = " "; + struct passwd *ppw = NULL; + int i, len; + + if (argc < 3 || strlen(argv[1]) == 0) { + (void) printf("\tUsage: %s <login> <commands> ...\n", argv[0]); + return (1); + } + + plogin = argv[1]; + len = 0; + for (i = 2; i < argc; i++) { + (void) snprintf(cmds+len, sizeof (cmds)-len, + "%s%s", argv[i], sep); + len += strlen(argv[i]) + strlen(sep); + } + + if ((ppw = getpwnam(plogin)) == NULL) { + perror("getpwnam"); + return (errno); + } + if (setgid(ppw->pw_gid) != 0) { + perror("setgid"); + return (errno); + } + if (setuid(ppw->pw_uid) != 0) { + perror("setuid"); + return (errno); + } + + if (execl("/usr/xpg4/bin/sh", "sh", "-c", cmds, (char *)0) != 0) { + perror("execl"); + return (errno); + } + + return (0); +} diff --git a/usr/src/test/zfs-tests/cmd/devname2devid/Makefile b/usr/src/test/zfs-tests/cmd/devname2devid/Makefile new file mode 100644 index 0000000000..6ca8a0e282 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/devname2devid/Makefile @@ -0,0 +1,22 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = devname2devid + +include $(SRC)/cmd/Makefile.cmd + +LDLIBS += -ldevid + +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/devname2devid/devname2devid.c b/usr/src/test/zfs-tests/cmd/devname2devid/devname2devid.c new file mode 100644 index 0000000000..fd32874916 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/devname2devid/devname2devid.c @@ -0,0 +1,120 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#include <sys/types.h> +#include <sys/stat.h> +#include <devid.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> + +/* + * Usage: devname2devid <devicepath> + * + * Examples: + * # ./devname2devid /dev/dsk/c1t4d0s0 + * devid id1,sd@SSEAGATE_ST318404LSUN18G_3BT2G0Z300002146G4CR/a + * # ./devname2devid /dev/dsk/c1t4d0 + * devid id1,sd@SSEAGATE_ST318404LSUN18G_3BT2G0Z300002146G4CR/wd + * # ./devname2devid /dev/dsk/c1t4d0s1 + * devid id1,sd@SSEAGATE_ST318404LSUN18G_3BT2G0Z300002146G4CR/b + * # + * + * This program accepts a disk or disk slice path and prints a + * device id. + * + * Exit values: + * 0 - means success + * 1 - means failure + * + */ +int +main(int argc, char *argv[]) +{ + int fd; + ddi_devid_t devid; + char *minor_name, *devidstr, *device; +#ifdef DEBUG + devid_nmlist_t *list = NULL; + char *search_path; + int i; +#endif + + if (argc == 1) { + (void) printf("%s <devicepath> [search path]\n", + argv[0]); + exit(1); + } + device = argv[1]; + + if ((fd = open(device, O_RDONLY|O_NDELAY)) < 0) { + perror(device); + exit(1); + } + if (devid_get(fd, &devid) != 0) { + perror("devid_get"); + exit(1); + } + if (devid_get_minor_name(fd, &minor_name) != 0) { + perror("devid_get_minor_name"); + exit(1); + } + if ((devidstr = devid_str_encode(devid, minor_name)) == 0) { + perror("devid_str_encode"); + exit(1); + } + + (void) printf("devid %s\n", devidstr); + + devid_str_free(devidstr); + +#ifdef DEBUG + if (argc == 3) { + search_path = argv[2]; + } else { + search_path = "/dev/rdsk"; + } + + if (devid_deviceid_to_nmlist(search_path, devid, DEVID_MINOR_NAME_ALL, + &list)) { + perror("devid_deviceid_to_nmlist"); + exit(1); + } + + /* loop through list and process device names and numbers */ + for (i = 0; list[i].devname != NULL; i++) { + (void) printf("devname: %s %p\n", list[i].devname, list[i].dev); + } + devid_free_nmlist(list); + +#endif /* DEBUG */ + + devid_str_free(minor_name); + devid_free(devid); + + return (0); +} diff --git a/usr/src/test/zfs-tests/cmd/dir_rd_update/Makefile b/usr/src/test/zfs-tests/cmd/dir_rd_update/Makefile new file mode 100644 index 0000000000..8f6cea991b --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/dir_rd_update/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = dir_rd_update + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/dir_rd_update/dir_rd_update.c b/usr/src/test/zfs-tests/cmd/dir_rd_update/dir_rd_update.c new file mode 100644 index 0000000000..bca365c524 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/dir_rd_update/dir_rd_update.c @@ -0,0 +1,117 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Assertion: + * + * A read operation and directory update operation performed + * concurrently on the same directory can lead to deadlock + * on a UFS logging file system, but not on a ZFS file system. + */ + +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> +#include <fcntl.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#define TMP_DIR /tmp + +static char dirpath[256]; + +int +main(int argc, char **argv) +{ + char *cp1 = ""; + int i = 0; + int ret = 0; + int testdd = 0; + pid_t pid; + static const int op_num = 5; + + if (argc == 1) { + (void) printf("Usage: %s <mount point>\n", argv[0]); + exit(-1); + } + for (i = 0; i < 256; i++) { + dirpath[i] = 0; + } + + cp1 = argv[1]; + (void) strcpy(&dirpath[0], (const char *)cp1); + (void) strcat(&dirpath[strlen(dirpath)], "TMP_DIR"); + + ret = mkdir(dirpath, 0777); + if (ret != 0) { + if (errno != EEXIST) { + (void) printf("%s: mkdir(<%s>, 0777) failed: errno " + "(decimal)=%d\n", argv[0], dirpath, errno); + exit(-1); + } + } + testdd = open(dirpath, O_RDONLY|O_RSYNC|O_SYNC|O_DSYNC); + if (testdd < 0) { + (void) printf("%s: open(<%s>, O_RDONLY|O_RSYNC|O_SYNC|O_DSYNC)" + " failed: errno (decimal)=%d\n", argv[0], dirpath, errno); + exit(-1); + } else { + (void) close(testdd); + } + pid = fork(); + if (pid > 0) { + int fd = open(dirpath, O_RDONLY|O_RSYNC|O_SYNC|O_DSYNC); + char buf[16]; + int rdret; + int j = 0; + + while (j < op_num) { + (void) sleep(1); + rdret = read(fd, buf, 16); + if (rdret == -1) { + (void) printf("readdir failed"); + } + j++; + } + } else if (pid == 0) { + int fd = open(dirpath, O_RDONLY); + int chownret; + int k = 0; + + while (k < op_num) { + (void) sleep(1); + chownret = fchown(fd, 0, 0); + if (chownret == -1) { + (void) printf("chown failed"); + } + + k++; + } + } + + return (0); +} diff --git a/usr/src/test/zfs-tests/cmd/file_check/Makefile b/usr/src/test/zfs-tests/cmd/file_check/Makefile new file mode 100644 index 0000000000..ba537e9b1b --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/file_check/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = file_check + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/file_check/file_check.c b/usr/src/test/zfs-tests/cmd/file_check/file_check.c new file mode 100644 index 0000000000..ee64741f41 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/file_check/file_check.c @@ -0,0 +1,86 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#include "../file_common.h" + +static unsigned char bigbuffer[BIGBUFFERSIZE]; + +/* + * Given a filename, check that the file consists entirely + * of a particular pattern. If the pattern is not specified a + * default will be used. For default values see file_common.h + */ +int +main(int argc, char **argv) +{ + int bigfd; + long i, n; + uchar_t fillchar = DATA; + int bigbuffersize = BIGBUFFERSIZE; + int64_t read_count = 0; + + /* + * Validate arguments + */ + if (argc < 2) { + (void) printf("Usage: %s filename [pattern]\n", + argv[0]); + exit(1); + } + + if (argv[2]) { + fillchar = atoi(argv[2]); + } + + /* + * Read the file contents and check every character + * against the supplied pattern. Abort if the + * pattern check fails. + */ + if ((bigfd = open(argv[1], O_RDONLY)) == -1) { + (void) printf("open %s failed %d\n", argv[1], errno); + exit(1); + } + + do { + if ((n = read(bigfd, &bigbuffer, bigbuffersize)) == -1) { + (void) printf("read failed (%ld), %d\n", n, errno); + exit(errno); + } + + for (i = 0; i < n; i++) { + if (bigbuffer[i] != fillchar) { + (void) printf("error %s: 0x%x != 0x%x)\n", + argv[1], bigbuffer[i], fillchar); + exit(1); + } + } + + read_count += n; + } while (n == bigbuffersize); + + return (0); +} diff --git a/usr/src/test/zfs-tests/cmd/file_common.h b/usr/src/test/zfs-tests/cmd/file_common.h new file mode 100644 index 0000000000..759889e70d --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/file_common.h @@ -0,0 +1,62 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef FILE_COMMON_H +#define FILE_COMMON_H + +/* + * header file for file_* utilities. These utilities + * are used by the test cases to perform various file + * operations (append writes, for example). + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <strings.h> + +#define BLOCKSZ 8192 +#define DATA 0xa5 +#define DATA_RANGE 120 +#define BIGBUFFERSIZE 0x800000 +#define BIGFILESIZE 20 + +extern char *optarg; +extern int optind, opterr, optopt; + +#ifdef __cplusplus +} +#endif + +#endif /* FILE_COMMON_H */ diff --git a/usr/src/test/zfs-tests/cmd/file_trunc/Makefile b/usr/src/test/zfs-tests/cmd/file_trunc/Makefile new file mode 100644 index 0000000000..f105385dee --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/file_trunc/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = file_trunc + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/file_trunc/file_trunc.c b/usr/src/test/zfs-tests/cmd/file_trunc/file_trunc.c new file mode 100644 index 0000000000..818492714c --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/file_trunc/file_trunc.c @@ -0,0 +1,242 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <limits.h> +#include <errno.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/fcntl.h> +#include <sys/stat.h> +#include <sys/statvfs.h> +#include <sys/errno.h> +#include <sys/time.h> +#include <sys/ioctl.h> +#include <sys/wait.h> +#include <sys/param.h> +#include <string.h> + +#define FSIZE 256*1024*1024 +#define BSIZE 512 + +/* Initialize Globals */ +static long fsize = FSIZE; +static size_t bsize = BSIZE; +static int count = 0; +static int rflag = 0; +static int seed = 0; +static int vflag = 0; +static int errflag = 0; +static off_t offset = 0; +static char *filename = NULL; + +static void usage(char *execname); +static void parse_options(int argc, char *argv[]); +static void do_write(int fd); +static void do_trunc(int fd); + +static void +usage(char *execname) +{ + (void) fprintf(stderr, + "usage: %s [-b blocksize] [-c count] [-f filesize]" + " [-o offset] [-s seed] [-r] [-v] filename\n", execname); + (void) exit(1); +} + +int +main(int argc, char *argv[]) +{ + int i = 0; + int fd = -1; + + parse_options(argc, argv); + + fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0666); + if (fd < 0) { + perror("open"); + exit(3); + } + + while (i < count) { + (void) do_write(fd); + (void) do_trunc(fd); + + i++; + } + + (void) close(fd); + return (0); +} + +static void +parse_options(int argc, char *argv[]) +{ + int c; + + extern char *optarg; + extern int optind, optopt; + + count = fsize / bsize; + seed = time(NULL); + while ((c = getopt(argc, argv, "b:c:f:o:rs:v")) != -1) { + switch (c) { + case 'b': + bsize = atoi(optarg); + break; + + case 'c': + count = atoi(optarg); + break; + + case 'f': + fsize = atoi(optarg); + break; + + case 'o': + offset = atoi(optarg); + break; + + case 'r': + rflag++; + break; + + case 's': + seed = atoi(optarg); + break; + + case 'v': + vflag++; + break; + + case ':': + (void) fprintf(stderr, + "Option -%c requires an operand\n", optopt); + errflag++; + break; + + case '?': + (void) fprintf(stderr, + "Unrecognized option: -%c\n", optopt); + errflag++; + break; + } + + if (errflag) { + (void) usage(argv[0]); + } + } + if (argc <= optind) { + (void) fprintf(stderr, + "No filename specified\n"); + usage(argv[0]); + } + filename = argv[optind]; + + if (vflag) { + (void) fprintf(stderr, "Seed = %d\n", seed); + } + srandom(seed); +} + +static void +do_write(int fd) +{ + off_t roffset = 0; + char *buf = NULL; + char *rbuf = NULL; + + buf = (char *)calloc(1, bsize); + rbuf = (char *)calloc(1, bsize); + if (buf == NULL || rbuf == NULL) { + perror("malloc"); + exit(4); + } + + roffset = random() % fsize; + if (lseek64(fd, (offset + roffset), SEEK_SET) < 0) { + perror("lseek"); + exit(5); + } + + buf = "ZFS Test Suite Truncation Test"; + if (write(fd, buf, bsize) < bsize) { + perror("write"); + exit(6); + } + + if (rflag) { + if (lseek64(fd, (offset + roffset), SEEK_SET) < 0) { + perror("lseek"); + exit(7); + } + + if (read(fd, rbuf, bsize) < bsize) { + perror("read"); + exit(8); + } + + if (memcmp(buf, rbuf, bsize) != 0) { + perror("memcmp"); + exit(9); + } + } + if (vflag) { + (void) fprintf(stderr, + "Wrote to offset %lld\n", (offset + roffset)); + if (rflag) { + (void) fprintf(stderr, + "Read back from offset %lld\n", (offset + roffset)); + } + } + + (void) free(buf); + (void) free(rbuf); +} + +static void +do_trunc(int fd) +{ + off_t roffset = 0; + + roffset = random() % fsize; + if (ftruncate64(fd, (offset + roffset)) < 0) { + perror("truncate"); + exit(7); + } + + if (vflag) { + (void) fprintf(stderr, + "Truncated at offset %lld\n", + (offset + roffset)); + } +} diff --git a/usr/src/test/zfs-tests/cmd/file_write/Makefile b/usr/src/test/zfs-tests/cmd/file_write/Makefile new file mode 100644 index 0000000000..97a4e9038a --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/file_write/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = file_write + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/file_write/file_write.c b/usr/src/test/zfs-tests/cmd/file_write/file_write.c new file mode 100644 index 0000000000..89a6040bbd --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/file_write/file_write.c @@ -0,0 +1,231 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#include "../file_common.h" +#include <libgen.h> + +static unsigned char bigbuffer[BIGBUFFERSIZE]; + +/* + * Writes (or appends) a given value to a file repeatedly. + * See header file for defaults. + */ + +static void usage(void); + +int +main(int argc, char **argv) +{ + int bigfd; + int c; + int oflag = 0; + int err = 0; + int k; + long i; + int64_t good_writes = 0; + uchar_t nxtfillchar; + /* + * Default Parameters + */ + int write_count = BIGFILESIZE; + uchar_t fillchar = DATA; + int block_size = BLOCKSZ; + char *filename = NULL; + char *operation = NULL; + offset_t noffset, offset = 0; + int verbose = 0; + int rsync = 0; + int wsync = 0; + + /* + * Process Arguments + */ + while ((c = getopt(argc, argv, "b:c:d:s:f:o:vwr")) != -1) { + switch (c) { + case 'b': + block_size = atoi(optarg); + break; + case 'c': + write_count = atoi(optarg); + break; + case 'd': + fillchar = atoi(optarg); + break; + case 's': + offset = atoll(optarg); + break; + case 'f': + filename = optarg; + break; + case 'o': + operation = optarg; + break; + case 'v': + verbose = 1; + break; + case 'w': + wsync = 1; + break; + case 'r': + rsync = 1; + break; + case '?': + (void) printf("unknown arg %c\n", optopt); + usage(); + break; + } + } + + /* + * Validate Parameters + */ + if (!filename) { + (void) printf("Filename not specified (-f <file>)\n"); + err++; + } + + if (!operation) { + (void) printf("Operation not specified (-o <operation>).\n"); + err++; + } + + if (block_size > BIGBUFFERSIZE) { + (void) printf("block_size is too large max==%d.\n", + BIGBUFFERSIZE); + err++; + } + + if (err) usage(); + + /* + * Prepare the buffer and determine the requested operation + */ + nxtfillchar = fillchar; + k = 0; + + for (i = 0; i < block_size; i++) { + bigbuffer[i] = nxtfillchar; + + if (fillchar == 0) { + if ((k % DATA_RANGE) == 0) { + k = 0; + } + nxtfillchar = k++; + } + } + + /* + * using the strncmp of operation will make the operation match the + * first shortest match - as the operations are unique from the first + * character this means that we match single character operations + */ + if ((strncmp(operation, "create", strlen(operation) + 1)) == 0 || + (strncmp(operation, "overwrite", strlen(operation) + 1)) == 0) { + oflag = (O_RDWR|O_CREAT); + } else if ((strncmp(operation, "append", strlen(operation) + 1)) == 0) { + oflag = (O_RDWR|O_APPEND); + } else { + (void) printf("valid operations are <create|append> not '%s'\n", + operation); + usage(); + } + + if (rsync) { + oflag = oflag | O_RSYNC; + } + + if (wsync) { + oflag = oflag | O_SYNC; + } + + /* + * Given an operation (create/overwrite/append), open the file + * accordingly and perform a write of the appropriate type. + */ + if ((bigfd = open(filename, oflag, 0666)) == -1) { + (void) printf("open %s: failed [%s]%d. Aborting!\n", filename, + strerror(errno), errno); + exit(errno); + } + noffset = llseek(bigfd, offset, SEEK_SET); + if (noffset != offset) { + (void) printf("llseek %s (%lld/%lld) failed [%s]%d.Aborting!\n", + filename, offset, noffset, strerror(errno), errno); + exit(errno); + } + + if (verbose) { + (void) printf("%s: block_size = %d, write_count = %d, " + "offset = %lld, data = %s%d\n", filename, block_size, + write_count, offset, + (fillchar == 0) ? "0->" : "", + (fillchar == 0) ? DATA_RANGE : fillchar); + } + + for (i = 0; i < write_count; i++) { + ssize_t n; + + if ((n = write(bigfd, &bigbuffer, block_size)) == -1) { + (void) printf("write failed (%ld), good_writes = %lld, " + "error: %s[%d]\n", (long)n, good_writes, + strerror(errno), + errno); + exit(errno); + } + good_writes++; + } + + if (verbose) { + (void) printf("Success: good_writes = %lld (%lld)\n", + good_writes, (good_writes * block_size)); + } + + return (0); +} + +static void +usage(void) +{ + char *base = (char *)"file_write"; + char *exec = (char *)getexecname(); + + if (exec != NULL) + exec = strdup(exec); + if (exec != NULL) + base = basename(exec); + + (void) printf("Usage: %s [-v] -o {create,overwrite,append} -f file_name" + " [-b block_size]\n" + "\t[-s offset] [-c write_count] [-d data]\n" + "\twhere [data] equal to zero causes chars " + "0->%d to be repeated throughout\n", base, DATA_RANGE); + + if (exec) { + free(exec); + } + + exit(1); +} diff --git a/usr/src/test/zfs-tests/cmd/largest_file/Makefile b/usr/src/test/zfs-tests/cmd/largest_file/Makefile new file mode 100644 index 0000000000..75619a67dc --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/largest_file/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = largest_file + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/largest_file/largest_file.c b/usr/src/test/zfs-tests/cmd/largest_file/largest_file.c new file mode 100644 index 0000000000..2605bfb8ec --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/largest_file/largest_file.c @@ -0,0 +1,134 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#include "../file_common.h" +#include <sys/param.h> +#include <signal.h> +#include <stdio.h> + +/* + * -------------------------------------------------------------- + * + * Assertion: + * The last byte of the largest file size can be + * accessed without any errors. Also, the writing + * beyond the last byte of the largest file size + * will produce an errno of EFBIG. + * + * -------------------------------------------------------------- + * If the write() system call below returns a "1", + * then the last byte can be accessed. + * -------------------------------------------------------------- + */ +static void sigxfsz(int); +static void usage(char *); + +int +main(int argc, char **argv) +{ + int fd = 0; + offset_t offset = (MAXOFFSET_T - 1); + offset_t llseek_ret = 0; + int write_ret = 0; + int err = 0; + char mybuf[5]; + char *testfile; + mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; + + if (argc != 2) { + usage(argv[0]); + } + + (void) sigset(SIGXFSZ, sigxfsz); + + testfile = strdup(argv[1]); + + fd = open(testfile, O_CREAT | O_RDWR, mode); + if (fd < 0) { + perror("Failed to create testfile"); + err = errno; + goto out; + } + + llseek_ret = llseek(fd, offset, SEEK_SET); + if (llseek_ret < 0) { + perror("Failed to seek to end of testfile"); + err = errno; + goto out; + } + + write_ret = write(fd, mybuf, 1); + if (write_ret < 0) { + perror("Failed to write to end of file"); + err = errno; + goto out; + } + + offset = 0; + llseek_ret = llseek(fd, offset, SEEK_CUR); + if (llseek_ret < 0) { + perror("Failed to seek to end of file"); + err = errno; + goto out; + } + + write_ret = write(fd, mybuf, 1); + if (write_ret < 0) { + if (errno == EFBIG) { + (void) printf("write errno=EFBIG: success\n"); + err = 0; + } else { + perror("Did not receive EFBIG"); + err = errno; + } + } else { + (void) printf("write completed successfully, test failed\n"); + err = 1; + } + +out: + (void) unlink(testfile); + free(testfile); + return (err); +} + +static void +usage(char *name) +{ + (void) printf("%s <testfile>\n", name); + exit(1); +} + +/* ARGSUSED */ +static void +sigxfsz(int signo) +{ + (void) printf("\nlargest_file: sigxfsz() caught SIGXFSZ\n"); +} diff --git a/usr/src/test/zfs-tests/cmd/mkbusy/Makefile b/usr/src/test/zfs-tests/cmd/mkbusy/Makefile new file mode 100644 index 0000000000..05331aaea0 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/mkbusy/Makefile @@ -0,0 +1,22 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = mkbusy + +include $(SRC)/cmd/Makefile.cmd + +LINTFLAGS += -erroff=E_FUNC_SET_NOT_USED + +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/mkbusy/mkbusy.c b/usr/src/test/zfs-tests/cmd/mkbusy/mkbusy.c new file mode 100644 index 0000000000..c2b978d398 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/mkbusy/mkbusy.c @@ -0,0 +1,180 @@ +/* + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +/* + * Make a directory busy. If the argument is an existing file or directory, + * simply open it directly and pause. If not, verify that the parent directory + * exists, and create a new file in that directory. + */ + +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <dirent.h> +#include <strings.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> + +static void +usage(char *progname) +{ + (void) fprintf(stderr, "Usage: %s <dirname|filename>\n", progname); + exit(1); +} + +static void +fail(char *err, int rval) +{ + perror(err); + exit(rval); +} + +static void +daemonize(void) +{ + pid_t pid; + + if ((pid = fork()) < 0) { + fail("fork", 1); + } else if (pid != 0) { + (void) fprintf(stdout, "%ld\n", pid); + exit(0); + } + + (void) setsid(); + (void) close(0); + (void) close(1); + (void) close(2); +} + +int +main(int argc, char *argv[]) +{ + int ret, c; + boolean_t isdir = B_FALSE; + boolean_t fflag = B_FALSE; + boolean_t rflag = B_FALSE; + struct stat sbuf; + char *fpath = NULL; + char *prog = argv[0]; + + while ((c = getopt(argc, argv, "fr")) != -1) { + switch (c) { + /* Open the file or directory read only */ + case 'r': + rflag = B_TRUE; + break; + /* Run in the foreground */ + case 'f': + fflag = B_TRUE; + break; + default: + usage(prog); + } + } + + argc -= optind; + argv += optind; + + if (argc != 1) + usage(prog); + + if ((ret = stat(argv[0], &sbuf)) != 0) { + char *arg, *dname, *fname; + int arglen, dlen, flen; + char *slash; + + /* + * The argument supplied doesn't exist. Copy the path, and + * remove the trailing slash if presnt. + */ + if ((arg = strdup(argv[0])) == NULL) + fail("strdup", 1); + arglen = strlen(arg); + if (arg[arglen - 1] == '/') + arg[arglen - 1] = '\0'; + + /* + * Get the directory and file names, using the current directory + * if the provided path doesn't specify a directory at all. + */ + if ((slash = strrchr(arg, '/')) == NULL) { + dname = strdup("."); + fname = strdup(arg); + } else { + *slash = '\0'; + dname = strdup(arg); + fname = strdup(slash + 1); + } + free(arg); + if (dname == NULL || fname == NULL) + fail("strdup", 1); + dlen = strlen(dname); + flen = strlen(fname); + + /* The directory portion of the path must exist */ + if ((ret = stat(dname, &sbuf)) != 0 || !(sbuf.st_mode & + S_IFDIR)) + usage(prog); + + if ((fpath = (char *)malloc(dlen + 1 + flen + 1)) == NULL) + fail("malloc", 1); + (void) memset(fpath, '\0', dlen + 1 + flen + 1); + + (void) strncpy(fpath, dname, dlen); + fpath[dlen] = '/'; + (void) strncat(fpath, fname, flen); + free(dname); + free(fname); + } else if ((sbuf.st_mode & S_IFMT) == S_IFREG || + (sbuf.st_mode & S_IFMT) == S_IFLNK || + (sbuf.st_mode & S_IFMT) == S_IFCHR || + (sbuf.st_mode & S_IFMT) == S_IFBLK) { + fpath = strdup(argv[0]); + } else if ((sbuf.st_mode & S_IFMT) == S_IFDIR) { + fpath = strdup(argv[0]); + isdir = B_TRUE; + } else { + usage(prog); + } + + if (fpath == NULL) + fail("strdup", 1); + + if (isdir == B_FALSE) { + int fd, flags; + mode_t mode = S_IRUSR | S_IWUSR; + + flags = rflag == B_FALSE ? O_CREAT | O_RDWR : O_RDONLY; + + if ((fd = open(fpath, flags, mode)) < 0) + fail("open", 1); + } else { + DIR *dp; + + if ((dp = opendir(fpath)) == NULL) + fail("opendir", 1); + } + free(fpath); + + if (fflag == B_FALSE) + daemonize(); + (void) pause(); + + /* NOTREACHED */ + return (0); +} diff --git a/usr/src/test/zfs-tests/cmd/mktree/Makefile b/usr/src/test/zfs-tests/cmd/mktree/Makefile new file mode 100644 index 0000000000..5c08f227f5 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/mktree/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = mktree + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/mktree/mktree.c b/usr/src/test/zfs-tests/cmd/mktree/mktree.c new file mode 100644 index 0000000000..a6a5adfb2f --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/mktree/mktree.c @@ -0,0 +1,191 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/errno.h> +#include <sys/param.h> + +#define TYPE_D 'D' +#define TYPE_F 'F' + +extern int errno; + +static char fdname[MAXPATHLEN] = {0}; +static char *pbasedir = NULL; +static int nlevel = 2; +static int ndir = 2; +static int nfile = 2; + +static void usage(char *this); +static void crtfile(char *pname); +static char *getfdname(char *pdir, char type, int level, int dir, int file); +static int mktree(char *pbasedir, int level); + +int +main(int argc, char *argv[]) +{ + int c, ret; + + while ((c = getopt(argc, argv, "b:l:d:f:")) != -1) { + switch (c) { + case 'b': + pbasedir = optarg; + break; + case 'l': + nlevel = atoi(optarg); + break; + case 'd': + ndir = atoi(optarg); + break; + case 'f': + nfile = atoi(optarg); + break; + case '?': + usage(argv[0]); + } + } + if (nlevel < 0 || ndir < 0 || nfile < 0 || pbasedir == NULL) { + usage(argv[0]); + } + + ret = mktree(pbasedir, 1); + + return (ret); +} + +static void +usage(char *this) +{ + (void) fprintf(stderr, + "\tUsage: %s -b <base_dir> -l [nlevel] -d [ndir] -f [nfile]\n", + this); + exit(1); +} + +static int +mktree(char *pdir, int level) +{ + int d, f; + char dname[MAXPATHLEN] = {0}; + char fname[MAXPATHLEN] = {0}; + + if (level > nlevel) { + return (1); + } + + for (d = 0; d < ndir; d++) { + (void) memset(dname, '\0', sizeof (dname)); + (void) strcpy(dname, getfdname(pdir, TYPE_D, level, d, 0)); + + if (mkdir(dname, 0777) != 0) { + (void) fprintf(stderr, "mkdir(%s) failed." + "\n[%d]: %s.\n", + dname, errno, strerror(errno)); + exit(errno); + } + + /* + * No sub-directory need be created, only create files in it. + */ + if (mktree(dname, level+1) != 0) { + for (f = 0; f < nfile; f++) { + (void) memset(fname, '\0', sizeof (fname)); + (void) strcpy(fname, + getfdname(dname, TYPE_F, level+1, d, f)); + crtfile(fname); + } + } + } + + for (f = 0; f < nfile; f++) { + (void) memset(fname, '\0', sizeof (fname)); + (void) strcpy(fname, getfdname(pdir, TYPE_F, level, d, f)); + crtfile(fname); + } + + return (0); +} + +static char * +getfdname(char *pdir, char type, int level, int dir, int file) +{ + (void) snprintf(fdname, sizeof (fdname), + "%s/%c-l%dd%df%d", pdir, type, level, dir, file); + return (fdname); +} + +static void +crtfile(char *pname) +{ + int fd = -1; + int afd = -1; + int i, size; + char *context = "0123456789ABCDF"; + char *pbuf; + + if (pname == NULL) { + exit(1); + } + + size = sizeof (char) * 1024; + pbuf = (char *)valloc(size); + for (i = 0; i < size / strlen(context); i++) { + int offset = i * strlen(context); + (void) snprintf(pbuf+offset, size-offset, "%s", context); + } + + if ((fd = open(pname, O_CREAT|O_RDWR, 0777)) < 0) { + (void) fprintf(stderr, "open(%s, O_CREAT|O_RDWR, 0777) failed." + "\n[%d]: %s.\n", pname, errno, strerror(errno)); + exit(errno); + } + if (write(fd, pbuf, 1024) < 1024) { + (void) fprintf(stderr, "write(fd, pbuf, 1024) failed." + "\n[%d]: %s.\n", errno, strerror(errno)); + exit(errno); + } + + if ((afd = openat(fd, "xattr", O_CREAT | O_RDWR | O_XATTR, 0777)) < 0) { + (void) fprintf(stderr, "openat failed.\n[%d]: %s.\n", + errno, strerror(errno)); + exit(errno); + } + if (write(afd, pbuf, 1024) < 1024) { + (void) fprintf(stderr, "write(afd, pbuf, 1024) failed." + "\n[%d]: %s.\n", errno, strerror(errno)); + exit(errno); + } + + (void) close(afd); + (void) close(fd); + free(pbuf); +} diff --git a/usr/src/test/zfs-tests/cmd/mmapwrite/Makefile b/usr/src/test/zfs-tests/cmd/mmapwrite/Makefile new file mode 100644 index 0000000000..2ea1d041a9 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/mmapwrite/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = mmapwrite + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/mmapwrite/mmapwrite.c b/usr/src/test/zfs-tests/cmd/mmapwrite/mmapwrite.c new file mode 100644 index 0000000000..86559d93ab --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/mmapwrite/mmapwrite.c @@ -0,0 +1,95 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#include <unistd.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/mman.h> +#include <pthread.h> + +/* + * -------------------------------------------------------------------- + * Bug Id: 5032643 + * + * Simply writing to a file and mmaping that file at the same time can + * result in deadlock. Nothing perverse like writing from the file's + * own mapping is required. + * -------------------------------------------------------------------- + */ + +static void * +mapper(void *fdp) +{ + void *addr; + int fd = *(int *)fdp; + + if ((addr = + mmap(0, 8192, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) { + perror("mmap"); + exit(1); + } + for (;;) { + if (mmap(addr, 8192, PROT_READ, + MAP_SHARED|MAP_FIXED, fd, 0) == MAP_FAILED) { + perror("mmap"); + exit(1); + } + } + /* NOTREACHED */ + return ((void *)1); +} + +int +main(int argc, char **argv) +{ + int fd; + char buf[BUFSIZ]; + + if (argc != 2) { + (void) printf("usage: %s <file name>\n", argv[0]); + exit(1); + } + + if ((fd = open(argv[1], O_RDWR|O_CREAT|O_TRUNC, 0666)) == -1) { + perror("open"); + exit(1); + } + + if (pthread_create(NULL, NULL, mapper, &fd) != 0) { + perror("pthread_create"); + exit(1); + } + for (;;) { + if (write(fd, buf, sizeof (buf)) == -1) { + perror("write"); + exit(1); + } + } + + /* NOTREACHED */ + return (0); +} diff --git a/usr/src/test/zfs-tests/cmd/randfree_file/Makefile b/usr/src/test/zfs-tests/cmd/randfree_file/Makefile new file mode 100644 index 0000000000..b2dd8c2913 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/randfree_file/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = randfree_file + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/randfree_file/randfree_file.c b/usr/src/test/zfs-tests/cmd/randfree_file/randfree_file.c new file mode 100644 index 0000000000..dc9ae8b8a1 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/randfree_file/randfree_file.c @@ -0,0 +1,103 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +#include "../file_common.h" + +/* + * Create a file with assigned size and then free the specified + * section of the file + */ + +static void usage(char *progname); + +static void +usage(char *progname) +{ + (void) fprintf(stderr, + "usage: %s [-l filesize] [-s start-offset]" + "[-n section-len] filename\n", progname); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + char *filename = NULL; + char *buf; + size_t filesize = 0; + off_t start_off = 0; + off_t off_len = 0; + int fd, ch; + struct flock fl; + mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; + + while ((ch = getopt(argc, argv, "l:s:n:")) != EOF) { + switch (ch) { + case 'l': + filesize = atoll(optarg); + break; + case 's': + start_off = atoll(optarg); + break; + case 'n': + off_len = atoll(optarg); + break; + default: + usage(argv[0]); + break; + } + } + + if (optind == argc - 1) + filename = argv[optind]; + else + usage(argv[0]); + + buf = (char *)malloc(filesize); + + if ((fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, mode)) < 0) { + perror("open"); + return (1); + } + if (write(fd, buf, filesize) < filesize) { + perror("write"); + return (1); + } + fl.l_whence = SEEK_SET; + fl.l_start = start_off; + fl.l_len = off_len; + if (fcntl(fd, F_FREESP, &fl) != 0) { + perror("fcntl"); + return (1); + } + + free(buf); + return (0); +} diff --git a/usr/src/test/zfs-tests/cmd/readmmap/Makefile b/usr/src/test/zfs-tests/cmd/readmmap/Makefile new file mode 100644 index 0000000000..fd042be085 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/readmmap/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = readmmap + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/readmmap/readmmap.c b/usr/src/test/zfs-tests/cmd/readmmap/readmmap.c new file mode 100644 index 0000000000..6e237f3b74 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/readmmap/readmmap.c @@ -0,0 +1,137 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * -------------------------------------------------------------- + * BugId 5047993 : Getting bad read data. + * + * Usage: readmmap <filename> + * + * where: + * filename is an absolute path to the file name. + * + * Return values: + * 1 : error + * 0 : no errors + * -------------------------------------------------------------- + */ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> +#include <sys/mman.h> + +int +main(int argc, char **argv) +{ + char *filename = "badfile"; + size_t size = 4395; + size_t idx = 0; + char *buf = NULL; + char *map = NULL; + int fd = -1, bytes, retval = 0; + unsigned seed; + + if (argc < 2 || optind == argc) { + (void) fprintf(stderr, + "usage: %s <file name>\n", argv[0]); + exit(1); + } + + if ((buf = calloc(1, size)) == NULL) { + perror("calloc"); + exit(1); + } + + filename = argv[optind]; + + (void) remove(filename); + + fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0666); + if (fd == -1) { + perror("open to create"); + retval = 1; + goto end; + } + + bytes = write(fd, buf, size); + if (bytes != size) { + (void) printf("short write: %d != %ud\n", bytes, size); + retval = 1; + goto end; + } + + map = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (map == MAP_FAILED) { + perror("mmap"); + retval = 1; + goto end; + } + seed = time(NULL); + srandom(seed); + + idx = random() % size; + map[idx] = 1; + + if (msync(map, size, MS_SYNC) != 0) { + perror("msync"); + retval = 1; + goto end; + } + + if (munmap(map, size) != 0) { + perror("munmap"); + retval = 1; + goto end; + } + + bytes = pread(fd, buf, size, 0); + if (bytes != size) { + (void) printf("short read: %d != %ud\n", bytes, size); + retval = 1; + goto end; + } + + if (buf[idx] != 1) { + (void) printf( + "bad data from read! got buf[%ud]=%d, expected 1\n", + idx, buf[idx]); + retval = 1; + goto end; + } + + (void) printf("good data from read: buf[%ud]=1\n", idx); +end: + if (fd != -1) { + (void) close(fd); + } + if (buf != NULL) { + free(buf); + } + + return (retval); +} diff --git a/usr/src/test/zfs-tests/cmd/rename_dir/Makefile b/usr/src/test/zfs-tests/cmd/rename_dir/Makefile new file mode 100644 index 0000000000..3bdd13b9d0 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/rename_dir/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = rename_dir + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/rename_dir/rename_dir.c b/usr/src/test/zfs-tests/cmd/rename_dir/rename_dir.c new file mode 100644 index 0000000000..3e564326b8 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/rename_dir/rename_dir.c @@ -0,0 +1,88 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +/* + * Assertion: + * Create two directory trees in zfs filesystem, and rename + * directory across the directory structure. ZFS can handle + * the race situation. + */ + +/* + * Need to create the following directory structures before + * running this program: + * + * mkdir -p 1/2/3/4/5 a/b/c/d/e + */ + + +#include <stdlib.h> +#include <unistd.h> +#include <stdio.h> +#include <strings.h> + +int +main() +{ + int i = 1; + + switch (fork()) { + case -1: + perror("fork"); + exit(1); + break; + case 0: + while (i > 0) { + int c_count = 0; + if (rename("a/b/c", "1/2/3/c") == 0) + c_count++; + if (rename("1/2/3/c", "a/b/c") == 0) + c_count++; + if (c_count) { + (void) fprintf(stderr, "c_count: %d", c_count); + } + } + break; + default: + while (i > 0) { + int p_count = 0; + if (rename("1", "a/b/c/d/e/1") == 0) + p_count++; + if (rename("a/b/c/d/e/1", "1") == 0) + p_count++; + if (p_count) { + (void) fprintf(stderr, "p_count: %d", p_count); + } + } + break; + } + + return (0); +} diff --git a/usr/src/test/zfs-tests/cmd/rm_lnkcnt_zero_file/Makefile b/usr/src/test/zfs-tests/cmd/rm_lnkcnt_zero_file/Makefile new file mode 100644 index 0000000000..492cebb4ba --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/rm_lnkcnt_zero_file/Makefile @@ -0,0 +1,19 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +PROG = rm_lnkcnt_zero_file + +include $(SRC)/cmd/Makefile.cmd +include ../Makefile.subdirs diff --git a/usr/src/test/zfs-tests/cmd/rm_lnkcnt_zero_file/rm_lnkcnt_zero_file.c b/usr/src/test/zfs-tests/cmd/rm_lnkcnt_zero_file/rm_lnkcnt_zero_file.c new file mode 100644 index 0000000000..bc21285ad6 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/rm_lnkcnt_zero_file/rm_lnkcnt_zero_file.c @@ -0,0 +1,152 @@ +/* + * 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 2007 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ + +/* + * -------------------------------------------------------------------- + * The purpose of this test is to see if the bug reported (#4723351) for + * UFS exists when using a ZFS file system. + * -------------------------------------------------------------------- + * + */ +#define _REENTRANT 1 +#include <stdio.h> +#include <fcntl.h> +#include <pthread.h> +#include <thread.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <stdlib.h> +#include <unistd.h> +#include <strings.h> + +static const int TRUE = 1; +static char *filebase; + +static int +pickidx() +{ + return (random() % 1000); +} + +/* ARGSUSED */ +static void * +mover(void *a) +{ + char buf[256]; + int idx, len, ret; + + len = strlen(filebase) + 5; + + while (TRUE) { + idx = pickidx(); + (void) snprintf(buf, len, "%s.%03d", filebase, idx); + ret = rename(filebase, buf); + if (ret < 0 && errno != ENOENT) + (void) perror("renaming file"); + } + + return (NULL); +} + +/* ARGSUSED */ +static void * +cleaner(void *a) +{ + char buf[256]; + int idx, len, ret; + + len = strlen(filebase) + 5; + + while (TRUE) { + idx = pickidx(); + (void) snprintf(buf, len, "%s.%03d", filebase, idx); + ret = remove(buf); + if (ret < 0 && errno != ENOENT) + (void) perror("removing file"); + } + + return (NULL); +} + +static void * +writer(void *a) +{ + int *fd = (int *)a; + + while (TRUE) { + (void) close (*fd); + *fd = open(filebase, O_APPEND | O_RDWR | O_CREAT, 0644); + if (*fd < 0) + perror("refreshing file"); + (void) write(*fd, "test\n", 5); + } + + return (NULL); +} + +int +main(int argc, char **argv) +{ + int fd; + pthread_t tid; + + if (argc == 1) { + (void) printf("Usage: %s <filebase>\n", argv[0]); + exit(-1); + } + + filebase = argv[1]; + fd = open(filebase, O_APPEND | O_RDWR | O_CREAT, 0644); + if (fd < 0) { + perror("creating test file"); + exit(-1); + } + + (void) thr_setconcurrency(4); /* 3 threads + main */ + (void) pthread_create(&tid, NULL, mover, NULL); + (void) pthread_create(&tid, NULL, cleaner, NULL); + (void) pthread_create(&tid, NULL, writer, (void *) &fd); + + while (TRUE) { + int ret; + struct stat st; + + ret = stat(filebase, &st); + if (ret == 0 && (st.st_nlink > 2 || st.st_nlink < 1)) { + (void) printf("st.st_nlink = %d, exiting\n", \ + (int)st.st_nlink); + exit(0); + } + (void) sleep(1); + } + + return (0); +} diff --git a/usr/src/test/zfs-tests/cmd/scripts/Makefile b/usr/src/test/zfs-tests/cmd/scripts/Makefile new file mode 100644 index 0000000000..4454378adb --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/scripts/Makefile @@ -0,0 +1,36 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +ROOTBIN = $(ROOTOPTPKG)/bin + +PROGS = zfstest + +CMDS = $(PROGS:%=$(ROOTBIN)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(ROOTBIN) + +$(ROOTBIN): + $(INS.dir) + +$(ROOTBIN)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/cmd/scripts/zfstest.ksh b/usr/src/test/zfs-tests/cmd/scripts/zfstest.ksh new file mode 100644 index 0000000000..37fa0deb50 --- /dev/null +++ b/usr/src/test/zfs-tests/cmd/scripts/zfstest.ksh @@ -0,0 +1,133 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export STF_SUITE="/opt/zfs-tests" +export STF_TOOLS="/opt/test-runner/stf" +runner="/opt/test-runner/bin/run" +auto_detect=false + +function fail +{ + echo $1 + exit ${2:-1} +} + +function find_disks +{ + typeset all_disks=$(echo '' | sudo /usr/sbin/format | awk \ + '/c[0-9]/ {print $2}') + typeset used_disks=$(/sbin/zpool status | awk \ + '/c[0-9]*t[0-9a-f]*d[0-9]/ {print $1}' | sed 's/s[0-9]//g') + + typeset disk used avail_disks + for disk in $all_disks; do + for used in $used_disks; do + [[ "$disk" = "$used" ]] && continue 2 + done + [[ -n $avail_disks ]] && avail_disks="$avail_disks $disk" + [[ -z $avail_disks ]] && avail_disks="$disk" + done + + echo $avail_disks +} + +function find_rpool +{ + typeset ds=$(/usr/sbin/mount | awk '/^\/ / {print $3}') + echo ${ds%%/*} +} + +function find_runfile +{ + typeset distro= + if [[ -d /opt/delphix && -h /etc/delphix/version ]]; then + distro=delphix + elif [[ 0 -ne $(grep -c OpenIndiana /etc/release 2>/dev/null) ]]; then + distro=openindiana + fi + + [[ -n $distro ]] && echo $STF_SUITE/runfiles/$distro.run +} + +function verify_id +{ + [[ $(id -u) = "0" ]] && fail "This script must not be run as root." + + sudo -n id >/dev/null 2>&1 + [[ $? -eq 0 ]] || fail "User must be able to sudo without a password." + + typeset -i priv_cnt=$(ppriv $$ | egrep -v \ + ": basic$| L:| <none>|$$:" | wc -l) + [[ $priv_cnt -ne 0 ]] && fail "User must only have basic privileges." +} + +function verify_disks +{ + typeset disk + for disk in $DISKS; do + sudo /usr/sbin/prtvtoc /dev/rdsk/${disk}s0 >/dev/null 2>&1 + [[ $? -eq 0 ]] || return 1 + done + return 0 +} + +verify_id + +while getopts ac:q c; do + case $c in + 'a') + auto_detect=true + ;; + 'c') + runfile=$OPTARG + [[ -f $runfile ]] || fail "Cannot read file: $runfile" + ;; + 'q') + quiet='-q' + ;; + esac +done +shift $((OPTIND - 1)) + +# If the user specified -a, then use free disks, otherwise use those in $DISKS. +if $auto_detect; then + export DISKS=$(find_disks) +elif [[ -z $DISKS ]]; then + fail "\$DISKS not set in env, and -a not specified." +else + verify_disks || fail "Couldn't verify all the disks in \$DISKS" +fi + +# Add the rpool to $KEEP according to its contents. It's ok to list it twice. +if [[ -z $KEEP ]]; then + export KEEP="^$(find_rpool)\$" +else + export KEEP="^$(echo $KEEP | sed 's/ /|$/')\$" + KEEP+="|^$(find_rpool)\$" +fi + +[[ -z $runfile ]] && runfile=$(find_runfile) +[[ -z $runfile ]] && fail "Couldn't determine distro" + +. $STF_SUITE/include/default.cfg + +num_disks=$(echo $DISKS | awk '{print NF}') +[[ $num_disks -lt 3 ]] && fail "Not enough disks to run ZFS Test Suite" + +$runner $quiet -c $runfile + +exit $? diff --git a/usr/src/test/zfs-tests/doc/Makefile b/usr/src/test/zfs-tests/doc/Makefile new file mode 100644 index 0000000000..94dc6d046c --- /dev/null +++ b/usr/src/test/zfs-tests/doc/Makefile @@ -0,0 +1,35 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +READMES = README + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests + +FILES = $(READMES:%=$(ROOTOPTPKG)/%) +$(FILES) := FILEMODE = 0444 + +all: $(READMES) + +install: $(ROOTOPTPKG) $(FILES) + +clean lint clobber: + +$(ROOTOPTPKG): + $(INS.dir) + +$(ROOTOPTPKG)/%: % + $(INS.file) diff --git a/usr/src/test/zfs-tests/doc/README b/usr/src/test/zfs-tests/doc/README new file mode 100644 index 0000000000..45b3fc52bf --- /dev/null +++ b/usr/src/test/zfs-tests/doc/README @@ -0,0 +1,77 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +ZFS Test Suite README + +1. Building and installing the ZFS Test Suite +2. Running the ZFS Test Suite +3. Test results + +-------------------------------------------------------------------------------- + +1. Building and installing the ZFS Test Suite + +The ZFS Test Suite runs under the testrunner framework (which can be installed +as pkg:/system/test/testrunner). To build both the ZFS Test Suite and the +testrunner without running a full nightly: + + build_machine$ bldenv [-d] <your_env_file> + build_machine$ cd $SRC/test + build_machine$ dmake install + build_machine$ cd $SRC/pkg + build_machine$ dmake install + +Then set the publisher on the test machine to point to your repository and +install the ZFS Test Suite. + + test_machine# pkg install pkg:/system/test/zfstest + +Note, the framework will be installed automatically, as the ZFS Test Suite +depends on it. + +2. Running the ZFS Test Suite + +The pre-requisites for running the ZFS Test Suite are: + - Three scratch disks + - Specify the disks you wish to use in the $DISKS variable, as a + space delimited list like this: DISKS='c3t1d0 c3t2d0 c3t3d0' + - Use the '-a' option to the zfstest script and all unused disks on + the system are eligible. With '-a' specified, $DISKS is ignored. + - A non-root user with the full set of basic privileges and the ability + to sudo(1M) to root without a password to run the test. + - Specify any pools you wish to preserve as a space delimited list in + the $KEEP variable. The root pool is added automatically. + +Once the pre-requisites are satisfied, simply run the zfstest script: + + test_machine$ /opt/zfs-tests/bin/zfstest [-aq] + +When the '-q' option is specified, it is passed to run(1) which causes output +to be written to the console only for tests that do not pass and the results +summary. + +The ZFS Test Suite allows the user to specify a subset of the tests via a +runfile. The format of the runfile is explained in run(1), and the files that +zfstest uses are available for reference under /opt/zfs-tests/runfiles. To +specify a custom runfile, use the -c option: + + test_machine$ /opt/zfs-tests/bin/zfstest [-aq] -c my_tests.run + +3. Test results + +While the ZFS Test Suite is running, one informational line is printed at the +end of each test, and a results summary is printed at the end of the run. The +results summary includes the location of the complete logs, which is of the +form /var/tmp/test_results/<ISO 8601 date>. diff --git a/usr/src/test/zfs-tests/include/Makefile b/usr/src/test/zfs-tests/include/Makefile new file mode 100644 index 0000000000..82c00da07e --- /dev/null +++ b/usr/src/test/zfs-tests/include/Makefile @@ -0,0 +1,44 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/test/Makefile.com + +include $(SRC)/Makefile.master + +SRCS = commands.cfg \ + default.cfg \ + libtest.shlib \ + math.shlib \ + properties.shlib + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +INCLUDEDIR = $(ROOTOPTPKG)/include + +CMDS = $(SRCS:%=$(INCLUDEDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all: $(SRCS) + +install: $(CMDS) + +clean lint clobber: + +$(CMDS): $(INCLUDEDIR) $(SRCS) + +$(INCLUDEDIR): + $(INS.dir) + +$(INCLUDEDIR)/%: % + $(INS.file) diff --git a/usr/src/test/zfs-tests/include/commands.cfg b/usr/src/test/zfs-tests/include/commands.cfg new file mode 100644 index 0000000000..cd8353d260 --- /dev/null +++ b/usr/src/test/zfs-tests/include/commands.cfg @@ -0,0 +1,161 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export ARP="/usr/sbin/arp" +export AWK="/usr/bin/awk" +export BASENAME="/usr/bin/basename" +export BC="/usr/bin/bc" +export BUNZIP2="/usr/bin/bunzip2" +export BZCAT="/usr/bin/bzcat" +# bzip2, bunzip2 and bzcat prepend the contents of $BZIP2 or $BZIP to any +# arguments. Setting BZIP2 here will lead to hard-to-diagnose unhappiness. +export CAT="/usr/bin/cat" +export CD="/usr/bin/cd" +export CHGRP="/usr/bin/chgrp" +export CHMOD="/usr/bin/chmod" +export CHOWN="/usr/bin/chown" +export CKSUM="/usr/bin/cksum" +export CLRI="/usr/sbin/clri" +export CMP="/usr/bin/cmp" +export COMPRESS="/usr/bin/compress" +export COREADM="/usr/bin/coreadm" +export CP="/usr/bin/cp" +export CPIO="/usr/bin/cpio" +export CUT="/usr/bin/cut" +export DATE="/usr/bin/date" +export DD="/usr/bin/dd" +export DEVFSADM="/usr/sbin/devfsadm" +export DF="/usr/bin/df" +export DIFF="/usr/bin/diff" +export DIRCMP="/usr/bin/dircmp" +export DIRNAME="/usr/bin/dirname" +export DU="/usr/bin/du" +export DUMPADM="/usr/sbin/dumpadm" +export ECHO="/usr/bin/echo" +export EGREP="/usr/bin/egrep" +# Don't use $ENV here, because in ksh scripts it evaluates to +# $HOME/.kshrc - likely not what you wanted. +export FDISK="/usr/sbin/fdisk" +export FF="/usr/sbin/ff" +export FGREP="/usr/bin/fgrep" +export FILE="/usr/bin/file" +export FIND="/usr/bin/find" +export FMADM="/usr/sbin/fmadm" +export FMDUMP="/usr/sbin/fmdump" +export FORMAT="/usr/sbin/format" +export FSCK="/usr/sbin/fsck" +export FSDB="/usr/sbin/fsdb" +export FSIRAND="/usr/sbin/fsirand" +export FSTYP="/usr/sbin/fstyp" +export GETENT="/usr/bin/getent" +export GETMAJOR="/usr/sbin/getmajor" +export GNUDD="/usr/gnu/bin/dd" +export GREP="/usr/bin/grep" +export GROUPADD="/usr/sbin/groupadd" +export GROUPDEL="/usr/sbin/groupdel" +export GROUPMOD="/usr/sbin/groupmod" +export GROUPS="/usr/bin/groups" +export HEAD="/usr/bin/head" +export HOSTNAME="/usr/bin/hostname" +export ID="/usr/bin/id" +export ISAINFO="/usr/bin/isainfo" +export ISCSIADM="/usr/sbin/iscsiadm" +export KILL="/usr/bin/kill" +export KSH="/usr/bin/ksh" +export KSTAT="/usr/bin/kstat" +export LABELIT="/usr/sbin/labelit" +export LOCKFS="/usr/sbin/lockfs" +export LOFIADM="/usr/sbin/lofiadm" +export LOGNAME="/usr/bin/logname" +export LS="/usr/bin/ls" +export MD5SUM="/usr/bin/md5sum" +export MDB="/usr/bin/mdb" +export METACLEAR="/usr/sbin/metaclear" +export METADB="/usr/sbin/metadb" +export METAINIT="/usr/sbin/metainit" +export METASTAT="/usr/sbin/metastat" +export MKDIR="/usr/bin/mkdir" +export MKFILE="/usr/sbin/mkfile" +export MKNOD="/usr/sbin/mknod" +export MODINFO="/usr/sbin/modinfo" +export MODUNLOAD="/usr/sbin/modunload" +export MOUNT="/usr/sbin/mount" +export MV="/usr/bin/mv" +export NAWK="/usr/bin/nawk" +export NCHECK="/usr/sbin/ncheck" +export NEWFS="/usr/sbin/newfs" +export PACK="/usr/bin/pack" +export PAGESIZE="/usr/bin/pagesize" +export PAX="/usr/bin/pax" +export PFEXEC="/usr/bin/pfexec" +export PGREP="/usr/bin/pgrep" +export PING="/usr/sbin/ping" +export PKGINFO="/usr/bin/pkginfo" +export PKILL="/usr/bin/pkill" +export PPRIV="/usr/bin/ppriv" +export PRINTF="/usr/bin/printf" +export PRTVTOC="/usr/sbin/prtvtoc" +export PS="/usr/bin/ps" +export PSRINFO="/usr/sbin/psrinfo" +export PWD="/usr/bin/pwd" +export PYTHON="/usr/bin/python" +export QUOTAON="/usr/sbin/quotaon" +export RCP="/usr/bin/rcp" +export REBOOT="/usr/sbin/reboot" +export RM="/usr/bin/rm" +export RMDIR="/usr/bin/rmdir" +export RSH="/usr/bin/rsh" +export RUNAT="/usr/bin/runat" +export SED="/usr/bin/sed" +export SHARE="/usr/sbin/share" +export SHUF="/usr/bin/shuf" +export SLEEP="/usr/bin/sleep" +export SORT="/usr/bin/sort" +export STRINGS="/usr/bin/strings" +export SU="/usr/bin/su" +export SUM="/usr/bin/sum" +export SVCADM="/usr/sbin/svcadm" +export SVCS="/usr/bin/svcs" +export SWAP="/usr/sbin/swap" +export SWAPADD="/sbin/swapadd" +export SYNC="/usr/bin/sync" +export TAIL="/usr/bin/tail" +export TAR="/usr/sbin/tar" +export TOUCH="/usr/bin/touch" +export TR="/usr/bin/tr" +export TRUE="/usr/bin/true" +export TUNEFS="/usr/sbin/tunefs" +export UFSDUMP="/usr/sbin/ufsdump" +export UFSRESTORE="/usr/sbin/ufsrestore" +export UMASK="/usr/bin/umask" +export UMOUNT="/usr/sbin/umount" +export UNAME="/usr/bin/uname" +export UNCOMPRESS="/usr/bin/uncompress" +export UNIQ="/usr/bin/uniq" +export UNPACK="/usr/bin/unpack" +export UNSHARE="/usr/sbin/unshare" +export USERADD="/usr/sbin/useradd" +export USERDEL="/usr/sbin/userdel" +export USERMOD="/usr/sbin/usermod" +export WAIT="/usr/bin/wait" +export WC="/usr/bin/wc" +export ZDB="/usr/sbin/zdb" +export ZFS="/usr/sbin/zfs" +export ZHACK="/usr/sbin/zhack" +export ZLOGIN="/usr/sbin/zlogin" +export ZONEADM="/usr/sbin/zoneadm" +export ZONECFG="/usr/sbin/zonecfg" +export ZONENAME="/usr/bin/zonename" +export ZPOOL="/usr/sbin/zpool" diff --git a/usr/src/test/zfs-tests/include/default.cfg b/usr/src/test/zfs-tests/include/default.cfg new file mode 100644 index 0000000000..72079889cc --- /dev/null +++ b/usr/src/test/zfs-tests/include/default.cfg @@ -0,0 +1,149 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/commands.cfg +. $STF_SUITE/include/libtest.shlib + +# Define run length constants +export RT_LONG="3" +export RT_MEDIUM="2" +export RT_SHORT="1" + +# Define macro for zone test +export ZONE_POOL="zonepool" +export ZONE_CTR="zonectr" + +# Test Suite Specific Commands +export CHG_USR_EXEC="/opt/zfs-tests/bin/chg_usr_exec" +export DEVNAME2DEVID="/opt/zfs-tests/bin/devname2devid" +export DIR_RD_UPDATE="/opt/zfs-tests/bin/dir_rd_update" +export FILE_CHECK="/opt/zfs-tests/bin/file_check" +export FILE_TRUNC="/opt/zfs-tests/bin/file_trunc" +export FILE_WRITE="/opt/zfs-tests/bin/file_write" +export LARGEST_FILE="/opt/zfs-tests/bin/largest_file" +export MKBUSY="/opt/zfs-tests/bin/mkbusy" +export MKTREE="/opt/zfs-tests/bin/mktree" +export MMAPWRITE="/opt/zfs-tests/bin/mmapwrite" +export RANDFREE_FILE="/opt/zfs-tests/bin/randfree_file" +export READMMAP="/opt/zfs-tests/bin/readmmap" +export RENAME_DIR="/opt/zfs-tests/bin/rename_dir" +export RM_LNKCNT_ZERO_FILE="/opt/zfs-tests/bin/rm_lnkcnt_zero_file" + +# ensure we're running in the C locale, since +# localised messages may result in test failures +export LC_ALL="C" +export LANG="C" + +# +# pattern to ignore from 'zpool list'. +# +export NO_POOLS="no pools available" + +# pattern to ignore from 'zfs list'. +export NO_DATASETS="no datasets available" + +export TEST_BASE_DIR="/" + +# Default to compression ON +export COMPRESSION_PROP=on + +# Default to using the checksum +export CHECKSUM_PROP=on + +# some common variables used by test scripts : + +# some test pool names +export TESTPOOL=testpool.$$ +export TESTPOOL1=testpool1.$$ +export TESTPOOL2=testpool2.$$ +export TESTPOOL3=testpool3.$$ + +# some test file system names +export TESTFS=testfs.$$ +export TESTFS1=testfs1.$$ +export TESTFS2=testfs2.$$ +export TESTFS3=testfs3.$$ + +# some test directory names +export TESTDIR=${TEST_BASE_DIR%%/}/testdir$$ +export TESTDIR0=${TEST_BASE_DIR%%/}/testdir0$$ +export TESTDIR1=${TEST_BASE_DIR%%/}/testdir1$$ +export TESTDIR2=${TEST_BASE_DIR%%/}/testdir2$$ + +export ZFSROOT= + +export TESTSNAP=testsnap$$ +export TESTSNAP1=testsnap1$$ +export TESTSNAP2=testsnap2$$ +export TESTCLONE=testclone$$ +export TESTCLONE1=testclone1$$ +export TESTCLONE2=testclone2$$ +export TESTCLCT=testclct$$ +export TESTCTR=testctr$$ +export TESTCTR1=testctr1$$ +export TESTCTR2=testctr2$$ +export TESTVOL=testvol$$ +export TESTVOL1=testvol1$$ +export TESTVOL2=testvol2$$ +export TESTFILE0=testfile0.$$ +export TESTFILE1=testfile1.$$ +export TESTFILE2=testfile2.$$ + +export LONGPNAME="poolname50charslong_012345678901234567890123456789" +export LONGFSNAME="fsysname50charslong_012345678901234567890123456789" +export SNAPFS="$TESTPOOL/$TESTFS@$TESTSNAP" +export SNAPFS1="$TESTPOOL/$TESTVOL@$TESTSNAP" + +export VOLSIZE=150m +export BIGVOLSIZE=1eb + +# Default to limit disks to be checked +export MAX_FINDDISKSNUM=6 + +# For iscsi target support +export ISCSITGTFILE=/tmp/iscsitgt_file +export ISCSITGT_FMRI=svc:/system/iscsitgt:default + +export AUTO_SNAP=$($SVCS -a | $GREP auto-snapshot | $GREP online | $AWK \ + '{print $3}') + +# +# finally, if we're running in a local zone +# we take some additional actions +if ! is_global_zone; then + reexport_pool +fi + +export ZFS_VERSION=5 +export ZFS_ALL_VERSIONS="1 2 3 4 5" + +for i in $ZFS_ALL_VERSIONS; do + eval 'export ZFS_VERSION_$i="v${i}-fs"' +done diff --git a/usr/src/test/zfs-tests/include/libtest.shlib b/usr/src/test/zfs-tests/include/libtest.shlib new file mode 100644 index 0000000000..3cd2927827 --- /dev/null +++ b/usr/src/test/zfs-tests/include/libtest.shlib @@ -0,0 +1,2571 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. ${STF_TOOLS}/contrib/include/logapi.shlib + +ZFS=${ZFS:-/usr/sbin/zfs} +ZPOOL=${ZPOOL:-/usr/sbin/zpool} + +# Determine whether a dataset is mounted +# +# $1 dataset name +# $2 filesystem type; optional - defaulted to zfs +# +# Return 0 if dataset is mounted; 1 if unmounted; 2 on error + +function ismounted +{ + typeset fstype=$2 + [[ -z $fstype ]] && fstype=zfs + typeset out dir name ret + + case $fstype in + zfs) + if [[ "$1" == "/"* ]] ; then + for out in $($ZFS mount | $AWK '{print $2}'); do + [[ $1 == $out ]] && return 0 + done + else + for out in $($ZFS mount | $AWK '{print $1}'); do + [[ $1 == $out ]] && return 0 + done + fi + ;; + ufs|nfs) + out=$($DF -F $fstype $1 2>/dev/null) + ret=$? + (($ret != 0)) && return $ret + + dir=${out%%\(*} + dir=${dir%% *} + name=${out##*\(} + name=${name%%\)*} + name=${name%% *} + + [[ "$1" == "$dir" || "$1" == "$name" ]] && return 0 + ;; + esac + + return 1 +} + +# Return 0 if a dataset is mounted; 1 otherwise +# +# $1 dataset name +# $2 filesystem type; optional - defaulted to zfs + +function mounted +{ + ismounted $1 $2 + (($? == 0)) && return 0 + return 1 +} + +# Return 0 if a dataset is unmounted; 1 otherwise +# +# $1 dataset name +# $2 filesystem type; optional - defaulted to zfs + +function unmounted +{ + ismounted $1 $2 + (($? == 1)) && return 0 + return 1 +} + +# split line on "," +# +# $1 - line to split + +function splitline +{ + $ECHO $1 | $SED "s/,/ /g" +} + +function default_setup +{ + default_setup_noexit "$@" + + log_pass +} + +# +# Given a list of disks, setup storage pools and datasets. +# +function default_setup_noexit +{ + typeset disklist=$1 + typeset container=$2 + typeset volume=$3 + + if is_global_zone; then + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi + [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL + log_must $ZPOOL create -f $TESTPOOL $disklist + else + reexport_pool + fi + + $RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR + $MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR + + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + if [[ -n $container ]]; then + $RM -rf $TESTDIR1 || \ + log_unresolved Could not remove $TESTDIR1 + $MKDIR -p $TESTDIR1 || \ + log_unresolved Could not create $TESTDIR1 + + log_must $ZFS create $TESTPOOL/$TESTCTR + log_must $ZFS set canmount=off $TESTPOOL/$TESTCTR + log_must $ZFS create $TESTPOOL/$TESTCTR/$TESTFS1 + log_must $ZFS set mountpoint=$TESTDIR1 \ + $TESTPOOL/$TESTCTR/$TESTFS1 + fi + + if [[ -n $volume ]]; then + if is_global_zone ; then + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + else + log_must $ZFS create $TESTPOOL/$TESTVOL + fi + fi +} + +# +# Given a list of disks, setup a storage pool, file system and +# a container. +# +function default_container_setup +{ + typeset disklist=$1 + + default_setup "$disklist" "true" +} + +# +# Given a list of disks, setup a storage pool,file system +# and a volume. +# +function default_volume_setup +{ + typeset disklist=$1 + + default_setup "$disklist" "" "true" +} + +# +# Given a list of disks, setup a storage pool,file system, +# a container and a volume. +# +function default_container_volume_setup +{ + typeset disklist=$1 + + default_setup "$disklist" "true" "true" +} + +# +# Create a snapshot on a filesystem or volume. Defaultly create a snapshot on +# filesystem +# +# $1 Existing filesystem or volume name. Default, $TESTFS +# $2 snapshot name. Default, $TESTSNAP +# +function create_snapshot +{ + typeset fs_vol=${1:-$TESTFS} + typeset snap=${2:-$TESTSNAP} + + [[ -z $fs_vol ]] && log_fail "Filesystem or volume's name is undefined." + [[ -z $snap ]] && log_fail "Snapshot's name is undefined." + + if snapexists $fs_vol@$snap; then + log_fail "$fs_vol@$snap already exists." + fi + datasetexists $fs_vol || \ + log_fail "$fs_vol must exist." + + log_must $ZFS snapshot $fs_vol@$snap +} + +# +# Create a clone from a snapshot, default clone name is $TESTCLONE. +# +# $1 Existing snapshot, $TESTPOOL/$TESTFS@$TESTSNAP is default. +# $2 Clone name, $TESTPOOL/$TESTCLONE is default. +# +function create_clone # snapshot clone +{ + typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} + typeset clone=${2:-$TESTPOOL/$TESTCLONE} + + [[ -z $snap ]] && \ + log_fail "Snapshot name is undefined." + [[ -z $clone ]] && \ + log_fail "Clone name is undefined." + + log_must $ZFS clone $snap $clone +} + +function default_mirror_setup +{ + default_mirror_setup_noexit $1 $2 $3 + + log_pass +} + +# +# Given a pair of disks, set up a storage pool and dataset for the mirror +# @parameters: $1 the primary side of the mirror +# $2 the secondary side of the mirror +# @uses: ZPOOL ZFS TESTPOOL TESTFS +function default_mirror_setup_noexit +{ + readonly func="default_mirror_setup_noexit" + typeset primary=$1 + typeset secondary=$2 + + [[ -z $primary ]] && \ + log_fail "$func: No parameters passed" + [[ -z $secondary ]] && \ + log_fail "$func: No secondary partition passed" + [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL + log_must $ZPOOL create -f $TESTPOOL mirror $@ + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +} + +# +# create a number of mirrors. +# We create a number($1) of 2 way mirrors using the pairs of disks named +# on the command line. These mirrors are *not* mounted +# @parameters: $1 the number of mirrors to create +# $... the devices to use to create the mirrors on +# @uses: ZPOOL ZFS TESTPOOL +function setup_mirrors +{ + typeset -i nmirrors=$1 + + shift + while ((nmirrors > 0)); do + log_must test -n "$1" -a -n "$2" + [[ -d /$TESTPOOL$nmirrors ]] && $RM -rf /$TESTPOOL$nmirrors + log_must $ZPOOL create -f $TESTPOOL$nmirrors mirror $1 $2 + shift 2 + ((nmirrors = nmirrors - 1)) + done +} + +# +# create a number of raidz pools. +# We create a number($1) of 2 raidz pools using the pairs of disks named +# on the command line. These pools are *not* mounted +# @parameters: $1 the number of pools to create +# $... the devices to use to create the pools on +# @uses: ZPOOL ZFS TESTPOOL +function setup_raidzs +{ + typeset -i nraidzs=$1 + + shift + while ((nraidzs > 0)); do + log_must test -n "$1" -a -n "$2" + [[ -d /$TESTPOOL$nraidzs ]] && $RM -rf /$TESTPOOL$nraidzs + log_must $ZPOOL create -f $TESTPOOL$nraidzs raidz $1 $2 + shift 2 + ((nraidzs = nraidzs - 1)) + done +} + +# +# Destroy the configured testpool mirrors. +# the mirrors are of the form ${TESTPOOL}{number} +# @uses: ZPOOL ZFS TESTPOOL +function destroy_mirrors +{ + default_cleanup_noexit + + log_pass +} + +# +# Given a minimum of two disks, set up a storage pool and dataset for the raid-z +# $1 the list of disks +# +function default_raidz_setup +{ + typeset disklist="$*" + disks=(${disklist[*]}) + + if [[ ${#disks[*]} -lt 2 ]]; then + log_fail "A raid-z requires a minimum of two disks." + fi + + [[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL + log_must $ZPOOL create -f $TESTPOOL raidz $1 $2 $3 + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + log_pass +} + +# +# Common function used to cleanup storage pools and datasets. +# +# Invoked at the start of the test suite to ensure the system +# is in a known state, and also at the end of each set of +# sub-tests to ensure errors from one set of tests doesn't +# impact the execution of the next set. + +function default_cleanup +{ + default_cleanup_noexit + + log_pass +} + +function default_cleanup_noexit +{ + typeset exclude="" + typeset pool="" + # + # Destroying the pool will also destroy any + # filesystems it contains. + # + if is_global_zone; then + $ZFS unmount -a > /dev/null 2>&1 + exclude=`eval $ECHO \"'(${KEEP})'\"` + ALL_POOLS=$($ZPOOL list -H -o name \ + | $GREP -v "$NO_POOLS" | $EGREP -v "$exclude") + # Here, we loop through the pools we're allowed to + # destroy, only destroying them if it's safe to do + # so. + while [ ! -z ${ALL_POOLS} ] + do + for pool in ${ALL_POOLS} + do + if safe_to_destroy_pool $pool ; + then + destroy_pool $pool + fi + ALL_POOLS=$($ZPOOL list -H -o name \ + | $GREP -v "$NO_POOLS" \ + | $EGREP -v "$exclude") + done + done + + $ZFS mount -a + else + typeset fs="" + for fs in $($ZFS list -H -o name \ + | $GREP "^$ZONE_POOL/$ZONE_CTR[01234]/"); do + datasetexists $fs && \ + log_must $ZFS destroy -Rf $fs + done + + # Need cleanup here to avoid garbage dir left. + for fs in $($ZFS list -H -o name); do + [[ $fs == /$ZONE_POOL ]] && continue + [[ -d $fs ]] && log_must $RM -rf $fs/* + done + + # + # Reset the $ZONE_POOL/$ZONE_CTR[01234] file systems property to + # the default value + # + for fs in $($ZFS list -H -o name); do + if [[ $fs == $ZONE_POOL/$ZONE_CTR[01234] ]]; then + log_must $ZFS set reservation=none $fs + log_must $ZFS set recordsize=128K $fs + log_must $ZFS set mountpoint=/$fs $fs + typeset enc="" + enc=$(get_prop encryption $fs) + if [[ $? -ne 0 ]] || [[ -z "$enc" ]] || \ + [[ "$enc" == "off" ]]; then + log_must $ZFS set checksum=on $fs + fi + log_must $ZFS set compression=off $fs + log_must $ZFS set atime=on $fs + log_must $ZFS set devices=off $fs + log_must $ZFS set exec=on $fs + log_must $ZFS set setuid=on $fs + log_must $ZFS set readonly=off $fs + log_must $ZFS set snapdir=hidden $fs + log_must $ZFS set aclmode=groupmask $fs + log_must $ZFS set aclinherit=secure $fs + fi + done + fi + + [[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR +} + + +# +# Common function used to cleanup storage pools, file systems +# and containers. +# +function default_container_cleanup +{ + if ! is_global_zone; then + reexport_pool + fi + + ismounted $TESTPOOL/$TESTCTR/$TESTFS1 + [[ $? -eq 0 ]] && \ + log_must $ZFS unmount $TESTPOOL/$TESTCTR/$TESTFS1 + + datasetexists $TESTPOOL/$TESTCTR/$TESTFS1 && \ + log_must $ZFS destroy -R $TESTPOOL/$TESTCTR/$TESTFS1 + + datasetexists $TESTPOOL/$TESTCTR && \ + log_must $ZFS destroy -Rf $TESTPOOL/$TESTCTR + + [[ -e $TESTDIR1 ]] && \ + log_must $RM -rf $TESTDIR1 > /dev/null 2>&1 + + default_cleanup +} + +# +# Common function used to cleanup snapshot of file system or volume. Default to +# delete the file system's snapshot +# +# $1 snapshot name +# +function destroy_snapshot +{ + typeset snap=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} + + if ! snapexists $snap; then + log_fail "'$snap' does not existed." + fi + + # + # For the sake of the value which come from 'get_prop' is not equal + # to the really mountpoint when the snapshot is unmounted. So, firstly + # check and make sure this snapshot's been mounted in current system. + # + typeset mtpt="" + if ismounted $snap; then + mtpt=$(get_prop mountpoint $snap) + (($? != 0)) && \ + log_fail "get_prop mountpoint $snap failed." + fi + + log_must $ZFS destroy $snap + [[ $mtpt != "" && -d $mtpt ]] && \ + log_must $RM -rf $mtpt +} + +# +# Common function used to cleanup clone. +# +# $1 clone name +# +function destroy_clone +{ + typeset clone=${1:-$TESTPOOL/$TESTCLONE} + + if ! datasetexists $clone; then + log_fail "'$clone' does not existed." + fi + + # With the same reason in destroy_snapshot + typeset mtpt="" + if ismounted $clone; then + mtpt=$(get_prop mountpoint $clone) + (($? != 0)) && \ + log_fail "get_prop mountpoint $clone failed." + fi + + log_must $ZFS destroy $clone + [[ $mtpt != "" && -d $mtpt ]] && \ + log_must $RM -rf $mtpt +} + +# Return 0 if a snapshot exists; $? otherwise +# +# $1 - snapshot name + +function snapexists +{ + $ZFS list -H -t snapshot "$1" > /dev/null 2>&1 + return $? +} + +# +# Set a property to a certain value on a dataset. +# Sets a property of the dataset to the value as passed in. +# @param: +# $1 dataset who's property is being set +# $2 property to set +# $3 value to set property to +# @return: +# 0 if the property could be set. +# non-zero otherwise. +# @use: ZFS +# +function dataset_setprop +{ + typeset fn=dataset_setprop + + if (($# < 3)); then + log_note "$fn: Insufficient parameters (need 3, had $#)" + return 1 + fi + typeset output= + output=$($ZFS set $2=$3 $1 2>&1) + typeset rv=$? + if ((rv != 0)); then + log_note "Setting property on $1 failed." + log_note "property $2=$3" + log_note "Return Code: $rv" + log_note "Output: $output" + return $rv + fi + return 0 +} + +# +# Assign suite defined dataset properties. +# This function is used to apply the suite's defined default set of +# properties to a dataset. +# @parameters: $1 dataset to use +# @uses: ZFS COMPRESSION_PROP CHECKSUM_PROP +# @returns: +# 0 if the dataset has been altered. +# 1 if no pool name was passed in. +# 2 if the dataset could not be found. +# 3 if the dataset could not have it's properties set. +# +function dataset_set_defaultproperties +{ + typeset dataset="$1" + + [[ -z $dataset ]] && return 1 + + typeset confset= + typeset -i found=0 + for confset in $($ZFS list); do + if [[ $dataset = $confset ]]; then + found=1 + break + fi + done + [[ $found -eq 0 ]] && return 2 + if [[ -n $COMPRESSION_PROP ]]; then + dataset_setprop $dataset compression $COMPRESSION_PROP || \ + return 3 + log_note "Compression set to '$COMPRESSION_PROP' on $dataset" + fi + if [[ -n $CHECKSUM_PROP ]]; then + dataset_setprop $dataset checksum $CHECKSUM_PROP || \ + return 3 + log_note "Checksum set to '$CHECKSUM_PROP' on $dataset" + fi + return 0 +} + +# +# Check a numeric assertion +# @parameter: $@ the assertion to check +# @output: big loud notice if assertion failed +# @use: log_fail +# +function assert +{ + (($@)) || log_fail "$@" +} + +# +# Function to format partition size of a disk +# Given a disk cxtxdx reduces all partitions +# to 0 size +# +function zero_partitions #<whole_disk_name> +{ + typeset diskname=$1 + typeset i + + for i in 0 1 3 4 5 6 7 + do + set_partition $i "" 0mb $diskname + done +} + +# +# Given a slice, size and disk, this function +# formats the slice to the specified size. +# Size should be specified with units as per +# the `format` command requirements eg. 100mb 3gb +# +function set_partition #<slice_num> <slice_start> <size_plus_units> <whole_disk_name> +{ + typeset -i slicenum=$1 + typeset start=$2 + typeset size=$3 + typeset disk=$4 + [[ -z $slicenum || -z $size || -z $disk ]] && \ + log_fail "The slice, size or disk name is unspecified." + typeset format_file=/var/tmp/format_in.$$ + + $ECHO "partition" >$format_file + $ECHO "$slicenum" >> $format_file + $ECHO "" >> $format_file + $ECHO "" >> $format_file + $ECHO "$start" >> $format_file + $ECHO "$size" >> $format_file + $ECHO "label" >> $format_file + $ECHO "" >> $format_file + $ECHO "q" >> $format_file + $ECHO "q" >> $format_file + + $FORMAT -e -s -d $disk -f $format_file + typeset ret_val=$? + $RM -f $format_file + [[ $ret_val -ne 0 ]] && \ + log_fail "Unable to format $disk slice $slicenum to $size" + return 0 +} + +# +# Get the end cyl of the given slice +# +function get_endslice #<disk> <slice> +{ + typeset disk=$1 + typeset slice=$2 + if [[ -z $disk || -z $slice ]] ; then + log_fail "The disk name or slice number is unspecified." + fi + + disk=${disk#/dev/dsk/} + disk=${disk#/dev/rdsk/} + disk=${disk%s*} + + typeset -i ratio=0 + ratio=$($PRTVTOC /dev/rdsk/${disk}s2 | \ + $GREP "sectors\/cylinder" | \ + $AWK '{print $2}') + + if ((ratio == 0)); then + return + fi + + typeset -i endcyl=$($PRTVTOC -h /dev/rdsk/${disk}s2 | + $NAWK -v token="$slice" '{if ($1==token) print $6}') + + ((endcyl = (endcyl + 1) / ratio)) + echo $endcyl +} + + +# +# Given a size,disk and total slice number, this function formats the +# disk slices from 0 to the total slice number with the same specified +# size. +# +function partition_disk #<slice_size> <whole_disk_name> <total_slices> +{ + typeset -i i=0 + typeset slice_size=$1 + typeset disk_name=$2 + typeset total_slices=$3 + typeset cyl + + zero_partitions $disk_name + while ((i < $total_slices)); do + if ((i == 2)); then + ((i = i + 1)) + continue + fi + set_partition $i "$cyl" $slice_size $disk_name + cyl=$(get_endslice $disk_name $i) + ((i = i+1)) + done +} + +# +# This function continues to write to a filenum number of files into dirnum +# number of directories until either $FILE_WRITE returns an error or the +# maximum number of files per directory have been written. +# +# Usage: +# fill_fs [destdir] [dirnum] [filenum] [bytes] [num_writes] [data] +# +# Return value: 0 on success +# non 0 on error +# +# Where : +# destdir: is the directory where everything is to be created under +# dirnum: the maximum number of subdirectories to use, -1 no limit +# filenum: the maximum number of files per subdirectory +# bytes: number of bytes to write +# num_writes: numer of types to write out bytes +# data: the data that will be writen +# +# E.g. +# file_fs /testdir 20 25 1024 256 0 +# +# Note: bytes * num_writes equals the size of the testfile +# +function fill_fs # destdir dirnum filenum bytes num_writes data +{ + typeset destdir=${1:-$TESTDIR} + typeset -i dirnum=${2:-50} + typeset -i filenum=${3:-50} + typeset -i bytes=${4:-8192} + typeset -i num_writes=${5:-10240} + typeset -i data=${6:-0} + + typeset -i odirnum=1 + typeset -i idirnum=0 + typeset -i fn=0 + typeset -i retval=0 + + log_must $MKDIR -p $destdir/$idirnum + while (($odirnum > 0)); do + if ((dirnum >= 0 && idirnum >= dirnum)); then + odirnum=0 + break + fi + $FILE_WRITE -o create -f $destdir/$idirnum/$TESTFILE.$fn \ + -b $bytes -c $num_writes -d $data + retval=$? + if (($retval != 0)); then + odirnum=0 + break + fi + if (($fn >= $filenum)); then + fn=0 + ((idirnum = idirnum + 1)) + log_must $MKDIR -p $destdir/$idirnum + else + ((fn = fn + 1)) + fi + done + return $retval +} + +# +# Simple function to get the specified property. If unable to +# get the property then exits. +# +# Note property is in 'parsable' format (-p) +# +function get_prop # property dataset +{ + typeset prop_val + typeset prop=$1 + typeset dataset=$2 + + prop_val=$($ZFS get -pH -o value $prop $dataset 2>/dev/null) + if [[ $? -ne 0 ]]; then + log_note "Unable to get $prop property for dataset " \ + "$dataset" + return 1 + fi + + $ECHO $prop_val + return 0 +} + +# +# Simple function to get the specified property of pool. If unable to +# get the property then exits. +# +function get_pool_prop # property pool +{ + typeset prop_val + typeset prop=$1 + typeset pool=$2 + + if poolexists $pool ; then + prop_val=$($ZPOOL get $prop $pool 2>/dev/null | $TAIL -1 | \ + $AWK '{print $3}') + if [[ $? -ne 0 ]]; then + log_note "Unable to get $prop property for pool " \ + "$pool" + return 1 + fi + else + log_note "Pool $pool not exists." + return 1 + fi + + $ECHO $prop_val + return 0 +} + +# Return 0 if a pool exists; $? otherwise +# +# $1 - pool name + +function poolexists +{ + typeset pool=$1 + + if [[ -z $pool ]]; then + log_note "No pool name given." + return 1 + fi + + $ZPOOL get name "$pool" > /dev/null 2>&1 + return $? +} + +# Return 0 if all the specified datasets exist; $? otherwise +# +# $1-n dataset name +function datasetexists +{ + if (($# == 0)); then + log_note "No dataset name given." + return 1 + fi + + while (($# > 0)); do + $ZFS get name $1 > /dev/null 2>&1 || \ + return $? + shift + done + + return 0 +} + +# return 0 if none of the specified datasets exists, otherwise return 1. +# +# $1-n dataset name +function datasetnonexists +{ + if (($# == 0)); then + log_note "No dataset name given." + return 1 + fi + + while (($# > 0)); do + $ZFS list -H -t filesystem,snapshot,volume $1 > /dev/null 2>&1 \ + && return 1 + shift + done + + return 0 +} + +# +# Given a mountpoint, or a dataset name, determine if it is shared. +# +# Returns 0 if shared, 1 otherwise. +# +function is_shared +{ + typeset fs=$1 + typeset mtpt + + if [[ $fs != "/"* ]] ; then + if datasetnonexists "$fs" ; then + return 1 + else + mtpt=$(get_prop mountpoint "$fs") + case $mtpt in + none|legacy|-) return 1 + ;; + *) fs=$mtpt + ;; + esac + fi + fi + + for mtpt in `$SHARE | $AWK '{print $2}'` ; do + if [[ $mtpt == $fs ]] ; then + return 0 + fi + done + + typeset stat=$($SVCS -H -o STA nfs/server:default) + if [[ $stat != "ON" ]]; then + log_note "Current nfs/server status: $stat" + fi + + return 1 +} + +# +# Given a mountpoint, determine if it is not shared. +# +# Returns 0 if not shared, 1 otherwise. +# +function not_shared +{ + typeset fs=$1 + + is_shared $fs + if (($? == 0)); then + return 1 + fi + + return 0 +} + +# +# Helper function to unshare a mountpoint. +# +function unshare_fs #fs +{ + typeset fs=$1 + + is_shared $fs + if (($? == 0)); then + log_must $ZFS unshare $fs + fi + + return 0 +} + +# +# Check NFS server status and trigger it online. +# +function setup_nfs_server +{ + # Cannot share directory in non-global zone. + # + if ! is_global_zone; then + log_note "Cannot trigger NFS server by sharing in LZ." + return + fi + + typeset nfs_fmri="svc:/network/nfs/server:default" + if [[ $($SVCS -Ho STA $nfs_fmri) != "ON" ]]; then + # + # Only really sharing operation can enable NFS server + # to online permanently. + # + typeset dummy=/tmp/dummy + + if [[ -d $dummy ]]; then + log_must $RM -rf $dummy + fi + + log_must $MKDIR $dummy + log_must $SHARE $dummy + + # + # Waiting for fmri's status to be the final status. + # Otherwise, in transition, an asterisk (*) is appended for + # instances, unshare will reverse status to 'DIS' again. + # + # Waiting for 1's at least. + # + log_must $SLEEP 1 + timeout=10 + while [[ timeout -ne 0 && $($SVCS -Ho STA $nfs_fmri) == *'*' ]] + do + log_must $SLEEP 1 + + ((timeout -= 1)) + done + + log_must $UNSHARE $dummy + log_must $RM -rf $dummy + fi + + log_note "Current NFS status: '$($SVCS -Ho STA,FMRI $nfs_fmri)'" +} + +# +# To verify whether calling process is in global zone +# +# Return 0 if in global zone, 1 in non-global zone +# +function is_global_zone +{ + typeset cur_zone=$($ZONENAME 2>/dev/null) + if [[ $cur_zone != "global" ]]; then + return 1 + fi + return 0 +} + +# +# Verify whether test is permitted to run from +# global zone, local zone, or both +# +# $1 zone limit, could be "global", "local", or "both"(no limit) +# +# Return 0 if permitted, otherwise exit with log_unsupported +# +function verify_runnable # zone limit +{ + typeset limit=$1 + + [[ -z $limit ]] && return 0 + + if is_global_zone ; then + case $limit in + global|both) + ;; + local) log_unsupported "Test is unable to run from "\ + "global zone." + ;; + *) log_note "Warning: unknown limit $limit - " \ + "use both." + ;; + esac + else + case $limit in + local|both) + ;; + global) log_unsupported "Test is unable to run from "\ + "local zone." + ;; + *) log_note "Warning: unknown limit $limit - " \ + "use both." + ;; + esac + + reexport_pool + fi + + return 0 +} + +# Return 0 if create successfully or the pool exists; $? otherwise +# Note: In local zones, this function should return 0 silently. +# +# $1 - pool name +# $2-n - [keyword] devs_list + +function create_pool #pool devs_list +{ + typeset pool=${1%%/*} + + shift + + if [[ -z $pool ]]; then + log_note "Missing pool name." + return 1 + fi + + if poolexists $pool ; then + destroy_pool $pool + fi + + if is_global_zone ; then + [[ -d /$pool ]] && $RM -rf /$pool + log_must $ZPOOL create -f $pool $@ + fi + + return 0 +} + +# Return 0 if destroy successfully or the pool exists; $? otherwise +# Note: In local zones, this function should return 0 silently. +# +# $1 - pool name +# Destroy pool with the given parameters. + +function destroy_pool #pool +{ + typeset pool=${1%%/*} + typeset mtpt + + if [[ -z $pool ]]; then + log_note "No pool name given." + return 1 + fi + + if is_global_zone ; then + if poolexists "$pool" ; then + mtpt=$(get_prop mountpoint "$pool") + log_must $ZPOOL destroy -f $pool + + [[ -d $mtpt ]] && \ + log_must $RM -rf $mtpt + else + log_note "Pool not exist. ($pool)" + return 1 + fi + fi + + return 0 +} + +# +# Firstly, create a pool with 5 datasets. Then, create a single zone and +# export the 5 datasets to it. In addition, we also add a ZFS filesystem +# and a zvol device to the zone. +# +# $1 zone name +# $2 zone root directory prefix +# $3 zone ip +# +function zfs_zones_setup #zone_name zone_root zone_ip +{ + typeset zone_name=${1:-$(hostname)-z} + typeset zone_root=${2:-"/zone_root"} + typeset zone_ip=${3:-"10.1.1.10"} + typeset prefix_ctr=$ZONE_CTR + typeset pool_name=$ZONE_POOL + typeset -i cntctr=5 + typeset -i i=0 + + # Create pool and 5 container within it + # + [[ -d /$pool_name ]] && $RM -rf /$pool_name + log_must $ZPOOL create -f $pool_name $DISKS + while ((i < cntctr)); do + log_must $ZFS create $pool_name/$prefix_ctr$i + ((i += 1)) + done + + # create a zvol + log_must $ZFS create -V 1g $pool_name/zone_zvol + + # + # If current system support slog, add slog device for pool + # + if verify_slog_support ; then + typeset sdevs="/var/tmp/sdev1 /var/tmp/sdev2" + log_must $MKFILE 100M $sdevs + log_must $ZPOOL add $pool_name log mirror $sdevs + fi + + # this isn't supported just yet. + # Create a filesystem. In order to add this to + # the zone, it must have it's mountpoint set to 'legacy' + # log_must $ZFS create $pool_name/zfs_filesystem + # log_must $ZFS set mountpoint=legacy $pool_name/zfs_filesystem + + [[ -d $zone_root ]] && \ + log_must $RM -rf $zone_root/$zone_name + [[ ! -d $zone_root ]] && \ + log_must $MKDIR -p -m 0700 $zone_root/$zone_name + + # Create zone configure file and configure the zone + # + typeset zone_conf=/tmp/zone_conf.$$ + $ECHO "create" > $zone_conf + $ECHO "set zonepath=$zone_root/$zone_name" >> $zone_conf + $ECHO "set autoboot=true" >> $zone_conf + i=0 + while ((i < cntctr)); do + $ECHO "add dataset" >> $zone_conf + $ECHO "set name=$pool_name/$prefix_ctr$i" >> \ + $zone_conf + $ECHO "end" >> $zone_conf + ((i += 1)) + done + + # add our zvol to the zone + $ECHO "add device" >> $zone_conf + $ECHO "set match=/dev/zvol/dsk/$pool_name/zone_zvol" >> $zone_conf + $ECHO "end" >> $zone_conf + + # add a corresponding zvol rdsk to the zone + $ECHO "add device" >> $zone_conf + $ECHO "set match=/dev/zvol/rdsk/$pool_name/zone_zvol" >> $zone_conf + $ECHO "end" >> $zone_conf + + # once it's supported, we'll add our filesystem to the zone + # $ECHO "add fs" >> $zone_conf + # $ECHO "set type=zfs" >> $zone_conf + # $ECHO "set special=$pool_name/zfs_filesystem" >> $zone_conf + # $ECHO "set dir=/export/zfs_filesystem" >> $zone_conf + # $ECHO "end" >> $zone_conf + + $ECHO "verify" >> $zone_conf + $ECHO "commit" >> $zone_conf + log_must $ZONECFG -z $zone_name -f $zone_conf + log_must $RM -f $zone_conf + + # Install the zone + $ZONEADM -z $zone_name install + if (($? == 0)); then + log_note "SUCCESS: $ZONEADM -z $zone_name install" + else + log_fail "FAIL: $ZONEADM -z $zone_name install" + fi + + # Install sysidcfg file + # + typeset sysidcfg=$zone_root/$zone_name/root/etc/sysidcfg + $ECHO "system_locale=C" > $sysidcfg + $ECHO "terminal=dtterm" >> $sysidcfg + $ECHO "network_interface=primary {" >> $sysidcfg + $ECHO "hostname=$zone_name" >> $sysidcfg + $ECHO "}" >> $sysidcfg + $ECHO "name_service=NONE" >> $sysidcfg + $ECHO "root_password=mo791xfZ/SFiw" >> $sysidcfg + $ECHO "security_policy=NONE" >> $sysidcfg + $ECHO "timezone=US/Eastern" >> $sysidcfg + + # Boot this zone + log_must $ZONEADM -z $zone_name boot +} + +# +# Reexport TESTPOOL & TESTPOOL(1-4) +# +function reexport_pool +{ + typeset -i cntctr=5 + typeset -i i=0 + + while ((i < cntctr)); do + if ((i == 0)); then + TESTPOOL=$ZONE_POOL/$ZONE_CTR$i + if ! ismounted $TESTPOOL; then + log_must $ZFS mount $TESTPOOL + fi + else + eval TESTPOOL$i=$ZONE_POOL/$ZONE_CTR$i + if eval ! ismounted \$TESTPOOL$i; then + log_must eval $ZFS mount \$TESTPOOL$i + fi + fi + ((i += 1)) + done +} + +# +# Verify a given disk is online or offline +# +# Return 0 is pool/disk matches expected state, 1 otherwise +# +function check_state # pool disk state{online,offline} +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + typeset state=$3 + + $ZPOOL status -v $pool | grep "$disk" \ + | grep -i "$state" > /dev/null 2>&1 + + return $? +} + +# +# Get the mountpoint of snapshot +# For the snapshot use <mp_filesystem>/.zfs/snapshot/<snap> +# as its mountpoint +# +function snapshot_mountpoint +{ + typeset dataset=${1:-$TESTPOOL/$TESTFS@$TESTSNAP} + + if [[ $dataset != *@* ]]; then + log_fail "Error name of snapshot '$dataset'." + fi + + typeset fs=${dataset%@*} + typeset snap=${dataset#*@} + + if [[ -z $fs || -z $snap ]]; then + log_fail "Error name of snapshot '$dataset'." + fi + + $ECHO $(get_prop mountpoint $fs)/.zfs/snapshot/$snap +} + +# +# Given a pool and file system, this function will verify the file system +# using the zdb internal tool. Note that the pool is exported and imported +# to ensure it has consistent state. +# +function verify_filesys # pool filesystem dir +{ + typeset pool="$1" + typeset filesys="$2" + typeset zdbout="/tmp/zdbout.$$" + + shift + shift + typeset dirs=$@ + typeset search_path="" + + log_note "Calling $ZDB to verify filesystem '$filesys'" + $ZFS unmount -a > /dev/null 2>&1 + log_must $ZPOOL export $pool + + if [[ -n $dirs ]] ; then + for dir in $dirs ; do + search_path="$search_path -d $dir" + done + fi + + log_must $ZPOOL import $search_path $pool + + $ZDB -cudi $filesys > $zdbout 2>&1 + if [[ $? != 0 ]]; then + log_note "Output: $ZDB -cudi $filesys" + $CAT $zdbout + log_fail "$ZDB detected errors with: '$filesys'" + fi + + log_must $ZFS mount -a + log_must $RM -rf $zdbout +} + +# +# Given a pool, and this function list all disks in the pool +# +function get_disklist # pool +{ + typeset disklist="" + + disklist=$($ZPOOL iostat -v $1 | $NAWK '(NR >4) {print $1}' | \ + $GREP -v "\-\-\-\-\-" | \ + $EGREP -v -e "^(mirror|raidz1|raidz2|spare|log|cache)$") + + $ECHO $disklist +} + +# +# Destroy all existing metadevices and state database +# +function destroy_metas +{ + typeset metad + + for metad in $($METASTAT -p | $AWK '{print $1}'); do + log_must $METACLEAR -rf $metad + done + + for metad in $($METADB | $CUT -f6 | $GREP dev | $UNIQ); do + log_must $METADB -fd $metad + done +} + +# /** +# This function kills a given list of processes after a time period. We use +# this in the stress tests instead of STF_TIMEOUT so that we can have processes +# run for a fixed amount of time, yet still pass. Tests that hit STF_TIMEOUT +# would be listed as FAIL, which we don't want : we're happy with stress tests +# running for a certain amount of time, then finishing. +# +# @param $1 the time in seconds after which we should terminate these processes +# @param $2..$n the processes we wish to terminate. +# */ +function stress_timeout +{ + typeset -i TIMEOUT=$1 + shift + typeset cpids="$@" + + log_note "Waiting for child processes($cpids). " \ + "It could last dozens of minutes, please be patient ..." + log_must $SLEEP $TIMEOUT + + log_note "Killing child processes after ${TIMEOUT} stress timeout." + typeset pid + for pid in $cpids; do + $PS -p $pid > /dev/null 2>&1 + if (($? == 0)); then + log_must $KILL -USR1 $pid + fi + done +} + +# +# Verify a given hotspare disk is inuse or avail +# +# Return 0 is pool/disk matches expected state, 1 otherwise +# +function check_hotspare_state # pool disk state{inuse,avail} +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + typeset state=$3 + + cur_state=$(get_device_state $pool $disk "spares") + + if [[ $state != ${cur_state} ]]; then + return 1 + fi + return 0 +} + +# +# Verify a given slog disk is inuse or avail +# +# Return 0 is pool/disk matches expected state, 1 otherwise +# +function check_slog_state # pool disk state{online,offline,unavail} +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + typeset state=$3 + + cur_state=$(get_device_state $pool $disk "logs") + + if [[ $state != ${cur_state} ]]; then + return 1 + fi + return 0 +} + +# +# Verify a given vdev disk is inuse or avail +# +# Return 0 is pool/disk matches expected state, 1 otherwise +# +function check_vdev_state # pool disk state{online,offline,unavail} +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + typeset state=$3 + + cur_state=$(get_device_state $pool $disk) + + if [[ $state != ${cur_state} ]]; then + return 1 + fi + return 0 +} + +# +# Check the output of 'zpool status -v <pool>', +# and to see if the content of <token> contain the <keyword> specified. +# +# Return 0 is contain, 1 otherwise +# +function check_pool_status # pool token keyword +{ + typeset pool=$1 + typeset token=$2 + typeset keyword=$3 + + $ZPOOL status -v "$pool" 2>/dev/null | $NAWK -v token="$token:" ' + ($1==token) {print $0}' \ + | $GREP -i "$keyword" > /dev/null 2>&1 + + return $? +} + +# +# These 5 following functions are instance of check_pool_status() +# is_pool_resilvering - to check if the pool is resilver in progress +# is_pool_resilvered - to check if the pool is resilver completed +# is_pool_scrubbing - to check if the pool is scrub in progress +# is_pool_scrubbed - to check if the pool is scrub completed +# is_pool_scrub_stopped - to check if the pool is scrub stopped +# +function is_pool_resilvering #pool +{ + check_pool_status "$1" "scan" "resilver in progress since " + return $? +} + +function is_pool_resilvered #pool +{ + check_pool_status "$1" "scan" "resilvered " + return $? +} + +function is_pool_scrubbing #pool +{ + check_pool_status "$1" "scan" "scrub in progress since " + return $? +} + +function is_pool_scrubbed #pool +{ + check_pool_status "$1" "scan" "scrub repaired" + return $? +} + +function is_pool_scrub_stopped #pool +{ + check_pool_status "$1" "scan" "scrub canceled" + return $? +} + +# +# Use create_pool()/destroy_pool() to clean up the infomation in +# in the given disk to avoid slice overlapping. +# +function cleanup_devices #vdevs +{ + typeset pool="foopool$$" + + if poolexists $pool ; then + destroy_pool $pool + fi + + create_pool $pool $@ + destroy_pool $pool + + return 0 +} + +# +# Verify the rsh connectivity to each remote host in RHOSTS. +# +# Return 0 if remote host is accessible; otherwise 1. +# $1 remote host name +# $2 username +# +function verify_rsh_connect #rhost, username +{ + typeset rhost=$1 + typeset username=$2 + typeset rsh_cmd="$RSH -n" + typeset cur_user= + + $GETENT hosts $rhost >/dev/null 2>&1 + if (($? != 0)); then + log_note "$rhost cannot be found from" \ + "administrative database." + return 1 + fi + + $PING $rhost 3 >/dev/null 2>&1 + if (($? != 0)); then + log_note "$rhost is not reachable." + return 1 + fi + + if ((${#username} != 0)); then + rsh_cmd="$rsh_cmd -l $username" + cur_user="given user \"$username\"" + else + cur_user="current user \"`$LOGNAME`\"" + fi + + if ! $rsh_cmd $rhost $TRUE; then + log_note "$RSH to $rhost is not accessible" \ + "with $cur_user." + return 1 + fi + + return 0 +} + +# +# Verify the remote host connection via rsh after rebooting +# $1 remote host +# +function verify_remote +{ + rhost=$1 + + # + # The following loop waits for the remote system rebooting. + # Each iteration will wait for 150 seconds. there are + # total 5 iterations, so the total timeout value will + # be 12.5 minutes for the system rebooting. This number + # is an approxiate number. + # + typeset -i count=0 + while ! verify_rsh_connect $rhost; do + sleep 150 + ((count = count + 1)) + if ((count > 5)); then + return 1 + fi + done + return 0 +} + +# +# Replacement function for /usr/bin/rsh. This function will include +# the /usr/bin/rsh and meanwhile return the execution status of the +# last command. +# +# $1 usrname passing down to -l option of /usr/bin/rsh +# $2 remote machine hostname +# $3... command string +# + +function rsh_status +{ + typeset ruser=$1 + typeset rhost=$2 + typeset -i ret=0 + typeset cmd_str="" + typeset rsh_str="" + + shift; shift + cmd_str="$@" + + err_file=/tmp/${rhost}.$$.err + if ((${#ruser} == 0)); then + rsh_str="$RSH -n" + else + rsh_str="$RSH -n -l $ruser" + fi + + $rsh_str $rhost /usr/bin/ksh -c "'$cmd_str; \ + print -u 2 \"status=\$?\"'" \ + >/dev/null 2>$err_file + ret=$? + if (($ret != 0)); then + $CAT $err_file + $RM -f $std_file $err_file + log_fail "$RSH itself failed with exit code $ret..." + fi + + ret=$($GREP -v 'print -u 2' $err_file | $GREP 'status=' | \ + $CUT -d= -f2) + (($ret != 0)) && $CAT $err_file >&2 + + $RM -f $err_file >/dev/null 2>&1 + return $ret +} + +# +# Get the SUNWstc-fs-zfs package installation path in a remote host +# $1 remote host name +# +function get_remote_pkgpath +{ + typeset rhost=$1 + typeset pkgpath="" + + pkgpath=$($RSH -n $rhost "$PKGINFO -l SUNWstc-fs-zfs | $GREP BASEDIR: |\ + $CUT -d: -f2") + + $ECHO $pkgpath +} + +#/** +# A function to find and locate free disks on a system or from given +# disks as the parameter. It works by locating disks that are in use +# as swap devices, SVM devices, and dump devices, and also disks +# listed in /etc/vfstab +# +# $@ given disks to find which are free, default is all disks in +# the test system +# +# @return a string containing the list of available disks +#*/ +function find_disks +{ + sfi=/tmp/swaplist.$$ + msi=/tmp/metastat.$$ + dmpi=/tmp/dumpdev.$$ + max_finddisksnum=${MAX_FINDDISKSNUM:-6} + + $SWAP -l > $sfi + $METASTAT -c > $msi 2>/dev/null + $DUMPADM > $dmpi 2>/dev/null + +# write an awk script that can process the output of format +# to produce a list of disks we know about. Note that we have +# to escape "$2" so that the shell doesn't interpret it while +# we're creating the awk script. +# ------------------- + $CAT > /tmp/find_disks.awk <<EOF +#!/bin/nawk -f + BEGIN { FS="."; } + + /^Specify disk/{ + searchdisks=0; + } + + { + if (searchdisks && \$2 !~ "^$"){ + split(\$2,arr," "); + print arr[1]; + } + } + + /^AVAILABLE DISK SELECTIONS:/{ + searchdisks=1; + } +EOF +#--------------------- + + $CHMOD 755 /tmp/find_disks.awk + disks=${@:-$($ECHO "" | $FORMAT -e 2>/dev/null | /tmp/find_disks.awk)} + $RM /tmp/find_disks.awk + + unused="" + for disk in $disks; do + # Check for mounted + $GREP "${disk}[sp]" /etc/mnttab >/dev/null + (($? == 0)) && continue + # Check for swap + $GREP "${disk}[sp]" $sfi >/dev/null + (($? == 0)) && continue + # Check for SVM + $GREP "${disk}" $msi >/dev/null + (($? == 0)) && continue + # check for dump device + $GREP "${disk}[sp]" $dmpi >/dev/null + (($? == 0)) && continue + # check to see if this disk hasn't been explicitly excluded + # by a user-set environment variable + $ECHO "${ZFS_HOST_DEVICES_IGNORE}" | $GREP "${disk}" > /dev/null + (($? == 0)) && continue + unused_candidates="$unused_candidates $disk" + done + $RM $sfi + $RM $msi + $RM $dmpi + +# now just check to see if those disks do actually exist +# by looking for a device pointing to the first slice in +# each case. limit the number to max_finddisksnum + count=0 + for disk in $unused_candidates; do + if [ -b /dev/dsk/${disk}s0 ]; then + if [ $count -lt $max_finddisksnum ]; then + unused="$unused $disk" + # do not impose limit if $@ is provided + [[ -z $@ ]] && ((count = count + 1)) + fi + fi + done + +# finally, return our disk list + $ECHO $unused +} + +# +# Add specified user to specified group +# +# $1 group name +# $2 user name +# $3 base of the homedir (optional) +# +function add_user #<group_name> <user_name> <basedir> +{ + typeset gname=$1 + typeset uname=$2 + typeset basedir=${3:-"/var/tmp"} + + if ((${#gname} == 0 || ${#uname} == 0)); then + log_fail "group name or user name are not defined." + fi + + log_must $USERADD -g $gname -d $basedir/$uname -m $uname + + return 0 +} + +# +# Delete the specified user. +# +# $1 login name +# $2 base of the homedir (optional) +# +function del_user #<logname> <basedir> +{ + typeset user=$1 + typeset basedir=${2:-"/var/tmp"} + + if ((${#user} == 0)); then + log_fail "login name is necessary." + fi + + if $ID $user > /dev/null 2>&1; then + log_must $USERDEL $user + fi + + [[ -d $basedir/$user ]] && $RM -fr $basedir/$user + + return 0 +} + +# +# Select valid gid and create specified group. +# +# $1 group name +# +function add_group #<group_name> +{ + typeset group=$1 + + if ((${#group} == 0)); then + log_fail "group name is necessary." + fi + + # Assign 100 as the base gid + typeset -i gid=100 + while true; do + $GROUPADD -g $gid $group > /dev/null 2>&1 + typeset -i ret=$? + case $ret in + 0) return 0 ;; + # The gid is not unique + 4) ((gid += 1)) ;; + *) return 1 ;; + esac + done +} + +# +# Delete the specified group. +# +# $1 group name +# +function del_group #<group_name> +{ + typeset grp=$1 + if ((${#grp} == 0)); then + log_fail "group name is necessary." + fi + + $GROUPMOD -n $grp $grp > /dev/null 2>&1 + typeset -i ret=$? + case $ret in + # Group does not exist. + 6) return 0 ;; + # Name already exists as a group name + 9) log_must $GROUPDEL $grp ;; + *) return 1 ;; + esac + + return 0 +} + +# +# This function will return true if it's safe to destroy the pool passed +# as argument 1. It checks for pools based on zvols and files, and also +# files contained in a pool that may have a different mountpoint. +# +function safe_to_destroy_pool { # $1 the pool name + + typeset pool="" + typeset DONT_DESTROY="" + + # We check that by deleting the $1 pool, we're not + # going to pull the rug out from other pools. Do this + # by looking at all other pools, ensuring that they + # aren't built from files or zvols contained in this pool. + + for pool in $($ZPOOL list -H -o name) + do + ALTMOUNTPOOL="" + + # this is a list of the top-level directories in each of the + # files that make up the path to the files the pool is based on + FILEPOOL=$($ZPOOL status -v $pool | $GREP /$1/ | \ + $AWK '{print $1}') + + # this is a list of the zvols that make up the pool + ZVOLPOOL=$($ZPOOL status -v $pool | $GREP "/dev/zvol/dsk/$1$" \ + | $AWK '{print $1}') + + # also want to determine if it's a file-based pool using an + # alternate mountpoint... + POOL_FILE_DIRS=$($ZPOOL status -v $pool | \ + $GREP / | $AWK '{print $1}' | \ + $AWK -F/ '{print $2}' | $GREP -v "dev") + + for pooldir in $POOL_FILE_DIRS + do + OUTPUT=$($ZFS list -H -r -o mountpoint $1 | \ + $GREP "${pooldir}$" | $AWK '{print $1}') + + ALTMOUNTPOOL="${ALTMOUNTPOOL}${OUTPUT}" + done + + + if [ ! -z "$ZVOLPOOL" ] + then + DONT_DESTROY="true" + log_note "Pool $pool is built from $ZVOLPOOL on $1" + fi + + if [ ! -z "$FILEPOOL" ] + then + DONT_DESTROY="true" + log_note "Pool $pool is built from $FILEPOOL on $1" + fi + + if [ ! -z "$ALTMOUNTPOOL" ] + then + DONT_DESTROY="true" + log_note "Pool $pool is built from $ALTMOUNTPOOL on $1" + fi + done + + if [ -z "${DONT_DESTROY}" ] + then + return 0 + else + log_note "Warning: it is not safe to destroy $1!" + return 1 + fi +} + +# +# Get IP address of hostname +# $1 hostname +# +function getipbyhost +{ + typeset ip + ip=`$ARP $1 2>/dev/null | $AWK -F\) '{print $1}' \ + | $AWK -F\('{print $2}'` + $ECHO $ip +} + +# +# Setup iSCSI initiator to target +# $1 target hostname +# +function iscsi_isetup +{ + # check svc:/network/iscsi_initiator:default state, try to enable it + # if the state is not ON + typeset ISCSII_FMRI="svc:/network/iscsi_initiator:default" + if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then + log_must $SVCADM enable $ISCSII_FMRI + + typeset -i retry=20 + while [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) && \ + ($retry -ne 0) ]] + do + ((retry = retry - 1)) + $SLEEP 1 + done + + if [[ "ON" != $($SVCS -H -o sta $ISCSII_FMRI) ]]; then + log_fail "$ISCSII_FMRI service can not be enabled!" + fi + fi + + log_must $ISCSIADM add discovery-address $(getipbyhost $1) + log_must $ISCSIADM modify discovery --sendtargets enable + log_must $DEVFSADM -i iscsi +} + +# +# Check whether iscsi parameter is set as remote +# +# return 0 if iscsi is set as remote, otherwise 1 +# +function check_iscsi_remote +{ + if [[ $iscsi == "remote" ]] ; then + return 0 + else + return 1 + fi +} + +# +# Check if a volume is a valide iscsi target +# $1 volume name +# return 0 if suceeds, otherwise, return 1 +# +function is_iscsi_target +{ + typeset dataset=$1 + typeset target targets + + [[ -z $dataset ]] && return 1 + + targets=$($ISCSITADM list target | $GREP "Target:" | $AWK '{print $2}') + [[ -z $targets ]] && return 1 + + for target in $targets; do + [[ $dataset == $target ]] && return 0 + done + + return 1 +} + +# +# Get the iSCSI name of a target +# $1 target name +# +function iscsi_name +{ + typeset target=$1 + typeset name + + [[ -z $target ]] && log_fail "No parameter." + + if ! is_iscsi_target $target ; then + log_fail "Not a target." + fi + + name=$($ISCSITADM list target $target | $GREP "iSCSI Name:" \ + | $AWK '{print $2}') + + return $name +} + +# +# check svc:/system/iscsitgt:default state, try to enable it if the state +# is not ON +# +function iscsitgt_setup +{ + log_must $RM -f $ISCSITGTFILE + if [[ "ON" == $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then + log_note "iscsitgt is already enabled" + return + fi + + log_must $SVCADM enable -t $ISCSITGT_FMRI + + typeset -i retry=20 + while [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) && \ + ($retry -ne 0) ]] + do + $SLEEP 1 + ((retry = retry - 1)) + done + + if [[ "ON" != $($SVCS -H -o sta $ISCSITGT_FMRI) ]]; then + log_fail "$ISCSITGT_FMRI service can not be enabled!" + fi + + log_must $TOUCH $ISCSITGTFILE +} + +# +# set DISABLED state of svc:/system/iscsitgt:default +# which is the most suiteable state if $ISCSITGTFILE exists +# +function iscsitgt_cleanup +{ + if [[ -e $ISCSITGTFILE ]]; then + log_must $SVCADM disable $ISCSITGT_FMRI + log_must $RM -f $ISCSITGTFILE + fi +} + +# +# Close iSCSI initiator to target +# $1 target hostname +# +function iscsi_iclose +{ + log_must $ISCSIADM modify discovery --sendtargets disable + log_must $ISCSIADM remove discovery-address $(getipbyhost $1) + $DEVFSADM -Cv +} + +# +# Get the available ZFS compression options +# $1 option type zfs_set|zfs_compress +# +function get_compress_opts +{ + typeset COMPRESS_OPTS + typeset GZIP_OPTS="gzip gzip-1 gzip-2 gzip-3 gzip-4 gzip-5 \ + gzip-6 gzip-7 gzip-8 gzip-9" + + if [[ $1 == "zfs_compress" ]] ; then + COMPRESS_OPTS="on lzjb" + elif [[ $1 == "zfs_set" ]] ; then + COMPRESS_OPTS="on off lzjb" + fi + typeset valid_opts="$COMPRESS_OPTS" + $ZFS get 2>&1 | $GREP gzip >/dev/null 2>&1 + if [[ $? -eq 0 ]]; then + valid_opts="$valid_opts $GZIP_OPTS" + fi + $ECHO "$valid_opts" +} + +# +# Verify zfs operation with -p option work as expected +# $1 operation, value could be create, clone or rename +# $2 dataset type, value could be fs or vol +# $3 dataset name +# $4 new dataset name +# +function verify_opt_p_ops +{ + typeset ops=$1 + typeset datatype=$2 + typeset dataset=$3 + typeset newdataset=$4 + + if [[ $datatype != "fs" && $datatype != "vol" ]]; then + log_fail "$datatype is not supported." + fi + + # check parameters accordingly + case $ops in + create) + newdataset=$dataset + dataset="" + if [[ $datatype == "vol" ]]; then + ops="create -V $VOLSIZE" + fi + ;; + clone) + if [[ -z $newdataset ]]; then + log_fail "newdataset should not be empty" \ + "when ops is $ops." + fi + log_must datasetexists $dataset + log_must snapexists $dataset + ;; + rename) + if [[ -z $newdataset ]]; then + log_fail "newdataset should not be empty" \ + "when ops is $ops." + fi + log_must datasetexists $dataset + log_mustnot snapexists $dataset + ;; + *) + log_fail "$ops is not supported." + ;; + esac + + # make sure the upper level filesystem does not exist + if datasetexists ${newdataset%/*} ; then + log_must $ZFS destroy -rRf ${newdataset%/*} + fi + + # without -p option, operation will fail + log_mustnot $ZFS $ops $dataset $newdataset + log_mustnot datasetexists $newdataset ${newdataset%/*} + + # with -p option, operation should succeed + log_must $ZFS $ops -p $dataset $newdataset + if ! datasetexists $newdataset ; then + log_fail "-p option does not work for $ops" + fi + + # when $ops is create or clone, redo the operation still return zero + if [[ $ops != "rename" ]]; then + log_must $ZFS $ops -p $dataset $newdataset + fi + + return 0 +} + +# +# Get configuration of pool +# $1 pool name +# $2 config name +# +function get_config +{ + typeset pool=$1 + typeset config=$2 + typeset alt_root + + if ! poolexists "$pool" ; then + return 1 + fi + alt_root=$($ZPOOL list -H $pool | $AWK '{print $NF}') + if [[ $alt_root == "-" ]]; then + value=$($ZDB -C $pool | $GREP "$config:" | $AWK -F: \ + '{print $2}') + else + value=$($ZDB -e $pool | $GREP "$config:" | $AWK -F: \ + '{print $2}') + fi + if [[ -n $value ]] ; then + value=${value#'} + value=${value%'} + fi + echo $value + + return 0 +} + +# +# Privated function. Random select one of items from arguments. +# +# $1 count +# $2-n string +# +function _random_get +{ + typeset cnt=$1 + shift + + typeset str="$@" + typeset -i ind + ((ind = RANDOM % cnt + 1)) + + typeset ret=$($ECHO "$str" | $CUT -f $ind -d ' ') + $ECHO $ret +} + +# +# Random select one of item from arguments which include NONE string +# +function random_get_with_non +{ + typeset -i cnt=$# + ((cnt =+ 1)) + + _random_get "$cnt" "$@" +} + +# +# Random select one of item from arguments which doesn't include NONE string +# +function random_get +{ + _random_get "$#" "$@" +} + +# +# Detect if the current system support slog +# +function verify_slog_support +{ + typeset dir=/tmp/disk.$$ + typeset pool=foo.$$ + typeset vdev=$dir/a + typeset sdev=$dir/b + + $MKDIR -p $dir + $MKFILE 64M $vdev $sdev + + typeset -i ret=0 + if ! $ZPOOL create -n $pool $vdev log $sdev > /dev/null 2>&1; then + ret=1 + fi + $RM -r $dir + + return $ret +} + +# +# The function will generate a dataset name with specific length +# $1, the length of the name +# $2, the base string to construct the name +# +function gen_dataset_name +{ + typeset -i len=$1 + typeset basestr="$2" + typeset -i baselen=${#basestr} + typeset -i iter=0 + typeset l_name="" + + if ((len % baselen == 0)); then + ((iter = len / baselen)) + else + ((iter = len / baselen + 1)) + fi + while ((iter > 0)); do + l_name="${l_name}$basestr" + + ((iter -= 1)) + done + + $ECHO $l_name +} + +# +# Get cksum tuple of dataset +# $1 dataset name +# +# sample zdb output: +# Dataset data/test [ZPL], ID 355, cr_txg 2413856, 31.0K, 7 objects, rootbp +# DVA[0]=<0:803046400:200> DVA[1]=<0:81199000:200> [L0 DMU objset] fletcher4 +# lzjb LE contiguous unique double size=800L/200P birth=2413856L/2413856P +# fill=7 cksum=11ce125712:643a9c18ee2:125e25238fca0:254a3f74b59744 +function datasetcksum +{ + typeset cksum + $SYNC + cksum=$($ZDB -vvv $1 | $GREP "^Dataset $1 \[" | $GREP "cksum" \ + | $AWK -F= '{print $7}') + $ECHO $cksum +} + +# +# Get cksum of file +# #1 file path +# +function checksum +{ + typeset cksum + cksum=$($CKSUM $1 | $AWK '{print $1}') + $ECHO $cksum +} + +# +# Get the given disk/slice state from the specific field of the pool +# +function get_device_state #pool disk field("", "spares","logs") +{ + typeset pool=$1 + typeset disk=${2#/dev/dsk/} + typeset field=${3:-$pool} + + state=$($ZPOOL status -v "$pool" 2>/dev/null | \ + $NAWK -v device=$disk -v pool=$pool -v field=$field \ + 'BEGIN {startconfig=0; startfield=0; } + /config:/ {startconfig=1} + (startconfig==1) && ($1==field) {startfield=1; next;} + (startfield==1) && ($1==device) {print $2; exit;} + (startfield==1) && + ($1==field || $1 ~ "^spares$" || $1 ~ "^logs$") {startfield=0}') + echo $state +} + + +# +# print the given directory filesystem type +# +# $1 directory name +# +function get_fstype +{ + typeset dir=$1 + + if [[ -z $dir ]]; then + log_fail "Usage: get_fstype <directory>" + fi + + # + # $ df -n / + # / : ufs + # + $DF -n $dir | $AWK '{print $3}' +} + +# +# Given a disk, label it to VTOC regardless what label was on the disk +# $1 disk +# +function labelvtoc +{ + typeset disk=$1 + if [[ -z $disk ]]; then + log_fail "The disk name is unspecified." + fi + typeset label_file=/var/tmp/labelvtoc.$$ + typeset arch=$($UNAME -p) + + if [[ $arch == "i386" ]]; then + $ECHO "label" > $label_file + $ECHO "0" >> $label_file + $ECHO "" >> $label_file + $ECHO "q" >> $label_file + $ECHO "q" >> $label_file + + $FDISK -B $disk >/dev/null 2>&1 + # wait a while for fdisk finishes + $SLEEP 60 + elif [[ $arch == "sparc" ]]; then + $ECHO "label" > $label_file + $ECHO "0" >> $label_file + $ECHO "" >> $label_file + $ECHO "" >> $label_file + $ECHO "" >> $label_file + $ECHO "q" >> $label_file + else + log_fail "unknown arch type" + fi + + $FORMAT -e -s -d $disk -f $label_file + typeset -i ret_val=$? + $RM -f $label_file + # + # wait the format to finish + # + $SLEEP 60 + if ((ret_val != 0)); then + log_fail "unable to label $disk as VTOC." + fi + + return 0 +} + +# +# check if the system was installed as zfsroot or not +# return: 0 ture, otherwise false +# +function is_zfsroot +{ + $DF -n / | $GREP zfs > /dev/null 2>&1 + return $? +} + +# +# get the root filesystem name if it's zfsroot system. +# +# return: root filesystem name +function get_rootfs +{ + typeset rootfs="" + rootfs=$($AWK '{if ($2 == "/" && $3 == "zfs") print $1}' \ + /etc/mnttab) + if [[ -z "$rootfs" ]]; then + log_fail "Can not get rootfs" + fi + $ZFS list $rootfs > /dev/null 2>&1 + if (($? == 0)); then + $ECHO $rootfs + else + log_fail "This is not a zfsroot system." + fi +} + +# +# get the rootfs's pool name +# return: +# rootpool name +# +function get_rootpool +{ + typeset rootfs="" + typeset rootpool="" + rootfs=$($AWK '{if ($2 == "/" && $3 =="zfs") print $1}' \ + /etc/mnttab) + if [[ -z "$rootfs" ]]; then + log_fail "Can not get rootpool" + fi + $ZFS list $rootfs > /dev/null 2>&1 + if (($? == 0)); then + rootpool=`$ECHO $rootfs | awk -F\/ '{print $1}'` + $ECHO $rootpool + else + log_fail "This is not a zfsroot system." + fi +} + +# +# Get the sub string from specified source string +# +# $1 source string +# $2 start position. Count from 1 +# $3 offset +# +function get_substr #src_str pos offset +{ + typeset pos offset + + $ECHO $1 | \ + $NAWK -v pos=$2 -v offset=$3 '{print substr($0, pos, offset)}' +} + +# +# Check if the given device is physical device +# +function is_physical_device #device +{ + typeset device=${1#/dev/dsk/} + device=${device#/dev/rdsk/} + + $ECHO $device | $EGREP "^c[0-F]+([td][0-F]+)+$" > /dev/null 2>&1 + return $? +} + +# +# Get the directory path of given device +# +function get_device_dir #device +{ + typeset device=$1 + + if ! $(is_physical_device $device) ; then + if [[ $device != "/" ]]; then + device=${device%/*} + fi + $ECHO $device + else + $ECHO "/dev/dsk" + fi +} + +# +# Get the package name +# +function get_package_name +{ + typeset dirpath=${1:-$STC_NAME} + + echo "SUNWstc-${dirpath}" | /usr/bin/sed -e "s/\//-/g" +} + +# +# Get the word numbers from a string separated by white space +# +function get_word_count +{ + $ECHO $1 | $WC -w +} + +# +# To verify if the require numbers of disks is given +# +function verify_disk_count +{ + typeset -i min=${2:-1} + + typeset -i count=$(get_word_count "$1") + + if ((count < min)); then + log_untested "A minimum of $min disks is required to run." \ + " You specified $count disk(s)" + fi +} + +function ds_is_volume +{ + typeset type=$(get_prop type $1) + [[ $type = "volume" ]] && return 0 + return 1 +} + +function ds_is_filesystem +{ + typeset type=$(get_prop type $1) + [[ $type = "filesystem" ]] && return 0 + return 1 +} + +function ds_is_snapshot +{ + typeset type=$(get_prop type $1) + [[ $type = "snapshot" ]] && return 0 + return 1 +} + +# +# Check if Trusted Extensions are installed and enabled +# +function is_te_enabled +{ + $SVCS -H -o state labeld 2>/dev/null | $GREP "enabled" + if (($? != 0)); then + return 1 + else + return 0 + fi +} diff --git a/usr/src/test/zfs-tests/include/math.shlib b/usr/src/test/zfs-tests/include/math.shlib new file mode 100644 index 0000000000..38479d3521 --- /dev/null +++ b/usr/src/test/zfs-tests/include/math.shlib @@ -0,0 +1,43 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +# +# Return 0 if the percentage difference between $a and $b is $percent or +# greater. Return 1 if the percentage is lower or if we would divide by +# zero. For use like this: +# +# Do $action if the calculated percentage is greater or equal to that passed in: +# within_percent A B P && $action +# Do $action if the calculated percentage is less than that passed in: +# within_percent A B P || $action +# +function within_percent +{ + typeset a=$1 + typeset b=$1 + typeset percent=$3 + + # Set $a or $b to $2 such that a >= b + [[ '1' = $($ECHO "if ($2 > $a) 1" | $BC) ]] && a=$2 || b=$2 + + # Prevent division by 0 + [[ $a =~ [1-9] ]] || return 1 + + typeset p=$($ECHO "scale=2; $b * 100 / $a" | $BC) + log_note "Comparing $a and $b given $percent% (calculated: $p%)" + [[ '1' = $($ECHO "scale=2; if ($p >= $percent) 1" | $BC) ]] && return 0 + + return 1 +} diff --git a/usr/src/test/zfs-tests/include/properties.shlib b/usr/src/test/zfs-tests/include/properties.shlib new file mode 100644 index 0000000000..bb0b4ff586 --- /dev/null +++ b/usr/src/test/zfs-tests/include/properties.shlib @@ -0,0 +1,63 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +typeset -a compress_props=('on' 'off' 'lzjb' 'gzip' 'gzip-1' 'gzip-2' 'gzip-3' + 'gzip-4' 'gzip-5' 'gzip-6' 'gzip-7' 'gzip-8' 'gzip-9' 'zle') + +typeset -a checksum_props=('on' 'off' 'fletcher2' 'fletcher4' 'sha256') + +# +# Given the property array passed in, return 'num_props' elements to the +# user, excluding any elements below 'start.' This allows us to exclude +# 'off' and 'on' which can be either unwanted, or a duplicate of another +# property respectively. +# +function get_rand_prop +{ + typeset prop_array=($(eval echo \${$1[@]})) + typeset -i num_props=$2 + typeset -i start=$3 + typeset retstr="" + + [[ -z $prop_array || -z $num_props || -z $start ]] && \ + log_fail "get_rand_prop: bad arguments" + + typeset prop_max=$((${#prop_array[@]} - 1)) + typeset -i i + for i in $($SHUF -i $start-$prop_max -n $num_props); do + retstr="${prop_array[$i]} $retstr" + done + echo $retstr +} + +function get_rand_compress +{ + get_rand_prop compress_props $1 2 +} + +function get_rand_compress_any +{ + get_rand_prop compress_props $1 0 +} + +function get_rand_checksum +{ + get_rand_prop checksum_props $1 2 +} + +function get_rand_checksum_any +{ + get_rand_prop checksum_props $1 0 +} diff --git a/usr/src/test/zfs-tests/runfiles/Makefile b/usr/src/test/zfs-tests/runfiles/Makefile new file mode 100644 index 0000000000..f7aea9c048 --- /dev/null +++ b/usr/src/test/zfs-tests/runfiles/Makefile @@ -0,0 +1,38 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +SRCS = delphix.run openindiana.run + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +RUNFILES = $(ROOTOPTPKG)/runfiles + +CMDS = $(SRCS:%=$(RUNFILES)/%) +$(CMDS) := FILEMODE = 0444 + +all: $(SRCS) + +install: $(CMDS) + +clean lint clobber: + +$(CMDS): $(RUNFILES) $(SRCS) + +$(RUNFILES): + $(INS.dir) + +$(RUNFILES)/%: % + $(INS.file) diff --git a/usr/src/test/zfs-tests/runfiles/delphix.run b/usr/src/test/zfs-tests/runfiles/delphix.run new file mode 100644 index 0000000000..90de7d28ed --- /dev/null +++ b/usr/src/test/zfs-tests/runfiles/delphix.run @@ -0,0 +1,272 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +[DEFAULT] +pre = setup +quiet = False +pre_user = root +user = root +timeout = 600 +post_user = root +post = cleanup +outputdir = /var/tmp/test_results + +[/opt/zfs-tests/tests/functional/acl/cifs] +tests = ['cifs_attr_001_pos', 'cifs_attr_002_pos', 'cifs_attr_003_pos'] + +[/opt/zfs-tests/tests/functional/acl/nontrivial] +tests = ['zfs_acl_chmod_001_neg', 'zfs_acl_chmod_002_pos', + 'zfs_acl_chmod_aclmode_001_pos', 'zfs_acl_chmod_compact_001_pos', + 'zfs_acl_chmod_delete_001_pos', 'zfs_acl_chmod_inherit_001_pos', + 'zfs_acl_chmod_inherit_002_neg', 'zfs_acl_chmod_inherit_002_pos', + 'zfs_acl_chmod_inherit_003_pos', 'zfs_acl_chmod_inherit_004_pos', + 'zfs_acl_chmod_owner_001_pos', 'zfs_acl_chmod_rwacl_001_pos', + 'zfs_acl_chmod_rwx_001_pos', 'zfs_acl_chmod_rwx_002_pos', + 'zfs_acl_chmod_rwx_003_pos', 'zfs_acl_chmod_rwx_004_pos', + 'zfs_acl_chmod_xattr_001_pos', 'zfs_acl_chmod_xattr_002_pos', + 'zfs_acl_cp_001_pos', 'zfs_acl_cp_002_pos', 'zfs_acl_cpio_001_pos', + 'zfs_acl_cpio_002_pos', 'zfs_acl_find_001_pos', 'zfs_acl_ls_001_pos', + 'zfs_acl_mv_001_pos', 'zfs_acl_tar_001_pos', 'zfs_acl_tar_002_pos'] + +[/opt/zfs-tests/tests/functional/acl/trivial] +tests = ['zfs_acl_chmod_001_pos', 'zfs_acl_compress_001_pos', + 'zfs_acl_cp_001_pos', 'zfs_acl_cp_002_neg', 'zfs_acl_cp_003_neg', + 'zfs_acl_find_001_pos', 'zfs_acl_find_002_neg', 'zfs_acl_ls_001_pos', + 'zfs_acl_ls_002_neg', 'zfs_acl_mv_001_pos', 'zfs_acl_pack_001_pos', + 'zfs_acl_pax_001_pos', 'zfs_acl_pax_002_pos', 'zfs_acl_pax_003_pos', + 'zfs_acl_pax_004_pos', 'zfs_acl_pax_005_pos', 'zfs_acl_pax_006_pos', + 'zfs_acl_tar_001_pos', 'zfs_acl_tar_002_neg'] + +[/opt/zfs-tests/tests/functional/atime] +tests = ['atime_001_pos', 'atime_002_neg'] + +[/opt/zfs-tests/tests/functional/bootfs] +tests = ['bootfs_001_pos', 'bootfs_002_neg', 'bootfs_003_pos', 'bootfs_004_neg', + 'bootfs_005_neg', 'bootfs_006_pos', 'bootfs_007_neg', 'bootfs_008_neg'] +pre = +post = + +[/opt/zfs-tests/tests/functional/cli_root/zdb] +tests = ['zdb_001_neg'] +pre = +post = + +[/opt/zfs-tests/tests/functional/cli_root/zfs] +tests = ['zfs_001_neg', 'zfs_002_pos', 'zfs_003_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_clone] +tests = ['zfs_clone_001_neg', 'zfs_clone_002_pos', 'zfs_clone_003_pos', + 'zfs_clone_004_pos', 'zfs_clone_005_pos', 'zfs_clone_006_pos', + 'zfs_clone_007_pos', 'zfs_clone_008_neg', 'zfs_clone_009_neg', + 'zfs_clone_010_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_copies] +tests = ['zfs_copies_001_pos', 'zfs_copies_002_pos', 'zfs_copies_003_pos', + 'zfs_copies_004_neg', 'zfs_copies_005_neg', 'zfs_copies_006_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_create] +tests = ['zfs_create_001_pos', 'zfs_create_002_pos', 'zfs_create_003_pos', + 'zfs_create_004_pos', 'zfs_create_005_pos', 'zfs_create_006_pos', + 'zfs_create_007_pos', 'zfs_create_008_neg', 'zfs_create_009_neg', + 'zfs_create_010_neg', 'zfs_create_011_pos', 'zfs_create_012_pos', + 'zfs_create_013_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_destroy] +tests = ['zfs_destroy_001_pos', 'zfs_destroy_002_pos', 'zfs_destroy_003_pos', + 'zfs_destroy_004_pos', 'zfs_destroy_005_neg', 'zfs_destroy_006_neg', + 'zfs_destroy_007_neg', 'zfs_destroy_008_pos', 'zfs_destroy_009_pos', + 'zfs_destroy_010_pos', 'zfs_destroy_011_pos', 'zfs_destroy_012_pos', + 'zfs_destroy_013_neg', 'zfs_destroy_014_pos', 'zfs_destroy_015_pos', + 'zfs_destroy_016_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_get] +tests = ['zfs_get_001_pos', 'zfs_get_002_pos', 'zfs_get_003_pos', + 'zfs_get_004_pos', 'zfs_get_005_neg', 'zfs_get_006_neg', 'zfs_get_007_neg', + 'zfs_get_008_pos', 'zfs_get_009_pos', 'zfs_get_010_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_inherit] +tests = ['zfs_inherit_001_neg', 'zfs_inherit_002_neg', 'zfs_inherit_003_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_mount] +tests = ['zfs_mount_001_pos', 'zfs_mount_002_pos', 'zfs_mount_003_pos', + 'zfs_mount_004_pos', 'zfs_mount_005_pos', 'zfs_mount_006_pos', + 'zfs_mount_007_pos', 'zfs_mount_008_pos', 'zfs_mount_009_neg', + 'zfs_mount_010_neg', 'zfs_mount_011_neg', 'zfs_mount_all_001_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_promote] +tests = ['zfs_promote_001_pos', 'zfs_promote_002_pos', 'zfs_promote_003_pos', + 'zfs_promote_004_pos', 'zfs_promote_005_pos', 'zfs_promote_006_neg', + 'zfs_promote_007_neg', 'zfs_promote_008_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_property] +tests = ['zfs_written_property_001_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_receive] +tests = ['zfs_receive_001_pos', 'zfs_receive_002_pos', 'zfs_receive_003_pos', + 'zfs_receive_004_neg', 'zfs_receive_005_neg', 'zfs_receive_006_pos', + 'zfs_receive_007_neg', 'zfs_receive_008_pos', 'zfs_receive_009_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_rename] +tests = ['zfs_rename_001_pos', 'zfs_rename_002_pos', 'zfs_rename_003_pos', + 'zfs_rename_004_neg', 'zfs_rename_005_neg', 'zfs_rename_006_pos', + 'zfs_rename_007_pos', 'zfs_rename_008_pos', 'zfs_rename_009_neg', + 'zfs_rename_010_neg', 'zfs_rename_011_pos', 'zfs_rename_012_neg', + 'zfs_rename_013_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_reservation] +tests = ['zfs_reservation_001_pos', 'zfs_reservation_002_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_rollback] +tests = ['zfs_rollback_001_pos', 'zfs_rollback_002_pos', 'zfs_rollback_003_neg', + 'zfs_rollback_004_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_send] +tests = ['zfs_send_001_pos', 'zfs_send_002_pos', 'zfs_send_003_pos', + 'zfs_send_004_neg', 'zfs_send_005_pos', 'zfs_send_006_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_set] +tests = ['cache_001_pos', 'cache_002_neg', 'canmount_001_pos', + 'canmount_002_pos', 'canmount_003_pos', 'canmount_004_pos', + 'checksum_001_pos', 'compression_001_pos', 'mountpoint_001_pos', + 'mountpoint_002_pos', 'mountpoint_003_pos', 'onoffs_001_pos', + 'property_alias_001_pos', 'readonly_001_pos', 'reservation_001_neg', + 'ro_props_001_pos', 'share_mount_001_neg', 'snapdir_001_pos', + 'user_property_001_pos', 'user_property_002_pos', 'user_property_003_neg', + 'user_property_004_pos', 'version_001_neg', 'zfs_set_001_neg', + 'zfs_set_002_neg', 'zfs_set_003_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_share] +tests = ['zfs_share_001_pos', 'zfs_share_002_pos', 'zfs_share_003_pos', + 'zfs_share_004_pos', 'zfs_share_005_pos', 'zfs_share_006_pos', + 'zfs_share_007_neg', 'zfs_share_008_neg', 'zfs_share_009_neg', + 'zfs_share_010_neg', 'zfs_share_011_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_snapshot] +tests = ['zfs_snapshot_001_neg', 'zfs_snapshot_002_neg', 'zfs_snapshot_003_neg', + 'zfs_snapshot_004_neg', 'zfs_snapshot_005_neg', 'zfs_snapshot_006_pos', + 'zfs_snapshot_007_neg', 'zfs_snapshot_008_neg', 'zfs_snapshot_009_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_unmount] +tests = ['zfs_unmount_001_pos', 'zfs_unmount_002_pos', 'zfs_unmount_003_pos', + 'zfs_unmount_004_pos', 'zfs_unmount_005_pos', 'zfs_unmount_006_pos', + 'zfs_unmount_007_neg', 'zfs_unmount_008_neg', 'zfs_unmount_009_pos', + 'zfs_unmount_all_001_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_unshare] +tests = ['zfs_unshare_001_pos', 'zfs_unshare_002_pos', 'zfs_unshare_003_pos', + 'zfs_unshare_004_neg', 'zfs_unshare_005_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_upgrade] +tests = ['zfs_upgrade_001_pos', 'zfs_upgrade_002_pos', 'zfs_upgrade_003_pos', + 'zfs_upgrade_004_pos', 'zfs_upgrade_005_pos', 'zfs_upgrade_006_neg', + 'zfs_upgrade_007_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool] +tests = ['zpool_001_neg', 'zpool_002_pos', 'zpool_003_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_add] +tests = ['zpool_add_001_pos', 'zpool_add_002_pos', 'zpool_add_003_pos', + 'zpool_add_004_pos', 'zpool_add_005_pos', 'zpool_add_006_pos', + 'zpool_add_007_neg', 'zpool_add_008_neg', 'zpool_add_009_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_attach] +tests = ['zpool_attach_001_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_clear] +tests = ['zpool_clear_001_pos', 'zpool_clear_002_neg', 'zpool_clear_003_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_create] +tests = ['zpool_create_001_pos', 'zpool_create_002_pos', 'zpool_create_003_pos', + 'zpool_create_004_pos', 'zpool_create_005_pos', 'zpool_create_006_pos', + 'zpool_create_007_neg', 'zpool_create_008_pos', 'zpool_create_009_neg', + 'zpool_create_010_neg', 'zpool_create_011_neg', 'zpool_create_012_neg', + 'zpool_create_013_neg', 'zpool_create_014_neg', 'zpool_create_015_neg', + 'zpool_create_016_pos', 'zpool_create_017_neg', 'zpool_create_018_pos', + 'zpool_create_019_pos', 'zpool_create_020_pos', 'zpool_create_021_pos', + 'zpool_create_022_pos', 'zpool_create_023_neg', + 'zpool_create_features_001_pos', 'zpool_create_features_002_pos', + 'zpool_create_features_003_pos', 'zpool_create_features_004_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_destroy] +tests = ['zpool_destroy_001_pos', 'zpool_destroy_002_pos', + 'zpool_destroy_003_neg'] +pre = +post = + +[/opt/zfs-tests/tests/functional/cli_root/zpool_detach] +tests = ['zpool_detach_001_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_expand] +tests = ['zpool_expand_001_pos', 'zpool_expand_002_pos', 'zpool_expand_003_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_export] +tests = ['zpool_export_001_pos', 'zpool_export_002_pos', 'zpool_export_003_neg', + 'zpool_export_004_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_get] +tests = ['zpool_get_001_pos', 'zpool_get_002_pos', 'zpool_get_003_pos', + 'zpool_get_004_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_history] +tests = ['zpool_history_001_neg', 'zpool_history_002_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_import] +tests = ['zpool_import_001_pos', 'zpool_import_002_pos', 'zpool_import_003_pos', + 'zpool_import_004_pos', 'zpool_import_005_pos', 'zpool_import_006_pos', + 'zpool_import_007_pos', 'zpool_import_008_pos', 'zpool_import_009_neg', + 'zpool_import_010_pos', 'zpool_import_011_neg', 'zpool_import_012_pos', + 'zpool_import_013_neg', 'zpool_import_all_001_pos', + 'zpool_import_features_001_pos', 'zpool_import_features_002_neg', + 'zpool_import_features_003_pos', 'zpool_import_missing_001_pos', + 'zpool_import_missing_002_pos', 'zpool_import_missing_003_pos', + 'zpool_import_rename_001_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_offline] +tests = ['zpool_offline_001_pos', 'zpool_offline_002_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_online] +tests = ['zpool_online_001_pos', 'zpool_online_002_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_remove] +tests = ['zpool_remove_001_neg', 'zpool_remove_002_pos', 'zpool_remove_003_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_replace] +tests = ['zpool_replace_001_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_scrub] +tests = ['zpool_scrub_001_neg', 'zpool_scrub_002_pos', 'zpool_scrub_003_pos', + 'zpool_scrub_004_pos', 'zpool_scrub_005_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_set] +tests = ['zpool_set_001_pos', 'zpool_set_002_neg', 'zpool_set_003_neg'] +pre = +post = + +[/opt/zfs-tests/tests/functional/cli_root/zpool_status] +tests = ['zpool_status_001_pos', 'zpool_status_002_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_upgrade] +tests = ['zpool_upgrade_001_pos', 'zpool_upgrade_002_pos', + 'zpool_upgrade_003_pos', 'zpool_upgrade_004_pos', 'zpool_upgrade_005_neg', + 'zpool_upgrade_006_neg', 'zpool_upgrade_007_pos', 'zpool_upgrade_008_pos', + 'zpool_upgrade_009_neg'] + +[/opt/zfs-tests/tests/functional/truncate] +tests = ['truncate_001_pos', 'truncate_002_pos'] + +[/opt/zfs-tests/tests/functional/nopwrite] +tests = ['nopwrite_copies', 'nopwrite_mtime', 'nopwrite_negative', + 'nopwrite_promoted_clone', 'nopwrite_recsize', 'nopwrite_sync', + 'nopwrite_varying_compression', 'nopwrite_volume'] diff --git a/usr/src/test/zfs-tests/runfiles/openindiana.run b/usr/src/test/zfs-tests/runfiles/openindiana.run new file mode 100644 index 0000000000..90de7d28ed --- /dev/null +++ b/usr/src/test/zfs-tests/runfiles/openindiana.run @@ -0,0 +1,272 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +[DEFAULT] +pre = setup +quiet = False +pre_user = root +user = root +timeout = 600 +post_user = root +post = cleanup +outputdir = /var/tmp/test_results + +[/opt/zfs-tests/tests/functional/acl/cifs] +tests = ['cifs_attr_001_pos', 'cifs_attr_002_pos', 'cifs_attr_003_pos'] + +[/opt/zfs-tests/tests/functional/acl/nontrivial] +tests = ['zfs_acl_chmod_001_neg', 'zfs_acl_chmod_002_pos', + 'zfs_acl_chmod_aclmode_001_pos', 'zfs_acl_chmod_compact_001_pos', + 'zfs_acl_chmod_delete_001_pos', 'zfs_acl_chmod_inherit_001_pos', + 'zfs_acl_chmod_inherit_002_neg', 'zfs_acl_chmod_inherit_002_pos', + 'zfs_acl_chmod_inherit_003_pos', 'zfs_acl_chmod_inherit_004_pos', + 'zfs_acl_chmod_owner_001_pos', 'zfs_acl_chmod_rwacl_001_pos', + 'zfs_acl_chmod_rwx_001_pos', 'zfs_acl_chmod_rwx_002_pos', + 'zfs_acl_chmod_rwx_003_pos', 'zfs_acl_chmod_rwx_004_pos', + 'zfs_acl_chmod_xattr_001_pos', 'zfs_acl_chmod_xattr_002_pos', + 'zfs_acl_cp_001_pos', 'zfs_acl_cp_002_pos', 'zfs_acl_cpio_001_pos', + 'zfs_acl_cpio_002_pos', 'zfs_acl_find_001_pos', 'zfs_acl_ls_001_pos', + 'zfs_acl_mv_001_pos', 'zfs_acl_tar_001_pos', 'zfs_acl_tar_002_pos'] + +[/opt/zfs-tests/tests/functional/acl/trivial] +tests = ['zfs_acl_chmod_001_pos', 'zfs_acl_compress_001_pos', + 'zfs_acl_cp_001_pos', 'zfs_acl_cp_002_neg', 'zfs_acl_cp_003_neg', + 'zfs_acl_find_001_pos', 'zfs_acl_find_002_neg', 'zfs_acl_ls_001_pos', + 'zfs_acl_ls_002_neg', 'zfs_acl_mv_001_pos', 'zfs_acl_pack_001_pos', + 'zfs_acl_pax_001_pos', 'zfs_acl_pax_002_pos', 'zfs_acl_pax_003_pos', + 'zfs_acl_pax_004_pos', 'zfs_acl_pax_005_pos', 'zfs_acl_pax_006_pos', + 'zfs_acl_tar_001_pos', 'zfs_acl_tar_002_neg'] + +[/opt/zfs-tests/tests/functional/atime] +tests = ['atime_001_pos', 'atime_002_neg'] + +[/opt/zfs-tests/tests/functional/bootfs] +tests = ['bootfs_001_pos', 'bootfs_002_neg', 'bootfs_003_pos', 'bootfs_004_neg', + 'bootfs_005_neg', 'bootfs_006_pos', 'bootfs_007_neg', 'bootfs_008_neg'] +pre = +post = + +[/opt/zfs-tests/tests/functional/cli_root/zdb] +tests = ['zdb_001_neg'] +pre = +post = + +[/opt/zfs-tests/tests/functional/cli_root/zfs] +tests = ['zfs_001_neg', 'zfs_002_pos', 'zfs_003_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_clone] +tests = ['zfs_clone_001_neg', 'zfs_clone_002_pos', 'zfs_clone_003_pos', + 'zfs_clone_004_pos', 'zfs_clone_005_pos', 'zfs_clone_006_pos', + 'zfs_clone_007_pos', 'zfs_clone_008_neg', 'zfs_clone_009_neg', + 'zfs_clone_010_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_copies] +tests = ['zfs_copies_001_pos', 'zfs_copies_002_pos', 'zfs_copies_003_pos', + 'zfs_copies_004_neg', 'zfs_copies_005_neg', 'zfs_copies_006_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_create] +tests = ['zfs_create_001_pos', 'zfs_create_002_pos', 'zfs_create_003_pos', + 'zfs_create_004_pos', 'zfs_create_005_pos', 'zfs_create_006_pos', + 'zfs_create_007_pos', 'zfs_create_008_neg', 'zfs_create_009_neg', + 'zfs_create_010_neg', 'zfs_create_011_pos', 'zfs_create_012_pos', + 'zfs_create_013_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_destroy] +tests = ['zfs_destroy_001_pos', 'zfs_destroy_002_pos', 'zfs_destroy_003_pos', + 'zfs_destroy_004_pos', 'zfs_destroy_005_neg', 'zfs_destroy_006_neg', + 'zfs_destroy_007_neg', 'zfs_destroy_008_pos', 'zfs_destroy_009_pos', + 'zfs_destroy_010_pos', 'zfs_destroy_011_pos', 'zfs_destroy_012_pos', + 'zfs_destroy_013_neg', 'zfs_destroy_014_pos', 'zfs_destroy_015_pos', + 'zfs_destroy_016_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_get] +tests = ['zfs_get_001_pos', 'zfs_get_002_pos', 'zfs_get_003_pos', + 'zfs_get_004_pos', 'zfs_get_005_neg', 'zfs_get_006_neg', 'zfs_get_007_neg', + 'zfs_get_008_pos', 'zfs_get_009_pos', 'zfs_get_010_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_inherit] +tests = ['zfs_inherit_001_neg', 'zfs_inherit_002_neg', 'zfs_inherit_003_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_mount] +tests = ['zfs_mount_001_pos', 'zfs_mount_002_pos', 'zfs_mount_003_pos', + 'zfs_mount_004_pos', 'zfs_mount_005_pos', 'zfs_mount_006_pos', + 'zfs_mount_007_pos', 'zfs_mount_008_pos', 'zfs_mount_009_neg', + 'zfs_mount_010_neg', 'zfs_mount_011_neg', 'zfs_mount_all_001_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_promote] +tests = ['zfs_promote_001_pos', 'zfs_promote_002_pos', 'zfs_promote_003_pos', + 'zfs_promote_004_pos', 'zfs_promote_005_pos', 'zfs_promote_006_neg', + 'zfs_promote_007_neg', 'zfs_promote_008_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_property] +tests = ['zfs_written_property_001_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_receive] +tests = ['zfs_receive_001_pos', 'zfs_receive_002_pos', 'zfs_receive_003_pos', + 'zfs_receive_004_neg', 'zfs_receive_005_neg', 'zfs_receive_006_pos', + 'zfs_receive_007_neg', 'zfs_receive_008_pos', 'zfs_receive_009_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_rename] +tests = ['zfs_rename_001_pos', 'zfs_rename_002_pos', 'zfs_rename_003_pos', + 'zfs_rename_004_neg', 'zfs_rename_005_neg', 'zfs_rename_006_pos', + 'zfs_rename_007_pos', 'zfs_rename_008_pos', 'zfs_rename_009_neg', + 'zfs_rename_010_neg', 'zfs_rename_011_pos', 'zfs_rename_012_neg', + 'zfs_rename_013_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_reservation] +tests = ['zfs_reservation_001_pos', 'zfs_reservation_002_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_rollback] +tests = ['zfs_rollback_001_pos', 'zfs_rollback_002_pos', 'zfs_rollback_003_neg', + 'zfs_rollback_004_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_send] +tests = ['zfs_send_001_pos', 'zfs_send_002_pos', 'zfs_send_003_pos', + 'zfs_send_004_neg', 'zfs_send_005_pos', 'zfs_send_006_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_set] +tests = ['cache_001_pos', 'cache_002_neg', 'canmount_001_pos', + 'canmount_002_pos', 'canmount_003_pos', 'canmount_004_pos', + 'checksum_001_pos', 'compression_001_pos', 'mountpoint_001_pos', + 'mountpoint_002_pos', 'mountpoint_003_pos', 'onoffs_001_pos', + 'property_alias_001_pos', 'readonly_001_pos', 'reservation_001_neg', + 'ro_props_001_pos', 'share_mount_001_neg', 'snapdir_001_pos', + 'user_property_001_pos', 'user_property_002_pos', 'user_property_003_neg', + 'user_property_004_pos', 'version_001_neg', 'zfs_set_001_neg', + 'zfs_set_002_neg', 'zfs_set_003_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_share] +tests = ['zfs_share_001_pos', 'zfs_share_002_pos', 'zfs_share_003_pos', + 'zfs_share_004_pos', 'zfs_share_005_pos', 'zfs_share_006_pos', + 'zfs_share_007_neg', 'zfs_share_008_neg', 'zfs_share_009_neg', + 'zfs_share_010_neg', 'zfs_share_011_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_snapshot] +tests = ['zfs_snapshot_001_neg', 'zfs_snapshot_002_neg', 'zfs_snapshot_003_neg', + 'zfs_snapshot_004_neg', 'zfs_snapshot_005_neg', 'zfs_snapshot_006_pos', + 'zfs_snapshot_007_neg', 'zfs_snapshot_008_neg', 'zfs_snapshot_009_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_unmount] +tests = ['zfs_unmount_001_pos', 'zfs_unmount_002_pos', 'zfs_unmount_003_pos', + 'zfs_unmount_004_pos', 'zfs_unmount_005_pos', 'zfs_unmount_006_pos', + 'zfs_unmount_007_neg', 'zfs_unmount_008_neg', 'zfs_unmount_009_pos', + 'zfs_unmount_all_001_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_unshare] +tests = ['zfs_unshare_001_pos', 'zfs_unshare_002_pos', 'zfs_unshare_003_pos', + 'zfs_unshare_004_neg', 'zfs_unshare_005_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zfs_upgrade] +tests = ['zfs_upgrade_001_pos', 'zfs_upgrade_002_pos', 'zfs_upgrade_003_pos', + 'zfs_upgrade_004_pos', 'zfs_upgrade_005_pos', 'zfs_upgrade_006_neg', + 'zfs_upgrade_007_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool] +tests = ['zpool_001_neg', 'zpool_002_pos', 'zpool_003_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_add] +tests = ['zpool_add_001_pos', 'zpool_add_002_pos', 'zpool_add_003_pos', + 'zpool_add_004_pos', 'zpool_add_005_pos', 'zpool_add_006_pos', + 'zpool_add_007_neg', 'zpool_add_008_neg', 'zpool_add_009_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_attach] +tests = ['zpool_attach_001_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_clear] +tests = ['zpool_clear_001_pos', 'zpool_clear_002_neg', 'zpool_clear_003_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_create] +tests = ['zpool_create_001_pos', 'zpool_create_002_pos', 'zpool_create_003_pos', + 'zpool_create_004_pos', 'zpool_create_005_pos', 'zpool_create_006_pos', + 'zpool_create_007_neg', 'zpool_create_008_pos', 'zpool_create_009_neg', + 'zpool_create_010_neg', 'zpool_create_011_neg', 'zpool_create_012_neg', + 'zpool_create_013_neg', 'zpool_create_014_neg', 'zpool_create_015_neg', + 'zpool_create_016_pos', 'zpool_create_017_neg', 'zpool_create_018_pos', + 'zpool_create_019_pos', 'zpool_create_020_pos', 'zpool_create_021_pos', + 'zpool_create_022_pos', 'zpool_create_023_neg', + 'zpool_create_features_001_pos', 'zpool_create_features_002_pos', + 'zpool_create_features_003_pos', 'zpool_create_features_004_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_destroy] +tests = ['zpool_destroy_001_pos', 'zpool_destroy_002_pos', + 'zpool_destroy_003_neg'] +pre = +post = + +[/opt/zfs-tests/tests/functional/cli_root/zpool_detach] +tests = ['zpool_detach_001_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_expand] +tests = ['zpool_expand_001_pos', 'zpool_expand_002_pos', 'zpool_expand_003_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_export] +tests = ['zpool_export_001_pos', 'zpool_export_002_pos', 'zpool_export_003_neg', + 'zpool_export_004_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_get] +tests = ['zpool_get_001_pos', 'zpool_get_002_pos', 'zpool_get_003_pos', + 'zpool_get_004_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_history] +tests = ['zpool_history_001_neg', 'zpool_history_002_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_import] +tests = ['zpool_import_001_pos', 'zpool_import_002_pos', 'zpool_import_003_pos', + 'zpool_import_004_pos', 'zpool_import_005_pos', 'zpool_import_006_pos', + 'zpool_import_007_pos', 'zpool_import_008_pos', 'zpool_import_009_neg', + 'zpool_import_010_pos', 'zpool_import_011_neg', 'zpool_import_012_pos', + 'zpool_import_013_neg', 'zpool_import_all_001_pos', + 'zpool_import_features_001_pos', 'zpool_import_features_002_neg', + 'zpool_import_features_003_pos', 'zpool_import_missing_001_pos', + 'zpool_import_missing_002_pos', 'zpool_import_missing_003_pos', + 'zpool_import_rename_001_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_offline] +tests = ['zpool_offline_001_pos', 'zpool_offline_002_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_online] +tests = ['zpool_online_001_pos', 'zpool_online_002_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_remove] +tests = ['zpool_remove_001_neg', 'zpool_remove_002_pos', 'zpool_remove_003_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_replace] +tests = ['zpool_replace_001_neg'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_scrub] +tests = ['zpool_scrub_001_neg', 'zpool_scrub_002_pos', 'zpool_scrub_003_pos', + 'zpool_scrub_004_pos', 'zpool_scrub_005_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_set] +tests = ['zpool_set_001_pos', 'zpool_set_002_neg', 'zpool_set_003_neg'] +pre = +post = + +[/opt/zfs-tests/tests/functional/cli_root/zpool_status] +tests = ['zpool_status_001_pos', 'zpool_status_002_pos'] + +[/opt/zfs-tests/tests/functional/cli_root/zpool_upgrade] +tests = ['zpool_upgrade_001_pos', 'zpool_upgrade_002_pos', + 'zpool_upgrade_003_pos', 'zpool_upgrade_004_pos', 'zpool_upgrade_005_neg', + 'zpool_upgrade_006_neg', 'zpool_upgrade_007_pos', 'zpool_upgrade_008_pos', + 'zpool_upgrade_009_neg'] + +[/opt/zfs-tests/tests/functional/truncate] +tests = ['truncate_001_pos', 'truncate_002_pos'] + +[/opt/zfs-tests/tests/functional/nopwrite] +tests = ['nopwrite_copies', 'nopwrite_mtime', 'nopwrite_negative', + 'nopwrite_promoted_clone', 'nopwrite_recsize', 'nopwrite_sync', + 'nopwrite_varying_compression', 'nopwrite_volume'] diff --git a/usr/src/test/zfs-tests/tests/Makefile b/usr/src/test/zfs-tests/tests/Makefile new file mode 100644 index 0000000000..5502e74dfd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/Makefile @@ -0,0 +1,20 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +SUBDIRS = functional stress + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/zfs-tests/tests/functional/Makefile b/usr/src/test/zfs-tests/tests/functional/Makefile new file mode 100644 index 0000000000..a222f54372 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/Makefile @@ -0,0 +1,25 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +SUBDIRS = acl \ + atime \ + bootfs \ + cli_root \ + nopwrite \ + truncate + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/zfs-tests/tests/functional/acl/Makefile b/usr/src/test/zfs-tests/tests/functional/acl/Makefile new file mode 100644 index 0000000000..a8cf7083d1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/Makefile @@ -0,0 +1,43 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/acl + +PROGS = acl.cfg \ + acl_common.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +SUBDIRS = cifs nontrivial trivial + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/zfs-tests/tests/functional/acl/acl.cfg b/usr/src/test/zfs-tests/tests/functional/acl/acl.cfg new file mode 100644 index 0000000000..58b6f5d5d0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/acl.cfg @@ -0,0 +1,64 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +export NISSTAFILE=/var/tmp/nis_state +export TESTFILE=testfile$$ +export TESTFILE0=testfile0.$$ +export TESTFILE2=testfile2.$$ + +# Define super user 'admin' +export ZFS_ACL_ADMIN=admin + +export ZFS_ACL_STAFF_GROUP=zfsgrp +export ZFS_ACL_STAFF1=staff1 +export ZFS_ACL_STAFF2=staff2 + +export ZFS_ACL_OTHER_GROUP=othergrp +export ZFS_ACL_OTHER1=other1 +export ZFS_ACL_OTHER2=other2 + +# Define the current user who run 'usr_exec' +export ZFS_ACL_CUR_USER="" + +# Define global error string +export ZFS_ACL_ERR_STR="" + +# Define test file and test directory which will be operated by chmod +export testfile=$TESTDIR/testfile +export testdir=$TESTDIR/testdir + +# Define several directories for trivial ACLs function test. +export RES_DIR=$TESTDIR/RES +export INI_DIR=$TESTDIR/INIT +export TST_DIR=$TESTDIR/TEST +export TMP_DIR=$TESTDIR/TMP + +# Define test files and their attributes files number for trivial +# ACLs function test +export NUM_FILE=5 +export NUM_ATTR=10 diff --git a/usr/src/test/zfs-tests/tests/functional/acl/acl_common.kshlib b/usr/src/test/zfs-tests/tests/functional/acl/acl_common.kshlib new file mode 100644 index 0000000000..1ebc1cd968 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/acl_common.kshlib @@ -0,0 +1,626 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl.cfg +. $STF_SUITE/include/libtest.shlib + +# +# Get the given file/directory access mode +# +# $1 object -- file or directroy +# +function get_mode #<obj> +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -ld $obj | $AWK '{print $1}' +} + +# +# Get the given file/directory ACL +# +# $1 object -- file or directroy +# +function get_acl #<obj> +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -vd $obj | $NAWK '(NR != 1) {print $0}' +} + +# +# Get the given file/directory ACL +# +# $1 object -- file or directroy +# +function get_compact_acl #<obj> +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -Vd $obj | $NAWK '(NR != 1) {print $0}' +} + +# +# Check the given two files/directories have the same ACLs +# +# Return 0, if source object acl is equal to target object acl. +# +# $1 source object +# $2 target object +# +function compare_acls #<src> <tgt> +{ + typeset src=$1 + typeset tgt=$2 + + (( ${#src} == 0 || ${#tgt} == 0 )) && return 1 + [[ $src == $tgt ]] && return 0 + + typeset tmpsrc=/tmp/compare_acls.src.$$ + typeset tmptgt=/tmp/compare_acls.tgt.$$ + + get_acl $src > $tmpsrc + get_acl $tgt > $tmptgt + typeset -i ret=0 + $DIFF $tmpsrc $tmptgt > /dev/null 2>&1 + ret=$? + $RM -f $tmpsrc $tmptgt + + if (( ret != 0 )); then + return $ret + fi + + get_compact_acl $src > $tmpsrc + get_compact_acl $tgt > $tmptgt + $DIFF $tmpsrc $tmptgt > /dev/null 2>&1 + ret=$? + $RM -f $tmpsrc $tmptgt + + return $ret +} + +# +# Check that the given two objects have the same modes. +# Return 0, if their modes are equal with each other. Otherwise, return 1. +# +# $1 source object +# $2 target object +# +function compare_modes #<src> <tgt> +{ + typeset src=$1 + typeset tgt=$2 + typeset -i i=0 + set -A mode + + (( ${#src} == 0 || ${#tgt} == 0 )) && return 1 + [[ $src == $tgt ]] && return 0 + + typeset obj + for obj in $src $tgt + do + mode[i]=$(get_mode $obj) + + (( i = i + 1 )) + done + + [[ ${mode[0]} != ${mode[1]} ]] && return 1 + + return 0 +} + +# +# Check that the given two objects have the same xattrs. +# Return 0, if their xattrs are equal with each other. Otherwise, return 1. +# +# $1 source object +# $2 target object +# +function compare_xattrs #<src> <tgt> +{ + typeset src=$1 + typeset tgt=$2 + + (( ${#src} == 0 || ${#tgt} == 0 )) && return 1 + [[ $src == $tgt ]] && return 0 + + typeset tmpsrc=/tmp/compare_xattrs.src.$$ + typeset tmptgt=/tmp/compare_xattrs.tgt.$$ + + get_xattr $src > $tmpsrc + get_xattr $tgt > $tmptgt + typeset -i ret=0 + $DIFF $tmpsrc $tmptgt > /dev/null 2>&1 + ret=$? + $RM -f $tmpsrc $tmptgt + + return $ret +} + +# +# Check '+' is set for a given file/directory with 'ls [-l]' command +# +# $1 object -- file or directory. +# +function plus_sign_check_l #<obj> +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -ld $obj | $AWK '{print $1}' | $GREP "+\>" > /dev/null + + return $? +} + +# +# Check '+' is set for a given file/directory with 'ls [-v]' command +# +# $1 object -- file or directory. +# +function plus_sign_check_v #<obj> +{ + typeset obj=$1 + if (( ${#obj} == 0 )); then + return 1 + fi + + $LS -vd $obj | $NAWK '(NR == 1) {print $1}' | $GREP "+\>" > /dev/null + + return $? +} + +# +# A wrapper function of c program +# +# $1 legal login name +# $2-n commands and options +# +function chgusr_exec #<login_name> <commands> [...] +{ + $CHG_USR_EXEC $@ + return $? +} + +# +# Export the current user for the following usr_exec operating. +# +# $1 legal login name +# +function set_cur_usr #<login_name> +{ + export ZFS_ACL_CUR_USER=$1 +} + +# +# Run commands by $ZFS_ACL_CUR_USER +# +# $1-n commands and options +# +function usr_exec #<commands> [...] +{ + $CHG_USR_EXEC "$ZFS_ACL_CUR_USER" $@ + return $? +} + +# +# Count how many ACEs for the speficied file or directory. +# +# $1 file or directroy name +# +function count_ACE #<file or dir name> +{ + if [[ ! -e $1 ]]; then + log_note "Need input file or directroy name." + return 1 + fi + + $LS -vd $1 | $NAWK 'BEGIN {count=0} + (NR != 1)&&(/[0-9]:/) {count++} + END {print count}' + + return 0 +} + +# +# Get specified number ACE content of specified file or directory. +# +# $1 file or directory name +# $2 specified number +# +function get_ACE #<file or dir name> <specified number> <verbose|compact> +{ + if [[ ! -e $1 || $2 -ge $(count_ACE $1) ]]; then + return 1 + fi + + typeset file=$1 + typeset -i num=$2 + typeset format=${3:-verbose} + typeset -i next_num=-1 + + typeset tmpfile=/tmp/tmp_get_ACE.$$ + typeset line="" + typeset args + + case $format in + verbose) args="-vd" + ;; + compact) args="-Vd" + ;; + *) log_fail "Invalid parameter as ($format), " \ + "only verbose|compact is supported." + ;; + esac + + $LS $args $file > $tmpfile + (( $? != 0 )) && log_fail "FAIL: $LS $args $file > $tmpfile" + while read line; do + [[ -z $line ]] && continue + if [[ $args == -vd ]]; then + if [[ $line == "$num":* ]]; then + (( next_num = num + 1 )) + fi + if [[ $line == "$next_num":* ]]; then + break + fi + if (( next_num != -1 )); then + print -n $line + fi + else + if (( next_num == num )); then + print -n $line + fi + (( next_num += 1 )) + fi + done < $tmpfile + + $RM -f $tmpfile + (( $? != 0 )) && log_fail "FAIL: $RM -f $tmpfile" +} + +# +# Cleanup exist user/group. +# +function cleanup_user_group +{ + del_user $ZFS_ACL_ADMIN + + del_user $ZFS_ACL_STAFF1 + del_user $ZFS_ACL_STAFF2 + del_group $ZFS_ACL_STAFF_GROUP + + del_user $ZFS_ACL_OTHER1 + del_user $ZFS_ACL_OTHER2 + del_group $ZFS_ACL_OTHER_GROUP + + return 0 +} + +# +# Clean up testfile and test directory +# +function cleanup +{ + if [[ -d $TESTDIR ]]; then + cd $TESTDIR + $RM -rf $TESTDIR/* + fi +} + +# +# According to specified access or acl_spec, do relevant operating by using the +# specified user. +# +# $1 specified user +# $2 node +# $3 acl_spec or access +# +function rwx_node #user node acl_spec|access +{ + typeset user=$1 + typeset node=$2 + typeset acl_spec=$3 + + if [[ $user == "" || $node == "" || $acl_spec == "" ]]; then + log_note "node or acl_spec are not defined." + return 1 + fi + + if [[ -d $node ]]; then + case $acl_spec in + *:read_data:*|read_data) + chgusr_exec $user $LS -l $node > /dev/null 2>&1 + return $? ;; + *:write_data:*|write_data) + if [[ -f ${node}/tmpfile ]]; then + log_must $RM -f ${node}/tmpfile + fi + chgusr_exec $user $TOUCH ${node}/tmpfile > \ + /dev/null 2>&1 + return $? ;; + *"execute:"*|execute) + chgusr_exec $user $FIND $node > /dev/null 2>&1 + return $? ;; + esac + else + case $acl_spec in + *:read_data:*|read_data) + chgusr_exec $user $CAT $node > /dev/null 2>&1 + return $? ;; + *:write_data:*|write_data) + chgusr_exec $user $DD if=/usr/bin/ls of=$node > \ + /dev/null 2>&1 + return $? ;; + *"execute:"*|execute) + ZFS_ACL_ERR_STR=$(chgusr_exec $user $node 2>&1) + return $? ;; + esac + fi +} + +# +# Get the given file/directory xattr +# +# $1 object -- file or directroy +# +function get_xattr #<obj> +{ + typeset obj=$1 + typeset xattr + if (( ${#obj} == 0 )); then + return 1 + fi + + for xattr in `$RUNAT $obj $LS | \ + /usr/xpg4/bin/egrep -v -e SUNWattr_ro -e SUNWattr_rw` ; do + $RUNAT $obj $SUM $xattr + done +} + +# +# Get the owner of a file/directory +# +function get_owner #node +{ + typeset node=$1 + typeset value + + if [[ -z $node ]]; then + log_fail "node are not defined." + fi + + if [[ -d $node ]]; then + value=$($LS -dl $node | $AWK '{print $3}') + elif [[ -e $node ]]; then + value=$($LS -l $node | $AWK '{print $3}') + fi + + $ECHO $value +} + +# +# Get the group of a file/directory +# +function get_group #node +{ + typeset node=$1 + typeset value + + if [[ -z $node ]]; then + log_fail "node are not defined." + fi + + if [[ -d $node ]]; then + value=$($LS -dl $node | $AWK '{print $4}') + elif [[ -e $node ]]; then + value=$($LS -l $node | $AWK '{print $4}') + fi + + $ECHO $value +} + + +# +# Get the group name that a UID belongs to +# +function get_user_group #uid +{ + typeset uid=$1 + typeset value + + if [[ -z $uid ]]; then + log_fail "UID not defined." + fi + + value=$(id $uid) + + if [[ $? -eq 0 ]]; then + value=${value##*\(} + value=${value%%\)*} + $ECHO $value + else + log_fail "Invalid UID (uid)." + fi +} + +# +# Get the specified item of the specified string +# +# $1: Item number, count from 0. +# $2-n: strings +# +function getitem +{ + typeset -i n=$1 + shift + + (( n += 1 )) + eval echo \${$n} +} + +# +# This function calculate the specified directory files checksum and write +# to the specified array. +# +# $1 directory in which the files will be cksum. +# $2 file array name which was used to store file cksum information. +# $3 attribute array name which was used to store attribute information. +# +function cksum_files #<dir> <file_array_name> <attribute_array_name> +{ + typeset dir=$1 + typeset farr_name=$2 + typeset aarr_name=$3 + + [[ ! -d $dir ]] && return + typeset oldpwd=$PWD + cd $dir + typeset files=$($LS file*) + + typeset -i i=0 + typeset -i n=0 + while (( i < NUM_FILE )); do + typeset f=$(getitem $i $files) + eval $farr_name[$i]=\$\(\$CKSUM $f\) + + typeset -i j=0 + while (( j < NUM_ATTR )); do + eval $aarr_name[$n]=\$\(\$RUNAT \$f \$CKSUM \ + attribute.$j\) + + (( j += 1 )) + (( n += 1 )) + done + + (( i += 1 )) + done + + cd $oldpwd +} + +# +# This function compare two cksum results array. +# +# $1 The array name which stored the cksum before operation. +# $2 The array name which stored the cksum after operation. +# +function compare_cksum #<array1> <array2> +{ + typeset before=$1 + typeset after=$2 + eval typeset -i count=\${#$before[@]} + + typeset -i i=0 + while (( i < count )); do + eval typeset var1=\${$before[$i]} + eval typeset var2=\${$after[$i]} + + if [[ $var1 != $var2 ]]; then + return 1 + fi + + (( i += 1 )) + done + + return 0 +} + +# +# This function calculate all the files cksum information in current directory +# and output them to the specified file. +# +# $1 directory from which the files will be cksum. +# $2 cksum output file +# +function record_cksum #<outfile> +{ + typeset dir=$1 + typeset outfile=$2 + + [[ ! -d ${outfile%/*} ]] && usr_exec $MKDIR -p ${outfile%/*} + + usr_exec cd $dir ; $FIND . -depth -type f -exec cksum {} \\\; | \ + $SORT > $outfile + usr_exec cd $dir ; $FIND . -depth -type f -xattr -exec runat {} \ + cksum attribute* \\\; | $SORT >> $outfile +} + +# +# The function create_files creates the directories and files that the script +# will operate on to test extended attribute functionality. +# +# $1 The base directory in which to create directories and files. +# +function create_files #<directory> +{ + typeset basedir=$1 + + [[ ! -d $basedir ]] && usr_exec $MKDIR -m 777 $basedir + [[ ! -d $RES_DIR ]] && usr_exec $MKDIR -m 777 $RES_DIR + [[ ! -d $INI_DIR ]] && usr_exec $MKDIR -m 777 $INI_DIR + [[ ! -d $TST_DIR ]] && usr_exec $MKDIR -m 777 $TST_DIR + [[ ! -d $TMP_DIR ]] && usr_exec $MKDIR -m 777 $TMP_DIR + + # + # Create the original file and its attribute files. + # + [[ ! -a $RES_DIR/file ]] && \ + usr_exec $FILE_WRITE -o create -f $RES_DIR/file \ + -b 1024 -d 0 -c 1 + [[ ! -a $RES_DIR/attribute ]] && \ + usr_exec $CP $RES_DIR/file $RES_DIR/attribute + + typeset oldpwd=$PWD + cd $INI_DIR + + typeset -i i=0 + while (( i < NUM_FILE )); do + typeset dstfile=$INI_DIR/file.$$.$i + usr_exec $CP $RES_DIR/file $dstfile + + typeset -i j=0 + while (( j < NUM_ATTR )); do + usr_exec $RUNAT $dstfile \ + $CP $RES_DIR/attribute ./attribute.$j + (( j += 1 )) + done + + (( i += 1 )) + done + + cd $oldpwd +} diff --git a/usr/src/test/zfs-tests/tests/functional/acl/cifs/Makefile b/usr/src/test/zfs-tests/tests/functional/acl/cifs/Makefile new file mode 100644 index 0000000000..431e58afa6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/cifs/Makefile @@ -0,0 +1,45 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/acl/cifs + +PROGS = cleanup \ + setup \ + cifs_attr_001_pos \ + cifs_attr_002_pos \ + cifs_attr_003_pos + +FILES = cifs.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs.kshlib b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs.kshlib new file mode 100644 index 0000000000..83808d48e9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs.kshlib @@ -0,0 +1,76 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# Create a file or direcotry +# +# $1: The type specified, "file" or "dir" +# $2: The given node name +# $3: Owner of the node +# +function create_object +{ + typeset type=$1 + typeset object=$2 + typeset owner=$3 + + destroy_object $object + + case $type in + dir) + $MKDIR -p $object + ;; + file) + $ECHO "ZFS test suites" > $object + ;; + esac + + if [[ -n $owner ]]; then + $CHOWN $owner $object + fi + return 0 +} + +# +# Destroy the given node(s) +# +# $@: The node(s) need to be destroyed +# +function destroy_object +{ + for object in $@ ; do + if [[ -e $object ]]; then + + # clear_attribute is a common function name, + # but each case should have their own implement. + log_must clear_attribute $object + log_must $RM -rf $object + fi + done + return 0 +} diff --git a/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs_attr_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs_attr_001_pos.ksh new file mode 100644 index 0000000000..4f46665a9d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs_attr_001_pos.ksh @@ -0,0 +1,241 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib +. $STF_SUITE/tests/functional/acl/cifs/cifs.kshlib + +# +# DESCRIPTION: +# Verify the user with write_attributes permission or +# PRIV_FILE_OWNER privilege could set/clear DOS attributes. +# (Readonly, Hidden, Archive, System) +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Grant user has write_attributes permission or +# PRIV_FILE_OWNER privilege +# 4. Verify set/clear DOS attributes should succeed. +# + +verify_runnable "both" + +function cleanup +{ + for fs in $TESTPOOL/$TESTFS $TESTPOOL ; do + mtpt=$(get_prop mountpoint $fs) + log_must $RM -rf $mtpt/file.* $mtpt/dir.* + done +} + +# +# Set the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be set +# $3: Execute username +# +function set_attribute +{ + typeset object=$1 + typeset attr=${2:-AHRS} + typeset user=$3 + typeset ret=0 + + if [[ -z $object ]]; then + log_fail "Object not defined." + fi + + if [[ -n $user ]]; then + $SU $user -c "$CHMOD S+c${attr} $object" + ret=$? + else + $CHMOD S+c${attr} $object + ret=$? + fi + + return $ret +} + +# +# Clear the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be cleared +# $3: Execute username +# +function clear_attribute +{ + typeset object=$1 + typeset attr=${2:-AHRS} + typeset user=$3 + typeset ret=0 + + if [[ -z $object ]]; then + log_fail "Object not defined." + fi + + if [[ -n $user ]]; then + $SU $user -c "$CHMOD S-c${attr} $object" + ret=$? + else + $CHMOD S-c${attr} $object + ret=$? + fi + + return $ret +} + +# +# Grant the ace of write_attributes to the given user +# +# $1: The given user +# $2: The given node (file/dir) +# +function grant_attr +{ + typeset user=$1 + typeset object=$2 + + if [[ -z $user || -z $object ]]; then + log_fail "User($user), Object($object) not defined." + fi + + # To increase the coverage, here we set 'deny' against + # superuser and owner. + # Only grant the user explicitly while it's not root neither owner. + + if [[ $user == "root" ]]; then + log_must $CHMOD A+user:root:write_attributes:deny $object + elif [[ $user == $(get_owner $object) ]]; then + if (((RANDOM % 2) == 0)); then + log_must $CHMOD A+owner@:write_attributes:deny $object + else + log_must $CHMOD A+user:$user:write_attributes:deny \ + $object + fi + else + log_must $CHMOD A+user:$user:write_attributes:allow $object + fi + attr_mod="write_attributes" +} + +# +# Revoke the ace of write_attributes from the given user +# +# $1: The given user +# $2: The given node (file/dir) +# +function revoke_attr +{ + typeset user=$1 + typeset object=$2 + + if [[ -z $user || -z $object ]]; then + log_fail "User($user), Object($object) not defined." + fi + + log_must $CHMOD A0- $object + attr_mod= +} + +# +# Invoke the function and verify whether its return code as expected +# +# $1: Function be invoked +# $2: The given node (file/dir) +# $3: Execute user +# $4: Option +# +function verify_attr +{ + typeset func=$1 + typeset object=$2 + typeset opt=$3 + typeset user=$4 + typeset expect="log_mustnot" + + if [[ -z $func || -z $object ]]; then + log_fail "Func($func), Object($object), User($user), \ + Opt($opt) not defined." + fi + + # If user is superuser or has write_attributes permission or + # PRIV_FILE_OWNER privilege, it should log_must, + # otherwise log_mustnot. + + if [[ -z $user || $user == "root" || $user == \ + $(get_owner $object) || $attr_mod == *"write_attributes"* ]] ; then + expect="log_must" + fi + + $expect $func $object $opt $user +} + +log_assert "Verify set/clear DOS attributes will succeed while user has " \ + "write_attributes permission or PRIV_FILE_OWNER privilege" +log_onexit cleanup + +file="file.0" +dir="dir.0" +XATTROPTIONS="H S R A" + +for fs in $TESTPOOL $TESTPOOL/$TESTFS ; do + mtpt=$(get_prop mountpoint $fs) + for owner in root $ZFS_ACL_STAFF1 ; do + + create_object "file" $mtpt/$file $owner + create_object "dir" $mtpt/$dir $owner + + for object in $mtpt/$file $mtpt/$dir ; do + for user in root $ZFS_ACL_STAFF2 ; do + for opt in $XATTROPTIONS ; do + verify_attr set_attribute \ + $object $opt $user + verify_attr clear_attribute \ + $object $opt $user + done + log_must grant_attr $user $object + for opt in $XATTROPTIONS ; do + verify_attr set_attribute \ + $object $opt $user + verify_attr clear_attribute \ + $object $opt $user + done + log_must revoke_attr $user $object + done + done + destroy_object $mtpt/$file $mtpt/$dir + done +done + +log_pass "Set/Clear DOS attributes succeed while user has " \ + "write_attributes permission or PRIV_FILE_OWNER privilege" diff --git a/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs_attr_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs_attr_002_pos.ksh new file mode 100644 index 0000000000..04cfbab368 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs_attr_002_pos.ksh @@ -0,0 +1,208 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib +. $STF_SUITE/tests/functional/acl/cifs/cifs.kshlib + +# +# DESCRIPTION: +# Verify the user with PRIV_FILE_FLAG_SET/PRIV_FILE_FLAG_CLEAR +# could set/clear BSD'ish attributes. +# (Immutable, nounlink, and appendonly) +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Grant user has PRIV_FILE_FLAG_SET/PRIV_FILE_FLAG_CLEAR separately. +# 4. Verify set/clear BSD'ish attributes should succeed. +# + +verify_runnable "global" + +function cleanup +{ + $RM -f $mntpt/file $mntpt/dir || log_fail + "$($LS -d/ c $mntpt/file $mntpt/dir)" + + log_must $CP $orig_user_attr /etc/user_attr + log_must $RM -f $orig_user_attr +} + +function try +{ + typeset obj=$1 # The file or dir to operate on + typeset attr=$2 # The attribute to set or clear + typeset user=$3 # The user to run the command as + typeset priv=$4 # What privilege to run with if non-root + typeset op=$5 # Whether to set or clear the attribute + + typeset cmd="$CHMOD $op$attr $obj" + + # + # No one can add 'q' (av_quarantine) to a directory. root can do + # anything else. A regular user can remove no attributes without the + # 'all' privilege, and can add attributes (other than 'q' on a + # directory) with the 'file_flag_set' or 'all' privileges. + # + if [[ $user == 'root' ]]; then + if [[ $attr =~ 'q' && -d $obj && $op == $add ]]; then + log_mustnot $cmd + else + log_must $cmd + fi + else + if [[ $attr =~ 'q' && -d $obj && $op == $add ]]; then + log_mustnot $SU $user -c "$cmd" + else + if [[ $op == $add ]]; then + if [[ -n $priv ]]; then + log_must $SU $user -c "$cmd" + else + log_mustnot $SU $user -c "$cmd" + fi + else + if [[ $attr = 'q' && -d $obj ]]; then + log_must $SU $user -c "$cmd" + elif [[ $priv =~ 'all' ]]; then + log_must $SU $user -c "$cmd" + else + log_mustnot $SU $user -c "$cmd" + # + # Remove the attribute, so the next + # iteration starts with a known state. + # + log_must $cmd + fi + fi + fi + fi + + + # Can't add av_quarantine to a directory, so don't check for that + [[ $attr == 'q' && $op == $add && -d $obj ]] && return + chk_attr $op $obj $attr +} + +function chk_attr +{ + typeset op=$1 + typeset obj=$2 + typeset attr=$3 + + # Extract the attribute string - just the text inside the braces + typeset attrstr="$($LS -d/ c $obj | $SED '1d; s/.*{\(.*\)}.*/\1/g')" + + if [[ $op == $add ]]; then + [[ $attrstr =~ $attr ]] || log_fail "$op $attr -> $attrstr" + else + [[ $attrstr =~ $attr ]] && log_fail "$op $attr -> $attrstr" + fi +} + +# +# Grant the privset to the given user +# +# $1: The given user +# $2: The given privset +# +function grant_priv +{ + typeset user=$1 + typeset priv=$2 + + if [[ -z $user || -z $priv ]]; then + log_fail "User($user), Priv($priv) not defined." + fi + + priv_mod=",$priv" + + # If we're root, don't modify /etc/user_attr + [[ $user == 'root' ]] && return 0 + + $ECHO "$user::::type=normal;defaultpriv=basic$priv_mod" >> \ + /etc/user_attr + return $? +} + +# +# Revoke the all additional privset from the given user +# +# $1: The given user +# +function reset_privs +{ + typeset user=$1 + + if [[ -z $user ]]; then + log_fail "User not defined." + fi + + priv_mod= + + $CP $orig_user_attr /etc/user_attr || log_fail "Couldn't modify user_attr" + return 0 +} + +log_assert "Verify set/clear BSD'ish attributes will succeed while user has " \ + "file_flag_set or all privilege" +log_onexit cleanup + +add='S+c' +del='S-c' +mntpt=$(get_prop mountpoint $TESTPOOL/$TESTFS) +orig_user_attr="/tmp/user_attr.$$" +attributes="u i a d q m" + +log_must $CP /etc/user_attr $orig_user_attr + +for owner in root $ZFS_ACL_STAFF1 $ZFS_ACL_STAFF2; do + $TOUCH $mntpt/file || log_fail "Failed to create $mntpt/file" + $MKDIR $mntpt/dir || log_fail "Failed to mkdir $mntpt/dir" + $CHOWN $owner $mntpt/file $mntpt/dir || log_fail "Failed to chown file" + for user in 'root' $ZFS_ACL_STAFF2; do + for attr in $attributes; do + for priv in 'file_flag_set' 'all'; do + log_note "Trying $owner $user $attr $priv" + grant_priv $user $priv + try $mntpt/file $attr $user $priv $add + try $mntpt/file $attr $user $priv $del + try $mntpt/dir $attr $user $priv $add + try $mntpt/dir $attr $user $priv $del + reset_privs $user + done + done + done + $RM -rf $mntpt/file $mntpt/dir || log_fail \ + "$($LS -d/ c $mntpt/file $mntpt/dir)" +done + +log_pass "Set/Clear BSD'ish attributes succeed while user has " \ + "PRIV_FILE_FLAG_SET/PRIV_FILE_FLAG_CLEAR privilege" diff --git a/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs_attr_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs_attr_003_pos.ksh new file mode 100644 index 0000000000..3819bf2ea5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cifs_attr_003_pos.ksh @@ -0,0 +1,602 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib +. $STF_SUITE/tests/functional/acl/cifs/cifs.kshlib + +# +# DESCRIPTION: +# Verify the DOS attributes (Readonly, Hidden, Archive, System) +# and BSD'ish attributes (Immutable, nounlink, and appendonly) +# will provide the proper access limitation as expected. +# +# Readonly means that the content of a file can't be modified, but +# timestamps, mode and so on can. +# +# Archive - Indicates if a file should be included in the next backup +# of the file system. ZFS will set this bit whenever a file is +# modified. +# +# Hidden and System (ZFS does nothing special with these, other than +# letting a user/application set them. +# +# Immutable (The data can't, change nor can mode, ACL, size and so on) +# The only attribute that can be updated is the access time. +# +# Nonunlink - Sort of like immutable except that a file/dir can't be +# removed. +# This will also effect a rename operation, since that involes a +# remove. +# +# Appendonly - File can only be appended to. +# +# nodump, settable, opaque (These are for the MacOS port) we will +# allow them to be set, but have no semantics tied to them. +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Set the file/dir with each kind of special attribute. +# 4. Verify the access limitation works as expected. +# + +verify_runnable "both" + +function cleanup +{ + if [[ -n $gobject ]]; then + destroy_object $gobject + fi + + for fs in $TESTPOOL/$TESTFS $TESTPOOL ; do + mtpt=$(get_prop mountpoint $fs) + log_must $RM -rf $mtpt/file.* $mtpt/dir.* + done + + [[ -f $TESTFILE ]] && $RM $TESTFILE +} + +# +# Set the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be set +# +function set_attribute +{ + typeset object=$1 + typeset attr=$2 + + if [[ -z $attr ]]; then + attr="AHRSadimu" + if [[ -f $object ]]; then + attr="${attr}q" + fi + fi + $CHMOD S+c${attr} $object + return $? +} + +# +# Clear the special attribute to the given node +# +# $1: The given node (file/dir) +# $2: The special attribute to be cleared +# +function clear_attribute +{ + typeset object=$1 + typeset attr=$2 + + if [[ -z $attr ]]; then + if is_global_zone ; then + attr="AHRSadimu" + if [[ -f $object ]]; then + attr="${attr}q" + fi + else + attr="AHRS" + fi + fi + + $CHMOD S-c${attr} $object + return $? +} + +# +# A wrapper function to call test function according to the given attr +# +# $1: The given node (file/dir) +# $2: The special attribute to be test +# +function test_wrapper +{ + typeset object=$1 + typeset attr=$2 + + if [[ -z $object || -z $attr ]]; then + log_fail "Object($object), Attr($attr) not defined." + fi + + case $attr in + R) func=test_readonly + ;; + i) func=test_immutable + ;; + u) func=test_nounlink + ;; + a) func=test_appendonly + ;; + esac + + if [[ -n $func ]]; then + $func $object + fi +} + +# +# Invoke the function and verify whether its return code as expected +# +# $1: Expect value +# $2-$n: Function and args need to be invoked +# +function verify_expect +{ + typeset -i expect=$1 + typeset status + + shift + + "$@" > /dev/null 2>&1 + status=$? + if [[ $status -eq 0 ]]; then + if ((expect != 0)); then + log_fail "$@ unexpect return 0" + fi + else + if ((expect == 0)); then + log_fail "$@ unexpect return $status" + fi + fi +} + +# +# Unit testing function against overwrite file +# +# $1: The given file node +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_writefile +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + if [[ -f $object ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $CP $TESTFILE $object + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$ECHO '$TESTSTR' > $object" + fi +} + +# +# Unit testing function against write new stuffs into a directory +# +# $1: The given directory node +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_writedir +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + if [[ -d $object ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $CP $TESTFILE $object + verify_expect $expect $CHG_USR_EXEC $user \ + $MKDIR -p $object/$TESTDIR + fi +} + +function unit_appenddata +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + if [[ ! -d $object ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$ECHO '$TESTSTR' >> $object" + fi +} + +# +# Unit testing function against delete content from a directory +# +# $1: The given node, dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_deletecontent +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + if [[ -d $object ]]; then + for target in $object/${TESTFILE##*/} $object/$TESTDIR ; do + if [[ -e $target ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$MV $target $target.new" + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$ECHO y | $RM -r $target.new" + fi + done + fi +} + +# +# Unit testing function against delete a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_deletedata +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$ECHO y | $RM -r $object" + +} + +# +# Unit testing function against write xattr to a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_writexattr +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + verify_expect $expect $CHG_USR_EXEC $user \ + $RUNAT $object "$CP $TESTFILE $TESTATTR" + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$RUNAT $object \"$ECHO '$TESTSTR' > $TESTATTR\"" + verify_expect $expect $CHG_USR_EXEC $user \ + $EVAL "$RUNAT $object \"$ECHO '$TESTSTR' >> $TESTATTR\"" + if [[ $expect -eq 0 ]]; then + verify_expect $expect $CHG_USR_EXEC $user \ + $RUNAT $object "$RM -f $TESTATTR" + fi +} + +# +# Unit testing function against modify accesstime of a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_accesstime +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + if [[ -d $object ]]; then + verify_expect $expect $CHG_USR_EXEC $user $LS $object + else + verify_expect $expect $CHG_USR_EXEC $user $CAT $object + fi +} + +# +# Unit testing function against modify updatetime of a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_updatetime +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + typeset immutable_expect=${4:-$expect} + verify_expect $expect $CHG_USR_EXEC $user $TOUCH $object + verify_expect $immutable_expect $CHG_USR_EXEC $user $TOUCH -a $object + verify_expect $expect $CHG_USR_EXEC $user $TOUCH -m $object +} + +# +# Unit testing function against write acl of a node +# +# $1: The given node, file/dir +# $2: Execute user +# $3: Expect value, default to be zero +# +function unit_writeacl +{ + typeset object=$1 + typeset user=$2 + typeset expect=${3:-0} + + verify_expect $expect $CHG_USR_EXEC $user $CHMOD A+$TESTACL $object + verify_expect $expect $CHG_USR_EXEC $user $CHMOD A+$TESTACL $object + verify_expect $expect $CHG_USR_EXEC $user $CHMOD A0- $object + verify_expect $expect $CHG_USR_EXEC $user $CHMOD A0- $object + oldmode=$(get_mode $object) + verify_expect $expect $CHG_USR_EXEC $user $CHMOD $TESTMODE $object +} + +# +# Testing function to verify the given node is readonly +# +# $1: The given node, file/dir +# +function test_readonly +{ + typeset object=$1 + + if [[ -z $object ]]; then + log_fail "Object($object) not defined." + fi + + log_note "Testing readonly of $object" + + for user in $ZFS_ACL_CUR_USER root $ZFS_ACL_STAFF2; do + if [[ -d $object ]]; then + log_must usr_exec $CHMOD \ + A+user:$user:${ace_dir}:allow $object + else + log_must usr_exec $CHMOD \ + A+user:$user:${ace_file}:allow $object + fi + + log_must set_attribute $object "R" + + unit_writefile $object $user 1 + unit_writedir $object $user + unit_appenddata $object $user 1 + + if [[ -d $object ]]; then + unit_writexattr $object $user + else + unit_writexattr $object $user 1 + fi + + unit_accesstime $object $user + unit_updatetime $object $user + unit_writeacl $object $user + unit_deletecontent $object $user + unit_deletedata $object $user + + if [[ -d $object ]] ;then + create_object "dir" $object $ZFS_ACL_CUR_USER + else + create_object "file" $object $ZFS_ACL_CUR_USER + fi + done +} + +# +# Testing function to verify the given node is immutable +# +# $1: The given node, file/dir +# +function test_immutable +{ + typeset object=$1 + + if [[ -z $object ]]; then + log_fail "Object($object) not defined." + fi + + log_note "Testing immutable of $object" + + for user in $ZFS_ACL_CUR_USER root $ZFS_ACL_STAFF2; do + if [[ -d $object ]]; then + log_must usr_exec $CHMOD \ + A+user:$user:${ace_dir}:allow $object + else + log_must usr_exec $CHMOD \ + A+user:$user:${ace_file}:allow $object + fi + log_must set_attribute $object "i" + + unit_writefile $object $user 1 + unit_writedir $object $user 1 + unit_appenddata $object $user 1 + unit_writexattr $object $user 1 + unit_accesstime $object $user + unit_updatetime $object $user 1 0 + unit_writeacl $object $user 1 + unit_deletecontent $object $user 1 + unit_deletedata $object $user 1 + + if [[ -d $object ]] ;then + create_object "dir" $object $ZFS_ACL_CUR_USER + else + create_object "file" $object $ZFS_ACL_CUR_USER + fi + done +} + +# +# Testing function to verify the given node is nounlink +# +# $1: The given node, file/dir +# +function test_nounlink +{ + typeset object=$1 + + if [[ -z $object ]]; then + log_fail "Object($object) not defined." + fi + + $ECHO "Testing nounlink of $object" + + for user in $ZFS_ACL_CUR_USER root $ZFS_ACL_STAFF2; do + if [[ -d $object ]]; then + log_must usr_exec $CHMOD \ + A+user:$user:${ace_dir}:allow $object + else + log_must usr_exec $CHMOD \ + A+user:$user:${ace_file}:allow $object + fi + log_must set_attribute $object "u" + + unit_writefile $object $user + unit_writedir $object $user + unit_appenddata $object $user + unit_writexattr $object $user + unit_accesstime $object $user + unit_updatetime $object $user + unit_writeacl $object $user + unit_deletecontent $object $user 1 + unit_deletedata $object $user 1 + + if [[ -d $object ]] ;then + create_object "dir" $object $ZFS_ACL_CUR_USER + else + create_object "file" $object $ZFS_ACL_CUR_USER + fi + done +} + +# +# Testing function to verify the given node is appendonly +# +# $1: The given node, file/dir +# +function test_appendonly +{ + typeset object=$1 + + if [[ -z $object ]]; then + log_fail "Object($object) not defined." + fi + + log_note "Testing appendonly of $object" + + for user in $ZFS_ACL_CUR_USER root $ZFS_ACL_STAFF2; do + if [[ -d $object ]]; then + log_must usr_exec $CHMOD \ + A+user:$user:${ace_dir}:allow $object + else + log_must usr_exec $CHMOD \ + A+user:$user:${ace_file}:allow $object + fi + log_must set_attribute $object "a" + + unit_writefile $object $user 1 + unit_writedir $object $user + unit_appenddata $object $user + unit_writexattr $object $user + unit_accesstime $object $user + unit_updatetime $object $user + unit_writeacl $object $user + unit_deletecontent $object $user + unit_deletedata $object $user + + if [[ -d $object ]] ;then + create_object "dir" $object $ZFS_ACL_CUR_USER + else + create_object "file" $object $ZFS_ACL_CUR_USER + fi + done +} + +FILES="file.0 file.1" +DIRS="dir.0 dir.1" +XATTRS="attr.0 attr.1" +FS="$TESTPOOL $TESTPOOL/$TESTFS" + +if is_global_zone ; then + ATTRS="R i u a" +else + ATTRS="R" +fi + +TESTFILE=/tmp/tfile +TESTDIR=tdir +TESTATTR=tattr +TESTACL=user:$ZFS_ACL_OTHER1:write_data:allow +TESTMODE=777 +TESTSTR="ZFS test suites" + +ace_file="write_data/append_data/write_xattr/write_acl/write_attributes" +ace_dir="add_file/add_subdirectory/${ace_file}" + +log_assert "Verify DOS & BSD'ish attributes will provide the " \ + "access limitation as expected." +log_onexit cleanup + +$ECHO "$TESTSTR" > $TESTFILE + +typeset gobject +typeset gattr +for gattr in $ATTRS ; do + for fs in $FS ; do + mtpt=$(get_prop mountpoint $fs) + $CHMOD 777 $mtpt + for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + for file in $FILES ; do + gobject=$mtpt/$file + create_object "file" $gobject $ZFS_ACL_CUR_USER + test_wrapper $gobject $gattr + destroy_object $gobject + done + + for dir in $DIRS ; do + gobject=$mtpt/$dir + create_object "dir" $gobject $ZFS_ACL_CUR_USER + test_wrapper $gobject $gattr + destroy_object $gobject + done + done + done +done + +log_pass "DOS & BSD'ish attributes provide the access limitation as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/cifs/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cleanup.ksh new file mode 100644 index 0000000000..ea2d0aaa49 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/cifs/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +cleanup_user_group + +# restore the state of svc:/network/nis/client:default +if [[ -e $NISSTAFILE ]]; then + log_must $SVCADM enable svc:/network/nis/client:default + log_must $RM -f $NISSTAFILE +fi + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/acl/cifs/setup.ksh b/usr/src/test/zfs-tests/tests/functional/acl/cifs/setup.ksh new file mode 100644 index 0000000000..5262c178ec --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/cifs/setup.ksh @@ -0,0 +1,59 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# check svc:/network/nis/client:default state +# disable it if the state is ON +# and the state will be restored during cleanup.ksh +log_must $RM -f $NISSTAFILE +if [[ "ON" == $($SVCS -H -o sta svc:/network/nis/client:default) ]]; then + log_must $SVCADM disable -t svc:/network/nis/client:default + log_must $TOUCH $NISSTAFILE +fi + +cleanup_user_group + +# Add root group user +log_must add_user root $ZFS_ACL_ADMIN + +# Create staff group and add two user to it +log_must add_group $ZFS_ACL_STAFF_GROUP +log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF1 +log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF2 + +# Create other group and add two user to it +log_must add_group $ZFS_ACL_OTHER_GROUP +log_must add_user $ZFS_ACL_OTHER_GROUP $ZFS_ACL_OTHER1 +log_must add_user $ZFS_ACL_OTHER_GROUP $ZFS_ACL_OTHER2 + +DISK=${DISKS%% *} +default_setup_noexit $DISK +log_must $CHMOD 777 $TESTDIR + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/Makefile b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/Makefile new file mode 100644 index 0000000000..c1e14d5c83 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/Makefile @@ -0,0 +1,64 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/acl/nontrivial + +PROGS = cleanup \ + setup \ + zfs_acl_chmod_001_neg \ + zfs_acl_chmod_002_pos \ + zfs_acl_chmod_aclmode_001_pos \ + zfs_acl_chmod_compact_001_pos \ + zfs_acl_chmod_delete_001_pos \ + zfs_acl_chmod_inherit_001_pos \ + zfs_acl_chmod_inherit_002_neg \ + zfs_acl_chmod_inherit_002_pos \ + zfs_acl_chmod_inherit_003_pos \ + zfs_acl_chmod_inherit_004_pos \ + zfs_acl_chmod_owner_001_pos \ + zfs_acl_chmod_rwacl_001_pos \ + zfs_acl_chmod_rwx_001_pos \ + zfs_acl_chmod_rwx_002_pos \ + zfs_acl_chmod_rwx_003_pos \ + zfs_acl_chmod_rwx_004_pos \ + zfs_acl_chmod_xattr_001_pos \ + zfs_acl_chmod_xattr_002_pos \ + zfs_acl_cp_001_pos \ + zfs_acl_cp_002_pos \ + zfs_acl_cpio_001_pos \ + zfs_acl_cpio_002_pos \ + zfs_acl_find_001_pos \ + zfs_acl_ls_001_pos \ + zfs_acl_mv_001_pos \ + zfs_acl_tar_001_pos \ + zfs_acl_tar_002_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/cleanup.ksh new file mode 100644 index 0000000000..ea2d0aaa49 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +cleanup_user_group + +# restore the state of svc:/network/nis/client:default +if [[ -e $NISSTAFILE ]]; then + log_must $SVCADM enable svc:/network/nis/client:default + log_must $RM -f $NISSTAFILE +fi + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/setup.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/setup.ksh new file mode 100644 index 0000000000..5262c178ec --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/setup.ksh @@ -0,0 +1,59 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# check svc:/network/nis/client:default state +# disable it if the state is ON +# and the state will be restored during cleanup.ksh +log_must $RM -f $NISSTAFILE +if [[ "ON" == $($SVCS -H -o sta svc:/network/nis/client:default) ]]; then + log_must $SVCADM disable -t svc:/network/nis/client:default + log_must $TOUCH $NISSTAFILE +fi + +cleanup_user_group + +# Add root group user +log_must add_user root $ZFS_ACL_ADMIN + +# Create staff group and add two user to it +log_must add_group $ZFS_ACL_STAFF_GROUP +log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF1 +log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF2 + +# Create other group and add two user to it +log_must add_group $ZFS_ACL_OTHER_GROUP +log_must add_user $ZFS_ACL_OTHER_GROUP $ZFS_ACL_OTHER1 +log_must add_user $ZFS_ACL_OTHER_GROUP $ZFS_ACL_OTHER2 + +DISK=${DISKS%% *} +default_setup_noexit $DISK +log_must $CHMOD 777 $TESTDIR + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_001_neg.ksh new file mode 100644 index 0000000000..09841e17c1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_001_neg.ksh @@ -0,0 +1,131 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify 1) Illegal options to chmod should fail. +# 2) Delete all the ACE will lead to fail. +# 3) Add ACE exceed 1024 will cause to fail. +# +# STRATEGY: +# 1. Loop root and non-root users +# 2. Verify all kinds of illegal option will lead to chmod failed. +# 3. Verify 'chmod A0-' will fail when try to delete all the ACE. +# 4. Verify 'chmod A+' will succeed when the ACE number exceed 1024. +# + +verify_runnable "both" + +log_assert "Verify illegal operating to ACL, it will fail." +log_onexit cleanup + +function err_opts #node +{ + typeset A_opts="+A@ -A#- +A% =A^ =A# =A@ +A#\ asd \ + A+@ A-#- A+% A=^ A=# A=@ A+#" + + log_note "Illegal option to chmod should fail." + for A in ${A_opts[@]}; do + log_mustnot usr_exec $CHMOD ${A}owner@:read_data:allow $node + log_mustnot usr_exec $CHMOD A+ asd owner@:execute:deny $node + done + + typeset type_opts="everyone groups owner user@ users" + for tp in ${type_opts[@]}; do + log_mustnot usr_exec $CHMOD A+$tp:read_data:deny $node + done + + return 0 +} + +function del_all_ACE #node +{ + typeset node=$1 + typeset -i cnt + + cnt=$(count_ACE $node) + while (( cnt > 0 )); do + if (( cnt == 1 )); then + log_mustnot $CHMOD A0- $node + else + log_must $CHMOD A0- $node + fi + + (( cnt -= 1 )) + done + + return 0 +} + +function exceed_max_ACE #node +{ + typeset node=$1 + typeset -i max=1024 + typeset -i cnt + + cnt=$(count_ACE $node) + + # One more ACE exceed the max limitation. + (( max = max - cnt + 1 )) + while (( max > 0 )); do + if (( max == 1 )); then + log_mustnot $CHMOD A+owner@:read_data:allow $node + else + $CHMOD A+owner@:read_data:allow $node + if (($? != 0)); then + ((cnt = 1024 - max)) + log_fail "Add No.$cnt ACL item failed." + fi + fi + + (( max -= 1 )) + done + + return 0 +} + +typeset node +typeset func_name="err_opts del_all_ACE exceed_max_ACE" + +for usr in "root" "$ZFS_ACL_STAFF1"; do + log_must set_cur_usr $usr + + for node in $testfile $testdir; do + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir + + for func in $func_name; do + log_must eval "$func $node" + done + + log_must usr_exec $RM -rf $testfile $testdir + done +done + +log_pass "Verify illegal operating to ACL passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_002_pos.ksh new file mode 100644 index 0000000000..28594611d7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_002_pos.ksh @@ -0,0 +1,61 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify acl after upgrading. +# STRATEGY: +# 1. Create a low version fs. +# 2. Create a directory and chmod it. +# 3. Upgrade the fs. +# 4. Create a file under the directory and list it. +# + +verify_runnable "both" + +function acl_upgrade_cleannup +{ + log_must $ZFS destroy -rR $ACL_UPGRADE_FS +} + +log_assert "Verify acl after upgrading." +log_onexit acl_upgrade_cleannup + +ACL_UPGRADE_FS=$TESTPOOL/acl_upgrade_fs.$$ + +log_must $ZFS create -o version=2 $ACL_UPGRADE_FS +mntpnt=$(get_prop mountpoint $ACL_UPGRADE_FS) +log_must $MKDIR $mntpnt/dir.$$ +log_must $CHMOD A+owner@:rwxp:f:allow,group@:rwxp:f:allow $mntpnt/dir.$$ +log_must $ZFS upgrade $ACL_UPGRADE_FS +log_must $TOUCH $mntpnt/dir.$$/file.$$ +log_must eval "$LS -V $mntpnt/dir.$$/file.$$ > /dev/null 2>&1" + +log_pass "Verify acl after upgrading." + diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_aclmode_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_aclmode_001_pos.ksh new file mode 100644 index 0000000000..be01ae09f4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_aclmode_001_pos.ksh @@ -0,0 +1,555 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify chmod have correct behaviour on directories and files when +# filesystem has the different aclmode setting +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Separately chmod basedir with different aclmode options, +# combine with the variable setting of aclmode: +# "discard", "groupmask", or "passthrough". +# 4. Verify each directories and files have the correct access control +# capability. +# + +verify_runnable "both" + +function cleanup +{ + # Cleanup tarfile & basedir. + + (( ${#cwd} != 0 )) && cd $cwd + + if [[ -f $TARFILE ]]; then + log_must $RM -f $TARFILE + fi + + if [[ -d $basedir ]]; then + log_must $RM -rf $basedir + fi +} + +log_assert "Verify chmod have correct behaviour to directory and file when " \ + "filesystem has the different aclmode setting." +log_onexit cleanup + +# Define aclmode flag +set -A aclmode_flag discard groupmask passthrough + +set -A ace_prefix "user:$ZFS_ACL_OTHER1" \ + "user:$ZFS_ACL_OTHER2" \ + "group:$ZFS_ACL_STAFF_GROUP" \ + "group:$ZFS_ACL_OTHER_GROUP" + +set -A argv "000" "444" "644" "777" "755" "231" "562" "413" + +set -A ace_file_preset "read_data" \ + "write_data" \ + "append_data" \ + "execute" \ + "read_data/write_data" \ + "read_data/write_data/append_data" \ + "write_data/append_data" \ + "read_data/execute" \ + "write_data/append_data/execute" \ + "read_data/write_data/append_data/execute" + +# Defile the based directory and file +basedir=$TESTDIR/basedir; ofile=$basedir/ofile; odir=$basedir/odir +nfile=$basedir/nfile; ndir=$basedir/ndir + +TARFILE=$TESTDIR/tarfile + +# Verify all the node have expected correct access control +allnodes="$nfile $ndir" + +# +# According to the original bits, the input ACE access and ACE type, return the +# expect bits after 'chmod A0{+|=}'. +# +# $1 isdir indicate if the target is a directory +# $2 bits which was make up of three bit 'rwx' +# $3 bits_limit which was make up of three bit 'rwx' +# $4 ACE access which is read_data, write_data or execute +# $5 ctrl which is to determine allow or deny according to owner/group bit +# +function cal_bits # isdir bits bits_limit acl_access ctrl +{ + typeset -i isdir=$1 + typeset -i bits=$2 + typeset -i bits_limit=$3 + typeset acl_access=$4 + typeset -i ctrl=${5:-0} + typeset flagr=0 flagw=0 flagx=0 + typeset tmpstr + + if (( ctrl == 0 )); then + if (( (( bits & 4 )) != 0 )); then + flagr=1 + fi + if (( (( bits & 2 )) != 0 )); then + flagw=1 + fi + if (( (( bits & 1 )) != 0 )); then + flagx=1 + fi + else + #Determine ACE as per owner/group bit + flagr=1 + flagw=1 + flagx=1 + + if (( ((bits & 4)) != 0 )) && \ + (( ((bits_limit & 4)) != 0 )); then + flagr=0 + fi + if (( ((bits & 2)) != 0 )) && \ + (( ((bits_limit & 2)) != 0 )); then + flagw=0 + fi + if (( ((bits & 1)) != 0 )) && \ + (( ((bits_limit & 1)) != 0 )); then + flagx=0 + fi + fi + if ((flagr != 0)); then + if [[ $acl_access == *"read_data"* ]]; then + if [[ $acl_access == *"allow"* && $passthrough == 0 ]]; then + tmpstr=${tmpstr} + else + if ((isdir == 0)); then + tmpstr=${tmpstr}/read_data + else + tmpstr=${tmpstr}/list_directory/read_data + fi + fi + fi + fi + + if ((flagw != 0)); then + if [[ $acl_access == *"allow"* && $passthrough == 0 ]]; then + tmpstr=${tmpstr} + else + if [[ $acl_access == *"write_data"* ]]; then + if ((isdir == 0)); then + tmpstr=${tmpstr}/write_data + else + tmpstr=${tmpstr}/add_file/write_data + fi + fi + if [[ $acl_access == *"append_data"* ]]; then + if ((isdir == 0)); then + tmpstr=${tmpstr}/append_data + else + tmpstr=${tmpstr}/add_subdirectory/append_data + fi + fi + fi + fi + if ((flagx != 0)); then + if [[ $acl_access == *"execute"* ]]; then + if [[ $acl_access == *"allow"* && $passthrough == 0 ]]; then + tmpstr=${tmpstr} + else + tmpstr=${tmpstr}/execute + fi + fi + fi + + tmpstr=${tmpstr#/} + + $ECHO "$tmpstr" +} + +# +# To translate an ace if the node is dir +# +# $1 isdir indicate if the target is a directory +# $2 acl to be translated +# +function translate_acl # isdir acl +{ + typeset -i isdir=$1 + typeset acl=$2 + typeset who prefix acltemp action + + if ((isdir != 0)); then + who=${acl%%:*} + prefix=$who + acltemp=${acl#*:} + acltemp=${acltemp%%:*} + prefix=$prefix:$acltemp + action=${acl##*:} + acl=$prefix:$(cal_bits $isdir 7 7 $acl 0):$action + fi + $ECHO "$acl" +} + +# +# To verify if a new ACL is generated as result of +# chmod operation. +# +# $1 bit indicates whether owner/group bit +# $2 newmode indicates the mode changed using chmod +# $3 isdir indicate if the target is a directory +# +function check_new_acl # bit newmode isdir +{ + typeset bits=$1 + typeset mode=$2 + typeset -i isdir=$3 + typeset new_acl + typeset gbit + typeset ebit + typeset str=":" + gbit=$(get_substr $mode 2 1) + ebit=$(get_substr $mode 3 1) + if (( ((bits & 4)) == 0 )); then + if (( ((gbit & 4)) != 0 || \ + ((ebit & 4)) != 0 )); then + if ((isdir == 0)); then + new_acl=${new_acl}${str}read_data + else + new_acl=${new_acl}${str}list_directory/read_data + fi + str="/" + fi + fi + if (( ((bits & 2)) == 0 )); then + if (( ((gbit & 2)) != 0 || \ + ((ebit & 2)) != 0 )); then + if ((isdir == 0)); then + new_acl=${new_acl}${str}write_data/append_data + else + new_acl=${new_acl}${str}add_file/write_data/ + new_acl=${new_acl}add_subdirectory/append_data + fi + str="/" + fi + fi + if (( ((bits & 1)) == 0 )); then + if (( ((gbit & 1)) != 0 || \ + ((ebit & 1)) != 0 )); then + new_acl=${new_acl}${str}execute + fi + fi + $ECHO "$new_acl" +} + +function build_new_acl # newmode isdir +{ + typeset newmode=$1 + typeset isdir=$2 + typeset expect + if ((flag == 0)); then + prefix="owner@" + bit=$(get_substr $newmode 1 1) + status=$(check_new_acl $bit $newmode $isdir) + + else + prefix="group@" + bit=$(get_substr $newmode 2 1) + status=$(check_new_acl $bit $newmode $isdir) + fi + expect=$prefix$status:deny + $ECHO $expect +} + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_aclmode # <aclmode> <node> <newmode> +{ + # Define the nodes which will be affected by inherit. + typeset aclmode=$1 + typeset node=$2 + typeset newmode=$3 + + # count: the ACE item to fetch + # pass: to mark if the current ACE should apply to the target + # passcnt: counter, if it achieves to maxnumber, + # then no additional ACE should apply. + + typeset -i count=0 pass=0 passcnt=0 + typeset -i bits=0 obits=0 bits_owner=0 isdir=0 + typeset -i total_acl + typeset -i acl_count=$(count_ACE $node) + + ((total_acl = maxnumber + 3)) + + if [[ -d $node ]]; then + ((isdir = 1)) + fi + + ((i = maxnumber - 1)) + count=0 + passcnt=0 + flag=0 + while ((i >= 0)); do + pass=0 + expect1=${acls[$i]} + passthrough=0 + # + # aclmode=passthrough, + # no changes will be made to the ACL other than + # generating the necessary ACL entries to represent + # the new mode of the file or directory. + # + # aclmode=discard, + # delete all ACL entries that don't represent + # the mode of the file. + # + # aclmode=groupmask, + # reduce user or group permissions. The permissions are + # reduced, such that they are no greater than the group + # permission bits, unless it is a user entry that has the + # same UID as the owner of the file or directory. + # Then, the ACL permissions are reduced so that they are + # no greater than owner permission bits. + # + + case $aclmode in + passthrough) + if ((acl_count > total_acl)); then + expect1=$(build_new_acl $newmode $isdir) + flag=1 + ((total_acl = total_acl + 1)) + ((i = i + 1)) + else + passthrough=1 + expect1=$(translate_acl $isdir $expect1) + fi + ;; + groupmask) + if ((acl_count > total_acl)); then + expect1=$(build_new_acl $newmode $isdir) + flag=1 + ((total_acl = total_acl + 1)) + ((i = i + 1)) + + elif [[ $expect1 == *":allow"* ]]; then + who=${expect1%%:*} + aclaction=${expect1##*:} + prefix=$who + acltemp="" + reduce=0 + # + # To determine the mask bits + # according to the entry type. + # + case $who in + owner@) + pos=1 + ;; + group@) + pos=2 + ;; + everyone@) + pos=3 + ;; + user) + acltemp=${expect1#*:} + acltemp=${acltemp%%:*} + owner=$(get_owner $node) + group=$(get_group $node) + if [[ $acltemp == \ + $owner ]]; then + pos=1 + else + pos=2 + fi + prefix=$prefix:$acltemp + ;; + group) + acltemp=${expect1#*:} + acltemp=${acltemp%%:*} + pos=2 + prefix=$prefix:$acltemp + reduce=1 + ;; + esac + obits=$(get_substr $newmode $pos 1) + ((bits = $obits)) + # + # permission should no greater than the + # group permission bits + # + if ((reduce != 0)); then + ((bits &= \ + $(get_substr $newmode 2 1))) + # The ACL permissions are reduced so + # that they are no greater than owner + # permission bits. + + ((bits_owner = \ + $(get_substr $newmode 1 1))) + ((bits &= $bits_owner)) + fi + + if ((bits < obits)) && \ + [[ -n $acltemp ]]; then + expect2=$prefix: + new_bit=$(cal_bits $isdir $obits $bits_owner $expect1 1) + expect2=${expect2}${new_bit}:allow + else + expect2=$prefix: + new_bit=$(cal_bits $isdir $obits $obits $expect1 1) + expect2=${expect2}${new_bit}:allow + fi + priv=$(cal_bits $isdir $obits $bits_owner $expect2 0) + expect1=$prefix:$priv:$aclaction + else + expect1=$(translate_acl $isdir $expect1) + fi + ;; + discard) + passcnt=maxnumber + break + ;; + esac + + if ((pass == 0)) ; then + # Get the first ACE to do comparison + + aclcur=$(get_ACE $node $count) + aclcur=${aclcur#$count:} + if [[ -n $expect1 && $expect1 != $aclcur ]]; then + $LS -vd $node + log_fail "$aclmode $i #$count " \ + "ACE: $aclcur, expect to be " \ + "$expect1" + fi + ((count = count + 1)) + fi + ((i = i - 1)) + done + + # + # If there's no any ACE be checked, it should be identify as + # an normal file/dir, verify it. + # + if ((passcnt == maxnumber)); then + if [[ -d $node ]]; then + compare_acls $node $odir + elif [[ -f $node ]]; then + compare_acls $node $ofile + fi + + if [[ $? -ne 0 ]]; then + $LS -vd $node + log_fail "Unexpect acl: $node, $aclmode ($newmode)" + fi + fi +} + + + +typeset -i maxnumber=0 +typeset acl +typeset target +typeset -i passthrough=0 +typeset -i flag=0 +cwd=$PWD +cd $TESTDIR + +for mode in "${aclmode_flag[@]}"; do + + # + # Set different value of aclmode + # + + log_must $ZFS set aclmode=$mode $TESTPOOL/$TESTFS + + for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must usr_exec $MKDIR $basedir + + log_must usr_exec $MKDIR $odir + log_must usr_exec $TOUCH $ofile + log_must usr_exec $MKDIR $ndir + log_must usr_exec $TOUCH $nfile + + for obj in $allnodes; do + maxnumber=0 + for preset in "${ace_file_preset[@]}"; do + for prefix in "${ace_prefix[@]}"; do + acl=$prefix:$preset + + case $((maxnumber % 2)) in + 0) + acl=$acl:deny + ;; + 1) + acl=$acl:allow + ;; + esac + + # + # Place on the target should succeed. + # + log_must usr_exec $CHMOD A+$acl $obj + acls[$maxnumber]=$acl + + ((maxnumber = maxnumber + 1)) + done + done + # Archive the file and directory + log_must $TAR cpf@ $TARFILE $basedir + + if [[ -d $obj ]]; then + target=$odir + elif [[ -f $obj ]]; then + target=$ofile + fi + for newmode in "${argv[@]}"; do + log_must usr_exec $CHMOD $newmode $obj + log_must usr_exec $CHMOD $newmode $target + log_must verify_aclmode $mode $obj $newmode + + # Restore the tar archive + log_must $TAR xpf@ $TARFILE + done + done + + log_must usr_exec $RM -rf $basedir $TARFILE + done +done + +log_pass "Verify chmod behaviour co-op with aclmode setting passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_compact_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_compact_001_pos.ksh new file mode 100644 index 0000000000..797cce46b2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_compact_001_pos.ksh @@ -0,0 +1,243 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# chmod A{+|-|=} could set compact ACL correctly. +# +# STRATEGY: +# 1. Loop root and non-root user. +# 2. Get the random compact ACL string. +# 4. Separately chmod +|-|= +# 5. Check compact ACL display as expected +# + +verify_runnable "both" + +log_assert "chmod A{+|=} should set compact ACL correctly." +log_onexit cleanup + +typeset a_flag=('owner' 'group' 'everyone') +typeset a_access=('r' 'w' 'x' 'p' 'd' 'D' 'a' 'A' 'R' 'W' 'c' 'C' 'o' 's') +typeset a_inherit_object=('f' 'd') +typeset a_inherit_strategy=('i' 'n') +typeset a_type=('allow' 'deny') + +# +# Get a random item from an array. +# +# $1 the base set +# +function random_select +{ + typeset arr_name=$1 + typeset -i ind + + eval typeset -i cnt=\${#${arr_name}[@]} + ((ind = $RANDOM % cnt)) + + eval print \${${arr_name}[$ind]} +} + +# +# Create a random string according to array name, the item number and +# separated tag. +# +# $1 array name where the function get the elements +# $2 the items number which you want to form the random string +# $3 the separated tag +# +function form_random_str +{ + typeset arr_name=$1 + typeset -i count=${2:-1} + typeset sep=${3:-""} + + typeset str="" + while ((count > 0)); do + str="${str}$(random_select $arr_name)${sep}" + + ((count -= 1)) + done + + print $str +} + +# +# According to the input ACE access,ACE type, and inherit flags, return the +# expect compact ACE that could be used by chmod A0{+|=}'. +# +# $1 ACE flag which is owner, group, or everyone +# $2 ACE access generated by the element of a_access +# $3 ACE inherit_object generated by the element of a_inherit_object +# $4 ACE inherit_strategy generated by the element of a_inherit_strategy +# $5 ACE type which is allow or deny +# +function cal_ace +{ + typeset acl_flag=$1 + typeset acl_access=$2 + typeset acl_inherit_object=$3 + typeset acl_inherit_strategy=$4 + typeset acl_type=$5 + + tmp_ace=${acl_flag}@: + + for element in ${a_access[@]} ; do + if [[ $acl_access == *"$element"* ]]; then + tmp_ace="${tmp_ace}${element}" + else + tmp_ace="${tmp_ace}-" + fi + done + tmp_ace=${tmp_ace}: + + for element in ${a_inherit_object[@]} ; do + if [[ $acl_inherit_object == *"$element"* ]]; then + tmp_ace="${tmp_ace}${element}" + else + tmp_ace="${tmp_ace}-" + fi + done + for element in ${a_inherit_strategy[@]} ; do + if [[ $acl_inherit_strategy == *"$element"* ]]; then + tmp_ace="${tmp_ace}${element}" + else + tmp_ace="${tmp_ace}-" + fi + done + + tmp_ace=${tmp_ace}---:${acl_type} + + echo "${tmp_ace}" +} + +# +# Check if chmod set the compact ACE correctly. +# +function check_test_result +{ + typeset node=$1 + typeset acl_flag=$2 + typeset acl_access=$3 + typeset acl_inherit_object=$4 + typeset acl_inherit_strategy=$5 + typeset acl_type=$6 + + typeset expect_ace=$(cal_ace "$acl_flag" "$acl_access" \ + "$acl_inherit_object" "$acl_inherit_strategy" "$acl_type") + + typeset cur_ace=$(get_ACE $node 0 "compact") + + if [[ $cur_ace != $expect_ace ]]; then + log_fail "FAIL: Current map($cur_ace) != \ + expected ace($expect_ace)" + fi +} + +function test_chmod_map +{ + typeset node=$1 + typeset acl_flag acl_access acl_inherit_object acl_inherit_strategy \ + acl_type + typeset -i cnt + + if ((${#node} == 0)); then + log_fail "FAIL: file name or directroy name is not defined." + fi + + # Get ACL flag, access & type + acl_flag=$(form_random_str a_flag) + ((cnt = ($RANDOM % ${#a_access[@]}) + 1)) + acl_access=$(form_random_str a_access $cnt) + acl_access=${acl_access%/} + acl_type=$(form_random_str a_type 1) + + acl_spec=${acl_flag}@:${acl_access} + if [[ -d $node ]]; then + # Get ACL inherit_object & inherit_strategy + ((cnt = ($RANDOM % ${#a_inherit_object[@]}) + 1)) + acl_inherit_object=$(form_random_str a_inherit_object $cnt) + ((cnt = ($RANDOM % ${#a_inherit_strategy[@]}) + 1)) + acl_inherit_strategy=$(form_random_str a_inherit_strategy $cnt) + acl_spec=${acl_spec}:${acl_inherit_object}${acl_inherit_strategy} + fi + acl_spec=${acl_spec}:${acl_type} + + # Set the initial map and back the initial ACEs + typeset orig_ace=/tmp/orig_ace.$$ + typeset cur_ace=/tmp/cur_ace.$$ + + for operator in "A0+" "A0="; do + log_must usr_exec eval "$LS -Vd $node > $orig_ace" + + # To "A=", firstly add one ACE which can't modify map + if [[ $operator == "A0=" ]]; then + log_must $CHMOD A0+user:$ZFS_ACL_OTHER1:execute:deny \ + $node + fi + log_must usr_exec $CHMOD ${operator}${acl_spec} $node + + check_test_result "$node" "$acl_flag" "$acl_access" \ + "$acl_inherit_object" "$acl_inherit_strategy" "$acl_type" + + # Check "chmod A-" + log_must usr_exec $CHMOD A0- $node + log_must usr_exec eval "$LS -Vd $node > $cur_ace" + + $DIFF $orig_ace $cur_ace + [[ $? -ne 0 ]] && log_fail "FAIL: 'chmod A-' failed." + done + + [[ -f $orig_ace ]] && log_must usr_exec $RM -f $orig_ace + [[ -f $cur_ace ]] && log_must usr_exec $RM -f $cur_ace +} + +for user in root $ZFS_ACL_STAFF1; do + set_cur_usr $user + + typeset -i loop_cnt=2 + while ((loop_cnt > 0)); do + log_must usr_exec $TOUCH $testfile + test_chmod_map $testfile + log_must $RM -f $testfile + + log_must usr_exec $MKDIR $testdir + test_chmod_map $testdir + log_must $RM -rf $testdir + + ((loop_cnt -= 1)) + done +done + +log_pass "chmod A{+|=} set compact ACL correctly." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_delete_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_delete_001_pos.ksh new file mode 100644 index 0000000000..7ddf774e85 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_delete_001_pos.ksh @@ -0,0 +1,301 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that the combined delete_child/delete permission for +# owner/group/everyone are correct. +# +# ------------------------------------------------------- +# | Parent Dir | Target Object Permissions | +# | permissions | | +# ------------------------------------------------------- +# | | ACL Allows | ACL Denies| Delete | +# | | Delete | Delete | unspecified| +# ------------------------------------------------------- +# | ACL Allows | Permit | Permit | Permit | +# | DELETE_CHILD | | +# ------------------------------------------------------- +# | ACL Denies | Permit | Deny | Deny | +# | DELETE_CHILD | | | | +# ------------------------------------------------------- +# | ACL specifies | | | | +# | only allows | Permit | Permit | Permit | +# | write and | | | | +# | execute | | | | +# ------------------------------------------------------- +# | ACL denies | | | | +# | write and | Permit | Deny | Deny | +# | execute | | | | +# ------------------------------------------------------- +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special ACE combination to the file and directory +# 3. Try to remove the file +# 4. Verify that combined permissions for owner/group/everyone are correct. +# + +verify_runnable "both" + +function cleanup +{ + if [[ ! -e $target ]]; then + log_must $TAR xpf $TESTDIR/$ARCHIVEFILE + fi + + (( ${#cwd} != 0 )) && cd $cwd + cleanup_test_files $TESTDIR/basedir + if [[ -e $TESTDIR/$ARCHIVEFILE ]]; then + log_must $RM -f $TESTDIR/$ARCHIVEFILE + fi + return 0 +} + +#owner@ group group_users other_users +set -A users \ +"root" "root" "$ZFS_ACL_ADMIN" "$ZFS_ACL_OTHER1" \ +"$ZFS_ACL_STAFF1" "$ZFS_ACL_STAFF_GROUP" "$ZFS_ACL_STAFF2" "$ZFS_ACL_OTHER1" + +set -A access_parent \ + "delete_child:allow" \ + "delete_child:deny" \ + "write_data:allow" \ + "write_data:deny" \ + "delete_child:deny write_data:allow" \ + "delete_child:allow write_data:deny" + +set -A access_target \ + "delete:allow" \ + "delete:deny" \ + "" + +set -A a_flag "owner@" "group@" "everyone@" "user:$ZFS_ACL_STAFF1" + +log_assert "Verify that the combined delete_child/delete permission for" \ + "owner/group/everyone are correct." +log_onexit cleanup + +function operate_node #user node +{ + typeset user=$1 + typeset node=$2 + typeset ret + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + if [[ -d $node ]]; then + chgusr_exec $user $RM -rf $node ; ret=$? + else + chgusr_exec $user $RM -f $node ; ret=$? + fi + + if [[ -e $node ]]; then + if [[ $ret -eq 0 ]]; then + log_note "$node not removed, but return code is 0." + return 1 + fi + else + log_must $TAR xpf $TESTDIR/$ARCHIVEFILE + if [[ $ret -ne 0 ]]; then + log_note "$node removed, but return code is $ret." + return 1 + fi + fi + return $ret +} + +function logname #acl_parent acl_target user +{ + typeset acl_parent=$1 + typeset acl_target=$2 + typeset user=$3 + + # To super user, read and write deny permission was override. + if [[ $user == root || $acl_target == *:allow ]]; then + print "log_must" + elif [[ $acl_parent == *"delete_child"* ]]; then + if [[ $acl_parent == *"delete_child:allow"* ]]; then + print "log_must" + else + print "log_mustnot" + fi + elif [[ $acl_parent == *"write_data"* ]]; then + if [[ $acl_parent == *"write_data:allow"* ]]; then + print "log_must" + else + print "log_mustnot" + fi + else + print "log_mustnot" + fi +} + +function check_chmod_results #node flag acl_parent acl_target g_usr o_usr +{ + typeset node=$1 + typeset flag=$2 + typeset acl_parent=$3 + typeset acl_target=$2:$4 + typeset g_usr=$5 + typeset o_usr=$6 + typeset log acl_tmp + + for acl in $acl_parent ; do + acl_tmp="$2:$acl $acl_tmp" + done + acl_parent=$acl_tmp + + if [[ $flag == "owner@" || $flag == "everyone@" ]]; then + log=$(logname "$acl_parent" $acl_target $ZFS_ACL_CUR_USER) + $log operate_node $ZFS_ACL_CUR_USER $node + fi + if [[ $flag == "group@" || $flag == "everyone@" ]]; then + log=$(logname "$acl_parent" $acl_target $g_usr) + $log operate_node $g_usr $node + fi + if [[ $flag == "everyone@" ]]; then + log=$(logname "$acl_parent" $acl_target $o_usr) + $log operate_node $o_usr $node + fi + if [[ $flag == "user:"* ]]; then + typeset user=${flag#user:} + log=$(logname "$acl_parent" $acl_target $user) + $log operate_node $user $node + fi +} + +function test_chmod_basic_access #node g_usr o_usr +{ + typeset node=${1%/} + typeset g_usr=$2 + typeset o_usr=$3 + typeset flag acl_p acl_t parent + typeset -i i=0 + + parent=${node%/*} + + for flag in ${a_flag[@]}; do + for acl_p in "${access_parent[@]}"; do + i=0 + for acl in $acl_p ; do + log_must usr_exec $CHMOD A+$flag:$acl $parent + (( i = i + 1)) + done + + for acl_t in "${access_target[@]}"; do + [[ -n $acl_t ]] && \ + log_must usr_exec $CHMOD A+$flag:$acl_t $node + + log_must $TAR cpf $TESTDIR/$ARCHIVEFILE basedir + + check_chmod_results "$node" "$flag" \ + "$acl_p" "$acl_t" "$g_usr" "$o_usr" + + [[ -n $acl_t ]] && \ + log_must usr_exec $CHMOD A0- $node + done + + while (( i > 0 )); do + log_must usr_exec $CHMOD A0- $parent + (( i = i - 1 )) + done + done + done +} + +function setup_test_files #base_node user group +{ + typeset base_node=$1 + typeset user=$2 + typeset group=$3 + + cleanup_test_files $base_node + + log_must $MKDIR -p $base_node + log_must $CHOWN $user:$group $base_node + + log_must set_cur_usr $user + + # Prepare all files/sub-dirs for testing. + file0=$base_node/testfile_rm + dir0=$base_node/testdir_rm + + log_must usr_exec $TOUCH $file0 + log_must usr_exec $CHMOD 444 $file0 + + log_must usr_exec $MKDIR -p $dir0 + log_must usr_exec $CHMOD 444 $dir0 + + log_must usr_exec $CHMOD 555 $base_node + return 0 +} + +function cleanup_test_files #base_node +{ + typeset base_node=$1 + + if [[ -d $base_node ]]; then + log_must $RM -rf $base_node + elif [[ -e $base_node ]]; then + log_must $RM -f $base_node + fi + + return 0 +} + +typeset cwd=$PWD +typeset ARCHIVEFILE=archive.tar + +typeset -i i=0 +typeset -i j=0 +typeset target +cd $TESTDIR +while (( i < ${#users[@]} )); do + setup_test_files $TESTDIR/basedir ${users[i]} ${users[((i+1))]} + + j=0 + while (( j < 1 )); do + eval target=\$file$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + eval target=\$dir$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + (( j = j + 1 )) + done + + (( i += 4 )) +done + +log_pass "Verify that the combined delete_child/delete permission for" \ + "owner/group/everyone are correct." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_001_pos.ksh new file mode 100644 index 0000000000..0a3f23abb0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_001_pos.ksh @@ -0,0 +1,173 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify chmod have correct behaviour to directory and file when setting +# different inherit strategy to them. +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Separately chmod basedir with different inherite options. +# 4. Then create nested directories and files like the following. +# +# _ odir4 +# |_ ofile4 +# _ odir3 _| +# |_ ofile3 +# _ odir1 _| +# |_ ofile2 +# basefile | +# chmod --> basedir -| +# |_ nfile1 +# |_ ndir1 _ +# |_ nfile2 +# |_ ndir2 _ +# |_ nfile3 +# |_ ndir3 +# +# 5. Verify each directories and files have the correct access control +# capability. +# + +verify_runnable "both" + +function cleanup +{ + if [[ -f $basefile ]]; then + log_must $RM -f $basefile + fi + if [[ -d $basedir ]]; then + log_must $RM -rf $basedir + fi +} + +log_assert "Verify chmod have correct behaviour to directory and file when " \ + "setting different inherit strategies to them." +log_onexit cleanup + +# Define inherit flag +set -A object_flag file_inherit dir_inherit file_inherit/dir_inherit +set -A strategy_flag "" inherit_only no_propagate inherit_only/no_propagate + +# Defile the based directory and file +basedir=$TESTDIR/basedir; basefile=$TESTDIR/basefile + +# Define the existed files and directories before chmod +odir1=$basedir/odir1; odir2=$odir1/odir2; odir3=$odir2/odir3 +ofile1=$basedir/ofile1; ofile2=$odir1/ofile2; ofile3=$odir2/ofile3 + +# Define the files and directories will be created after chmod +ndir1=$basedir/ndir1; ndir2=$ndir1/ndir2; ndir3=$ndir2/ndir3 +nfile1=$basedir/nfile1; nfile2=$ndir1/nfile2; nfile3=$ndir2/nfile3 + +# Verify all the node have expected correct access control +allnodes="$basedir $ndir1 $ndir2 $ndir3 $nfile1 $nfile2 $nfile3" +allnodes="$allnodes $odir1 $odir2 $odir3 $ofile1 $ofile2 $ofile3" + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_inherit #<object> [strategy] +{ + # Define the nodes which will be affected by inherit. + typeset inherit_nodes + typeset obj=$1 + typeset str=$2 + + log_must usr_exec $MKDIR -p $ndir3 + log_must usr_exec $TOUCH $nfile1 $nfile2 $nfile3 + + # Except for inherit_only, the basedir was affected always. + if [[ $str != *"inherit_only"* ]]; then + inherit_nodes="$inherit_nodes $basedir" + fi + # Get the files which inherited ACE. + if [[ $obj == *"file_inherit"* ]]; then + inherit_nodes="$inherit_nodes $nfile1" + + if [[ $str != *"no_propagate"* ]]; then + inherit_nodes="$inherit_nodes $nfile2 $nfile3" + fi + fi + # Get the directores which inherited ACE. + if [[ $obj == *"dir_inherit"* ]]; then + inherit_nodes="$inherit_nodes $ndir1" + + if [[ $str != *"no_propagate"* ]]; then + inherit_nodes="$inherit_nodes $ndir2 $ndir3" + fi + fi + + for node in $allnodes; do + if [[ " $inherit_nodes " == *" $node "* ]]; then + log_mustnot chgusr_exec $ZFS_ACL_OTHER1 $LS -vd $node \ + > /dev/null 2>&1 + else + log_must chgusr_exec $ZFS_ACL_OTHER1 $LS -vd $node \ + > /dev/null 2>&1 + fi + done +} + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + for obj in "${object_flag[@]}"; do + for str in "${strategy_flag[@]}"; do + typeset inh_opt=$obj + (( ${#str} != 0 )) && inh_opt=$inh_opt/$str + aclspec="A+user:$ZFS_ACL_OTHER1:read_acl:$inh_opt:deny" + + log_must usr_exec $MKDIR $basedir + log_must usr_exec $TOUCH $basefile + log_must usr_exec $MKDIR -p $odir3 + log_must usr_exec $TOUCH $ofile1 $ofile2 $ofile3 + + # + # Inherit flag can only be placed on a directory, + # otherwise it will fail. + # + log_must usr_exec $CHMOD $aclspec $basefile + + # + # Place on a directory should succeed. + # + log_must usr_exec $CHMOD $aclspec $basedir + + verify_inherit $obj $str + + log_must usr_exec $RM -rf $basefile $basedir + done + done +done + +log_pass "Verify chmod inherit behaviour passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_002_neg.ksh new file mode 100644 index 0000000000..0b675786f7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_002_neg.ksh @@ -0,0 +1,339 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify chmod have correct behaviour to directory and file not inherited +# when filesystem has the different aclinherit setting +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Separately chmod basedir with different inherite options, +# combine with the variable setting of aclinherit: +# "discard", "noallow", "restricted" or "passthrough". +# 4. Then create nested directories and files like the following. +# +# ofile +# odir +# chmod --> basedir -| +# |_ nfile1 +# |_ ndir1 _ +# |_ nfile2 +# |_ ndir2 _ +# |_ nfile3 +# |_ ndir3 +# +# 5. Verify non-inherited directories and files have the correct access +# control capability. +# + +verify_runnable "both" + +function cleanup +{ + typeset dir + + # Cleanup basedir, compared file and dir. + + if [[ -f $ofile ]]; then + log_must $RM -f $ofile + fi + + for dir in $odir $basedir ; do + if [[ -d $dir ]]; then + log_must $RM -rf $dir + fi + done + log_must $ZFS set aclmode=discard $TESTPOOL/$TESTFS +} + +log_assert "Verify chmod have correct behaviour to directory and file when " \ + "filesystem has the different aclinherit setting." +log_onexit cleanup + +# Define inherit flag +typeset aclinherit_flag=(discard noallow restricted passthrough) +typeset object_flag=(file_inherit dir_inherit file_inherit/dir_inherit) +typeset strategy_flag=("" inherit_only no_propagate inherit_only/no_propagate) + +typeset ace_prefix1="user:$ZFS_ACL_OTHER1" +typeset ace_prefix2="user:$ZFS_ACL_OTHER2" +typeset ace_discard ace_noallow ace_secure ace_passthrough +typeset ace_secure_new + +# Defile the based directory and file +basedir=$TESTDIR/basedir; ofile=$TESTDIR/ofile; odir=$TESTDIR/odir + +# Define the files and directories will be created after chmod +ndir1=$basedir/ndir1; ndir2=$ndir1/ndir2; ndir3=$ndir2/ndir3 +nfile1=$basedir/nfile1; nfile2=$ndir1/nfile2; nfile3=$ndir2/nfile3 + +# Verify all the node have expected correct access control +allnodes="$ndir1 $ndir2 $ndir3 $nfile1 $nfile2 $nfile3" + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_inherit #<aclinherit> <object> [strategy] +{ + # Define the nodes which will be affected by inherit. + typeset non_inherit_nodes="" + typeset inherit=$1 + typeset obj=$2 + typeset str=$3 + typeset inherit_type + typeset str1="/inherit_only/inherited:" + typeset str2="/inherited:" + + # count: the ACE item to fetch + # maxnumber: predefine as 4 + # passcnt: counter, if it achieves to maxnumber, + # then no additional ACE should apply. + # isinherit: indicate if the current target is in the inherit list. + + typeset -i count=0 pass=0 passcnt=0 isinherit=0 maxnumber=4 no_propagate=0 + + log_must usr_exec $MKDIR -p $ndir3 + log_must usr_exec $TOUCH $nfile1 $nfile2 $nfile3 + + # Get the inherit type/object_flag and non-inherited nodes. + if [[ $obj == *"file_inherit"* && $obj == *"dir_inherit"* ]]; then + inherit_type="both" + if [[ $str == *"no_propagate"* ]]; then + non_inherit_nodes= $ndir2 $ndir3 $nfile2 $nfile3 + no_propagate=1 + fi + elif [[ $obj == *"dir_inherit"* ]]; then + inherit_type="directory" + non_inherit_nodes="$nfile1 $nfile2 $nfile3" + if [[ $str == *"no_propagate"* ]]; then + non_inherit_nodes="$non_inherit_nodes $ndir2 $ndir3" + no_propagate=1 + fi + else + inherit_type="file" + non_inherit_nodes="$ndir1 $ndir2 $ndir3" + if [[ $str == *"no_propagate"* ]]; then + non_inherit_nodes="$non_inherit_nodes $nfile2 $nfile3" + no_propagate=1 + fi + fi + # Verify ACE's for all the dirs/files under $basedir + for node in $allnodes; do + if [[ " $non_inherit_nodes " == *" $node "* ]]; then + no_inherit=1 + else + no_inherit=0 + fi + i=0 + count=0 + passcnt=0 + while ((i < maxnumber)); do + pass=0 + eval expect1=\$acl$i + case $inherit in + noallow) + [[ $expect1 == *":allow" ]] && pass=1 + ;; + discard) + passcnt=maxnumber + break + ;; + esac + if ((pass == 0 && no_inherit == 1)); then + aclaction=${expect1##*:} + acltemp=${expect1%:*} + # Verify ACE's for sub-directory + if [[ -d $node ]]; then + eval expect1=\$acl$i + acltemp=${expect1%:*} + if [[ $inherit_type == "directory" || \ + $inherit_type == "both" ]]; then + expect1=${acltemp}/inherited: + expect1=${expect1}${aclaction} + elif [[ $inherit_type == "file" ]]; then + if [[ $expect1 != \ + *"inherit_only"* ]]; then + # + # directory should append + # "inherit_only" if not have + # + expect1=${acltemp}${str1} + expect1=${expect1}${aclaction} + else + expect1=${acltemp}${str2} + expect1=${expect1}${aclaction} + fi + fi + aclcur=$(get_ACE $node $count) + aclcur=${aclcur#$count:} + if [[ $no_propagate == 0 ]]; then + if [[ $expect1 != $aclcur ]]; then + $LS -vd $basedir + $LS -vd $node + log_fail "$inherit $i #"\ + "$count ACE: $aclcur"\ + "expect to be $expect1" + fi + else + # compare if directory has basic + # ACL's + compare_acls $node $odir + if [[ $? -ne 0 ]]; then + $LS -vd $basedir + $LS -vd $node + log_fail "Unexpect acl:"\ + " $node, $inherit" + "($str)" + fi + fi + # Verify ACE's for nested file + elif [[ -f $node ]]; then + compare_acls $node $ofile + if [[ $? -ne 0 ]]; then + $LS -vd $basedir + $LS -vd $node + log_fail "Unexpect acl: $node," \ + "$inherit ($str)" + fi + + fi + ((count = count + 1)) + fi + ((i = i + 1)) + done + + # + # If there's no any ACE be checked, it should be identify as + # an normal file/dir, verify it. + # + + if ((passcnt == maxnumber)); then + if [[ -d $node ]]; then + compare_acls $node $odir + elif [[ -f $node ]]; then + compare_acls $node $ofile + fi + + if [[ $? -ne 0 ]]; then + $LS -vd $basedir + $LS -vd $node + log_fail "Unexpect acl: $node, $inherit ($str)" + fi + fi + done +} + +typeset -i i=0 +typeset acl0 acl1 acl2 acl3 +typeset acls0 acls1 acls2 acls3 + +# +# Set aclmode=passthrough to make sure +# the acl will not change during chmod. +# A general testing should verify the combination of +# aclmode/aclinherit works well, +# here we just simple test them separately. +# + +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS + +for inherit in "${aclinherit_flag[@]}"; do + + # + # Set different value of aclinherit + # + + log_must $ZFS set aclinherit=$inherit $TESTPOOL/$TESTFS + + for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + for obj in "${object_flag[@]}"; do + for str in "${strategy_flag[@]}"; do + typeset inh_opt=$obj + ((${#str} != 0)) && inh_opt=$inh_opt/$str + + # + # Prepare 4 ACES, which should include : + # deny -> to verify "noallow" + # write_acl/write_owner -> to verify "secure" + # + + acl0=${ace_prefix1}":read_xattr/write_acl/" + acl0=${acl0}"write_owner:"${inh_opt}":deny" + acl1="$ace_prefix2:read_xattr/write_acl/" + acl1=${acl1}"write_owner:$inh_opt:allow" + acl2="$ace_prefix1:read_xattr:$inh_opt:deny" + acl3="$ace_prefix2:read_xattr:$inh_opt:allow" + + # + # The ACE filtered by write_acl/write_owner + # + + acls0="$ace_prefix1:read_xattr:$inh_opt:deny" + acls1="$ace_prefix2:read_xattr:$inh_opt:allow" + acls2=$acl2 + acls3=$acl3 + # + # Create basedir and tmp dir/file + # for comparison. + # + log_note "$user: $CHMOD $acl $basedir" + log_must usr_exec $MKDIR $basedir + log_must usr_exec $MKDIR $odir + log_must usr_exec $TOUCH $ofile + + i=3 + while ((i >= 0)); do + eval acl=\$acl$i + + # + # Place on a directory should succeed. + # + log_must usr_exec $CHMOD A+$acl $basedir + + ((i = i - 1)) + done + log_note "verify_inherit $inherit $obj $str" + log_must verify_inherit $inherit $obj $str + + log_must usr_exec $RM -rf $ofile $odir $basedir + done + done + done +done + +log_pass "Verify chmod inherit behaviour co-op with aclinherit setting passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_002_pos.ksh new file mode 100644 index 0000000000..6e9a7f07ed --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_002_pos.ksh @@ -0,0 +1,357 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify chmod have correct behaviour to directory and file when +# filesystem has the different aclinherit setting +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Separately chmod basedir with different inherite options, +# combine with the variable setting of aclinherit: +# "discard", "noallow", "restricted" or "passthrough". +# 4. Then create nested directories and files like the following. +# +# ofile +# odir +# chmod --> basedir -| +# |_ nfile1 +# |_ ndir1 _ +# |_ nfile2 +# |_ ndir2 _ +# |_ nfile3 +# |_ ndir3 +# +# 5. Verify each directories and files have the correct access control +# capability. +# + +verify_runnable "both" + +function cleanup +{ + typeset dir + + # Cleanup basedir, compared file and dir. + + if [[ -f $ofile ]]; then + log_must $RM -f $ofile + fi + + for dir in $odir $basedir ; do + if [[ -d $dir ]]; then + log_must $RM -rf $dir + fi + done + log_must $ZFS set aclmode=discard $TESTPOOL/$TESTFS +} + +log_assert "Verify chmod have correct behaviour to directory and file when " \ + "filesystem has the different aclinherit setting." +log_onexit cleanup + +# Define inherit flag +typeset aclinherit_flag=(discard noallow restricted passthrough) +typeset object_flag=(file_inherit dir_inherit file_inherit/dir_inherit) +typeset strategy_flag=("" inherit_only no_propagate inherit_only/no_propagate) + +typeset ace_prefix1="user:$ZFS_ACL_OTHER1" +typeset ace_prefix2="user:$ZFS_ACL_OTHER2" + +# Defile the based directory and file +basedir=$TESTDIR/basedir; ofile=$TESTDIR/ofile; odir=$TESTDIR/odir + +# Define the files and directories will be created after chmod +ndir1=$basedir/ndir1; ndir2=$ndir1/ndir2; ndir3=$ndir2/ndir3 +nfile1=$basedir/nfile1; nfile2=$ndir1/nfile2; nfile3=$ndir2/nfile3 + +# Verify all the node have expected correct access control +allnodes="$ndir1 $ndir2 $ndir3 $nfile1 $nfile2 $nfile3" + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_inherit #<aclinherit> <object> [strategy] +{ + # Define the nodes which will be affected by inherit. + typeset inherit_nodes + typeset inherit=$1 + typeset obj=$2 + typeset str=$3 + typeset str1="/inherited:" + + # count: the ACE item to fetch + # pass: to mark if the current ACE should apply to the target + # maxnumber: predefine as 4 + # passcnt: counter, if it achieves to maxnumber, + # then no additional ACE should apply. + # isinherit: indicate if the current target is in the inherit list. + + typeset -i count=0 pass=0 passcnt=0 isinherit=0 maxnumber=4 + + log_must usr_exec $MKDIR -p $ndir3 + log_must usr_exec $TOUCH $nfile1 $nfile2 $nfile3 + + # Get the files which inherited ACE. + if [[ $obj == *"file_inherit"* ]]; then + inherit_nodes="$inherit_nodes $nfile1" + + if [[ $str != *"no_propagate"* ]]; then + inherit_nodes="$inherit_nodes $nfile2 $nfile3" + fi + fi + # Get the directores which inherited ACE. + if [[ $obj == *"dir_inherit"* ]]; then + inherit_nodes="$inherit_nodes $ndir1" + + if [[ $str != *"no_propagate"* ]]; then + inherit_nodes="$inherit_nodes $ndir2 $ndir3" + fi + fi + + for node in $allnodes; do + if [[ " $inherit_nodes " == *" $node "* ]]; then + isinherit=1 + else + isinherit=0 + fi + + i=0 + count=0 + passcnt=0 + while ((i < maxnumber)); do + pass=0 + eval expect1=\$acl$i + + # + # aclinherit=passthrough, + # inherit all inheritable ACL entries without any + # modifications made to the ACL entries when they + # are inherited. + # + # aclinherit=restricted, + # any inheritable ACL entries will remove + # write_acl and write_owner permissions when the ACL entry is + # inherited. + # + # aclinherit=noallow, + # only inherit inheritable ACE that specify "deny" permissions + # + # aclinherit=discard + # will not inherit any ACL entries + # + + case $inherit in + passthrough) + ;; + restricted) + [[ $expect1 == *":allow" ]] && \ + eval expect1=\$acls$i + ;; + noallow) + if [[ $expect1 == *":allow" ]]; then + pass=1 + ((passcnt = passcnt + 1)) + fi + ;; + discard) + passcnt=maxnumber + break + ;; + esac + propagate=0 + # verify ACE's only for inherited nodes + if ((pass == 0 && isinherit == 1)); then + aclaction=${expect1##*:} + + if [[ $expect1 == *"propagate"* ]]; then + # strip strategy flags from the expect + # value + acltemp=${expect1%/*} + expect1=${acltemp} + propagate=1 + fi + acltemp=${expect1%:*} + if [[ -d $node ]]; then + if [[ $expect1 == *"inherit_only"* \ + && $propagate == 0 ]]; then + # prepare expect value for + # "inherit_only" nodes + acltemp_subdir=${expect1%/*} + expect1=${acltemp_subdir}${str1} + expect1=${expect1}${aclaction} + + elif [[ $propagate == 1 ]]; then + # prepare expect value for + # "propagate" nodes + expect1=${acltemp}:inherited: + expect1=${expect1}${aclaction} + + else + # prepare expect value for nodes + # with no starategy flags + expect1=${acltemp}${str1} + expect1=${expect1}${aclaction} + fi + + elif [[ -f $node ]]; then + acltemp_subfile=${expect1%file*} + expect1=${acltemp_subfile}inherited: + expect1=${expect1}${aclaction} + fi + + # Get the first ACE to do comparison + + aclcur=$(get_ACE $node $count) + aclcur=${aclcur#$count:} + if [[ -n $expect1 && $expect1 != $aclcur ]]; then + $LS -vd $basedir + $LS -vd $node + log_fail "$inherit $i #$count " \ + "ACE: $aclcur, expect to be " \ + "$expect1" + fi + + ((count = count + 1)) + fi + ((i = i + 1)) + done + + # + # If there's no any ACE be checked, it should be identify as + # an normal file/dir, verify it. + # + + if ((passcnt == maxnumber)); then + if [[ -d $node ]]; then + compare_acls $node $odir + elif [[ -f $node ]]; then + compare_acls $node $ofile + fi + + if [[ $? -ne 0 ]]; then + $LS -vd $basedir + $LS -vd $node + log_fail "Unexpect acl: $node, $inherit ($str)" + fi + fi + done +} + +typeset -i i=0 +typeset acl0 acl1 acl2 acl3 +typeset acls0 acls1 acls2 acls3 + +# +# Set aclmode=passthrough to make sure +# the acl will not change during chmod. +# A general testing should verify the combination of +# aclmode/aclinherit works well, +# here we just simple test them separately. +# + +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS + +for inherit in "${aclinherit_flag[@]}"; do + + # + # Set different value of aclinherit + # + + log_must $ZFS set aclinherit=$inherit $TESTPOOL/$TESTFS + + for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + for obj in "${object_flag[@]}"; do + for str in "${strategy_flag[@]}"; do + typeset inh_opt=$obj + ((${#str} != 0)) && inh_opt=$inh_opt/$str + + # + # Prepare 4 ACES, which should include : + # deny -> to verify "noallow" + # write_acl/write_owner -> to verify "restricted" + # + + acl0=${ace_prefix1}":read_xattr/write_acl" + acl0=${acl0}"/write_owner:$inh_opt:deny" + acl1=${ace_prefix2}":read_xattr/write_acl/" + acl1=${acl1}"write_owner:$inh_opt:allow" + acl2="$ace_prefix1:read_xattr:$inh_opt:deny" + acl3="$ace_prefix2:read_xattr:$inh_opt:allow" + + # + # The ACE filtered by write_acl/write_owner + # + + acls0="$ace_prefix1:read_xattr:$inh_opt:deny" + acls1="$ace_prefix2:read_xattr:$inh_opt:allow" + acls2=$acl2 + acls3=$acl3 + + + # + # Create basedir and tmp dir/file + # for comparison. + # + + log_note "$user: $CHMOD $acl $basedir" + log_must usr_exec $MKDIR $basedir + log_must usr_exec $MKDIR $odir + log_must usr_exec $TOUCH $ofile + + i=3 + while ((i >= 0)); do + eval acl=\$acl$i + + # + # Place on a directory should succeed. + # + log_must usr_exec $CHMOD A+$acl $basedir + + ((i = i - 1)) + done + + verify_inherit $inherit $obj $str + + log_must usr_exec $RM -rf $ofile $odir $basedir + done + done + done +done + +log_pass "Verify chmod inherit behaviour co-op with aclinherit setting passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_003_pos.ksh new file mode 100644 index 0000000000..bea5dadd2b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_003_pos.ksh @@ -0,0 +1,406 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify chmod have correct behaviour to directory and file when +# filesystem has the different aclinherit setting +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Separately chmod basedir with different inherite options, +# combine with the variable setting of aclinherit: +# "discard", "noallow", "secure" or "passthrough". +# 4. Then create nested directories and files like the following. +# +# ofile +# odir +# chmod --> basedir -| +# |_ nfile1 +# |_ ndir1 _ +# |_ nfile2 +# |_ ndir2 _ +# |_ nfile3 +# |_ ndir3 +# +# 5. Verify each directories and files have the correct access control +# capability. +# + +verify_runnable "both" + +function cleanup +{ + typeset dir + + # Cleanup basedir, compared file and dir. + + if [[ -f $ofile ]]; then + log_must $RM -f $ofile + fi + + for dir in $odir $basedir ; do + if [[ -d $dir ]]; then + log_must $RM -rf $dir + fi + done +} + +log_assert "Verify chmod have correct behaviour to directory and file when " \ + "filesystem has the different aclinherit setting." +log_onexit cleanup + +# Define inherit flag +typeset aclinherit_flag=(discard noallow secure passthrough) +typeset object_flag=("f-" "-d" "fd") +typeset strategy_flag=("--" "i-" "-n" "in") + +typeset ace_prefix1="owner@" +typeset ace_prefix2="group@" +typeset ace_prefix3="everyone@" +typeset ace_discard ace_noallow ace_secure ace_passthrough +typeset ace_secure_new + +# Defile the based directory and file +basedir=$TESTDIR/basedir; ofile=$TESTDIR/ofile; odir=$TESTDIR/odir + +# Define the files and directories will be created after chmod +ndir1=$basedir/ndir1; ndir2=$ndir1/ndir2; ndir3=$ndir2/ndir3 +nfile1=$basedir/nfile1; nfile2=$ndir1/nfile2; nfile3=$ndir2/nfile3 + +# Verify all the node have expected correct access control +allnodes="$ndir1 $ndir2 $ndir3 $nfile1 $nfile2 $nfile3" + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_inherit #<aclinherit> <object> [strategy] +{ + # Define the nodes which will be affected by inherit. + typeset inherit_nodes + typeset inherit=$1 + typeset obj=$2 + typeset str=$3 + + # count: the ACE item to fetch + # pass: to mark if the current ACE should apply to the target + # maxnumber: predefine as 4 + # passcnt: counter, if it achieves to maxnumber, + # then no additional ACE should apply. + # isinherit: indicate if the current target is in the inherit list. + # step: indicate if the ACE be split during inherit. + + typeset -i count=0 pass=0 passcnt=0 isinherit=0 maxnumber=4 step=0 + + log_must usr_exec $MKDIR -p $ndir3 + log_must usr_exec $TOUCH $nfile1 $nfile2 $nfile3 + + # Get the files which inherited ACE. + if [[ $(get_substr $obj 1 1) == f ]]; then + inherit_nodes="$inherit_nodes $nfile1" + + if [[ $(get_substr $str 2 1) != n ]]; then + inherit_nodes="$inherit_nodes $nfile2 $nfile3" + fi + fi + # Get the directores which inherited ACE. + if [[ $(get_substr $obj 2 1) == d ]]; then + inherit_nodes="$inherit_nodes $ndir1" + + if [[ $(get_substr $str 2 1) != n ]]; then + inherit_nodes="$inherit_nodes $ndir2 $ndir3" + fi + fi + + for node in $allnodes; do + step=0 + if [[ " $inherit_nodes " == *" $node "* ]]; then + isinherit=1 + if [[ -d $node ]] ; then + step=1 + fi + else + isinherit=0 + fi + + i=0 + count=0 + passcnt=0 + while ((i < maxnumber)); do + pass=0 + eval expect1=\$acl$i + expect2=$expect1 + + # + # aclinherit=passthrough, + # inherit all inheritable ACL entries without any + # modifications made to the ACL entries when they + # are inherited. + # + # aclinherit=secure, + # any inheritable ACL entries will remove + # write_acl and write_owner permissions when the ACL entry is + # inherited. + # + # aclinherit=noallow, + # only inherit inheritable ACE that specify "deny" permissions + # + # aclinherit=discard + # will not inherit any ACL entries + # + + case $inherit in + passthrough) + action=${expect1##*:} + expect1=${expect1%:$action} + expect1=${expect1%-} + expect1=${expect1%I} + expect1=${expect1}I:$action + ;; + secure) + eval expect2=\$acls$i + ;; + noallow) + if [[ $expect1 == *":allow" ]] ; then + pass=1 + ((passcnt = passcnt + 1)) + else + eval expect2=\$acls$i + fi + ;; + discard) + passcnt=maxnumber + break + ;; + esac + + if ((pass == 0)) ; then + acltemp=${expect2%:*} + acltemp=${acltemp%:*} + aclaction=${expect2##*:} + expect2=${acltemp}:------I:${aclaction} + + acltemp=${expect1%:*} + inh=${acltemp##*:} + + if [[ -d $node ]]; then + if [[ $(get_substr $inh 4 1) == n ]]; then + + # + # if no_propagate is set, + # then clear all inherit flags, + # only one ACE should left. + # + + step=0 + expect1="" + + elif [[ $(get_substr $inh 3 1) != i ]]; then + + # + # directory should append + # "inherit_only" if not have + # + acltemp=${acltemp%i*} + expect1=${acltemp}i---I:${aclaction} + else + acltemp=${acltemp%-} + acltemp=${acltemp%I} + expect1=${acltemp}I:${aclaction} + fi + + # + # cleanup the first ACE if the directory + # not in inherit list + # + + if ((isinherit == 0)); then + expect1="" + fi + elif [[ -f $node ]] ; then + expect1="" + fi + + # Get the first ACE to do comparison + + aclcur=$(get_ACE $node $count compact) + aclcur=${aclcur#$count:} + if [[ -n $expect1 && $expect1 != $aclcur ]]; then + $LS -Vd $basedir + $LS -Vd $node + log_fail "$inherit $i #$count " \ + "ACE: $aclcur, expect to be " \ + "$expect1" + fi + + # + # Get the second ACE (if should have) to do + # comparison + # + if ((step > 0)); then + ((count = count + step)) + + aclcur=$(get_ACE $node $count compact) + aclcur=${aclcur#$count:} + if [[ -n $expect2 && \ + $expect2 != $aclcur ]]; then + + $LS -Vd $basedir + $LS -Vd $node + log_fail "$inherit $i " \ + "#$count ACE: $aclcur, " \ + "expect to be $expect2" + fi + fi + ((count = count + 1)) + fi + ((i = i + 1)) + done + + # + # If there's no any ACE be checked, it should be identify as + # an normal file/dir, verify it. + # + + if ((passcnt == maxnumber)); then + if [[ -d $node ]]; then + compare_acls $node $odir + elif [[ -f $node ]]; then + compare_acls $node $ofile + fi + + if [[ $? -ne 0 ]]; then + $LS -Vd $basedir + $LS -Vd $node + log_fail "Unexpect acl: $node, $inherit ($str)" + fi + fi + done +} + +typeset -i i=0 +typeset acl0 acl1 acl2 acl3 +typeset acls0 acls1 acls2 acls3 + +# +# Set aclmode=passthrough to make sure +# the acl will not change during chmod. +# A general testing should verify the combination of +# aclmode/aclinherit works well, +# here we just simple test them separately. +# + +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS + +for inherit in "${aclinherit_flag[@]}"; do + + # + # Set different value of aclinherit + # + + log_must $ZFS set aclinherit=$inherit $TESTPOOL/$TESTFS + + for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + for obj in "${object_flag[@]}"; do + for str in "${strategy_flag[@]}"; do + typeset inh_opt=$obj + ((${#str} != 0)) && inh_opt=${inh_opt}${str}-- + + inh_a=${inh_opt}- + inh_b=${inh_opt}I + + # + # Prepare 4 ACES, which should include : + # deny -> to verify "noallow" + # write_acl/write_owner -> to verify "secure" + # + + acl0="$ace_prefix1:rwxp---A-W-Co-:${inh_a}:allow" + acl1="$ace_prefix2:rwxp---A-W-Co-:${inh_a}:deny" + acl2="$ace_prefix3:rwxp---A-W-Co-:${inh_a}:allow" + acl3="$ace_prefix1:-------A-W----:${inh_a}:deny" + acl4="$ace_prefix2:-------A-W----:${inh_a}:allow" + acl5="$ace_prefix3:-------A-W----:${inh_a}:deny" + + + # + # The ACE filtered by write_acl/write_owner + # + + if [[ $inheri == "passthrough" ]]; then + acls0="$ace_prefix1:rwxp---A-W----:${inh_b}:allow" + acls1="$ace_prefix2:rwxp---A-W----:${inh_b}:deny" + acls2="$ace_prefix3:rwxp---A-W----:${inh_b}:allow" + acls3="$ace_prefix1:rwxp---A-W----:${inh_b}:deny" + acls4="$ace_prefix2:rwxp---A-W----:${inh_b}:allow" + acls5="$ace_prefix3:rwxp---A-W----:${inh_b}:deny" + else + acls0="$ace_prefix1:-------A-W----:${inh_b}:allow" + acls1="$ace_prefix2:-------A-W-Co-:${inh_b}:deny" + acls2="$ace_prefix3:-------A-W----:${inh_b}:allow" + acls3="$ace_prefix1:-------A-W----:${inh_b}:deny" + acls4="$ace_prefix2:-------A-W----:${inh_b}:allow" + acls5="$ace_prefix3:-------A-W----:${inh_b}:deny" + fi + + # + # Create basedir and tmp dir/file + # for comparison. + # + + log_note "$user: $CHMOD $acl $basedir" + log_must usr_exec $MKDIR $basedir + log_must usr_exec $MKDIR $odir + log_must usr_exec $TOUCH $ofile + + i=5 + while ((i >= 0)); do + eval acl=\$acl$i + + # + # Place on a directory should succeed. + # + log_must usr_exec $CHMOD A+$acl $basedir + + ((i = i - 1)) + done + + verify_inherit $inherit $obj $str + + log_must usr_exec $RM -rf $ofile $odir $basedir + done + done + done +done + +log_pass "Verify chmod inherit behaviour co-op with aclinherit setting passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_004_pos.ksh new file mode 100644 index 0000000000..0ecf85eccb --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_inherit_004_pos.ksh @@ -0,0 +1,149 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify aclinherit=passthrough-x will inherit the 'x' bits while mode request. +# +# STRATEGY: +# 1. Loop super user and non-super user to run the test case. +# 2. Create basedir and a set of subdirectores and files within it. +# 3. Set aclinherit=passthrough-x +# 4. Verify only passthrough-x will inherit the 'x' bits while mode request. +# + +verify_runnable "both" + +function cleanup +{ + if [[ -d $basedir ]]; then + log_must $RM -rf $basedir + fi +} +$ZPOOL upgrade -v +$ZPOOL upgrade -v | $GREP "passthrough-x aclinherit" > /dev/null 2>&1 +if (($? != 0)); then + log_unsupported "passthrough-x aclinherit not supported." +fi + +log_assert "Verify aclinherit=passthrough-x will inherit the 'x' bits while" \ + " mode request." +log_onexit cleanup + +set -A aces \ + "owner@:read_data/write_data/add_subdirectory/append_data/execute:dir_inherit/inherit_only:allow" \ + "owner@:read_data/write_data/add_subdirectory/append_data/execute::allow" \ + "group@:add_subdirectory/append_data/execute:dir_inherit/inherit_only:allow" \ + "group@:add_subdirectory/append_data/execute::allow" \ + "everyone@:add_subdirectory/append_data/execute:dir_inherit/inherit_only:allow" \ + "everyone@:add_subdirectory/append_data/execute::allow" \ + "owner@:read_data/write_data/add_subdirectory/append_data/execute:file_inherit/inherit_only:allow" \ + "group@:read_data/add_subdirectory/append_data/execute:file_inherit/inherit_only:allow" \ + "everyone@:read_data/add_subdirectory/append_data/execute:file_inherit/inherit_only:allow" + +# Defile the based directory and file +basedir=$TESTDIR/basedir + + +# +# According to inherited flag, verify subdirectories and files within it has +# correct inherited access control. +# +function verify_inherit # <object> +{ + typeset obj=$1 + + # Define the files and directories will be created after chmod + ndir1=$obj/ndir1; ndir2=$ndir1/ndir2 + nfile1=$ndir1/nfile1.c; nfile2=$ndir1/nfile2 + + log_must usr_exec $MKDIR -p $ndir1 + + typeset -i i=0 + while ((i < ${#aces[*]})); do + if ((i < 3)); then + log_must usr_exec $CHMOD A$i=${aces[i]} $ndir1 + else + log_must usr_exec $CHMOD A$i+${aces[i]} $ndir1 + fi + ((i = i + 1)) + done + log_must usr_exec $MKDIR -p $ndir2 + log_must usr_exec $TOUCH $nfile1 + + $CAT > $nfile1 <<EOF +#include <stdlib.h> +#include <stdio.h> +int main() +{ return 0; } +EOF + + mode=$(get_mode $ndir2) + if [[ $mode != "drwx--x--x"* ]]; then + log_fail "Unexpect mode of $ndir2, expect: drwx--x--x, current: $mode" + fi + + mode=$(get_mode $nfile1) + if [[ $mode != "-rw-r--r--"* ]]; then + log_fail "Unexpect mode of $nfile1, expect: -rw-r--r--, current: $mode" + fi + + if [[ -x /usr/sfw/bin/gcc ]]; then + log_must /usr/sfw/bin/gcc -o $nfile2 $nfile1 + mode=$(get_mode $nfile2) + if [[ $mode != "-rwxr-xr-x"* ]]; then + log_fail "Unexpect mode of $nfile2, expect: -rwxr-xr-x, current: $mode" + fi + fi +} + +# +# Set aclmode=passthrough to make sure +# the acl will not change during chmod. +# A general testing should verify the combination of +# aclmode/aclinherit works well, +# here we just simple test them separately. +# + +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS +log_must $ZFS set aclinherit=passthrough-x $TESTPOOL/$TESTFS + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + verify_inherit $basedir + + cleanup +done + +log_pass "Verify aclinherit=passthrough-x will inherit the 'x' bits while mode request." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_owner_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_owner_001_pos.ksh new file mode 100644 index 0000000000..b59cc0c2c8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_owner_001_pos.ksh @@ -0,0 +1,324 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that the write_owner for +# owner/group/everyone are correct. +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special write_owner ACE to the file and directory +# 3. Try to chown/chgrp of the file and directory to take owner/group +# 4. Verify that the owner/group are correct. Follow these rules: +# (1) If uid is granted the write_owner permission, then it can only do +# chown to its own uid, or a group that they are a member of. +# (2) Owner will ignore permission of (1) even write_owner not granted. +# (3) Superuser will always permit whatever they do. +# + +verify_runnable "both" + +function cleanup +{ + [[ -d $basedir ]] && $RM -rf $basedir + [[ -f $TESTDIR/$ARCHIVEFILE ]] && log_must $RM -f $TESTDIR/$ARCHIVEFILE + return 0 +} + +log_assert "Verify that the chown/chgrp could take owner/group " \ + "while permission is granted." +log_onexit cleanup + +# +# Get the owner of a file/directory +# +function get_owner +{ + typeset node=$1 + + if [[ -z $node ]]; then + log_fail "node are not defined." + fi + + $ECHO $($LS -dl $node | $AWK '{print $3}') +} + +# +# Get the group of a file/directory +# +function get_group +{ + typeset node=$1 + + if [[ -z $node ]]; then + log_fail "node are not defined." + fi + + $ECHO $($LS -dl $node | $AWK '{print $4}') +} + + +# +# Get the group name that a UID belongs to +# +function get_user_group +{ + typeset uid=$1 + typeset value + + if [[ -z $uid ]]; then + log_fail "UID not defined." + fi + + value=$(id $uid) + + if [[ $? -eq 0 ]]; then + value=${value##*\(} + value=${value%%\)*} + $ECHO $value + else + log_fail "Invalid UID (uid)." + fi +} + +function operate_node_owner +{ + typeset user=$1 + typeset node=$2 + typeset old_owner=$3 + typeset expect_owner=$4 + typeset ret new_owner + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + + $SU $user -c "$CHOWN $expect_owner $node" + ret=$? + new_owner=$(get_owner $node) + + if [[ $new_owner != $old_owner ]]; then + $TAR xpf $TESTDIR/$ARCHIVEFILE + fi + + if [[ $ret -eq 0 ]]; then + if [[ $new_owner != $expect_owner ]]; then + log_note "Owner not changed as expected " \ + "($old_owner|$new_owner|$expect_owner), " \ + "but return code is $ret." + return 1 + fi + elif [[ $ret -ne 0 && $new_owner != $old_owner ]]; then + log_note "Owner changed ($old_owner|$new_owner), " \ + "but return code is $ret." + return 2 + fi + + return $ret +} + +function operate_node_group +{ + typeset user=$1 + typeset node=$2 + typeset old_group=$3 + typeset expect_group=$4 + typeset ret new_group + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + + $SU $user -c "$CHGRP $expect_group $node" + ret=$? + new_group=$(get_group $node) + + if [[ $new_group != $old_group ]]; then + $TAR xpf $TESTDIR/$ARCHIVEFILE + fi + + if [[ $ret -eq 0 ]]; then + if [[ $new_group != $expect_group ]]; then + log_note "Group not changed as expected " \ + "($old_group|$new_group|$expect_group), " \ + "but return code is $ret." + return 1 + fi + elif [[ $ret -ne 0 && $new_group != $old_group ]]; then + log_note "Group changed ($old_group|$new_group), " \ + "but return code is $ret." + return 2 + fi + + return $ret +} + +function logname +{ + typeset acl_target=$1 + typeset user=$2 + typeset old=$3 + typeset new=$4 + typeset ret="log_mustnot" + + # To super user, read and write deny permission was override. + if [[ $user == root ]]; then + ret="log_must" + elif [[ $user == $new ]] ; then + if [[ $user == $old || $acl_target == *:allow ]]; then + ret="log_must" + fi + fi + + print $ret +} + +function check_chmod_results +{ + typeset user=$1 + typeset node=$2 + typeset flag=$3 + typeset acl_target=$3:$4 + typeset g_usr=$5 + typeset o_usr=$6 + typeset log old_owner old_group new_owner new_group + + old_owner=$(get_owner $node) + old_group=$(get_group $node) + + if [[ $flag == "owner@" || $flag == "everyone@" ]]; then + for new_owner in $user "nobody"; do + new_group=$(get_user_group $new_owner) + + log=$(logname $acl_target $user \ + $old_owner $new_owner) + + $log operate_node_owner $user $node \ + $old_owner $new_owner + + $log operate_node_group $user $node \ + $old_group $new_group + done + fi + if [[ $flag == "group@" || $flag == "everyone@" ]]; then + for new_owner in $g_usr "nobody"; do + new_group=$(get_user_group $new_owner) + + log=$(logname $acl_target $g_usr $old_owner \ + $new_owner) + + $log operate_node_owner $g_usr $node \ + $old_owner $new_owner + + $log operate_node_group $g_usr \ + $node $old_group $new_group + done + fi + if [[ $flag == "everyone@" ]]; then + for new_owner in $g_usr "nobody"; do + new_group=$(get_user_group $new_owner) + + log=$(logname $acl_target $o_usr $old_owner \ + $new_owner) + + $log operate_node_owner $o_usr $node \ + $old_owner $new_owner + + $log operate_node_group $o_usr $node \ + $old_group $new_group + done + fi +} + +function test_chmod_basic_access +{ + typeset user=$1 + typeset node=${2%/} + typeset g_usr=$3 + typeset o_usr=$4 + typeset flag acl_t + + for flag in $a_flag; do + for acl_t in $a_access; do + log_must $SU $user -c "$CHMOD A+$flag:$acl_t $node" + + $TAR cpf $TESTDIR/$ARCHIVEFILE basedir + + check_chmod_results $user $node $flag $acl_t $g_usr \ + $o_usr + + log_must $SU $user -c "$CHMOD A0- $node" + done + done +} + +function setup_test_files +{ + typeset base_node=$1 + typeset user=$2 + typeset group=$3 + + $RM -rf $base_node + + log_must $MKDIR -p $base_node + log_must $CHOWN $user:$group $base_node + + # Prepare all files/sub-dirs for testing. + log_must $SU $user -c "$TOUCH $file" + log_must $SU $user -c "$CHMOD 444 $file" + log_must $SU $user -c "$MKDIR -p $dir" + log_must $SU $user -c "$CHMOD 444 $dir" + log_must $SU $user -c "$CHMOD 555 $base_node" +} + +typeset ARCHIVEFILE=archive.tar +typeset a_access="write_owner:allow write_owner:deny" +typeset a_flag="owner@ group@ everyone@" +typeset basedir="$TESTDIR/basedir" +typeset file="$basedir/file" +typeset dir="$basedir/dir" + +cd $TESTDIR +setup_test_files $basedir 'root' 'root' +test_chmod_basic_access 'root' $file $ZFS_ACL_ADMIN $ZFS_ACL_OTHER1 +test_chmod_basic_access 'root' $dir $ZFS_ACL_ADMIN $ZFS_ACL_OTHER1 +$RM -rf $basedir + +setup_test_files $basedir $ZFS_ACL_STAFF1 $ZFS_ACL_STAFF_GROUP +test_chmod_basic_access $ZFS_ACL_STAFF1 $file $ZFS_ACL_STAFF2 $ZFS_ACL_OTHER1 +test_chmod_basic_access $ZFS_ACL_STAFF1 $dir $ZFS_ACL_STAFF2 $ZFS_ACL_OTHER1 +$RM -rf $basedir + +log_pass "Verify that the chown/chgrp could take owner/group " \ + "while permission is granted." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwacl_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwacl_001_pos.ksh new file mode 100644 index 0000000000..cd13c7d7de --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwacl_001_pos.ksh @@ -0,0 +1,242 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify assigned read_acl/write_acl to owner@/group@/everyone@, +# specificied user and group. File have the correct access permission. +# +# STRATEGY: +# 1. Separatedly verify file and directory was assigned read_acl/write_acl +# by root and non-root user. +# 2. Verify owner always can read and write acl, even deny. +# 3. Verify group access permission, when group was assigned +# read_acl/write_acl. +# 4. Verify access permission, after everyone was assigned read_acl/write. +# 5. Verify everyone@ was deny except specificied user, this user can read +# and write acl. +# 6. Verify the group was deny except specified user, this user can read +# and write acl +# + +verify_runnable "both" + +log_assert "Verify chmod A[number]{+|-|=} read_acl/write_acl have correct " \ + "behaviour to access permission." +log_onexit cleanup + +function read_ACL #<node> <user1> <user2> ... +{ + typeset node=$1 + typeset user + typeset -i ret + + shift + for user in $@; do + chgusr_exec $user $LS -vd $node > /dev/null 2>&1 + ret=$? + (( ret != 0 )) && return $ret + + shift + done + + return 0 +} + +function write_ACL #<node> <user1> <user2> ... +{ + typeset node=$1 + typeset user + typeset -i ret before_cnt after_cnt + + shift + for user in "$@"; do + before_cnt=$(count_ACE $node) + ret=$?; + (( ret != 0 )) && return $ret + + chgusr_exec $user $CHMOD A0+owner@:read_data:allow $node + ret=$? + (( ret != 0 )) && return $ret + + after_cnt=$(count_ACE $node) + ret=$? + (( ret != 0 )) && return $ret + + chgusr_exec $user $CHMOD A0- $node + ret=$? + (( ret != 0 )) && return $ret + + if (( after_cnt - before_cnt != 1 )); then + return 1 + fi + + shift + done + + return 0 +} + +function check_owner #<node> +{ + typeset node=$1 + + for acc in allow deny; do + log_must usr_exec \ + $CHMOD A0+owner@:read_acl/write_acl:$acc $node + log_must read_ACL $node $ZFS_ACL_CUR_USER + log_must write_ACL $node $ZFS_ACL_CUR_USER + log_must usr_exec $CHMOD A0- $node + done +} + +function check_group #<node> +{ + typeset node=$1 + + typeset grp_usr="" + if [[ $ZFS_ACL_CUR_USER == root ]]; then + grp_usr=$ZFS_ACL_ADMIN + elif [[ $ZFS_ACL_CUR_USER == $ZFS_ACL_STAFF1 ]]; then + grp_usr=$ZFS_ACL_STAFF2 + fi + + log_must usr_exec $CHMOD A0+group@:read_acl/write_acl:allow $node + log_must read_ACL $node $grp_usr + log_must write_ACL $node $grp_usr + log_must usr_exec $CHMOD A0- $node + + log_must usr_exec $CHMOD A0+group@:read_acl/write_acl:deny $node + log_mustnot read_ACL $node $grp_usr + log_mustnot write_ACL $node $grp_usr + log_must usr_exec $CHMOD A0- $node +} + +function check_everyone #<node> +{ + typeset node=$1 + + typeset flag + for flag in allow deny; do + if [[ $flag == allow ]]; then + log=log_must + else + log=log_mustnot + fi + + log_must usr_exec \ + $CHMOD A0+everyone@:read_acl/write_acl:$flag $node + + $log read_ACL $node $ZFS_ACL_OTHER1 $ZFS_ACL_OTHER2 + $log write_ACL $node $ZFS_ACL_OTHER1 $ZFS_ACL_OTHER2 + + log_must usr_exec $CHMOD A0- $node + done +} + +function check_spec_user #<node> +{ + typeset node=$1 + + log_must usr_exec $CHMOD A0+everyone@:read_acl/write_acl:deny $node + log_must usr_exec \ + $CHMOD A0+user:$ZFS_ACL_OTHER1:read_acl/write_acl:allow $node + + # The specified user can read and write acl + log_must read_ACL $node $ZFS_ACL_OTHER1 + log_must write_ACL $node $ZFS_ACL_OTHER1 + + # All the other user can't read and write acl + log_mustnot \ + read_ACL $node $ZFS_ACL_ADMIN $ZFS_ACL_STAFF2 $ZFS_ACL_OTHER2 + log_mustnot \ + write_ACL $node $ZFS_ACL_ADMIN $ZFS_ACL_STAFF2 $ZFS_ACL_OTHER2 + + log_must usr_exec $CHMOD A0- $node + log_must usr_exec $CHMOD A0- $node +} + +function check_spec_group #<node> +{ + typeset node=$1 + + log_must usr_exec $CHMOD A0+everyone@:read_acl/write_acl:deny $node + log_must usr_exec $CHMOD \ + A0+group:$ZFS_ACL_OTHER_GROUP:read_acl/write_acl:allow $node + + # The specified group can read and write acl + log_must read_ACL $node $ZFS_ACL_OTHER1 $ZFS_ACL_OTHER2 + log_must write_ACL $node $ZFS_ACL_OTHER1 $ZFS_ACL_OTHER2 + + # All the other user can't read and write acl + log_mustnot read_ACL $node $ZFS_ACL_ADMIN $ZFS_ACL_STAFF2 + log_mustnot write_ACL $node $ZFS_ACL_ADMIN $ZFS_ACL_STAFF2 +} + +function check_user_in_group #<node> +{ + typeset node=$1 + + log_must usr_exec $CHMOD \ + A0+group:$ZFS_ACL_OTHER_GROUP:read_acl/write_acl:deny $node + log_must usr_exec $CHMOD \ + A0+user:$ZFS_ACL_OTHER1:read_acl/write_acl:allow $node + log_must read_ACL $node $ZFS_ACL_OTHER1 + log_must write_ACL $node $ZFS_ACL_OTHER1 + log_mustnot read_ACL $node $ZFS_ACL_OTHER2 + log_mustnot write_ACL $node $ZFS_ACL_OTHER2 + + log_must usr_exec $CHMOD A0- $node + log_must usr_exec $CHMOD A0- $node +} + +set -A func_name check_owner \ + check_group \ + check_everyone \ + check_spec_user \ + check_spec_group \ + check_user_in_group + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir + + typeset func node + for func in ${func_name[@]}; do + for node in $testfile $testdir; do + eval $func \$node + done + done + + log_must usr_exec $RM -rf $testfile $testdir +done + +log_pass "Verify chmod A[number]{+|-|=} read_acl/write_acl passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_001_pos.ksh new file mode 100644 index 0000000000..557ce3c3ea --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_001_pos.ksh @@ -0,0 +1,125 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# chmod A{+|-|=} have the correct behaviour to the ACL list. +# +# STRATEGY: +# 1. loop check root and non-root users +# 2. chmod file or dir with specified options +# 3. get ACE after behaviours of chmod +# 4. compare specified ACE and expect ACE +# + +verify_runnable "both" + +log_assert "chmod A{+|-|=} have the correct behaviour to the ACL list." +log_onexit cleanup + +typeset -i trival_count=3 head=0 mid end +((mid = RANDOM % $trival_count)) +((end = trival_count - 1)) + +opts="+ - =" +nums="$head $mid $end" +set -A file_ACEs \ + "user:$ZFS_ACL_STAFF1:read_data:allow" \ + "user:$ZFS_ACL_STAFF2:write_data:allow" \ + "user:$ZFS_ACL_OTHER1:execute:allow" +set -A dir_ACEs \ + "user:$ZFS_ACL_STAFF1:list_directory/read_data:allow" \ + "user:$ZFS_ACL_STAFF2:add_file/write_data:allow" \ + "user:$ZFS_ACL_OTHER1:execute:allow" + +function test_chmod_ACE_list #$opt $num $ace-spec $node +{ + typeset opt=A$2$1 + typeset -i num=$2 + typeset ace=$3 + typeset node=$4 + typeset -i expect_count=0 + + # Get expect ACE count + case $opt in + A[0-9]*+) (( expect_count = trival_count + 1 )) ;; + A[0-9]*-) (( expect_count = trival_count - 1 )) ;; + A[0-9]*=) (( expect_count = trival_count )) ;; + *) log_fail "Error option: '$opt'" ;; + esac + + # Invoke chmod A[number]{+|-|=}<acl-specification> file|dir + if [[ $opt == A[0-9]*+ || $opt == A[0-9]*= ]]; then + log_must usr_exec $CHMOD "$opt$ace" "$node" + else + log_must usr_exec $CHMOD "$opt" "$node" + fi + + # Get the current ACE count and specified ACE + typeset cur_ace cur_count + cur_ace=$(get_ACE $node $num) + cur_count=$(count_ACE $node) + + # Compare with expected results + if [[ $opt == A[0-9]*+ || $opt == A[0-9]*= ]]; then + if [[ "$num:$ace" != "$cur_ace" ]]; then + log_fail "FAIL: $CHMOD $opt$ace $node" + fi + fi + if [[ "$expect_count" != "$cur_count" ]]; then + log_fail "FAIL: '$expect_count' != '$cur_count'" + fi +} + +for user in root $ZFS_ACL_STAFF1 $ZFS_ACL_OTHER1; do + log_must set_cur_usr $user + + for opt in $opts; do + for num in $nums; do + for ace in $file_ACEs; do + ls -l $TESTDIR + log_must usr_exec $TOUCH $testfile + test_chmod_ACE_list $opt $num $ace $testfile + log_must $RM -f $testfile + done + for ace in $dir_ACEs; do + ls -l $TESTDIR + log_must usr_exec $MKDIR -p $testdir + test_chmod_ACE_list $opt $num $ace $testdir + log_must $RM -rf $testdir + done + done + done +done + +log_pass "chmod A{+|-|=} behave to the ACL list passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_002_pos.ksh new file mode 100644 index 0000000000..2163b10bbc --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_002_pos.ksh @@ -0,0 +1,241 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# chmod A{+|-|=} read_data|write_data|execute for owner@ group@ or +# everyone@ correctly alters mode bits . +# +# STRATEGY: +# 1. Loop root and non-root user. +# 2. Get the random initial map. +# 3. Get the random ACL string. +# 4. Separately chmod +|-|= read_data|write_data|execute +# 5. Check map bits +# + +verify_runnable "both" + +log_assert "chmod A{+|-|=} read_data|write_data|execute for owner@, group@ " \ + "or everyone@ correctly alters mode bits." +log_onexit cleanup + +set -A bits 0 1 2 3 4 5 6 7 +set -A a_flag owner group everyone +set -A a_access read_data write_data execute +set -A a_type allow deny + +# +# Get a random item from an array. +# +# $1 the base set +# +function random_select #array_name +{ + typeset arr_name=$1 + typeset -i ind + + eval typeset -i cnt=\${#${arr_name}[@]} + (( ind = $RANDOM % cnt )) + + eval print \${${arr_name}[$ind]} +} + +# +# Create a random string according to array name, the item number and +# separated tag. +# +# $1 array name where the function get the elements +# $2 the items number which you want to form the random string +# $3 the separated tag +# +function form_random_str #<array_name> <count> <sep> +{ + typeset arr_name=$1 + typeset -i count=${2:-1} + typeset sep=${3:-""} + + typeset str="" + while (( count > 0 )); do + str="${str}$(random_select $arr_name)${sep}" + + (( count -= 1 )) + done + + print $str +} + +# +# According to the original bits, the input ACE access and ACE type, return the +# expect bits after 'chmod A0{+|=}'. +# +# $1 bits which was make up of three bit 'rwx' +# $2 ACE access which is read_data, write_data or execute +# $3 ACE type which is allow or deny +# +function cal_bits #bits acl_access acl_type +{ + typeset bits=$1 + typeset acl_access=$2 + typeset acl_type=$3 + set -A bit r w x + + typeset tmpbits="" + typeset -i i=0 j + while (( i < 3 )); do + if [[ $acl_access == *"${a_access[i]}"* ]]; then + if [[ $acl_type == "allow" ]]; then + tmpbits="$tmpbits${bit[i]}" + elif [[ $acl_type == "deny" ]]; then + tmpbits="${tmpbits}-" + fi + else + (( j = i + 1 )) + tmpbits="$tmpbits$(get_substr $bits $j 1)" + fi + + (( i += 1 )) + done + + echo "$tmpbits" +} + +# +# Based on the initial node map before chmod and the ace-spec, check if chmod +# has the correct behaven to map bits. +# +function check_test_result #init_mode node acl_flag acl_access a_type +{ + typeset init_mode=$1 + typeset node=$2 + typeset acl_flag=$3 + typeset acl_access=$4 + typeset acl_type=$5 + + typeset -3L u_bits=$init_mode + typeset g_bits=$(get_substr $init_mode 4 3) + typeset -3R o_bits=$init_mode + + if [[ $acl_flag == "owner" || $acl_flag == "everyone" ]]; then + u_bits=$(cal_bits $u_bits $acl_access $acl_type) + fi + if [[ $acl_flag == "group" || $acl_flag == "everyone" ]]; then + g_bits=$(cal_bits $g_bits $acl_access $acl_type) + fi + if [[ $acl_flag == "everyone" ]]; then + o_bits=$(cal_bits $o_bits $acl_access $acl_type) + fi + + typeset cur_mode=$(get_mode $node) + cur_mode=$(get_substr $cur_mode 2 9) + + if [[ $cur_mode == $u_bits$g_bits$o_bits ]]; then + log_note "SUCCESS: Current map($cur_mode) ==" \ + "expected map($u_bits$g_bits$o_bits)" + else + log_fail "FAIL: Current map($cur_mode) != " \ + "expected map($u_bits$g_bits$o_bits)" + fi +} + +function test_chmod_map #<node> +{ + typeset node=$1 + typeset init_mask acl_flag acl_access acl_type + typeset -i cnt + + if (( ${#node} == 0 )); then + log_fail "FAIL: file name or directroy name is not defined." + fi + + # Get the initial map + init_mask=$(form_random_str bits 3) + # Get ACL flag, access & type + acl_flag=$(form_random_str a_flag) + (( cnt = ($RANDOM % ${#a_access[@]}) + 1 )) + acl_access=$(form_random_str a_access $cnt '/') + acl_access=${acl_access%/} + acl_type=$(form_random_str a_type) + + typeset acl_spec=${acl_flag}@:${acl_access}:${acl_type} + + # Set the initial map and back the initial ACEs + typeset orig_ace=/tmp/orig_ace.$$ + typeset cur_ace=/tmp/cur_ace.$$ + + for operator in "A0+" "A0="; do + log_must usr_exec $CHMOD $init_mask $node + init_mode=$(get_mode $node) + init_mode=$(get_substr $init_mode 2 9) + log_must usr_exec eval "$LS -vd $node > $orig_ace" + + # To "A=", firstly add one ACE which can't modify map + if [[ $operator == "A0=" ]]; then + log_must $CHMOD A0+user:$ZFS_ACL_OTHER1:execute:deny \ + $node + fi + log_must usr_exec $CHMOD $operator$acl_spec $node + check_test_result \ + $init_mode $node $acl_flag $acl_access $acl_type + + # Check "chmod A-" + log_must usr_exec $CHMOD A0- $node + log_must usr_exec eval "$LS -vd $node > $cur_ace" + + if $DIFF $orig_ace $cur_ace; then + log_note "SUCCESS: original ACEs equivalence the " \ + "current ACEs. 'chmod A-' succeeded." + else + log_fail "FAIL: 'chmod A-' failed." + fi + done + + [[ -f $orig_ace ]] && log_must usr_exec $RM -f $orig_ace + [[ -f $cur_ace ]] && log_must usr_exec $RM -f $cur_ace +} + +for user in root $ZFS_ACL_STAFF1; do + set_cur_usr $user + + typeset -i loop_cnt=20 + while (( loop_cnt > 0 )); do + log_must usr_exec $TOUCH $testfile + test_chmod_map $testfile + log_must $RM -f $testfile + + log_must usr_exec $MKDIR $testdir + test_chmod_map $testdir + log_must $RM -rf $testdir + + (( loop_cnt -= 1 )) + done +done + +log_pass "chmod A{+|-|=} read_data|write_data|execute for owner@, group@ " \ + "oreveryone@ correctly alters mode bits passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_003_pos.ksh new file mode 100644 index 0000000000..7bd341af8d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_003_pos.ksh @@ -0,0 +1,132 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that the read_data/write_data/execute permission for +# owner/group/everyone are correct. +# +# STRATEGY: +# 1. Loop root and non-root user. +# 2. Separated verify type@:access:allow|deny to file and directory +# 3. To super user, read and write deny was override. +# 4. According to ACE list and override rule, expect that +# read/write/execute file or directory succeed or fail. +# + +verify_runnable "both" + +# owner@ group_users other_users +set -A users \ + "root" "$ZFS_ACL_ADMIN" "$ZFS_ACL_OTHER1" \ + "$ZFS_ACL_STAFF1" "$ZFS_ACL_STAFF2" "$ZFS_ACL_OTHER1" + +# In order to test execute permission, read_data was need firstly. +set -A a_access "read_data" "write_data" "read_data/execute" +set -A a_flag "owner@" "group@" "everyone@" + +log_assert "Verify that the read_data/write_data/execute permission for" \ + "owner/group/everyone are correct." +log_onexit cleanup + +function logname #node acl_spec user +{ + typeset node=$1 + typeset acl_spec=$2 + typeset user=$3 + + # To super user, read and write deny permission was override. + if [[ $acl_spec == *:allow ]] || \ + [[ $user == root && -d $node ]] || \ + [[ $user == root && $acl_spec != *"execute"* ]] + then + print "log_must" + elif [[ $acl_spec == *:deny ]]; then + print "log_mustnot" + fi +} + +function check_chmod_results #node acl_spec g_usr o_usr +{ + typeset node=$1 + typeset acl_spec=$2 + typeset g_usr=$3 + typeset o_usr=$4 + typeset log + + if [[ $acl_spec == "owner@:"* || $acl_spec == "everyone@:"* ]]; then + log=$(logname $node $acl_spec $ZFS_ACL_CUR_USER) + $log rwx_node $ZFS_ACL_CUR_USER $node $acl_spec + fi + if [[ $acl_spec == "group@:"* || $acl_spec == "everyone@:"* ]]; then + log=$(logname $node $acl_spec $g_usr) + $log rwx_node $g_usr $node $acl_spec + fi + if [[ $acl_spec == "everyone@"* ]]; then + log=$(logname $node $acl_spec $o_usr) + $log rwx_node $o_usr $node $acl_spec + fi +} + +function test_chmod_basic_access #node group_user other_user +{ + typeset node=$1 + typeset g_usr=$2 + typeset o_usr=$3 + typeset flag access acl_spec + + for flag in ${a_flag[@]}; do + for access in ${a_access[@]}; do + for tp in allow deny; do + acl_spec="$flag:$access:$tp" + log_must usr_exec $CHMOD A+$acl_spec $node + check_chmod_results \ + $node $acl_spec $g_usr $o_usr + log_must usr_exec $CHMOD A0- $node + done + done + done +} + +typeset -i i=0 +while (( i < ${#users[@]} )); do + log_must set_cur_usr ${users[i]} + + log_must usr_exec $TOUCH $testfile + test_chmod_basic_access $testfile ${users[((i+1))]} ${users[((i+2))]} + log_must usr_exec $MKDIR $testdir + test_chmod_basic_access $testdir ${users[((i+1))]} ${users[((i+2))]} + + log_must usr_exec $RM -rf $testfile $testdir + + (( i += 3 )) +done + +log_pass "Verify that the read_data/write_data/execute permission for" \ + "owner/group/everyone passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_004_pos.ksh new file mode 100644 index 0000000000..75e92282ff --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_rwx_004_pos.ksh @@ -0,0 +1,138 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that explicit ACL setting to specified user or group will +# override existed access rule. +# +# STRATEGY: +# 1. Loop root and non-root user. +# 2. Loop the specified access one by one. +# 3. Loop verify explicit ACL set to specified user and group. +# + +verify_runnable "both" + +function check_access #log user node access rflag +{ + typeset log=$1 + typeset user=$2 + typeset node=$3 + typeset access=$4 + typeset rflag=$5 + + if [[ $rflag == "allow" && $access == execute ]]; then + rwx_node $user $node $access + # + # When everyone@ were deny, this file can't execute. + # So,'cannot execute' means user has the permission to + # execute, just the file can't be execute. + # + if [[ $ZFS_ACL_ERR_STR == *"cannot execute"* ]]; then + log_note "SUCCESS: rwx_node $user $node $access" + else + log_fail "FAIL: rwx_node $user $node $access" + fi + else + $log rwx_node $user $node $access + fi +} + +function verify_explicit_ACL_rule #node access flag +{ + typeset node=$1 + typeset access=$2 + typeset flag=$3 + typeset log rlog rflag + + # Get the expect log check + if [[ $flag == allow ]]; then + log=log_mustnot + rlog=log_must + rflag=deny + else + log=log_must + rlog=log_mustnot + rflag=allow + fi + + log_must usr_exec $CHMOD A+everyone@:$access:$flag $node + log_must usr_exec $CHMOD A+user:$ZFS_ACL_OTHER1:$access:$rflag $node + check_access $log $ZFS_ACL_OTHER1 $node $access $rflag + log_must usr_exec $CHMOD A0- $node + + log_must usr_exec \ + $CHMOD A+group:$ZFS_ACL_OTHER_GROUP:$access:$rflag $node + check_access $log $ZFS_ACL_OTHER1 $node $access $rflag + check_access $log $ZFS_ACL_OTHER2 $node $access $rflag + log_must usr_exec $CHMOD A0- $node + log_must usr_exec $CHMOD A0- $node + + log_must usr_exec \ + $CHMOD A+group:$ZFS_ACL_OTHER_GROUP:$access:$flag $node + log_must usr_exec $CHMOD A+user:$ZFS_ACL_OTHER1:$access:$rflag $node + $log rwx_node $ZFS_ACL_OTHER1 $node $access + $rlog rwx_node $ZFS_ACL_OTHER2 $node $access + log_must usr_exec $CHMOD A0- $node + log_must usr_exec $CHMOD A0- $node +} + +log_assert "Verify that explicit ACL setting to specified user or group will" \ + "override existed access rule." +log_onexit cleanup + +set -A a_access "read_data" "write_data" "execute" +set -A a_flag "allow" "deny" +typeset node + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir + log_must usr_exec $CHMOD 755 $testfile $testdir + + for node in $testfile $testdir; do + for access in ${a_access[@]}; do + for flag in ${a_flag[@]}; do + verify_explicit_ACL_rule $node $access $flag + done + done + done + + log_must usr_exec $RM -rf $testfile $testdir +done + +log_pass "Explicit ACL setting to specified user or group will override " \ + "existed access rule passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_xattr_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_xattr_001_pos.ksh new file mode 100644 index 0000000000..5b6bdf2a48 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_xattr_001_pos.ksh @@ -0,0 +1,238 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that the read_xattr/write_xattr for +# owner/group/everyone are correct. +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special read_xattr ACE to the file and directory +# 3. Try to list the extended attributes of the file and directory +# 4. Set special write_xattr ACE to the file and directory +# 5. Try to add new extended attributes to the file and directory +# 6. Verify above operation is successful. +# + +verify_runnable "both" + +function cleanup +{ + cd $cwd + + cleanup_test_files $TESTDIR/basedir + + if [[ -e $TESTDIR/$ARCHIVEFILE ]]; then + log_must $RM -f $TESTDIR/$ARCHIVEFILE + fi + + return 0 +} + +# owner@ group group_users other_users +set -A users \ + "root" "root" "$ZFS_ACL_ADMIN" "$ZFS_ACL_OTHER1" \ + "$ZFS_ACL_STAFF1" "$ZFS_ACL_STAFF_GROUP" "$ZFS_ACL_STAFF2" \ + "$ZFS_ACL_OTHER1" + +set -A a_access \ + "read_xattr:allow" \ + "read_xattr:deny" \ + "write_xattr:allow" \ + "write_xattr:deny" + +set -A a_flag "owner@" "group@" "everyone@" + +MYTESTFILE=/etc/passwd + +log_assert "Verify that the permission of read_xattr/write_xattr for " \ + "owner/group/everyone are correct." +log_onexit cleanup + +function operate_node #user node acl +{ + typeset user=$1 + typeset node=$2 + typeset acl_t=$3 + typeset ret + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + + if [[ $acl_t == *read_xattr* ]]; then + chgusr_exec $user $RUNAT $node $LS > /dev/null 2>&1; ret=$? + elif [[ $acl_t == *write_xattr* ]]; then + chgusr_exec $user $RUNAT $node $CP $MYTESTFILE attr.1 ; ret=$? + + if [[ $ret -eq 0 ]]; then + log_must cleanup_test_files $TESTDIR/basedir + log_must $TAR xpf@ $TESTDIR/$ARCHIVEFILE + fi + fi + + return $ret +} + +function logname #acl_target user +{ + typeset acl_target=$1 + typeset user=$2 + typeset ret="log_mustnot" + + # To super user, read and write deny permission was override. + if [[ $user == root || $acl_target == *:allow ]] then + ret="log_must" + fi + + print $ret +} + +function check_chmod_results #node flag acl_target g_usr o_usr +{ + typeset node=$1 + typeset flag=$2 + typeset acl_target=$2:$3 + typeset g_usr=$4 + typeset o_usr=$5 + typeset log + + if [[ $flag == "owner@" || $flag == "everyone@" ]]; then + log=$(logname $acl_target $ZFS_ACL_CUR_USER) + $log operate_node $ZFS_ACL_CUR_USER $node $acl_target + fi + if [[ $flag == "group@" || $flag == "everyone@" ]]; then + log=$(logname $acl_target $g_usr) + $log operate_node $g_usr $node $acl_target + fi + if [[ $flag == "everyone@" ]]; then + log=$(logname $acl_target $o_usr) + $log operate_node $o_usr $node $acl_target + fi +} + +function test_chmod_basic_access #node g_usr o_usr +{ + typeset node=${1%/} + typeset g_usr=$2 + typeset o_usr=$3 + typeset flag acl_p acl_t parent + + parent=${node%/*} + + for flag in ${a_flag[@]}; do + for acl_t in "${a_access[@]}"; do + log_must usr_exec $CHMOD A+$flag:$acl_t $node + + log_must $TAR cpf@ $TESTDIR/$ARCHIVEFILE basedir + + check_chmod_results "$node" "$flag" \ + "$acl_t" "$g_usr" "$o_usr" + + log_must usr_exec $CHMOD A0- $node + done + done +} + +function setup_test_files #base_node user group +{ + typeset base_node=$1 + typeset user=$2 + typeset group=$3 + + cleanup_test_files $base_node + + log_must $MKDIR -p $base_node + log_must $CHOWN $user:$group $base_node + + log_must set_cur_usr $user + + # Prepare all files/sub-dirs for testing. + + file0=$base_node/testfile_rm + + dir0=$base_node/testdir_rm + + log_must usr_exec $TOUCH $file0 + log_must usr_exec $CHMOD 444 $file0 + + log_must usr_exec $RUNAT $file0 $CP $MYTESTFILE attr.0 + + log_must usr_exec $MKDIR -p $dir0 + log_must usr_exec $CHMOD 555 $dir0 + + log_must usr_exec $RUNAT $dir0 $CP $MYTESTFILE attr.0 + + log_must usr_exec $CHMOD 777 $base_node + return 0 +} + +function cleanup_test_files #base_node +{ + typeset base_node=$1 + + if [[ -d $base_node ]]; then + log_must $RM -rf $base_node + elif [[ -e $base_node ]]; then + log_must $RM -f $base_node + fi + + return 0 +} + +typeset cwd=$PWD +typeset ARCHIVEFILE=archive.tar + +typeset -i i=0 +typeset -i j=0 +typeset target + +while (( i < ${#users[@]} )); do + setup_test_files $TESTDIR/basedir ${users[i]} ${users[((i+1))]} + cd $TESTDIR + + j=0 + while (( j < 1 )); do + eval target=\$file$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + eval target=\$dir$j + test_chmod_basic_access $target \ + "${users[((i+2))]}" "${users[((i+3))]}" + + (( j = j + 1 )) + done + + (( i += 4 )) +done + +log_pass "Verify that the permission of read_xattr/write_xattr for " \ + "owner/group/everyone are correct." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_xattr_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_xattr_002_pos.ksh new file mode 100644 index 0000000000..5f84781230 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_chmod_xattr_002_pos.ksh @@ -0,0 +1,233 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that the write_xattr for remove the extended attributes of +# owner/group/everyone are correct. +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special write_xattr ACE to the file and directory +# 3. Try to remove the extended attributes of the file and directory +# 4. Verify above operation is successful. +# + +verify_runnable "both" + +function cleanup +{ + cd $cwd + + cleanup_test_files $TESTDIR/basedir + + if [[ -e $TESTDIR/$ARCHIVEFILE ]]; then + log_must $RM -f $TESTDIR/$ARCHIVEFILE + fi + + return 0 +} + +# owner@ group group_users other_users +set -A users \ + "root" "root" "$ZFS_ACL_ADMIN" "$ZFS_ACL_OTHER1" \ + "$ZFS_ACL_STAFF1" "$ZFS_ACL_STAFF_GROUP" "$ZFS_ACL_STAFF2" \ + "$ZFS_ACL_OTHER1" + +set -A a_access \ + "write_xattr:allow" \ + "write_xattr:deny" + +set -A a_flag "owner@" "group@" "everyone@" + +MYTESTFILE=/etc/passwd + +log_assert "Verify that the permission of write_xattr for " \ + "owner/group/everyone while remove extended attributes are correct." +log_onexit cleanup + +function operate_node #user node acl +{ + typeset user=$1 + typeset node=$2 + typeset acl_t=$3 + typeset ret + + if [[ $user == "" || $node == "" ]]; then + log_fail "user, node are not defined." + fi + + chgusr_exec $user $RUNAT $node $RM -f attr.0 ; ret=$? + + if [[ $ret -eq 0 ]]; then + log_must cleanup_test_files $TESTDIR/basedir + log_must $TAR xpf@ $TESTDIR/$ARCHIVEFILE + fi + + return $ret +} + +function logname #acl_target owner user +{ + typeset acl_target=$1 + typeset owner=$2 + typeset user=$3 + typeset ret="log_mustnot" + + # To super user, read and write deny permission was override. + if [[ $user == root || $owner == $user ]] then + ret="log_must" + fi + + print $ret +} + +function check_chmod_results #node flag acl_target owner g_usr o_usr +{ + typeset node=$1 + typeset flag=$2 + typeset acl_target=$2:$3 + typeset owner=$4 + typeset g_usr=$5 + typeset o_usr=$6 + typeset log + + if [[ $flag == "owner@" || $flag == "everyone@" ]]; then + log=$(logname $acl_target $owner $ZFS_ACL_CUR_USER) + $log operate_node $ZFS_ACL_CUR_USER $node $acl_target + fi + if [[ $flag == "group@" || $flag == "everyone@" ]]; then + log=$(logname $acl_target $owner $g_usr) + $log operate_node $g_usr $node $acl_target + fi + if [[ $flag == "everyone@" ]]; then + log=$(logname $acl_target $owner $o_usr) + $log operate_node $o_usr $node $acl_target + fi +} + +function test_chmod_basic_access #node owner g_usr o_usr +{ + typeset node=${1%/} + typeset owner=$2 + typeset g_usr=$3 + typeset o_usr=$4 + typeset flag acl_p acl_t parent + + parent=${node%/*} + + for flag in ${a_flag[@]}; do + for acl_t in "${a_access[@]}"; do + log_must usr_exec $CHMOD A+$flag:$acl_t $node + + log_must $TAR cpf@ $TESTDIR/$ARCHIVEFILE basedir + + check_chmod_results "$node" "$flag" \ + "$acl_t" "$owner" "$g_usr" "$o_usr" + + log_must usr_exec $CHMOD A0- $node + done + done +} + +function setup_test_files #base_node user group +{ + typeset base_node=$1 + typeset user=$2 + typeset group=$3 + + cleanup_test_files $base_node + + log_must $MKDIR -p $base_node + log_must $CHOWN $user:$group $base_node + + log_must set_cur_usr $user + + # Prepare all files/sub-dirs for testing. + + file0=$base_node/testfile_rm + + dir0=$base_node/testdir_rm + + log_must usr_exec $TOUCH $file0 + log_must usr_exec $CHMOD 444 $file0 + + log_must usr_exec $RUNAT $file0 $CP $MYTESTFILE attr.0 + + log_must usr_exec $MKDIR -p $dir0 + log_must usr_exec $CHMOD 555 $dir0 + + log_must usr_exec $RUNAT $dir0 $CP $MYTESTFILE attr.0 + + log_must usr_exec $CHMOD 555 $base_node + return 0 +} + +function cleanup_test_files #base_node +{ + typeset base_node=$1 + + if [[ -d $base_node ]]; then + log_must $RM -rf $base_node + elif [[ -e $base_node ]]; then + log_must $RM -f $base_node + fi + + return 0 +} + +typeset cwd=$PWD +typeset ARCHIVEFILE=archive.tar + +typeset -i i=0 +typeset -i j=0 +typeset target + +while (( i < ${#users[@]} )); do + setup_test_files $TESTDIR/basedir ${users[i]} ${users[((i+1))]} + cd $TESTDIR + + j=0 + while (( j < 1 )); do + eval target=\$file$j + test_chmod_basic_access $target ${users[i]} \ + "${users[((i+2))]}" "${users[((i+3))]}" + + eval target=\$dir$j + test_chmod_basic_access $target ${users[i]} \ + "${users[((i+2))]}" "${users[((i+3))]}" + + (( j = j + 1 )) + done + + (( i += 4 )) +done + +log_pass "Verify that the permission of write_xattr for " \ + "owner/group/everyone while remove extended attributes are correct." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cp_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cp_001_pos.ksh new file mode 100644 index 0000000000..daa67d511a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cp_001_pos.ksh @@ -0,0 +1,95 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that '/usr/bin/cp [-p]' supports ZFS ACL +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special ACE to the file and directory +# 3. Copy the file/directory within and across zfs file system +# 4. Verify that the ACL of file/directroy is not changed, when you are +# inserting an ACL with a user: or group: entry on the top. +# (abstractions entry are treated special, since they represent the +# traditional permission bit mapping.) +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$CP [-p]' supports ZFS ACLs." +log_onexit cleanup + +log_note "Create the second zfs file system: $TESTPOOL/$TESTFS1." +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS1 +log_must $CHMOD 777 $TESTDIR1 + +# Define target directory. +dstdir=$TESTDIR1/dstdir.$$ + +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + for obj in $testfile $testdir; do + # Create source object and target directroy + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir $dstdir + + # Add the new ACE on the head. + log_must usr_exec $CHMOD \ + A0+user:$ZFS_ACL_OTHER1:read_acl:deny $obj + + cmd_str="$CP -p" + [[ -d $obj ]] && cmd_str="$CP -rp" + log_must usr_exec $cmd_str $obj $dstdir + log_must usr_exec $cmd_str $obj $TESTDIR1 + + for dir in $dstdir $TESTDIR1; do + log_must compare_modes $obj $dir/${obj##*/} + log_must compare_acls $obj $dir/${obj##*/} + done + + # Delete all the test file and directory + log_must usr_exec $RM -rf $TESTDIR/* $TESTDIR1/* + done +done + +log_pass "'$CP [-p]' succeeds to support ZFS ACLs." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cp_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cp_002_pos.ksh new file mode 100644 index 0000000000..0e644cec77 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cp_002_pos.ksh @@ -0,0 +1,101 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that '/usr/bin/cp [-p@]' supports ZFS ACL & xattrs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special ACE to the file and directory +# 3. Create xattr of the file and directory +# 4. Copy the file/directory within and across zfs file system +# 5. Verify that the ACL & xattrs of the file/directroy is not changed, +# when you are inserting an ACL with user: or group: entry on the top. +# (abstractions entry are treated special, since they represent the +# traditional permission bit mapping.) +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$CP [-p]' supports ZFS ACLs." +log_onexit cleanup + +log_note "Create the second zfs file system: $TESTPOOL/$TESTFS1." +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS1 +log_must $CHMOD 777 $TESTDIR1 + +# Define target directory. +dstdir=$TESTDIR1/dstdir.$$ +mytestfile=/kernel/drv/zfs + +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + for obj in $testfile $testdir; do + # Create source object and target directroy + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir $dstdir + + log_must usr_exec $RUNAT $testfile $CP $mytestfile attr.0 + log_must usr_exec $RUNAT $testdir $CP $mytestfile attr.0 + + # Add the new ACE on the head. + log_must usr_exec $CHMOD \ + A0+user:$ZFS_ACL_OTHER1:read_acl:deny $obj + + cmd_str="$CP -p@" + [[ -d $obj ]] && cmd_str="$CP -rp@" + log_must usr_exec $cmd_str $obj $dstdir + log_must usr_exec $cmd_str $obj $TESTDIR1 + + for dir in $dstdir $TESTDIR1; do + log_must compare_modes $obj $dir/${obj##*/} + log_must compare_acls $obj $dir/${obj##*/} + log_must compare_xattrs $obj $dir/${obj##*/} + done + + # Delete all the test file and directory + log_must usr_exec $RM -rf $TESTDIR/* $TESTDIR1/* + done +done + +log_pass "'$CP [-p@]' succeeds to support ZFS ACLs." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cpio_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cpio_001_pos.ksh new file mode 100644 index 0000000000..739a7b0d5b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cpio_001_pos.ksh @@ -0,0 +1,122 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright (c) 2012 by Marcelo Leal. All rights reserved. +# +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that '$CPIO' command with -P option supports to archive ZFS ACLs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Add new ACE in ACL or change mode of file and directory +# 3. Use $CPIO to archive file and directory +# 4. Extract the archive file +# 5. Verify that the restored ACLs of file and directory identify +# with the origional ones. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + if (( ${#orig_dir} != 0 )); then + cd $orig_dir + fi + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$CPIO' command supports to archive ZFS ACLs." +log_onexit cleanup + +set -A ops "A+user:$ZFS_ACL_OTHER1:execute:allow" \ + "A3+user:$ZFS_ACL_OTHER1:write_data:deny" \ + "A0+user:$ZFS_ACL_OTHER1:write_data:deny" \ + "A3+group:$ZFS_ACL_OTHER_GROUP:read_data:deny" \ + "A1=user:$ZFS_ACL_STAFF1:write_data:deny" \ + "A1=group:$ZFS_ACL_STAFF_GROUP:write_data:deny" + +log_note "Create second zfs file system to restore the cpio archive." +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 +log_must $CHMOD 777 $TESTDIR1 + +# Define test fine and record the original directory. +CPIOFILE=cpiofile.$$ +file=$TESTFILE0 +dir=dir.$$ +orig_dir=$PWD + +typeset user +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + typeset -i i=0 + while (( i < ${#ops[*]} )); do + log_note "Create file $file and directory $dir " \ + "in zfs filesystem. " + cd $TESTDIR + log_must usr_exec $TOUCH $file + log_must usr_exec $MKDIR $dir + + log_note "Change the ACLs of file and directory with " \ + "'$CHMOD ${ops[i]}'." + for obj in $file $dir; do + log_must usr_exec $CHMOD ${ops[i]} $obj + done + + log_note "Archive the file and directory." + cd $TESTDIR + log_must eval "usr_exec $LS | " \ + "usr_exec $CPIO -ocP -O $CPIOFILE > /dev/null 2>&1" + + log_note "Restore the cpio archive." + log_must usr_exec $MV $CPIOFILE $TESTDIR1 + cd $TESTDIR1 + log_must eval "usr_exec $CAT $CPIOFILE | " \ + "usr_exec $CPIO -icP > /dev/null 2>&1" + + log_note "Verify that the ACLs of restored file/directory " \ + "have no changes." + for obj in $file $dir; do + log_must compare_modes $TESTDIR/$obj $TESTDIR1/$obj + log_must compare_acls $TESTDIR/$obj $TESTDIR1/$obj + done + + log_must usr_exec $RM -rf $TESTDIR/* $TESTDIR1/* + + (( i = i + 1 )) + done +done + +log_pass "'$CPIO' command succeeds to support ZFS ACLs." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cpio_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cpio_002_pos.ksh new file mode 100644 index 0000000000..a8f9769102 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_cpio_002_pos.ksh @@ -0,0 +1,128 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright (c) 2012 by Marcelo Leal. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that '$CPIO' command with -P@ option supports to archive ZFS ACLs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Add new ACE in ACL or change mode of file and directory +# 3. Create xattr of the file and directory +# 4. Use $CPIO to archive file and directory +# 5. Extract the archive file +# 6. Verify that the restored ACLs of file and directory identify +# with the origional ones. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + if (( ${#orig_dir} != 0 )); then + cd $orig_dir + fi + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$CPIO' command supports to archive ZFS ACLs & xattrs." +log_onexit cleanup + +set -A ops "A+user:$ZFS_ACL_OTHER1:execute:allow" \ + "A3+user:$ZFS_ACL_OTHER1:write_data:deny" \ + "A0+user:$ZFS_ACL_OTHER1:write_data:deny" \ + "A3+group:$ZFS_ACL_OTHER_GROUP:read_data:deny" \ + "A1=user:$ZFS_ACL_STAFF1:write_data:deny" \ + "A1=group:$ZFS_ACL_STAFF_GROUP:write_data:deny" + +log_note "Create second zfs file system to restore the cpio archive." +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 +log_must $CHMOD 777 $TESTDIR1 + +# Define test fine and record the original directory. +CPIOFILE=cpiofile.$$ +file=$TESTFILE0 +dir=dir.$$ +orig_dir=$PWD +mytestfile=/kernel/drv/zfs + +typeset user +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + typeset -i i=0 + while (( i < ${#ops[*]} )); do + log_note "Create file $file and directory $dir " \ + "in zfs filesystem. " + cd $TESTDIR + log_must usr_exec $TOUCH $file + log_must usr_exec $MKDIR $dir + log_must usr_exec $RUNAT $file $CP $mytestfile attr.0 + log_must usr_exec $RUNAT $dir $CP $mytestfile attr.0 + + log_note "Change the ACLs of file and directory with " \ + "'$CHMOD ${ops[i]}'." + for obj in $file $dir; do + log_must usr_exec $CHMOD ${ops[i]} $obj + done + + log_note "Archive the file and directory." + cd $TESTDIR + log_must eval "usr_exec $LS | " \ + "usr_exec $CPIO -ocP@ -O $CPIOFILE > /dev/null 2>&1" + + log_note "Restore the cpio archive." + log_must usr_exec $MV $CPIOFILE $TESTDIR1 + cd $TESTDIR1 + log_must eval "usr_exec $CAT $CPIOFILE | " \ + "usr_exec $CPIO -icP@ > /dev/null 2>&1" + + log_note "Verify that the ACLs of restored file/directory " \ + "have no changes." + for obj in $file $dir; do + log_must compare_modes $TESTDIR/$obj $TESTDIR1/$obj + log_must compare_acls $TESTDIR/$obj $TESTDIR1/$obj + log_must compare_xattrs $TESTDIR/$obj $TESTDIR1/$obj + done + + log_must usr_exec $RM -rf $TESTDIR/* $TESTDIR1/* + + (( i = i + 1 )) + done +done + +log_pass "'$CPIO' command succeeds to support ZFS ACLs & xattrs." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_find_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_find_001_pos.ksh new file mode 100644 index 0000000000..9ac8dff8e5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_find_001_pos.ksh @@ -0,0 +1,129 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that '$FIND' command with '-ls' and '-acl' options supports ZFS ACL +# +# STRATEGY: +# 1. Create 5 files and 5 directories in zfs filesystem +# 2. Select a file or directory and add a few ACEs to it +# 3. Use $FIND -ls to check the "+" existen only with the selected file or +# directory +# 4. Use $FIND -acl to check only the selected file/directory in the list +# + +verify_runnable "both" + +function cleanup +{ + [[ -d $TESTDIR ]] && $RM -rf $TESTDIR/* + (( ${#cmd} != 0 )) && cd $cwd + (( ${#mask} != 0 )) && $UMASK $mask +} + +function find_ls_acl #<opt> <obj> +{ + typeset opt=$1 # -ls or -acl + typeset obj=$2 + typeset rst_str="" + + if [[ $opt == "ls" ]]; then + rst_str=`$FIND . -ls | $GREP "+" | $AWK '{print $11}'` + else + rst_str=`$FIND . -acl` + fi + + if [[ $rst_str == "./$obj" ]]; then + return 0 + else + return 1 + fi +} + +log_assert "Verify that '$FIND' command supports ZFS ACLs." + +log_onexit cleanup + +set -A ops " A+user:$ZFS_ACL_STAFF1:read_data:allow" \ + " A+user:$ZFS_ACL_STAFF1:write_data:allow" + +f_base=testfile.$$ # Base file name for tested files +d_base=testdir.$$ # Base directory name for tested directory +cwd=$PWD +mask=`$UMASK` + +log_note "Create five files and directories in the zfs filesystem. " +cd $TESTDIR +$UMASK 0777 +typeset -i i=0 +while ((i < 5)) +do + log_must $TOUCH ${f_base}.$i + log_must $MKDIR ${d_base}.$i + + ((i = i + 1)) +done + +for obj in ${f_base}.3 ${d_base}.3 +do + i=0 + while ((i < ${#ops[*]})) + do + log_must $CHMOD ${ops[i]} $obj + + ((i = i + 1)) + done + + for opt in "ls" "acl" + do + log_must find_ls_acl $opt $obj + done + + log_note "Check the file access permission according to the added ACEs" + if [[ ! -r $obj || ! -w $obj ]]; then + log_fail "The added ACEs for $obj cannot be represented in " \ + "mode." + fi + + log_note "Remove the added ACEs from ACL." + i=0 + while ((i < ${#ops[*]})) + do + log_must $CHMOD A0- $obj + + ((i = i + 1)) + done +done + +log_pass "'$FIND' command succeeds to support ZFS ACLs." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_ls_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_ls_001_pos.ksh new file mode 100644 index 0000000000..9a710ae0ad --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_ls_001_pos.ksh @@ -0,0 +1,105 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that '/usr/bin/ls' command option supports ZFS ACL +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Verify that 'ls [-dv]' can list the ACEs of ACL of +# file/directroy +# 3. Change the file/directory's acl +# 4. Verify that 'ls -l' can use the '+' to indicate the non-trivial +# acl. +# + +verify_runnable "both" + +function cleanup +{ + (( ${#cwd} != 0 )) && cd $cwd + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* + (( ${#mask} != 0 )) && log_must $UMASK $mask +} + +log_assert "Verify that '$LS' command supports ZFS ACLs." + +log_onexit cleanup + +file=$TESTFILE0 +dir=dir.$$ +cwd=$PWD +mask=`$UMASK` +spec_ace="everyone@:write_acl:allow" + +$UMASK 0022 + +log_note "Create file and directory in the zfs filesystem. " +cd $TESTDIR +log_must $TOUCH $file +log_must $MKDIR $dir + +log_note "Verify that '$LS [-dv]' can list file/directory ACEs of its acl." + +typeset -i ace_num=0 +for obj in $file $dir +do + typeset ls_str="" + if [[ -f $obj ]]; then + ls_str="$LS -v" + else + ls_str="$LS -dv" + fi + + for ace_type in "owner@" "group@" "everyone@" + do + $ls_str $obj | $GREP $ace_type > /dev/null 2>&1 + (( $? == 0 )) && (( ace_num += 1 )) + done + + (( ace_num < 1 )) && \ + log_fail "'$LS [-dv] fails to list file/directroy acls." +done + +log_note "Verify that '$LS [-dl] [-dv]' can output '+' to indicate " \ + "the acl existent." + +for obj in $file $dir +do + $CHMOD A0+$spec_ace $obj + + log_must eval "$LS -ld -vd $obj | $GREP "+" > /dev/null" + log_must plus_sign_check_v $obj + + log_must eval "$LS -ld -vd $obj | $GREP $spec_ace > /dev/null" + log_must plus_sign_check_l $obj +done + +log_pass "'$LS' command succeeds to support ZFS ACLs." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_mv_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_mv_001_pos.ksh new file mode 100644 index 0000000000..9c9725d69c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_mv_001_pos.ksh @@ -0,0 +1,171 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that '/usr/bin/mv' supports ZFS ACL +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Set special ACE to the file and directory +# 3. Copy the file/directory within and across zfs file system +# 4. Verify that the ACL of file/directroy is not changed +# + +verify_runnable "both" + +function cleanup +{ + (( ${#cwd} != 0 )) && cd $cwd + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + (( ${#mask} != 0 )) && log_must $UMASK $mask +} + +function testing_mv #<flag for file|dir> <file1|dir1> <file2|dir2> +{ + typeset flag=$1 + set -A obj $2 $3 + typeset -i i=0 + typeset orig_acl="" + typeset orig_mode="" + typeset dst_acl="" + typeset dst_mode="" + + if [[ $flag == "f" ]]; then + while (( i < ${#obj[*]} )) + do + orig_acl="$(get_acl ${obj[i]})" + orig_mode="$(get_mode ${obj[i]})" + if (( i < 1 )); then + log_must $MV ${obj[i]} $dst_file + dst_acl=$(get_acl $dst_file) + dst_mode=$(get_mode $dst_file) + else + log_must $MV ${obj[i]} $TESTDIR1 + dst_acl=$(get_acl $TESTDIR1/${obj[i]}) + dst_mode=$(get_mode $TESTDIR1/${obj[i]}) + fi + + if [[ "$dst_mode" != "$orig_mode" ]] || \ + [[ "$dst_acl" != "$orig_acl" ]]; then + log_fail "$MV fails to keep the acl for file." + fi + + (( i = i + 1 )) + done + else + while (( i < ${#obj[*]} )) + do + typeset orig_nested_acl="" + typeset orig_nested_mode="" + typeset dst_nested_acl="" + typeset dst_nested_mode="" + + orig_acl=$(get_acl ${obj[i]}) + orig_mode=$(get_mode ${obj[i]}) + orig_nested_acl=$(get_acl ${obj[i]}/$nestedfile) + orig_nested_mode=$(get_mode ${obj[i]}/$nestedfile) + if (( i < 1 )); then + log_must $MV ${obj[i]} $dst_dir + dst_acl=$(get_acl $dst_dir) + dst_mode=$(get_mode $dst_dir) + dst_nested_acl=$(get_acl $dst_dir/$nestedfile) + dst_nested_mode=$(get_mode $dst_dir/$nestedfile) + else + log_must $MV ${obj[i]} $TESTDIR1 + dst_acl=$(get_acl $TESTDIR1/${obj[i]}) + dst_mode=$(get_mode $TESTDIR1/${obj[i]}) + dst_nested_acl=$(get_acl \ + $TESTDIR1/${obj[i]}/$nestedfile) + dst_nested_mode=$(get_mode \ + $TESTDIR1/${obj[i]}/$nestedfile) + fi + + if [[ "$orig_mode" != "$dst_mode" ]] || \ + [[ "$orig_acl" != "$dst_acl" ]] || \ + [[ "$dst_nested_mode" != "$orig_nested_mode" ]] || \ + [[ "$dst_nested_acl" != "$orig_nested_acl" ]]; then + log_fail "$MV fails to recursively keep the acl for " \ + "directory." + fi + + (( i = i + 1 )) + done + fi +} + +log_assert "Verify that '$MV' supports ZFS ACLs." + +log_onexit cleanup + +spec_ace="everyone@:execute:allow" +set -A orig_file "origfile1.$$" "origfile2.$$" +set -A orig_dir "origdir1.$$" "origdir2.$$" +nestedfile="nestedfile.$$" +dst_file=dstfile.$$ +dst_dir=dstdir.$$ +cwd=$PWD +mask=`$UMASK` +$UMASK 0022 + +# +# This assertion should only test 'mv' within the same filesystem +# +TESTDIR1=$TESTDIR/testdir1$$ + +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 + +log_note "Create files and directories and set special ace on them for testing. " +cd $TESTDIR +typeset -i i=0 +while (( i < ${#orig_file[*]} )) +do + log_must $TOUCH ${orig_file[i]} + log_must $CHMOD A0+$spec_ace ${orig_file[i]} + + (( i = i + 1 )) +done +i=0 +while (( i < ${#orig_dir[*]} )) +do + log_must $MKDIR ${orig_dir[i]} + log_must $TOUCH ${orig_dir[i]}/$nestedfile + + for obj in ${orig_dir[i]} ${orig_dir[i]}/$nestedfile; do + log_must $CHMOD A0+$spec_ace $obj + done + + (( i = i + 1 )) +done + +testing_mv "f" ${orig_file[0]} ${orig_file[1]} +testing_mv "d" ${orig_dir[0]} ${orig_dir[1]} + +log_pass "'$MV' succeeds to support ZFS ACLs." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_tar_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_tar_001_pos.ksh new file mode 100644 index 0000000000..99396acdd5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_tar_001_pos.ksh @@ -0,0 +1,107 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright (c) 2012 by Marcelo Leal. All rights reserved. +# +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that '$TAR' command with -p option supports to archive ZFS ACLs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Add new ACE in ACL of file and directory +# 3. Use $TAR to archive file and directory +# 4. Extract the archive file +# 5. Verify that the restored ACLs of file and directory identify +# with the origional ones. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + + (( ${#cwd} != 0 )) && cd $cwd + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR/ ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$TAR' command supports to archive ZFS ACLs." + +log_onexit cleanup + +set -A ops " A+user:other1:add_file:allow" "A+everyone@:execute:allow" "a-x" "777" + +TARFILE=tarfile.$$.tar +file=$TESTFILE0 +dir=dir.$$ +cwd=$PWD + +log_note "Create second zfs file system to restore the tar archive." +log_must $ZFS create $TESTPOOL/$TESTFS1 +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 + +log_note "Create a file: $file, and directory: $dir, in zfs filesystem. " +cd $TESTDIR +log_must $TOUCH $file +log_must $MKDIR $dir + +typeset -i i=0 +while (( i < ${#ops[*]} )) +do + log_note "Change the ACLs of file and directory with " \ + "'$CHMOD ${ops[i]}'." + cd $TESTDIR + for obj in $file $dir; do + log_must $CHMOD ${ops[i]} $obj + done + log_note "Archive the file and directory." + log_must $TAR cpf $TARFILE $file $dir + + log_note "Restore the tar archive." + log_must $MV $TARFILE $TESTDIR1 + cd $TESTDIR1 + log_must $TAR xpf $TARFILE + + log_note "Verify the ACLs of restored file/directory have no changes." + for obj in $file $dir; do + log_must compare_modes $TESTDIR/$obj $TESTDIR1/$obj + log_must compare_acls $TESTDIR/$obj $TESTDIR1/$obj + done + + log_must $RM -rf $TESTDIR1/* + + (( i = i + 1 )) +done + +log_pass "'$TAR' command succeeds to support ZFS ACLs." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_tar_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_tar_002_pos.ksh new file mode 100644 index 0000000000..4d96bd3742 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/nontrivial/zfs_acl_tar_002_pos.ksh @@ -0,0 +1,115 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Copyright (c) 2012 by Marcelo Leal. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify that '$TAR' command with -p@ option supports to archive ZFS ACLs +# & xattrs +# +# STRATEGY: +# 1. Create file and directory in zfs filesystem +# 2. Add new ACE in ACL of file and directory +# 3. Create xattr of the file and directory +# 4. Use $TAR cf@ to archive file and directory +# 5. Use $TAR xf@ to extract the archive file +# 6. Verify that the restored ACLs & xttrs of file and directory identify +# with the origional ones. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi + + (( ${#cwd} != 0 )) && cd $cwd + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1 + [[ -d $TESTDIR/ ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Verify that '$TAR' command supports to archive ZFS ACLs & xattrs." + +log_onexit cleanup + +set -A ops " A+user:other1:add_file:allow" "A+everyone@:execute:allow" "a-x" \ + "777" +mytestfile=/kernel/drv/zfs + +TARFILE=tarfile.$$.tar +cwd=$PWD + +log_note "Create second zfs file system to restore the tar archive." +log_must $ZFS create $TESTPOOL/$TESTFS1 +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 +log_must $ZFS set mountpoint=$TESTDIR1 $TESTPOOL/$TESTFS1 + +log_note "Create a file: $testfile, and directory: $testdir, in zfs " \ + "filesystem. And prepare for there xattr files." + +for user in root $ZFS_ACL_STAFF1; do + # Set the current user + log_must set_cur_usr $user + + # Create source object and target directroy + cd $TESTDIR + log_must usr_exec $TOUCH $testfile + log_must usr_exec $MKDIR $testdir + + log_must usr_exec $RUNAT $testfile $CP $mytestfile attr.0 + log_must usr_exec $RUNAT $testdir $CP $mytestfile attr.0 + + # Add the new ACE on the head. + log_note "Change the ACLs of file and directory with " \ + "'$CHMOD ${ops[0]}'." + log_must usr_exec $CHMOD ${ops[0]} $testfile + log_must usr_exec $CHMOD ${ops[0]} $testdir + + log_note "Archive the file and directory." + log_must $TAR cpf@ $TARFILE ${testfile#$TESTDIR/} ${testdir#$TESTDIR/} + + log_note "Restore the tar archive." + cd $TESTDIR1 + log_must $TAR xpf@ $TESTDIR/$TARFILE + + log_note "Verify the ACLs of restored file/directory have no changes." + for obj in $testfile $testdir; do + log_must compare_modes $obj $TESTDIR1/${obj##*/} + log_must compare_acls $obj $TESTDIR1/${obj##*/} + log_must compare_xattrs $obj $TESTDIR1/${obj##*/} + done + + log_must $RM -rf $TESTDIR/* $TESTDIR1/* +done + +log_pass "'$TAR' command succeeds to support ZFS ACLs." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/Makefile b/usr/src/test/zfs-tests/tests/functional/acl/trivial/Makefile new file mode 100644 index 0000000000..3555c31da3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/Makefile @@ -0,0 +1,56 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/acl/trivial + +PROGS = cleanup \ + setup \ + zfs_acl_chmod_001_pos \ + zfs_acl_compress_001_pos \ + zfs_acl_cp_001_pos \ + zfs_acl_cp_002_neg \ + zfs_acl_cp_003_neg \ + zfs_acl_find_001_pos \ + zfs_acl_find_002_neg \ + zfs_acl_ls_001_pos \ + zfs_acl_ls_002_neg \ + zfs_acl_mv_001_pos \ + zfs_acl_pack_001_pos \ + zfs_acl_pax_001_pos \ + zfs_acl_pax_002_pos \ + zfs_acl_pax_003_pos \ + zfs_acl_pax_004_pos \ + zfs_acl_pax_005_pos \ + zfs_acl_pax_006_pos \ + zfs_acl_tar_001_pos \ + zfs_acl_tar_002_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/cleanup.ksh new file mode 100644 index 0000000000..ea2d0aaa49 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +cleanup_user_group + +# restore the state of svc:/network/nis/client:default +if [[ -e $NISSTAFILE ]]; then + log_must $SVCADM enable svc:/network/nis/client:default + log_must $RM -f $NISSTAFILE +fi + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/setup.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/setup.ksh new file mode 100644 index 0000000000..5262c178ec --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/setup.ksh @@ -0,0 +1,59 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# check svc:/network/nis/client:default state +# disable it if the state is ON +# and the state will be restored during cleanup.ksh +log_must $RM -f $NISSTAFILE +if [[ "ON" == $($SVCS -H -o sta svc:/network/nis/client:default) ]]; then + log_must $SVCADM disable -t svc:/network/nis/client:default + log_must $TOUCH $NISSTAFILE +fi + +cleanup_user_group + +# Add root group user +log_must add_user root $ZFS_ACL_ADMIN + +# Create staff group and add two user to it +log_must add_group $ZFS_ACL_STAFF_GROUP +log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF1 +log_must add_user $ZFS_ACL_STAFF_GROUP $ZFS_ACL_STAFF2 + +# Create other group and add two user to it +log_must add_group $ZFS_ACL_OTHER_GROUP +log_must add_user $ZFS_ACL_OTHER_GROUP $ZFS_ACL_OTHER1 +log_must add_user $ZFS_ACL_OTHER_GROUP $ZFS_ACL_OTHER2 + +DISK=${DISKS%% *} +default_setup_noexit $DISK +log_must $CHMOD 777 $TESTDIR + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_chmod_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_chmod_001_pos.ksh new file mode 100644 index 0000000000..c817a2e856 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_chmod_001_pos.ksh @@ -0,0 +1,140 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify chmod permission settings on files and directories, as both root +# and non-root users. +# +# STRATEGY: +# 1. Loop root and $ZFS_ACL_STAFF1 as root and non-root users. +# 2. Create test file and directory in zfs filesystem. +# 3. Execute 'chmod' with specified options. +# 4. Check 'ls -l' output and compare with expect results. +# +# NOTE: +# The test does not work for default "discard" aclmode property. +# The test is modified to run with "passthrough" aclmode property. + +verify_runnable "both" + +function cleanup +{ + # reset aclmode=discard + log_must $ZFS set aclmode=discard $TESTPOOL/$TESTFS +} + +# "init_map" "options" "expect_map" +set -A argv \ + "000" "a+rw" "rw-rw-rw-" "000" "a+rwx" "rwxrwxrwx" \ + "000" "u+xr" "r-x------" "000" "gu-xw" "---------" \ + "644" "a-r" "-w-------" "644" "augo-x" "rw-r--r--" \ + "644" "=x" "--x--x--x" "644" "u-rw" "---r--r--" \ + "644" "uo+x" "rwxr--r-x" "644" "ga-wr" "---------" \ + "777" "augo+x" "rwxrwxrwx" "777" "go-xr" "rwx-w--w-" \ + "777" "o-wx" "rwxrwxr--" "777" "ou-rx" "-w-rwx-w-" \ + "777" "a+rwx" "rwxrwxrwx" "777" "u=rw" "rw-rwxrwx" \ + "000" "123" "--x-w--wx" "000" "412" "r----x-w-" \ + "231" "562" "r-xrw--w-" "712" "000" "---------" \ + "777" "121" "--x-w---x" "123" "775" "rwxrwxr-x" + +log_assert " Verify chmod permission settings on files and directories" +log_onexit cleanup + +# +# Verify file or directory have correct map after chmod +# +# $1 file or directory +# +function test_chmod_mapping #<file-dir> +{ + typeset node=$1 + typeset -i i=0 + + while ((i < ${#argv[@]})); do + usr_exec $CHMOD ${argv[i]} $node + if (($? != 0)); then + log_note "usr_exec $CHMOD ${argv[i]} $node" + return 1 + fi + usr_exec $CHMOD ${argv[((i + 1))]} $node + if (($? != 0)); then + log_note "usr_exec $CHMOD ${argv[((i + 1))]} $node" + return 1 + fi + + typeset mode + mode=$(get_mode ${node}) + + if [[ $mode != "-${argv[((i + 2))]}"* && \ + $mode != "d${argv[((i + 2))]}"* ]] + then + log_fail "FAIL: '${argv[i]}' '${argv[((i + 1))]}' \ + '${argv[((i + 2))]}'" + fi + + ((i += 3)) + done + + return 0 +} + +# set aclmode=passthrough +log_must $ZFS set aclmode=passthrough $TESTPOOL/$TESTFS + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + # Test file + log_must usr_exec $TOUCH $testfile + log_must test_chmod_mapping $testfile + log_must usr_exec $CHMOD A+user:$ZFS_ACL_STAFF2:write_acl:allow $testfile + + # Test directory + log_must usr_exec $MKDIR $testdir + log_must test_chmod_mapping $testdir + log_must usr_exec $CHMOD A+user:$ZFS_ACL_STAFF2:write_acl:allow $testdir + + # Grant privileges of write_acl and retest the chmod commands. + + log_must set_cur_usr $ZFS_ACL_STAFF2 + log_must test_chmod_mapping $testfile + log_must test_chmod_mapping $testdir + + log_must set_cur_usr $user + + log_must usr_exec $RM $testfile + log_must usr_exec $RM -rf $testdir +done + +log_pass "Setting permissions using 'chmod' completed successfully." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_compress_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_compress_001_pos.ksh new file mode 100644 index 0000000000..a0c1927504 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_compress_001_pos.ksh @@ -0,0 +1,72 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# The function verifies that compress will keep file attribute intact +# after the file is compressed and uncompressed. +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Save all files and their attribute files cksum value, then compress +# all the files. +# 3. Move them to another directory B. +# 4. Uncompress them and calculate all the files and attribute files cksum +# 5. Verify all the cksum are identical +# + +verify_runnable "both" + +log_assert "Compress will keep file attribute intact after the file is " \ + "compressed and uncompressed" +log_onexit cleanup + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must usr_exec $COMPRESS $INI_DIR/* + log_must usr_exec $MV $INI_DIR/* $TST_DIR + log_must usr_exec $UNCOMPRESS $TST_DIR/* + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "compress/uncompress test passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_001_pos.ksh new file mode 100644 index 0000000000..bb1958edb0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_001_pos.ksh @@ -0,0 +1,75 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies that cp will include file attribute when using the -@ flag +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Save all files and their attribute files cksum value, then 'cp -@p' +# all the files to to another directory B. +# 3. Calculate all the cksum in directory B. +# 4. Verify all the cksum are identical +# + +verify_runnable "both" + +log_assert "Verifies that cp will include file attribute when using the -@ flag" +log_onexit cleanup + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while ((i < NUM_FILE)); do + f=$(getitem $i $initfiles) + + usr_exec $CP -@p $f $TST_DIR + + ((i += 1)) + done + + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "'cp -@' include file attribute passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_002_neg.ksh new file mode 100644 index 0000000000..a788c54f2a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_002_neg.ksh @@ -0,0 +1,72 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies that cp will not include file attribute when the -@ flag is not +# present. +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Implement cp to files without '-@' +# 3. Verify attribute files will not include file attribute +# + +verify_runnable "both" + +log_assert "Verifies that cp will not include file attribute when the -@ flag "\ + "is not present." +log_onexit cleanup + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + typeset f=$(getitem $i $initfiles) + usr_exec $CP $f $TST_DIR + + testfiles=$($LS -R $TST_DIR/*) + tf=$(getitem $i $testfiles) + ls_attr=$($LS -@ $tf | $AWK '{print substr($1, 11, 1)}') + if [[ $ls_attr == "@" ]]; then + log_fail "cp of attribute should fail without " \ + "-@ or -p option" + fi + + (( i += 1 )) + done + + log_must cleanup +done + +log_pass "'cp' won't include file attribute passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_003_neg.ksh new file mode 100644 index 0000000000..576b60be29 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_cp_003_neg.ksh @@ -0,0 +1,118 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies that cp will not be able to include file attribute when +# attribute is unreadable (unless the user is root) +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. chmod all files'the attribute files to '000'. +# 3. Implement 'cp -@p' to files. +# 4. Verify attribute files are not existing for non-root user. +# + +verify_runnable "both" + +log_assert "Verifies that cp won't be able to include file attribute when " \ + "attribute is unreadable (except root)" +log_onexit cleanup + +function test_unreadable_attr +{ + typeset initfiles=$($LS -R $INI_DIR/*) + + typeset -i i=0 + while (( i < NUM_FILE )); do + typeset f=$(getitem $i $initfiles) + typeset -i j=0 + while (( j < NUM_ATTR )); do + # chmod all the attribute files to '000'. + usr_exec $RUNAT $f $CHMOD 000 attribute.$j + + (( j += 1 )) + done + + # + # Implement 'cp -@p' to the file whose attribute files + # models are '000'. + # + usr_exec $CP -@p $f $TST_DIR > /dev/null 2>&1 + + typeset testfiles=$($LS -R $TST_DIR/*) + typeset tf=$(getitem $i $testfiles) + typeset ls_attr=$(usr_exec $LS -@ $tf | \ + $AWK '{print substr($1, 11, 1)}') + + case $ZFS_ACL_CUR_USER in + root) + case $ls_attr in + @) + log_note "SUCCESS: root enable to cp attribute"\ + "when attribute files is unreadable" + break ;; + *) + log_fail "root should enable to cp attribute " \ + "when attribute files is unreadable" + break ;; + esac + ;; + $ZFS_ACL_STAFF1) + case $ls_attr in + @) + log_fail "non-root shouldn't enable to cp " \ + "attribute when attribute files is " \ + "unreadable." + break ;; + *) + log_note "SUCCESS: non-root doesn't enable to "\ + "cp attribute when attribute files is "\ + "unreadable." + break ;; + esac + ;; + *) + esac + + + (( i += 1 )) + done +} + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + test_unreadable_attr + + log_must cleanup +done + +log_pass "'cp -@p' won't include file attribute passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_find_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_find_001_pos.ksh new file mode 100644 index 0000000000..c49c7f8de7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_find_001_pos.ksh @@ -0,0 +1,81 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies ability to find files with attribute with -xattr flag and using +# "-exec runat ls". +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Verify all the specified files can be found with '-xattr', +# 3. Verify all the attribute files can be found with '-exec runat ls' +# + +verify_runnable "both" + +log_assert "Verifies ability to find files with attribute with" \ + "-xattr flag and using '-exec runat ls'" +log_onexit cleanup + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + initfiles=$($LS -R $INI_DIR/*) + + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + ff=$(usr_exec $FIND $INI_DIR -type f -name ${f##*/} \ + -xattr -print) + if [[ $ff != $f ]]; then + log_fail "find file containing attribute fail." + else + log_note "find $f by '-xattr'." + fi + + typeset -i j=0 + while (( j < NUM_ATTR )); do + typeset af=attribute.$j + fa=$(usr_exec $FIND $INI_DIR -type f -name ${f##*/} \ + -xattr -exec runat {} ls $af \\\;) + if [[ $fa != $af ]]; then + log_fail "find file attribute fail" + fi + (( j += 1 )) + done + (( i += 1 )) + log_note "find all attribute files of $f" + done + + log_must cleanup +done + +log_pass "find files with -xattr passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_find_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_find_002_neg.ksh new file mode 100644 index 0000000000..9f68c5022b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_find_002_neg.ksh @@ -0,0 +1,87 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies ability to find files with attribute with -xattr flag and using +# "-exec runat ls". +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Delete all the attribute files. +# 2. Verify all the specified files can not be found with '-xattr', +# 3. Verify all the attribute files can not be found with '-exec runat ls' +# + +verify_runnable "both" + +log_assert "verifies -xattr doesn't include files without " \ + "attribute and using '-exec runat ls'" +log_onexit cleanup + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + usr_exec $RUNAT $f $RM attribute* + (( i += 1 )) + done + + i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + ff=$(usr_exec $FIND $INI_DIR -type f -name ${f##*/} \ + -xattr -print) + if [[ $ff == $f ]]; then + log_fail "find not containing attribute should fail." + fi + + typeset -i j=0 + while (( j < NUM_ATTR )); do + fa=$(usr_exec $FIND $INI_DIR -type f -name ${f##*/} \ + -xattr -exec $RUNAT {} $LS attribute.$j \\\;) + if [[ $fa == attribute.$j ]]; then + log_fail "find file attribute should fail." + fi + (( j += 1 )) + done + log_note "Failed to find $f and its attribute file as expected." + + (( i += 1 )) + done + + log_must cleanup +done + +log_pass "find files which have no attrabute files with -xattr passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_ls_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_ls_001_pos.ksh new file mode 100644 index 0000000000..728b6a764c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_ls_001_pos.ksh @@ -0,0 +1,68 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies that ls displays @ in the file permissions using ls -@ +# for files with attribute. +# +# STRATEGY: +# 1. Create files with attribute files in directory A. +# 2. Verify 'ls -l' can display @ in file permissions. +# + +verify_runnable "both" + +log_assert "Verifies that ls displays @ in the file permissions using ls -@ " \ + "for files with attribute." +log_onexit cleanup + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + ls_attr=$(usr_exec $LS -@ $f | $AWK '{print substr($1, 11, 1)}') + if [[ $ls_attr != "@" ]]; then + log_fail "ls -@ $f with attribute should success." + else + log_note "ls -@ $f with attribute success." + fi + + (( i += 1 )) + done + + log_must cleanup +done + +log_pass "ls display @ in file permission passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_ls_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_ls_002_neg.ksh new file mode 100644 index 0000000000..58582da69e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_ls_002_neg.ksh @@ -0,0 +1,69 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies that ls doesn't display @ in the file permissions using ls -@ +# for files without attribute. +# +# STRATEGY: +# 1. Create files with attribute files in directory A. +# 2. Removed all attribute files. +# 3. Verify 'ls -l' can't display @ in file permission. +# + +verify_runnable "both" + +log_assert "Verifies that ls doesn't display @ in the file " \ + "permissions using ls -@ for files without attribute." +log_onexit cleanup + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + initfiles=$($LS -R $INI_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $initfiles) + log_must usr_exec $RUNAT $f $RM attribute* + + ls_attr=$(usr_exec $LS -l $f | $AWK '{print substr($1, 11, 1)}') + if [[ $ls_attr == "@" ]]; then + log_fail "ls with attribute shouldn't success." + fi + + (( i += 1 )) + done + + log_must cleanup +done + +log_pass "ls doesn't display @ in file permissions passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_mv_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_mv_001_pos.ksh new file mode 100644 index 0000000000..d975d7dfaa --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_mv_001_pos.ksh @@ -0,0 +1,67 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies that mv will include file attribute. +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Save all files and their attribute files cksum value +# 3. Move them to another directory B. +# 4. Calculate all the files and attribute files cksum +# 5. Verify all the cksum are identical +# + +verify_runnable "both" + +log_assert "Verifies that mv will include file attribute." +log_onexit cleanup + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must usr_exec $MV $INI_DIR/* $TST_DIR + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "mv file include attribute passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pack_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pack_001_pos.ksh new file mode 100644 index 0000000000..c09a990619 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pack_001_pos.ksh @@ -0,0 +1,72 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies that pack will keep file attribute intact afterthe file is +# packed and unpacked. +# +# STRATEGY: +# 1. In directory A, create several files and add attribute files for them +# 2. Save all files and their attribute files cksum value, then pack +# all the files. +# 3. Move them to another directory B. +# 4. Unpack them and calculate all the files and attribute files cksum +# 5. Verify all the cksum are identical +# + +verify_runnable "both" + +log_assert "Verifies that pack will keep file attribute intact after the file "\ + "is packed and unpacked" +log_onexit cleanup + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must eval "usr_exec $PACK -f $INI_DIR/* > /dev/null 2>&1" + log_must usr_exec $MV $INI_DIR/* $TST_DIR + log_must eval "usr_exec $UNPACK $TST_DIR/* > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "pack/unpack test passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_001_pos.ksh new file mode 100644 index 0000000000..2b2929cdf4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_001_pos.ksh @@ -0,0 +1,84 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify directories include attribute in pax archive and restore with pax +# should succeed. +# +# STRATEGY: +# 1. Use mktree create a set of directories in directory A. +# 2. Enter into directory A and record all directory information. +# 3. pax all the files to directory B. +# 4. Then pax the pax file to directory C. +# 5. Record all the directories informat in derectory C. +# 6. Verify the two records should be identical. +# + +verify_runnable "both" + +log_assert "Verify include attribute in pax archive and restore with pax " \ + "should succeed." +log_onexit cleanup + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + [[ ! -d $INI_DIR ]] && log_must usr_exec $MKDIR -m 777 -p $INI_DIR + log_must usr_exec $MKTREE -b $INI_DIR -l 6 -d 2 -f 2 + + # + # Enter into initial directory and record all directory information, + # then pax all the files to $TMP_DIR/files.pax. + # + [[ ! -d $TMP_DIR ]] && log_must usr_exec $MKDIR $TMP_DIR + initout=$TMP_DIR/initout.$$ + paxout=$TMP_DIR/files.pax + + cd $INI_DIR + log_must eval "record_cksum $INI_DIR $initout > /dev/null 2>&1" + log_must eval "usr_exec $PAX -w -@ -f $paxout * > /dev/null 2>&1" + + # + # Enter into test directory and pax $TMP_DIR/files.pax to current + # directory. Record all directory information and compare with initial + # directory record. + # + [[ ! -d $TST_DIR ]] && log_must usr_exec $MKDIR -m 777 $TST_DIR + testout=$TMP_DIR/testout.$$ + cd $TST_DIR + log_must eval "usr_exec $PAX -r -@ -f $paxout > /dev/null 2>&1" + log_must eval "record_cksum $TST_DIR $testout > /dev/null 2>&1" + + log_must usr_exec $DIFF $initout $testout + + log_must cleanup +done + +log_pass "Directories pax archive and restre with pax passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_002_pos.ksh new file mode 100644 index 0000000000..eda3a6ec2c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_002_pos.ksh @@ -0,0 +1,83 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify directories which include attribute in pax archive and restore +# with tar should succeed. +# +# STRATEGY: +# 1. Use mktree create a set of directories in directory A. +# 2. Enter into directory A and record all directory information. +# 3. pax all the files to directory B. +# 4. Then tar the pax file to directory C. +# 5. Record all the directories informat in derectory C. +# 6. Verify the two records should be identical. +# + +verify_runnable "both" + +log_assert "Verify include attribute in pax archive and restore with tar " \ + "should succeed." +log_onexit cleanup + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + [[ ! -d $INI_DIR ]] && log_must usr_exec $MKDIR -m 777 $INI_DIR + log_must usr_exec $MKTREE -b $INI_DIR -l 6 -d 2 -f 2 + + # + # Enter into initial directory and record all directory information, + # then pax all the files to $TMP_DIR/files.pax. + # + [[ ! -d $TMP_DIR ]] && log_must usr_exec $MKDIR -m 777 $TMP_DIR + initout=$TMP_DIR/initout.$$ + paxout=$TMP_DIR/files.tar + cd $INI_DIR + log_must eval "record_cksum $INI_DIR $initout > /dev/null 2>&1" + log_must eval "usr_exec $PAX -w -x ustar -@ -f $paxout *>/dev/null 2>&1" + + # + # Enter into test directory and tar $TMP_DIR/files.pax to current + # directory. Record all directory information and compare with initial + # directory record. + # + [[ ! -d $TST_DIR ]] && log_must usr_exec $MKDIR -m 777 $TST_DIR + testout=$TMP_DIR/testout.$$ + cd $TST_DIR + log_must eval "usr_exec $TAR xpf@ $paxout > /dev/null 2>&1" + log_must eval "record_cksum $TST_DIR $testout > /dev/null 2>&1" + + log_must usr_exec $DIFF $initout $testout + + log_must cleanup +done + +log_pass "Directories pax archive and restore with pax passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_003_pos.ksh new file mode 100644 index 0000000000..8936c67212 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_003_pos.ksh @@ -0,0 +1,78 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify directories which include attribute in pax archive and restore +# with cpio should succeed. +# +# STRATEGY: +# 1. Create several files in directory A. +# 2. Enter into directory A and record all directory cksum. +# 3. pax all the files to directory B. +# 4. Then cpio the pax file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be identical. +# + +verify_runnable "both" + +log_assert "Verify include attribute in pax archive and restore with cpio " \ + "should succeed." +log_onexit cleanup + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + [[ ! -d $INI_DIR ]] && log_must usr_exec $MKDIR -m 777 -p $INI_DIR + log_must usr_exec $MKTREE -b $INI_DIR -l 6 -d 2 -f 2 + + initout=$TMP_DIR/initout.$$ + paxout=$TMP_DIR/files.cpio + cd $INI_DIR + log_must eval "record_cksum $INI_DIR $initout > /dev/null 2>&1" + log_must eval "usr_exec $PAX -w -x cpio -@ -f $paxout * >/dev/null 2>&1" + + # + # Enter into test directory and cpio $TMP_DIR/files.pax to current + # directory. Record all directory information and compare with initial + # directory record. + # + [[ ! -d $TST_DIR ]] && log_must usr_exec $MKDIR -m 777 $TST_DIR + testout=$TMP_DIR/testout.$$ + cd $TST_DIR + log_must eval "usr_exec $CPIO -ivd@ < $paxout" > /dev/null 2>&1 + log_must eval "record_cksum $TST_DIR $testout > /dev/null 2>&1" + + log_must usr_exec $DIFF $initout $testout + + log_must cleanup +done + +log_pass "Directories pax archive and restore with cpio passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_004_pos.ksh new file mode 100644 index 0000000000..8f7442f6b8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_004_pos.ksh @@ -0,0 +1,84 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify files include attribute in pax archive and restore with pax +# should succeed. +# +# STRATEGY: +# 1. Create several files which contains contribute files in directory A. +# 2. Enter into directory A and record all files cksum. +# 3. pax all the files to directory B. +# 4. Then pax the pax file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be identical. +# + +verify_runnable "both" + +log_assert "Verify files include attribute in pax archive and restore with pax " \ + "should succeed." +log_onexit cleanup + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + # + # Enter into initial directory and record all files cksum, + # then pax all the files to $TMP_DIR/files.pax. + # + paxout=$TMP_DIR/files.pax + cd $INI_DIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must eval "usr_exec $PAX -w -@ -f $paxout * > /dev/null 2>&1" + + # + # Enter into test directory and pax $TMP_DIR/files.pax to current + # directory. Record all directory information and compare with initial + # directory record. + # + cd $TST_DIR + log_must eval "usr_exec $PAX -r -@ -f $paxout > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "Files pax archive and restre with pax passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_005_pos.ksh new file mode 100644 index 0000000000..3079cf9e8b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_005_pos.ksh @@ -0,0 +1,91 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify files include attribute in cpio archive and restore with cpio +# should succeed. +# +# STRATEGY: +# 1. Create several files which contains contribute files in directory A. +# 2. Enter into directory A and record all files cksum. +# 3. pax all the files to directory B. +# 4. Then pax the pax file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be identical. +# + +verify_runnable "both" + +log_assert "Verify files include attribute in cpio archive and restore with " \ + "cpio should succeed." +log_onexit cleanup + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + # + # Enter into initial directory and record all files cksum, + # then pax all the files to $TMP_DIR/files.pax. + # + paxout=$TMP_DIR/files.cpio + cd $INI_DIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must eval "usr_exec $PAX -w -x cpio -@ -f $paxout * >/dev/null 2>&1" + + # + # Enter into test directory and pax $TMP_DIR/files.cpio to current + # directory. Record all directory information and compare with initial + # directory record. + # + cd $TST_DIR + log_must eval "usr_exec $PAX -r -x cpio -@ -f $paxout > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must usr_exec $RM -rf * + log_must eval "usr_exec $CPIO -iv@ < $paxout > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "Files 'pax cpio' archive and restre with 'pax cpio' passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_006_pos.ksh new file mode 100644 index 0000000000..c713c03261 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_pax_006_pos.ksh @@ -0,0 +1,91 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verify files include attribute in tar archive and restore with tar +# should succeed. +# +# STRATEGY: +# 1. Create several files which contains contribute files in directory A. +# 2. Enter into directory A and record all files cksum. +# 3. 'pax ustar' all the files to directory B. +# 4. Then 'pax ustar' the pax file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be identical. +# + +verify_runnable "both" + +log_assert "Verify files include attribute in tar archive and restore with " \ + "tar should succeed." +log_onexit cleanup + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + # + # Enter into initial directory and record all files cksum, + # then pax all the files to $TMP_DIR/files.pax. + # + paxout=$TMP_DIR/files.tar + cd $INI_DIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must eval "usr_exec $PAX -w -x ustar -@ -f $paxout *>/dev/null 2>&1" + + # + # Enter into test directory and pax $TMP_DIR/files.tar to current + # directory. Record all directory information and compare with initial + # directory record. + # + cd $TST_DIR + log_must eval "usr_exec $PAX -r -x ustar -@ -f $paxout > /dev/null 2>&1" + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must usr_exec $RM -rf * + log_must usr_exec $TAR xf@ $paxout + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_must compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "Files 'pax tar' archive and restre with 'pax tar' passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_tar_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_tar_001_pos.ksh new file mode 100644 index 0000000000..d9ea49b9ff --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_tar_001_pos.ksh @@ -0,0 +1,82 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies that tar will include file attribute when @ flag is present. +# +# STRATEGY: +# 1. Use mktree create a set of directories in directory A. +# 2. Enter into directory A and record all directory information. +# 3. tar all the files to directory B. +# 4. Then tar the tar file to directory C. +# 5. Record all the directories informat in derectory C. +# 6. Verify the two records should be identical. +# + +verify_runnable "both" + +log_assert "Verifies that tar will include file attribute when @ flag is " \ + "present." +log_onexit cleanup + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + [[ ! -d $INI_DIR ]] && $MKDIR -m 777 -p $INI_DIR + log_must usr_exec $MKTREE -b $INI_DIR -l 5 -d 2 -f 2 + + # + # Enter into initial directory and record all directory information, + # then tar all the files to $TMP_DIR/files.tar. + # + [[ ! -d $TMP_DIR ]] && usr_exec $MKDIR $TMP_DIR + initout=$TMP_DIR/initout.$$ + tarout=$TMP_DIR/files.tar + cd $INI_DIR + log_must record_cksum $INI_DIR $initout + log_must usr_exec $TAR cpf@ $tarout * + + # + # Enter into test directory and tar $TMP_DIR/files.tar to current + # directory. Record all directory information and compare with initial + # directory record. + # + [[ ! -d $TST_DIR ]] && $MKDIR -m 777 $TST_DIR + testout=$TMP_DIR/testout.$$ + cd $TST_DIR + log_must usr_exec $TAR xpf@ $tarout + log_must record_cksum $TST_DIR $testout + + log_must usr_exec $DIFF $initout $testout + + log_must cleanup +done + +log_pass "Verify tar with @ passed." diff --git a/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_tar_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_tar_002_neg.ksh new file mode 100644 index 0000000000..eabb85c341 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/acl/trivial/zfs_acl_tar_002_neg.ksh @@ -0,0 +1,98 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/acl/acl_common.kshlib + +# +# DESCRIPTION: +# Verifies that tar will not include files attribute when @ flag is not +# present. +# +# STRATEGY: +# 1. Create several files with attribute files. +# 2. Enter into directory A and record all files cksum +# 3. tar all the files to directory B. +# 4. Then tar the tar file to directory C. +# 5. Record all the files cksum in derectory C. +# 6. Verify the two records should be not identical. +# + +verify_runnable "both" + +log_assert "Verifies that tar will not include files attribute when @ flag is "\ + "not present" +log_onexit cleanup + +set -A BEFORE_FCKSUM +set -A BEFORE_ACKSUM +set -A AFTER_FCKSUM +set -A AFTER_ACKSUM + +for user in root $ZFS_ACL_STAFF1; do + log_must set_cur_usr $user + + log_must create_files $TESTDIR + + # + # Enter into initial directory and record all directory information, + # then tar all the files to $TMP_DIR/files.tar. + # + tarout=$TMP_DIR/files.tar + cd $INI_DIR + log_must cksum_files $INI_DIR BEFORE_FCKSUM BEFORE_ACKSUM + log_must usr_exec $TAR cpf $tarout * + + # + # Enter into test directory and tar $TMP_DIR/files.tar to current + # directory. Record all directory information and compare with initial + # directory record. + # + cd $TST_DIR + log_must usr_exec $CP $tarout $TST_DIR + log_must usr_exec $TAR xpf $tarout + + testfiles=$($LS -R $TST_DIR/*) + typeset -i i=0 + while (( i < NUM_FILE )); do + f=$(getitem $i $testfiles) + ls_attr=$($LS -@ $f | $AWK '{print substr($1, 11, 1)}') + if [[ $ls_attr == "@" ]]; then + log_fail "extraction of attribute successful w/ -@ flag" + fi + + (( i += 1 )) + done + + log_must cksum_files $TST_DIR AFTER_FCKSUM AFTER_ACKSUM + + log_must compare_cksum BEFORE_FCKSUM AFTER_FCKSUM + log_mustnot compare_cksum BEFORE_ACKSUM AFTER_ACKSUM + + log_must cleanup +done + +log_pass "Verify tar without @ passed." diff --git a/usr/src/test/zfs-tests/tests/functional/atime/Makefile b/usr/src/test/zfs-tests/tests/functional/atime/Makefile new file mode 100644 index 0000000000..0fd91c006d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/atime/Makefile @@ -0,0 +1,45 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/atime + +PROGS = cleanup \ + setup \ + atime_001_pos \ + atime_002_neg + +FILES = atime.cfg \ + atime_common.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: %.ksh + $(INS.rename) + +$(TESTDIR)/%: % + $(INS.file) diff --git a/usr/src/test/zfs-tests/tests/functional/atime/atime.cfg b/usr/src/test/zfs-tests/tests/functional/atime/atime.cfg new file mode 100644 index 0000000000..c1532eb47f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/atime/atime.cfg @@ -0,0 +1,30 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +export TESTCLONE=testclone$$ +export TESTSNAP=testsnap$$ + +export TESTFILE=testfile diff --git a/usr/src/test/zfs-tests/tests/functional/atime/atime_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/atime/atime_001_pos.ksh new file mode 100644 index 0000000000..891e22102e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/atime/atime_001_pos.ksh @@ -0,0 +1,66 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/atime/atime_common.kshlib + +# +# DESCRIPTION: +# When atime=on, verify the access time for files is updated when read. It +# is available to fs and clone. To snapshot, it is unavailable. +# +# STRATEGY: +# 1. Create pool and fs. +# 2. Create '$TESTFILE' for fs. +# 3. Create snapshot and clone. +# 4. Setting atime=on on datasets except snapshot, and read '$TESTFILE'. +# 5. Expect the access time is updated on datasets except snapshot. +# + +verify_runnable "both" + +log_assert "Setting atime=on, the access time for files is updated when read." +log_onexit cleanup + +# +# Create $TESTFILE, snapshot and clone. +# +setup_snap_clone + +for dst in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCLONE $TESTPOOL/$TESTFS@$TESTSNAP +do + typeset mtpt=$(get_prop mountpoint $dst) + + if [[ $dst == $TESTPOOL/$TESTFS@$TESTSNAP ]]; then + mtpt=$(snapshot_mountpoint $dst) + log_mustnot check_atime_updated $mtpt/$TESTFILE + else + log_must $ZFS set atime=on $dst + log_must check_atime_updated $mtpt/$TESTFILE + fi +done + +log_pass "Verify the property atime=on passed." diff --git a/usr/src/test/zfs-tests/tests/functional/atime/atime_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/atime/atime_002_neg.ksh new file mode 100644 index 0000000000..06a35cc117 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/atime/atime_002_neg.ksh @@ -0,0 +1,67 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/atime/atime_common.kshlib + +# +# DESCRIPTION: +# When atime=off, verify the access time for files is not updated when read. +# It is available to pool, fs snapshot and clone. +# +# STRATEGY: +# 1. Create pool, fs. +# 2. Create '$TESTFILE' for fs. +# 3. Create snapshot and clone. +# 4. Setting atime=off on dataset and read '$TESTFILE'. +# 5. Verify the access time is not updated. +# + +verify_runnable "both" + +log_assert "Setting atime=off, the access time for files will not be updated \ + when read." +log_onexit cleanup + +# +# Create $TESTFILE, snapshot and clone. +# +setup_snap_clone + +for dst in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCLONE $TESTPOOL/$TESTFS@$TESTSNAP +do + typeset mtpt=$(get_prop mountpoint $dst) + + if [[ $dst == $TESTPOOL/$TESTFS@$TESTSNAP ]]; then + mtpt=$(snapshot_mountpoint $dst) + else + log_must $ZFS set atime=off $dst + fi + + log_mustnot check_atime_updated $mtpt/$TESTFILE +done + +log_pass "Verify the property atime=off passed." diff --git a/usr/src/test/zfs-tests/tests/functional/atime/atime_common.kshlib b/usr/src/test/zfs-tests/tests/functional/atime/atime_common.kshlib new file mode 100644 index 0000000000..5e0cde90f9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/atime/atime_common.kshlib @@ -0,0 +1,67 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/atime/atime.cfg +. $STF_SUITE/include/libtest.shlib + +# +# Check if the access time for specified file is updated. +# +# $1 Given an absolute path to a file name +# +# Return value: +# 0 -> The access time is updated. +# 1 -> The access time is not updated. +# +function check_atime_updated +{ + typeset filename=$1 + + typeset before=$($LS -Eu $filename | $AWK '{print $7}') + log_must $CAT $filename + typeset after=$($LS -Eu $filename | $AWK '{print $7}') + + if [[ $before != $after ]]; then + return 0 + else + return 1 + fi +} + +function setup_snap_clone +{ + # Create two file to verify snapshot. + log_must $TOUCH $TESTDIR/$TESTFILE + + create_snapshot $TESTPOOL/$TESTFS $TESTSNAP + create_clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE +} + +function cleanup +{ + destroy_clone $TESTPOOL/$TESTCLONE + destroy_snapshot $TESTPOOL/$TESTFS@$TESTSNAP +} diff --git a/usr/src/test/zfs-tests/tests/functional/atime/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/atime/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/atime/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/atime/setup.ksh b/usr/src/test/zfs-tests/tests/functional/atime/setup.ksh new file mode 100644 index 0000000000..ed9e19b7cc --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/atime/setup.ksh @@ -0,0 +1,31 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/bootfs/Makefile b/usr/src/test/zfs-tests/tests/functional/bootfs/Makefile new file mode 100644 index 0000000000..8fa874cc40 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/bootfs/Makefile @@ -0,0 +1,46 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/bootfs + +PROGS = bootfs_001_pos \ + bootfs_002_neg \ + bootfs_003_pos \ + bootfs_004_neg \ + bootfs_005_neg \ + bootfs_006_pos \ + bootfs_007_neg \ + bootfs_008_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%.cfg: %.cfg + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_001_pos.ksh new file mode 100644 index 0000000000..5fb22e3b69 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_001_pos.ksh @@ -0,0 +1,75 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# Valid datasets are accepted as bootfs property values +# +# STRATEGY: +# 1. Create a set of datasets in a test pool +# 2. Try setting them as boot filesystems +# + +verify_runnable "global" + +function cleanup { + if poolexists $TESTPOOL ; then + log_must $ZPOOL destroy $TESTPOOL + fi + + if [[ -f $VDEV ]]; then + log_must $RM -f $VDEV + fi +} + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_assert "Valid datasets are accepted as bootfs property values" +log_onexit cleanup + +typeset VDEV=/bootfs_001_pos_a.$$.dat + +log_must $MKFILE 400m $VDEV +create_pool "$TESTPOOL" "$VDEV" +log_must $ZFS create $TESTPOOL/$TESTFS + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap +log_must $ZFS clone $TESTPOOL/$TESTFS@snap $TESTPOOL/clone + +log_must $ZPOOL set bootfs=$TESTPOOL/$TESTFS $TESTPOOL +log_must $ZPOOL set bootfs=$TESTPOOL/clone $TESTPOOL + +log_must $ZFS promote $TESTPOOL/clone +log_must $ZPOOL set bootfs=$TESTPOOL/clone $TESTPOOL +log_pass "Valid datasets are accepted as bootfs property values" diff --git a/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_002_neg.ksh new file mode 100644 index 0000000000..93800dccc5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_002_neg.ksh @@ -0,0 +1,82 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# Invalid datasets are rejected as boot property values +# +# STRATEGY: +# +# 1. Create a snapshot and a zvol +# 2. Verify that we can't set the bootfs to those datasets +# + +verify_runnable "global" + +function cleanup { + if snapexists $TESTPOOL/$TESTFS@snap + then + $ZFS destroy $TESTPOOL/$TESTFS@snap + fi + if datasetexists $TESTPOOL/$TESTFS + then + log_must $ZFS destroy $TESTPOOL/$TESTFS + fi + if datasetexists $TESTPOOL/vol + then + log_must $ZFS destroy $TESTPOOL/vol + fi + if poolexists $TESTPOOL + then + log_must $ZPOOL destroy $TESTPOOL + fi +} + + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_assert "Invalid datasets are rejected as boot property values" +log_onexit cleanup + +DISK=${DISKS%% *} + +log_must $ZPOOL create $TESTPOOL $DISK +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snap +log_must $ZFS create -V 10m $TESTPOOL/vol + +log_mustnot $ZPOOL set bootfs=$TESTPOOL/$TESTFS@snap $TESTPOOL +log_mustnot $ZPOOL set bootfs=$TESTPOOL/vol $TESTPOOL + +log_pass "Invalid datasets are rejected as boot property values" diff --git a/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_003_pos.ksh new file mode 100644 index 0000000000..b16258901f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_003_pos.ksh @@ -0,0 +1,82 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# Valid pool names are accepted +# +# STRATEGY: +# 1. Using a list of valid pool names +# 2. Create a filesystem in that pool +# 2. Verify we can set the bootfs to that filesystem +# + +verify_runnable "global" + +set -A pools "pool.$$" "pool123" "mypool" + +function cleanup { + if poolexists $POOL ; then + log_must $ZPOOL destroy $POOL + fi + $RM /bootfs_003.$$.dat +} + + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_onexit cleanup + +log_assert "Valid pool names are accepted by zpool set bootfs" +$MKFILE 64m /bootfs_003.$$.dat + +typeset -i i=0; + +while [ $i -lt "${#pools[@]}" ] +do + POOL=${pools[$i]} + log_must $ZPOOL create $POOL /bootfs_003.$$.dat + log_must $ZFS create $POOL/$TESTFS + + log_must $ZPOOL set bootfs=$POOL/$TESTFS $POOL + RES=$($ZPOOL get bootfs $POOL | $TAIL -1 | $AWK '{print $3}' ) + if [ $RES != "$POOL/$TESTFS" ] + then + log_fail "Expected $RES == $POOL/$TESTFS" + fi + log_must $ZPOOL destroy $POOL + i=$(( $i + 1 )) +done + +log_pass "Valid pool names are accepted by zpool set bootfs" diff --git a/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_004_neg.ksh new file mode 100644 index 0000000000..b9166db82f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_004_neg.ksh @@ -0,0 +1,91 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# Invalid pool names are rejected by zpool set bootfs +# +# STRATEGY: +# 1. Try to set bootfs on some non-existent pools +# +# +# + +verify_runnable "global" + +set -A pools "pool//$$" "pool%d123" "mirror" "c0t0d0s0" "pool*23*" "*po!l" \ + "%s££%^" + +function cleanup { + if poolexists $POOL; then + log_must $ZPOOL destroy $POOL + fi + $RM /bootfs_004.$$.dat +} + + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +log_assert "Invalid pool names are rejected by zpool set bootfs" +log_onexit cleanup + +# here, we build up a large string and add it to the list of pool names +# a word to the ksh-wary, ${#array[@]} gives you the +# total number of entries in an array, so array[${#array[@]}] +# will index the last entry+1, ksh arrays start at index 0. +COUNT=0 +while [ $COUNT -le 1025 ] +do + bigname="${bigname}o" + COUNT=$(( $COUNT + 1 )) +done +pools[${#pools[@]}]="$bigname" + + + +$MKFILE 64m /bootfs_004.$$.dat + +typeset -i i=0; + +while [ $i -lt "${#pools[@]}" ] +do + POOL=${pools[$i]}/$TESTFS + log_mustnot $ZPOOL create $POOL /bootfs_004.$$.dat + log_mustnot $ZFS create $POOL/$TESTFS + log_mustnot $ZPOOL set bootfs=$POOL/$TESTFS $POOL + + i=$(( $i + 1 )) +done + +log_pass "Invalid pool names are rejected by zpool set bootfs" diff --git a/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_005_neg.ksh new file mode 100644 index 0000000000..fb7f084312 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_005_neg.ksh @@ -0,0 +1,79 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +# +# DESCRIPTION: +# +# Boot properties cannot be set on pools with older versions +# +# STRATEGY: +# 1. Copy and import some pools of older versions +# 2. Create a filesystem on each +# 3. Verify that zpool set bootfs fails on each +# + +verify_runnable "global" + +function cleanup { + + # + # we need destroy pools that created on top of $TESTPOOL first + # + typeset pool_name + for config in $CONFIGS; do + pool_name=$(eval $ECHO \$ZPOOL_VERSION_${config}_NAME) + if poolexists $pool_name; then + log_must $ZPOOL destroy $pool_name + fi + done + + if poolexists $TESTPOOL ; then + log_must $ZPOOL destroy $TESTPOOL + fi +} + +log_assert "Boot properties cannot be set on pools with older versions" + +# These are configs from zpool_upgrade.cfg - see that file for more info. +CONFIGS="1 2 3" + +log_onexit cleanup +log_must $ZPOOL create -f $TESTPOOL $DISKS + +for config in $CONFIGS +do + create_old_pool $config + POOL_NAME=$(eval $ECHO \$ZPOOL_VERSION_${config}_NAME) + log_must $ZFS create $POOL_NAME/$TESTFS + log_mustnot $ZPOOL set bootfs=$POOL_NAME/$TESTFS $POOL_NAME + log_must destroy_upgraded_pool $config +done + +log_pass "Boot properties cannot be set on pools with older versions" diff --git a/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_006_pos.ksh new file mode 100644 index 0000000000..2af3e7b0cf --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_006_pos.ksh @@ -0,0 +1,142 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# Pools of correct vdev types accept boot property +# +# STRATEGY: +# 1. create pools of each vdev type (raid, raidz, raidz2, mirror + hotspares) +# 2. verify we can set bootfs on each pool type according to design +# + +verify_runnable "global" + + +$ZPOOL set 2>&1 | $GREP bootfs > /dev/null +if [ $? -ne 0 ] +then + log_unsupported "bootfs pool property not supported on this release." +fi + +VDEV1=/bootfs_006_pos_a.$$.dat +VDEV2=/bootfs_006_pos_b.$$.dat +VDEV3=/bootfs_006_pos_c.$$.dat +VDEV4=/bootfs_006_pos_d.$$.dat + +function verify_bootfs { # $POOL + POOL=$1 + log_must $ZFS create $POOL/$TESTFS + + log_must $ZPOOL set bootfs=$POOL/$TESTFS $POOL + VAL=$($ZPOOL get bootfs $POOL | $TAIL -1 | $AWK '{print $3}' ) + if [ $VAL != "$POOL/$TESTFS" ] + then + log_must $ZPOOL status -v $POOL + log_fail \ + "set/get failed on $POOL - expected $VAL == $POOL/$TESTFS" + fi + log_must $ZPOOL destroy $POOL +} + +function verify_no_bootfs { # $POOL + POOL=$1 + log_must $ZFS create $POOL/$TESTFS + log_mustnot $ZPOOL set bootfs=$POOL/$TESTFS $POOL + VAL=$($ZPOOL get bootfs $POOL | $TAIL -1 | $AWK '{print $3}' ) + if [ $VAL == "$POOL/$TESTFS" ] + then + log_must $ZPOOL status -v $POOL + log_fail "set/get unexpectedly failed $VAL != $POOL/$TESTFS" + fi + log_must $ZPOOL destroy $POOL +} + +function cleanup { + if poolexists $TESTPOOL + then + log_must $ZPOOL destroy $TESTPOOL + fi + log_must $RM $VDEV1 $VDEV2 $VDEV3 $VDEV4 +} + +log_assert "Pools of correct vdev types accept boot property" + + + +log_onexit cleanup +log_must $MKFILE 64m $VDEV1 $VDEV2 $VDEV3 $VDEV4 + + +## the following configurations are supported bootable pools + +# normal +log_must $ZPOOL create $TESTPOOL $VDEV1 +verify_bootfs $TESTPOOL + +# normal + hotspare +log_must $ZPOOL create $TESTPOOL $VDEV1 spare $VDEV2 +verify_bootfs $TESTPOOL + +# mirror +log_must $ZPOOL create $TESTPOOL mirror $VDEV1 $VDEV2 +verify_bootfs $TESTPOOL + +# mirror + hotspare +log_must $ZPOOL create $TESTPOOL mirror $VDEV1 $VDEV2 spare $VDEV3 +verify_bootfs $TESTPOOL + +## the following configurations are not supported as bootable pools + +# stripe +log_must $ZPOOL create $TESTPOOL $VDEV1 $VDEV2 +verify_no_bootfs $TESTPOOL + +# stripe + hotspare +log_must $ZPOOL create $TESTPOOL $VDEV1 $VDEV2 spare $VDEV3 +verify_no_bootfs $TESTPOOL + +# raidz +log_must $ZPOOL create $TESTPOOL raidz $VDEV1 $VDEV2 +verify_no_bootfs $TESTPOOL + +# raidz + hotspare +log_must $ZPOOL create $TESTPOOL raidz $VDEV1 $VDEV2 spare $VDEV3 +verify_no_bootfs $TESTPOOL + +# raidz2 +log_must $ZPOOL create $TESTPOOL raidz2 $VDEV1 $VDEV2 $VDEV3 +verify_no_bootfs $TESTPOOL + +# raidz2 + hotspare +log_must $ZPOOL create $TESTPOOL raidz2 $VDEV1 $VDEV2 $VDEV3 spare $VDEV4 +verify_no_bootfs $TESTPOOL + +log_pass "Pools of correct vdev types accept boot property" diff --git a/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_007_neg.ksh new file mode 100644 index 0000000000..a80f45ab98 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_007_neg.ksh @@ -0,0 +1,63 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# Setting bootfs on a pool which was configured with the whole disk +# (i.e. EFI) will fail +# +# STRATEGY: +# 1. create a pool with a whole disk +# 2. create a filesystem on this pool +# 3. verify we can not set bootfs on the filesystem we just created. +# + +verify_runnable "global" + +function cleanup { + if poolexists $TESTPOOL ; then + destroy_pool "$TESTPOOL" + fi +} + +log_onexit cleanup + +DISK=${DISKS%% *} +typeset EFI_BOOTFS=$TESTPOOL/efs +typeset assert_mesg="setting bootfs on a pool which was configured with the \ + whole disk will fail" + +log_assert $assert_mesg +create_pool "$TESTPOOL" "$DISK" +log_must $ZFS create $EFI_BOOTFS + +log_mustnot $ZPOOL set bootfs=$EFI_BOOTFS $TESTPOOL + +log_pass $assert_mesg diff --git a/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_008_neg.ksh new file mode 100644 index 0000000000..8951718abe --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/bootfs/bootfs_008_neg.ksh @@ -0,0 +1,78 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# setting bootfs on a dataset which has gzip compression enabled will fail +# +# STRATEGY: +# 1. create pools based on a valid vdev +# 2. create a filesytem on this pool and set the compression property to gzip1-9 +# 3. set the pool's bootfs property to filesystem we just configured which +# should fail +# + +verify_runnable "global" + +function cleanup { + if poolexists $TESTPOOL ; then + destroy_pool "$TESTPOOL" + fi + + if [[ -f $VDEV ]]; then + log_must $RM -f $VDEV + fi +} + +typeset assert_msg="setting bootfs on a dataset which has gzip \ + compression enabled will fail" + +typeset VDEV=/bootfs_008_neg_a.$$.dat +typeset COMP_FS=$TESTPOOL/COMP_FS + +log_onexit cleanup +log_assert $assert_msg + +log_must $MKFILE 300m $VDEV +log_must $ZPOOL create $TESTPOOL $VDEV +log_must $ZFS create $COMP_FS + +typeset -i i=0 +set -A gtype "gzip" "gzip-1" "gzip-2" "gzip-3" "gzip-4" "gzip-5" \ + "gzip-6" "gzip-7" "gzip-8" "gzip-9" + +while (( i < ${#gtype[@]} )); do + log_must $ZFS set compression=${gtype[i]} $COMP_FS + log_mustnot $ZPOOL set bootfs=$COMP_FS $TESTPOOL + log_must $ZFS set compression=off $COMP_FS + (( i += 1 )) +done + +log_pass $assert_msg diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/Makefile new file mode 100644 index 0000000000..26bbb478ae --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/Makefile @@ -0,0 +1,83 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root + +PROGS = cli_common.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +SUBDIRS = zdb \ + zfs \ + zfs_clone \ + zfs_copies \ + zfs_create \ + zfs_destroy \ + zfs_get \ + zfs_inherit \ + zfs_mount \ + zfs_promote \ + zfs_property \ + zfs_receive \ + zfs_rename \ + zfs_reservation \ + zfs_rollback \ + zfs_send \ + zfs_set \ + zfs_share \ + zfs_snapshot \ + zfs_unmount \ + zfs_unshare \ + zfs_upgrade \ + zpool \ + zpool_add \ + zpool_attach \ + zpool_clear \ + zpool_create \ + zpool_destroy \ + zpool_detach \ + zpool_expand \ + zpool_export \ + zpool_get \ + zpool_history \ + zpool_import \ + zpool_offline \ + zpool_online \ + zpool_remove \ + zpool_replace \ + zpool_scrub \ + zpool_set \ + zpool_status \ + zpool_upgrade + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/cli_common.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/cli_common.kshlib new file mode 100644 index 0000000000..06e794ed85 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/cli_common.kshlib @@ -0,0 +1,86 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# Get the checksum and size of the file. +# +function get_cksum # <file path> +{ + return $($CKSUM $1 | $AWK '{print $1 $2}') +} + +# +# Compare the check sum of target files with the original file +# + +function compare_cksum #<orig_data> <target_data1>...<target_datan> +{ + typeset orig_data=$1 + typeset orig_sum=$(get_cksum $orig_data) + typeset target_sum="" + typeset bad_data_list="" + typeset -i bad_count=0 + + shift + for data in $@; do + if [[ ! -e $data ]]; then + bad_data_list="$bad_data_list $data" + (( bad_count +=1 )) + continue + fi + + target_sum=$(get_cksum $data) + if [[ $target_sum != $orig_sum ]]; then + bad_data_list="$bad_data_list $data" + (( bad_count +=1 )) + fi + done + + [[ $bad_data_list != "" ]] && \ + log_fail "Data corruptions appear during send->receive." \ + "There are total $bad_count corruptions. They are:\n"\ + "$bad_data_list" +} + +# +# Check the received dataset exists or not +# +function receive_check #<dataset1>...<datasetn> +{ + typeset bad_rst_tgts="" + + for dataset in $@; do + ! datasetexists $dataset && \ + bad_rst_tgts="$bad_rst_tgts $dataset" + done + + if [[ $bad_rst_tgts != "" ]]; then + log_fail "Restoring fails. The specified datasets"\ + "$bad_rst_tgts are not being received." + fi +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zdb/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zdb/Makefile new file mode 100644 index 0000000000..32e23b89e9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zdb/Makefile @@ -0,0 +1,39 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zdb + +PROGS = zdb_001_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zdb/zdb_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zdb/zdb_001_neg.ksh new file mode 100644 index 0000000000..bf93693dc8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zdb/zdb_001_neg.ksh @@ -0,0 +1,73 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# A badly formed parameter passed to zdb(1) should +# return an error. +# +# STRATEGY: +# 1. Create an array containg bad zdb parameters. +# 2. For each element, execute the sub-command. +# 3. Verify it returns an error. +# + +verify_runnable "global" + +set -A args "create" "add" "destroy" "import fakepool" \ + "export fakepool" "create fakepool" "add fakepool" \ + "create mirror" "create raidz" \ + "create mirror fakepool" "create raidz fakepool" \ + "create raidz1 fakepool" "create raidz2 fakepool" \ + "create fakepool mirror" "create fakepool raidz" \ + "create fakepool raidz1" "create fakepool raidz2" \ + "add fakepool mirror" "add fakepool raidz" \ + "add fakepool raidz1" "add fakepool raidz2" \ + "add mirror fakepool" "add raidz fakepool" \ + "add raidz1 fakepool" "add raidz2 fakepool" \ + "setvprop" "blah blah" "-%" "--?" "-*" "-=" \ + "-a" "-f" "-g" "-h" "-j" "-k" "-m" "-n" "-o" "-p" "-p /tmp" \ + "-q" "-r" "-t" "-w" "-x" "-y" "-z" \ + "-D" "-E" "-G" "-H" "-I" "-J" "-K" "-M" \ + "-N" "-Q" "-R" "-S" "-T" "-V" "-W" "-Y" "-Z" + +log_assert "Execute zdb using invalid parameters." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZDB ${args[i]} + + ((i = i + 1)) +done + +log_pass "Badly formed zdb parameters fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/Makefile new file mode 100644 index 0000000000..01f933aafc --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/Makefile @@ -0,0 +1,43 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs + +PROGS = cleanup \ + setup \ + zfs_001_neg \ + zfs_002_pos \ + zfs_003_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/zfs_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/zfs_001_neg.ksh new file mode 100644 index 0000000000..bfcc864913 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/zfs_001_neg.ksh @@ -0,0 +1,72 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Try each zfs(1) sub-command without parameters to make sure +# it returns an error. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# + +verify_runnable "both" + + +set -A args "" "create" "create -s" "create -V" "create -s -V" \ + "destroy" "destroy -f" "destroy -r" "destroy -R" "destroy -rRf" \ + "snapshot" "snapshot -r" \ + "rollback" "rollback -r" "rollback -R" "rollback -f" "rollback -rRf" \ + "clone" "clone -p" "promote" "rename" "rename -p" "rename -r" "list blah" \ + "set" "get" "get -rHp" "get -o" "get -s" \ + "inherit" "inherit -r" "quota=" \ + "set reservation=" "set atime=" "set checksum=" "set compression=" \ + "set type=" "set creation=" "set used=" "set available=" "set referenced=" \ + "set compressratio=" "set mounted=" "set origin=" "set quota=" \ + "set reservation=" "set volsize=" " set volblocksize=" "set recordsize=" \ + "set mountpoint=" "set devices=" "set exec=" "set setuid=" "set readonly=" \ + "set zoned=" "set snapdir=" "set aclmode=" "set aclinherit=" \ + "set quota=blah" "set reservation=blah" "set atime=blah" "set checksum=blah" \ + "set compression=blah" \ + "upgrade blah" "mount blah" "mount -o" \ + "umount blah" "unmount" "unmount blah" "unmount -f" \ + "share" "unshare" "send" "send -i" "receive" "receive -d" "receive -vnF" \ + "recv" "recv -d" "recv -vnF" "allow" "unallow" \ + "blah blah" "-%" "--" "--?" "-*" "-=" + +log_assert "Badly-formed zfs sub-command should return an error." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZFS ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly formed zfs sub-commands fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/zfs_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/zfs_002_pos.ksh new file mode 100644 index 0000000000..31823d6e82 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/zfs_002_pos.ksh @@ -0,0 +1,106 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# With ZFS_ABORT set, all zfs commands should be able to abort and generate a +# core file. +# +# STRATEGY: +# 1. Create an array of zfs command +# 2. Execute each command in the array +# 3. Verify the command aborts and generate a core file +# + +verify_runnable "both" + +function cleanup +{ + unset ZFS_ABORT + + if [[ -d $corepath ]]; then + $RM -rf $corepath + fi + for ds in $fs1 $fs $ctr; do + if datasetexists $ds; then + log_must $ZFS destroy -rRf $ds + fi + done +} + +log_assert "With ZFS_ABORT set, all zfs commands can abort and generate a " \ + "core file." +log_onexit cleanup + +#preparation work for testing +corepath=$TESTDIR/core +if [[ -d $corepath ]]; then + $RM -rf $corepath +fi +log_must $MKDIR $corepath + +ctr=$TESTPOOL/$TESTCTR +log_must $ZFS create $ctr + +fs=$ctr/$TESTFS +fs1=$ctr/$TESTFS1 +snap=$fs@$TESTSNAP +clone=$ctr/$TESTCLONE +streamf=$corepath/s.$$ + +typeset cmds=("create $fs" "list $fs" "snapshot $snap" "set snapdir=hidden $fs" \ + "get snapdir $fs" "rollback $snap" "inherit snapdir $fs" \ + "rename $fs $fs-new" "rename $fs-new $fs" "unmount $fs" \ + "mount $fs" "share $fs" "unshare $fs" "send $snap \>$streamf" \ + "receive $fs1 \<$streamf" "clone $snap $clone" "promote $clone" \ + "promote $fs" "destroy -rRf $fs") + +typeset badparams=("" "create" "destroy" "snapshot" "rollback" "clone" \ + "promote" "rename" "list -*" "set" "get -*" "inherit" "mount -A" \ + "unmount" "share" "unshare" "send" "receive") + +log_must $COREADM -p ${corepath}/core.%f +log_must export ZFS_ABORT=yes + +for subcmd in "${cmds[@]}" "${badparams[@]}"; do + $ZFS $subcmd >/dev/null 2>&1 && log_fail "$subcmd passed incorrectly." + corefile=${corepath}/core.zfs + if [[ ! -e $corefile ]]; then + log_fail "$ZFS $subcmd cannot generate core file with " \ + "ZFS_ABORT set." + fi + log_must $RM -f $corefile +done + +log_pass "With ZFS_ABORT set, zfs command can abort and generate core file " \ + "as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/zfs_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/zfs_003_neg.ksh new file mode 100644 index 0000000000..608f45b0e7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs/zfs_003_neg.ksh @@ -0,0 +1,59 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# zfs command will failed with unexpected scenarios: +# (1) ZFS_DEV cannot be opened +# (2) MNTTAB cannot be opened +# +# STRATEGY: +# 1. Create an array of zfs command +# 2. Execute each command in the array +# 3. Verify the command aborts and generate a core file +# + +verify_runnable "global" + +log_assert "zfs fails with unexpected scenarios." + +#verify zfs failed if ZFS_DEV cannot be opened +ZFS_DEV=/dev/zfs +MNTTAB=/etc/mnttab + +for file in $ZFS_DEV $MNTTAB; do + if [[ -e $file ]]; then + $MV $file ${file}.bak + fi + for cmd in "" "list" "get all" "mount"; do + log_mustnot eval "$ZFS $cmd >/dev/null 2>&1" + done + $MV ${file}.bak $file +done + +log_pass "zfs fails with unexpected scenarios as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/Makefile new file mode 100644 index 0000000000..1d407e01f5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/Makefile @@ -0,0 +1,47 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_clone + +PROGS = cleanup \ + setup \ + zfs_clone_001_neg \ + zfs_clone_002_pos \ + zfs_clone_003_pos \ + zfs_clone_004_pos \ + zfs_clone_005_pos \ + zfs_clone_006_pos \ + zfs_clone_007_pos \ + zfs_clone_008_neg \ + zfs_clone_009_neg \ + zfs_clone_010_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/cleanup.ksh new file mode 100644 index 0000000000..cb9756df75 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_container_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/setup.ksh new file mode 100644 index 0000000000..2cf98f5f97 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_container_volume_setup ${DISK} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_001_neg.ksh new file mode 100644 index 0000000000..ce1c6af667 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_001_neg.ksh @@ -0,0 +1,123 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs clone' should fail with inapplicable scenarios, including: +# * Null arguments +# * non-existant snapshots. +# * invalid characters in ZFS namesapec +# * Leading slash in the target clone name +# * The argument contains an empty component. +# * The pool specified in the target doesn't exist. +# * The parent dataset of the target doesn't exist. +# * The argument refer to a pool, not dataset. +# * The target clone already exists. +# * Null target clone argument. +# * Too many arguments. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# + +verify_runnable "both" + +typeset target1=$TESTPOOL/$TESTFS1 +typeset target2=$TESTPOOL/$TESTCTR1/$TESTFS1 +typeset targets="$target1 $target2 $NONEXISTPOOLNAME/$TESTFS" + +set -A args "" \ + "$TESTPOOL/$TESTFS@blah $target1" "$TESTPOOL/$TESTVOL@blah $target1" \ + "$TESTPOOL/$TESTFS@blah* $target1" "$TESTPOOL/$TESTVOL@blah* $target1" \ + "$SNAPFS $target1*" "$SNAPFS1 $target1*" \ + "$SNAPFS /$target1" "$SNAPFS1 /$target1" \ + "$SNAPFS $TESTPOOL//$TESTFS1" "$SNAPFS1 $TESTPOOL//$TESTFS1" \ + "$SNAPFS $NONEXISTPOOLNAME/$TESTFS" "$SNAPFS1 $NONEXISTPOOLNAME/$TESTFS" \ + "$SNAPFS" "$SNAPFS1" \ + "$SNAPFS $target1 $target2" "$SNAPFS1 $target1 $target2" +typeset -i argsnum=${#args[*]} +typeset -i j=0 +while (( j < argsnum )); do + args[((argsnum+j))]="-p ${args[j]}" + ((j = j + 1)) +done + +set -A moreargs "$SNAPFS $target2" "$SNAPFS1 $target2" \ + "$SNAPFS $TESTPOOL" "$SNAPFS1 $TESTPOOL" \ + "$SNAPFS $TESTPOOL/$TESTCTR" "$SNAPFS $TESTPOOL/$TESTFS" \ + "$SNAPFS1 $TESTPOOL/$TESTCTR" "$SNAPFS1 $TESTPOOL/$TESTFS" + +set -A args ${args[*]} ${moreargs[*]} + +function setup_all +{ + log_note "Create snapshots and mount them..." + + for snap in $SNAPFS $SNAPFS1 ; do + if ! snapexists $snap ; then + log_must $ZFS snapshot $snap + fi + done + + return 0 +} + +function cleanup_all +{ + for fs in $targets; do + datasetexists $fs && log_must $ZFS destroy -f $fs + done + + for snap in $SNAPFS $SNAPFS1 ; do + snapexists $snap && log_must $ZFS destroy -Rf $snap + done + + return 0 +} + +log_assert "Badly-formed 'zfs clone' with inapplicable scenarios" \ + "should return an error." +log_onexit cleanup_all + +setup_all + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS clone ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly formed 'zfs clone' with inapplicable scenarios" \ + "fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_002_pos.ksh new file mode 100644 index 0000000000..1b376eb00d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_002_pos.ksh @@ -0,0 +1,89 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs clone -p' should work as expected +# +# STRATEGY: +# 1. prepare snapshots +# 2. make sure without -p option, 'zfs clone' will fail +# 3. with -p option, the clone can be created +# 4. run 'zfs clone -p' again, the exit code should be zero +# + +verify_runnable "both" + +function setup_all +{ + log_note "Create snapshots and mount them..." + + for snap in $SNAPFS $SNAPFS1 ; do + if ! snapexists $snap ; then + log_must $ZFS snapshot $snap + fi + done + + return 0 +} + +function cleanup_all +{ + + if datasetexists $TESTPOOL/notexist ; then + log_must $ZFS destroy -rRf $TESTPOOL/notexist + fi + + for snap in $SNAPFS $SNAPFS1 ; do + if snapexists $snap ; then + log_must $ZFS destroy -Rf $snap + fi + done + + return 0 +} + +log_assert "clone -p should work as expected." +log_onexit cleanup_all + +setup_all + +log_must verify_opt_p_ops "clone" "fs" $SNAPFS \ + $TESTPOOL/notexist/new/clonefs$$ + +if is_global_zone ; then + log_must verify_opt_p_ops "clone" "vol" $SNAPFS1 \ + $TESTPOOL/notexist/new/clonevol$$ +fi + +log_pass "clone -p should work as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_003_pos.ksh new file mode 100644 index 0000000000..103f2d3ab2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_003_pos.ksh @@ -0,0 +1,76 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs clone -o property=value filesystem' can successfully create a ZFS +# clone filesystem with correct property set. +# +# STRATEGY: +# 1. Create a ZFS clone filesystem in the storage pool with -o option +# 2. Verify the filesystem created successfully +# 3. Verify the property is correctly set +# + +verify_runnable "both" + +function cleanup +{ + if snapexists $SNAPFS ; then + log_must $ZFS destroy -Rf $SNAPFS + fi +} + +log_onexit cleanup + + +log_assert "'zfs clone -o property=value filesystem' can successfully create" \ + "a ZFS clone filesystem with correct property set." + +log_must $ZFS snapshot $SNAPFS + +typeset -i i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + log_must $ZFS clone -o ${RW_FS_PROP[$i]} $SNAPFS $TESTPOOL/$TESTCLONE + datasetexists $TESTPOOL/$TESTCLONE || \ + log_fail "zfs clone $TESTPOOL/$TESTCLONE fail." + propertycheck $TESTPOOL/$TESTCLONE ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTCLONE + (( i = i + 1 )) +done + +log_pass "'zfs clone -o property=value filesystem' can successfully create" \ + "a ZFS clone filesystem with correct property set." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_004_pos.ksh new file mode 100644 index 0000000000..03bf7d7652 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_004_pos.ksh @@ -0,0 +1,87 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs clone -o property=value filesystem' can successfully create a ZFS +# clone filesystem with multiple properties set. +# +# STRATEGY: +# 1. Create a ZFS clone filesystem in the storage pool with multiple -o options +# 2. Verify the filesystem created successfully +# 3. Verify the properties are correctly set +# + +verify_runnable "both" + +function cleanup +{ + if snapexists $SNAPFS ; then + log_must $ZFS destroy -Rf $SNAPFS + fi +} + +log_onexit cleanup + +log_assert "'zfs clone -o property=value filesystem' can successfully create" \ + "a ZFS clone filesystem with multiple properties set." + +typeset -i i=0 +typeset opts="" + +log_must $ZFS snapshot $SNAPFS + +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ ${RW_FS_PROP[$i]} != *"checksum"* ]]; then + opts="$opts -o ${RW_FS_PROP[$i]}" + fi + (( i = i + 1 )) +done + +log_must $ZFS clone $opts $SNAPFS $TESTPOOL/$TESTCLONE +datasetexists $TESTPOOL/$TESTCLONE || \ + log_fail "zfs create $TESTPOOL/$TESTCLONE fail." + +i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ ${RW_FS_PROP[$i]} != *"checksum"* ]]; then + propertycheck $TESTPOOL/$TESTCLONE ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + fi + (( i = i + 1 )) +done + +log_pass "'zfs clone -o property=value filesystem' can successfully create" \ + "a ZFS clone filesystem with multiple properties set." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_005_pos.ksh new file mode 100644 index 0000000000..776dfd5c28 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_005_pos.ksh @@ -0,0 +1,75 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs clone -o property=value -V size volume' can successfully create a ZFS +# clone volume with correct property set. +# +# STRATEGY: +# 1. Create a ZFS clone volume in the storage pool with -o option +# 2. Verify the volume created successfully +# 3. Verify the property is correctly set +# + +verify_runnable "global" + +function cleanup +{ + if snapexists $SNAPFS1 ; then + log_must $ZFS destroy -Rf $SNAPFS1 + fi +} + +log_onexit cleanup + +log_assert "'zfs clone -o property=value -V size volume' can successfully" \ + "create a ZFS clone volume with correct property set." + +log_must $ZFS snapshot $SNAPFS1 +typeset -i i=0 +while (( $i < ${#RW_VOL_CLONE_PROP[*]} )); do + log_must $ZFS clone -o ${RW_VOL_CLONE_PROP[$i]} $SNAPFS1 $TESTPOOL/$TESTCLONE + datasetexists $TESTPOOL/$TESTCLONE || \ + log_fail "zfs clone $TESTPOOL/$TESTCLONE fail." + propertycheck $TESTPOOL/$TESTCLONE ${RW_VOL_CLONE_PROP[i]} || \ + log_fail "${RW_VOL_CLONE_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTCLONE + + (( i = i + 1 )) +done + +log_pass "'zfs clone -o property=value volume' can successfully" \ + "create a ZFS clone volume with correct property set." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_006_pos.ksh new file mode 100644 index 0000000000..84f55c8447 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_006_pos.ksh @@ -0,0 +1,86 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs clone -o property=value volume' can successfully create a ZFS +# clone volume with multiple properties set. +# +# STRATEGY: +# 1. Create a ZFS clone volume in the storage pool with -o option +# 2. Verify the volume created successfully +# 3. Verify the properties are correctly set +# + +verify_runnable "global" + +function cleanup +{ + if snapexists $SNAPFS1 ; then + log_must $ZFS destroy -Rf $SNAPFS1 + fi +} + +log_onexit cleanup + +log_assert "'zfs clone -o property=value volume' can successfully" \ + "create a ZFS clone volume with multiple correct properties set." + +typeset -i i=0 +typeset opts="" + +log_must $ZFS snapshot $SNAPFS1 + +while (( $i < ${#RW_VOL_CLONE_PROP[*]} )); do + if [[ ${RW_VOL_CLONE_PROP[$i]} != *"checksum"* ]]; then + opts="$opts -o ${RW_VOL_CLONE_PROP[$i]}" + fi + (( i = i + 1 )) +done + +log_must $ZFS clone $opts $SNAPFS1 $TESTPOOL/$TESTCLONE + +i=0 +while (( $i < ${#RW_VOL_CLONE_PROP[*]} )); do + if [[ ${RW_VOL_CLONE_PROP[$i]} != *"checksum"* ]]; then + propertycheck $TESTPOOL/$TESTCLONE ${RW_VOL_CLONE_PROP[i]} || \ + log_fail "${RW_VOL_CLONE_PROP[i]} is failed to set." + fi + (( i = i + 1 )) +done + +log_pass "'zfs clone -o property=value volume' can successfully" \ + "create a ZFS clone volume with multiple correct properties set." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_007_pos.ksh new file mode 100644 index 0000000000..370a98f4de --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_007_pos.ksh @@ -0,0 +1,85 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs clone -o version=' could upgrade version, but downgrade is denied. +# +# STRATEGY: +# 1. Create clone with "-o version=" specified +# 2. Verify it succeed while upgrade, but fails while the version downgraded. +# + +ZFS_VERSION=$($ZFS upgrade | $HEAD -1 | $AWK '{print $NF}' \ + | $SED -e 's/\.//g') + +verify_runnable "both" + +function cleanup +{ + if snapexists $SNAPFS ; then + log_must $ZFS destroy -Rf $SNAPFS + fi +} + +log_onexit cleanup + +log_assert "'zfs clone -o version=' could upgrade version," \ + "but downgrade is denied." + +log_must $ZFS snapshot $SNAPFS + +typeset -i ver + +if (( ZFS_TEST_VERSION == 0 )) ; then + (( ZFS_TEST_VERSION = ZFS_VERSION )) +fi + +(( ver = ZFS_TEST_VERSION )) +while (( ver <= ZFS_VERSION )); do + log_must $ZFS clone -o version=$ver $SNAPFS $TESTPOOL/$TESTCLONE + cleanup + (( ver = ver + 1 )) +done + +(( ver = 0 )) +while (( ver < ZFS_TEST_VERSION )); do + log_mustnot $ZFS clone -o version=$ver \ + $SNAPFS $TESTPOOL/$TESTCLONE + log_mustnot datasetexists $TESTPOOL/$TESTCLONE + cleanup + (( ver = ver + 1 )) +done + +log_pass "'zfs clone -o version=' could upgrade version," \ + "but downgrade is denied." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_008_neg.ksh new file mode 100644 index 0000000000..d54c87dfaa --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_008_neg.ksh @@ -0,0 +1,80 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs clone -o <filesystem>' fails with bad <filesystem> arguments, including: +# *Same property set multiple times via '-o property=value' +# *Volume's property set on filesystem +# +# STRATEGY: +# 1. Create an array of <filesystem> arguments +# 2. Execute 'zfs clone -o <filesystem>' with each argument +# 3. Verify an error is returned. +# + +verify_runnable "both" + +function cleanup +{ + if snapexists $SNAPFS ; then + log_must $ZFS destroy -Rf $SNAPFS + fi +} + +log_onexit cleanup + +log_assert "Verify 'zfs clone -o <filesystem>' fails with bad <filesystem> argument." + +log_must $ZFS snapshot $SNAPFS + +typeset -i i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + log_mustnot $ZFS clone -o ${RW_FS_PROP[i]} -o ${RW_FS_PROP[i]} \ + $SNAPFS $TESTPOOL/$TESTCLONE + log_mustnot $ZFS clone -p -o ${RW_FS_PROP[i]} -o ${RW_FS_PROP[i]} \ + $SNAPFS $TESTPOOL/$TESTCLONE + ((i = i + 1)) +done + +i=0 +while (( $i < ${#VOL_ONLY_PROP[*]} )); do + log_mustnot $ZFS clone -o ${VOL_ONLY_PROP[i]} \ + $SNAPFS $TESTPOOL/$TESTCLONE + log_mustnot $ZFS clone -p -o ${VOL_ONLY_PROP[i]} \ + $SNAPFS $TESTPOOL/$TESTCLONE + ((i = i + 1)) +done + +log_pass "'zfs clone -o <filesystem>' fails with bad <filesystem> argument." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_009_neg.ksh new file mode 100644 index 0000000000..286cbf8534 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_009_neg.ksh @@ -0,0 +1,80 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs clone -o <volume>' fails with badly formed arguments,including: +# *Same property set multiple times via '-o property=value' +# *Filesystems's property set on volume +# +# STRATEGY: +# 1. Create an array of badly formed arguments +# 2. For each argument, execute 'zfs clone -o <volume>' +# 3. Verify an error is returned. +# + +verify_runnable "global" + +function cleanup +{ + if snapexists $SNAPFS1 ; then + log_must $ZFS destroy -Rf $SNAPFS1 + fi +} + +log_onexit cleanup + +log_assert "Verify 'zfs clone -o <volume>' fails with bad <volume> argument." + +log_must $ZFS snapshot $SNAPFS1 + +typeset -i i=0 +while (( $i < ${#RW_VOL_PROP[*]} )); do + log_mustnot $ZFS clone -o ${RW_VOL_PROP[i]} -o ${RW_VOL_PROP[i]} \ + $SNAPFS1 $TESTPOOL/$TESTCLONE + log_mustnot $ZFS clone -p -o ${RW_VOL_PROP[i]} -o ${RW_VOL_PROP[i]} \ + $SNAPFS1 $TESTPOOL/$TESTCLONE + ((i = i + 1)) +done + +i=0 +while (( $i < ${#FS_ONLY_PROP[*]} )); do + log_mustnot $ZFS clone -o ${FS_ONLY_PROP[i]} \ + $SNAPFS1 $TESTPOOL/$TESTCLONE + log_mustnot $ZFS clone -p -o ${FS_ONLY_PROP[i]} \ + $SNAPFS1 $TESTPOOL/$TESTCLONE + ((i = i + 1)) +done + +log_pass "Verify 'zfs clone -o <volume>' fails with bad <volume> argument." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_010_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_010_pos.ksh new file mode 100644 index 0000000000..8f405a0a52 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_clone/zfs_clone_010_pos.ksh @@ -0,0 +1,233 @@ +#!/bin/ksh +# +# CDDL HEADER START +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. + +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# +# CDDL HEADER END +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify 'zfs list -t all -o name,origin,clones' prints the correct +# clone information +# +# STRATEGY: +# 1. Create datasets +# 2. Create recursive snapshots and their clones +# 3. Verify zfs clones property displays right information for different +# cases +# + +verify_runnable "both" + +function local_cleanup +{ + typeset -i i=1 + for ds in $datasets; do + datasetexists $ds/$TESTCLONE.$i && \ + log_must $ZFS destroy -rf $ds/$TESTCLONE.$i + datasetexists $ds && log_must $ZFS destroy -Rf $ds + ((i=i+1)) + done +} + +# Set up filesystem with clones +function setup_ds +{ + typeset -i i=1 + # create nested datasets + log_must $ZFS create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3 + + # verify dataset creation + for ds in $datasets; do + datasetexists $ds || log_fail "Create $ds dataset fail." + done + + # create recursive nested snapshot + log_must $ZFS snapshot -r $TESTPOOL/$TESTFS1@snap + for ds in $datasets; do + datasetexists $ds@snap || \ + log_fail "Create $ds@snap snapshot fail." + done + for ds in $datasets; do + for fs in $datasets; do + log_must $ZFS clone $ds@snap $fs/$TESTCLONE.$i + done + ((i=i+1)) + done +} + +# Verify clone list +function verify_clones +{ + typeset -i no_clones=$1 + typeset unexpected=$2 + typeset clone_snap=$3 + typeset -i i=1 + for ds in $datasets; do + if [[ -n $clone_snap ]]; then + clone_snap=/$TESTCLONE.$i + fi + snapshot=$($ECHO "$names" | $GREP $ds$clone_snap@snap) + actual_clone=$($ZFS list -t all -o clones $snapshot | $TAIL -1) + save=$IFS + IFS=',' + typeset -a clones=() + for token in $actual_clone; do + clones=( "${clones[@]}" "$token" ) + done + IFS=$save + [[ ${#clones[*]} -ne $no_clones ]] && \ + log_fail "$snapshot has unexpected number of clones" \ + " ${#clones[*]}" + expected_clone="" + unexpected_clone="" + if [[ $unexpected -eq 1 ]]; then + for fs in $datasets; do + if [[ $fs == $ds ]]; then + if [[ -z $clone_snap ]]; then + unexpected_clone=$fs/$TESTCLONE.$i + (for match in ${clones[@]};do + [[ $match != $unexpected_clone ]] && \ + exit 0; done) || log_fail \ + "Unexpected clones of the snapshot" + else + expected_clone=$fs + unexpected_clone=$fs/$TESTCLONE.$i + (for match in ${clones[@]};do + [[ $match == $expected_clone ]] && \ + [[ $match != $unexpected_clone ]] \ + && exit 0; done) || log_fail \ + "Unexpected clones of the snapshot" + fi + else + expected_clone=$fs/$TESTCLONE.$i + (for match in ${clones[@]};do + [[ $match == $expected_clone ]] && \ + exit 0; done) || log_fail \ + "Unexpected clones of the snapshot" + fi + done + else + for fs in $datasets; do + expected_clone=$fs/$TESTCLONE.$i + (for match in ${clones[@]};do + [[ $match == $expected_clone ]] && exit 0; \ + done) || log_fail "Unexpected clones" \ + " of the snapshot" + done + fi + ((i=i+1)) + done +} + + +log_onexit local_cleanup +datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 + $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3" + +typeset -a d_clones +typeset -a deferred_snaps +typeset -i i +i=1 +log_must setup_ds + +log_note "Verify zfs clone propery for multiple clones" +names=$($ZFS list -rt all -o name $TESTPOOL) +log_must verify_clones 3 0 + +log_note "verfify clone property for clone deletion" +i=1 +for ds in $datasets; do + log_must $ZFS destroy $ds/$TESTCLONE.$i + ((i=i+1)) +done +names=$($ZFS list -rt all -o name $TESTPOOL) +i=1 +log_must verify_clones 2 1 + +log_must local_cleanup +log_must setup_ds + +log_note "verify zfs deferred destroy on clones property" +i=1 +names=$($ZFS list -rt all -o name $TESTPOOL) +for ds in $datasets; do + log_must $ZFS destroy -d $ds@snap + deferred_snaps=( "${deferred_snaps[@]}" "$ds@snap" ) + ((i=i+1)) +done +log_must verify_clones 3 0 + +log_note "verify zfs deferred destroy by destroying clones on clones property" +d_clones=() +i=1 +for ds in $datasets; do + for fs in $datasets; do + log_must $ZFS destroy $fs/$TESTCLONE.$i + d_clones=( "${d_clones[@]}" "$fs/$TESTCLONE.$i" ) + done + ((i=i+1)) +done +names=$($ZFS list -rtall -o name $TESTPOOL) +for snap in ${deferred_snaps[@]}; do + status=$($ECHO "$names" | $GREP $snap) + [[ -z $status ]] || \ + log_fail "$snap exist after deferred destroy" +done +for dclone in ${d_clones[@]}; do + log_note "D CLONE = $dclone" + status=$($ECHO "$names" | $GREP $dclone) + [[ -z $status ]] || \ + log_fail "$dclone exist after deferred destroy" +done + +log_must local_cleanup +log_must setup_ds +log_note "verify clone property for zfs promote" +i=1 +for ds in $datasets; do + log_must $ZFS promote $ds/$TESTCLONE.$i + ((i=i+1)) +done +names=$($ZFS list -rt all -o name,clones $TESTPOOL) +log_must verify_clones 3 1 $TESTCLONE +i=1 +for ds in $datasets; do + log_must $ZFS promote $ds + ((i=i+1)) +done +log_must local_cleanup + +log_note "verify clone list truncated correctly" +typeset -i j=200 +i=1 +fs=$TESTPOOL/$TESTFS1 +log_must $ZFS create $fs +log_must $ZFS snapshot $fs@snap +while((i < 7)); do + log_must $ZFS clone $fs@snap $fs/$TESTCLONE$(python -c 'print "x" * 200').$i + ((i=i+1)) + ((j=j+200)) +done +clone_list=$($ZFS list -o clones $fs@snap) +char_count=$($ECHO "$clone_list" | $TAIL -1 | wc | $AWK '{print $3}') +[[ $char_count -eq 1024 ]] || \ + log_fail "Clone list not truncated correctly. Unexpected character count" \ + "$char_count" + +log_pass "'zfs list -o name,origin,clones prints the correct clone information." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/Makefile new file mode 100644 index 0000000000..ccbbd2b3cd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/Makefile @@ -0,0 +1,49 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_copies + +PROGS = cleanup \ + setup \ + zfs_copies_001_pos \ + zfs_copies_002_pos \ + zfs_copies_003_pos \ + zfs_copies_004_neg \ + zfs_copies_005_neg \ + zfs_copies_006_pos + +FILES = zfs_copies.cfg \ + zfs_copies.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/cleanup.ksh new file mode 100644 index 0000000000..1df446116a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/cleanup.ksh @@ -0,0 +1,44 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.cfg + +# +# umount the ufs fs if there is timedout in the ufs test +# + +if ismounted $UFS_MNTPOINT ufs ; then + log_must $UMOUNT -f $UFS_MNTPOINT + $RM -fr $UFS_MNTPOINT +fi + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/setup.ksh new file mode 100644 index 0000000000..347d55e642 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/setup.ksh @@ -0,0 +1,31 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} +default_volume_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.cfg new file mode 100644 index 0000000000..c3fa05a001 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.cfg @@ -0,0 +1,37 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export ZPOOL_VERSION_1_FILES="zfs-pool-v1.dat.bz2" +export ZPOOL_VERSION_1_NAME="v1-pool" + +export FILESIZE=10m +export FILE=file.copies +export SLEEPTIME=30 +export UFS_MNTPOINT=/testdir_nfs_mntpoint diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib new file mode 100644 index 0000000000..d99262d072 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib @@ -0,0 +1,144 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.cfg + +# +# Compare the value of copies property with specified value +# $1, the dataset name +# $2, the expected copies value +# +function cmp_prop +{ + typeset ds=$1 + typeset val_expect=$2 + typeset val_actual + + val_actual=$(get_prop copies $ds) + if [[ $val_actual != $val_expect ]]; then + log_fail "Expected value ($val_expect) != actual value " \ + "($val_actual)" + fi +} + +# +# Get the value of property used via zfs list +# $1, the dataset name +# +function get_used_prop +{ + typeset ds=$1 + typeset used + + used=`$ZFS list -H -o used $ds` + used=${used%[m|M]} + if [[ $used == *K ]]; then + used=0 + fi + $ECHO $used +} + +# +# Check the used space is charged correctly +# $1, the number of used space +# $2, the expected common factor between the used space and the file space +# +function check_used +{ + typeset charged_spc=$1 + typeset -i used + typeset -i expected_cfactor=$2 + typeset -i cfactor + typeset -i fsize=${FILESIZE%[m|M]} + + ((used = ${charged_spc%[m|M]})) + ((cfactor = used / fsize)) + if ((cfactor != expected_cfactor)); then + log_fail "The space is not charged correctly while setting" \ + "copies as $expected_cfactor." + fi +} + +# +# test ncopies on volume +# $1 test type zfs|ufs, default zfs +# $2 copies +# $3 mntp for ufs test +function do_vol_test +{ + typeset type=$1 + typeset copy=$2 + typeset mntp=$3 + + vol=$TESTPOOL/$TESTVOL1 + vol_b_path=/dev/zvol/dsk/$TESTPOOL/$TESTVOL1 + vol_r_path=/dev/zvol/rdsk/$TESTPOOL/$TESTVOL1 + + log_must $ZFS create -V $VOLSIZE -o copies=$copy $vol + log_must $ZFS set refreservation=none $vol + if [[ $type == "ufs" ]]; then + log_must $ECHO y | $NEWFS $vol_r_path >/dev/null 2>&1 + log_must $MOUNT -F ufs -o rw $vol_b_path $mntp + else + log_must $ZPOOL create $TESTPOOL1 $vol_b_path + log_must $ZFS create $TESTPOOL1/$TESTFS1 + fi + + ((nfilesize = copy * ${FILESIZE%m})) + pre_used=$(get_used_prop $vol) + ((target_size = pre_used + nfilesize)) + + if [[ $type == "ufs" ]]; then + log_must $MKFILE $FILESIZE $mntp/$FILE + else + log_must $MKFILE $FILESIZE /$TESTPOOL1/$TESTFS1/$FILE + fi + + post_used=$(get_used_prop $vol) + while ((post_used < target_size)) ; do + sleep 1 + post_used=$(get_used_prop $vol) + done + + ((used = post_used - pre_used)) + if ((used < nfilesize)); then + log_fail "The space is not charged correctly while setting" \ + "copies as $copy" + fi + + if [[ $type == "ufs" ]]; then + $UMOUNT $mntp + else + log_must $ZPOOL destroy $TESTPOOL1 + fi + + log_must $ZFS destroy $vol +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_001_pos.ksh new file mode 100644 index 0000000000..f484e055a3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_001_pos.ksh @@ -0,0 +1,108 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib + +# +# DESCRIPTION: +# Verify "copies" property can be correctly set as 1,2 and 3 and different +# filesystem can have different value of "copies" property within the same pool. +# +# STRATEGY: +# 1. Create different filesystems with copies set as 1,2,3; +# 2. Verify that the "copies" property has been set correctly +# + +verify_runnable "both" + +function cleanup +{ + typeset ds + + for ds in $fs1 $fs2 $vol1 $vol2; do + if datasetexists $ds; then + log_must $ZFS destroy $ds + fi + done +} + +log_assert "Verify 'copies' property with correct arguments works or not." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +fs1=$TESTPOOL/$TESTFS1 +fs2=$TESTPOOL/$TESTFS2 +vol=$TESTPOOL/$TESTVOL +vol1=$TESTPOOL/$TESTVOL1 +vol2=$TESTPOOL/$TESTVOL2 + +# +# Check the default value for copies property +# +for ds in $fs $vol; do + cmp_prop $ds 1 +done + +for val in 1 2 3; do + log_must $ZFS create -o copies=$val $fs1 + if is_global_zone; then + log_must $ZFS create -V $VOLSIZE -o copies=$val $vol1 + else + log_must $ZFS create -o copies=$val $vol1 + fi + for ds in $fs1 $vol1; do + cmp_prop $ds $val + done + + for val2 in 3 2 1; do + log_must $ZFS create -o copies=$val2 $fs2 + if is_global_zone; then + log_must $ZFS create -V $VOLSIZE -o copies=$val2 $vol2 + else + log_must $ZFS create -o copies=$val2 $vol2 + fi + for ds in $fs2 $vol2; do + cmp_prop $ds $val2 + log_must $ZFS destroy $ds + done + done + + for ds in $fs1 $vol1; do + log_must $ZFS destroy $ds + done + +done + +for val in 3 2 1; do + for ds in $fs $vol; do + log_must $ZFS set copies=$val $ds + cmp_prop $ds $val + done +done + +log_pass "'copies' property with correct arguments works as expected. " diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_002_pos.ksh new file mode 100644 index 0000000000..46fe0f5a4b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_002_pos.ksh @@ -0,0 +1,99 @@ +#!/bin/ksh +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib + +# +# DESCRIPTION: +# Verify that the space used by multiple copies is charged correctly +# +# STRATEGY: +# 1. Create filesystems with copies set as 2,3 respectively; +# 2. Copy specified size data into each filesystem; +# 3. Verify that the space is charged as expected with zfs list, ls -s, df(1m), +# du(1) commands; +# + +verify_runnable "both" + +function cleanup +{ + typeset val + + for val in 1 2 3; do + if datasetexists $TESTPOOL/fs_$val; then + log_must $ZFS destroy $TESTPOOL/fs_$val + fi + done +} + +log_assert "Verify that the space used by multiple copies is charged correctly." +log_onexit cleanup + +for val in 1 2 3; do + log_must $ZFS create -o copies=$val $TESTPOOL/fs_$val + + log_must $MKFILE $FILESIZE /$TESTPOOL/fs_$val/$FILE +done + +# +# Sync up the filesystem +# +$SYNC + +# +# Verify 'zfs list' can correctly list the space charged +# +log_note "Verify 'zfs list' can correctly list the space charged." +fsize=${FILESIZE%[m|M]} +for val in 1 2 3; do + used=$(get_used_prop $TESTPOOL/fs_$val) + check_used $used $val +done + +log_note "Verify 'ls -s' can correctly list the space charged." +for val in 1 2 3; do + blks=`$LS -ls /$TESTPOOL/fs_$val/$FILE | $AWK '{print $1}'` + (( used = blks * 512 / (1024 * 1024) )) + check_used $used $val +done + +log_note "Verify df(1M) can corectly display the space charged." +for val in 1 2 3; do + used=`$DF -F zfs -h /$TESTPOOL/fs_$val/$FILE | $GREP $TESTPOOL/fs_$val \ + | $AWK '{print $3}'` + check_used $used $val +done + +log_note "Verify du(1) can correctly display the space charged." +for val in 1 2 3; do + used=`$DU -h /$TESTPOOL/fs_$val/$FILE | $AWK '{print $1}'` + check_used $used $val +done + +log_pass "The space used by multiple copies is charged correctly as expected. " diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_003_pos.ksh new file mode 100644 index 0000000000..4b67e691a4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_003_pos.ksh @@ -0,0 +1,64 @@ +#!/bin/ksh +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib + +# +# DESCRIPTION: +# Verify that the volume space used by multiple copies is charged correctly +# +# STRATEGY: +# 1. Create volume; +# 2. Create ZFS filesystem based on the volume; +# 3. Set the copies property of volume to 1,2 or 3; +# 4. Copy specified size data into each filesystem; +# 5. Verify that the volume space is charged as expected. +# + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL1; then + destroy_pool $TESTPOOL1 + fi + + if datasetexists $vol; then + log_must $ZFS destroy $vol + fi +} + +log_assert "Verify that ZFS volume space used by multiple copies is charged correctly." +log_onexit cleanup +vol=$TESTPOOL/$TESTVOL1 + + +for val in 1 2 3; do + do_vol_test zfs $val +done + +log_pass "The volume space used by multiple copies is charged correctly as expected. " diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_004_neg.ksh new file mode 100644 index 0000000000..8cecd6c767 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_004_neg.ksh @@ -0,0 +1,53 @@ +#!/bin/ksh +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib + +# +# DESCRIPTION: +# Verify that copies cannot be set to other value except for 1, 2 or 3 +# +# STRATEGY: +# 1. Create filesystems with copies set as any value other than 1, 2 or 3 +# 2. Verify that the create operations fail +# + +verify_runnable "both" + +log_assert "Verify that copies property cannot be set to any value other than 1,2 or 3" + +set -A badval 0 01 02 03 0 -1 -2 -3 10 20 30 4 5 6 ? * blah + +for val in ${badval[@]}; do + log_mustnot $ZFS create -o copies=$val $TESTPOOL/$TESTFS1 + log_mustnot $ZFS create -V $VOLSIZE -o copies=$val $TESTPOOL/$TESTVOL1 + log_mustnot $ZFS set copies=$val $TESTPOOL/$TESTFS + log_mustnot $ZFS set copies=$val $TESTPOOL/$TESTVOL +done + +log_pass "The copies property cannot be set to any value other than 1,2 or 3 as expected" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_005_neg.ksh new file mode 100644 index 0000000000..a10ca594e9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_005_neg.ksh @@ -0,0 +1,71 @@ +#!/bin/ksh +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib + +# +# DESCRIPTION: +# Verify that copies cannot be set with pool version 1 +# +# STRATEGY: +# 1. Create filesystems with copies set in a pool with version 1 +# 2. Verify that the create operations fail +# + +verify_runnable "global" + +function cleanup +{ + if poolexists $ZPOOL_VERSION_1_NAME; then + destroy_pool $ZPOOL_VERSION_1_NAME + fi + + if [[ -f $TESTDIR/$ZPOOL_VERSION_1_FILES ]]; then + rm -f $TESTDIR/$ZPOOL_VERSION_1_FILES + fi +} + +log_assert "Verify that copies cannot be set with pool version 1" +log_onexit cleanup + +$CP $STF_SUITE/tests/functional/cli_root/zpool_upgrade/blockfiles/$ZPOOL_VERSION_1_FILES $TESTDIR +$BUNZIP2 $TESTDIR/$ZPOOL_VERSION_1_FILES +log_must $ZPOOL import -d $TESTDIR $ZPOOL_VERSION_1_NAME +log_must $ZFS create $ZPOOL_VERSION_1_NAME/$TESTFS +log_must $ZFS create -V 1m $ZPOOL_VERSION_1_NAME/$TESTVOL + +for val in 3 2 1; do + for ds in $ZPOOL_VERSION_1_NAME/$TESTFS $ZPOOL_VERSION_1_NAME/$TESTVOL; do + log_mustnot $ZFS set copies=$val $ds + done + for ds in $ZPOOL_VERSION_1_NAME/$TESTFS1 $ZPOOL_VERSION_1_NAME/$TESTVOL1; do + log_mustnot $ZFS create -o copies=$val $ds + done +done + +log_pass "Verification pass: copies cannot be set with pool version 1. " diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_006_pos.ksh new file mode 100644 index 0000000000..5607d89b8e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_copies/zfs_copies_006_pos.ksh @@ -0,0 +1,73 @@ +#!/bin/ksh +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_copies/zfs_copies.kshlib + +# +# DESCRIPTION: +# Verify that the volume space used by multiple copies is charged correctly +# +# STRATEGY: +# 1. Create volume +# 2. Create UFS filesystem based on the volume +# 3. Set the copies property of volume to 1,2 or 3 +# 4. Copy specified size data into each filesystem +# 5. Verify that the volume space is charged as expected +# + +verify_runnable "global" + +function cleanup +{ + if ismounted $mntp ufs ; then + log_must $UMOUNT $mntp + fi + + if datasetexists $vol; then + log_must $ZFS destroy $vol + fi + + if [[ -d $mntp ]]; then + $RM -rf $mntp + fi +} + + +log_assert "Verify that ZFS volume space used by multiple copies is charged correctly." +log_onexit cleanup +mntp=$UFS_MNTPOINT +vol=$TESTPOOL/$TESTVOL1 + +if [[ ! -d $mntp ]]; then + $MKDIR -p $mntp +fi + +for val in 1 2 3; do + do_vol_test ufs $val $mntp +done + +log_pass "The volume space used by multiple copies is charged correctly as expected. " diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/Makefile new file mode 100644 index 0000000000..29a905e036 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/Makefile @@ -0,0 +1,57 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_create + +PROGS = cleanup \ + setup \ + zfs_create_001_pos \ + zfs_create_002_pos \ + zfs_create_003_pos \ + zfs_create_004_pos \ + zfs_create_005_pos \ + zfs_create_006_pos \ + zfs_create_007_pos \ + zfs_create_008_neg \ + zfs_create_009_neg \ + zfs_create_010_neg \ + zfs_create_011_pos \ + zfs_create_012_pos \ + zfs_create_013_pos + +FILES = properties.kshlib \ + zfs_create_common.kshlib \ + zfs_create.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/properties.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/properties.kshlib new file mode 100644 index 0000000000..51ec470992 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/properties.kshlib @@ -0,0 +1,77 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +set -A RW_FS_PROP "quota=512M" \ + "reservation=512M" \ + "recordsize=64K" \ + "mountpoint=/tmp/mnt$$" \ + "checksum=fletcher2" \ + "compression=lzjb" \ + "atime=off" \ + "devices=off" \ + "exec=off" \ + "setuid=off" \ + "readonly=on" \ + "snapdir=visible" \ + "aclmode=discard" \ + "aclinherit=discard" \ + "canmount=off" \ + "local:department=123" + +is_global_zone && \ + set -A RW_FS_PROP ${RW_FS_PROP[*]} "sharenfs=on" "zoned=on" + +set -A RW_VOL_PROP "volblocksize=16K" \ + "checksum=fletcher2" \ + "compression=lzjb" \ + "readonly=on" \ + "local:department=123" + +set -A RW_VOL_CLONE_PROP "checksum=fletcher2" \ + "compression=lzjb" \ + "readonly=on" \ + "local:department=123" + +set -A FS_ONLY_PROP "quota=512M" \ + "recordsize=64K" \ + "mountpoint=/tmp/mnt$$" \ + "sharenfs=on" \ + "atime=off" \ + "devices=off" \ + "exec=off" \ + "setuid=off" \ + "zoned=on" \ + "snapdir=visible" \ + "aclmode=discard" \ + "aclinherit=discard" \ + "canmount=off" \ + "version=1" + +set -A VOL_ONLY_PROP "volblocksize=16K" "volsize=512M" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create.cfg new file mode 100644 index 0000000000..c97e44d879 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create.cfg @@ -0,0 +1,53 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export BYND_MAX_NAME="byondmaxnamelength\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789" + +# There're 3 different prompt messages while create +# a volume that great than 1TB on 32-bit +# - volume size exceeds limit for this system. (happy gate) +# - max volume size is 1TB on 32-bit systems (s10u2) +# - value is too large (old) + +export VOL_LIMIT_KEYWORD1="1TB on 32-bit" +export VOL_LIMIT_KEYWORD2="value is too large" +export VOL_LIMIT_KEYWORD3="volume size exceeds limit" + +set -A size "8k" "8K" "1m" "1M" "1mb" "1mB" "1Mb" "1MB" "1g" "1G" \ + "1p" "1P" "1z" "1Z" "1gb" "1gB" "1Gb" "1GB" "1pb" "1pB" "1Pb" \ + "1PB" "1zb" "1zB" "1Zb" "1ZB" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_001_pos.ksh new file mode 100644 index 0000000000..63cf619dcf --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_001_pos.ksh @@ -0,0 +1,66 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs create <filesystem>' can create a ZFS filesystem in the namespace. +# +# STRATEGY: +# 1. Create a ZFS filesystem in the storage pool +# 2. Verify the filesystem created successfully +# + +verify_runnable "both" + + +function cleanup +{ + typeset -i i=0 + while (( $i < ${#datasets[*]} )); do + datasetexists ${datasets[$i]} && \ + log_must $ZFS destroy -f ${datasets[$i]} + ((i = i + 1)) + done +} + +log_onexit cleanup + +set -A datasets "$TESTPOOL/$TESTFS1" "$TESTPOOL/$LONGFSNAME" "$TESTPOOL/..." \ + "$TESTPOOL/_1234_" + +log_assert "'zfs create <filesystem>' can create a ZFS filesystem in the namespace." + +typeset -i i=0 +while (( $i < ${#datasets[*]} )); do + log_must $ZFS create ${datasets[$i]} + datasetexists ${datasets[$i]} || \ + log_fail "zfs create ${datasets[$i]} fail." + ((i = i + 1)) +done + +log_pass "'zfs create <filesystem>' works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_002_pos.ksh new file mode 100644 index 0000000000..bb066467e6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_002_pos.ksh @@ -0,0 +1,78 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create.cfg + +# +# DESCRIPTION: +# 'zfs create -s -V <size> <volume>' can create various-size sparse volume. +# +# STRATEGY: +# 1. Create a volume in the storage pool. +# 2. Verify the volume is created correctly. +# + +verify_runnable "global" + +function cleanup +{ + typeset -i j=0 + while [[ $j -lt ${#size[*]} ]]; do + if datasetexists $TESTPOOL/${TESTVOL}${size[j]}; then + log_must $ZFS destroy $TESTPOOL/${TESTVOL}${size[j]} + fi + ((j = j + 1)) + done +} + +log_onexit cleanup + + +log_assert "'zfs create -s -V <size> <volume>' succeeds" + +typeset -i j=0 +while (( $j < ${#size[*]} )); do + typeset cmdline="$ZFS create -s -V ${size[j]} \ + $TESTPOOL/${TESTVOL}${size[j]}" + + str=$(eval $cmdline 2>&1) + if (( $? == 0 )); then + log_note "SUCCESS: $cmdline" + log_must datasetexists $TESTPOOL/${TESTVOL}${size[j]} + elif [[ $str == *${VOL_LIMIT_KEYWORD1}* || \ + $str == *${VOL_LIMIT_KEYWORD2}* || \ + $str == *${VOL_LIMIT_KEYWORD3}* ]] + then + log_note "UNSUPPORTED: $cmdline" + else + log_fail "$cmdline" + fi + + ((j = j + 1)) + +done +log_pass "'zfs create -s -V <size> <volume>' works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_003_pos.ksh new file mode 100644 index 0000000000..bffe8cda4d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_003_pos.ksh @@ -0,0 +1,69 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create.cfg + +# +# DESCRIPTION: +# 'zfs create [-b <blocksize>] -V <size> <volume>' can create a volume +# with specified blocksize, which is power of 2 between 512 - 128k. +# +# STRATEGY: +# 1. Create a volume with blocksize in the storage pool +# 2. Verify the volume created successfully +# + +verify_runnable "global" + +function cleanup +{ + datasetexists $vol && \ + log_must $ZFS destroy -f $vol +} + +log_assert "Verify creating volume with specified blocksize works." +log_onexit cleanup + +set -A options "" "-b 1k" "-b 1K" "-b 1024" "-b 1024b" +vol=$TESTPOOL/$TESTVOL + +typeset -i i=0 +while (( i < ${#options[*]} )); do + log_must $ZFS create ${options[i]} -V $VOLSIZE $vol + datasetexists $vol || \ + log_fail "zfs create ${options[i]} -V $VOLSIZE $vol fail." + + log_must $ZFS destroy -f $vol + ((i = i + 1)) +done + +log_pass "'zfs create [-b <blocksize>] -V <size> <volume>' works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_004_pos.ksh new file mode 100644 index 0000000000..5d2a21a8d6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_004_pos.ksh @@ -0,0 +1,69 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs create -o property=value filesystem' can successfully create a ZFS +# filesystem with correct property set. +# +# STRATEGY: +# 1. Create a ZFS filesystem in the storage pool with -o option +# 2. Verify the filesystem created successfully +# 3. Verify the property is correctly set +# + +verify_runnable "both" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTFS1 && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 +} + +log_onexit cleanup + + +log_assert "'zfs create -o property=value filesystem' can successfully create \ + a ZFS filesystem with correct property set." + +typeset -i i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + log_must $ZFS create -o ${RW_FS_PROP[$i]} $TESTPOOL/$TESTFS1 + datasetexists $TESTPOOL/$TESTFS1 || \ + log_fail "zfs create $TESTPOOL/$TESTFS1 fail." + propertycheck $TESTPOOL/$TESTFS1 ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + (( i = i + 1 )) +done + +log_pass "'zfs create -o property=value filesystem' can successfully create \ + a ZFS filesystem with correct property set." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_005_pos.ksh new file mode 100644 index 0000000000..ce84a5c7b2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_005_pos.ksh @@ -0,0 +1,81 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs create -o property=value filesystem' can successfully create a ZFS +# filesystem with multiple properties set. +# +# STRATEGY: +# 1. Create a ZFS filesystem in the storage pool with multiple -o options +# 2. Verify the filesystem created successfully +# 3. Verify the properties are correctly set +# + +verify_runnable "both" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTFS1 && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 +} + +log_onexit cleanup + + +log_assert "'zfs create -o property=value filesystem' can successfully create \ + a ZFS filesystem with multiple properties set." + +typeset -i i=0 +typeset opts="" + +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ ${RW_FS_PROP[$i]} != *"checksum"* ]]; then + opts="$opts -o ${RW_FS_PROP[$i]}" + fi + (( i = i + 1 )) +done + +log_must $ZFS create $opts $TESTPOOL/$TESTFS1 +datasetexists $TESTPOOL/$TESTFS1 || \ + log_fail "zfs create $TESTPOOL/$TESTFS1 fail." + +i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + if [[ ${RW_FS_PROP[$i]} != *"checksum"* ]]; then + propertycheck $TESTPOOL/$TESTFS1 ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + fi + (( i = i + 1 )) +done + +log_pass "'zfs create -o property=value filesystem' can successfully create \ + a ZFS filesystem with multiple properties set." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_006_pos.ksh new file mode 100644 index 0000000000..e47b06444f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_006_pos.ksh @@ -0,0 +1,84 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs create -o property=value -V size volume' can successfully create a ZFS +# volume with correct property set. +# +# STRATEGY: +# 1. Create a ZFS volume in the storage pool with -o option +# 2. Verify the volume created successfully +# 3. Verify the property is correctly set +# + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL1 && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTVOL1 +} + +log_onexit cleanup + + +log_assert "'zfs create -o property=value -V size volume' can successfully \ + create a ZFS volume with correct property set." + +typeset -i i=0 +while (( $i < ${#RW_VOL_PROP[*]} )); do + log_must $ZFS create -o ${RW_VOL_PROP[$i]} -V $VOLSIZE \ + $TESTPOOL/$TESTVOL1 + datasetexists $TESTPOOL/$TESTVOL1 || \ + log_fail "zfs create -V size $TESTPOOL/$TESTVOL1 fail." + propertycheck $TESTPOOL/$TESTVOL1 ${RW_VOL_PROP[i]} || \ + log_fail "${RW_VOL_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTVOL1 + + log_must $ZFS create -s -o ${RW_VOL_PROP[$i]} -V $VOLSIZE \ + $TESTPOOL/$TESTVOL1 + datasetexists $TESTPOOL/$TESTVOL1 || \ + log_fail "zfs create -s -V $TESTPOOL/$TESTVOL1 fail." + propertycheck $TESTPOOL/$TESTVOL1 ${RW_VOL_PROP[i]} || \ + log_fail "${RW_VOL_PROP[i]} is failed to set." + log_must $ZFS destroy -f $TESTPOOL/$TESTVOL1 + + (( i = i + 1 )) +done + +log_pass "'zfs create -o property=value -V size volume' can successfully \ + create a ZFS volume with correct property set." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_007_pos.ksh new file mode 100644 index 0000000000..511031865e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_007_pos.ksh @@ -0,0 +1,91 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs create -o property=value -V size volume' can successfully create a ZFS +# volume with multiple properties set. +# +# STRATEGY: +# 1. Create a ZFS volume in the storage pool with -o option +# 2. Verify the volume created successfully +# 3. Verify the properties are correctly set +# + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL1 && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTVOL1 +} + +log_onexit cleanup + + +log_assert "'zfs create -o property=value -V size volume' can successfully \ + create a ZFS volume with correct property set." + +typeset -i i=0 +typeset opts="" + +while (( $i < ${#RW_VOL_PROP[*]} )); do + if [[ ${RW_VOL_PROP[$i]} != *"checksum"* ]]; then + opts="$opts -o ${RW_VOL_PROP[$i]}" + fi + (( i = i + 1 )) +done + +log_must $ZFS create $opts -V $VOLSIZE $TESTPOOL/$TESTVOL +datasetexists $TESTPOOL/$TESTVOL || \ + log_fail "zfs create $TESTPOOL/$TESTVOL fail." +log_must $ZFS create -s $opts -V $VOLSIZE $TESTPOOL/$TESTVOL1 +datasetexists $TESTPOOL/$TESTVOL1 || \ + log_fail "zfs create $TESTPOOL/$TESTVOL1 fail." + +i=0 +while (( $i < ${#RW_VOL_PROP[*]} )); do + if [[ ${RW_VOL_PROP[$i]} != *"checksum"* ]]; then + propertycheck $TESTPOOL/$TESTVOL ${RW_VOL_PROP[i]} || \ + log_fail "${RW_VOL_PROP[i]} is failed to set." + propertycheck $TESTPOOL/$TESTVOL1 ${RW_VOL_PROP[i]} || \ + log_fail "${RW_VOL_PROP[i]} is failed to set." + fi + (( i = i + 1 )) +done + +log_pass "'zfs create -o property=value -V size volume' can successfully \ + create a ZFS volume with correct property set." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_008_neg.ksh new file mode 100644 index 0000000000..55690cb3ba --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_008_neg.ksh @@ -0,0 +1,101 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create.cfg + +# +# DESCRIPTION: +# 'zfs create' should return an error with badly formed parameters. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zfs create' +# 3. Verify an error is returned. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1 ; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS1 + fi +} + +log_onexit cleanup + +set -A args "ab" "-?" "-cV" "-Vc" "-c -V" "c" "V" "--c" "-e" "-s" \ + "-blah" "-cV 12k" "-s -cV 1P" "-sc" "-Vs 5g" "-o" "--o" "-O" "--O" \ + "-o QuOta=none" "-o quota=non" "-o quota=abcd" "-o quota=0" "-o quota=" \ + "-o ResErVaTi0n=none" "-o reserV=none" "-o reservation=abcd" "-o reserv=" \ + "-o recorDSize=64k" "-o recordsize=256K" "-o recordsize=256" \ + "-o recsize=" "-o recsize=zero" "-o recordsize=0" \ + "-o mountPoint=/tmp/tmpfile$$" "-o mountpoint=non0" "-o mountpoint=" \ + "-o mountpoint=LEGACY" "-o mounpoint=none" \ + "-o sharenfs=ON" "-o ShareNFS=off" "-o sharenfs=sss" \ + "-o checkSUM=on" "-o checksum=SHA256" "-o chsum=off" "-o checksum=aaa" \ + "-o checkSUM=on -V $VOLSIZE" "-o checksum=SHA256 -V $VOLSIZE" \ + "-o chsum=off -V $VOLSIZE" "-o checksum=aaa -V $VOLSIZE" \ + "-o compression=of" "-o ComPression=lzjb" "-o compress=ON" "-o compress=a" \ + "-o compression=of -V $VOLSIZE" "-o ComPression=lzjb -V $VOLSIZE" \ + "-o compress=ON -V $VOLSIZE" "-o compress=a -V $VOLSIZE" \ + "-o atime=ON" "-o ATime=off" "-o atime=bbb" \ + "-o deviCes=on" "-o devices=OFF" "-o devices=aaa" \ + "-o exec=ON" "-o EXec=off" "-o exec=aaa" \ + "-o readonly=ON" "-o reADOnly=off" "-o rdonly=OFF" "-o rdonly=aaa" \ + "-o readonly=ON -V $VOLSIZE" "-o reADOnly=off -V $VOLSIZE" \ + "-o rdonly=OFF -V $VOLSIZE" "-o rdonly=aaa -V $VOLSIZE" \ + "-o zoned=ON" "-o ZoNed=off" "-o zoned=aaa" \ + "-o snapdIR=hidden" "-o snapdir=VISible" "-o snapdir=aaa" \ + "-o aclmode=DIScard" "-o aclmODE=groupmask" "-o aclmode=aaa" \ + "-o aclinherit=deny" "-o aclinHerit=secure" "-o aclinherit=aaa" \ + "-o type=volume" "-o type=snapshot" "-o type=filesystem" \ + "-o type=volume -V $VOLSIZE" "-o type=snapshot -V $VOLSIZE" \ + "-o type=filesystem -V $VOLSIZE" \ + "-o creation=aaa" "-o creation=aaa -V $VOLSIZE" \ + "-o used=10K" "-o used=10K -V $VOLSIZE" \ + "-o available=10K" "-o available=10K -V $VOLSIZE" \ + "-o referenced=10K" "-o referenced=10K -V $VOLSIZE" \ + "-o compressratio=1.00x" "-o compressratio=1.00x -V $VOLSIZE" \ + "-o version=0" "-o version=1.234" "-o version=10K" "-o version=-1" \ + "-o version=aaa" "-o version=999" + +log_assert "'zfs create' should return an error with badly-formed parameters." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZFS create ${args[i]} $TESTPOOL/$TESTFS1 + log_mustnot $ZFS create -p ${args[i]} $TESTPOOL/$TESTFS1 + ((i = i + 1)) +done + +log_pass "'zfs create' with badly formed parameters failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_009_neg.ksh new file mode 100644 index 0000000000..1144191795 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_009_neg.ksh @@ -0,0 +1,127 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs create <filesystem>' fails with bad <filesystem> arguments, including: +# *Invalid character against the ZFS namespace +# *Incomplete component +# *Too many arguments +# *Filesystem already exists +# *Beyond maximal name length. +# *Same property set multiple times via '-o property=value' +# *Volume's property set on filesystem +# +# STRATEGY: +# 1. Create an array of <filesystem> arguments +# 2. Execute 'zfs create <filesystem>' with each argument +# 3. Verify an error is returned. +# + +verify_runnable "both" + +function cleanup +{ + typeset -i i + typeset found + + # + # check to see if there is any new fs created during the test + # if so destroy it. + # + for dset in $($ZFS list -H | \ + $AWK '{print $1}' | $GREP / ); do + found=false + i=0 + while (( $i < ${#existed_fs[*]} )); do + if [[ $dset == ${existed_fs[i]} ]]; then + found=true + break + fi + (( i = i + 1 )) + done + + # + # new fs created during the test, cleanup it + # + if [[ $found == "false" ]]; then + log_must $ZFS destroy -f $dset + fi + done +} + +log_onexit cleanup + +set -A args "$TESTPOOL/" "$TESTPOOL//blah" "$TESTPOOL/@blah" \ + "$TESTPOOL/blah@blah" "$TESTPOOL/blah^blah" "$TESTPOOL/blah%blah" \ + "$TESTPOOL/blah*blah" "$TESTPOOL/blah blah" \ + "-s $TESTPOOL/$TESTFS1" "-b 1092 $TESTPOOL/$TESTFS1" \ + "-b 64k $TESTPOOL/$TESTFS1" "-s -b 32k $TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$BYND_MAX_NAME" + +log_assert "Verify 'zfs create <filesystem>' fails with bad <filesystem> argument." + +datasetexists $TESTPOOL/$TESTFS || \ + log_must $ZFS create $TESTPOOL/$TESTFS + +set -A existed_fs $($ZFS list -H | $AWK '{print $1}' | $GREP / ) + +log_mustnot $ZFS create $TESTPOOL +log_mustnot $ZFS create $TESTPOOL/$TESTFS + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZFS create ${args[$i]} + log_mustnot $ZFS create -p ${args[$i]} + ((i = i + 1)) +done + +i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + log_mustnot $ZFS create -o ${RW_FS_PROP[i]} -o ${RW_FS_PROP[i]} \ + $TESTPOOL/$TESTFS1 + log_mustnot $ZFS create -p -o ${RW_FS_PROP[i]} -o ${RW_FS_PROP[i]} \ + $TESTPOOL/$TESTFS1 + ((i = i + 1)) +done + +i=0 +while (( $i < ${#VOL_ONLY_PROP[*]} )); do + log_mustnot $ZFS create -o ${VOL_ONLY_PROP[i]} $TESTPOOL/$TESTFS1 + log_mustnot $ZFS create -p -o ${VOL_ONLY_PROP[i]} $TESTPOOL/$TESTFS1 + ((i = i + 1)) +done + +log_pass "'zfs create <filesystem>' fails as expected with bad <filesystem> argument." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_010_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_010_neg.ksh new file mode 100644 index 0000000000..f7773c0727 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_010_neg.ksh @@ -0,0 +1,149 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_create/properties.kshlib + +# +# DESCRIPTION: +# 'zfs create [-b <blocksize> ] -V <size> <volume>' fails with badly formed +# <size> or <volume> arguments,including: +# *Invalid volume size and volume name +# *Invalid blocksize +# *Incomplete component in the dataset tree +# *The volume already exists +# *The volume name beyond the maximal name length - 256. +# *Same property set multiple times via '-o property=value' +# *Filesystems's property set on volume +# +# STRATEGY: +# 1. Create an array of badly formed arguments +# 2. For each argument, execute 'zfs create -V <size> <volume>' +# 3. Verify an error is returned. +# + +verify_runnable "global" + +function cleanup +{ + typeset -i i + typeset found + + # + # check to see if there is any new fs created during the test + # if so destroy it. + # + for dset in $($ZFS list -H | \ + $AWK '{print $1}' | $GREP / ); do + found=false + i=0 + while (( $i < ${#existed_fs[*]} )); do + if [[ $dset == ${existed_fs[i]} ]]; then + found=true + break + fi + (( i = i + 1 )) + done + + # + # new fs created during the test, cleanup it + # + if [[ $found == "false" ]]; then + log_must $ZFS destroy -f $dset + fi + done +} + +log_onexit cleanup + +log_assert "Verify 'zfs create [-s] [-b <blocksize> ] -V <size> <volume>' fails with" \ + "badly-formed <size> or <volume> arguments." + +set -A args "$VOLSIZE" "$TESTVOL1" \ + "$VOLSIZE $TESTVOL1" "0 $TESTPOOL/$TESTVOL1" \ + "-1gb $TESTPOOL/$TESTVOL1" "1g? $TESTPOOL/$TESTVOL1" \ + "1.01BB $TESTPOOL/$TESTVOL1" "1%g $TESTPOOL/$TESTVOL1" \ + "1g% $TESTPOOL/$TESTVOL1" "1g$ $TESTPOOL/$TESTVOL1" \ + "$m $TESTPOOL/$TESTVOL1" "1m$ $TESTPOOL/$TESTVOL1" \ + "1m! $TESTPOOL/$TESTVOL1" \ + "1gbb $TESTPOOL/blah" "1blah $TESTPOOL/blah" "blah $TESTPOOL/blah" \ + "$VOLSIZE $TESTPOOL" "$VOLSIZE $TESTPOOL/" "$VOLSIZE $TESTPOOL//blah"\ + "$VOLSIZE $TESTPOOL/blah@blah" "$VOLSIZE $TESTPOOL/blah^blah" \ + "$VOLSIZE $TESTPOOL/blah*blah" "$VOLSIZE $TESTPOOL/blah%blah" \ + "$VOLSIZE blah" "$VOLSIZE $TESTPOOL/$BYND_MAX_NAME" \ + "1m -b $TESTPOOL/$TESTVOL1" "1m -b 11k $TESTPOOL/$TESTVOL1" \ + "1m -b 511 $TESTPOOL/$TESTVOL1" "1m -b 256k $TESTPOOL/$TESTVOL1" + +set -A options "" "-s" + +datasetexists $TESTPOOL/$TESTVOL || \ + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + +set -A existed_fs $($ZFS list -H | $AWK '{print $1}' | $GREP / ) + +log_mustnot $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL +log_mustnot $ZFS create -s -V $VOLSIZE $TESTPOOL/$TESTVOL + +typeset -i i=0 +typeset -i j=0 +while (( i < ${#options[*]} )); do + + j=0 + while (( j < ${#args[*]} )); do + log_mustnot $ZFS create ${options[$i]} -V ${args[$j]} + log_mustnot $ZFS create -p ${options[$i]} -V ${args[$j]} + + ((j = j + 1)) + done + + j=0 + while (( $j < ${#RW_VOL_PROP[*]} )); do + log_mustnot $ZFS create ${options[$i]} -o ${RW_VOL_PROP[j]} \ + -o ${RW_VOL_PROP[j]} -V $VOLSIZE $TESTPOOL/$TESTVOL1 + log_mustnot $ZFS create -p ${options[$i]} -o ${RW_VOL_PROP[j]} \ + -o ${RW_VOL_PROP[j]} -V $VOLSIZE $TESTPOOL/$TESTVOL1 + ((j = j + 1)) + done + + j=0 + while (( $j < ${#FS_ONLY_PROP[*]} )); do + log_mustnot $ZFS create ${options[$i]} -o ${FS_ONLY_PROP[j]} \ + -V $VOLSIZE $TESTPOOL/$TESTVOL1 + log_mustnot $ZFS create -p ${options[$i]} -o ${FS_ONLY_PROP[j]} \ + -V $VOLSIZE $TESTPOOL/$TESTVOL1 + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "'zfs create [-s][-b <blocksize>] -V <size> <volume>' fails as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_011_pos.ksh new file mode 100644 index 0000000000..ba2e55f583 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_011_pos.ksh @@ -0,0 +1,65 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs create -p' should work as expecteed +# +# STRATEGY: +# 1. To create $newdataset with -p option, first make sure the upper level +# of $newdataset does not exist +# 2. Make sure without -p option, 'zfs create' will fail +# 3. Create $newdataset with -p option, verify it is created +# 4. Run 'zfs create -p $newdataset' again, the exit code should be zero +# even $newdataset exists +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1 ; then + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS1 + fi +} + +log_onexit cleanup + +typeset newdataset1="$TESTPOOL/$TESTFS1/$TESTFS/$TESTFS1" +typeset newdataset2="$TESTPOOL/$TESTFS1/$TESTFS/$TESTVOL1" + +log_assert "'zfs create -p' works as expected." + +log_must verify_opt_p_ops "create" "fs" $newdataset1 + +# verify volume creation +if is_global_zone; then + log_must verify_opt_p_ops "create" "vol" $newdataset2 +fi + +log_pass "'zfs create -p' works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_012_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_012_pos.ksh new file mode 100644 index 0000000000..fe50460615 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_012_pos.ksh @@ -0,0 +1,66 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# 'zfs create -p -o version=1' should only cause the leaf filesystem to be version=1 +# +# STRATEGY: +# 1. Create $newdataset with -p option, verify it is created +# 2. Verify only the leaf filesystem to be version=1, others use the current version +# + +ZFS_VERSION=$($ZFS upgrade | $HEAD -1 | $AWK '{print $NF}' \ + | $SED -e 's/\.//g') + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS1 ; then + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS1 + fi +} + +log_onexit cleanup + + +typeset newdataset1="$TESTPOOL/$TESTFS1/$TESTFS/$TESTFS1" + +log_assert "'zfs create -p -o version=1' only cause the leaf filesystem to be version=1." + +log_must $ZFS create -p -o version=1 $newdataset1 +log_must datasetexists $newdataset1 + +log_must check_fs_version $TESTPOOL/$TESTFS1/$TESTFS/$TESTFS1 1 +for fs in $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS ; do + log_must check_fs_version $fs $ZFS_VERSION +done + +log_pass "'zfs create -p -o version=1' only cause the leaf filesystem to be version=1." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_013_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_013_pos.ksh new file mode 100644 index 0000000000..460ee8fd24 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_013_pos.ksh @@ -0,0 +1,78 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create.cfg + +# +# DESCRIPTION: +# 'zfs create -s -V <size> <volume>' can create various-size sparse volume +# with long fs name +# +# STRATEGY: +# 1. Create a volume in the storage pool. +# 2. Verify the volume is created correctly. +# + +verify_runnable "global" + +function cleanup +{ + typeset -i j=0 + while [[ $j -lt ${#size[*]} ]]; do + datasetexists $TESTPOOL/${LONGFSNAME}${size[j]} && \ + log_must $ZFS destroy $TESTPOOL/${LONGFSNAME}${size[j]} + ((j = j + 1)) + done +} + +log_onexit cleanup + + +log_assert "'zfs create -s -V <size> <volume>' succeeds" + +typeset -i j=0 +while (( $j < ${#size[*]} )); do + typeset cmdline="$ZFS create -s -V ${size[j]} \ + $TESTPOOL/${LONGFSNAME}${size[j]}" + + str=$(eval $cmdline 2>&1) + if (( $? == 0 )); then + log_note "SUCCESS: $cmdline" + log_must datasetexists $TESTPOOL/${LONGFSNAME}${size[j]} + elif [[ $str == *${VOL_LIMIT_KEYWORD1}* || \ + $str == *${VOL_LIMIT_KEYWORD2}* || \ + $str == *${VOL_LIMIT_KEYWORD3}* ]] + then + log_note "UNSUPPORTED: $cmdline" + else + log_fail "$cmdline" + fi + + ((j = j + 1)) +done + +log_pass "'zfs create -s -V <size> <volume>' works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib new file mode 100644 index 0000000000..bbc1273daa --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib @@ -0,0 +1,51 @@ +# +# 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 +# + +#!/bin/ksh -p +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# Check if the user property is identical to the expected value. +# +# $1 dataset +# $2 property string +# +function propertycheck +{ + typeset dtst=$1 + typeset propstr=$2 + + typeset prop=$($ECHO $propstr | $AWK -F= '{print $1}') + typeset expect_value=$($ECHO $propstr | $AWK -F= '{print $2}') + typeset value=$($ZFS get -H -o value $prop $dtst) + + + if [[ "$expect_value" == "$value" ]]; then + return 0 + else + return 1 + fi +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/Makefile new file mode 100644 index 0000000000..f1e60b5451 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/Makefile @@ -0,0 +1,59 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_destroy + +PROGS = cleanup \ + setup \ + zfs_destroy_001_pos \ + zfs_destroy_002_pos \ + zfs_destroy_003_pos \ + zfs_destroy_004_pos \ + zfs_destroy_005_neg \ + zfs_destroy_006_neg \ + zfs_destroy_007_neg \ + zfs_destroy_008_pos \ + zfs_destroy_009_pos \ + zfs_destroy_010_pos \ + zfs_destroy_011_pos \ + zfs_destroy_012_pos \ + zfs_destroy_013_neg \ + zfs_destroy_014_pos \ + zfs_destroy_015_pos \ + zfs_destroy_016_pos + +FILES = zfs_destroy_common.kshlib \ + zfs_destroy.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/cleanup.ksh new file mode 100644 index 0000000000..ad4549b8df --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +cleanup_testenv + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg new file mode 100644 index 0000000000..a62739b07e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg @@ -0,0 +1,39 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export TESTFSCLONE=${TESTFS}clone +export TESTVOLCLONE=${TESTVOL}clone +export CTR=$TESTPOOL/$TESTCTR +export FS=$CTR/$TESTFS +export VOL=$CTR/$TESTVOL +export FSSNAP=$FS@$TESTSNAP +export VOLSNAP=$VOL@$TESTSNAP +export FSCLONE=$TESTPOOL/$TESTFSCLONE +export VOLCLONE=$TESTPOOL/$TESTVOLCLONE diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh new file mode 100644 index 0000000000..4aef51e0ae --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_001_pos.ksh @@ -0,0 +1,221 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +# +# DESCRIPTION: +# 'zfs destroy -r|-rf|-R|-Rf <fs|ctr|vol|snap>' should recursively destroy +# all children and clones based on options. +# +# STRATEGY: +# 1. Create test environment according to options. There are three test +# models can be created. Only ctr, fs & vol; with snap; with clone. +# 2. According to option, make the dataset busy or not. +# 3. Run 'zfs destroy [-rRf] <dataset>' +# 4. According to dataset and option, check if get the expected results. +# + +verify_runnable "both" + +# +# According to parameters, 1st, create suitable testing environment. 2nd, +# run 'zfs destroy $opt <dataset>'. 3rd, check the system status. +# +# $1 option of 'zfs destroy' +# $2 dataset will be destroied. +# +function test_n_check +{ + typeset opt=$1 + typeset dtst=$2 + + if ! is_global_zone ; then + if [[ $dtst == $VOL || $dtst == $VOLSNAP ]]; then + log_note "UNSUPPORTED: Volume are unavailable in LZ." + return + fi + fi + + # '-f' has no effect on non-filesystems + if [[ $opt == -f ]]; then + if [[ $dtst != $FS ]]; then + log_note "UNSUPPORTED: '-f ' is only available for " \ + "leaf FS." + return + fi + fi + + # Clean the test environment and make it clear. + if datasetexists $CTR; then + log_must $ZFS destroy -Rf $CTR + fi + + # According to option create test compatible environment. + case $opt in + -r|-rf) setup_testenv snap ;; + -R|-Rf) setup_testenv clone ;; + -f) setup_testenv ;; + *) log_fail "Incorrect option: '$opt'." ;; + esac + + # + # According to different dataset type, create busy condition when try to + # destroy this dataset. + # + typeset mpt_dir + case $dtst in + $CTR|$FS) + if [[ $opt == *f* ]]; then + mpt_dir=$(get_prop mountpoint $FS) + pidlist="$pidlist $($MKBUSY \ + $mpt_dir/$TESTFILE0)" + log_note "$MKBUSY $mpt_dir/$TESTFILE0 " \ + "(pidlist: $pidlist)" + [[ -z $pidlist ]] && \ + log_fail "Failure from $MKBUSY" + log_mustnot $ZFS destroy -rR $dtst + fi + ;; + $VOL) + if [[ $opt == *f* ]]; then + pidlist="$pidlist $($MKBUSY \ + $TESTDIR1/$TESTFILE0)" + log_note "$MKBUSY $TESTDIR1/$TESTFILE0 " \ + "(pidlist: $pidlist)" + [[ -z $pidlist ]] && \ + log_fail "Failure from $MKBUSY" + log_mustnot $ZFS destroy -rR $dtst + fi + ;; + $VOLSNAP) + if [[ $opt == *f* ]]; then + pidlist="$pidlist $($MKBUSY \ + $TESTDIR1/$TESTFILE0)" + log_note "$MKBUSY $TESTDIR1/$TESTFILE0 " \ + "(pidlist: $pidlist)" + [[ -z $pidlist ]] && \ + log_fail "Failure from $MKBUSY" + log_must $ZFS destroy -rR $dtst + log_must $ZFS snapshot $dtst + fi + ;; + $FSSNAP) + if [[ $opt == *f* ]]; then + mpt_dir=$(snapshot_mountpoint $dtst) + pidlist="$pidlist $($MKBUSY $mpt_dir)" + log_note "$MKBUSY $mpt_dir (pidlist: $pidlist)" + [[ -z $pidlist ]] && \ + log_fail "Failure from $MKBUSY" + log_must $ZFS destroy -rR $dtst + log_must $ZFS snapshot $dtst + fi + ;; + *) log_fail "Unsupported dataset: '$dtst'." + esac + + # Firstly, umount ufs filesystem which was created by zfs volume. + if is_global_zone; then + log_must $UMOUNT -f $TESTDIR1 + fi + + # Invoke 'zfs destroy [-rRf] <dataset>' + log_must $ZFS destroy $opt $dtst + + # Kill any lingering instances of mkbusy, and clear the list. + [[ -z $pidlist ]] || log_must $KILL -TERM $pidlist + pidlist="" + log_mustnot $PGREP -fl $MKBUSY + + case $dtst in + $CTR) check_dataset datasetnonexists \ + $CTR $FS $VOL $FSSNAP $VOLSNAP + if [[ $opt == *R* ]]; then + check_dataset datasetnonexists \ + $FSCLONE $VOLCLONE + fi + ;; + $FS) check_dataset datasetexists $CTR $VOL + check_dataset datasetnonexists $FS + if [[ $opt != -f ]]; then + check_dataset datasetexists $VOLSNAP + check_dataset datasetnonexists $FSSNAP + fi + if [[ $opt == *R* ]]; then + check_dataset datasetexists $VOLCLONE + check_dataset datasetnonexists $FSCLONE + fi + ;; + $VOL) check_dataset datasetexists $CTR $FS $FSSNAP + check_dataset datasetnonexists $VOL $VOLSNAP + if [[ $opt == *R* ]]; then + check_dataset datasetexists $FSCLONE + check_dataset datasetnonexists $VOLCLONE + fi + ;; + $FSSNAP) + check_dataset datasetexists $CTR $FS $VOL $VOLSNAP + check_dataset datasetnonexists $FSSNAP + if [[ $opt == *R* ]]; then + check_dataset datasetexists $VOLCLONE + check_dataset datasetnonexists $FSCLONE + fi + ;; + $VOLSNAP) + check_dataset datasetexists $CTR $FS $VOL $FSSNAP + check_dataset datasetnonexists $VOLSNAP + if [[ $opt == *R* ]]; then + check_dataset datasetexists $FSCLONE + check_dataset datasetnonexists $VOLCLONE + fi + ;; + esac + + log_note "'$ZFS destroy $opt $dtst' passed." +} + +log_assert "'zfs destroy -r|-R|-f|-rf|-Rf <fs|ctr|vol|snap>' should " \ + "recursively destroy all children." +log_onexit cleanup_testenv + +typeset dtst="" +typeset opt="" +typeset pidlist="" +for dtst in $CTR $FS $VOL $FSSNAP $VOLSNAP; do + for opt in "-r" "-R" "-f" "-rf" "-Rf"; do + log_note "Starting test: $ZFS destroy $opt $dtst" + test_n_check $opt $dtst + done +done + +log_pass "'zfs destroy -r|-R|-f|-rf|-Rf <fs|ctr|vol|snap>' passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_002_pos.ksh new file mode 100644 index 0000000000..5e27ce10fb --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_002_pos.ksh @@ -0,0 +1,96 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg + +# +# DESCRIPTION: +# 'zfs destroy <filesystem|volume|snapshot>' can successfully destroy +# the specified dataset which has no active dependents. +# +# STRATEGY: +# 1. Create a filesystem,volume and snapshot in the storage pool +# 2. Destroy the filesystem,volume and snapshot +# 3. Verify the datasets are destroyed successfully +# + +verify_runnable "both" + +function cleanup +{ + typeset -i i=0 + while (( $i < ${#data_objs[*]} )); do + datasetexists "${data_objs[i]}" && \ + $ZFS destroy -rf ${data_objs[i]} + ((i = i + 1)) + done +} + +log_assert "Verify 'zfs destroy' can destroy the specified datasets without active" \ + "dependents." +log_onexit cleanup + +if is_global_zone ; then + set -A data_objs "$TESTPOOL/$TESTFS@$TESTSNAP" "$TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTVOL1" +else + set -A data_objs "$TESTPOOL/$TESTFS@$TESTSNAP" "$TESTPOOL/$TESTFS1" +fi + +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP + +if is_global_zone ; then + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + + # Max volume size is 1TB on 32-bit systems + [[ $($ISAINFO -b) == 32 ]] && \ + BIGVOLSIZE=1Tb + log_must $ZFS create -sV $BIGVOLSIZE $TESTPOOL/$TESTVOL1 +fi + +typeset -i i=0 +while (( $i < ${#data_objs[*]} )); do + datasetexists ${data_objs[i]} || \ + log_fail "Create <filesystem>|<volume>|<snapshot> fail." + ((i = i + 1)) +done + +i=0 +while (( $i < ${#data_objs[*]} )); do + log_must $ZFS destroy ${data_objs[i]} + datasetexists ${data_objs[i]} && \ + log_fail "'zfs destroy <filesystem>|<volume>|<snapshot>' fail." + ((i = i + 1)) +done + +log_pass "'zfs destroy <filesystem>|<volume>|<snapshot>' works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_003_pos.ksh new file mode 100644 index 0000000000..a18c0d6161 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_003_pos.ksh @@ -0,0 +1,156 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg + +# +# DESCRIPTION: +# Verify 'zfs destroy [-rR]' succeeds as root. +# +# STRATEGY: +# 1. Create two datasets in the storage pool +# 2. Create fs,vol,ctr,snapshot and clones of snapshot in the two datasets +# 3. Create clone in the second dataset for the snapshot in the first dataset +# 4. Verify 'zfs destroy -r' fails to destroy dataset with clone outside it +# 5. Verify 'zfs destroy -R' succeeds to destroy dataset with clone outside it +# 6. Verify 'zfs destroy -r' succeeds to destroy dataset without clone outside it. +# + +verify_runnable "both" + +function cleanup +{ + for obj in $ctr2 $ctr1 $ctr; do + datasetexists $obj && \ + log_must $ZFS destroy -Rf $obj + done + + for mntp in $TESTDIR1 $TESTDIR2; do + [[ -d $mntp ]] && \ + log_must $RM -rf $mntp + done +} + +log_assert "Verify that 'zfs destroy [-rR]' succeeds as root. " + +log_onexit cleanup + +# +# Preparations for testing +# +for dir in $TESTDIR1 $TESTDIR2; do + [[ ! -d $dir ]] && \ + log_must $MKDIR -p $dir +done + +ctr=$TESTPOOL/$TESTCTR +ctr1=$TESTPOOL/$TESTCTR1 +ctr2=$ctr/$TESTCTR2 +ctr3=$ctr1/$TESTCTR2 +child_fs=$ctr/$TESTFS1 +child_fs1=$ctr1/$TESTFS2 +child_fs_mntp=$TESTDIR1 +child_fs1_mntp=$TESTDIR2 +child_vol=$ctr/$TESTVOL +child_vol1=$ctr1/$TESTVOL +child_fs_snap=$child_fs@snap +child_fs1_snap=$child_fs1@snap +child_fs_snap_clone=$ctr/$TESTCLONE +child_fs_snap_clone1=$ctr1/${TESTCLONE}_across_ctr +child_fs_snap_clone2=$ctr2/$TESTCLONE2 +child_fs1_snap_clone=$ctr1/$TESTCLONE1 +child_fs1_snap_clone1=$ctr/${TESTCLONE1}_across_ctr + +# +# Create two datasets in the storage pool +# +log_must $ZFS create $ctr +log_must $ZFS create $ctr1 + +# +# Create children datasets fs,vol,snapshot in the datasets, and +# clones across two datasets +# +log_must $ZFS create $ctr2 + +for fs in $child_fs $child_fs1; do + log_must $ZFS create $fs +done + +log_must $ZFS set mountpoint=$child_fs_mntp $child_fs +log_must $ZFS set mountpoint=$child_fs1_mntp $child_fs1 + +for snap in $child_fs_snap $child_fs1_snap; do + log_must $ZFS snapshot $snap +done + +if is_global_zone ; then + for vol in $child_vol $child_vol1; do + log_must $ZFS create -V $VOLSIZE $vol + done +fi + +for clone in $child_fs_snap_clone $child_fs_snap_clone1; do + log_must $ZFS clone $child_fs_snap $clone +done + + +for clone in $child_fs1_snap_clone $child_fs1_snap_clone1; do + log_must $ZFS clone $child_fs1_snap $clone +done + +log_note "Verify that 'zfs destroy -r' fails to destroy dataset " \ + "with clone dependant outside it." + +for obj in $child_fs $child_fs1 $ctr $ctr1; do + log_mustnot $ZFS destroy -r $obj + datasetexists $obj || \ + log_fail "'zfs destroy -r' fails to keep clone " \ + "dependant outside the hirearchy." +done + + +log_note "Verify that 'zfs destroy -R' succeeds to destroy dataset " \ + "with clone dependant outside it." + +log_must $ZFS destroy -R $ctr1 +datasetexists $ctr1 && \ + log_fail "'zfs destroy -R' fails to destroy dataset with clone outside it." + +log_note "Verify that 'zfs destroy -r' succeeds to destroy dataset " \ + "without clone dependant outside it." + +log_must $ZFS destroy -r $ctr +datasetexists $ctr && \ + log_fail "'zfs destroy -r' fails to destroy dataset with clone outside it." + +log_pass "'zfs destroy [-rR] succeeds as root." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_004_pos.ksh new file mode 100644 index 0000000000..6919bdf427 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_004_pos.ksh @@ -0,0 +1,120 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg + +# +# DESCRIPTION: +# Verify 'zfs destroy -f' succeeds as root. +# +# STRATEGY: +# 1. Create filesystem in the storage pool +# 2. Set mountpoint for the filesystem and make it busy +# 3. Verify that 'zfs destroy' fails to destroy the filesystem +# 4. Verify 'zfs destroy -f' succeeds to destroy the filesystem. +# + +verify_runnable "both" + +function cleanup +{ + cd $olddir + + datasetexists $clone && \ + log_must $ZFS destroy -f $clone + + snapexists $snap && \ + log_must $ZFS destroy -f $snap + + for fs in $fs1 $fs2; do + datasetexists $fs && \ + log_must $ZFS destroy -f $fs + done + + for dir in $TESTDIR1 $TESTDIR2; do + [[ -d $dir ]] && \ + log_must $RM -rf $dir + done +} + +log_assert "Verify that 'zfs destroy -f' succeeds as root. " + +log_onexit cleanup + +# +# Preparations for testing +# +olddir=$PWD + +for dir in $TESTDIR1 $TESTDIR2; do + [[ ! -d $dir ]] && \ + log_must $MKDIR -p $dir +done + +fs1=$TESTPOOL/$TESTFS1 +mntp1=$TESTDIR1 +fs2=$TESTPOOL/$TESTFS2 +snap=$TESTPOOL/$TESTFS2@snap +clone=$TESTPOOL/$TESTCLONE +mntp2=$TESTDIR2 + +# +# Create filesystem and clone in the storage pool, mount them and +# make the mountpoint busy +# +for fs in $fs1 $fs2; do + log_must $ZFS create $fs +done + +log_must $ZFS snapshot $snap +log_must $ZFS clone $snap $clone + +log_must $ZFS set mountpoint=$mntp1 $fs1 +log_must $ZFS set mountpoint=$mntp2 $clone + +for arg in "$fs1 $mntp1" "$clone $mntp2"; do + fs=`$ECHO $arg | $AWK '{print $1}'` + mntp=`$ECHO $arg | $AWK '{print $2}'` + + log_note "Verify that 'zfs destroy' fails to" \ + "destroy filesystem when it is busy." + cd $mntp + log_mustnot $ZFS destroy $fs + + log_must $ZFS destroy -f $fs + datasetexists $fs && \ + log_fail "'zfs destroy -f' fails to destroy busy filesystem." + + cd $olddir +done + +log_pass "'zfs destroy -f' succeeds as root." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_005_neg.ksh new file mode 100644 index 0000000000..baf182a622 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_005_neg.ksh @@ -0,0 +1,212 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +# +# DESCRIPTION: +# Seperately verify 'zfs destroy -f|-r|-rf|-R|-rR <dataset>' will fail in +# different conditions. +# +# STRATEGY: +# 1. Create pool, fs & vol. +# 2. Create snapshot for fs & vol. +# 3. Invoke 'zfs destroy ''|-f <dataset>', it should fail. +# 4. Create clone for fs & vol. +# 5. Invoke 'zfs destroy -r|-rf <dataset>', it should fail. +# 6. Write file to filesystem or enter snapshot mountpoint. +# 7. Invoke 'zfs destroy -R|-rR <dataset>', it should fail. +# + +verify_runnable "both" + +log_assert "Seperately verify 'zfs destroy -f|-r|-rf|-R|-rR <dataset>' will " \ + "fail in different conditions." +log_onexit cleanup_testenv + +# +# Run 'zfs destroy [-rRf] <dataset>', make sure it fail. +# +# $1 the collection of options +# $2 the collection of datasets +# +function negative_test +{ + typeset options=$1 + typeset datasets=$2 + + for dtst in $datasets; do + if ! is_global_zone; then + if [[ $dtst == $VOL || $dtst == $VOLSNAP || \ + $dtst == $VOLCLONE ]] + then + log_note "UNSUPPORTED: " \ + "Volume is unavailable in LZ." + continue + fi + fi + for opt in $options; do + log_mustnot $ZFS destroy $opt $dtst + done + done +} + +# +# Create snapshots for filesystem and volume, +# and verify 'zfs destroy' fails without '-r' or '-R'. +# +setup_testenv snap +negative_test "-f" "$CTR $FS $VOL" + +# +# Create clones for filesystem and volume, +# and verify 'zfs destroy' fails without '-R'. +# +setup_testenv clone +negative_test "-r -rf" "$CTR $FS $VOL" + +# +# Get $FS mountpoint and make it busy, and verify 'zfs destroy $CTR' fails +# without '-f'. Then verify the remaining datasets are correct. See below for +# an explanation of what 'correct' means for this test. +# +mntpt=$(get_prop mountpoint $FS) +pidlist=$($MKBUSY $mntpt/$TESTFILE0) +log_note "$MKBUSY $mntpt/$TESTFILE0 (pidlist: $pidlist)" +[[ -z $pidlist ]] && log_fail "Failure from mkbusy" +negative_test "-R -rR" $CTR + +# +# Checking the outcome of the test above is tricky, because the order in +# which datasets are destroyed is not deterministic. Both $FS and $VOL are +# busy, and the remaining datasets will be different depending on whether we +# tried (and failed) to delete $FS or $VOL first. + +# The following datasets will exist independent of the order +check_dataset datasetexists $CTR $FS $VOL + +if datasetexists $VOLSNAP && datasetnonexists $FSSNAP; then + # The recursive destroy failed on $FS + check_dataset datasetnonexists $FSSNAP $FSCLONE + check_dataset datasetexists $VOLSNAP $VOLCLONE +elif datasetexists $FSSNAP && datasetnonexists $VOLSNAP; then + # The recursive destroy failed on $VOL + check_dataset datasetnonexists $VOLSNAP $VOLCLONE + check_dataset datasetexists $FSSNAP $FSCLONE +else + log_must $ZFS list -rtall + log_fail "Unexpected datasets remaining" +fi + +# +# Create the clones for test environment, and verify 'zfs destroy $FS' fails +# without '-f'. Then verify the FS snap and clone are the only datasets +# that were removed. +# +setup_testenv clone +negative_test "-R -rR" $FS +check_dataset datasetexists $CTR $FS $VOL $VOLSNAP $VOLCLONE +check_dataset datasetnonexists $FSSNAP $FSCLONE + +log_must $KILL $pidlist +log_mustnot $PGREP -fl $MKBUSY +pidlist="" + +# +# Create the clones for test environment and make the volume busy. +# Then verify 'zfs destroy $CTR' fails without '-f'. +# +# Then verify the expected datasets exist (see below). +# +if is_global_zone; then + setup_testenv clone + pidlist=$($MKBUSY $TESTDIR1/$TESTFILE0) + log_note "$MKBUSY $TESTDIR1/$TESTFILE0 (pidlist: $pidlist)" + [[ -z $pidlist ]] && log_fail "Failure from mkbusy" + negative_test "-R -rR" $CTR + check_dataset datasetexists $CTR $VOL + check_dataset datasetnonexists $VOLSNAP $VOLCLONE + + # Here again, the non-determinism of destroy order is a factor. $FS, + # $FSSNAP and $FSCLONE will still exist here iff we attempted to destroy + # $VOL (and failed) first. So check that either all of the datasets are + # present, or they're all gone. + if datasetexists $FS; then + check_dataset datasetexists $FS $FSSNAP $FSCLONE + else + check_dataset datasetnonexists $FS $FSSNAP $FSCLONE + fi +fi + +# +# Create the clones for test environment and make the volume busy. +# Then verify 'zfs destroy $VOL' fails without '-f'. +# +# Then verify the snapshot and clone are destroyed, but nothing else is. +# +if is_global_zone; then + setup_testenv clone + negative_test "-R -rR" $VOL + check_dataset datasetexists $CTR $VOL $FS $FSSNAP $FSCLONE + check_dataset datasetnonexists $VOLSNAP $VOLCLONE +fi + +log_must $KILL $pidlist +log_mustnot $PGREP -fl $MKBUSY +pidlist="" + +# +# Create the clones for test environment and make the snapshot busy. +# Then verify 'zfs destroy $snap' succeeds without '-f'. +# +# Then verify the snapshot and clone are destroyed, but nothing else is. +# + +mntpt=$(snapshot_mountpoint $FSSNAP) +pidlist=$($MKBUSY $mntpt) +log_note "$MKBUSY $mntpt (pidlist: $pidlist)" +[[ -z $pidlist ]] && log_fail "Failure from mkbusy" + +for option in -R -rR ; do + setup_testenv clone + log_must $ZFS destroy $option $FSSNAP + check_dataset datasetexists $CTR $FS $VOL + check_dataset datasetnonexists $FSSNAP $FSCLONE +done + +log_must $KILL $pidlist +log_mustnot $PGREP -fl $MKBUSY +pidlist="" + +log_pass "zfs destroy -f|-r|-rf|-R|-rR <dataset>' failed in different " \ + "condition passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_006_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_006_neg.ksh new file mode 100644 index 0000000000..7e383c26a7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_006_neg.ksh @@ -0,0 +1,67 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg + +# +# DESCRIPTION: +# 'zfs destroy' should return an error with badly formed parameters, +# including null destroyed object parameter, invalid options excluding +# '-r' and '-f', non-existent datasets. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zfs destroy' +# 3. Verify an error is returned. +# + +verify_runnable "both" + + +set -A args "" "-r" "-f" "-rf" "-fr" "$TESTPOOL" "-f $TESTPOOL" \ + "-? $TESTPOOL/$TESTFS" "$TESTPOOL/blah"\ + "-r $TESTPOOL/blah" "-f $TESTPOOL/blah" "-rf $TESTPOOL/blah" \ + "-fr $TESTPOOL/blah" "-$ $TESTPOOL/$TESTFS" "-5 $TESTPOOL/$TESTFS" \ + "-rfgh $TESTPOOL/$TESTFS" "-rghf $TESTPOOL/$TESTFS" \ + "$TESTPOOL/$TESTFS@blah" "/$TESTPOOL/$TESTFS" "-f /$TESTPOOL/$TESTFS" \ + "-rf /$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS $TESTPOOL/$TESTFS" \ + "-rRf $TESTPOOL/$TESTFS $TESTPOOL/$TESTFS" + +log_assert "'zfs destroy' should return an error with badly-formed parameters." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZFS destroy ${args[i]} + ((i = i + 1)) +done + +log_pass "'zfs destroy' badly formed parameters fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_007_neg.ksh new file mode 100644 index 0000000000..72272a5c90 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_007_neg.ksh @@ -0,0 +1,76 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg + +# +# DESCRIPTION: +# 'zpool destroy' failed if this filesystem is namespace-parent +# of origin. +# +# STRATEGY: +# 1. Create pool, fs and snapshot. +# 2. Create a namespace-parent of origin clone. +# 3. Promote this clone +# 4. Verify the original fs can not be destroyed. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $clonesnap; then + log_must $ZFS promote $fs + fi + datasetexists $clone && log_must $ZFS destroy $clone + datasetexists $fssnap && log_must $ZFS destroy $fssnap +} + +log_assert "Destroy dataset which is namespace-parent of origin should failed." +log_onexit cleanup + +# Define variable $fssnap & and namespace-parent of origin clone. +fs=$TESTPOOL/$TESTFS +fssnap=$fs@snap +clone=$fs/clone +clonesnap=$fs/clone@snap + +# Define key word for expected failure. +KEY_WORDS="filesystem has children" + +log_must $ZFS snapshot $fssnap +log_must $ZFS clone $fssnap $clone +log_must $ZFS promote $clone +log_mustnot_expect "$KEY_WORDS" $ZFS destroy $fs +log_mustnot_expect "$KEY_WORDS" $ZFS destroy $clone + +log_pass "Destroy dataset which is namespace-parent of origin passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_008_pos.ksh new file mode 100644 index 0000000000..b9a866a3ff --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_008_pos.ksh @@ -0,0 +1,51 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +################################################################################ +# +# 'zfs destroy -d <snap>' should destroy the snapshot when no clone exists. +# +# 1. Create test environment without clones. +# 2. 'zfs destroy -d <snap>' +# 3. Verify that the snapshot was destroyed. +# +################################################################################ + +log_assert "'zfs destroy -d <snap>' destroys snapshot if there is no clone" +log_onexit cleanup_testenv + +setup_testenv snap + +for snap in $FSSNAP $VOLSNAP; do + log_must $ZFS destroy -d $snap + log_mustnot datasetexists $snap +done + +log_pass "'zfs destroy -d <snap>' destroys snapshot if there is no clone" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_009_pos.ksh new file mode 100644 index 0000000000..b602a3ec38 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_009_pos.ksh @@ -0,0 +1,60 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +################################################################################ +# +# 'zfs destroy -d <snap>' should mark snapshot for deferred destroy when +# clone exists and destroy when clone is destroyed. +# +# 1. Create test environment with clones. +# 2. 'zfs destroy -d <snap>' +# 3. Verify snapshot is marked for deferred destroy. +# 4. 'zfs destroy <clone>' +# 3. Verify that the snapshot and clone are destroyed. +# +################################################################################ + +log_assert "'zfs destroy -d <snap>' marks cloned snapshot for deferred destroy" +log_onexit cleanup_testenv + +setup_testenv clone + +for dstype in FS VOL; do + snap=$(eval echo \$${dstype}SNAP) + clone=$(eval echo \$${dstype}CLONE) + log_must $ZFS destroy -d $snap + log_must datasetexists $snap + log_must eval "[[ $(get_prop defer_destroy $snap) == 'on' ]]" + log_must $ZFS destroy $clone + log_mustnot datasetexists $snap + log_mustnot datasetexists $clone +done + +log_pass "'zfs destroy -d <snap>' marks cloned snapshot for deferred destroy" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_010_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_010_pos.ksh new file mode 100644 index 0000000000..150d0b3ead --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_010_pos.ksh @@ -0,0 +1,65 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +################################################################################ +# +# When using 'zfs destroy -R' on a file system heirarchy that inclues a +# snapshot and a clone of that snapshot, and the snapshot has been +# defer-destroyed, make sure that the 'zfs destroy -R' works as expected. +# In particular make sure that libzfs is not confused by the fact that the +# kernel will automatically remove the defer-destroyed snapshot when the +# clone is destroyed. +# +# 1. Create test environment. +# 2. Create a clone of the snapshot. +# 3. 'zfs destroy -d <snap>' +# 4. 'zfs destroy -R' +# 5. Verify that the snapshot and clone are destroyed. +# +################################################################################ + +log_assert "'zfs destroy -R' works on deferred destroyed snapshots" +log_onexit cleanup_testenv + +setup_testenv clone +log_must $UMOUNT -f $TESTDIR1 + +for dstype in FS VOL; do + ds=$(eval echo \$${dstype}) + snap=$(eval echo \$${dstype}SNAP) + clone=$(eval echo \$${dstype}CLONE) + log_must $ZFS destroy -d $snap + log_must datasetexists $snap + log_must $ZFS destroy -R $ds + log_mustnot datasetexists $snap + log_mustnot datasetexists $clone +done + +log_pass "'zfs destroy -R' works on deferred destroyed snapshots" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_011_pos.ksh new file mode 100644 index 0000000000..6039202ed2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_011_pos.ksh @@ -0,0 +1,50 @@ +#!/bin/ksh -p +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +################################################################################ +# +# 'zfs destroy -d <snap>' should mark snapshot for deferred destroy when +# there is a user hold. +# +# 1. Create test environment without clones. +# 2. 'zfs hold <tag> <snap>' +# 3. 'zfs destroy -d <snap>' +# 4. Verify snapshot is marked for deferred destroy. +# 5. 'zfs release <tag> <snap>' +# 6. Verify that the snapshot is destroyed. +# +################################################################################ + +log_assert "'zfs destroy -d <snap>' marks held snapshot for deferred destroy" +log_onexit cleanup_testenv + +setup_testenv snap + +for dstype in FS VOL; do + snap=$(eval echo \$${dstype}SNAP) + log_must $ZFS hold zfstest $snap + log_must $ZFS destroy -d $snap + log_must datasetexists $snap + log_must eval "[[ $(get_prop defer_destroy $snap) == 'on' ]]" + log_must $ZFS release zfstest $snap + log_mustnot datasetexists $snap +done + +log_pass "'zfs destroy -d <snap>' marks held snapshot for deferred destroy" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_012_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_012_pos.ksh new file mode 100644 index 0000000000..076e905159 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_012_pos.ksh @@ -0,0 +1,62 @@ +#!/bin/ksh -p +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +################################################################################ +# +# Deferred destroyed snapshots remain until the last hold is released. +# +# 1. Create test environment without clones. +# 2. 'zfs hold <tag1> <snap>' +# 3. 'zfs destroy -d <snap>' +# 4. Sequence of holds/releases including invalid ones that should fail. +# 4. Verify snapshot still exists. +# 5. Release all holds. +# 6. Verify that the snapshot is destroyed. +# +################################################################################ + +log_assert "deferred destroyed snapshots remain until last hold is released" +log_onexit cleanup_testenv + +setup_testenv snap + +for dstype in FS VOL; do + snap=$(eval echo \$${dstype}SNAP) + log_must $ZFS hold zfstest1 $snap + log_must $ZFS destroy -d $snap + log_must datasetexists $snap + log_must eval "[[ $(get_prop defer_destroy $snap) == 'on' ]]" + + log_must $ZFS hold zfstest2 $snap + log_mustnot $ZFS hold zfstest1 $snap + log_mustnot $ZFS hold zfstest2 $snap + + log_must $ZFS release zfstest1 $snap + log_must datasetexists $snap + log_mustnot $ZFS release zfstest1 $snap + log_must datasetexists $snap + log_mustnot $ZFS release zfstest3 $snap + log_must datasetexists $snap + + log_must $ZFS release zfstest2 $snap + log_mustnot datasetexists $snap +done + +log_pass "deferred destroyed snapshots remain until last hold is released" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_013_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_013_neg.ksh new file mode 100644 index 0000000000..198573d421 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_013_neg.ksh @@ -0,0 +1,49 @@ +#!/bin/ksh -p +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib + +################################################################################ +# +# Destroy of held snapshot should fail. +# +# 1. Create test environment without clones. +# 2. 'zfs hold <tag> <snap>' +# 3. 'zfs destroy <snap>' should fail. +# 4. Verify snapshot still exists. +# 5. 'zfs release <tag> <snap>' +# 6. Verify that we can destroy the snapshot. +# +################################################################################ + +log_assert "zfs destroy of held snapshots fails" +log_onexit cleanup_testenv + +setup_testenv snap + +for dstype in FS VOL; do + snap=$(eval echo \$${dstype}SNAP) + log_must $ZFS hold zfstest $snap + log_mustnot $ZFS destroy $snap + log_must datasetexists $snap + log_must $ZFS release zfstest $snap + log_must $ZFS destroy $snap + log_mustnot datasetexists $snap +done + +log_pass "zfs destroy of held snapshots fails" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_014_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_014_pos.ksh new file mode 100644 index 0000000000..5625785986 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_014_pos.ksh @@ -0,0 +1,79 @@ +#!/bin/ksh -p +# +# CDDL HEADER START +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. + +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# +# CDDL HEADER END +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg + +# +# DESCRIPTION: +# 'zfs destroy -R <snapshot>' can destroy all the child +# snapshots and preserves all the nested datasetss. +# +# STRATEGY: +# 1. Create nested datasets in the storage pool. +# 2. Create recursive snapshots for all the nested datasets. +# 3. Verify when snapshots are destroyed recursively, all +# the nested datasets still exist. +# + +verify_runnable "both" + +log_assert "Verify 'zfs destroy -R <snapshot>' does not destroy" \ + "nested datasets." +log_onexit cleanup + +datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 + $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3" + +function cleanup +{ + for ds in $datasets; do + datasetexists $ds && $ZFS destroy -rf $ds + done +} + +# create nested datasets +log_must $ZFS create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3 + +# verify dataset creation +for ds in $datasets; do + datasetexists $ds || log_fail "Create $ds dataset fail." +done + +# create recursive nestedd snapshot +log_must $ZFS snapshot -r $TESTPOOL/$TESTFS1@snap +for ds in $datasets; do + datasetexists $ds@snap || log_fail "Create $ds@snap snapshot fail." +done + +# destroy nested snapshot recursively +log_must $ZFS destroy -R $TESTPOOL/$TESTFS1@snap + +# verify snapshot destroy +for ds in $datasets; do + datasetexists $ds@snap && log_fail "$ds@snap exists. Destroy failed!" +done + +# verify nested datasets still exist +for ds in $datasets; do + datasetexists $ds || log_fail "Recursive snapshot destroy deleted $ds" +done + +log_pass "'zfs destroy -R <snapshot>' works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_015_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_015_pos.ksh new file mode 100644 index 0000000000..579e747841 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_015_pos.ksh @@ -0,0 +1,161 @@ +#!/bin/ksh +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +# DESCRIPTION +# zfs destroy <dataset@snap1,snap2..> can destroy a list of multiple +# snapshots from the same datasets +# +# STRATEGY +# 1. Create multiple snapshots for the same datset +# 2. Run zfs destroy for these snapshots for a mix of valid and +# invalid snapshot names +# 3. Run zfs destroy for snapshots from different datasets and +# pools + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg + +function cleanup +{ + datasetexists $TESTPOOL/$TESTFS1 && $ZFS destroy -R $TESTPOOL/$TESTFS1 + datasetexists $TESTPOOL/$TESTFS2 && $ZFS destroy -R $TESTPOOL/$TESTFS2 + poolexists $TESTPOOL2 && $ZPOOL destroy $TESTPOOL2 + $RM -rf $VIRTUAL_DISK +} + +log_assert "zfs destroy for multiple snapshot is handled correctly" +log_onexit cleanup + +$ZFS create $TESTPOOL/$TESTFS1 +typeset -i i=1 +snaplist="" +log_note "zfs destroy on valid snapshot names" +for i in 1 2 3 4 5; do + log_must $ZFS snapshot $TESTPOOL/$TESTFS1@snap$i + snaplist=$snaplist,snap$i +done +snaplist=${snaplist#,} +log_must $ZFS destroy $TESTPOOL/$TESTFS1@$snaplist +for i in 1 2 3 4 5; do + log_mustnot snapexists $TESTPOOL/$TESFS1@snap$i +done + +log_note "zfs destroy with all bogus snapshot names" +log_mustnot $ZFS destroy $TESTPOOL/$TESTFS1@snap12,snap21,sna@pple1@,s""nappy2 + +log_note "zfs destroy with some bogus snapshot names" +for i in 1 2 3; do + log_must $ZFS snapshot $TESTPOOL/$TESTFS1@snap$i +done +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap1,snap2,snapple1,snappy2,snap3 +for i in 1 2 3; do + log_mustnot snapexists $TESTPOOL/$TESTFS1@snap$i +done + +log_note "zfs destroy with some snapshot names having special characters" +for i in 1 2 3; do + log_must $ZFS snapshot $TESTPOOL/$TESTFS1@snap$i +done +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap1,@,snap2,,,,snap3, +for i in 1 2 3; do + log_mustnot snapexists $TESTPOOL/$TESTFS1@snap$i +done +log_note "zfs destroy for too many snapshots" +snaplist="" +for i in {1..100}; do + log_must $ZFS snapshot $TESTPOOL/$TESTFS1@snap$i + snaplist=$snaplist,snap$i +done +snaplist=${snaplist#,} +log_must $ZFS destroy $TESTPOOL/$TESTFS1@$snaplist +for i in {1..100}; do + log_mustnot snapexists $TESTPOOL/$TESTFS1@snap$i +done +log_note "zfs destroy multiple snapshots with hold" +snaplist="" +for i in 1 2 3 4 5; do + log_must $ZFS snapshot $TESTPOOL/$TESTFS1@snap$i + log_must $ZFS hold keep $TESTPOOL/$TESTFS1@snap$i + snaplist=$snaplist,snap$i +done +snaplist=${snaplist#,} +log_mustnot $ZFS destroy $TESTPOOL/$TESTFS1@$snaplist +for i in 1 2 3 4 5; do + log_must $ZFS release keep $TESTPOOL/$TESTFS1@snap$i +done +log_must $ZFS destroy $TESTPOOL/$TESTFS1@$snaplist + +log_note "zfs destroy for multiple snapshots having clones" +for i in 1 2 3 4 5; do + log_must $ZFS snapshot $TESTPOOL/$TESTFS1@snap$i +done +snaplist="" +for i in 1 2 3 4 5; do + log_must $ZFS clone $TESTPOOL/$TESTFS1@snap$i $TESTPOOL/$TESTFS1/clone$i + snaplist=$snaplist,snap$i +done +snaplist=${snaplist#,} +log_mustnot $ZFS destroy $TESTPOOL/$TESTFS1@$snaplist +for i in 1 2 3 4 5; do + log_must snapexists $TESTPOOL/$TESTFS1@snap$i + log_must $ZFS destroy $TESTPOOL/$TESTFS1/clone$i +done + +log_note "zfs destroy for snapshots for different datasets" +log_must $ZFS create $TESTPOOL/$TESTFS2 +log_must $ZFS snapshot $TESTPOOL/$TESTFS2@fs2snap +log_must $ZFS create $TESTPOOL/$TESTFS1/$TESTFS2 +log_must $ZFS snapshot $TESTPOOL/$TESTFS1/$TESTFS2@fs12snap + +long_arg=$TESTPOOL/$TESTFS1@snap1,$TESTPOOL/$TESTFS2@fs2snap, +long_arg=$long_arg$TESTPOOL/$TESTFS1/$TESTFS2@fs12snap +log_must $ZFS destroy $long_arg +log_mustnot snapexists $TESTPOOL/$TESTFS1@snap1 +log_must snapexists $TESTPOOL/$TESTFS2@fs2snap +log_must snapexists $TESTPOOL/$TESTFS1/$TESTFS2@fs12snap + +log_must $ZFS destroy $TESTPOOL/$TESTFS1@fs2snap,fs12snap,snap2 +log_must snapexists $TESTPOOL/$TESTFS2@fs2snap +log_must snapexists $TESTPOOL/$TESTFS1/$TESTFS2@fs12snap +log_mustnot snapexists $TESTPOOL/$TESTFS1@snap2 + +log_must $ZFS destroy $TESTPOOL/$TESTFS2@fs2snap,fs12snap,snap3 +log_mustnot snapexists $TESTPOOL/$TESTFS2@fs2snap +log_must snapexists $TESTPOOL/$TESTFS1/$TESTFS2@fs12snap +log_must snapexists $TESTPOOL/$TESTFS1@snap3 + +log_note "zfs destroy for snapshots from different pools" +VIRTUAL_DISK=/var/tmp/disk +log_must $DD if=/dev/urandom of=$VIRTUAL_DISK bs=1M count=64 +log_must $ZPOOL create $TESTPOOL2 $VIRTUAL_DISK +log_must poolexists $TESTPOOL2 + +log_must $ZFS create $TESTPOOL2/$TESTFS1 +log_must $ZFS snapshot $TESTPOOL2/$TESTFS1@snap +long_arg=$TESTPOOL2/$TESTFS1@snap,$TESTPOOL/$TESTFS1@snap3, +long_arg=$long_arg$TESTPOOL/$TESTFS1@snap5 +log_must $ZFS destroy $long_arg +log_mustnot snapexists $TESTPOOL2/$TESTFS1@snap +log_must snapexists $TESTPOOL/$TESTFS1@snap3 +log_must snapexists $TESTPOOL/$TESTFS1@snap5 + +log_must $ZFS snapshot $TESTPOOL2/$TESTFS1@snap +log_must $ZFS destroy $TESTPOOL2/$TESTFS1@snap5,snap3,snap +log_mustnot snapexists $TESTPOOL2/$TESTFS1@snap +log_must snapexists $TESTPOOL/$TESTFS1@snap3 +log_must snapexists $TESTPOOL/$TESTFS1@snap5 + +log_pass "zfs destroy for multiple snapshots passes" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_016_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_016_pos.ksh new file mode 100644 index 0000000000..3acdd93c80 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_016_pos.ksh @@ -0,0 +1,186 @@ +# !/bin/ksh +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +# DESCRIPTION +# Verify zfs destroy test for range of snapshots by giving a list +# of valid and invalid arguments. + +# STRATEGY +# 1. Create a list of valid and invalid arguments for range snapshot +# destroy. +# 2. Set up a filesystem and a volume with multiple snapshots +# 3. Run zfs destroy for all the arguments and verify existence of snapshots +# 4. Verify the destroy for snapshots with clones and hold + +. $STF_SUITE/include/libtest.shlib + +function cleanup +{ + datasetexists $TESTPOOL/$TESTFS1 && \ + log_must $ZFS destroy -R $TESTPOOL/$TESTFS1 + datasetexists $TESTPOOL/$TESTVOL && \ + log_must $ZFS destroy -Rf $TESTPOOL/$TESTVOL +} + +function setup_snapshots +{ + for i in $snaps; do + datasetexists $TESTPOOL/$TESTFS1@snap$i && \ + log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap$i + datasetexists $TESTPOOL/$TESTVOL@snap$i && \ + log_must $ZFS destroy $TESTPOOL/$TESTVOL@snap$i + log_must $ZFS snapshot $TESTPOOL/$TESTFS1@snap$i + log_must $ZFS snapshot $TESTPOOL/$TESTVOL@snap$i + done +} + +function verify_snapshots +{ + typeset snap_exists=${1:-0} + if [[ $snap_exists == 1 ]]; then + for i in $range; do + snapexists $TESTPOOL/$TESTFS1@snap$i || \ + log_fail "zfs destroy should not have destroyed" \ + "$TESTPOOL/$TESTFS1@snap$i" + snapexists $TESTPOOL/$TESTVOL@snap$i || \ + log_fail "zfs destroy should not have destroyed" \ + "$TESTPOOL/$TESTVOL@snap$i" + done + else + for i in $range; do + snapexists $TESTPOOL/$TESTFS1@snap$i && \ + log_fail "zfs destroy should have destroyed" \ + "$TESTPOOL/$TESTFS1@snap$i" + snapexists $TESTPOOL/$TESTVOL@snap$i && \ + log_fail "zfs destroy should have destroyed" \ + "$TESTPOOL/$TESTVOL@snap$i" + done + fi +} + +invalid_args="@snap0%snap5 @snap1%snap6 @snap0%snap6 @snap5%snap1 \ + @snap1%$TESTPOOL/$TESTFS1@snap5 @snap1%%snap5 @snap1%@snap5 \ + @@snap1%snap5 snap1%snap5 snap1%snap3%snap5" +valid_args="@snap1%snap5 @%" +log_assert "zfs destroy deletes ranges of snapshots" +log_onexit cleanup + +log_must $ZFS create $TESTPOOL/$TESTFS1 +log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL +snaps="1 2 3 4 5" +log_note "Verify the valid arguments" +range="1 2 3 4 5" +for args in $valid_args; do + setup_snapshots + log_must $ZFS destroy $TESTPOOL/$TESTFS1$args + log_must $ZFS destroy $TESTPOOL/$TESTVOL$args + verify_snapshots +done + +log_note "Verify invalid arguements" +setup_snapshots +for args in $invalid_args; do + log_mustnot $ZFS destroy $TESTPOOL/$TESTFS1$args + log_mustnot $ZFS destroy $TESTPOOL/$TESTVOL$args + log_must verify_snapshots 1 +done + +log_note "Destroy the begining range" + +log_must $ZFS destroy $TESTPOOL/$TESTFS1@%snap3 +log_must $ZFS destroy $TESTPOOL/$TESTVOL@%snap3 +range="1 2 3" +verify_snapshots +range="4 5" +verify_snapshots 1 + +setup_snapshots +log_note "Destroy the mid range" +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap2%snap4 +log_must $ZFS destroy $TESTPOOL/$TESTVOL@snap2%snap4 +range="2 3 4" +verify_snapshots +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap1%snap5 +log_must $ZFS destroy $TESTPOOL/$TESTVOL@snap1%snap5 +range="1 5" +verify_snapshots + +setup_snapshots +log_note "Destroy the end range" +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap3% +log_must $ZFS destroy $TESTPOOL/$TESTVOL@snap3% +range="1 2" +verify_snapshots 1 +range="3 4 5" +verify_snapshots + +setup_snapshots +log_note "Destroy a simple list" +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap2,snap4 +log_must $ZFS destroy $TESTPOOL/$TESTVOL@snap2,snap4 +range="2 4" +verify_snapshots +range="1 3 5" +verify_snapshots 1 + +setup_snapshots +log_note "Destroy a list and range together" +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap1%snap3,snap5 +log_must $ZFS destroy $TESTPOOL/$TESTVOL@snap1%snap3,snap5 +range="1 2 3 5" +verify_snapshots +range=4 +verify_snapshots 1 + +snaps="1 2 3 5 6 7 8 9 10" +setup_snapshots +log_note "Destroy a list of ranges" +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap1%snap3,snap5 +log_must $ZFS destroy $TESTPOOL/$TESTVOL@snap1%snap3,snap5 +range="1 2 3 5" +verify_snapshots +range=4 +verify_snapshots 1 + +snaps="1 2 3 4 5" +setup_snapshots +log_note "Snapshot destory with hold" +range="1 2 3 4 5" +for i in 1 2 3 4 5; do + log_must $ZFS hold keep $TESTPOOL/$TESTFS1@snap$i + log_must $ZFS hold keep $TESTPOOL/$TESTVOL@snap$i +done +log_mustnot $ZFS destroy $TESTPOOL/$TESTFS1@snap1%snap5 +log_mustnot $ZFS destroy $TESTPOOL/$TESTVOL@snap1%snap5 +verify_snapshots 1 +for i in 1 2 3 4 5; do + log_must $ZFS release keep $TESTPOOL/$TESTFS1@snap$i + log_must $ZFS release keep $TESTPOOL/$TESTVOL@snap$i +done +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap1%snap5 +log_must $ZFS destroy $TESTPOOL/$TESTVOL@snap1%snap5 +verify_snapshots + +log_note "Range destroy for snapshots having clones" +setup_snapshots +for i in 1 2 3 4 5; do + log_must $ZFS clone $TESTPOOL/$TESTFS1@snap$i $TESTPOOL/$TESTFS1/clone$i +done +log_must $ZFS destroy -R $TESTPOOL/$TESTFS1@snap1%snap5 +log_must $ZFS destroy $TESTPOOL/$TESTVOL@snap1%snap5 +verify_snapshots + +log_pass "'zfs destroy' successfully destroys ranges of snapshots" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib new file mode 100644 index 0000000000..ffec48c133 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_destroy/zfs_destroy_common.kshlib @@ -0,0 +1,146 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_destroy/zfs_destroy.cfg + +# +# Create or recover a set of test environment which include ctr, vol, fs, +# snap & clone. It looks like the following. +# +# pool +# |ctr +# | |fs +# | | |fssnap +# | |vol +# | |volsnap +# |fsclone +# |volclone +# +# $1 indicate which dependent dataset need be created. Such as 'snap', 'clone'. +# +function setup_testenv #[dtst] +{ + typeset dtst=$1 + + if ! datasetexists $CTR; then + log_must $ZFS create $CTR + fi + if ! datasetexists $FS; then + log_must $ZFS create $FS + fi + # Volume test is only availible on globle zone + if ! datasetexists $VOL && is_global_zone; then + log_must $ZFS create -V $VOLSIZE $VOL + + $ECHO "y" | $NEWFS /dev/zvol/dsk/$VOL > /dev/null 2>&1 + if (( $? == 0 )); then + log_note "SUCCESS: $NEWFS /dev/zvol/dsk/$VOL>/dev/null" + else + log_fail "$NEWFS /dev/zvol/dsk/$VOL > /dev/null" + fi + + if [[ ! -d $TESTDIR1 ]]; then + log_must $MKDIR $TESTDIR1 + fi + log_must $MOUNT /dev/zvol/dsk/$VOL $TESTDIR1 + fi + + if [[ $dtst == snap || $dtst == clone ]]; then + if ! datasetexists $FSSNAP; then + log_must $ZFS snapshot $FSSNAP + fi + if ! datasetexists $VOLSNAP && is_global_zone; then + log_must $ZFS snapshot $VOLSNAP + fi + fi + + if [[ $dtst == clone ]]; then + if ! datasetexists $FSCLONE; then + log_must $ZFS clone $FSSNAP $FSCLONE + fi + if ! datasetexists $VOLCLONE && is_global_zone; then + log_must $ZFS clone $VOLSNAP $VOLCLONE + fi + fi +} + +# Clean up the testing environment +# +function cleanup_testenv +{ + if is_global_zone && ismounted "$TESTDIR1" "ufs" ; then + log_must $UMOUNT -f $TESTDIR1 + fi + if [[ -d $TESTDIR1 ]]; then + log_must $RM -rf $TESTDIR1 + fi + + $PKILL $MKBUSY + + if datasetexists $CTR; then + log_must $ZFS destroy -Rf $CTR + fi +} + +# +# Delete volume and related datasets from list, if the test cases was +# runing in local zone. Then check them are existed or non-exists. +# +# $1 function name +# $2-n datasets name +# +function check_dataset +{ + typeset funname=$1 + typeset newlist="" + typeset dtst + shift + + for dtst in "$@"; do + # Volume and related stuff are unvailable in local zone + if ! is_global_zone; then + if [[ $dtst == $VOL || $dtst == $VOLSNAP || \ + $dtst == $VOLCLONE ]] + then + continue + fi + fi + newlist="$newlist $dtst" + done + + if (( ${#newlist} != 0 )); then + # Run each item in $newlist individually so on failure, the + # probelmatic dataset is listed in the logs. + for i in $newlist; do + log_must $funname $i + done + fi +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/Makefile new file mode 100644 index 0000000000..b2078fdcc6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/Makefile @@ -0,0 +1,53 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_get + +PROGS = cleanup \ + setup \ + zfs_get_001_pos \ + zfs_get_002_pos \ + zfs_get_003_pos \ + zfs_get_004_pos \ + zfs_get_005_neg \ + zfs_get_006_neg \ + zfs_get_007_neg \ + zfs_get_008_pos \ + zfs_get_009_pos \ + zfs_get_010_neg + +FILES = zfs_get_common.kshlib \ + zfs_get_list_d.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/setup.ksh new file mode 100644 index 0000000000..b2b5c077bf --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_container_volume_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_001_pos.ksh new file mode 100644 index 0000000000..033a2d42a9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_001_pos.ksh @@ -0,0 +1,131 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib + +# +# DESCRIPTION: +# Setting the valid option and properties, 'zfs get' should return the +# correct property value. +# +# STRATEGY: +# 1. Create pool, filesystem, volume and snapshot. +# 2. Setting valid parameter, 'zfs get' should succeed. +# 3. Compare the output property name with the original input property. +# + +verify_runnable "both" + +typeset options=("" "-p" "-r" "-H") + +typeset -i i=${#options[*]} +typeset -i j=0 +while ((j<${#depth_options[*]})); +do + options[$i]=-"${depth_options[$j]}" + ((j+=1)) + ((i+=1)) +done + +typeset zfs_props=("type" used available creation volsize referenced \ + compressratio mounted origin recordsize quota reservation mountpoint \ + sharenfs checksum compression atime devices exec readonly setuid zoned \ + snapdir aclmode aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots \ + version) + +typeset userquota_props=(userquota@root groupquota@root userused@root \ + groupused@root) +typeset all_props=("${zfs_props[@]}" "${userquota_props[@]}") +typeset dataset=($TESTPOOL/$TESTCTR $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTVOL@$TESTSNAP) + +# +# According to dataset and option, checking if 'zfs get' return correct +# property information. +# +# $1 dataset +# $2 properties which are expected to output into $TESTDIR/$TESTFILE0 +# $3 option +# +function check_return_value +{ + typeset dst=$1 + typeset props=$2 + typeset opt=$3 + typeset -i found=0 + typeset p + + for p in $props; do + found=0 + + while read line; do + typeset item + item=$($ECHO $line | $AWK '{print $2}' 2>&1) + + if [[ $item == $p ]]; then + ((found += 1)) + break + fi + done < $TESTDIR/$TESTFILE0 + + if ((found == 0)); then + log_fail "'zfs get $opt $props $dst' return " \ + "error message.'$p' haven't been found." + fi + done + + log_note "SUCCESS: '$ZFS get $opt $prop $dst'." +} + +log_assert "Setting the valid options and properties 'zfs get' should return " \ + "the correct property value." +log_onexit cleanup + +# Create filesystem and volume's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +typeset -i i=0 +while ((i < ${#dataset[@]})); do + for opt in "${options[@]}"; do + for prop in ${all_props[@]}; do + eval "$ZFS get $opt $prop ${dataset[i]} > \ + $TESTDIR/$TESTFILE0" + ret=$? + if [[ $ret != 0 ]]; then + log_fail "$ZFS get returned: $ret" + fi + check_return_value ${dataset[i]} "$prop" "$opt" + done + done + ((i += 1)) +done + +log_pass "Setting the valid options to dataset, it should succeed and return " \ + "valid value. 'zfs get' pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_002_pos.ksh new file mode 100644 index 0000000000..1221d83b0f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_002_pos.ksh @@ -0,0 +1,87 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib + +# +# DESCRIPTION: +# Setting the valid option and properties 'zfs get' return correct value. +# It should be successful. +# +# STRATEGY: +# 1. Create pool, filesystem, dataset, volume and snapshot. +# 2. Getting the options and properties random combination. +# 3. Using the combination as the parameters of 'zfs get' to check the +# command line return value. +# + +verify_runnable "both" + +typeset options=(" " p r H) + +typeset zfs_props=("type" used available creation volsize referenced \ + compressratio mounted origin recordsize quota reservation mountpoint \ + sharenfs checksum compression atime devices exec readonly setuid zoned \ + snapdir aclmode aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots version) + +typeset userquota_props=(userquota@root groupquota@root userused@root \ + groupused@root) +typeset props=("${zfs_props[@]}" "${userquota_props[@]}") +typeset dataset=($TESTPOOL/$TESTCTR $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTVOL@$TESTSNAP) + +log_assert "Setting the valid options and properties 'zfs get' return " \ + "correct value. It should be successful." +log_onexit cleanup + +# Create volume and filesystem's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +# +# Begin to test 'get [-prH] <property[,property]...> +# <filesystem|dataset|volume|snapshot>' +# 'get [-prH] <-a|-d> <filesystem|dataset|volume|snapshot>" +# +typeset -i opt_numb=8 +typeset -i prop_numb=20 +for dst in ${dataset[@]}; do + # option can be empty, so "" is necessary. + for opt in "" $(gen_option_str "${options[*]}" "-" "" $opt_numb); do + for prop in $(gen_option_str "${props[*]}" "" "," $prop_numb) + do + $ZFS get $opt $prop $dst > /dev/null 2>&1 + ret=$? + if [[ $ret != 0 ]]; then + log_fail "$ZFS get $opt $prop $dst (Code: $ret)" + fi + done + done +done + +log_pass "Setting the valid options to dataset, 'zfs get' pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_003_pos.ksh new file mode 100644 index 0000000000..77a58e10f6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_003_pos.ksh @@ -0,0 +1,61 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs get' should get consistent report with different options. +# +# STRATEGY: +# 1. Create pool and filesystem. +# 2. 'zfs mount -o remount,noatime <fs>.' +# 3. Verify the value of 'zfs get atime' and 'zfs get all | grep atime' +# are identical. +# + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS mount -o remount,atime $TESTPOOL/$TESTFS +} + +log_assert "'zfs get' should get consistent report with different option." +log_onexit cleanup + +log_must $ZFS set atime=on $TESTPOOL/$TESTFS +log_must $ZFS mount -o remount,noatime $TESTPOOL/$TESTFS + +value1=$($ZFS get -H atime $TESTPOOL/$TESTFS | $AWK '{print $3}') +value2=$($ZFS get -H all $TESTPOOL/$TESTFS | $AWK '{print $2 " " $3}' | \ + $GREP ^atime | $AWK '{print $2}') +if [[ $value1 != $value2 ]]; then + log_fail "value1($value1) != value2($value2)" +fi + +log_pass "'zfs get' get consistent report with different option passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_004_pos.ksh new file mode 100644 index 0000000000..1dce6e9cc1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_004_pos.ksh @@ -0,0 +1,227 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify 'zfs get all' can get all properties for all datasets in the system +# +# STRATEGY: +# 1. Create datasets for testing +# 2. Issue 'zfs get all' command +# 3. Verify the command gets all available properties of all datasets +# + +verify_runnable "both" + +function cleanup +{ + [[ -e $propfile ]] && $RM -f $propfile + + datasetexists $clone && \ + log_must $ZFS destroy $clone + for snap in $fssnap $volsnap ; do + snapexists $snap && \ + log_must $ZFS destroy $snap + done + + if [[ -n $globalzone ]] ; then + for pool in $TESTPOOL1 $TESTPOOL2 $TESTPOOL3; do + poolexists $pool && \ + log_must $ZPOOL destroy -f $pool + done + for file in `$LS $TESTDIR1/poolfile*`; do + $RM -f $file + done + else + for fs in $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS2 $TESTPOOL/$TESTFS3; do + datasetexists $fs && \ + log_must $ZFS destroy -rf $fs + done + fi +} + +log_assert "Verify the functions of 'zfs get all' work." +log_onexit cleanup + +typeset globalzone="" + +if is_global_zone ; then + globalzone="true" +fi + +set -A opts "" "-r" "-H" "-p" "-rHp" "-o name" \ + "-s local,default,temporary,inherited,none" \ + "-o name -s local,default,temporary,inherited,none" \ + "-rHp -o name -s local,default,temporary,inherited,none" +set -A usrprops "a:b=c" "d_1:1_e=0f" "123:456=789" + +fs=$TESTPOOL/$TESTFS +fssnap=$fs@$TESTSNAP +clone=$TESTPOOL/$TESTCLONE +volsnap=$TESTPOOL/$TESTVOL@$TESTSNAP + +#set user defined properties for $TESTPOOL +for usrprop in ${usrprops[@]}; do + log_must $ZFS set $usrprop $TESTPOOL +done +# create snapshot and clone in $TESTPOOL +log_must $ZFS snapshot $fssnap +log_must $ZFS clone $fssnap $clone +log_must $ZFS snapshot $volsnap + +# collect datasets which can be set user defined properties +usrpropds="$clone $fs" + +# collect all datasets which we are creating +allds="$fs $clone $fssnap $volsnap" + +#create pool and datasets to guarantee testing under multiple pools and datasets. +file=$TESTDIR1/poolfile +typeset -i FILESIZE=104857600 #100M +(( DFILESIZE = FILESIZE * 2 )) # double of FILESIZE +typeset -i VOLSIZE=10485760 #10M +availspace=$(get_prop available $TESTPOOL) +typeset -i i=0 + +# make sure 'availspace' is larger then twice of FILESIZE to create a new pool. +# If any, we only totally create 3 pools for multple datasets testing to limit +# testing time +while (( availspace > DFILESIZE )) && (( i < 3 )) ; do + (( i += 1 )) + + if [[ -n $globalzone ]] ; then + log_must $MKFILE $FILESIZE ${file}$i + eval pool=\$TESTPOOL$i + log_must $ZPOOL create $pool ${file}$i + else + eval pool=$TESTPOOL/\$TESTFS$i + log_must $ZFS create $pool + fi + + #set user defined properties for testing + for usrprop in ${usrprops[@]}; do + log_must $ZFS set $usrprop $pool + done + + #create datasets in pool + log_must $ZFS create $pool/$TESTFS + log_must $ZFS snapshot $pool/$TESTFS@$TESTSNAP + log_must $ZFS clone $pool/$TESTFS@$TESTSNAP $pool/$TESTCLONE + + if [[ -n $globalzone ]] ; then + log_must $ZFS create -V $VOLSIZE $pool/$TESTVOL + else + log_must $ZFS create $pool/$TESTVOL + fi + + ds=`$ZFS list -H -r -o name -t filesystem,volume $pool` + usrpropds="$usrpropds $pool/$TESTFS $pool/$TESTCLONE $pool/$TESTVOL" + allds="$allds $pool/$TESTFS $pool/$TESTCLONE $pool/$TESTVOL \ + $pool/$TESTFS@$TESTSNAP" + + availspace=$(get_prop available $TESTPOOL) +done + +#the expected number of property for each type of dataset in this testing +typeset -i fspropnum=27 +typeset -i snappropnum=8 +typeset -i volpropnum=15 +propfile=/var/tmp/allpropfile.$$ + +typeset -i i=0 +typeset -i propnum=0 +typeset -i failflag=0 +while (( i < ${#opts[*]} )); do + [[ -e $propfile ]] && $RM -f $propfile + log_must eval "$ZFS get ${opts[i]} all >$propfile" + + for ds in $allds; do + $GREP $ds $propfile >/dev/null 2>&1 + (( $? != 0 )) && \ + log_fail "There is no property for" \ + "dataset $ds in 'get all' output." + + propnum=`$CAT $propfile | $AWK '{print $1}' | \ + $GREP "${ds}$" | $WC -l` + ds_type=`$ZFS get -H -o value type $ds` + case $ds_type in + filesystem ) + (( propnum < fspropnum )) && \ + (( failflag += 1 )) + ;; + snapshot ) + (( propnum < snappropnum )) && \ + (( failflag += 1 )) + ;; + volume ) + (( propnum < volpropnum )) && \ + (( failflag += 1 )) + ;; + esac + + (( failflag != 0 )) && \ + log_fail " 'zfs get all' fails to get out " \ + "all properties for dataset $ds." + + (( propnum = 0 )) + (( failflag = 0 )) + done + + (( i += 1 )) +done + +log_note "'zfs get' can get particular property for all datasets with that property." + +function do_particular_prop_test #<property> <suitable datasets> +{ + typeset props="$1" + typeset ds="$2" + + for prop in ${commprops[*]}; do + ds=`$ZFS get -H -o name $prop` + + [[ "$ds" != "$allds" ]] && \ + log_fail "The result datasets are $ds, but all suitable" \ + "datasets are $allds for the property $prop" + done +} + +# Here, we do a testing for user defined properties and the most common properties +# for all datasets. +commprop="type creation used referenced compressratio" +usrprop="a:b d_1:1_e 123:456" + +do_particular_prop_test "$commprop" "$allds" +do_particular_prop_test "$usrprop" "$usrpropds" + +log_pass "'zfs get all' works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_005_neg.ksh new file mode 100644 index 0000000000..f9e50541f7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_005_neg.ksh @@ -0,0 +1,112 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib + +# +# DESCRIPTION: +# Setting the invalid option and properties, 'zfs get' should failed. +# +# STRATEGY: +# 1. Create pool, filesystem, volume and snapshot. +# 2. Getting incorrect combination by invalid parameters +# 3. Using the combination as the parameters of 'zfs get' to check the +# command line return value. +# + +verify_runnable "both" + +typeset val_opts=(p r H) +typeset v_props=(type used available creation volsize referenced compressratio \ + mounted origin recordsize quota reservation mountpoint sharenfs checksum \ + compression atime devices exec readonly setuid zoned snapdir aclmode \ + aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots version) + +typeset userquota_props=(userquota@root groupquota@root userused@root \ + groupused@root) +typeset val_pros=(-- "${v_props[@]}" "${userquota_props[@]}") +set -f # Force shell does not parse '?' and '*' as the wildcard +typeset inval_opts=(P R h ? *) +typeset inval_props=(Type 0 ? * -on --on readonl time USED RATIO MOUNTED) + +typeset dataset=($TESTPOOL/$TESTFS $TESTPOOL/$TESTCTR $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTVOL@$TESTSNAP) + +typeset -i opt_numb=6 +typeset -i prop_numb=12 + +val_opts_str=$(gen_option_str "${val_opts[*]}" "-" "" $opt_numb) +val_props_str=$(gen_option_str "${val_props[*]}" "" "," $prop_numb) +val_props_str="$val_props_str -a -d" + +inval_opts_str=$(gen_option_str "${inval_opts[*]}" "-" "" $opt_numb) +inval_props_str=$(gen_option_str "${inval_props[*]}" "" "," $prop_numb) + +# +# Test different options and properties combination. +# +# $1 options +# $2 properties +# +function test_options +{ + typeset opts=$1 + typeset props=$2 + + for dst in ${dataset[@]}; do + for opt in $opts; do + for prop in $props; do + $ZFS get $opt $prop $dst > /dev/null 2>&1 + ret=$? + if [[ $ret == 0 ]]; then + log_fail "$ZFS get $opt $prop $dst " \ + "unexpectedly succeeded." + fi + done + done + done +} + +log_assert "Setting the invalid option and properties, 'zfs get' should be \ + failed." +log_onexit cleanup + +# Create filesystem and volume's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +log_note "Valid options + invalid properties, 'zfs get' should fail." +test_options "$val_opts_str" "$inval_props_str" + +log_note "Invalid options + valid properties, 'zfs get' should fail." +test_options "$inval_opts_str" "$val_props_str" + +log_note "Invalid options + invalid properties, 'zfs get' should fail." +test_options "$inval_opts_str" "$inval_props_str" + +log_pass "Setting the invalid options to dataset, 'zfs get' pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_006_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_006_neg.ksh new file mode 100644 index 0000000000..58b08261d2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_006_neg.ksh @@ -0,0 +1,60 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib + +# +# DESCRIPTION: +# Verify 'zfs get all' can deal with invalid scenarios +# +# STRATEGY: +# 1. Define invalid scenarios for 'zfs get all' +# 2. Run zfs get with those invalid scenarios +# 3. Verify that zfs get fails with invalid scenarios +# + +verify_runnable "both" + +log_assert "Verify 'zfs get all' fails with invalid combination scenarios." + +set -f # Force ksh ignore '?' and '*' +set -A bad_combine "ALL" "\-R all" "-P all" "-h all" "-rph all" "-RpH all" "-PrH all" \ + "-o all" "-s all" "-? all" "-* all" "-?* all" "all -r" "all -p" \ + "all -H" "all -rp" "all -rH" "all -ph" "all -rpH" "all -r $TESTPOOL" \ + "all -H $TESTPOOL" "all -p $TESTPOOL" "all -r -p -H $TESTPOOL" \ + "all -rph $TESTPOOL" "all,available,reservation $TESTPOOL" \ + "all $TESTPOOL?" "all $TESTPOOL*" "all nonexistpool" + +typeset -i i=0 +while (( i < ${#bad_combine[*]} )) +do + log_mustnot eval "$ZFS get ${bad_combine[i]} >/dev/null" + + (( i = i + 1 )) +done + +log_pass "'zfs get all' fails with invalid combinations scenarios as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_007_neg.ksh new file mode 100644 index 0000000000..850c1ca248 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_007_neg.ksh @@ -0,0 +1,60 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib + +# +# DESCRIPTION: +# 'zfs get -o' should fail with invalid column names +# +# STRATEGY: +# 1. Run zfs get -o with invalid column name combinations +# 2. Verify that zfs get returns error +# + +verify_runnable "both" + +log_assert "'zfs get -o' fails with invalid options or column names" + +set -A badargs "o name,property,value,resource" "o name" \ + "-O name,property,value,source" "-oo name" "-o blah" \ + "-o name,property,blah,source" "-o name,name,name,name,name" \ + "-o name,property,value,," "-o *,*,*,*" "-o ?,?,?,?" \ + "-o" "-o ,,,,," "-o -o -o -o" "-o NAME,PROPERTY,VALUE,SOURCE" \ + "-o name,properTy,value,source" "-o name, property, value,source" \ + "-o name:property:value:source" "-o name,property:value,source" \ + "-o name;property;value;source" + +typeset -i i=0 +while (( i < ${#badargs[*]} )) +do + log_mustnot eval "$ZFS get \"${badargs[i]}\" >/dev/null 2>&1" + + (( i = i + 1 )) +done + +log_pass "'zfs get -o' fails with invalid options or column name as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_008_pos.ksh new file mode 100644 index 0000000000..40d4553f63 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_008_pos.ksh @@ -0,0 +1,91 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib + +# +# DESCRIPTION: +# Verify "-d <n>" can work with other options +# +# STRATEGY: +# 1. Create pool, filesystem, dataset, volume and snapshot. +# 2. Getting an -d option, other options and properties random combination. +# 3. Using the combination as the parameters of 'zfs get' to check the +# command line return value. +# + +verify_runnable "both" + +set -A options " " "-r" "-H" "-p" "-rHp" "-o name" \ + "-s local,default,temporary,inherited,none" \ + "-o name -s local,default,temporary,inherited,none" \ + "-rHp -o name -s local,default,temporary,inherited,none" + +set -A props type used available creation volsize referenced compressratio \ + mounted origin recordsize quota reservation mountpoint sharenfs \ + checksum compression atime devices exec readonly setuid zoned snapdir \ + aclmode aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots \ + userquota@root groupquota@root userused@root groupused@root + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + set -A all_props ${all_props[*]} version +fi + +set -A dataset $TESTPOOL/$TESTCTR $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTVOL@$TESTSNAP + +log_assert "Verify '-d <n>' can work with other options" +log_onexit cleanup + +# Create volume and filesystem's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +typeset -i opt_numb=16 +typeset -i prop_numb=16 +typeset -i i=0 +typeset -i item=0 +typeset -i depth_item=0 + +for dst in ${dataset[@]}; do + (( i=0 )) + while (( i < opt_numb )); do + (( item = $RANDOM % ${#options[@]} )) + (( depth_item = $RANDOM % ${#depth_options[@]} )) + for prop in $(gen_option_str "${props[*]}" "" "," $prop_numb) + do + log_must eval "$ZFS get -${depth_options[depth_item]} ${options[item]} $prop $dst > /dev/null 2>&1" + done + (( i += 1 )) + done +done + +log_pass "Verify '-d <n>' can work with other options" + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_009_pos.ksh new file mode 100644 index 0000000000..10ebf5fc4c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_009_pos.ksh @@ -0,0 +1,83 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib + +# +# DESCRIPTION: +# 'zfs get -d <n>' should get expected output. +# +# STRATEGY: +# 1. Create a multiple depth filesystem. +# 2. 'zfs get -d <n>' to get the output. +# 3. 'zfs get -r|egrep' to get the expected output. +# 4. Compare the two outputs, they shoud be same. +# + +verify_runnable "both" + +log_assert "'zfs get -d <n>' should get expected output." +log_onexit depth_fs_cleanup + +set -A all_props type used available creation volsize referenced \ + compressratio mounted origin recordsize quota reservation mountpoint \ + sharenfs checksum compression atime devices exec readonly setuid \ + zoned snapdir aclmode aclinherit canmount primarycache secondarycache \ + usedbychildren usedbydataset usedbyrefreservation usedbysnapshots \ + userquota@root groupquota@root userused@root groupused@root + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + set -A all_props ${all_props[*]} version +fi + +depth_fs_setup + +mntpnt=$(get_prop mountpoint $DEPTH_FS) +DEPTH_OUTPUT="$mntpnt/depth_output" +EXPECT_OUTPUT="$mntpnt/expect_output" +typeset -i prop_numb=16 +typeset -i old_val=0 +typeset -i j=0 +typeset eg_opt="$DEPTH_FS"$ +for dp in ${depth_array[@]}; do + (( j=old_val+1 )) + while (( j<=dp && j<=MAX_DEPTH )); do + eg_opt="$eg_opt""|depth""$j"$ + (( j+=1 )) + done + for prop in $(gen_option_str "${all_props[*]}" "" "," $prop_numb); do + log_must eval "$ZFS get -H -d $dp -o name $prop $DEPTH_FS > $DEPTH_OUTPUT" + log_must eval "$ZFS get -rH -o name $prop $DEPTH_FS | $EGREP -e '$eg_opt' > $EXPECT_OUTPUT" + log_must $DIFF $DEPTH_OUTPUT $EXPECT_OUTPUT + done + (( old_val=dp )) +done + +log_pass "'zfs get -d <n>' should get expected output." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_010_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_010_neg.ksh new file mode 100644 index 0000000000..e8c36073a9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_010_neg.ksh @@ -0,0 +1,55 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib + +# +# DESCRIPTION: +# A negative depth or a non numeric depth should fail in 'zfs get -d <n>' +# +# STRATEGY: +# 1. Run zfs get -d with negative depth or non numeric depth +# 2. Verify that zfs get returns error +# + +verify_runnable "both" + +log_assert "A negative depth or a non numeric depth should fail in 'zfs get -d <n>'" + +set -A badargs "a" "AB" "aBc" "2A" "a2b" "aB2" "-1" "-32" "-999" + +typeset -i i=0 +while (( i < ${#badargs[*]} )) +do + log_mustnot eval "$ZFS get -d ${badargs[i]} $TESTPOOL/$TESTFS >/dev/null 2>&1" + (( i = i + 1 )) +done + +log_pass "A negative depth or a non numeric depth should fail in 'zfs get -d <n>'" + + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib new file mode 100644 index 0000000000..b1978cb6c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_common.kshlib @@ -0,0 +1,97 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# According to $elements, $prefix and $separator, the function random produce +# the number of $counter combination. +# +# $1 elements which is used to get the combination. +# $2 prefix is appended to the combination +# $3 separator between the combination, such as ' ' or ',' +# $4 counter is the number of combination which you want to get. +# +function gen_option_str # $elements $prefix $separator $counter +{ + typeset elements="" + typeset prefix=${2} + typeset separator=${3} + typeset -i counter=${4:-0} + typeset -i i=0 + typeset comb_str="" + + for e in $1; do + elements[i]="$e" + (( i += 1 )) + done + (( ${#elements[@]} == 0 )) && log_fail "The elements can't be empty." + + typeset -i item=0 + typeset -i j=0 + typeset -i numb_item=0 + + # Loop and get the specified number combination strings. + i=0 + while (( i < counter )); do + j=0 + numb_item=0 + comb_str="" + + # Get random number items for each combinations. + (( numb_item = ($RANDOM % ${#elements[@]}) + 1 )) + + while (( j < numb_item )); do + # Random select elements from the array + (( item = $RANDOM % ${#elements[@]} )) + + if (( ${#comb_str} == 0 )); then + comb_str=${elements[item]} + else + comb_str=$comb_str$separator${elements[item]} + fi + (( j += 1 )) + done + + echo "$prefix$comb_str" + + (( i += 1 )) + done +} + +# +# Cleanup the volume snapshot and filesystem snapshot were created for +# this test case. +# +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL@$TESTSNAP && \ + destroy_snapshot $TESTPOOL/$TESTVOL@$TESTSNAP + datasetexists $TESTPOOL/$TESTFS@$TESTSNAP && \ + destroy_snapshot $TESTPOOL/$TESTFS@$TESTSNAP + + [[ -e $TESTFILE0 ]] && log_must $RM $TESTFILE0 +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib new file mode 100644 index 0000000000..874cfa3b5e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_get/zfs_get_list_d.kshlib @@ -0,0 +1,79 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DEPTH_FS=$TESTPOOL/depth_fs +MAX_DEPTH=3 +DS_COUNT=3 +set -A depth_options "d 0" "d 1" "d 2" "d 4" "d 32" +set -A depth_array 0 1 2 4 32 + +# +# Setup multiple depths datasets, including fs, volume and snapshot. +# +function depth_fs_setup +{ + typeset -i i j k + typeset fslist + + log_must $ZFS create $DEPTH_FS + + (( i=1 )) + while (( i<=MAX_DEPTH )); do + if (( i==1 )); then + fslist=$DEPTH_FS + else + (( k=i-1 )) + fslist=$($ZFS list -rH -t filesystem -o name $DEPTH_FS|$GREP depth"$k"$) + if (( $? != 0 )); then + log_fail "No depth$k filesystem" + fi + fi + for fs in $fslist; do + (( j=1 )) + while (( j<=DS_COUNT )); do + log_must $ZFS create $fs/fs_"$j"_depth"$i" + if is_global_zone ; then + log_must $ZFS create -V 8M $fs/vol_"$j"_depth"$i" + fi + log_must $ZFS snapshot $fs@snap_"$j"_depth"$i" + (( j=j+1 )) + done + done + (( i=i+1 )) + done +} + +# +# Cleanup multiple depths filesystem. +# +function depth_fs_cleanup +{ + log_must $ZFS destroy -rR $DEPTH_FS +} + + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/Makefile new file mode 100644 index 0000000000..8f5538195e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/Makefile @@ -0,0 +1,40 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_inherit + +PROGS = cleanup \ + setup \ + zfs_inherit_001_neg \ + zfs_inherit_002_neg \ + zfs_inherit_003_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/setup.ksh new file mode 100644 index 0000000000..b2b5c077bf --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_container_volume_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_001_neg.ksh new file mode 100644 index 0000000000..891e0e9df0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_001_neg.ksh @@ -0,0 +1,78 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs inherit' should return an error when attempting to inherit +# properties which are not inheritable. +# +# STRATEGY: +# 1. Create an array of properties which cannot be inherited +# 2. For each property in the array, execute 'zfs inherit' +# 3. Verify an error is returned. +# + +verify_runnable "both" + +# Define uninherited properties and their short name. +typeset props_str="type used available avail creation referenced refer \ + compressratio ratio mounted origin quota reservation \ + reserv volsize volblocksize volblock" + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + props_str="$props_str version" +fi + +set -A prop $props_str canmount + + +log_assert "'zfs inherit' should return an error when attempting to inherit" \ + " un-inheritable properties." + +typeset -i i=0 +for obj in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + i=0 + while [[ $i -lt ${#prop[*]} ]]; do + orig_val=$(get_prop ${prop[i]} $obj) + + log_mustnot $ZFS inherit ${prop[i]} $obj + + new_val=$(get_prop ${prop[i]} $obj) + + if [[ $new_val != $orig_val ]]; then + log_fail "${prop[i]} property changed from $orig_val " + " to $new_val" + fi + ((i = i + 1)) + done +done + +log_pass "'zfs inherit' failed as expected when attempting to inherit" \ + " un-inheritable properties." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_002_neg.ksh new file mode 100644 index 0000000000..031d824aa6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_002_neg.ksh @@ -0,0 +1,103 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2011 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs inherit' should return an error with bad parameters in one command. +# +# STRATEGY: +# 1. Set an array of bad options and invlid properties to 'zfs inherit' +# 2. Execute 'zfs inherit' with bad options and passing invlid properties +# 3. Verify an error is returned. +# + +verify_runnable "both" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP; then + log_must $ZFS destroy $TESTPOOL/$TESTFS@$TESTSNAP + fi +} + +log_assert "'zfs inherit' should return an error with bad parameters in \ +one command." +log_onexit cleanup + +set -A badopts "r" "R" "-R" "-rR" "-a" "-" "-?" "-1" "-2" "-v" "-n" +set -A props "recordsize" "mountpoint" "sharenfs" "checksum" "compression" \ + "atime" "devices" "exec" "setuid" "readonly" "zoned" "snapdir" "aclmode" \ + "aclinherit" "xattr" "copies" +set -A illprops "shareiscsi" "recordsiz" "mountpont" "sharen" "compres" \ + "atme" "???" "***" "blah" + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP + +typeset -i i=0 +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP; do + + # zfs inherit should fail with bad options + for opt in ${badopts[@]}; do + for prop in ${props[@]}; do + log_mustnot eval "$ZFS inherit $opt $prop $ds \ + >/dev/null 2>&1" + done + done + + # zfs inherit should fail with invalid properties + for prop in "${illprops[@]}"; do + log_mustnot eval "$ZFS inherit $prop $ds >/dev/null 2>&1" + log_mustnot eval "$ZFS inherit -r $prop $ds >/dev/null 2>&1" + done + + # zfs inherit should fail with too many arguments + (( i = 0 )) + while (( i < ${#props[*]} -1 )); do + log_mustnot eval "$ZFS inherit ${props[(( i ))]} \ + ${props[(( i + 1 ))]} $ds >/dev/null 2>&1" + log_mustnot eval "$ZFS inherit -r ${props[(( i ))]} \ + ${props[(( i + 1 ))]} $ds >/dev/null 2>&1" + + (( i = i + 2 )) + done + +done + +# zfs inherit should fail with missing datasets +for prop in ${props[@]}; do + log_mustnot eval "$ZFS inherit $prop >/dev/null 2>&1" + log_mustnot eval "$ZFS inherit -r $prop >/dev/null 2>&1" +done + +log_pass "'zfs inherit' failed as expected when passing illegal arguments." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_003_pos.ksh new file mode 100644 index 0000000000..b2f09dba7e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_inherit/zfs_inherit_003_pos.ksh @@ -0,0 +1,86 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# 'zfs inherit' should return an error with bad parameters in one command. +# +# STRATEGY: +# 1. Set an array of bad options and invlid properties to 'zfs inherit' +# 2. Execute 'zfs inherit' with bad options and passing invlid properties +# 3. Verify an error is returned. +# + +verify_runnable "both" + +function cleanup +{ + for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL ; do + if snapexists $ds@$TESTSNAP; then + log_must $ZFS destroy $ds@$TESTSNAP + fi + done + cleanup_user_prop $TESTPOOL +} + +log_assert "'zfs inherit' should inherit user property." +log_onexit cleanup + +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL ; do + typeset prop_name=$(valid_user_property 10) + typeset value=$(user_property_value 16) + + log_must eval "$ZFS set $prop_name='$value' $ds" + + log_must $ZFS snapshot $ds@$TESTSNAP + + typeset snapvalue=$(get_prop $prop_name $ds@$TESTSNAP) + + if [[ "$snapvalue" != "$value" ]] ; then + log_fail "The '$ds@$TESTSNAP '$prop_name' value '$snapvalue' " \ + "not equal to the expected value '$value'." + fi + + snapvalue=$(user_property_value 16) + log_must eval "$ZFS set $prop_name='$snapvalue' $ds@$TESTSNAP" + + log_must $ZFS inherit $prop_name $ds@$TESTSNAP + + snapvalue=$(get_prop $prop_name $ds@$TESTSNAP) + + if [[ "$snapvalue" != "$value" ]] ; then + log_fail "The '$ds@$TESTSNAP '$prop_name' value '$snapvalue' " \ + "not equal to the expected value '$value'." + fi + + +done + +log_pass "'zfs inherit' inherit user property." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/Makefile new file mode 100644 index 0000000000..4b40b56b3b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/Makefile @@ -0,0 +1,55 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_mount + +PROGS = cleanup \ + setup \ + zfs_mount_001_pos \ + zfs_mount_002_pos \ + zfs_mount_003_pos \ + zfs_mount_004_pos \ + zfs_mount_005_pos \ + zfs_mount_006_pos \ + zfs_mount_007_pos \ + zfs_mount_008_pos \ + zfs_mount_009_neg \ + zfs_mount_010_neg \ + zfs_mount_011_neg \ + zfs_mount_all_001_pos + +FILES = zfs_mount.cfg \ + zfs_mount.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.cfg new file mode 100644 index 0000000000..c8e46895d2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.cfg @@ -0,0 +1,39 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export mountcmd=mount +export mountforce="$mountcmd -f" +export mountall="$mountcmd -a" + +export unmountcmd=unmount +export unmountforce="$unmountcmd -f" +export unmountall="$unmountcmd -a" + +export NONEXISTFSNAME="nonexistfs50charslong_0123456789012345678901234567" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib new file mode 100644 index 0000000000..d144496064 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib @@ -0,0 +1,131 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.cfg + +function force_unmount #dev +{ + typeset dev=$1 + + ismounted $dev + if (( $? == 0 )); then + log_must $ZFS $unmountforce $dev + fi + return 0 +} + +# Create pool and ( fs | container | vol ) with the given parameters, +# it'll destroy prior exist one that has the same name. + +function setup_filesystem #disklist #pool #fs #mntpoint #type #vdev +{ + typeset disklist=$1 + typeset pool=$2 + typeset fs=${3##/} + typeset mntpoint=$4 + typeset type=$5 + typeset vdev=$6 + + if [[ -z $pool || -z $fs || -z $mntpoint ]]; then + log_note "Missing parameter: (\"$pool\", \"$fs\", \"$mntpoint\")" + return 1 + fi + + if is_global_zone && [[ -z $disklist ]] ; then + log_note "Missing disklist." + return 1 + fi + + if [[ $vdev != "" && \ + $vdev != "mirror" && \ + $vdev != "raidz" ]] ; then + + log_note "Wrong vdev: (\"$vdev\")" + return 1 + fi + + poolexists $pool || \ + create_pool $pool $vdev $disklist + + datasetexists $pool/$fs && \ + log_must cleanup_filesystem $pool $fs + + $RMDIR $mntpoint > /dev/null 2>&1 + if [[ ! -d $mntpoint ]]; then + log_must $MKDIR -p $mntpoint + fi + + case "$type" in + 'ctr') log_must $ZFS create $pool/$fs + log_must $ZFS set mountpoint=$mntpoint $pool/$fs + ;; + 'vol') log_must $ZFS create -V $VOLSIZE $pool/$fs + ;; + *) log_must $ZFS create $pool/$fs + log_must $ZFS set mountpoint=$mntpoint $pool/$fs + ;; + esac + + return 0 +} + +# Destroy ( fs | container | vol ) with the given parameters. +function cleanup_filesystem #pool #fs +{ + typeset pool=$1 + typeset fs=${2##/} + typeset mtpt="" + + if [[ -z $pool || -z $fs ]]; then + log_note "Missing parameter: (\"$pool\", \"$fs\")" + return 1 + fi + + if datasetexists "$pool/$fs" ; then + mtpt=$(get_prop mountpoint "$pool/$fs") + log_must $ZFS destroy -r $pool/$fs + + [[ -d $mtpt ]] && \ + log_must $RM -rf $mtpt + else + return 1 + fi + + return 0 +} + +# Make sure 'zfs mount' should display all ZFS filesystems currently mounted. +# The results of 'zfs mount' and 'df -F zfs' should be identical. +function verify_mount_display +{ + typeset fs + + for fs in $($ZFS $mountcmd | $AWK '{print $1}') ; do + log_must mounted $fs + done + return 0 +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_001_pos.ksh new file mode 100644 index 0000000000..b474dc8e1f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_001_pos.ksh @@ -0,0 +1,63 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# +# DESCRIPTION: +# Invoke "zfs mount <filesystem>" with a regular name of filesystem, +# will mount that filesystem successfully. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is unmounted. +# 2. Invoke 'zfs mount <filesystem>'. +# 3. Verify that the filesystem is mounted. +# + +verify_runnable "both" + +function cleanup +{ + log_must force_unmount $TESTPOOL/$TESTFS + return 0 +} + +log_assert "Verify that '$ZFS $mountcmd <filesystem>' succeeds as root." + +log_onexit cleanup + +unmounted $TESTPOOL/$TESTFS || \ + log_must cleanup + +log_must $ZFS $mountcmd $TESTPOOL/$TESTFS + +log_note "Make sure the filesystem $TESTPOOL/$TESTFS is mounted" +mounted $TESTPOOL/$TESTFS || \ + log_fail Filesystem $TESTPOOL/$TESTFS is unmounted + +log_pass "'$ZFS $mountcmd <filesystem>' succeeds as root." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_002_pos.ksh new file mode 100644 index 0000000000..8b39306fbd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_002_pos.ksh @@ -0,0 +1,74 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# +# DESCRIPTION: +# Invoking "zfs mount <filesystem>" with a filesystem whose name is not in +# "zfs list", will fail with a return code of 1. +# +# STRATEGY: +# 1. Make sure the NONEXISTFSNAME ZFS filesystem is not in 'zfs list'. +# 2. Invoke 'zfs mount <filesystem>'. +# 3. Verify that mount failed with return code of 1. +# + +verify_runnable "both" + +function cleanup +{ + typeset fs + for fs in $NONEXISTFSNAME $TESTFS ; do + log_must force_unmount $TESTPOOL/$fs + done +} + + +log_assert "Verify that '$ZFS $mountcmd' with a filesystem " \ + "whose name is not in 'zfs list' will fail with return code 1." + +log_onexit cleanup + +log_note "Make sure the filesystem $TESTPOOL/$NONEXISTFSNAME " \ + "is not in 'zfs list'" +log_mustnot $ZFS list $TESTPOOL/$NONEXISTFSNAME + +typeset -i ret=0 +$ZFS $mountcmd $TESTPOOL/$NONEXISTFSNAME +ret=$? +(( ret == 1 )) || \ + log_fail "'$ZFS $mountcmd $TESTPOOL/$NONEXISTFSNAME' " \ + "unexpected return code of $ret." + +log_note "Make sure the filesystem $TESTPOOL/$NONEXISTFSNAME is unmounted" +unmounted $TESTPOOL/$NONEXISTFSNAME || \ + log_fail Filesystem $TESTPOOL/$NONEXISTFSNAME is mounted + +log_pass "'$ZFS $mountcmd' with a filesystem " \ + "whose name is not in 'zfs list' failed with return code 1." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_003_pos.ksh new file mode 100644 index 0000000000..2dd14daecd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_003_pos.ksh @@ -0,0 +1,86 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# +# DESCRIPTION: +# Invoke "zfs mount <filesystem>" with a filesystem whose mountpoint property +# is 'legacy' or 'none', +# it will fail with a return code of 1 and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is unmounted. +# 2. Mount the filesystem using the various combinations +# - zfs set mountpoint=legacy <filesystem> +# - zfs set mountpoint=none <filesystem> +# 3. Verify that mount failed with return code of 1. +# + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + log_must force_unmount $TESTPOOL/$TESTFS + return 0 +} + +log_assert "Verify that '$ZFS $mountcmd' with a filesystem " \ + "whose mountpoint property is 'legacy' or 'none' " \ + "will fail with return code 1." + +log_onexit cleanup + +set -A mopt "legacy" "none" + +typeset -i ret=0 +typeset -i i=0 + +while (( i < ${#mopt[*]} )); do + unmounted $TESTPOOL/$TESTFS || \ + log_must cleanup + + log_must $ZFS set mountpoint=${mopt[i]} $TESTPOOL/$TESTFS + + $ZFS $mountcmd $TESTPOOL/$TESTFS + ret=$? + (( ret == 1)) || \ + log_fail "'$ZFS $mountcmd $TESTPOOL/$TESTFS' " \ + "unexpected return code of $ret." + + log_note "Make sure the filesystem $TESTPOOL/$TESTFS is unmounted" + unmounted $TESTPOOL/$TESTFS || \ + log_fail Filesystem $TESTPOOL/$TESTFS is mounted + + ((i = i + 1)) +done + +log_pass "Verify that '$ZFS $mountcmd' with a filesystem " \ + "whose mountpoint property is 'legacy' or 'none' " \ + "will fail with return code 1." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_004_pos.ksh new file mode 100644 index 0000000000..524aed1855 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_004_pos.ksh @@ -0,0 +1,79 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# +# DESCRIPTION: +# Invoke "zfs mount <filesystem>" with a filesystem +# which has been already mounted, +# it will fail with a return code of 1 +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is unmounted. +# 2. Invoke 'zfs mount <filesystem>'. +# 3. Verify that the filesystem is mounted. +# 4. Invoke 'zfs mount <filesystem>' the second times. +# 5. Verify the last mount operation failed with return code of 1. +# + +verify_runnable "both" + +function cleanup +{ + log_must force_unmount $TESTPOOL/$TESTFS + return 0 +} + +typeset -i ret=0 + +log_assert "Verify that '$ZFS $mountcmd <filesystem>' " \ + "with a mounted filesystem will fail with return code 1." + +log_onexit cleanup + +unmounted $TESTPOOL/$TESTFS || \ + log_must cleanup + +log_must $ZFS $mountcmd $TESTPOOL/$TESTFS + +mounted $TESTPOOL/$TESTFS || \ + log_unresolved "Filesystem $TESTPOOL/$TESTFS is unmounted" + +$ZFS $mountcmd $TESTPOOL/$TESTFS +ret=$? +(( ret == 1 )) || \ + log_fail "'$ZFS $mountcmd $TESTPOOL/$TESTFS' " \ + "unexpected return code of $ret." + +log_note "Make sure the filesystem $TESTPOOL/$TESTFS is mounted" +mounted $TESTPOOL/$TESTFS || \ + log_fail Filesystem $TESTPOOL/$TESTFS is unmounted + +log_pass "'$ZFS $mountcmd <filesystem>' with a mounted filesystem " \ + "will fail with return code 1." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_005_pos.ksh new file mode 100644 index 0000000000..1e5610434f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_005_pos.ksh @@ -0,0 +1,82 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# +# DESCRIPTION: +# Invoke "zfs mount <filesystem>" with a filesystem +# but its mountpoint is currently in use, +# it will fail with a return code of 1 +# and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is unmounted. +# 2. Apply 'zfs set mountpoint=path <filesystem>'. +# 3. Change directory to that given mountpoint. +# 3. Invoke 'zfs mount <filesystem>'. +# 4. Verify that mount failed with return code of 1. +# + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + log_must force_unmount $TESTPOOL/$TESTFS + return 0 +} + +typeset -i ret=0 + +log_assert "Verify that '$ZFS $mountcmd' with a filesystem " \ + "whose mountpoint is currently in use will fail with return code 1." + +log_onexit cleanup + +unmounted $TESTPOOL/$TESTFS || \ + log_must cleanup + +[[ -d $TESTDIR ]] || \ + log_must $MKDIR -p $TESTDIR + +cd $TESTDIR || \ + log_unresolved "Unable change directory to $TESTDIR" + +$ZFS $mountcmd $TESTPOOL/$TESTFS +ret=$? +(( ret == 1 )) || \ + log_fail "'$ZFS $mountcmd $TESTPOOL/$TESTFS' " \ + "unexpected return code of $ret." + +log_note "Make sure the filesystem $TESTPOOL/$TESTFS is unmounted" +unmounted $TESTPOOL/$TESTFS || \ + log_fail Filesystem $TESTPOOL/$TESTFS is mounted + +log_pass "'$ZFS $mountcmd' with a filesystem " \ + "whose mountpoint is currently in use failed with return code 1." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_006_pos.ksh new file mode 100644 index 0000000000..f8b40219bd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_006_pos.ksh @@ -0,0 +1,120 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# +# DESCRIPTION: +# Invoke "zfs mount <filesystem>" with a filesystem +# which mountpoint be the identical or the top of an existing one, +# it will fail with a return code of 1 +# +# STRATEGY: +# 1. Prepare an existing mounted filesystem. +# 2. Setup a new filesystem and make sure that it is unmounted. +# 3. Mount the new filesystem using the various combinations +# - zfs set mountpoint=<identical path> <filesystem> +# - zfs set mountpoint=<top path> <filesystem> +# 4. Verify that mount failed with return code of 1. +# + +verify_runnable "both" + +function cleanup +{ + log_must force_unmount $TESTPOOL/$TESTFS + + datasetexists $TESTPOOL/$TESTFS1 && \ + cleanup_filesystem $TESTPOOL $TESTFS1 + + [[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + log_must force_unmount $TESTPOOL/$TESTFS + + return 0 +} + +typeset -i ret=0 + +log_assert "Verify that '$ZFS $mountcmd <filesystem>' " \ + "which mountpoint be the identical or the top of an existing one " \ + "will fail with return code 1." + +log_onexit cleanup + +unmounted $TESTPOOL/$TESTFS || \ + log_must force_unmount $TESTPOOL/$TESTFS + +[[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR + +typeset -i MAXDEPTH=3 +typeset -i depth=0 +typeset mtpt=$TESTDIR + +while (( depth < MAXDEPTH )); do + mtpt=$mtpt/$depth + (( depth = depth + 1)) +done + +log_must $ZFS set mountpoint=$mtpt $TESTPOOL/$TESTFS +log_must $ZFS $mountcmd $TESTPOOL/$TESTFS + +mounted $TESTPOOL/$TESTFS || \ + log_unresolved "Filesystem $TESTPOOL/$TESTFS is unmounted" + +log_must $ZFS create $TESTPOOL/$TESTFS1 + +unmounted $TESTPOOL/$TESTFS1 || \ + log_must force_unmount $TESTPOOL/$TESTFS1 + +while [[ -n $mtpt ]] ; do + (( depth == MAXDEPTH )) && \ + log_note "Verify that '$ZFS $mountcmd <filesystem>' " \ + "which mountpoint be the identical of an existing one " \ + "will fail with return code 1." + + log_must $ZFS set mountpoint=$mtpt $TESTPOOL/$TESTFS1 + log_mustnot $ZFS $mountcmd $TESTPOOL/$TESTFS1 + + unmounted $TESTPOOL/$TESTFS1 || \ + log_fail "Filesystem $TESTPOOL/$TESTFS1 is mounted." + + mtpt=${mtpt%/*} + + (( depth == MAXDEPTH )) && \ + log_note "Verify that '$ZFS $mountcmd <filesystem>' " \ + "which mountpoint be the top of an existing one " \ + "will fail with return code 1." + (( depth = depth - 1 )) +done + +log_pass "'$ZFS $mountcmd <filesystem>' " \ + "which mountpoint be the identical or the top of an existing one " \ + "will fail with return code 1." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_007_pos.ksh new file mode 100644 index 0000000000..577de09579 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_007_pos.ksh @@ -0,0 +1,142 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# +# DESCRIPTION: +# The following options can be set on a temporary basis using the -o option +# without affecting the on-disk property. The original on-disk value will be +# restored when the file system is unmounted and mounted. +# +# PROPERTY MOUNT OPTION +# atime atime/noatime +# devices devices/nodevices +# exec exec/noexec +# readonly ro/rw +# setuid setuid/nosetuid +# +# STRATEGY: +# 1. Create filesystem and get origianl property value. +# 2. Using 'zfs mount -o' to set filesystem property. +# 3. Verify the property was set temporarily. +# 4. Verify it will not affect the property that is stored on disk. +# + +function cleanup +{ + if ! ismounted $TESTPOOL/$TESTFS; then + log_must $ZFS mount $TESTPOOL/$TESTFS + fi +} + +log_assert "Verify '-o' will set filesystem property temporarily, " \ + "without affecting the property that is stored on disk." +log_onexit cleanup + +set -A properties "atime" "devices" "exec" "readonly" "setuid" + +# +# Get the specified filesystem property reverse mount option. +# +# $1 filesystem +# $2 property +# +function get_reverse_option +{ + typeset fs=$1 + typeset prop=$2 + + # Define property value: "reverse if value=on" "reverse if value=off" + set -A values "noatime" "atime" \ + "nodevices" "devices" \ + "noexec" "exec" \ + "rw" "ro" \ + "nosetuid" "setuid" + + typeset -i i=0 + while (( i < ${#properties[@]} )); do + if [[ $prop == ${properties[$i]} ]]; then + break + fi + + (( i += 1 )) + done + if (( i >= ${#properties[@]} )); then + log_fail "Incorrect option: $prop" + fi + + typeset val + typeset -i ind=0 + val=$(get_prop $prop $fs) || log_fail "get_prop $prop $fs" + if [[ $val == "on" ]]; then + (( ind = i * 2 )) + else + (( ind = i * 2 + 1 )) + fi + + $ECHO ${values[$ind]} +} + +fs=$TESTPOOL/$TESTFS +cleanup + +for property in ${properties[@]}; do + orig_val=$(get_prop $property $fs) + (($? != 0)) && log_fail "get_prop $property $fs" + + # Set filesystem property temporarily + reverse_opt=$(get_reverse_option $fs $property) + log_must $ZFS mount -o remount,$reverse_opt $fs + + cur_val=$(get_prop $property $fs) + (($? != 0)) && log_fail "get_prop $property $fs" + + # In LZ, a user with all zone privileges can never with "devices" + if ! is_global_zone && [[ $property == devices ]] ; then + if [[ $cur_val != off || $orig_val != off ]]; then + log_fail "'devices' property shouldn't " \ + "be enabled in LZ" + fi + elif [[ $orig_val == $cur_val ]]; then + log_fail "zfs mount -o remount,$reverse_opt " \ + "doesn't change property." + fi + + # unmount & mount will revert property to the original value + log_must $ZFS unmount $fs + log_must $ZFS mount $fs + + cur_val=$(get_prop $property $fs) + (($? != 0)) && log_fail "get_prop $property $fs" + if [[ $orig_val != $cur_val ]]; then + log_fail "zfs mount -o remount,$reverse_opt " \ + "change the property that is stored on disks" + fi +done + +log_pass "Verify '-o' set filesystem property temporarily passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_008_pos.ksh new file mode 100644 index 0000000000..a273272a7c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_008_pos.ksh @@ -0,0 +1,92 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# +# DESCRIPTION: +# 'zfs mount -O' allow the file system to be mounted over an existing +# mount point, making the underlying file system inaccessible. +# +# STRATEGY: +# 1. Create two filesystem fs & fs1, and create two test files for them. +# 2. Unmount fs1 and set mountpoint property is identical to fs. +# 3. Verify 'zfs mount -O' will make the underlying filesystem fs +# inaccessible. +# + +function cleanup +{ + ! ismounted $fs && log_must $ZFS mount $fs + + if datasetexists $fs1; then + log_must $ZFS destroy $fs1 + fi + + if [[ -f $testfile ]]; then + log_must $RM -f $testfile + fi +} + +log_assert "Verify 'zfs mount -O' will override existing mount point." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS; fs1=$TESTPOOL/$TESTFS1 + +cleanup + +# Get the original mountpoint of $fs and $fs1 +mntpnt=$(get_prop mountpoint $fs) +log_must $ZFS create $fs1 +mntpnt1=$(get_prop mountpoint $fs1) + +testfile=$mntpnt/$TESTFILE0; testfile1=$mntpnt1/$TESTFILE1 +log_must $MKFILE 1M $testfile $testfile1 + +log_must $ZFS unmount $fs1 +log_must $ZFS set mountpoint=$mntpnt $fs1 +log_mustnot $ZFS mount $fs1 +log_must $ZFS mount -O $fs1 + +# Create new file in override mountpoint +log_must $MKFILE 1M $mntpnt/$TESTFILE2 + +# Verify the underlying file system inaccessible +log_mustnot $LS $testfile +log_must $LS $mntpnt/$TESTFILE1 $mntpnt/$TESTFILE2 + +# Verify $TESTFILE2 was created in $fs1, rather then $fs +log_must $ZFS unmount $fs1 +log_must $ZFS set mountpoint=$mntpnt1 $fs1 +log_must $ZFS mount $fs1 +log_must $LS $testfile1 $mntpnt1/$TESTFILE2 + +# Verify $TESTFILE2 was not created in $fs, and $fs is accessable again. +log_mustnot $LS $mntpnt/$TESTFILE2 +log_must $LS $testfile + +log_pass "Verify 'zfs mount -O' override mount point passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_009_neg.ksh new file mode 100644 index 0000000000..c6a372ac66 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_009_neg.ksh @@ -0,0 +1,111 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# +# DESCRIPTION: +# Try each 'zfs mount' with inapplicable scenarios to make sure +# it returns an error. include: +# * '-a', but also with a specific filesystem. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# + +verify_runnable "both" + +multifs="$TESTFS $TESTFS1" +datasets="" + +for fs in $multifs ; do + datasets="$datasets $TESTPOOL/$fs" +done + +set -A args "$mountall $TESTPOOL/$TESTFS" + +function setup_all +{ + typeset fs + + for fs in $multifs ; do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "$fs" \ + "${TEST_BASE_DIR%%/}/testroot$$/$TESTPOOL/$fs" + done + return 0 +} + +function cleanup_all +{ + typeset fs + + cleanup_filesystem "$TESTPOOL" "$TESTFS1" + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + [[ -d ${TEST_BASE_DIR%%/}/testroot$$ ]] && \ + $RM -rf ${TEST_BASE_DIR%%/}/testroot$$ + + + return 0 +} + +function verify_all +{ + typeset fs + + for fs in $multifs ; do + log_must unmounted $TESTPOOL/$fs + done + return 0 +} + +log_assert "Badly-formed 'zfs $mountcmd' with inapplicable scenarios " \ + "should return an error." +log_onexit cleanup_all + +log_must setup_all + +log_must $ZFS $unmountall + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS ${args[i]} + ((i = i + 1)) +done + +log_must verify_all + +log_pass "Badly formed 'zfs $mountcmd' with inapplicable scenarios " \ + "fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_010_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_010_neg.ksh new file mode 100644 index 0000000000..f4cb321636 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_010_neg.ksh @@ -0,0 +1,67 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that zfs mount should fail when mounting a mounted zfs filesystem or +# the mountpoint is busy +# +# STRATEGY: +# 1. Make a zfs filesystem mounted or mountpoint busy +# 2. Use zfs mount to mount the filesystem +# 3. Verify that zfs mount returns error +# + +verify_runnable "both" + +function cleanup +{ + if ! ismounted $fs; then + log_must $ZFS mount $fs + fi +} + +log_assert "zfs mount fails with mounted filesystem or busy mountpoint" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +if ! ismounted $fs; then + log_must $ZFS mount $fs +fi + +log_mustnot $ZFS mount $fs + +mpt=$(get_prop mountpoint $fs) +log_must $ZFS umount $fs +curpath=`$DIRNAME $0` +cd $mpt +log_mustnot $ZFS mount $fs +cd $curpath + +log_pass "zfs mount fails with mounted filesystem or busy moutpoint as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_011_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_011_neg.ksh new file mode 100644 index 0000000000..97fc4b3b0d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_011_neg.ksh @@ -0,0 +1,77 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that zfs mount should fail with bad parameters +# +# STRATEGY: +# 1. Make an array of bad parameters +# 2. Use zfs mount to mount the filesystem +# 3. Verify that zfs mount returns error +# + +verify_runnable "both" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP; then + log_must $ZFS destroy $TESTPOOL/$TESTFS@$TESTSNAP + fi + + if is_global_zone && datasetexists $TESTPOOL/$TESTVOL; then + log_must $ZFS destroy $TESTPOOL/$TESTVOL + fi +} + +log_assert "zfs mount fails with bad parameters" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +set -A badargs "A" "-A" "-" "-x" "-?" "=" "-o *" "-a" + +for arg in "${badargs[@]}"; do + log_mustnot eval "$ZFS mount $arg $fs >/dev/null 2>&1" +done + +#verify that zfs mount fails with invalid dataset +for opt in "-o abc" "-O"; do + log_mustnot eval "$ZFS mount $opt /$fs >/dev/null 2>&1" +done + +#verify that zfs mount fails with volume and snapshot +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_mustnot eval "$ZFS mount $TESTPOOL/$TESTFS@$TESTSNAP >/dev/null 2>&1" + +if is_global_zone; then + log_must $ZFS create -V 10m $TESTPOOL/$TESTVOL + log_mustnot eval "$ZFS mount $TESTPOOL/$TESTVOL >/dev/null 2>&1" +fi + +log_pass "zfs mount fails with bad parameters as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_001_pos.ksh new file mode 100644 index 0000000000..8973558533 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_all_001_pos.ksh @@ -0,0 +1,197 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib + +# DESCRIPTION: +# Verify that 'zfs mount -a' succeeds as root. +# +# STRATEGY: +# 1. Create a group of pools with specified vdev. +# 2. Create zfs filesystems within the given pools. +# 3. Unmount all the filesystems. +# 4. Verify that 'zfs mount -a' command succeed, +# and all available ZFS filesystems are mounted. +# 5. Verify that 'zfs mount' is identical with 'df -F zfs' +# + +verify_runnable "both" + +set -A fs "$TESTFS" "$TESTFS1" +set -A ctr "" "$TESTCTR" "$TESTCTR/$TESTCTR1" "$TESTCTR1" +set -A vol "$TESTVOL" "$TESTVOL1" + +function setup_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + + while (( i < ${#ctr[*]} )); do + + path=${TEST_BASE_DIR%%/}/testroot$$/$TESTPOOL + if [[ -n ${ctr[i]} ]]; then + path=$path/${ctr[i]} + + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}" "$path" \ + "ctr" + fi + + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}/${vol[j]}" \ + "$path/${vol[j]}" \ + "vol" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}/${fs[j]}" \ + "$path/${fs[j]}" + ((j = j + 1)) + done + + ((i = i + 1)) + done + + return 0 +} + +function cleanup_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + + ((i = ${#ctr[*]} - 1)) + + while (( i >= 0 )); do + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + cleanup_filesystem "$TESTPOOL" \ + "${ctr[i]}/${vol[j]}" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + cleanup_filesystem "$TESTPOOL" \ + "${ctr[i]}/${fs[j]}" + ((j = j + 1)) + done + + [[ -n ${ctr[i]} ]] && \ + cleanup_filesystem "$TESTPOOL" "${ctr[i]}" + + ((i = i - 1)) + done + + [[ -d ${TEST_BASE_DIR%%/}/testroot$$ ]] && \ + $RM -rf ${TEST_BASE_DIR%%/}/testroot$$ +} + +# +# This function takes a single true/false argument. If true it will verify that +# all file systems are mounted. If false it will verify that they are not +# mounted. +# +function verify_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + typeset logfunc + + if $1; then + logfunc=log_must + else + logfunc=log_mustnot + fi + + while (( i < ${#ctr[*]} )); do + + path=$TESTPOOL + [[ -n ${ctr[i]} ]] && \ + path=$path/${ctr[i]} + + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + log_mustnot mounted "$path/${vol[j]}" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + $logfunc mounted "$path/${fs[j]}" + ((j = j + 1)) + done + + $logfunc mounted "$path" + + ((i = i + 1)) + done + + return 0 +} + + +log_assert "Verify that 'zfs $mountall' succeeds as root, " \ + "and all available ZFS filesystems are mounted." + +log_onexit cleanup_all + +log_must setup_all + +export __ZFS_POOL_RESTRICT="$TESTPOOL" +log_must $ZFS $unmountall +unset __ZFS_POOL_RESTRICT + +verify_all false + +export __ZFS_POOL_RESTRICT="$TESTPOOL" +log_must $ZFS $mountall +unset __ZFS_POOL_RESTRICT + +verify_all true + +log_note "Verify that 'zfs $mountcmd' will display " \ + "all ZFS filesystems currently mounted." + +verify_mount_display + +log_pass "'zfs $mountall' succeeds as root, " \ + "and all available ZFS filesystems are mounted." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/Makefile new file mode 100644 index 0000000000..a535b40788 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/Makefile @@ -0,0 +1,50 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_promote + +PROGS = cleanup \ + setup \ + zfs_promote_001_pos \ + zfs_promote_002_pos \ + zfs_promote_003_pos \ + zfs_promote_004_pos \ + zfs_promote_005_pos \ + zfs_promote_006_neg \ + zfs_promote_007_neg \ + zfs_promote_008_pos + +FILES = zfs_promote.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/setup.ksh new file mode 100644 index 0000000000..ba8731c4ba --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_volume_setup ${DISK} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote.cfg new file mode 100644 index 0000000000..6407328efd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote.cfg @@ -0,0 +1,43 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export FILESIZE=1m + +export TESTSNAP3=testsnap3.promote +export TESTSNAP4=testsnap4.promote +export TESTSNAP5=testsnap5.promote +export TESTFILE3=testfile3.promote + +export CLONEFILE=clonefile.promote +export CLONEFILE1=clonefile1.promote +export CLONEFILE2=clonefile2.promote +export CLONEFILE3=clonefile3.promote + + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_001_pos.ksh new file mode 100644 index 0000000000..2c2b9a5bff --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_001_pos.ksh @@ -0,0 +1,127 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_promote/zfs_promote.cfg +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs promote' can promote a clone filesystem to no longer be dependent +# on its "origin" snapshot. +# +# STRATEGY: +# 1. Create a snapshot and a clone of the snapshot +# 2. Promote the clone filesystem +# 3. Verify the promoted filesystem become independent +# + +verify_runnable "both" + +function cleanup +{ + if snapexists $csnap; then + log_must $ZFS promote $fs + fi + snapexists $snap && \ + log_must $ZFS destroy -rR $snap + + typeset data + for data in $file0 $file1; do + [[ -e $data ]] && $RM -f $data + done +} + +function testing_verify +{ + typeset ds=$1 + typeset ds_file=$2 + typeset snap_file=$3 + typeset c_ds=$4 + typeset c_file=$5 + typeset csnap_file=$6 + typeset origin_prop="" + + + snapexists $ds@$TESTSNAP && \ + log_fail "zfs promote cannot promote $ds@$TESTSNAP." + ! snapexists $c_ds@$TESTSNAP && \ + log_fail "The $c_ds@$TESTSNAP after zfs promote doesn't exist." + + origin_prop=$(get_prop origin $ds) + [[ "$origin_prop" != "$c_ds@$TESTSNAP" ]] && \ + log_fail "The dependency of $ds is not correct." + origin_prop=$(get_prop origin $c_ds) + [[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency of $c_ds is not correct." + + if [[ -e $snap_file ]] || [[ ! -e $csnap_file ]]; then + log_fail "Data file $snap_file cannot be correctly promoted." + fi + if [[ ! -e $ds_file ]] || [[ ! -e $c_file ]]; then + log_fail "There exists data file losing after zfs promote." + fi + + log_mustnot $ZFS destroy -r $c_ds +} + +log_assert "'zfs promote' can promote a clone filesystem." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +file0=$TESTDIR/$TESTFILE0 +file1=$TESTDIR/$TESTFILE1 +snap=$fs@$TESTSNAP +snapfile=$TESTDIR/.zfs/snapshot/$TESTSNAP/$TESTFILE0 +clone=$TESTPOOL/$TESTCLONE +cfile=/$clone/$CLONEFILE +csnap=$clone@$TESTSNAP +csnapfile=/$clone/.zfs/snapshot/$TESTSNAP/$TESTFILE0 + +# setup for promte testing +log_must $MKFILE $FILESIZE $file0 +log_must $ZFS snapshot $snap +log_must $MKFILE $FILESIZE $file1 +log_must $RM -f $file0 +log_must $ZFS clone $snap $clone +log_must $MKFILE $FILESIZE $cfile + +log_must $ZFS promote $clone +# verify the 'promote' operation +testing_verify $fs $file1 $snapfile $clone $cfile $csnapfile + +log_note "Verify 'zfs promote' can change back the dependency relationship." +log_must $ZFS promote $fs +#verify the result +testing_verify $clone $cfile $csnapfile $fs $file1 $snapfile + +log_pass "'zfs promote' reverses the clone parent-child dependency relationship"\ + "as expected." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_002_pos.ksh new file mode 100644 index 0000000000..b6ff94b520 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_002_pos.ksh @@ -0,0 +1,102 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_promote/zfs_promote.cfg +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs promote' can deal with multiple snapshots in the origin filesystem. +# +# STRATEGY: +# 1. Create multiple snapshots and a clone of the last snapshot +# 2. Promote the clone filesystem +# 3. Verify the promoted filesystem included all snapshots +# + +verify_runnable "both" + +function cleanup +{ + if snapexists $csnap1; then + log_must $ZFS promote $fs + fi + + typeset ds + typeset data + for ds in $snap $snap1; do + log_must $ZFS destroy -rR $ds + done + for file in $TESTDIR/$TESTFILE0 $TESTDIR/$TESTFILE1; do + [[ -e $file ]] && $RM -f $file + done +} + +log_assert "'zfs promote' can deal with multiple snapshots in a filesystem." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +snap=$fs@$TESTSNAP +snap1=$fs@$TESTSNAP1 +clone=$TESTPOOL/$TESTCLONE +csnap=$clone@$TESTSNAP +csnap1=$clone@$TESTSNAP1 + +# setup for promote testing +log_must $MKFILE $FILESIZE $TESTDIR/$TESTFILE0 +log_must $ZFS snapshot $snap +log_must $MKFILE $FILESIZE $TESTDIR/$TESTFILE1 +log_must $RM -f $testdir/$TESTFILE0 +log_must $ZFS snapshot $snap1 +log_must $ZFS clone $snap1 $clone +log_must $MKFILE $FILESIZE /$clone/$CLONEFILE + +log_must $ZFS promote $clone + +# verify the 'promote' operation +for ds in $csnap $csnap1; do + ! snapexists $ds && \ + log_fail "Snapshot $ds doesn't exist after zfs promote." +done +for ds in $snap $snap1; do + snapexists $ds && \ + log_fail "Snapshot $ds is still there after zfs promote." +done + +origin_prop=$(get_prop origin $fs) +[[ "$origin_prop" != "$csnap1" ]] && \ + log_fail "The dependency of $fs is not correct." +origin_prop=$(get_prop origin $clone) +[[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency of $clone is not correct." + +log_pass "'zfs promote' deal with multiple snapshots as expected." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_003_pos.ksh new file mode 100644 index 0000000000..44a6aa9fe2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_003_pos.ksh @@ -0,0 +1,134 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_promote/zfs_promote.cfg +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs promote' can deal with multi-point snapshots. +# +# STRATEGY: +# 1. Create multiple snapshots and a clone to a middle point snapshot +# 2. Promote the clone filesystem +# 3. Verify the origin filesystem and promoted filesystem include +# correct datasets seperated by the clone point. +# + +verify_runnable "both" + +function cleanup +{ + if snapexists ${csnap[2]}; then + log_must $ZFS promote $fs + fi + + typeset ds + typeset data + for ds in ${snap[*]}; do + snapexists $ds && \ + log_must $ZFS destroy -rR $ds + done + for data in ${file[*]}; do + [[ -e $data ]] && $RM -f $data + done + +} + +log_assert "'zfs promote' can deal with multi-point snapshots." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +clone=$TESTPOOL/$TESTCLONE + +# Define some arrays here to use loop to reduce code amount + +# Array which stores the origin snapshots created in the origin filesystem +set -A snap "${fs}@$TESTSNAP" "${fs}@$TESTSNAP1" "${fs}@$TESTSNAP2" "${fs}@$TESTSNAP3" +# Array which stores the snapshots existing in the clone after promote operation +set -A csnap "${clone}@$TESTSNAP" "${clone}@$TESTSNAP1" "${clone}@$TESTSNAP2" \ + "${clone}@$TESTSNAP3" +# The data will inject into the origin filesystem +set -A file "$TESTDIR/$TESTFILE0" "$TESTDIR/$TESTFILE1" "$TESTDIR/$TESTFILE2" \ + "$TESTDIR/$TESTFILE3" +snapdir=$TESTDIR/.zfs/snapshot +# The data which will exist in the snapshot after creation of snapshot +set -A snapfile "$snapdir/$TESTSNAP/$TESTFILE0" "$snapdir/$TESTSNAP1/$TESTFILE1" \ + "$snapdir/$TESTSNAP2/$TESTFILE2" "$snapdir/$TESTSNAP3/$TESTFILE3" +csnapdir=/$clone/.zfs/snapshot +# The data which will exist in the snapshot of clone filesystem after promote +set -A csnapfile "${csnapdir}/$TESTSNAP/$TESTFILE0" "${csnapdir}/$TESTSNAP1/$TESTFILE1" \ + "${csnapdir}/$TESTSNAP2/$TESTFILE2" + +# setup for promote testing +typeset -i i=0 +while (( i < 4 )); do + log_must $MKFILE $FILESIZE ${file[i]} + (( i>0 )) && log_must $RM -f ${file[((i-1))]} + log_must $ZFS snapshot ${snap[i]} + + (( i = i + 1 )) +done +log_must $ZFS clone ${snap[2]} $clone +log_must $MKFILE $FILESIZE /$clone/$CLONEFILE +log_must $RM -f /$clone/$TESTFILE2 +log_must $ZFS snapshot ${csnap[3]} + +log_must $ZFS promote $clone + +# verify the 'promote' operation +for ds in ${snap[3]} ${csnap[*]}; do + ! snapexists $ds && \ + log_fail "The snapshot $ds disappear after zfs promote." +done +for data in ${csnapfile[*]} $TESTDIR/$TESTFILE3 /$clone/$CLONEFILE; do + [[ ! -e $data ]] && \ + log_fail "The data file $data loses after zfs promote." +done + +for ds in ${snap[0]} ${snap[1]} ${snap[2]}; do + snapexists $ds && \ + log_fail "zfs promote cannot promote the snapshot $ds." +done +for data in ${snapfile[0]} ${snapfile[1]} ${snapfile[2]}; do + [[ -e $data ]] && \ + log_fail "zfs promote cannot promote the data $data." +done + +origin_prop=$(get_prop origin $fs) +[[ "$origin_prop" != "${csnap[2]}" ]] && \ + log_fail "The dependency is not correct for $fs after zfs promote." +origin_prop=$(get_prop origin $clone) +[[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency is not correct for $clone after zfs promote." + +log_pass "'zfs promote' deal with multi-point snapshots as expected." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_004_pos.ksh new file mode 100644 index 0000000000..a90da8ebb1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_004_pos.ksh @@ -0,0 +1,140 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_promote/zfs_promote.cfg +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs promote' can deal with multi-level clones. +# +# STRATEGY: +# 1. Create multiple snapshots and multi-level clones +# 2. Promote a clone filesystem +# 3. Verify the dataset dependency relationships are correct after promotion. +# + +verify_runnable "both" + +function cleanup +{ + if snapexists ${c1snap[1]}; then + log_must $ZFS promote $clone + fi + + typeset ds + typeset data + for ds in ${snap[*]}; do + snapexists $ds && \ + log_must $ZFS destroy -rR $ds + done + for data in ${file[*]}; do + [[ -e $data ]] && $RM -f $data + done +} + +log_assert "'zfs promote' can deal with multi-level clone." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +clone=$TESTPOOL/$TESTCLONE +clone1=$TESTPOOL/$TESTCLONE1 + +# Define some arrays here to use loop to reduce code amount + +# Array which stores the origin snapshots created in the origin filesystem +set -A snap "${fs}@$TESTSNAP" "${fs}@$TESTSNAP1" "${fs}@$TESTSNAP2" "${fs}@$TESTSNAP3" +# Array which stores the snapshots existing in the first clone +set -A csnap "${clone}@$TESTSNAP3" "${clone}@$TESTSNAP4" "${clone}@$TESTSNAP5" +# Array which stores the snapshots existing in the second clone after promote operation +set -A c1snap "${clone1}@$TESTSNAP3" "${clone1}@$TESTSNAP4" "${clone1}@$TESTSNAP5" +# The data will inject into the origin filesystem +set -A file "$TESTDIR/$TESTFILE0" "$TESTDIR/$TESTFILE1" "$TESTDIR/$TESTFILE2" \ + "$TESTDIR/$TESTFILE3" +cdir=/$TESTPOOL/$TESTCLONE +# The data will inject into the first clone +set -A cfile "${cdir}/$CLONEFILE" "${cdir}/$CLONEFILE1" "${cdir}/$CLONEFILE2" +c1snapdir=/$TESTPOOL/$TESTCLONE1/.zfs/snapshot +# The data which will exist in the snapshot of the second clone filesystem after promote +set -A c1snapfile "${c1snapdir}/$TESTSNAP3/$CLONEFILE" \ + "${c1snapdir}/$TESTSNAP4/$CLONEFILE1" \ + "${c1snapdir}/$TESTSNAP5/$CLONEFILE2" + +# setup for promote testing +typeset -i i=0 +while (( i < 4 )); do + log_must $MKFILE $FILESIZE ${file[i]} + (( i>0 )) && log_must $RM -f ${file[((i-1))]} + log_must $ZFS snapshot ${snap[i]} + + (( i = i + 1 )) +done +log_must $ZFS clone ${snap[2]} $clone + +log_must $RM -f /$clone/$TESTFILE2 +i=0 +while (( i < 3 )); do + log_must $MKFILE $FILESIZE ${cfile[i]} + (( i>0 )) && log_must $RM -f ${cfile[(( i-1 ))]} + log_must $ZFS snapshot ${csnap[i]} + + (( i = i + 1 )) +done + +log_must $ZFS clone ${csnap[1]} $clone1 +log_must $MKFILE $FILESIZE /$clone1/$CLONEFILE2 +log_must $RM -f /$clone1/$CLONEFILE1 +log_must $ZFS snapshot ${c1snap[2]} + +log_must $ZFS promote $clone1 + +# verify the 'promote' operation +for ds in ${snap[*]} ${csnap[2]} ${c1snap[*]}; do + ! snapexists $ds && \ + log_fail "The snapshot $ds disappear after zfs promote." +done +for data in ${c1snapfile[*]}; do + [[ ! -e $data ]] && \ + log_fail "The data file $data loses after zfs promote." +done + +origin_prop=$(get_prop origin $fs) +[[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency is not correct for $fs after zfs promote." +origin_prop=$(get_prop origin $clone) +[[ "$origin_prop" != "${c1snap[1]}" ]] && \ + log_fail "The dependency is not correct for $clone after zfs promote." +origin_prop=$(get_prop origin $clone1) +[[ "$origin_prop" != "${snap[2]}" ]] && \ + log_fail "The dependency is not correct for $clone1 after zfs promote." + +log_pass "'zfs promote' deal with multi-level clones as expected." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_005_pos.ksh new file mode 100644 index 0000000000..e505951222 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_005_pos.ksh @@ -0,0 +1,69 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# The original fs was unmounted, 'zfs promote' still should succeed. +# +# STRATEGY: +# 1. Create pool, fs and snapshot. +# 2. Create clone of fs. +# 3. Unmount fs, then verify 'zfs promote' clone still succeed. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $fssnap ; then + datasetexists $clone && log_must $ZFS destroy $clone + log_must $ZFS destroy $fssnap + fi + if datasetexists $clone ; then + log_must $ZFS promote $fs + log_must $ZFS destroy $clone + log_must $ZFS destroy $fssnap + fi +} + +log_assert "The original fs was unmounted, 'zfs promote' still should succeed." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +clone=$TESTPOOL/$TESTCLONE +fssnap=$fs@fssnap + +log_must $ZFS snapshot $fssnap +log_must $ZFS clone $fssnap $clone +log_must $ZFS unmount $fs +log_must $ZFS promote $clone +log_must $ZFS unmount $clone +log_must $ZFS promote $fs + +log_pass "Unmount original fs, 'zfs promote' passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_006_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_006_neg.ksh new file mode 100644 index 0000000000..9c1fb3e96f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_006_neg.ksh @@ -0,0 +1,80 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs promote' will fail with invalid arguments: +# (1) NULL arguments +# (2) non-existent clone +# (3) non-clone datasets: +# pool, fs, snapshot,volume +# (4) too many arguments. +# (5) invalid options +# +# STRATEGY: +# 1. Create an array of invalid arguments +# 2. For each invalid argument in the array, 'zfs promote' should fail +# 3. Verify the return code from zfs promote +# + +verify_runnable "both" + +snap=$TESTPOOL/$TESTFS@$TESTSNAP +set -A args "" \ + "$TESTPOOL/blah" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$snap" \ + "$TESTPOOL/$TESTVOL" "$TESTPOL $TESTPOOL/$TESTFS" \ + "$clone $TESTPOOL/$TESTFS" "- $clone" "-? $clone" + +function cleanup +{ + if datasetexists $clone; then + log_must $ZFS destroy $clone + fi + + if snapexists $snap; then + destroy_snapshot $snap + fi +} + +log_assert "'zfs promote' will fail with invalid arguments. " +log_onexit cleanup + +snap=$TESTPOOL/$TESTFS@$TESTSNAP +clone=$TESTPOOL/$TESTCLONE +log_must $ZFS snapshot $snap +log_must $ZFS clone $snap $clone + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS promote ${args[i]} + + (( i = i + 1 )) +done + +log_pass "'zfs promote' fails with invalid argument as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_007_neg.ksh new file mode 100644 index 0000000000..83a5231105 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_007_neg.ksh @@ -0,0 +1,78 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_promote/zfs_promote.cfg +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs promote' can deal with conflicts in the namespaces. +# +# STRATEGY: +# 1. Create a snapshot and a clone of the snapshot +# 2. Create the same name snapshot for the clone +# 3. Promote the clone filesystem +# 4. Verify the promote operation fail due to the name conflicts. +# + +verify_runnable "both" + +function cleanup +{ + snapexists $snap && \ + log_must $ZFS destroy -rR $snap + + typeset data + for data in $TESTDIR/$TESTFILE0 $TESTDIR/$TESTFILE1; do + [[ -e $data ]] && $RM -f $data + done +} + +log_assert "'zfs promote' can deal with name conflicts." +log_onexit cleanup + +snap=$TESTPOOL/$TESTFS@$TESTSNAP +clone=$TESTPOOL/$TESTCLONE +clonesnap=$TESTPOOL/$TESTCLONE@$TESTSNAP + +# setup for promte testing +log_must $MKFILE $FILESIZE $TESTDIR/$TESTFILE0 +log_must $ZFS snapshot $snap +log_must $MKFILE $FILESIZE $TESTDIR/$TESTFILE1 +log_must $RM -f $TESTDIR/$TESTFILE0 +log_must $ZFS clone $snap $clone +log_must $MKFILE $FILESIZE /$clone/$CLONEFILE +log_must $ZFS snapshot $clonesnap + +log_mustnot $ZFS promote $clone + +log_pass "'zfs promote' deals with name conflicts as expected." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_008_pos.ksh new file mode 100644 index 0000000000..e4e6aa6011 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_promote/zfs_promote_008_pos.ksh @@ -0,0 +1,79 @@ +#!/bin/ksh +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs promote' can successfully promote a volume clone. +# +# STRATEGY: +# 1. Create a volume clone +# 2. Promote the volume clone +# 3. Verify the dependency changed. +# + +verify_runnable "global" + +function cleanup +{ + if snapexists $csnap; then + log_must $ZFS promote $vol + fi + + log_must $ZFS destroy -rR $snap +} + +log_assert "'zfs promote' can promote a volume clone." +log_onexit cleanup + +vol=$TESTPOOL/$TESTVOL +snap=$vol@$TESTSNAP +clone=$TESTPOOL/volclone +csnap=$clone@$TESTSNAP + +if ! snapexists $snap ; then + log_must $ZFS snapshot $snap + log_must $ZFS clone $snap $clone +fi + +log_must $ZFS promote $clone + +# verify the 'promote' operation +! snapexists $csnap && \ + log_fail "Snapshot $csnap doesn't exist after zfs promote." +snapexists $snap && \ + log_fail "Snapshot $snap is still there after zfs promote." + +origin_prop=$(get_prop origin $vol) +[[ "$origin_prop" != "$csnap" ]] && \ + log_fail "The dependency of $vol is not correct." +origin_prop=$(get_prop origin $clone) +[[ "$origin_prop" != "-" ]] && \ + log_fail "The dependency of $clone is not correct." + +log_pass "'zfs promote' can promote volume clone as expected." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/Makefile new file mode 100644 index 0000000000..488cb7399d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/Makefile @@ -0,0 +1,41 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_property + +PROGS = cleanup \ + setup \ + zfs_written_property_001_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/cleanup.ksh new file mode 100644 index 0000000000..efa1ecce15 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/setup.ksh new file mode 100644 index 0000000000..2a2ee7f53b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/setup.ksh @@ -0,0 +1,36 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh new file mode 100644 index 0000000000..b5eae9c51c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_property/zfs_written_property_001_pos.ksh @@ -0,0 +1,230 @@ +# !/bin/ksh +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +# +# DESCRIPTION +# Verify that "zfs list" gives correct values for written and written@ +# proerties for the dataset when different operations are on done on it +# +# +# STRATEGY +# 1) Create recursive datasets +# 2) Take snapshots, write data and verify written/ written@ properties for +# following cases +# a) Delete data +# b) Write Data +# c) Clone +# d) Delete snapshot +# e) Recursive datasets + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/include/math.shlib + +function cleanup +{ + for ds in $datasets; do + datasetexists $ds && log_must $ZFS destroy -R $TESTPOOL/$TESTFS1 + done +} +function get_prop_mb +{ + typeset prop=$1 + typeset dataset=$2 + typeset -l value=$(get_prop $prop $dataset) + ((value = value / mb_block)) + $ECHO $value +} + +datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 \ + $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3" + +log_assert "verify zfs written and written@ property" +log_onexit cleanup + +typeset -l i=1 +typeset -l blocks=50 +typeset -l expected_written=0 +typeset -l expected_writtenat=0 +typeset -l written=0 +typeset -l total=0 +typeset -l snap1_size=0 +typeset -l snap2_size=0 +typeset -l snap3_size=0 +typeset -l metadata=0 +typeset -l mb_block=0 +((mb_block = 1024 * 1024)) +# approximate metadata on dataset when empty is 32KB +((metadata = 32 * 1024)) + +log_note "verify written property statistics for dataset" +log_must $ZFS create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3 +for i in 1 2 3; do + log_must $ZFS snapshot $TESTPOOL/$TESTFS1@snap$i + log_must $DD if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.$i bs=1M \ + count=$blocks + log_must $SYNC + written=$(get_prop written $TESTPOOL/$TESTFS1) + ((expected_written=blocks * mb_block)) + within_percent $written $expected_written 99.5 || \ + log_fail "Unexpected written value $written $expected_written" + ((total = total + blocks)) + ((blocks = blocks + 50)) +done + +log_note "verify written property statistics for snapshots" +blocks=0 +for i in 1 2 3; do + written=$(get_prop written $TESTPOOL/$TESTFS1@snap$i) + if [[ $blocks -eq 0 ]]; then + expected_written=$metadata + else + ((expected_written = blocks * mb_block)) + fi + within_percent $written $expected_written 99.5 || \ + log_fail "Unexpected written value $written $expected_written $i" + ((blocks = blocks + 50)) +done + +snap1_size=$total +((snap2_size = total-50)) +((snap3_size = total-100)) + +log_note "verify written@ for the same dataset" +blocks=50 +for i in 1 2 3; do + writtenat=$(get_prop written@snap$i $TESTPOOL/$TESTFS1) + ((expected_writtenat = total * mb_block)) + within_percent $writtenat $expected_writtenat 99.5 || \ + log_fail "Unexpected written@ value" + ((total = total - blocks)) + ((blocks = blocks + 50)) +done +log_note "delete data" +before_written=$(get_prop written $TESTPOOL/$TESTFS1) +log_must $RM /$TESTPOOL/$TESTFS1/testfile.3 +snap3_size=0 +log_must $SYNC +written=$(get_prop written $TESTPOOL/$TESTFS1) +writtenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1) +[[ $written -eq $writtenat3 ]] || \ + log_fail "Written and written@ dont match $written $writtenat3" +within_percent $written $before_written 0.1 && \ + log_fail "Unexpected written value after delete $written $before_written" +writtenat=$(get_prop written@snap1 $TESTPOOL/$TESTFS1) +((snap1_size = snap1_size - 150)) +((expected_writtenat = snap1_size * mb_block)) +within_percent $writtenat $expected_writtenat 99.5 || \ + log_fail "Unexpected written value after delete $writtenat $expected_writtenat" +writtenat=$(get_prop written@snap2 $TESTPOOL/$TESTFS1) +((snap2_size = snap2_size - 150)) +((expected_writtenat = snap2_size * mb_block)) +within_percent $writtenat $expected_writtenat 99.5 || \ + log_fail "Unexpected written value after delete" + +log_note "write data" +blocks=20 +log_must $DD if=/dev/urandom of=/$TESTPOOL/$TESTFS1/testfile.3 bs=1M \ + count=$blocks +log_must $SYNC +written=$(get_prop written $TESTPOOL/$TESTFS1) +writtenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1) +writtenat2=$(get_prop written@snap2 $TESTPOOL/$TESTFS1) +writtenat3=$(get_prop written@snap3 $TESTPOOL/$TESTFS1) +((snap3_size = snap3_size + blocks)) +((expected_writtenat = snap3_size * mb_block)) +[[ $written -eq $writtenat3 ]] || \ + log_fail "Unexpected_written value" +within_percent $writtenat3 $expected_writtenat 99.5 || \ + log_fail "Unexpected_written@ value for snap3" +((snap2_size = snap2_size + blocks)) +((expected_writtenat = snap2_size * mb_block)) +within_percent $writtenat2 $expected_writtenat 99.5 || \ + log_fail "Unexpected_written@ value for snap2" +((snap1_size = snap1_size + blocks)) +((expected_writtenat = snap1_size * mb_block)) +within_percent $writtenat1 $expected_writtenat 99.5 || \ + log_fail "Unexpected_written@ value for snap1" + +log_note "write data to a clone" +before_clone=$(get_prop written $TESTPOOL/$TESTFS1) +log_must $ZFS clone $TESTPOOL/$TESTFS1@snap1 $TESTPOOL/$TESTFS1/snap1.clone +log_must $DD if=/dev/urandom of=/$TESTPOOL/$TESTFS1/snap1.clone/testfile bs=1M \ + count=40 +after_clone=$(get_prop written $TESTPOOL/$TESTFS1) +[[ $before_clone -eq $after_clone ]] || \ + log_fail "unexpected written for clone $before_clone $after_clone" + +log_note "deleted snapshot" +typeset -l before_written1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1) +typeset -l before_written3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1) +typeset -l snap_before_written2=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap2) +typeset -l snap_before_written3=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3) +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap2 +log_mustnot snapexists $TESTPOOL/$TESTFS1@snap2 +log_must $SYNC +written1=$(get_prop_mb written@snap1 $TESTPOOL/$TESTFS1) +written3=$(get_prop_mb written@snap3 $TESTPOOL/$TESTFS1) +[[ $before_written1 -eq $written1 && $before_written3 -eq $written3 ]] || \ + log_fail "unexpected written values $before_written1 $written1" +typeset -l expected_written3 +((expected_written3 = snap_before_written2 + snap_before_written3)) +prev_written=$(get_prop_mb written $TESTPOOL/$TESTFS1@snap3) +within_percent $prev_written $expected_written3 99.5 || \ + log_fail "unexpected written value $prev_written $expected_written3" + +log_must $ZFS destroy $TESTPOOL/$TESTFS1@snap3 +log_mustnot snapexists $TESTPOOL/$TESTFS1@snap3 +written=$(get_prop written $TESTPOOL/$TESTFS1) +writtenat1=$(get_prop written@snap1 $TESTPOOL/$TESTFS1) +[[ $written -ne $writtenat1 ]] && \ + log_fail "Unexpected last snapshot written value" + +log_note "verify written@ property for recursive datasets" +blocks=10 +log_must $ZFS snapshot -r $TESTPOOL/$TESTFS1@now +for ds in $datasets; do + writtenat=$(get_prop written@now $ds) + [[ $writtenat -ne 0 ]] && \ + log_fail "Unexpected written@ value" + log_must $DD if=/dev/urandom of=/$ds/testfile bs=1M count=$blocks + log_must $SYNC + writtenat=$(get_prop written@now $ds) + ((expected_writtenat = blocks * mb_block)) + within_percent $writtenat $expected_writtenat 0.1 || \ + log_fail "Unexpected written value" + ((blocks = blocks + 10)) +done + +log_note "verify written@ output for recursive datasets" +blocks=20 +for ds in $datasets; do + log_must $ZFS snapshot $ds@current + log_must $DD if=/dev/urandom of=/$ds/testfile bs=1M \ + count=$blocks + log_must $SYNC +done +recursive_output=$($ZFS get -r written@current $TESTPOOL | \ + $GREP -v $TESTFS1@ | $GREP -v $TESTFS2@ | $GREP -v $TESTFS3@ | \ + $GREP -v "VALUE" | $GREP -v "-") +expected="20.0M" +for ds in $datasets; do + writtenat=$($ECHO "$recursive_output" | $GREP -v $ds/) + writtenat=$($ECHO "$writtenat" | $GREP $ds | $AWK '{print $3}') + [[ $writtenat == $expected ]] || \ + log_fail "recursive written property output mismatch" +done + +log_pass "zfs written and written@ property fields print correct values" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/Makefile new file mode 100644 index 0000000000..3e9f28238b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/Makefile @@ -0,0 +1,49 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_receive + +PROGS = cleanup \ + setup \ + zfs_receive_001_pos \ + zfs_receive_002_pos \ + zfs_receive_003_pos \ + zfs_receive_004_neg \ + zfs_receive_005_neg \ + zfs_receive_006_pos \ + zfs_receive_007_neg \ + zfs_receive_008_pos \ + zfs_receive_009_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/cleanup.ksh new file mode 100644 index 0000000000..97a4cae82d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/cleanup.ksh @@ -0,0 +1,33 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/setup.ksh new file mode 100644 index 0000000000..eb00235877 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} +if is_global_zone; then + default_volume_setup $DISK +else + default_setup $DISK +fi diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_001_pos.ksh new file mode 100644 index 0000000000..288372a6e0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_001_pos.ksh @@ -0,0 +1,176 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib + +# +# DESCRIPTION: +# Verifying 'zfs receive [<filesystem|snapshot>] -d <filesystem>' works. +# +# STRATEGY: +# 1. Fill in fs with some data +# 2. Create full and incremental send stream +# 3. Receive the send stream +# 4. Verify the restoring results. +# + +verify_runnable "both" + +function cleanup +{ + typeset -i i=0 + + datasetexists $rst_root && \ + log_must $ZFS destroy -Rf $rst_root + while (( i < 2 )); do + snapexists ${orig_snap[$i]} && \ + log_must $ZFS destroy -f ${orig_snap[$i]} + log_must $RM -f ${bkup[$i]} + + (( i = i + 1 )) + done + + log_must $RM -rf $TESTDIR1 +} + +function recreate_root +{ + datasetexists $rst_root && \ + log_must $ZFS destroy -Rf $rst_root + if [[ -d $TESTDIR1 ]] ; then + log_must $RM -rf $TESTDIR1 + fi + log_must $ZFS create $rst_root + log_must $ZFS set mountpoint=$TESTDIR1 $rst_root +} + +log_assert "Verifying 'zfs receive [<filesystem|snapshot>] -d <filesystem>' works." +log_onexit cleanup + +typeset datasets="$TESTPOOL/$TESTFS $TESTPOOL" +set -A bkup "/var/tmp/fullbkup" "/var/tmp/incbkup" +orig_sum="" +rst_sum="" +rst_root=$TESTPOOL/rst_ctr +rst_fs=${rst_root}/$TESTFS + +for orig_fs in $datasets ; do + # + # Preparations for testing + # + recreate_root + + set -A orig_snap "${orig_fs}@init_snap" "${orig_fs}@inc_snap" + typeset mntpnt=$(get_prop mountpoint ${orig_fs}) + set -A orig_data "${mntpnt}/$TESTFILE1" "${mntpnt}/$TESTFILE2" + + typeset relative_path="" + if [[ ${orig_fs} == *"/"* ]]; then + relative_path=${orig_fs#*/} + fi + + typeset leaf_fs=${rst_root}/${relative_path} + leaf_fs=${leaf_fs%/} + rst_snap=${leaf_fs}@snap + + set -A rst_snap "$rst_root/$TESTFS@init_snap" "$rst_root/$TESTFS@inc_snap" + set -A rst_snap2 "${leaf_fs}@init_snap" "${leaf_fs}@inc_snap" + set -A rst_data "$TESTDIR1/$TESTFS/$TESTFILE1" "$TESTDIR1/$TESTFS/$TESTFILE2" + set -A rst_data2 "$TESTDIR1/${relative_path}/$TESTFILE1" "$TESTDIR1/${relative_path}/$TESTFILE2" + + typeset -i i=0 + while (( i < ${#orig_snap[*]} )); do + $FILE_WRITE -o create -f ${orig_data[$i]} -b 512 \ + -c 8 >/dev/null 2>&1 + (( $? != 0 )) && \ + log_fail "Writing data into zfs filesystem fails." + log_must $ZFS snapshot ${orig_snap[$i]} + if (( i < 1 )); then + log_must eval "$ZFS send ${orig_snap[$i]} > ${bkup[$i]}" + else + log_must eval "$ZFS send -i ${orig_snap[(( i - 1 ))]} \ + ${orig_snap[$i]} > ${bkup[$i]}" + fi + + (( i = i + 1 )) + done + + log_note "Verifying 'zfs receive <filesystem>' works." + i=0 + while (( i < ${#bkup[*]} )); do + if (( i > 0 )); then + log_must $ZFS rollback ${rst_snap[0]} + fi + log_must eval "$ZFS receive $rst_fs < ${bkup[$i]}" + snapexists ${rst_snap[$i]} || \ + log_fail "Restoring filesystem fails. ${rst_snap[$i]} not exist" + compare_cksum ${orig_data[$i]} ${rst_data[$i]} + + (( i = i + 1 )) + done + + log_must $ZFS destroy -Rf $rst_fs + + log_note "Verifying 'zfs receive <snapshot>' works." + i=0 + while (( i < ${#bkup[*]} )); do + if (( i > 0 )); then + log_must $ZFS rollback ${rst_snap[0]} + fi + log_must eval "$ZFS receive ${rst_snap[$i]} <${bkup[$i]}" + snapexists ${rst_snap[$i]} || \ + log_fail "Restoring filesystem fails. ${rst_snap[$i]} not exist" + compare_cksum ${orig_data[$i]} ${rst_data[$i]} + + (( i = i + 1 )) + done + + log_must $ZFS destroy -Rf $rst_fs + + log_note "Verfiying 'zfs receive -d <filesystem>' works." + + i=0 + while (( i < ${#bkup[*]} )); do + if (( i > 0 )); then + log_must $ZFS rollback ${rst_snap2[0]} + fi + log_must eval "$ZFS receive -d -F $rst_root <${bkup[$i]}" + snapexists ${rst_snap2[$i]} || \ + log_fail "Restoring filesystem fails. ${rst_snap2[$i]} not exist" + compare_cksum ${orig_data[$i]} ${rst_data2[$i]} + + (( i = i + 1 )) + done + + cleanup +done + +log_pass "Verifying 'zfs receive [<filesystem|snapshot>] -d <filesystem>' succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_002_pos.ksh new file mode 100644 index 0000000000..27f9ae2e2e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_002_pos.ksh @@ -0,0 +1,104 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib + +# +# DESCRIPTION: +# Verifying 'zfs receive <volume>' works. +# +# STRATEGY: +# 1. Fill in volume with some data +# 2. Create full and incremental send stream +# 3. Restore the send stream +# 4. Verify the restoring results. +# + +verify_runnable "global" + +function cleanup +{ + typeset -i i=0 + typeset ds + + while (( i < ${#orig_snap[*]} )); do + snapexists ${rst_snap[$i]} && \ + log_must $ZFS destroy -f ${rst_snap[$i]} + snapexists ${orig_snap[$i]} && \ + log_must $ZFS destroy -f ${orig_snap[$i]} + [[ -e ${bkup[$i]} ]] && \ + log_must $RM -rf ${bkup[$i]} + + (( i = i + 1 )) + done + + for ds in $rst_vol $rst_root; do + datasetexists $ds && \ + log_must $ZFS destroy -Rf $ds + done +} + +log_assert "Verifying 'zfs receive <volume>' works." +log_onexit cleanup + +set -A orig_snap "$TESTPOOL/$TESTVOL@init_snap" "$TESTPOOL/$TESTVOL@inc_snap" +set -A bkup "/var/tmp/fullbkup" "/var/tmp/incbkup" +rst_root=$TESTPOOL/rst_ctr +rst_vol=$rst_root/$TESTVOL +set -A rst_snap "${rst_vol}@init_snap" "${rst_vol}@inc_snap" + +# +# Preparations for testing +# +log_must $ZFS create $rst_root +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 +log_must $ZFS set mountpoint=$TESTDIR1 $rst_root + +typeset -i i=0 +while (( i < ${#orig_snap[*]} )); do + log_must $ZFS snapshot ${orig_snap[$i]} + if (( i < 1 )); then + log_must eval "$ZFS send ${orig_snap[$i]} > ${bkup[$i]}" + else + log_must eval "$ZFS send -i ${orig_snap[(( i - 1 ))]} \ + ${orig_snap[$i]} > ${bkup[$i]}" + fi + + (( i = i + 1 )) +done + +i=0 +while (( i < ${#bkup[*]} )); do + log_must eval "$ZFS receive $rst_vol < ${bkup[$i]}" + ! datasetexists $rst_vol || ! snapexists ${rst_snap[$i]} && \ + log_fail "Restoring volume fails." + + (( i = i + 1 )) +done + +log_pass "Verifying 'zfs receive <volume>' succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_003_pos.ksh new file mode 100644 index 0000000000..e7d4bf4a16 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_003_pos.ksh @@ -0,0 +1,89 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs recv -F' to force rollback. +# +# STRATEGY: +# 1. Create pool and fs. +# 2. Create some files in fs and take a snapshot1. +# 3. Create another files in fs and take snapshot2. +# 4. Create incremental stream from snapshot1 to snapshot2. +# 5. fs rollback to snapshot1 and modify fs. +# 6. Verify 'zfs recv -F' can force rollback. +# + +verify_runnable "both" + +function cleanup +{ + for snap in $snap2 $snap1; do + datasetexists $snap && log_must $ZFS destroy -rf $snap + done + for file in $ibackup $mntpnt/file1 $mntpnt/file2; do + [[ -f $file ]] && log_must $RM -f $file + done +} + +log_assert "'zfs recv -F' to force rollback." +log_onexit cleanup + +ibackup=/var/tmp/ibackup.$$ +fs=$TESTPOOL/$TESTFS; snap1=$fs@snap1; snap2=$fs@snap2 + +mntpnt=$(get_prop mountpoint $fs) || log_fail "get_prop mountpoint $fs" +log_must $MKFILE 10m $mntpnt/file1 +log_must $ZFS snapshot $snap1 +log_must $MKFILE 10m $mntpnt/file2 +log_must $ZFS snapshot $snap2 + +log_must eval "$ZFS send -i $snap1 $snap2 > $ibackup" + +log_note "Verify 'zfs receive' succeed, if filesystem was not modified." +log_must $ZFS rollback -r $snap1 +log_must eval "$ZFS receive $fs < $ibackup" +if [[ ! -f $mntpnt/file1 || ! -f $mntpnt/file2 ]]; then + log_fail "'$ZFS receive' failed." +fi + +log_note "Verify 'zfs receive' failed if filesystem was modified." +log_must $ZFS rollback -r $snap1 +log_must $RM -rf $mntpnt/file1 +log_mustnot eval "$ZFS receive $fs < $ibackup" + +# Verify 'zfs receive -F' to force rollback whatever filesystem was modified. +log_must $ZFS rollback -r $snap1 +log_must $RM -rf $mntpnt/file1 +log_must eval "$ZFS receive -F $fs < $ibackup" +if [[ ! -f $mntpnt/file1 || ! -f $mntpnt/file2 ]]; then + log_fail "'$ZFS receive -F' failed." +fi + +log_pass "'zfs recv -F' to force rollback passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_004_neg.ksh new file mode 100644 index 0000000000..7f1c053ac5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_004_neg.ksh @@ -0,0 +1,115 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib + +# +# DESCRIPTION: +# Verify 'zfs receive' fails with malformed parameters. +# +# STRATEGY: +# 1. Denfine malformed parameters array +# 2. Feed the malformed parameters to 'zfs receive' +# 3. Verify the command should be failed +# + +verify_runnable "both" + +function cleanup +{ + typeset snap + typeset bkup + + for snap in $init_snap $inc_snap $init_topsnap $inc_topsnap ; do + snapexists $snap && \ + log_must $ZFS destroy -Rf $snap + done + + for bkup in $full_bkup $inc_bkup $full_topbkup $inc_topbkup; do + [[ -e $bkup ]] && \ + log_must $RM -f $bkup + done +} + +log_assert "Verify that invalid parameters to 'zfs receive' are caught." +log_onexit cleanup + +init_snap=$TESTPOOL/$TESTFS@initsnap +inc_snap=$TESTPOOL/$TESTFS@incsnap +full_bkup=/var/tmp/full_bkup.$$ +inc_bkup=/var/tmp/inc_bkup.$$ + +init_topsnap=$TESTPOOL@initsnap +inc_topsnap=$TESTPOOL@incsnap +full_topbkup=/var/tmp/full_topbkup.$$ +inc_topbkup=/var/tmp/inc_topbkup.$$ + +log_must $ZFS snapshot $init_topsnap +log_must eval "$ZFS send $init_topsnap > $full_topbkup" +log_must $TOUCH /$TESTPOOL/foo + +log_must $ZFS snapshot $inc_topsnap +log_must eval "$ZFS send -i $init_topsnap $inc_topsnap > $inc_topbkup" +log_must $TOUCH /$TESTPOOL/bar + +log_must $ZFS snapshot $init_snap +log_must eval "$ZFS send $init_snap > $full_bkup" +log_must $TOUCH /$TESTDIR/foo + +log_must $ZFS snapshot $inc_snap +log_must eval "$ZFS send -i $init_snap $inc_snap > $inc_bkup" +log_must $TOUCH /$TESTDIR/bar + +$SYNC + +set -A badargs \ + "" "nonexistent-snap" "blah@blah" "-d" "-d nonexistent-dataset" \ + "$TESTPOOL/$TESTFS" "$TESTPOOL1" "$TESTPOOL/fs@" "$TESTPOOL/fs@@mysnap" \ + "$TESTPOOL/fs@@" "$TESTPOOL/fs/@mysnap" "$TESTPOOL/fs@/mysnap" \ + "$TESTPOOL/nonexistent-fs/nonexistent-fs" "-d $TESTPOOL/nonexistent-fs" \ + "-d $TESTPOOL/$TESTFS/nonexistent-fs" + +if is_global_zone ; then + typeset -i n=${#badargs[@]} + badargs[$n]="-d $TESTPOOL" +fi + +typeset -i i=0 +while (( i < ${#badargs[*]} )) +do + for bkup in $full_bkup $inc_bkup $full_topbkup $inc_topbkup ; do + log_mustnot eval "$ZFS receive ${badargs[i]} < $bkup" + done + + (( i = i + 1 )) +done + +log_pass "Invalid parameters to 'zfs receive' are caught as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_005_neg.ksh new file mode 100644 index 0000000000..86bd9441ce --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_005_neg.ksh @@ -0,0 +1,95 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib + +# +# DESCRIPTION: +# Verify 'zfs receive' fails with unsupported scenarios. +# including: +# (1) Invalid send streams; +# (2) The received incremental send doesn't match the filesystem +# latest status. +# +# STRATEGY: +# 1. Preparation for unsupported scenarios +# 2. Execute 'zfs receive' +# 3. Verify the results are failed +# + +verify_runnable "both" + +function cleanup +{ + typeset snap + typeset bkup + + for snap in $init_snap $inc_snap; do + snapexists $snap && \ + log_must $ZFS destroy -f $snap + done + + datasetexists $rst_root && \ + log_must $ZFS destroy -Rf $rst_root + + for bkup in $full_bkup $inc_bkup; do + [[ -e $bkup ]] && \ + log_must $RM -f $bkup + done +} + +log_assert "Verify 'zfs receive' fails with unsupported scenarios." +log_onexit cleanup + +init_snap=$TESTPOOL/$TESTFS@initsnap +inc_snap=$TESTPOOL/$TESTFS@incsnap +rst_root=$TESTPOOL/rst_ctr +rst_init_snap=$rst_root/$TESTFS@init_snap +rst_inc_snap=$rst_root/$TESTFS@inc_snap +full_bkup=/var/tmp/full_bkup.$$ +inc_bkup=/var/tmp/inc_bkup.$$ + +log_must $ZFS create $rst_root +log_must $ZFS snapshot $init_snap +log_must eval "$ZFS send $init_snap > $full_bkup" + +log_note "'zfs receive' fails with invalid send streams." +log_mustnot eval "$ZFS receive $rst_init_snap < /dev/zero" +log_mustnot eval "$ZFS receive -d $rst_root </dev/zero" + +log_must eval "$ZFS receive $rst_init_snap < $full_bkup" + +log_note "Unmatched send stream with restoring filesystem" \ + " cannot be received." +log_must $ZFS snapshot $inc_snap +log_must eval "$ZFS send -i $init_snap $inc_snap > $inc_bkup" +#make changes on the restoring filesystem +log_must $TOUCH $ZFSROOT/$rst_root/$TESTFS/tmpfile +log_mustnot eval "$ZFS receive $rst_inc_snap < $inc_bkup" +log_mustnot eval "$ZFS receive -d $rst_root < $inc_bkup" + +log_pass "Unsupported scenarios to 'zfs receive' fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_006_pos.ksh new file mode 100644 index 0000000000..8f973b1068 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_006_pos.ksh @@ -0,0 +1,104 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs recv -d <fs>' should create ancestor filesystem if it does not +# exist and it should not fail if it exists +# +# STRATEGY: +# 1. Create pool and fs. +# 2. Create some files in fs and take snapshots. +# 3. Keep the stream and restore the stream to the pool +# 4. Verify receiving the stream succeeds, and the ancestor filesystem +# is created if it did not exist +# 5. Verify receiving the stream still succeeds when ancestor filesystem +# exists +# + +verify_runnable "both" + +function cleanup +{ + for snap in $snap2 $snap1; do + datasetexists $snap && log_must $ZFS destroy -rf $snap + done + for file in $fbackup1 $fbackup2 $mntpnt/file1 $mntpnt/file2; do + [[ -f $file ]] && log_must $RM -f $file + done + + if is_global_zone; then + datasetexists $TESTPOOL/$TESTFS/$TESTFS1 && \ + log_must $ZFS destroy -rf $TESTPOOL/$TESTFS/$TESTFS1 + else + datasetexists $TESTPOOL/${ZONE_CTR}0 && \ + log_must $ZFS destroy -rf $TESTPOOL/${ZONE_CTR}0 + fi + +} + +log_assert "'zfs recv -d <fs>' should succeed no matter ancestor filesystem \ + exists." +log_onexit cleanup + +ancestor_fs=$TESTPOOL/$TESTFS +fs=$TESTPOOL/$TESTFS/$TESTFS1 +snap1=$fs@snap1 +snap2=$fs@snap2 +fbackup1=/var/tmp/fbackup1.$$ +fbackup2=/var/tmp/fbackup2.$$ + +datasetexists $ancestor_fs || \ + log_must $ZFS create $ancestor_fs +log_must $ZFS create $fs + +mntpnt=$(get_prop mountpoint $fs) || log_fail "get_prop mountpoint $fs" +log_must $MKFILE 10m $mntpnt/file1 +log_must $ZFS snapshot $snap1 +log_must $MKFILE 10m $mntpnt/file2 +log_must $ZFS snapshot $snap2 + +log_must eval "$ZFS send $snap1 > $fbackup1" +log_must eval "$ZFS send $snap2 > $fbackup2" + +log_note "Verify 'zfs receive -d' succeed and create ancestor filesystem \ + if it did not exist. " +log_must $ZFS destroy -rf $ancestor_fs +log_must eval "$ZFS receive -d $TESTPOOL < $fbackup1" +is_global_zone || ancestor_fs=$TESTPOOL/${ZONE_CTR}0/$TESTFS +datasetexists $ancestor_fs || \ + log_fail "ancestor filesystem is not created" + +log_note "Verify 'zfs receive -d' still succeed if ancestor filesystem exists" +is_global_zone || fs=$TESTPOOL/${ZONE_CTR}0/$TESTFS/$TESTFS1 +log_must $ZFS destroy -rf $fs +log_must eval "$ZFS receive -d $TESTPOOL < $fbackup2" + +log_pass "'zfs recv -d <fs>' should succeed no matter ancestor filesystem \ + exists." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_007_neg.ksh new file mode 100644 index 0000000000..b2f6dc673d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_007_neg.ksh @@ -0,0 +1,80 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs recv -F' should fail if the incremental stream does not match +# +# STRATEGY: +# 1. Create pool and fs. +# 2. Create some files in fs and take snapshots. +# 3. Keep the incremental stream and restore the stream to the pool +# 4. Verify receiving the stream fails +# + +verify_runnable "both" + +function cleanup +{ + for snap in $snap2 $snap1; do + datasetexists $snap && log_must $ZFS destroy -rf $snap + done + for file in $ibackup $mntpnt/file1 $mntpnt/file2; do + [[ -f $file ]] && log_must $RM -f $file + done +} + +log_assert "'zfs recv -F' should fail if the incremental stream does not match" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +snap1=$fs@snap1 +snap2=$fs@snap2 +ibackup=/var/tmp/ibackup.$$ + +datasetexists $fs || log_must $ZFS create $fs + +mntpnt=$(get_prop mountpoint $fs) || log_fail "get_prop mountpoint $fs" +log_must $MKFILE 10m $mntpnt/file1 +log_must $ZFS snapshot $snap1 +log_must $MKFILE 10m $mntpnt/file2 +log_must $ZFS snapshot $snap2 + +log_must eval "$ZFS send -i $snap1 $snap2 > $ibackup" + +log_must $ZFS destroy $snap1 +log_must $ZFS destroy $snap2 +log_mustnot eval "$ZFS receive -F $fs < $ibackup" + +log_must $MKFILE 20m $mntpnt/file1 +log_must $RM -rf $mntpnt/file2 +log_must $ZFS snapshot $snap1 +log_mustnot eval "$ZFS receive -F $snap2 < $ibackup" + +log_pass "'zfs recv -F' should fail if the incremental stream does not match" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_008_pos.ksh new file mode 100644 index 0000000000..6d9081e9f9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_008_pos.ksh @@ -0,0 +1,144 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib + +# +# DESCRIPTION: +# Verifying 'zfs receive -vn [<filesystem|snapshot>] +# and zfs receive -vn -d <filesystem>' +# +# STRATEGY: +# 1. Fill in fs with some data +# 2. Create full and incremental send stream +# 3. run zfs receive with -v option +# 3. Dryrun zfs receive with -vn option +# 3. Dryrun zfs receive with -vn -d option +# 4. Verify receive output and result +# +function cleanup +{ + for dset in $rst_snap $rst_fs $orig_snap; do + if datasetexists $dset; then + log_must $ZFS destroy -fr $dset + fi + done + + for file in $fbackup $mnt_file $tmp_out; do + if [[ -f $file ]]; then + log_must $RM -f $file + fi + done + + if datasetexists $TESTPOOL/$TESTFS; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + fi +} + +verify_runnable "both" +log_assert "Verifying 'zfs receive -vn [<filesystem|snapshot>] " \ + "and zfs receive -vn -d <filesystem>'" + +log_onexit cleanup + +typeset datasets="$TESTPOOL/$TESTFS $TESTPOOL" +typeset rst_fs=$TESTPOOL/$TESTFS/$TESTFS +typeset fbackup=/var/tmp/fbackup.$$ +typeset tmp_out=/var/tmp/tmpout.$$ + +for orig_fs in $datasets ; do + typeset rst_snap=$rst_fs@snap + typeset orig_snap=$orig_fs@snap + typeset verb_msg="receiving full stream of ${orig_snap} into ${rst_snap}" + typeset dryrun_msg="would receive full stream of ${orig_snap} into ${rst_snap}" + + if ! datasetexists $orig_fs; then + log_must $ZFS create $orig_fs + fi + + typeset mntpnt + mntpnt=$(get_prop mountpoint $orig_fs) + if [[ $? -ne 0 ]] ; then + log_fail "get_prop mountpoint $orig_fs failed" + fi + + typeset mnt_file=$mntpnt/file1 + + log_must $MKFILE 100m $mnt_file + log_must $ZFS snapshot $orig_snap + log_must eval "$ZFS send $orig_snap > $fbackup" + + for opt in "-v" "-vn"; do + if datasetexists $rst_fs; then + log_must $ZFS destroy -fr $rst_fs + fi + log_note "Check ZFS receive $opt [<filesystem|snapshot>]" + log_must eval "$ZFS receive $opt $rst_fs < $fbackup > $tmp_out 2>&1" + if [[ $opt == "-v" ]]; then + log_must eval "$GREP \"$verb_msg\" $tmp_out >/dev/null 2>&1" + if ! datasetexists $rst_snap; then + log_fail "dataset was not received, even though the"\ + " -v flag was used." + fi + else + log_must eval "$GREP \"$dryrun_msg\" $tmp_out >/dev/null 2>&1" + if datasetexists $rst_snap; then + log_fail "dataset was received, even though the -nv"\ + " flag was used." + fi + fi + done + + log_note "Check ZFS receive -vn -d <filesystem>" + if ! datasetexists $rst_fs; then + log_must $ZFS create $rst_fs + fi + log_must eval "$ZFS receive -vn -d -F $rst_fs <$fbackup >$tmp_out 2>&1" + typeset relative_path="" + if [[ ${orig_fs} == *"/"* ]]; then + relative_path=${orig_fs#*/} + fi + + typeset leaf_fs=${rst_fs}/${relative_path} + leaf_fs=${leaf_fs%/} + rst_snap=${leaf_fs}@snap + dryrun_msg="would receive full stream of ${orig_snap} into ${rst_snap}" + + log_must eval "$GREP \"$dryrun_msg\" $tmp_out > /dev/null 2>&1" + + if datasetexists $rst_snap; then + log_fail "dataset $rst_snap should not existed." + fi + log_must $ZFS destroy -Rf $rst_fs + + cleanup +done + +log_pass "zfs receive -vn [<filesystem|snapshot>] and " \ + "zfs receive -vn -d <filesystem>' succeed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_009_neg.ksh new file mode 100644 index 0000000000..8d4b89b484 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_receive/zfs_receive_009_neg.ksh @@ -0,0 +1,114 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib + +# +# DESCRIPTION: +# Verify 'zfs receive' fails with bad options, missing argument or too many +# arguments. +# +# STRATEGY: +# 1. Set a array of illegal arguments +# 2. Execute 'zfs receive' with illegal arguments +# 3. Verify the command should be failed +# + +verify_runnable "both" + +function cleanup +{ + typeset ds + + if snapexists $snap; then + log_must $ZFS destroy $snap + fi + for ds in $ctr1 $ctr2 $fs1; do + if datasetexists $ds; then + log_must $ZFS destroy -rf $ds + fi + done + if [[ -d $TESTDIR2 ]]; then + $RM -rf $TESTDIR2 + fi +} + +log_assert "Verify 'zfs receive' fails with bad option, missing or too many arguments" +log_onexit cleanup + +set -A badopts "v" "n" "F" "d" "-V" "-N" "-f" "-D" "-VNfD" "-vNFd" "-vnFD" "-dVnF" \ + "-vvvNfd" "-blah" "-12345" "-?" "-*" "-%" +set -A validopts "" "-v" "-n" "-F" "-vn" "-nF" "-vnF" "-vd" "-nd" "-Fd" "-vnFd" + +ctr1=$TESTPOOL/$TESTCTR1 +ctr2=$TESTPOOL/$TESTCTR2 +fs1=$TESTPOOL/$TESTFS1 +fs2=$TESTPOOL/$TESTFS2 +fs3=$TESTPOOL/$TESTFS3 +snap=$TESTPOOL/$TESTFS@$TESTSNAP +bkup=$TESTDIR2/bkup.$$ + +# Preparations for negative testing +for ctr in $ctr1 $ctr2; do + log_must $ZFS create $ctr +done +if [[ -d $TESTDIR2 ]]; then + $RM -rf $TESTDIR2 +fi +log_must $ZFS create -o mountpoint=$TESTDIR2 $fs1 +log_must $ZFS snapshot $snap +log_must eval "$ZFS send $snap > $bkup" + +#Testing zfs receive fails with input from terminal +log_mustnot eval "$ZFS recv $fs3 </dev/console" + +# Testing with missing argument and too many arguments +typeset -i i=0 +while (( i < ${#validopts[*]} )); do + log_mustnot eval "$ZFS recv < $bkup" + + $ECHO ${validopts[i]} | $GREP "d" >/dev/null 2>&1 + if (( $? != 0 )); then + log_mustnot eval "$ZFS recv ${validopts[i]} $fs2 $fs3 < $bkup" + else + log_mustnot eval "$ZFS recv ${validopts[i]} $ctr1 $ctr2 < $bkup" + fi + + (( i += 1 )) +done + +# Testing with bad options +i=0 +while (( i < ${#badopts[*]} )) +do + log_mustnot eval "$ZFS recv ${badopts[i]} $ctr1 < $bkup" + log_mustnot eval "$ZFS recv ${badopts[i]} $fs2 < $bkup" + + (( i = i + 1 )) +done + +log_pass "'zfs receive' as expected with bad options, missing or too many arguments." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/Makefile new file mode 100644 index 0000000000..ec2540ebbd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/Makefile @@ -0,0 +1,56 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_rename + +PROGS = cleanup \ + setup \ + zfs_rename_001_pos \ + zfs_rename_002_pos \ + zfs_rename_003_pos \ + zfs_rename_004_neg \ + zfs_rename_005_neg \ + zfs_rename_006_pos \ + zfs_rename_007_pos \ + zfs_rename_008_pos \ + zfs_rename_009_neg \ + zfs_rename_010_neg \ + zfs_rename_011_pos \ + zfs_rename_012_neg \ + zfs_rename_013_pos + +FILES = zfs_rename.cfg \ + zfs_rename.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/cleanup.ksh new file mode 100644 index 0000000000..544d79a664 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup_noexit + +if [[ -d $TESTDIR2 ]]; then + $RM -rf $TESTDIR2 + if (( $? != 0 )); then + log_unresolved Could not remove $TESTDIR2 + fi +fi + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/setup.ksh new file mode 100644 index 0000000000..3e8e010940 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/setup.ksh @@ -0,0 +1,49 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib + +DISK=${DISKS%% *} + +default_setup_noexit "$DISK" "true" "true" + +if [[ -d $TESTDIR2 ]]; then + $RM -rf $TESTDIR2 + if (( $? != 0 )); then + log_unresolved Could not remove $TESTDIR2 + fi +fi +log_must $ZFS create $TESTPOOL/$DATAFS +log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL/$DATAFS +log_must eval "$DD if=$IF of=$OF bs=$BS count=$CNT >/dev/null 2>&1" + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.cfg new file mode 100644 index 0000000000..26ff69b1bb --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.cfg @@ -0,0 +1,38 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export DATAFS=datafs.rename +export DATA=$TESTDIR2/data.rename +export IF=/dev/urandom +export OF=$DATA +export BS=512 +export CNT=2048 +export VOL_R_PATH=/dev/zvol/rdsk/$TESTPOOL/$TESTVOL +export VOLDATA=$TESTDIR2/voldata.rename diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib new file mode 100644 index 0000000000..e363607eb8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib @@ -0,0 +1,123 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_rename/zfs_rename.cfg + +function additional_setup +{ + # Create testfile + log_must $CP $DATA $TESTDIR/$TESTFILE0 + log_must $CP $DATA $TESTDIR1/$TESTFILE0 + + # Create snapshot + if ! snapexists $TESTPOOL/$TESTFS@snapshot; then + log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot + log_must $ZFS clone $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTFS-clone + fi + + # Create file system + datasetexists $TESTPOOL/$TESTFS1 || \ + log_must $ZFS create $TESTPOOL/$TESTFS1 + + # Create testfile + log_must $CP $DATA $(get_prop mountpoint $TESTPOOL/$TESTFS1)/$TESTFILE0 + + # Create container + datasetexists $TESTPOOL/$TESTCTR1 || \ + log_must $ZFS create $TESTPOOL/$TESTCTR1 + log_must $CP $DATA $(get_prop mountpoint $TESTPOOL/$TESTCTR1)/$TESTFILE0 + + # Create data in zvol + if is_global_zone; then + log_must eval "$DD if=$DATA of=$VOL_R_PATH bs=$BS count=$CNT \ + >/dev/null 2>&1" + else + log_must $CP $DATA $(get_prop mountpoint $TESTPOOL/$TESTVOL)/$TESTFILE0 + fi + +} + +function rename_dataset # src dest +{ + typeset src=$1 + typeset dest=$2 + + log_must $ZFS rename $src $dest + + # + # Verify src name no longer in use + # + log_mustnot datasetexists $src + log_must datasetexists $dest +} + +function cleanup +{ + typeset -i i=0 + while ((i < ${#dataset[*]} )); do + if ! datasetexists ${dataset[i]}-new ; then + ((i = i + 1)) + continue + fi + + if [[ ${dataset[i]}-new != *@* ]] ; then + $ZFS rename ${dataset[i]}-new ${dataset[i]} + if [[ $? -ne 0 ]]; then + typeset newfs=${dataset[i]}-new + typeset oldfs=${dataset[i]} + typeset mntp=$(get_prop mountpoint $newfs) + log_must $ZFS destroy -f $newfs + log_must $ZFS create -p $oldfs + log_must $ZFS set mountpoint=$mntp $oldfs + fi + else + log_must $ZFS destroy -fR ${dataset[i]}-new + fi + + ((i = i + 1)) + done + + if snapexists $TESTPOOL/$TESTFS@snapshot; then + log_must $ZFS destroy -fR $TESTPOOL/$TESTFS@snapshot + fi + +} + +function cmp_data #<$1 src data, $2 tgt data> +{ + typeset src=$1 + typeset tgt=$2 + + $CMP $src $tgt >/dev/null 2>&1 + + return $? +} + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_001_pos.ksh new file mode 100644 index 0000000000..dc178c4200 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_001_pos.ksh @@ -0,0 +1,104 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib + +# +# DESCRIPTION: +# 'zfs rename' should successfully rename valid datasets. +# As a sub-assertion we check to ensure the datasets that can +# be mounted are mounted. +# +# STRATEGY: +# 1. Given a file system, snapshot and volume. +# 2. Rename each dataset object to a new name. +# 3. Verify that only the new name is displayed by zfs list. +# 4. Verify mountable datasets are mounted. +# +############################################################################### + +verify_runnable "both" + +set -A dataset "$TESTPOOL/$TESTFS@snapshot" "$TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$TESTCTR/$TESTFS1" "$TESTPOOL/$TESTCTR1" \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTFS-clone" +set -A mountable "$TESTPOOL/$TESTFS1-new" "$TESTPOOL/$TESTFS@snapshot-new" \ + "$TESTPOOL/$TESTCTR/$TESTFS1-new" "$TESTPOOL/$TESTFS-clone-new" + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit cleanup + +log_assert "'zfs rename' should successfully rename valid datasets" + +additional_setup + +typeset -i i=0 +while (( i < ${#dataset[*]} )); do + rename_dataset ${dataset[i]} ${dataset[i]}-new + + ((i = i + 1)) +done + +log_note "Verify mountable datasets are mounted in their new namespace." +typeset mtpt +i=0 +while (( i < ${#mountable[*]} )); do + # Snapshot have no mountpoint + if [[ ${mountable[i]} != *@* ]]; then + log_must mounted ${mountable[i]} + mtpt=$(get_prop mountpoint ${mountable[i]}) + else + mtpt=$(snapshot_mountpoint ${mountable[i]}) + fi + + if ! cmp_data $DATA $mtpt/$TESTFILE0 ; then + log_fail "$mtpt/$TESTFILE0 gets corrupted after rename operation." + fi + + ((i = i + 1)) +done + +#verify the data integrity in zvol +if is_global_zone; then + log_must eval "$DD if=${VOL_R_PATH}-new of=$VOLDATA bs=$BS count=$CNT >/dev/null 2>&1" + if ! cmp_data $VOLDATA $DATA ; then + log_fail "$VOLDATA gets corrupted after rename operation." + fi +fi + +# rename back fs +typeset -i i=0 +while ((i < ${#dataset[*]} )); do + if datasetexists ${dataset[i]}-new ; then + log_must $ZFS rename ${dataset[i]}-new ${dataset[i]} + fi + ((i = i + 1)) +done + +log_pass "'zfs rename' successfully renamed each dataset type." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_002_pos.ksh new file mode 100644 index 0000000000..6646df5aa6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_002_pos.ksh @@ -0,0 +1,87 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib + +# +# DESCRIPTION: +# 'zfs rename' should successfully be capable of renaming +# valid datasets back and forth multiple times. +# +# STRATEGY: +# 1. Given a file system, snapshot and volume. +# 2. Rename each dataset object to a new name. +# 3. Rename each dataset back to its original name. +# 4. Repeat steps 2 and 3 multiple times. +# 5. Verify that the correct name is displayed by zfs list. +# +############################################################################### + +verify_runnable "both" + +set -A dataset "$TESTPOOL/$TESTFS@snapshot" "$TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$TESTCTR/$TESTFS1" "$TESTPOOL/$TESTCTR1" \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTFS-clone" + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit cleanup + +log_assert "'zfs rename' should successfully rename valid datasets" + +additional_setup + +typeset -i i=0 +typeset -i iters=10 + +while ((i < ${#dataset[*]} )); do + j=0 + while ((j < iters )); do + rename_dataset ${dataset[i]} ${dataset[i]}-new + rename_dataset ${dataset[i]}-new ${dataset[i]} + + ((j = j + 1)) + done + + if [[ ${dataset[i]} == *@* ]]; then + data=$(snapshot_mountpoint ${dataset[i]})/$TESTFILE0 + elif [[ ${dataset[i]} == "$TESTPOOL/$TESTVOL" ]] && is_global_zone; then + log_must eval "$DD if=$VOL_R_PATH of=$VOLDATA bs=$BS count=$CNT >/dev/null 2>&1" + data=$VOLDATA + else + data=$(get_prop mountpoint ${dataset[i]})/$TESTFILE0 + fi + + if ! cmp_data $DATA $data; then + log_fail "$data gets corrupted after $iters times rename operations." + fi + + ((i = i + 1)) +done + +log_pass "'zfs rename' renamed each dataset type multiple times as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_003_pos.ksh new file mode 100644 index 0000000000..9660641048 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_003_pos.ksh @@ -0,0 +1,64 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs rename' can address the abbreviated snapshot name. +# +# STRATEGY: +# 1. Create pool, fs and snap. +# 2. Verify 'zfs rename' support the abbreviated snapshot name. +# + +verify_runnable "both" + +function cleanup +{ + datasetexists $snap && log_must $ZFS destroy $snap +} + +log_assert "'zfs rename' can address the abbreviated snapshot name." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS; snap=$fs@snap +set -A newname "$fs@new-snap" "@new-snap" "new-snap" + +log_must $ZFS snapshot $snap +log_must datasetexists $snap + +typeset -i i=0 +while ((i < ${#newname[*]} )); do + log_must $ZFS rename $snap ${newname[$i]} + log_must datasetexists ${snap%%@*}@${newname[$i]##*@} + log_must $ZFS rename ${snap%%@*}@${newname[$i]##*@} $snap + + ((i += 1)) +done + +log_pass "'zfs rename' address the abbreviated snapshot name passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_004_neg.ksh new file mode 100644 index 0000000000..19f8a80adc --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_004_neg.ksh @@ -0,0 +1,107 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib + +# +# DESCRIPTION: +# 'zfs rename' should fail when this dataset was changed to an existed +# dataset name or datasets are of different types. +# For example, a filesystem cannot be renamed as a volume. +# +# STRATEGY: +# 1. Given a file system, snapshot and volume. +# 2. Rename each dataset object to a different type. +# 3. Verify that only the original name is displayed by zfs list. +# + +verify_runnable "both" + +# +# This array is a list of pairs: +# item i: original type +# item i + 1: new type +# +set -A bad_dataset $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTCTR1 \ + $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTCTR/$TESTFS1 \ + $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS1 \ + $TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTCTR1 $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTCTR1 $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTCTR1 $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTCTR1 $TESTPOOL/$TESTCTR/$TESTFS1 \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTCTR1 \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR1 \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR/$TESTFS1 \ + $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTCTR1 \ + $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTFS1 \ + $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTCTR/$TESTFS1 \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%c \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%d \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%x \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%p \ + $TESTPOOL/$TESTFS1 $TESTPOOL/${TESTFS1}%s \ + $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTFS@snapshot/fs + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit cleanup + +log_assert "'zfs rename' should fail when datasets are of a different type." + +additional_setup + +typeset -i i=0 +while ((i < ${#bad_dataset[*]} )); do + log_mustnot $ZFS rename ${bad_dataset[i]} ${bad_dataset[((i + 1))]} + log_must datasetexists ${bad_dataset[i]} + + log_mustnot $ZFS rename -p ${bad_dataset[i]} ${bad_dataset[((i + 1))]} + log_must datasetexists ${bad_dataset[i]} + + ((i = i + 2)) +done + +#verify 'rename -p' can not work with snapshots + +log_mustnot $ZFS rename -p $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTFS@snapshot2 +log_must datasetexists $TESTPOOL/$TESTFS@snapshot +log_mustnot $ZFS rename -p $TESTPOOL/$TESTFS@snapshot \ + $TESTPOOL/$TESTFS/$TESTFS@snapshot2 +log_must datasetexists $TESTPOOL/$TESTFS@snapshot + +log_pass "'zfs rename' fails as expected when given different dataset types." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_005_neg.ksh new file mode 100644 index 0000000000..6010af18ae --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_005_neg.ksh @@ -0,0 +1,87 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib + +# +# DESCRIPTION: +# 'zfs rename' should fail when the dataset are not within the same pool +# +# STRATEGY: +# 1. Given a file system, snapshot and volume. +# 2. Rename each dataset object to a different pool. +# 3. Verify the operation fails, and only the original name +# is displayed by zfs list. +# + +verify_runnable "global" + +function my_cleanup +{ + poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + [[ -e $TESTDIR/$TESTFILE1 ]] && \ + log_must $RM -f $TESTDIR/$TESTFILE1 + cleanup +} + +set -A src_dataset \ + "$TESTPOOL/$TESTFS1" "$TESTPOOL/$TESTCTR1" \ + "$TESTPOOL/$TESTCTR/$TESTFS1" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTFS@snapshot" "$TESTPOOL/$TESTFS-clone" + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit my_cleanup + +log_assert "'zfs rename' should fail while datasets are within different pool." + +additional_setup + +typeset FILESIZE=64m +log_must $MKFILE $FILESIZE $TESTDIR/$TESTFILE1 +create_pool $TESTPOOL1 $TESTDIR/$TESTFILE1 + +for src in ${src_dataset[@]} ; do + dest=${src#$TESTPOOL/} + if [[ $dest == *"@"* ]]; then + dest=${dest#*@} + dest=${TESTPOOL1}@$dest + else + dest=${TESTPOOL1}/$dest + fi + log_mustnot $ZFS rename $src $dest + log_mustnot $ZFS rename -p $src $dest + + # + # Verify original dataset name still in use + # + log_must datasetexists $src +done + +log_pass "'zfs rename' fail while datasets are within different pool." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_006_pos.ksh new file mode 100644 index 0000000000..5f6cdd54d8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_006_pos.ksh @@ -0,0 +1,75 @@ +#!/bin/ksh +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib + +# +# DESCRIPTION: +# 'zfs rename' can successfully rename a volume snapshot. +# +# STRATEGY: +# 1. Create a snapshot of volume. +# 2. Rename volume snapshot to a new one. +# 3. Rename volume to a new one. +# 5. Verify that the rename operations are successful and zfs list can +# list them. +# +############################################################################### + +verify_runnable "global" + +# +# cleanup defined in zfs_rename.kshlib +# +log_onexit cleanup + +log_assert "'zfs rename' can successfully rename a volume snapshot." + +vol=$TESTPOOL/$TESTVOL +snap=$TESTSNAP + +log_must eval "$DD if=$DATA of=$VOL_R_PATH bs=$BS count=$CNT >/dev/null 2>&1" +if ! snapexists $vol@$snap; then + log_must $ZFS snapshot $vol@$snap +fi + +rename_dataset $vol@$snap $vol@${snap}-new +rename_dataset $vol ${vol}-new +rename_dataset ${vol}-new@${snap}-new ${vol}-new@$snap +rename_dataset ${vol}-new $vol + +#verify data integrity +for input in $VOL_R_PATH ${VOL_R_PATH}@$snap; do + log_must eval "$DD if=$input of=$VOLDATA bs=$BS count=$CNT >/dev/null 2>&1" + if ! cmp_data $VOLDATA $DATA ; then + log_fail "$input gets corrupted after rename operation." + fi +done + +log_must $ZFS destroy $vol@$snap + +log_pass "'zfs rename' can rename volume snapshot as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_007_pos.ksh new file mode 100644 index 0000000000..cc685525ed --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_007_pos.ksh @@ -0,0 +1,151 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib + +# +# DESCRIPTION: +# Rename dataset, verify that the data haven't changed. +# +# STRATEGY: +# 1. Create random data and copy to dataset. +# 2. Perform renaming commands. +# 3. Verify that the data haven't changed. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTFS ; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS + fi + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + $RM -f $SRC_FILE $DST_FILE +} + +function target_obj +{ + typeset dtst=$1 + + typeset obj + typeset type=$(get_prop type $dtst) + if [[ $type == "filesystem" ]]; then + obj=$(get_prop mountpoint $dtst)/${SRC_FILE##*/} + elif [[ $type == "volume" ]]; then + obj=/dev/zvol/dsk/$dtst + fi + + echo $obj +} + +log_assert "Rename dataset, verify that the data haven't changed." +log_onexit cleanup + +# Generate random data +# +BS=512 ; CNT=2048 +SRC_FILE=/tmp/srcfile.$$ +DST_FILE=/tmp/dstfile.$$ +log_must $DD if=/dev/random of=$SRC_FILE bs=$BS count=$CNT + +fs=$TESTPOOL/$TESTFS/fs.$$ +fsclone=$TESTPOOL/$TESTFS/fsclone.$$ +log_must $ZFS create $fs + +obj=$(target_obj $fs) +log_must $CP $SRC_FILE $obj + +snap=${fs}@snap.$$ +log_must $ZFS snapshot $snap +log_must $ZFS clone $snap $fsclone + +# Rename dataset & clone +# +log_must $ZFS rename $fs ${fs}-new +log_must $ZFS rename $fsclone ${fsclone}-new + +# Compare source file and target file +# +obj=$(target_obj ${fs}-new) +log_must $DIFF $SRC_FILE $obj +obj=$(target_obj ${fsclone}-new) +log_must $DIFF $SRC_FILE $obj + +# Rename snapshot and re-clone dataset +# +log_must $ZFS rename ${fs}-new $fs +log_must $ZFS rename $snap ${snap}-new +log_must $ZFS clone ${snap}-new $fsclone + +# Compare source file and target file +# +obj=$(target_obj $fsclone) +log_must $DIFF $SRC_FILE $obj + +if is_global_zone; then + vol=$TESTPOOL/$TESTFS/vol.$$ ; volclone=$TESTPOOL/$TESTFS/volclone.$$ + log_must $ZFS create -V 100M $vol + + obj=$(target_obj $vol) + log_must $DD if=$SRC_FILE of=$obj bs=$BS count=$CNT + + snap=${vol}@snap.$$ + log_must $ZFS snapshot $snap + log_must $ZFS clone $snap $volclone + + # Rename dataset & clone + log_must $ZFS rename $vol ${vol}-new + log_must $ZFS rename $volclone ${volclone}-new + + # Compare source file and target file + obj=$(target_obj ${vol}-new) + log_must $DD if=$obj of=$DST_FILE bs=$BS count=$CNT + log_must $DIFF $SRC_FILE $DST_FILE + obj=$(target_obj ${volclone}-new) + log_must $DD if=$obj of=$DST_FILE bs=$BS count=$CNT + log_must $DIFF $SRC_FILE $DST_FILE + + # Rename snapshot and re-clone dataset + log_must $ZFS rename ${vol}-new $vol + log_must $ZFS rename $snap ${snap}-new + log_must $ZFS clone ${snap}-new $volclone + + # Compare source file and target file + obj=$(target_obj $volclone) + log_must $DD if=$obj of=$DST_FILE bs=$BS count=$CNT + log_must $DIFF $SRC_FILE $DST_FILE +fi + +log_pass "Rename dataset, the data haven't changed passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_008_pos.ksh new file mode 100644 index 0000000000..2552acce3c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_008_pos.ksh @@ -0,0 +1,88 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# zfs rename -r can rename snapshot recursively. +# +# STRATEGY: +# 1. Create snapshot recursively. +# 2. Rename snapshot recursively. +# 3. Verify rename -r snapshot correctly. +# + +verify_runnable "both" + +function cleanup +{ + typeset -i i=0 + while ((i < ${#datasets[@]})); do + if datasetexists ${datasets[$i]}@snap ; then + log_must $ZFS destroy ${datasets[$i]}@snap + fi + if datasetexists ${datasets[$i]}@snap-new ; then + log_must $ZFS destroy ${datasets[$i]}@snap-new + fi + + ((i += 1)) + done +} + +log_assert "zfs rename -r can rename snapshot recursively." +log_onexit cleanup + +set -A datasets $TESTPOOL $TESTPOOL/$TESTCTR \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS +if is_global_zone; then + datasets[${#datasets[@]}]=$TESTPOOL/$TESTVOL +fi + +log_must $ZFS snapshot -r ${TESTPOOL}@snap +typeset -i i=0 +while ((i < ${#datasets[@]})); do + log_must datasetexists ${datasets[$i]}@snap + + ((i += 1)) +done + +log_must $ZFS rename -r ${TESTPOOL}@snap ${TESTPOOL}@snap-new +i=0 +while ((i < ${#datasets[@]})); do + log_must datasetexists ${datasets[$i]}@snap-new + + ((i += 1)) +done + +log_must $ZFS destroy -rf ${TESTPOOL}@snap-new + +log_pass "Verify zfs rename -r passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_009_neg.ksh new file mode 100644 index 0000000000..16d306dd38 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_009_neg.ksh @@ -0,0 +1,101 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# A snapshot already exists with the new name, then none of the +# snapshots is renamed. +# +# STRATEGY: +# 1. Create snapshot for a set of datasets. +# 2. Create a new snapshot for one of datasets. +# 3. Using rename -r command with exists snapshot name. +# 4. Verify none of the snapshots is renamed. +# + +verify_runnable "both" + +function cleanup +{ + typeset snaps=$($ZFS list -H -t snapshot -o name) + typeset exclude + typeset snap + typeset pool_name + + if [[ -n $KEEP ]]; then + exclude=`eval $ECHO \"'(${KEEP})'\"` + fi + + for snap in $snaps; do + pool_name=$($ECHO "$snap" | $AWK -F/ '{print $1}') + if [[ -n $exclude ]]; then + $ECHO "$pool_name" | $EGREP -v "$exclude" > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + log_must $ZFS destroy $snap + fi + else + log_must $ZFS destroy $snap + fi + done +} + +log_assert "zfs rename -r failed, when snapshot name is already existing." +log_onexit cleanup + +set -A datasets $TESTPOOL $TESTPOOL/$TESTCTR \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS +if is_global_zone; then + datasets[${#datasets[@]}]=$TESTPOOL/$TESTVOL +fi + +log_must $ZFS snapshot -r ${TESTPOOL}@snap +typeset -i i=0 +while ((i < ${#datasets[@]})); do + # Create one more snapshot + log_must $ZFS snapshot ${datasets[$i]}@snap2 + log_mustnot $ZFS rename -r ${TESTPOOL}@snap ${TESTPOOL}@snap2 + log_must $ZFS destroy ${datasets[$i]}@snap2 + + # Check datasets, make sure none of them was renamed. + typeset -i j=0 + while ((j < ${#datasets[@]})); do + if datasetexists ${datasets[$j]}@snap2 ; then + log_fail "${datasets[$j]}@snap2 should not exist." + fi + ((j += 1)) + done + + ((i += 1)) +done + +log_pass "zfs rename -r failed, when snapshot name is already existing passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_010_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_010_neg.ksh new file mode 100644 index 0000000000..2b96662ebc --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_010_neg.ksh @@ -0,0 +1,73 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# The recursive flag -r can only be used for snapshots and not for +# volumes/filesystems. +# +# STRATEGY: +# 1. Loop pool, fs, container and volume. +# 2. Verify none of them can be rename by rename -r. +# + +verify_runnable "both" + +log_assert "The recursive flag -r can only be used for snapshots." + +set -A datasets $TESTPOOL $TESTPOOL/$TESTCTR \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS +if is_global_zone; then + datasets[${#datasets[@]}]=$TESTPOOL/$TESTVOL +fi + +for opts in "-r" "-r -p"; do + typeset -i i=0 + while ((i < ${#datasets[@]})); do + log_mustnot $ZFS rename $opts ${datasets[$i]} \ + ${datasets[$i]}-new + + # Check datasets, make sure none of them was renamed. + typeset -i j=0 + while ((j < ${#datasets[@]})); do + if datasetexists ${datasets[$j]}-new ; then + log_fail "${datasets[$j]}-new should not exists." + fi + ((j += 1)) + done + + ((i += 1)) + done +done + +log_pass "The recursive flag -r can only be used for snapshots passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_011_pos.ksh new file mode 100644 index 0000000000..e453e83865 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_011_pos.ksh @@ -0,0 +1,73 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rename/zfs_rename.kshlib + +# +# DESCRIPTION +# 'zfs rename -p' should work as expected +# +# STRATEGY: +# 1. Make sure the upper level of $newdataset does not exist +# 2. Make sure without -p option, 'zfs rename' will fail +# 3. With -p option, rename works +# + +verify_runnable "both" + +function additional_cleanup +{ + if datasetexists $TESTPOOL/notexist ; then + log_must $ZFS destroy -Rf $TESTPOOL/notexist + fi + + if datasetexists $TESTPOOL/$TESTFS ; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS + fi + log_must $ZFS create $TESTPOOL/$TESTFS + + if is_global_zone ; then + if datasetexists $TESTPOOL/$TESTVOL ; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTVOL + fi + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + fi +} + +log_onexit additional_cleanup + +log_assert "'zfs rename -p' should work as expected" + +log_must verify_opt_p_ops "rename" "fs" "$TESTPOOL/$TESTFS" \ + "$TESTPOOL/notexist/new/$TESTFS1" + +if is_global_zone; then + log_must verify_opt_p_ops "rename" "vol" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/notexist/new/$TESTVOL1" +fi + +log_pass "'zfs rename -p' should work as expected" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_012_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_012_neg.ksh new file mode 100644 index 0000000000..495f663ef7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_012_neg.ksh @@ -0,0 +1,67 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs rename' should be failed with bad option, null target dataset, +# too many datasets and long target dataset name. +# +# STRATEGY: +# 1. Create a set of ZFS datasets; +# 2. Try 'zfs rename' with various illegal scenarios; +# 3. Verify 'zfs rename' command should be failed. +# + +verify_runnable "both" + +log_assert "'zfs rename' should fail with bad option, null target dataset and" \ + "too long target dataset name." + +badopts=( "r" "R" "-R" "-rR" "-Rr" "-P" "-pP" "-Pp" "-r*" "-p*" "-?" "-*" "-" + "-o") +datasets=("$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS@$TESTSNAP" + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCTR/$TESTFS1" "$TESTPOOL/$TESTVOL") + +longname="$(gen_dataset_name 260 abcdefg)" + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +for ds in ${datasets[@]}; do + for opt in ${badopts[@]}; do + log_mustnot $ZFS rename $opt $ds ${ds}-new + done + log_mustnot $ZFS rename $ds + log_mustnot $ZFS rename $ds ${ds}-new ${ds}-new1 + log_mustnot $ZFS rename $ds ${ds}.$longname +done + +log_pass "'zfs rename' fails with illegal scenarios as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_013_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_013_pos.ksh new file mode 100644 index 0000000000..3189be5fd0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rename/zfs_rename_013_pos.ksh @@ -0,0 +1,85 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# zfs rename -r can rename snapshot when child datasets +# don't have a snapshot of the given name. +# +# STRATEGY: +# 1. Create snapshot. +# 2. Rename snapshot recursively. +# 3. Verify rename -r snapshot correctly. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $TESTPOOL/$TESTCTR@snap-new ; then + log_must $ZFS destroy -f $TESTPOOL/$TESTCTR@snap-new + fi + + if datasetexists $TESTPOOL/$TESTCTR@snap ; then + log_must $ZFS destroy -f $TESTPOOL/$TESTCTR@snap + fi + + if datasetexists $TESTPOOL@snap-new ; then + log_must $ZFS destroy -f $TESTPOOL@snap-new + fi + + if datasetexists $TESTPOOL@snap ; then + log_must $ZFS destroy -f $TESTPOOL@snap + fi +} + +log_assert "zfs rename -r can rename snapshot when child datasets" \ + "don't have a snapshot of the given name." + +log_onexit cleanup + +log_must $ZFS snapshot $TESTPOOL/$TESTCTR@snap +log_must $ZFS rename -r $TESTPOOL/$TESTCTR@snap $TESTPOOL/$TESTCTR@snap-new +log_must datasetexists $TESTPOOL/$TESTCTR@snap-new + +log_must $ZFS snapshot $TESTPOOL@snap +log_must $ZFS rename -r $TESTPOOL@snap $TESTPOOL@snap-new +log_must datasetexists $TESTPOOL/$TESTCTR@snap-new +log_must datasetexists $TESTPOOL@snap-new + +log_must $ZFS destroy -f $TESTPOOL/$TESTCTR@snap-new +log_must $ZFS destroy -f $TESTPOOL@snap-new + +log_pass "Verify zfs rename -r passed when child datasets" \ + "don't have a snapshot of the given name." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/Makefile new file mode 100644 index 0000000000..133323f53a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/Makefile @@ -0,0 +1,42 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_reservation + +PROGS = cleanup \ + setup \ + zfs_reservation_001_pos \ + zfs_reservation_002_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_001_pos.ksh new file mode 100644 index 0000000000..d3a6a00ec6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_001_pos.ksh @@ -0,0 +1,59 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Exceed the maximum limit for a reservation and ensure it fails. +# +# STRATEGY: +# 1. Create a reservation file system. +# 2. Set the reservation to an absurd value. +# 3. Verify the return code is an error. +# + +verify_runnable "both" + +RESERVATION="reserve" + +function cleanup +{ + if datasetexists $TESTPOOL/$RESERVATION ; then + log_must $ZFS unmount $TESTPOOL/$RESERVATION + log_must $ZFS destroy $TESTPOOL/$RESERVATION + fi +} + +log_onexit cleanup + +log_assert "Verify that a reservation > 2^64 -1 fails." + +log_must $ZFS create $TESTPOOL/$RESERVATION + +log_mustnot $ZFS set reservation=18446744073709551615 $TESTPOOL/$RESERVATION + +log_pass "Unable to set a reservation > 2^64 - 1" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_002_pos.ksh new file mode 100644 index 0000000000..d308f75df6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_reservation/zfs_reservation_002_pos.ksh @@ -0,0 +1,83 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# A reservation of 'none' (which is an alias for 0) should be allowed. This +# test verifies that is true. +# +# STRATEGY: +# 1. Create a new file system in the test pool. +# 2. Set the reservation to 'none'. +# 3. Verify the associated reservation is indeed 0. +# 4. Repeat with reservation set to 0. +# + +verify_runnable "both" + +# Use a unique value so earlier test failures will not impact this test. +RESERVATION="reserve"-$$ +RESERVATION2="reserve2"-$$ + +function cleanup +{ + typeset FS + for FS in $TESTPOOL/$RESERVATION $TESTPOOL/$RESERVATION2 + do + if datasetexists $FS ; then + log_must $ZFS unmount $FS + log_must $ZFS destroy $FS + fi + done +} + +log_onexit cleanup + +log_assert "Ensure a reservation of 0 or 'none' is allowed." + +log_must $ZFS create $TESTPOOL/$RESERVATION +log_must $ZFS create $TESTPOOL/$RESERVATION2 + +log_must $ZFS set reservation=0 $TESTPOOL/$RESERVATION +log_must $ZFS set reservation=none $TESTPOOL/$RESERVATION2 + +for FS in $TESTPOOL/$RESERVATION $TESTPOOL/$RESERVATION2 +do + + reserve=`$ZFS get -pH reservation $FS | $AWK '{print $3}'` + if [[ $reserve -ne 0 ]]; then + log_fail "ZFS get -p reservation did not return 0" + fi + + reserve=`$ZFS get -H reservation $FS | $AWK '{print $3}'` + if [[ $reserve != "none" ]]; then + log_fail "ZFS get reservation did not return 'none'" + fi +done + +log_pass "Successfully set reservation to 0 and 'none'" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/Makefile new file mode 100644 index 0000000000..6e318133af --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/Makefile @@ -0,0 +1,47 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_rollback + +PROGS = cleanup \ + setup \ + zfs_rollback_001_pos \ + zfs_rollback_002_pos \ + zfs_rollback_003_neg \ + zfs_rollback_004_neg + +FILES = zfs_rollback.cfg \ + zfs_rollback_common.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/cleanup.ksh new file mode 100644 index 0000000000..6aa7d91212 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +cleanup_env + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/setup.ksh new file mode 100644 index 0000000000..913bec1bc4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/setup.ksh @@ -0,0 +1,31 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} +default_volume_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback.cfg new file mode 100644 index 0000000000..d6c8934d97 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback.cfg @@ -0,0 +1,45 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +export FS=$TESTPOOL/$TESTFS +export VOL=$TESTPOOL/$TESTVOL + +export FSSNAP0=$FS@$TESTSNAP +export FSSNAP1=$FS@$TESTSNAP1 +export FSSNAP2=$FS@$TESTSNAP2 + +export VOLSNAP0=$VOL@$TESTSNAP +export VOLSNAP1=$VOL@$TESTSNAP1 +export VOLSNAP2=$VOL@$TESTSNAP2 + +export FSCLONE0=$FS$TESTCLONE +export FSCLONE1=$FS$TESTCLONE1 +export FSCLONE2=$FS$TESTCLONE2 + +export VOLCLONE0=$VOL$TESTCLONE +export VOLCLONE1=$VOL$TESTCLONE1 +export VOLCLONE2=$VOL$TESTCLONE2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_001_pos.ksh new file mode 100644 index 0000000000..02874b33c1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_001_pos.ksh @@ -0,0 +1,163 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +# +# DESCRIPTION: +# 'zfs rollback -r|-rf|-R|-Rf' will recursively destroy any snapshots +# more recent than the one specified. +# +# STRATEGY: +# 1. Create pool, fs & volume. +# 2. Separately create three snapshots or clones for fs & volume +# 3. Roll back to the second snapshot and check the results. +# 4. Create the third snapshot or clones for fs & volume again. +# 5. Roll back to the first snapshot and check the results. +# 6. Separately create two snapshots for fs & volume. +# 7. Roll back to the first snapshot and check the results. +# + +verify_runnable "both" + +log_assert "'zfs rollback -r|-rf|-R|-Rf' will recursively destroy any " \ + "snapshots more recent than the one specified." +log_onexit cleanup_env + +# +# Create suitable test environment and run 'zfs rollback', then compare with +# expected value to check the system status. +# +# $1 option. +# $2 the number of snapshots or clones. +# $3 the number of snapshot point which we want to rollback. +# +function test_n_check #opt num_snap_clone num_rollback +{ + typeset opt=$1 + typeset -i cnt=$2 + typeset -i pointcnt=$3 + typeset dtst + + (( cnt > 3 || pointcnt > cnt )) && \ + log_fail "Unsupported testing condition." + + # Clean up the test environment + datasetexists $FS && log_must $ZFS destroy -Rf $FS + if datasetexists $VOL; then + $DF -lhF ufs "/dev/zvol/dsk/$VOL" > /dev/null 2>&1 + (( $? == 0 )) && log_must $UMOUNT -f $TESTDIR1 + + log_must $ZFS destroy -Rf $VOL + fi + + # Create specified test environment + case $opt in + *r*) setup_snap_env $cnt ;; + *R*) setup_clone_env $cnt ;; + esac + + all_snap="$TESTSNAP $TESTSNAP1 $TESTSNAP2" + all_clone="$TESTCLONE $TESTCLONE1 $TESTCLONE2" + typeset snap_point + typeset exist_snap + typeset exist_clone + case $pointcnt in + 1) snap_point=$TESTSNAP + exist_snap=$TESTSNAP + [[ $opt == *R* ]] && exist_clone=$TESTCLONE + ;; + 2) snap_point=$TESTSNAP1 + exist_snap="$TESTSNAP $TESTSNAP1" + [[ $opt == *R* ]] && exist_clone="$TESTCLONE $TESTCLONE1" + ;; + esac + + typeset snap + for dtst in $FS $VOL; do + # Volume is not available in Local Zone. + if [[ $dtst == $VOL ]]; then + if ! is_global_zone; then + break + fi + fi + if [[ $opt == *f* ]]; then + # To write data to the mountpoint directory, + write_mountpoint_dir $dtst + opt=${opt%f} + fi + + if [[ $dtst == $VOL ]]; then + log_must $UMOUNT -f $TESTDIR1 + log_must $ZFS rollback $opt $dtst@$snap_point + log_must $MOUNT \ + /dev/zvol/dsk/$TESTPOOL/$TESTVOL $TESTDIR1 + else + log_must $ZFS rollback $opt $dtst@$snap_point + fi + + for snap in $all_snap; do + if [[ " $exist_snap " == *" $snap "* ]]; then + log_must datasetexists $dtst@$snap + else + log_must datasetnonexists $dtst@$snap + fi + done + for clone in $all_clone; do + if [[ " $exist_clone " == *" $clone "* ]]; then + log_must datasetexists $dtst$clone + else + log_must datasetnonexists $dtst$clone + fi + done + + check_files $dtst@$snap_point + done +} + +typeset opt +for opt in "-r" "-rf" "-R" "-Rf"; do + # + # Currently, the test case was limited to create and rollback + # in three snapshots + # + log_note "Create 3 snapshots, rollback to the 2nd snapshot " \ + "using $opt." + test_n_check "$opt" 3 2 + + log_note "Create 3 snapshots and rollback to the 1st snapshot " \ + "using $opt." + test_n_check "$opt" 3 1 + + log_note "Create 2 snapshots and rollback to the 1st snapshot " \ + "using $opt." + test_n_check "$opt" 2 1 +done + +log_pass "'zfs rollback -r|-rf|-R|-Rf' recursively destroy any snapshots more "\ + "recent than the one specified passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_002_pos.ksh new file mode 100644 index 0000000000..8da658934e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_002_pos.ksh @@ -0,0 +1,64 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +# +# DESCRIPTION: +# 'zfs rollback -f' will force unmount any filesystems. +# +# STRATEGY: +# 1. Create pool & fs. +# 2. Create the snapshot of this file system. +# 3. Write the mountpoint directory of this file system. +# 4. Make sure 'zfs rollback -f' succeeds. +# + +verify_runnable "both" + +log_assert "'zfs rollback -f' will force unmount any filesystems." +log_onexit cleanup_env + +# Create a snapshot of this file system: FSSNAP0 +setup_snap_env 1 + +# +# Write file and make the mountpoint directory busy when try to unmount +# the file system that was mounted on it. +# +write_mountpoint_dir ${FSSNAP0%%@*} + +log_must $ZFS rollback $FSSNAP0 +log_must $ZFS rollback -f $FSSNAP0 +log_must datasetexists $FSSNAP0 + +$PKILL ${DD##*/} + +check_files $FSSNAP0 + +log_pass "'zfs rollback -f' force unmount any filesystem passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_003_neg.ksh new file mode 100644 index 0000000000..1115ea630b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_003_neg.ksh @@ -0,0 +1,80 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +# +# DESCRIPTION: +# Seperately verify 'zfs rollback ''|-f|-r|-rf|-R|-rR will fail in +# different conditions. +# +# STRATEGY: +# 1. Create pool and file system +# 2. Create 'snap' and 'snap1' of this file system. +# 3. Run 'zfs rollback ""|-f <snap>' and it should fail. +# 4. Create 'clone1' based on 'snap1'. +# 5. Run 'zfs rollback -r|-rf <snap>' and it should fail. +# + +verify_runnable "both" + +function cleanup +{ + $PKILL ${DD##*/} + for snap in $FSSNAP0 $FSSNAP1 $FSSNAP2; do + if snapexists $snap; then + log_must $ZFS destroy -Rf $snap + fi + done +} + +log_assert "Seperately verify 'zfs rollback ''|-f|-r|-rf will fail in " \ + "different conditions." +log_onexit cleanup + +# Create snapshot1 and snapshot2 for this file system. +# +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP1 + +# Run 'zfs rollback ""|-f <snap>' and it should fail. +# +log_mustnot $ZFS rollback $TESTPOOL/$TESTFS@$TESTSNAP +log_mustnot $ZFS rollback -f $TESTPOOL/$TESTFS@$TESTSNAP + +# Create 'clone1' based on 'snap1'. +# +create_clone $TESTPOOL/$TESTFS@$TESTSNAP1 $TESTPOOL/$TESTCLONE1 + +# Run 'zfs rollback -r|-rf <snap>' and it should fail. +# +log_mustnot $ZFS rollback -r $TESTPOOL/$TESTFS@$TESTSNAP +log_mustnot $ZFS rollback -rf $TESTPOOL/$TESTFS@$TESTSNAP + +log_pass "zfs rollback ''|-f|-r|-rf will fail in different conditions " \ + "passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_004_neg.ksh new file mode 100644 index 0000000000..a0aab07899 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_004_neg.ksh @@ -0,0 +1,82 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib + +# +# DESCRIPTION: +# 'zfs rollback' should fail when passing invalid options, too many +# arguments,non-snapshot datasets or missing datasets +# +# STRATEGY: +# 1. Create an array of invalid options +# 2. Execute 'zfs rollback' with invalid options, too many arguments +# or missing datasets +# 3. Verify 'zfs rollback' return with errors +# + +verify_runnable "both" + +function cleanup +{ + typeset ds + + for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + if snapexists ${ds}@$TESTSNAP; then + log_must $ZFS destroy ${ds}@$TESTSNAP + fi + done +} + +log_assert "'zfs rollback' should fail with bad options,too many arguments," \ + "non-snapshot datasets or missing datasets." +log_onexit cleanup + +set -A badopts "r" "R" "f" "-F" "-rF" "-RF" "-fF" "-?" "-*" "-blah" "-1" "-2" + +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + log_must $ZFS snapshot ${ds}@$TESTSNAP +done + +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + for opt in "" "-r" "-R" "-f" "-rR" "-rf" "-rRf"; do + log_mustnot eval "$ZFS rollback $opt $ds >/dev/null 2>&1" + log_mustnot eval "$ZFS rollback $opt ${ds}@$TESTSNAP \ + ${ds}@$TESTSNAP >/dev/null 2>&1" + log_mustnot eval "$ZFS rollback $opt >/dev/null 2>&1" + # zfs rollback should fail with non-existen snapshot + log_mustnot eval "$ZFS rollback $opt ${ds}@nosnap >/dev/null 2>&1" + done + + for badopt in ${badopts[@]}; do + log_mustnot eval "$ZFS rollback $badopt ${ds}@$TESTSNAP \ + >/dev/null 2>&1" + done +done + +log_pass "'zfs rollback' fails as expected with illegal arguments." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib new file mode 100644 index 0000000000..63b998a374 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_rollback/zfs_rollback_common.kshlib @@ -0,0 +1,305 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_rollback/zfs_rollback.cfg + +# Get file sum +# +# $1 full file name +function getsum #fname +{ + (( ${#1} == 0 )) && \ + log_fail "Need give file name." + return $($SUM $1 | $AWK '{print $1}') +} + +# Define global variable checksum, get the original file sum. +# +origsum=$(getsum /etc/passwd) + +# +# Setup or recover the test environment. Firstly, copy /etc/passwd to ZFS file +# system or volume, then make a snapshot or clone. Repeat up to three times. +# +# $1 number of snapshot. Note: Currently only support three snapshots. +# $2 indicate if it is necessary to create clone +# +function setup_snap_env +{ + typeset -i cnt=${1:-3} + typeset createclone=${2:-"false"} + + if datasetnonexists $FS; then + log_must $ZFS create $FS + log_must $ZFS set mountpoint=$TESTDIR $FS + fi + # Volume can't be created in Local Zone. + if datasetnonexists $VOL && is_global_zone; then + log_must $ZFS create -V $VOLSIZE $VOL + fi + + # Make sure $VOL is volume + typeset type=$(get_prop type $VOL) + if datasetexists $VOL && \ + [[ $type == 'volume' ]]; then + # + # At the first time, Make a UFS file system in volume and + # mount it. Otherwise, only check if this ufs file system + # was mounted. + # + log_must eval "$ECHO "y" | \ + $NEWFS -v /dev/zvol/dsk/$VOL > /dev/null 2>&1" + + [[ ! -d $TESTDIR1 ]] && log_must $MKDIR $TESTDIR1 + + # Make sure the ufs filesystem hasn't been mounted, + # then mount the new ufs filesystem. + $DF -lhF ufs "/dev/zvol/dsk/$VOL" > /dev/null 2>&1 + if (( $? != 0 )); then + log_must $MOUNT \ + /dev/zvol/dsk/$TESTPOOL/$TESTVOL $TESTDIR1 + fi + fi + + # Separately Create three snapshots for file system & volume + typeset -i ind=0 + typeset dtst + for dtst in $FS $VOL; do + # Volume can be created in Local Zone. + if [[ $dtst == $VOL ]]; then + if ! is_global_zone; then + break + fi + fi + + ind=0 + while (( ind < cnt )); do + case $dtst in + $FS) + eval typeset snap=\$FSSNAP$ind + eval typeset clone=\$FSCLONE$ind + eval typeset fname=\$TESTDIR/\$TESTFILE$ind + ;; + $VOL) + eval typeset snap=\$VOLSNAP$ind + eval typeset clone=\$VOLCLONE$ind + eval typeset fname=\$TESTDIR1/\$TESTFILE$ind + ;; + esac + + if datasetnonexists $snap; then + log_must $CP /etc/passwd $fname + # + # using 'lockfs -f' to flush the writes to disk + # before taking a snapshot. + # + if [[ $dtst == $VOL ]]; then + log_must /usr/sbin/lockfs -f $TESTDIR1 + fi + log_must $ZFS snapshot $snap + fi + if [[ $createclone == "true" ]]; then + if datasetnonexists $clone; then + log_must $ZFS clone $snap $clone + fi + fi + (( ind += 1 )) + done + done +} + +function setup_clone_env +{ + setup_snap_env $1 "true" +} + +# +# Clean up the test environmnet +# +# $1 number of snapshot Note: Currently only support three snapshots. +# +function cleanup_env +{ + typeset -i cnt=${1:-3} + typeset -i ind=0 + typeset dtst + typeset snap + + $PKILL ${DD##*/} + + $DF -lhF ufs "/dev/zvol/dsk/$VOL" > /dev/null 2>&1 + if (( $? == 0 )); then + log_must $UMOUNT -f $TESTDIR1 + fi + + [[ -d $TESTDIR ]] && log_must $RM -rf $TESTDIR/* + [[ -d $TESTDIR1 ]] && log_must $RM -rf $TESTDIR1/* + + for dtst in $FS $VOL; do + for snap in $TESTSNAP $TESTSNAP1 $TESTSNAP2; do + if snapexists $dtst@$snap; then + log_must $ZFS destroy -Rf $dtst@$snap + fi + done + done + + # Restore original test environment + if datasetnonexists $FS ; then + log_must $ZFS create $FS + fi + if datasetnonexists $VOL ; then + if is_global_zone ; then + log_must $ZFS create -V $VOLSIZE $VOL + else + log_must $ZFS create $VOL + fi + fi +} + +# +# check if the specified files have specified status. +# +# $1 expected status +# $2-n full file name +# If it is true return 0, else return 1 +# +function file_status +{ + (( $# == 0 )) && \ + log_fail "The file name is not defined." + + typeset opt + case $1 in + exist) opt="-e" ;; + nonexist) opt="! -e" ;; + *) log_fail "Unsupported file status." ;; + esac + + shift + while (( $# > 0 )); do + eval [[ $opt $1 ]] || return 1 + shift + done + + return 0 +} + +function files_exist +{ + file_status "exist" $@ +} + +function files_nonexist +{ + file_status "nonexist" $@ +} + +# +# According to snapshot check if the file system was recovered to the right +# point. +# +# $1 snapshot. fs@snap or vol@snap +# +function check_files +{ + typeset dtst=$1 + + if [[ $(get_prop type $dtst) != snapshot ]]; then + log_fail "Parameter must be a snapshot." + fi + + typeset fsvol=${dtst%%@*} + typeset snap=${dtst##*@} + if [[ $(get_prop type $fsvol) == "filesystem" ]]; then + ind="" + else + ind="1" + fi + + eval typeset file0=\$TESTDIR$ind/\$TESTFILE0 + eval typeset file1=\$TESTDIR$ind/\$TESTFILE1 + eval typeset file2=\$TESTDIR$ind/\$TESTFILE2 + + case $snap in + $TESTSNAP2) + log_must files_exist $file0 $file1 $file2 + + typeset sum0=$(getsum $file0) + typeset sum1=$(getsum $file1) + typeset sum2=$(getsum $file2) + if [[ $sum0 != $origsum || \ + $sum1 != $origsum || sum2 != $origsum ]] + then + log_fail "After rollback, file sum is changed." + fi + ;; + $TESTSNAP1) + log_must files_exist $file0 $file1 + log_must files_nonexist $file2 + + typeset sum0=$(getsum $file0) + typeset sum1=$(getsum $file1) + if [[ $sum0 != $origsum || $sum1 != $origsum ]] + then + log_fail "After rollback, file sum is changed." + fi + ;; + $TESTSNAP) + log_must files_exist $file0 + log_must files_nonexist $file1 $file2 + + typeset sum0=$(getsum $file0) + if [[ $sum0 != $origsum ]]; then + log_fail "After rollback, file sum is changed." + fi + ;; + esac +} + +# According to dataset type, write file to different directories. +# +# $1 dataset +# +function write_mountpoint_dir +{ + typeset dtst=$1 + typeset dir + + if [[ $dtst == $FS ]]; then + dir=$TESTDIR + log_must ismounted $dir + else + dir=$TESTDIR1 + log_must ismounted $dir "ufs" + fi + $DD if=/dev/urandom of=$dir/$TESTFILE1 & + log_must $SLEEP 3 +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/Makefile new file mode 100644 index 0000000000..e8d5a70bf6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/Makefile @@ -0,0 +1,48 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_send + +PROGS = cleanup \ + setup \ + zfs_send_001_pos \ + zfs_send_002_pos \ + zfs_send_003_pos \ + zfs_send_004_neg \ + zfs_send_005_pos \ + zfs_send_006_pos + +FILES = zfs_send.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/cleanup.ksh new file mode 100644 index 0000000000..97a4cae82d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/cleanup.ksh @@ -0,0 +1,33 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send.cfg new file mode 100644 index 0000000000..bbc4d3ac83 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send.cfg @@ -0,0 +1,32 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export BLOCK_SIZE=512 +export WRITE_COUNT=8 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_001_pos.ksh new file mode 100644 index 0000000000..0f3ae6143f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_001_pos.ksh @@ -0,0 +1,127 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_send/zfs_send.cfg + +# +# DESCRIPTION: +# Verify 'zfs send' can create valid send streams as expected. +# +# STRATEGY: +# 1. Fill in fs with some data +# 2. Create a full send streams with the fs +# 3. Receive the send stream and verify the data integrity +# 4. Fill in fs with some new data +# 5. Create an incremental send stream with the fs +# 6. Receive the incremental send stream and verify the data integrity. +# + +verify_runnable "both" + +function cleanup +{ + for snap in $init_snap $inc_snap $rst_snap $rst_inc_snap; do + snapexists $snap && \ + log_must $ZFS destroy -f $snap + done + + datasetexists $rst_root && \ + log_must $ZFS destroy -Rf $rst_root + + for file in $full_bkup $inc_bkup \ + $init_data $inc_data + do + [[ -e $file ]] && \ + log_must $RM -f $file + done + + [[ -d $TESTDIR1 ]] && \ + log_must $RM -rf $TESTDIR1 + +} + +log_assert "Verify 'zfs send' can create valid send streams as expected." +log_onexit cleanup + +init_snap=$TESTPOOL/$TESTFS@init_snap +inc_snap=$TESTPOOL/$TESTFS@inc_snap +full_bkup=/var/tmp/fullbkup.$$ +inc_bkup=/var/tmp/incbkup.$$ +init_data=$TESTDIR/$TESTFILE1 +inc_data=$TESTDIR/$TESTFILE2 +orig_sum="" +rst_sum="" +rst_root=$TESTPOOL/rst_ctr +rst_snap=$rst_root/$TESTFS@init_snap +rst_inc_snap=$rst_root/$TESTFS@inc_snap +rst_data=$TESTDIR1/$TESTFS/$TESTFILE1 +rst_inc_data=$TESTDIR1/$TESTFS/$TESTFILE2 + + +log_note "Verify 'zfs send' can create full send stream." + +#Pre-paration +log_must $ZFS create $rst_root +[[ ! -d $TESTDIR1 ]] && \ + log_must $MKDIR -p $TESTDIR1 +log_must $ZFS set mountpoint=$TESTDIR1 $rst_root + +$FILE_WRITE -o create -f $init_data -b $BLOCK_SIZE -c $WRITE_COUNT + +log_must $ZFS snapshot $init_snap +$ZFS send $init_snap > $full_bkup +(( $? != 0 )) && \ + log_fail "'$ZFS send' fails to create full send" + +log_note "Verify the send stream is valid to receive." + +log_must $ZFS receive $rst_snap <$full_bkup +receive_check $rst_snap ${rst_snap%%@*} +compare_cksum $init_data $rst_data + +log_note "Verify 'zfs send -i' can create incremental send stream." + +$FILE_WRITE -o create -f $inc_data -b $BLOCK_SIZE -c $WRITE_COUNT -d 0 + +log_must $ZFS snapshot $inc_snap +$ZFS send -i $init_snap $inc_snap > $inc_bkup +(( $? != 0 )) && \ + log_fail "'$ZFS send -i' fails to create incremental send" + +log_note "Verify the incremental send stream is valid to receive." + +log_must $ZFS rollback $rst_snap +log_must $ZFS receive $rst_inc_snap <$inc_bkup +receive_check $rst_inc_snap +compare_cksum $inc_data $rst_inc_data + +log_pass "Verifying 'zfs receive' succeed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_002_pos.ksh new file mode 100644 index 0000000000..b542bf9dac --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_002_pos.ksh @@ -0,0 +1,139 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_send/zfs_send.cfg + +# +# DESCRIPTION: +# Verify 'zfs send' can generate valid streams with a property setup. +# +# STRATEGY: +# 1. Setup property for filesystem +# 2. Fill in some data into filesystem +# 3. Create a full send streams +# 4. Receive the send stream +# 5. Verify the receive result +# + +verify_runnable "both" + +function cleanup +{ + snapexists $snap && \ + log_must $ZFS destroy $snap + + datasetexists $ctr && \ + log_must $ZFS destroy -r $ctr + + [[ -e $origfile ]] && \ + log_must $RM -f $origfile + + [[ -e $stream ]] && \ + log_must $RM -f $stream +} + +function do_testing # <prop> <prop_value> +{ + typeset property=$1 + typeset prop_val=$2 + + log_must $ZFS set $property=$prop_val $fs + $FILE_WRITE -o create -f $origfile -b $BLOCK_SIZE -c $WRITE_COUNT + log_must $ZFS snapshot $snap + $ZFS send $snap > $stream + (( $? != 0 )) && \ + log_fail "'$ZFS send' fails to create send streams." + $ZFS receive -d $ctr <$stream + (( $? != 0 )) && \ + log_fail "'$ZFS receive' fails to receive send streams." + + #verify receive result + ! datasetexists $rstfs && \ + log_fail "'$ZFS receive' fails to restore $rstfs" + ! snapexists $rstfssnap && \ + log_fail "'$ZFS receive' fails to restore $rstfssnap" + if [[ ! -e $rstfile ]] || [[ ! -e $rstsnapfile ]]; then + log_fail " Data lost after receiving stream" + fi + + compare_cksum $origfile $rstfile + compare_cksum $origsnapfile $rstsnapfile + + #Destroy datasets and stream for next testing + log_must $ZFS destroy $snap + if is_global_zone ; then + log_must $ZFS destroy -r $rstfs + else + log_must $ZFS destroy -r $ds_path + fi + log_must $RM -f $stream +} + +log_assert "Verify 'zfs send' generates valid streams with a property setup" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +snap=$fs@$TESTSNAP +ctr=$TESTPOOL/$TESTCTR +if is_global_zone; then + rstfs=$ctr/$TESTFS +else + ds_path=$ctr/${ZONE_CTR}0 + rstfs=$ds_path/$TESTFS +fi +rstfssnap=$rstfs@$TESTSNAP +snapdir=".zfs/snapshot/$TESTSNAP" +origfile=$TESTDIR/$TESTFILE1 +rstfile=/$rstfs/$TESTFILE1 +origsnapfile=$TESTDIR/$snapdir/$TESTFILE1 +rstsnapfile=/$rstfs/$snapdir/$TESTFILE1 +stream=/var/tmp/streamfile.$$ + +set -A props "compression" "checksum" "recordsize" +set -A propval "on lzjb" "on fletcher2 fletcher4 sha256" \ + "512 1k 4k 8k 16k 32k 64k 128k" + +#Create a dataset to receive the send stream +log_must $ZFS create $ctr + +typeset -i i=0 +while (( i < ${#props[*]} )) +do + for value in ${propval[i]} + do + do_testing ${props[i]} $value + done + + (( i = i + 1 )) +done + +log_pass "'zfs send' generates streams with a property setup as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_003_pos.ksh new file mode 100644 index 0000000000..749f0740f1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_003_pos.ksh @@ -0,0 +1,65 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs send -i' can deal with abbreviated snapshot name. +# +# STRATEGY: +# 1. Create pool, fs and two snapshots. +# 2. Make sure 'zfs send -i' support abbreviated snapshot name. +# + +verify_runnable "both" + +function cleanup +{ + datasetexists $snap1 && log_must $ZFS destroy $snap1 + datasetexists $snap2 && log_must $ZFS destroy $snap2 +} + +log_assert "'zfs send -i' can deal with abbreviated snapshot name." +log_onexit cleanup + +snap1=$TESTPOOL/$TESTFS@snap1; snap2=$TESTPOOL/$TESTFS@snap2 + +set -A args "$snap1 $snap2" \ + "${snap1##*@} $snap2" "@${snap1##*@} $snap2" + +log_must $ZFS snapshot $snap1 +log_must $ZFS snapshot $snap2 + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_must eval "$ZFS send -i ${args[i]} > /dev/null" + + (( i += 1 )) +done + +log_pass "'zfs send -i' deal with abbreviated snapshot name passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_004_neg.ksh new file mode 100644 index 0000000000..4f0bf2b5c3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_004_neg.ksh @@ -0,0 +1,105 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/cli_common.kshlib + +# +# DESCRIPTION: +# Verify 'zfs send' fails with malformed parameters. +# +# STRATEGY: +# 1. Define malformed parameters in array +# 2. Feed the parameters to 'zfs send' +# 3. Verify the result +# + +verify_runnable "both" + +function cleanup +{ + typeset snap f + + for snap in $snap1 $snap2 $snap3; do + snapexists $snap && \ + log_must $ZFS destroy -f $snap + done + + for f in $tmpfile1 $tmpfile2; do + if [[ -e $f ]]; then + $RM -f $f + fi + done +} + +fs=$TESTPOOL/$TESTFS +snap1=$fs@snap1 +snap2=$fs@snap2 +snap3=$fs@snap3 + +set -A badargs \ + "" "$TESTPOOL" "$TESTFS" "$fs" "$fs@nonexisten_snap" "?" \ + "$snap1/blah" "$snap1@blah" "-i" "-x" "-i $fs" \ + "-x $snap1 $snap2" "-i $snap1" \ + "-i $snap2 $snap1" "$snap1 $snap2" "-i $snap1 $snap2 $snap3" \ + "-ii $snap1 $snap2" "-iii $snap1 $snap2" " -i $snap2 $snap1/blah" \ + "-i $snap2/blah $snap1" \ + "-i $snap2/blah $snap1/blah" \ + "-i $snap1 blah@blah" \ + "-i blah@blah $snap1" \ + "-i $snap1 ${snap2##*@}" "-i $snap1 @${snap2##*@}" \ + "-i ${snap1##*@} ${snap2##*@}" "-i @${snap1##*@} @${snap2##*@}" \ + "-i ${snap1##*@} $snap2/blah" "-i @${snap1##*@} $snap2/blah" \ + "-i @@${snap1##*@} $snap2" "-i $snap1 -i $snap1 $snap2" \ + "-i snap1 snap2" "-i $snap1 snap2" \ + "-i $snap1 $snap2 -i $snap1 $snap2" \ + "-i snap1 $snap2 -i snap1 $snap2" + +log_assert "Verify that invalid parameters to 'zfs send' are caught." +log_onexit cleanup + +log_must $ZFS snapshot $snap1 +tmpfile1=$TESTDIR/testfile1.$$ +log_must $TOUCH $tmpfile1 +log_must $ZFS snapshot $snap2 +tmpfile2=$TESTDIR/testfile2.$$ +log_must $TOUCH $tmpfile2 +log_must $ZFS snapshot $snap3 + +typeset -i i=0 +while (( i < ${#badargs[*]} )) +do + log_mustnot eval "$ZFS send ${badargs[i]} >/dev/null" + + (( i = i + 1 )) +done + +#Testing zfs send fails by send backup stream to terminal +for arg in "$snap1" "-i $snap1 $snap2"; do + log_mustnot eval "$ZFS send $arg >/dev/console" +done + +log_pass "Invalid parameters to 'zfs send' are caught as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_005_pos.ksh new file mode 100644 index 0000000000..ffabfe1800 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_005_pos.ksh @@ -0,0 +1,66 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zfs send -R' can send from read-only imported pool. It needs to +# detect that the pool is read-only and not try to place holds on +# datasets being sent. +# +# STRATEGY: +# 1. Create a recursive snapshot on the whole pool. +# 2. 'zfs send -R' the recursive snapshots. +# + +verify_runnable "both" + +function cleanup +{ + poolexists $TESTPOOL && log_must $ZPOOL export $TESTPOOL + log_must $ZPOOL import $TESTPOOL + + datasetexists $TESTPOOL@snap && \ + log_must $ZFS destroy -r $TESTPOOL@snap +} + +log_assert "'zfs send -R' can send from read-only pools" +log_onexit cleanup + +log_must $ZFS snapshot -r $TESTPOOL@snap + +log_must $ZPOOL export $TESTPOOL +log_must $ZPOOL import -o readonly=on $TESTPOOL + +log_must eval "$ZFS send -R $TESTPOOL@snap >/dev/null" + +log_pass "'zfs send -R' can send from read-only pools" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_006_pos.ksh new file mode 100644 index 0000000000..7580c6d6f4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_send/zfs_send_006_pos.ksh @@ -0,0 +1,194 @@ +#!/bin/ksh +# +# CDDL HEADER START +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# +# CDDL HEADER END +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +# +# DESCRIPTION: +# Verify 'zfs send' can generate valid streams with different options +# +# STRATEGY: +# 1. Create datasets +# 2. Write some data to the datasets +# 3. Create a full send streams +# 4. Receive the send stream +# 5. Do a dry run with different options and verify the generated size +# estimate against the received stream +# + +verify_runnable "both" + +function cleanup +{ + for ds in $datasets; do + datasetexists $ds && $ZFS destroy -rf $ds + done +} + +function cal_percentage +{ + typeset value=$1 + return=$($ECHO "$PERCENT * $value" | bc) + return=$($ECHO "$return / 100" | bc) + echo $return +} + +function get_estimate_size +{ + typeset snapshot=$1 + typeset option=$2 + typeset base_snapshot=${3:-""} + if [[ -z $3 ]];then + typeset total_size=$($ZFS send $option $snapshot 2>&1 | $TAIL -1) + else + typeset total_size=$($ZFS send $option $base_snapshot $snapshot \ + 2>&1 | $TAIL -1) + fi + if [[ $options == *"P"* ]]; then + total_size=$($ECHO "$total_size" | $AWK '{print $2}') + else + total_size=$($ECHO "$total_size" | $AWK '{print $5}') + total_size=${total_size%M} + total_size=$($ECHO "$total_size * $block_count" | bc) + fi + $ECHO $total_size + +} + +function verify_size_estimates +{ + typeset options=$1 + typeset file_size=$2 + typeset refer_diff=$($ECHO "$refer_size - $estimate_size" | bc) + refer_diff=$($ECHO "$refer_diff / 1" | bc) + refer_diff=$($ECHO "$refer_diff" | $NAWK '{print ($1 < 0) ? ($1 * -1): $1'}) + typeset file_diff=$($ECHO "$file_size - $estimate_size" | bc) + file_diff=$($ECHO "$file_diff / 1" | bc) + file_diff=$($ECHO "$file_diff" | $NAWK '{print ($1 < 0) ? ($1 * -1):$1'}) + typeset expected_diff=$(cal_percentage $refer_size) + + [[ -z $refer_diff && -z $file_diff && -z $expected_diff ]] && \ + log_fail "zfs send $options failed" + [[ $refer_diff -le $expected_diff && \ + $file_diff -le $expected_diff ]] || \ + log_fail "zfs send $options gives wrong size estimates" +} + +log_assert "Verify 'zfs send -nvP' generates valid stream estimates" +log_onexit cleanup +typeset -l block_count=0 +typeset -l block_size +typeset -i PERCENT=1 + +((block_count=1024*1024)) + +# create dataset +log_must $ZFS create $TESTPOOL/$TESTFS1 + +# create multiple snapshot for the dataset with data +for block_size in 64 128 256; do + log_must $DD if=/dev/urandom of=/$TESTPOOL/$TESTFS1/file$block_size \ + bs=1M count=$block_size + log_must $ZFS snapshot $TESTPOOL/$TESTFS1@snap$block_size +done + +full_snapshot="$TESTPOOL/$TESTFS1@snap64" +increamental_snapshot="$TESTPOOL/$TESTFS1@snap256" + +full_size=$($ZFS send $full_snapshot 2>&1 | wc -c) +increamental_size=$($ZFS send $increamental_snapshot 2>&1 | wc -c) +increamental_send=$($ZFS send -i $full_snapshot $increamental_snapshot 2>&1 | wc -c) + +log_note "verify zfs send -nv" +options="-nv" +refer_size=$(get_prop refer $full_snapshot) +estimate_size=$(get_estimate_size $full_snapshot $options) +log_must verify_size_estimates $options $full_size + +log_note "verify zfs send -Pnv" +options="-Pnv" + +estimate_size=$(get_estimate_size $full_snapshot $options) +log_must verify_size_estimates $options $full_size + +log_note "verify zfs send -nv for multiple snapshot send" +options="-nv" +refer_size=$(get_prop refer $increamental_snapshot) + +estimate_size=$(get_estimate_size $increamental_snapshot $options) +log_must verify_size_estimates $options $increamental_size + +log_note "verify zfs send -vPn for multiple snapshot send" +options="-vPn" + +estimate_size=$(get_estimate_size $increamental_snapshot $options) +log_must verify_size_estimates $options $increamental_size + +log_note "verify zfs send -inv for increamental send" +options="-nvi" +refer_size=$(get_prop refer $increamental_snapshot) +deduct_size=$(get_prop refer $full_snapshot) +refer_size=$($ECHO "$refer_size - $deduct_size" | bc) + +estimate_size=$(get_estimate_size $increamental_snapshot $options $full_snapshot) +log_must verify_size_estimates $options $increamental_send + +log_note "verify zfs send -ivPn for increamental send" +options="-vPni" + +estimate_size=$(get_estimate_size $increamental_snapshot $options $full_snapshot) +log_must verify_size_estimates $options $increamental_send + +log_must $ZFS destroy -r $TESTPOOL/$TESTFS1 + +#setup_recursive_send +datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS1/$TESTFS2 + $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3" +# create nested datasets +log_must $ZFS create -p $TESTPOOL/$TESTFS1/$TESTFS2/$TESTFS3 + +# verify dataset creation +for ds in $datasets; do + datasetexists $ds || log_fail "Create $ds dataset fail." +done +for ds in $datasets; do + log_must $DD if=/dev/urandom of=/$ds/file64 \ + bs=1M count=64 +done + +# create recursive nested snapshot +log_must $ZFS snapshot -r $TESTPOOL/$TESTFS1@snap64 +for ds in $datasets; do + datasetexists $ds@snap64 || log_fail "Create $ds@snap64 snapshot fail." +done +recursive_size=$($ZFS send -R $full_snapshot 2>&1 | wc -c) +log_note "verify zfs send -Rnv for recursive send" +options="-Rnv" +refer_size=$(get_prop refer $full_snapshot) +refer_size=$($ECHO "$refer_size * 3" | bc) + +estimate_size=$(get_estimate_size $full_snapshot $options) +log_must verify_size_estimates $options $recursive_size + +log_note "verify zfs send -RvPn for recursive send" +options="-RvPn" +estimate_size=$(get_estimate_size $full_snapshot $options) +log_must verify_size_estimates $options $recursive_size + +log_pass "'zfs send' prints the correct size estimates using '-n' and '-P' options." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/Makefile new file mode 100644 index 0000000000..2226e20d61 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/Makefile @@ -0,0 +1,68 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_set + +PROGS = cleanup \ + setup \ + cache_001_pos \ + cache_002_neg \ + canmount_001_pos \ + canmount_002_pos \ + canmount_003_pos \ + canmount_004_pos \ + checksum_001_pos \ + compression_001_pos \ + mountpoint_001_pos \ + mountpoint_002_pos \ + mountpoint_003_pos \ + onoffs_001_pos \ + property_alias_001_pos \ + readonly_001_pos \ + reservation_001_neg \ + ro_props_001_pos \ + share_mount_001_neg \ + snapdir_001_pos \ + user_property_001_pos \ + user_property_002_pos \ + user_property_003_neg \ + user_property_004_pos \ + version_001_neg \ + zfs_set_001_neg \ + zfs_set_002_neg \ + zfs_set_003_neg + +FILES = zfs_set_common.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/cache_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/cache_001_pos.ksh new file mode 100644 index 0000000000..bffc47f817 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/cache_001_pos.ksh @@ -0,0 +1,63 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting a valid primarycache and secondarycache on file system or volume. +# It should be successful. +# +# STRATEGY: +# 1. Create pool, then create filesystem & volume within it. +# 2. Setting valid cache value, it should be successful. +# + +verify_runnable "both" + +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" +set -A values "none" "all" "metadata" + +log_assert "Setting a valid {primary|secondary}cache on file system and volume, " \ + "It should be successful." + +typeset -i i=0 +typeset -i j=0 +for propname in "primarycache" "secondarycache" +do + while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + set_n_check_prop "${values[j]}" "$propname" "${dataset[i]}" + (( j += 1 )) + done + (( i += 1 )) + done +done + +log_pass "Setting a valid {primary|secondary}cache on file system or volume pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/cache_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/cache_002_neg.ksh new file mode 100644 index 0000000000..653f31acd0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/cache_002_neg.ksh @@ -0,0 +1,63 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting invalid primarycache and secondarycache on file system or volume. +# It should fail. +# +# STRATEGY: +# 1. Create pool, then create filesystem & volume within it. +# 2. Setting invalid {primary|secondary}cache value, it should fail. +# + +verify_runnable "both" + +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" +set -A values "12345" "null" "not_existed" "abcd1234" + +log_assert "Setting invalid {primary|secondary}cache on fs and volume, " \ + "It should fail." + +typeset -i i=0 +typeset -i j=0 +for propname in "primarycache" "secondarycache" +do + while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + log_mustnot $ZFS set $propname=${values[j]} ${dataset[i]} + (( j += 1 )) + done + (( i += 1 )) + done +done + +log_pass "Setting invalid {primary|secondary}cache on fs or volume fail as expeced." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_001_pos.ksh new file mode 100644 index 0000000000..de219c4f18 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_001_pos.ksh @@ -0,0 +1,119 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting valid canmount to filesystem, it is successful. +# Whatever is set to volume or snapshot, it is failed. +# 'zfs set canmount=on|off <fs>' +# +# STRATEGY: +# 1. Setup a pool and create fs, volume, snapshot clone within it. +# 2. Loop all the valid mountpoint value. +# 3. Check the return value. +# + +verify_runnable "both" + +set -A dataset_pos \ + "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCLONE" + +if is_global_zone ; then + set -A dataset_neg \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTFS@$TESTSNAP" \ + "$TESTPOOL/$TESTVOL@$TESTSNAP" "$TESTPOOL/$TESTCLONE1" +else + set -A dataset_neg \ + "$TESTPOOL/$TESTFS@$TESTSNAP" "$TESTPOOL/$TESTVOL@$TESTSNAP" +fi + + +set -A values "on" "off" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTFS@$TESTSNAP + fi + if snapexists $TESTPOOL/$TESTVOL@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTVOL@$TESTSNAP + fi + + [[ -n $old_ctr_canmount ]] && \ + log_must $ZFS set canmount=$old_ctr_canmount $TESTPOOL/$TESTCTR + [[ -n $old_fs_canmount ]] && \ + log_must $ZFS set canmount=$old_fs_canmount $TESTPOOL/$TESTFS + + $ZFS unmount -a > /dev/null 2>&1 + log_must $ZFS mount -a +} + +log_assert "Setting a valid property of canmount to file system, it must be successful." +log_onexit cleanup + +typeset old_fs_canmount="" old_ctr_canmount="" + +old_fs_canmount=$(get_prop canmount $TESTPOOL/$TESTFS) +[[ $? != 0 ]] && \ + log_fail "Get the $TESTPOOL/$TESTFS canmount error." +old_ctr_canmount=$(get_prop canmount $TESTPOOL/$TESTCTR) +[[ $? != 0 ]] && \ + log_fail "Get the $TESTPOOL/$TESTCTR canmount error." + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_must $ZFS snapshot $TESTPOOL/$TESTVOL@$TESTSNAP +log_must $ZFS clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE +log_must $ZFS clone $TESTPOOL/$TESTVOL@$TESTSNAP $TESTPOOL/$TESTCLONE1 + +for dataset in "${dataset_pos[@]}" ; do + for value in "${values[@]}" ; do + set_n_check_prop "$value" "canmount" "$dataset" + if [[ $value == "off" ]]; then + log_mustnot ismounted $dataset + log_mustnot $ZFS mount $dataset + log_mustnot ismounted $dataset + else + if ! ismounted $dataset ; then + log_must $ZFS mount $dataset + fi + log_must ismounted $dataset + fi + done +done + +for dataset in "${dataset_neg[@]}" ; do + for value in "${values[@]}" ; do + set_n_check_prop "$value" "canmount" \ + "$dataset" "false" + log_mustnot ismounted $dataset + done +done + +log_pass "Setting canmount to filesystem pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_002_pos.ksh new file mode 100644 index 0000000000..447a9e8034 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_002_pos.ksh @@ -0,0 +1,150 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting valid canmount to filesystem, it is successful. +# Whatever is set to volume or snapshot, it is failed. +# 'zfs set canmount=noauto <fs>' +# +# STRATEGY: +# 1. Setup a pool and create fs, volume, snapshot clone within it. +# 2. Set canmount=noauto for each dataset and check the retuen value +# and check if it still can be mounted by mount -a. +# 3. mount each dataset(except volume) to see if it can be mounted. +# + +verify_runnable "both" + +set -A dataset_pos \ + "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCLONE" + +if is_global_zone ; then + set -A dataset_neg \ + "$TESTPOOL/$TESTVOL" "$TESTPOOL/$TESTFS@$TESTSNAP" \ + "$TESTPOOL/$TESTVOL@$TESTSNAP" "$TESTPOOL/$TESTCLONE1" +else + set -A dataset_neg \ + "$TESTPOOL/$TESTFS@$TESTSNAP" "$TESTPOOL/$TESTVOL@$TESTSNAP" +fi + +function cleanup +{ + i=0 + while (( i < ${#dataset_pos[*]} )); do + ds=${dataset_pos[i]} + if datasetexists $ds; then + log_must $ZFS set mountpoint=${old_mnt[i]} $ds + log_must $ZFS set canmount=${old_canmount[i]} $ds + fi + (( i = i + 1 )) + done + + ds=$TESTPOOL/$TESTCLONE + if datasetexists $ds; then + mntp=$(get_prop mountpoint $ds) + log_must $ZFS destroy $ds + if [[ -d $mntp ]]; then + $RM -fr $mntp + fi + fi + + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTFS@$TESTSNAP + fi + if snapexists $TESTPOOL/$TESTVOL@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTVOL@$TESTSNAP + fi + + $ZFS unmount -a > /dev/null 2>&1 + log_must $ZFS mount -a + + if [[ -d $tmpmnt ]]; then + $RM -fr $tmpmnt + fi +} + +log_assert "Setting canmount=noauto to file system, it must be successful." +log_onexit cleanup + +set -A old_mnt +set -A old_canmount +typeset tmpmnt=/tmpmount$$ +typeset ds + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_must $ZFS snapshot $TESTPOOL/$TESTVOL@$TESTSNAP +log_must $ZFS clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE +log_must $ZFS clone $TESTPOOL/$TESTVOL@$TESTSNAP $TESTPOOL/$TESTCLONE1 + +typeset -i i=0 +while (( i < ${#dataset_pos[*]} )); do + ds=${dataset_pos[i]} + old_mnt[i]=$(get_prop mountpoint $ds) + old_canmount[i]=$(get_prop canmount $ds) + (( i = i + 1 )) +done + +i=0 +while (( i < ${#dataset_pos[*]} )) ; do + dataset=${dataset_pos[i]} + set_n_check_prop "noauto" "canmount" "$dataset" + log_must $ZFS set mountpoint=$tmpmnt $dataset + if ismounted $dataset; then + $ZFS unmount -a > /dev/null 2>&1 + log_must mounted $dataset + log_must $ZFS unmount $dataset + log_must unmounted $dataset + log_must $ZFS mount -a + log_must unmounted $dataset + else + log_must $ZFS mount -a + log_must unmounted $dataset + $ZFS unmount -a > /dev/null 2>&1 + log_must unmounted $dataset + fi + + log_must $ZFS mount $dataset + log_must mounted $dataset + log_must $ZFS set canmount="${old_canmount[i]}" $dataset + log_must $ZFS set mountpoint="${old_mnt[i]}" $dataset + (( i = i + 1 )) +done + +for dataset in "${dataset_neg[@]}" ; do + set_n_check_prop "noauto" "canmount" "$dataset" "false" + log_mustnot ismounted $dataset +done + +log_pass "Setting canmount=noauto to filesystem pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_003_pos.ksh new file mode 100644 index 0000000000..886b120f2f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_003_pos.ksh @@ -0,0 +1,111 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# While canmount=noauto and the dataset is mounted, +# zfs must not attempt to unmount it. +# +# STRATEGY: +# 1. Setup a pool and create fs, volume, snapshot clone within it. +# 2. Set canmount=noauto for each dataset and check the return value +# and check if it still can not be unmounted when the dataset is mounted +# + +verify_runnable "both" + +set -A dataset_pos "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCLONE" + +function cleanup +{ + i=0 + cd $pwd + while (( i < ${#dataset_pos[*]} )); do + ds=${dataset_pos[i]} + if datasetexists $ds; then + log_must $ZFS set mountpoint=${old_mnt[i]} $ds + log_must $ZFS set canmount=${old_canmount[i]} $ds + fi + (( i = i + 1 )) + done + + ds=$TESTPOOL/$TESTCLONE + if datasetexists $ds; then + mntp=$(get_prop mountpoint $ds) + log_must $ZFS destroy $ds + if [[ -d $mntp ]]; then + log_must $RM -fr $mntp + fi + fi + + if snapexists $TESTPOOL/$TESTFS@$TESTSNAP ; then + log_must $ZFS destroy -R $TESTPOOL/$TESTFS@$TESTSNAP + fi + + $ZFS unmount -a > /dev/null 2>&1 + log_must $ZFS mount -a +} + +log_assert "While canmount=noauto and the dataset is mounted,"\ + " zfs must not attempt to unmount it" +log_onexit cleanup + +set -A old_mnt +set -A old_canmount +typeset ds +typeset pwd=$PWD + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_must $ZFS clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE + +typeset -i i=0 +while (( i < ${#dataset_pos[*]} )); do + ds=${dataset_pos[i]} + old_mnt[i]=$(get_prop mountpoint $ds) + old_canmount[i]=$(get_prop canmount $ds) + (( i = i + 1 )) +done + +i=0 +while (( i < ${#dataset_pos[*]} )) ; do + dataset=${dataset_pos[i]} + if ismounted $dataset; then + log_must cd ${old_mnt[i]} + set_n_check_prop "noauto" "canmount" "$dataset" + log_must mounted $dataset + fi + (( i = i + 1 )) +done + +log_pass "Setting canmount=noauto to filesystem while dataset busy pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_004_pos.ksh new file mode 100644 index 0000000000..bc8e279045 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/canmount_004_pos.ksh @@ -0,0 +1,92 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify canmount=noauto work fine when setting sharenfs or sharesmb. +# +# STRATEGY: +# 1. Create a fs canmount=noauto. +# 2. Set sharenfs or sharesmb. +# 3. Verify the fs is umounted. +# + +verify_runnable "global" + +# properties +set -A sharenfs_prop "off" "on" "rw" +set -A sharesmb_prop "off" "on" + +function cleanup +{ + log_must $ZFS destroy -rR $CS_FS +} + +function assert_unmounted +{ + mnted=$(get_prop mounted $CS_FS) + if [[ "$mnted" == "yes" ]]; then + canmnt=$(get_prop canmount $CS_FS) + shnfs=$(get_prop sharenfs $CS_FS) + shsmb=$(get_prop sharesmb $CS_FS) + mntpt=$(get_prop mountpoint $CS_FS) + log_fail "$CS_FS should be unmounted" \ + "[canmount=$canmnt,sharenfs=$shnfs,sharesmb=$shsmb,mountpoint=$mntpt]." + fi +} + +log_assert "Verify canmount=noauto work fine when setting sharenfs or sharesmb." +log_onexit cleanup + +CS_FS=$TESTPOOL/$TESTFS/cs_fs.$$ +oldmpt=$TESTDIR/old_cs_fs.$$ +newmpt=$TESTDIR/new_cs_fs.$$ + +log_must $ZFS create -o canmount=noauto -o mountpoint=$oldmpt $CS_FS +assert_unmounted + +for n in ${sharenfs_prop[@]}; do + log_must $ZFS set sharenfs="$n" $CS_FS + assert_unmounted + for s in ${sharesmb_prop[@]}; do + log_must $ZFS set sharesmb="$s" $CS_FS + assert_unmounted + + mntpt=$(get_prop mountpoint $CS_FS) + if [[ "$mntpt" == "$oldmpt" ]]; then + log_must $ZFS set mountpoint="$newmpt" $CS_FS + else + log_must $ZFS set mountpoint="$oldmpt" $CS_FS + fi + assert_unmounted + done +done + +log_pass "Verify canmount=noauto work fine when setting sharenfs or sharesmb." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/checksum_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/checksum_001_pos.ksh new file mode 100644 index 0000000000..edc7a3fb90 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/checksum_001_pos.ksh @@ -0,0 +1,65 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting a valid checksum on a pool, file system, volume, it should be +# successful. +# +# STRATEGY: +# 1. Create pool, then create filesystem and volume within it. +# 2. Setting different valid checksum to each dataset. +# 3. Check the return value and make sure it is 0. +# + +verify_runnable "both" + +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" +set -A values "on" "off" "fletcher2" "fletcher4" "sha256" + +log_assert "Setting a valid checksum on a file system, volume," \ + "it should be successful." + +typeset -i i=0 +typeset -i j=0 +while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + set_n_check_prop "${values[j]}" "checksum" "${dataset[i]}" + (( j += 1 )) + done + (( i += 1 )) +done + +log_pass "Setting a valid checksum on a file system, volume pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/cleanup.ksh new file mode 100644 index 0000000000..915a5441ab --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_container_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/compression_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/compression_001_pos.ksh new file mode 100644 index 0000000000..f7d06eaf4f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/compression_001_pos.ksh @@ -0,0 +1,63 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting a valid compression on file system or volume. +# It should be successful. +# +# STRATEGY: +# 1. Create pool, then create filesystem & volume within it. +# 2. Setting valid value, it should be successful. +# + +verify_runnable "both" + +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" +set -A values $(get_compress_opts zfs_set) + +log_assert "Setting a valid compression on file system and volume, " \ + "It should be successful." + +typeset -i i=0 +typeset -i j=0 +for propname in "compression" "compress" +do + while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + set_n_check_prop "${values[j]}" "$propname" "${dataset[i]}" + (( j += 1 )) + done + (( i += 1 )) + done +done + +log_pass "Setting a valid compression on file system or volume pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_001_pos.ksh new file mode 100644 index 0000000000..eaf9a629e5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_001_pos.ksh @@ -0,0 +1,100 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting valid mountpoint to filesystem, it is successful. +# Whatever is set to volume, it is failed. +# 'zfs set mountpoint=<path>|legacy|none <fs|ctr|vol>' +# +# STRATEGY: +# 1. Setup a pool and create fs, ctr within it. +# 2. Loop all the valid mountpoint value. +# 3. Check the return value. +# + +verify_runnable "both" + +export TESTDIR_NOTEXISTING=${TEST_BASE_DIR%%/}/testdir_notexisting$$ + +if is_global_zone ; then + set -A dataset \ + "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTVOL" +else + set -A dataset "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" +fi + +set -A values "$TESTDIR2" "legacy" "none" "$TESTDIR_NOTEXISTING" + +function cleanup +{ + log_must $ZFS set mountpoint=$old_ctr_mpt $TESTPOOL/$TESTCTR + log_must $ZFS set mountpoint=$old_fs_mpt $TESTPOOL/$TESTFS + [[ -d $TESTDIR2 ]] && log_must $RM -r $TESTDIR2 + [[ -d $TESTDIR_NOTEXISTING ]] && log_must $RM -r $TESTDIR_NOTEXISTING +} + +log_assert "Setting a valid mountpoint to file system, it must be successful." +log_onexit cleanup + +old_fs_mpt=$(get_prop mountpoint $TESTPOOL/$TESTFS) +[[ $? != 0 ]] && \ + log_fail "Get the $TESTPOOL/$TESTFS mountpoint error." +old_ctr_mpt=$(get_prop mountpoint $TESTPOOL/$TESTCTR) +[[ $? != 0 ]] && \ + log_fail "Get the $TESTPOOL/$TESTCTR mountpoint error." + +if [[ ! -d $TESTDIR2 ]]; then + log_must $MKDIR $TESTDIR2 +fi + +typeset -i i=0 +typeset -i j=0 +while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#values[@]} )); do + if [[ ${dataset[i]} == "$TESTPOOL/$TESTVOL" ]]; then + set_n_check_prop "${values[j]}" "mountpoint" \ + "${dataset[i]}" "false" + else + set_n_check_prop "${values[j]}" "mountpoint" \ + "${dataset[i]}" + fi + (( j += 1 )) + done + cleanup + (( i += 1 )) +done + +log_pass "Setting mountpoint to filesystem pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_002_pos.ksh new file mode 100644 index 0000000000..d827fbe82f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_002_pos.ksh @@ -0,0 +1,98 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# If ZFS is currently managing the file system but it is currently unmoutned, +# and the mountpoint property is changed, the file system remains unmounted. +# +# STRATEGY: +# 1. Setup a pool and create fs, ctr within it. +# 2. Unmount that dataset +# 2. Change the mountpoint to the valid mountpoint value. +# 3. Check the file system remains unmounted. +# + +verify_runnable "both" + +export TESTDIR_NOTEXISTING=${TEST_BASE_DIR%%/}/testdir_notexisting$$ + +set -A dataset "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" + +set -A values "$TESTDIR2" "$TESTDIR_NOTEXISTING" + +function cleanup +{ + log_must $ZFS set mountpoint=$old_ctr_mpt $TESTPOOL/$TESTCTR + log_must $ZFS set mountpoint=$old_fs_mpt $TESTPOOL/$TESTFS + log_must $ZFS mount -a + [[ -d $TESTDIR2 ]] && log_must $RM -r $TESTDIR2 + [[ -d $TESTDIR_NOTEXISTING ]] && log_must $RM -r $TESTDIR_NOTEXISTING +} + +log_assert "Setting a valid mountpoint for an unmounted file system, \ + it remains unmounted." +log_onexit cleanup + +old_fs_mpt=$(get_prop mountpoint $TESTPOOL/$TESTFS) +[[ $? != 0 ]] && \ + log_fail "Unable to get the mountpoint property for $TESTPOOL/$TESTFS" +old_ctr_mpt=$(get_prop mountpoint $TESTPOOL/$TESTCTR) +[[ $? != 0 ]] && \ + log_fail "Unable to get the mountpoint property for $TESTPOOL/$TESTCTR" + +if [[ ! -d $TESTDIR2 ]]; then + log_must $MKDIR $TESTDIR2 +fi + +typeset -i i=0 +typeset -i j=0 +while (( i < ${#dataset[@]} )); do + j=0 + if ismounted ${dataset[i]} ; then + log_must $ZFS unmount ${dataset[i]} + fi + log_mustnot ismounted ${dataset[i]} + while (( j < ${#values[@]} )); do + set_n_check_prop "${values[j]}" "mountpoint" \ + "${dataset[i]}" + log_mustnot ismounted ${dataset[i]} + (( j += 1 )) + done + cleanup + (( i += 1 )) +done + +log_pass "Setting a valid mountpoint for an unmounted file system, \ + it remains unmounted." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_003_pos.ksh new file mode 100644 index 0000000000..507e167fbb --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/mountpoint_003_pos.ksh @@ -0,0 +1,98 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify FSType-specific option works well with legacy mount. +# +# STRATEGY: +# 1. Set up FSType-specific options and expected keywords array. +# 2. Create a test ZFS file system and set mountpoint=legacy. +# 3. Mount ZFS test filesystem with specific options. +# 4. Verify the filesystem was mounted with specific option. +# 5. Loop check all the options. +# + +verify_runnable "both" + +function cleanup +{ + ismounted $tmpmnt && log_must $UMOUNT $tmpmnt + [[ -d $tmpmnt ]] && log_must $RM -rf $tmpmnt + [[ -n $oldmpt ]] && log_must $ZFS set mountpoint=$oldmpt $testfs + ! ismounted $oldmpt && log_must $ZFS mount $testfs +} + +log_assert "With legacy mount, FSType-specific option works well." +log_onexit cleanup + +# +# /mnt on pool/fs read/write/setuid/devices/noexec/xattr/atime/dev=2d9009e +# +# FSType- FSType- +# specific Keyword specific Keyword +# option option +# +set -A args \ + "devices" "/devices/" "nodevices" "/nodevices/" \ + "exec" "/exec/" "noexec" "/noexec/" \ + "nbmand" "/nbmand/" "nonbmand" "/nonbmand/" \ + "ro" "read only" "rw" "read/write" \ + "setuid" "/setuid/" "nosetuid" "/nosetuid/" \ + "xattr" "/xattr/" "noxattr" "/noxattr/" \ + "atime" "/atime/" "noatime" "/noatime/" + +tmpmnt=/tmpmnt.$$ +[[ -d $tmpmnt ]] && $RM -rf $tmpmnt +testfs=$TESTPOOL/$TESTFS +log_must $MKDIR $tmpmnt +oldmpt=$(get_prop mountpoint $testfs) +log_must $ZFS set mountpoint=legacy $testfs + +typeset i=0 +while ((i < ${#args[@]})); do + log_must $MOUNT -F zfs -o ${args[$i]} $testfs $tmpmnt + msg=$($MOUNT | $GREP "^$tmpmnt ") + + # In LZ, a user with all zone privileges can never with "devices" + if ! is_global_zone && [[ ${args[$i]} == devices ]] ; then + args[((i+1))]="/nodevices/" + fi + + $ECHO $msg | $GREP "${args[((i+1))]}" > /dev/null 2>&1 + if (($? != 0)) ; then + log_fail "Expected option: ${args[((i+1))]} \n" \ + "Real option: $msg" + fi + + log_must $UMOUNT $tmpmnt + ((i += 2)) +done + +log_pass "With legacy mount, FSType-specific option works well passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/onoffs_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/onoffs_001_pos.ksh new file mode 100644 index 0000000000..41ff4b7eaa --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/onoffs_001_pos.ksh @@ -0,0 +1,99 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting a valid value to atime, readonly, setuid or zoned on file +# system or volume. It should be successful. +# +# STRATEGY: +# 1. Create pool and filesystem & volume within it. +# 2. Setting valid value, it should be successful. +# + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS mount -a +} + +log_onexit cleanup + +set -A props "atime" "readonly" "setuid" "zoned" +set -A values "on" "off" + +if is_global_zone ; then + set -A dataset "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTVOL" +else + set -A dataset "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR" +fi + +log_assert "Setting a valid value to atime, readonly, setuid or zoned on file" \ + "system or volume. It should be successful." + +typeset -i i=0 +typeset -i j=0 +typeset -i k=0 +while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#props[@]} )); do + k=0 + while (( k < ${#values[@]} )); do + if [[ ${dataset[i]} == "$TESTPOOL/$TESTVOL" && \ + ${props[j]} != "readonly" ]] + then + set_n_check_prop "${values[k]}" "${props[j]}" \ + "${dataset[i]}" "false" + elif [[ ${props[j]} == "zoned" ]] ; then + if is_global_zone ; then + set_n_check_prop \ + "${values[k]}" "${props[j]}" \ + "${dataset[i]}" + else + set_n_check_prop \ + "${values[k]}" "${props[j]}" \ + "${dataset[i]}" "false" + fi + + else + set_n_check_prop "${values[k]}" "${props[j]}" \ + "${dataset[i]}" + fi + + (( k += 1 )) + done + (( j += 1 )) + done + (( i += 1 )) +done + +log_pass "Setting a valid value to atime, readonly, setuid or zoned on file" \ + "system or volume pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/property_alias_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/property_alias_001_pos.ksh new file mode 100644 index 0000000000..d2f8cee928 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/property_alias_001_pos.ksh @@ -0,0 +1,140 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Verify the properties with aliases also work with those aliases +# +# STRATEGY: +# 1. Create pool, then create filesystem & volume within it. +# 2. Set or retrieve property via alias with datasets. +# 3. Verify the result should be successful. +# + +verify_runnable "both" + +function set_and_check #<dataset><set_prop_name><set_value><check_prop_name> +{ + typeset ds=$1 + typeset setprop=$2 + typeset setval=$3 + typeset chkprop=$4 + typeset getval + + log_must $ZFS set $setprop=$setval $ds + if [[ $setval == "gzip-6" ]]; then + setval="gzip" + fi + getval=$(get_prop $chkprop $ds) + + case $setprop in + reservation|reserv ) + if [[ $setval == "none" ]]; then + [[ $getval != "0" ]] && \ + log_fail "Setting the property $setprop" \ + "with value $setval fails." + elif [[ $getval != $setval ]]; then + log_fail "Setting the property $setprop with" \ + "with $setval fails." + fi + ;; + * ) + [[ $getval != $setval ]] && \ + log_fail "Setting the property $setprop with value \ + $setval fails." + ;; + esac +} + +log_assert "Properties with aliases also work with those aliases." + +set -A ro_prop "available" "avail" "referenced" "refer" +set -A rw_prop "readonly" "rdonly" "compression" "compress" "reservation" "reserv" +set -A chk_prop "rdonly" "readonly" "compress" "compression" "reserv" "reservation" +set -A size "512" "1024" "2048" "4096" "8192" "16384" "32768" "65536" "131072" + +pool=$TESTPOOL +fs=$TESTPOOL/$TESTFS +vol=$TESTPOOL/$TESTVOL +typeset -l avail_space=$(get_prop avail $pool) +typeset -l reservsize +typeset -i i=0 + +for ds in $pool $fs $vol; do + for propname in ${ro_prop[*]}; do + $ZFS get -pH -o value $propname $ds >/dev/null 2>&1 + (( $? != 0 )) && \ + log_fail "Get the property $proname of $ds failed." + done + i=0 + while (( i < ${#rw_prop[*]} )); do + case ${rw_prop[i]} in + readonly|rdonly ) + for val in "on" "off"; do + set_and_check $ds ${rw_prop[i]} $val ${chk_prop[i]} + done + ;; + compression|compress ) + for val in $(get_compress_opts zfs_set); do + set_and_check $ds ${rw_prop[i]} $val ${chk_prop[i]} + done + ;; + reservation|reserv ) + (( reservsize = $avail_space % $RANDOM )) + for val in "0" "$reservsize" "none"; do + set_and_check $ds ${rw_prop[i]} $val ${chk_prop[i]} + done + ;; + esac + + (( i = i + 1 )) + done + if [[ $ds == $vol ]]; then + for propname in "volblocksize" "volblock" ; do + $ZFS get -pH -o value $propname $ds >/dev/null 2>&1 + (( $? != 0 )) && \ + log_fail "Get the property $propname of $ds failed." + done + fi +done + +for ds in $pool $fs; do + for propname in "recordsize" "recsize"; do + for val in ${size[*]}; do + if [[ $propname == "recordsize" ]]; then + set_and_check $ds $propname $val "recsize" + else + set_and_check $ds $propname $val "recordsize" + fi + done + done +done + +log_pass "The alias of a property works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/readonly_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/readonly_001_pos.ksh new file mode 100644 index 0000000000..b59333b775 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/readonly_001_pos.ksh @@ -0,0 +1,154 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting readonly on a dataset, it should keep the dataset as readonly. +# +# STRATEGY: +# 1. Create pool, then create filesystem and volume within it. +# 2. Setting readonly to each dataset. +# 3. Check the return value and make sure it is 0. +# 4. Verify the stuff under mountpoint is readonly. +# + +verify_runnable "both" + +function cleanup +{ + for dataset in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL ; do + snapexists ${dataset}@$TESTSNAP && \ + log_must $ZFS destroy -R ${dataset}@$TESTSNAP + done +} + +function initial_dataset # $1 dataset +{ + typeset dataset=$1 + + typeset fstype=$(get_prop type $dataset) + + if [[ $fstype == "filesystem" ]] ; then + typeset mtpt=$(get_prop mountpoint $dataset) + log_must $TOUCH $mtpt/$TESTFILE0 + log_must $MKDIR -p $mtpt/$TESTDIR0 + fi +} + + +function cleanup_dataset # $1 dataset +{ + typeset dataset=$1 + + typeset fstype=$(get_prop type $dataset) + + if [[ $fstype == "filesystem" ]] ; then + typeset mtpt=$(get_prop mountpoint $dataset) + log_must $RM -f $mtpt/$TESTFILE0 + log_must $RM -rf $mtpt/$TESTDIR0 + fi +} + +function verify_readonly # $1 dataset, $2 on|off +{ + typeset dataset=$1 + typeset value=$2 + + if datasetnonexists $dataset ; then + log_note "$dataset not exist!" + return 1 + fi + + typeset fstype=$(get_prop type $dataset) + + expect="log_must" + + if [[ $2 == "on" ]] ; then + expect="log_mustnot" + fi + + case $fstype in + filesystem) + typeset mtpt=$(get_prop mountpoint $dataset) + $expect $TOUCH $mtpt/$TESTFILE1 + $expect $MKDIR -p $mtpt/$TESTDIR1 + $expect $ECHO 'y' | $RM $mtpt/$TESTFILE0 + $expect $RMDIR $mtpt/$TESTDIR0 + + if [[ $expect == "log_must" ]] ; then + log_must $ECHO 'y' | $RM $mtpt/$TESTFILE1 + log_must $RMDIR $mtpt/$TESTDIR1 + log_must $TOUCH $mtpt/$TESTFILE0 + log_must $MKDIR -p $mtpt/$TESTDIR0 + fi + ;; + volume) + $expect eval "$ECHO 'y' | $NEWFS /dev/zvol/dsk/$dataset > /dev/null 2>&1" + ;; + *) + ;; + esac + + return 0 +} + +log_onexit cleanup + +log_assert "Setting a valid readonly property on a dataset succeeds." + +typeset all_datasets + +log_must $ZFS mount -a + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP +log_must $ZFS clone $TESTPOOL/$TESTFS@$TESTSNAP $TESTPOOL/$TESTCLONE + +if is_global_zone ; then + log_must $ZFS snapshot $TESTPOOL/$TESTVOL@$TESTSNAP + log_must $ZFS clone $TESTPOOL/$TESTVOL@$TESTSNAP $TESTPOOL/$TESTCLONE1 + all_datasets="$TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCLONE $TESTPOOL/$TESTCLONE1" +else + all_datasets="$TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTCLONE" +fi + + +for dataset in $all_datasets; do + for value in on off; do + set_n_check_prop "off" "readonly" "$dataset" + initial_dataset $dataset + + set_n_check_prop "$value" "readonly" "$dataset" + verify_readonly $dataset $value + + set_n_check_prop "off" "readonly" "$dataset" + cleanup_dataset $dataset + done +done + +log_pass "Setting a valid readonly property on a dataset succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/reservation_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/reservation_001_neg.ksh new file mode 100644 index 0000000000..511a506ab9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/reservation_001_neg.ksh @@ -0,0 +1,97 @@ +#! /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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Valid reservation values should be positive integers only. +# +# STRATEGY: +# 1) Form an array of invalid reservation values (negative and +# incorrectly formed) +# 2) Attempt to set each invalid reservation value in turn on a +# filesystem and volume. +# 3) Verify that attempt fails and the reservation value remains +# unchanged +# + +verify_runnable "both" + +log_assert "Verify invalid reservation values are rejected" + +set -A suffix "b" "k" "m" "t" "p" "e" "K" "M" "G" "T" "P" "E" "kb" "Mb" "Gb" \ + "Tb" "Pb" "Eb" "KB" "MB" "GB" "TB" "PB" "EB" + +set -A values '' '-1' '-1.0' '-1.8' '-9999999999999999' '0x1' '0b' '1b' '1.1b' + +# +# Function to loop through a series of bad reservation +# values, checking they are when we attempt to set them +# on a dataset. +# +function set_n_check # data-set +{ + typeset obj=$1 + typeset -i i=0 + typeset -i j=0 + + orig_resv_val=$(get_prop reservation $obj) + + while (( $i < ${#values[*]} )); do + j=0 + while (( $j < ${#suffix[*]} )); do + + $ZFS set \ + reservation=${values[$i]}${suffix[$j]} $obj \ + > /dev/null 2>&1 + if [ $? -eq 0 ] + then + log_note "$ZFS set \ + reservation=${values[$i]}${suffix[$j]} $obj" + log_fail "The above reservation set returned 0!" + fi + + new_resv_val=$(get_prop reservation $obj) + + if [[ $new_resv_val != $orig_resv_val ]]; then + log_fail "$obj : reservation values changed " \ + "($orig_resv_val : $new_resv_val)" + fi + (( j = j + 1 )) + done + + (( i = i + 1 )) + done +} + +for dataset in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCTR $TESTPOOL/$TESTVOL +do + set_n_check $dataset +done + +log_pass "Invalid reservation values correctly rejected" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/ro_props_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/ro_props_001_pos.ksh new file mode 100644 index 0000000000..c9a7391092 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/ro_props_001_pos.ksh @@ -0,0 +1,113 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Verify that read-only properties are immutable. +# +# STRATEGY: +# 1. Create pool, fs, vol, fs@snap & vol@snap. +# 2. Get the original property value and set value to those properties. +# 3. Check return value. +# 4. Compare the current property value with the original one. +# + +verify_runnable "both" + +set -A values filesystem volume snapshot -3 0 1 50K 10G 80G \ + 2005/06/17 30K 20x yes no \ + on off default pool/fs@snap $TESTDIR +set -A dataset $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTCTR/$TESTFS1 $TESTPOOL/$TESTFS@$TESTSNAP \ + $TESTPOOL/$TESTVOL@$TESTSNAP +typeset ro_props="type used available avail creation referenced refer compressratio \ + mounted origin" +typeset snap_ro_props="volsize recordsize recsize quota reservation reserv mountpoint \ + sharenfs checksum compression compress atime devices exec readonly rdonly \ + setuid zoned" + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + snap_ro_props="$snap_ro_props version" +fi + +function cleanup +{ + datasetexists $TESTPOOL/$TESTVOL@$TESTSNAP && \ + destroy_snapshot $TESTPOOL/$TESTVOL@$TESTSNAP + datasetexists $TESTPOOL/$TESTFS@$TESTSNAP && \ + destroy_snapshot $TESTPOOL/$TESTFS@$TESTSNAP +} + +log_assert "Verify that read-only properties are immutable." +log_onexit cleanup + +# Create filesystem and volume's snapshot +create_snapshot $TESTPOOL/$TESTFS $TESTSNAP +create_snapshot $TESTPOOL/$TESTVOL $TESTSNAP + +typeset -i i=0 +typeset -i j=0 +typeset cur_value="" +typeset props="" + +while (( i < ${#dataset[@]} )); do + props=$ro_props + + dst_type=$(get_prop type ${dataset[i]}) + if [[ $dst_type == 'snapshot' ]]; then + props="$ro_props $snap_ro_props" + fi + + for prop in $props; do + cur_value=$(get_prop $prop ${dataset[i]}) + + j=0 + while (( j < ${#values[@]} )); do + # + # If the current property value is equal to values[j], + # just expect it failed. Otherwise, set it to dataset, + # expecting it failed and the property value is not + # equal to values[j]. + # + if [[ $cur_value == ${values[j]} ]]; then + log_mustnot $ZFS set $prop=${values[j]} \ + ${dataset[i]} + else + set_n_check_prop ${values[j]} $prop \ + ${dataset[i]} false + fi + (( j += 1 )) + done + done + (( i += 1 )) +done + +log_pass "Setting uneditable properties should failed. It passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/setup.ksh new file mode 100644 index 0000000000..8868747d22 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/setup.ksh @@ -0,0 +1,31 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} +default_container_volume_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/share_mount_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/share_mount_001_neg.ksh new file mode 100644 index 0000000000..05c8b637e5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/share_mount_001_neg.ksh @@ -0,0 +1,60 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Verify that we cannot share or mount legacy filesystems. +# +# STRATEGY: +# 1. Set mountpoint as legacy or none +# 2. Use zfs share or zfs mount to share or mount the filesystem +# 3. Verify that the command returns error +# + +verify_runnable "both" + +function cleanup +{ + log_must $ZFS set mountpoint=$oldmpt $fs +} + +log_assert "Verify that we cannot share or mount legacy filesystems." +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +oldmpt=$(get_prop mountpoint $fs) + +for propval in "legacy" "none"; do + log_must $ZFS set mountpoint=$propval $fs + + log_mustnot $ZFS mount $fs + log_mustnot $ZFS share $fs +done + +log_pass "We cannot share or mount legacy filesystems as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/snapdir_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/snapdir_001_pos.ksh new file mode 100644 index 0000000000..9abd0ec8e8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/snapdir_001_pos.ksh @@ -0,0 +1,108 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting a valid snapdir on a dataset, it should be successful. +# +# STRATEGY: +# 1. Create pool, then create filesystem and volume within it. +# 2. Create a snapshot for each dataset. +# 3. Setting different valid snapdir to each dataset. +# 4. Check the return value and make sure it is 0. +# 5. Verify .zfs directory is hidden|visible according to the snapdir setting. +# + +verify_runnable "both" + +function cleanup +{ + for dataset in $all_datasets; do + snapexists ${dataset}@snap && \ + log_must $ZFS destroy ${dataset}@snap + done +} + +function verify_snapdir_visible # $1 dataset, $2 hidden|visible +{ + typeset dataset=$1 + typeset value=$2 + typeset mtpt=$(get_prop mountpoint $dataset) + typeset name + + for name in `$LS -a $mtpt`; do + if [[ $name == ".zfs" ]]; then + if [[ $value == "visible" ]]; then + return 0 + else + return 1 + fi + fi + done + + if [[ $value == "visible" ]]; then + return 1 + else + return 0 + fi +} + + +typeset all_datasets + +if is_global_zone ; then + all_datasets="$TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL" +else + all_datasets="$TESTPOOL $TESTPOOL/$TESTFS" +fi + +log_onexit cleanup + +for dataset in $all_datasets; do + log_must $ZFS snapshot ${dataset}@snap +done + +log_assert "Setting a valid snapdir property on a dataset succeeds." + +for dataset in $all_datasets; do + for value in hidden visible; do + if [[ $dataset == "$TESTPOOL/$TESTVOL" ]] ; then + set_n_check_prop "$value" "snapdir" \ + "$dataset" "false" + else + set_n_check_prop "$value" "snapdir" \ + "$dataset" + verify_snapdir_visible $dataset $value + [[ $? -eq 0 ]] || \ + log_fail "$dataset/.zfs is not $value as expect." + fi + done +done + +log_pass "Setting a valid snapdir property on a dataset succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_001_pos.ksh new file mode 100644 index 0000000000..be8c88c0ca --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_001_pos.ksh @@ -0,0 +1,65 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# ZFS can set any valid user defined property to the non-readonly dataset. +# +# STRATEGY: +# 1. Loop pool, fs and volume. +# 2. Combine all kind of valid characters into a valid user defined +# property name. +# 3. Random get a string as the value. +# 4. Verify all the valid user defined properties can be set to the +# dataset in #1. +# + +verify_runnable "both" + +log_assert "ZFS can set any valid user defined property to the non-readonly " \ + "dataset." +log_onexit cleanup_user_prop $TESTPOOL + +typeset -i i=0 +while ((i < 10)); do + typeset -i len + ((len = RANDOM % 32)) + typeset user_prop=$(valid_user_property $len) + ((len = RANDOM % 512)) + typeset value=$(user_property_value $len) + + for dtst in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL; do + log_must eval "$ZFS set $user_prop='$value' $dtst" + log_must eval "check_user_prop $dtst $user_prop '$value'" + done + + ((i += 1)) +done + +log_pass "ZFS can set any valid user defined property passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_002_pos.ksh new file mode 100644 index 0000000000..24fecfba1f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_002_pos.ksh @@ -0,0 +1,118 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# User defined property are always inherited from its parent dataset +# directly. +# +# STRATEGY: +# 1. Create pool, fs, volume, fsclone & volclone. +# 2. Get random user property name and set to the pool +# 3. Verify all dataset user property inherit from pool. +# 4. Set intermediate dataset and verify its children will inherit user +# property from it directly. +# + +verify_runnable "both" + +function cleanup +{ + datasetexists $new_vol && log_must $ZFS rename $new_vol $vol + + typeset dtst + for dtst in $new_fsclone $new_volclone $fsclone $volclone \ + $fssnap $volsnap; do + if datasetexists $dtst; then + log_must $ZFS destroy -f $dtst + fi + done + + cleanup_user_prop $pool +} + +# +# Verify options datasets (3-n) inherit from the inherited dataset $2. +# +# $1 user property +# $2 inherited dataset +# $3-n datasets +# +function inherit_check +{ + typeset prop=$1 + typeset inherited_dtst=$2 + shift 2 + [[ -z $@ ]] && return 1 + + typeset inherited_value=$(get_prop $prop $inherited_dtst) + for dtst in $@; do + typeset value=$(get_prop $prop $dtst) + typeset source=$(get_source $prop $dtst) + if [[ "$value" != "$inherited_value" || \ + "$source" != "inherited from $inherited_dtst" ]] + then + return 1 + fi + + shift + done + + return 0 +} + +log_assert "User defined property inherited from its parent." +log_onexit cleanup + +pool=$TESTPOOL; fs=$pool/$TESTFS; vol=$pool/$TESTVOL +fssnap=$fs@snap; volsnap=$vol@snap; +log_must $ZFS snapshot $fssnap +log_must $ZFS snapshot $volsnap +fsclone=$pool/fsclone; volclone=$pool/volclone +log_must $ZFS clone $fssnap $fsclone +log_must $ZFS clone $volsnap $volclone + +prop_name=$(valid_user_property 10) +value=$(user_property_value 16) +log_must eval "$ZFS set $prop_name='$value' $pool" +log_must eval "check_user_prop $pool $prop_name '$value'" +log_must inherit_check $prop_name $pool $fs $vol $fsclone $volclone + +new_fsclone=$fs/fsclone; new_volclone=$fs/volclone +log_must $ZFS rename $fsclone $new_fsclone +log_must $ZFS rename $volclone $new_volclone +log_must inherit_check $prop_name $pool $fs $new_fsclone $new_volclone + +log_note "Set intermediate dataset will change the inherited relationship." +new_value=$(user_property_value 16) +log_must eval "$ZFS set $prop_name='$new_value' $fs" +log_must eval "check_user_prop $fs $prop_name '$new_value'" +log_must inherit_check $prop_name $fs $new_fsclone $new_volclone + +log_pass "User defined property inherited from its parent passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_003_neg.ksh new file mode 100644 index 0000000000..4c1c1bca82 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_003_neg.ksh @@ -0,0 +1,63 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# ZFS can handle any invalid user defined property. +# +# STRATEGY: +# 1. Loop pool, fs and volume. +# 2. Combine all kind of invalid user property names. +# 3. Random get a string as the value. +# 4. Verify all the invalid user defined properties can not be set to the +# dataset in #1. +# + +verify_runnable "both" + +log_assert "ZFS can handle invalid user property." +log_onexit cleanup_user_prop $TESTPOOL + +typeset -i i=0 +while ((i < 10)); do + typeset -i len + ((len = RANDOM % 32)) + typeset user_prop=$(invalid_user_property $len) + ((len = RANDOM % 512)) + typeset value=$(user_property_value $len) + + for dtst in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL ; do + log_mustnot $ZFS set $user_prop=$value $dtst + log_mustnot check_user_prop $dtst \"$user_prop\" \"$value\" + done + + ((i += 1)) +done + +log_pass "ZFS can handle invalid user property passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_004_pos.ksh new file mode 100644 index 0000000000..1bce7a75c9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/user_property_004_pos.ksh @@ -0,0 +1,97 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# User property has no effect to snapshot until 'Snapshot properties' supported. +# +# STRATEGY: +# 1. Verify user properties could be transformed by 'zfs snapshot' +# 2. Verify user properties could be set upon snapshot. +# + +verify_runnable "both" + +function cleanup +{ + for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + if datasetexists $fssnap ; then + log_must $ZFS destroy -f $fssnap + fi + done + cleanup_user_prop $TESTPOOL +} + +function nonexist_user_prop +{ + typeset user_prop=$1 + typeset dtst=$2 + + typeset source=$(get_source $user_prop $dtst) + typeset value=$(get_prop $user_prop $dtst) + if [[ $source == '-' && $value == '-' ]]; then + return 0 + else + return 1 + fi +} + +log_assert "User property has no effect to snapshot until 'Snapshot properties' supported." +log_onexit cleanup + +typeset snap_property= + +$ZPOOL upgrade -v | $GREP "Snapshot properties" > /dev/null 2>&1 +if (( $? == 0 )) ; then + snap_property="true" +fi + +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + prop_name=$(valid_user_property 10) + value=$(user_property_value 16) + log_must eval "$ZFS set $prop_name='$value' $fs" + log_must eval "check_user_prop $fs $prop_name '$value'" + + log_must $ZFS snapshot $fssnap + + if [[ -n $snap_property ]] ; then + log_mustnot nonexist_user_prop $prop_name $fssnap + + log_must eval "$ZFS set $prop_name='$value' $fssnap" + log_mustnot nonexist_user_prop $prop_name $fssnap + else + log_must nonexist_user_prop $prop_name $fssnap + log_mustnot eval "$ZFS set $prop_name='$value' $fssnap" + log_must nonexist_user_prop $prop_name $fssnap + fi +done + +log_pass "User properties has effect upon snapshot." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/version_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/version_001_neg.ksh new file mode 100644 index 0000000000..40a541a9e8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/version_001_neg.ksh @@ -0,0 +1,87 @@ +#! /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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# Valid version values should be positive integers only. +# +# STRATEGY: +# 1) Form an array of invalid reservation values (negative and +# incorrectly formed) +# 2) Attempt to set each invalid version value in turn on a +# filesystem and volume. +# 3) Verify that attempt fails and the version value remains +# unchanged +# + +verify_runnable "both" + +log_assert "Verify invalid version values are rejected" + +typeset values=('' '-1' '-1.0' '-1.8' '-9999999999999999' \ + '0x1' '0b' '1b' '1.1b' '0' '0.000' '1.234') + +# +# Function to loop through a series of bad reservation +# values, checking they are when we attempt to set them +# on a dataset. +# +function set_n_check # data-set +{ + typeset obj=$1 + typeset -i i=0 + typeset -i j=0 + + orig_val=$(get_prop version $obj) + + while (($i < ${#values[*]})); do + $ZFS set version=${values[$i]} $obj > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + log_note "$ZFS set version=${values[$i]} $obj" + log_fail "The above version set returned 0!" + fi + + new_val=$(get_prop version $obj) + + if [[ $new_val != $orig_val ]]; then + log_fail "$obj : version values changed " \ + "($orig_val : $new_val)" + fi + + ((i = i + 1)) + done +} + +for dataset in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCTR $TESTPOOL/$TESTVOL +do + set_n_check $dataset +done + +log_pass "Invalid version values correctly rejected" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_001_neg.ksh new file mode 100644 index 0000000000..20180bfcad --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_001_neg.ksh @@ -0,0 +1,75 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# Setting invalid value to mountpoint, checksum, atime, readonly, setuid, +# zoned or canmount on a file system, volume. It should be failed. +# +# STRATEGY: +# 1. Create pool, then create file system & volume within it. +# 2. Setting invalid value, it should be failed. +# + +verify_runnable "both" + +set -A props "" "mountpoint" "checksum" "compression" "atime" "readonly" \ + "setuid" "zoned" "canmount" + +set -A values "" "mountpoint" "checksum" "compression" "atime" "readonly" \ + "setuid" "zoned" "0" "-?" "-on" "--on" "*" "?" "Legacy" "NONE" "oN" \ + "On" "ON" "ofF" "OFf" "oFF" "Off" "OfF" "OFF" "LzJb" "lZJb" "LZjB" \ + "blad" "default" "TESTPOOL" "$TESTPOOL/$TESTCTR" \ + "$TESTPOOL/$TESTCTR/$TESTFS" "$TESTPOOL/$TESTFS" +set -A dataset "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTVOL" + +log_assert "Setting invalid value to mountpoint, checksum, compression, atime,"\ + "readonly, setuid, zoned or canmount on a file system file system or volume." \ + "It should be failed." + +typeset -i i=0 +typeset -i j=0 +typeset -i k=0 +while (( i < ${#dataset[@]} )); do + j=0 + while (( j < ${#props[@]} )); do + k=0 + while (( k < ${#values[@]} )); do + set_n_check_prop "${values[k]}" "${props[j]}" \ + "${dataset[i]}" false + (( k += 1 )) + done + (( j += 1 )) + done + (( i += 1 )) +done + +log_pass "Setting invalid value to mountpoint, checksum, compression, atime, " \ + "readonly, setuid, zoned or canmount on file system or volume pass." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_002_neg.ksh new file mode 100644 index 0000000000..619a1ee011 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_002_neg.ksh @@ -0,0 +1,62 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2011 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# 'zfs set' should fail with invalid arguments +# +# STRATEGY: +# 1. Create an array of invalid arguments +# 1. Run zfs set with each invalid argument +# 2. Verify that zfs set returns error +# + +verify_runnable "both" + +log_assert "'zfs set' fails with invalid arguments" + +set -A editable_props "quota" "reservation" "reserv" "volsize" "recordsize" "recsize" \ + "mountpoint" "checksum" "compression" "compress" "atime" \ + "devices" "exec" "setuid" "readonly" "zoned" "snapdir" "aclmode" \ + "aclinherit" "canmount" "xattr" "copies" "version" + +for ds in $TESTPOOL $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL \ + $TESTPOOL/$TESTFS@$TESTSNAP; do + for badarg in "" "-" "-?"; do + for prop in ${editable_props[@]}; do + log_mustnot eval "$ZFS set $badarg $prop= $ds >/dev/null 2>&1" + done + done +done + +log_pass "'zfs set' fails with invalid arguments as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_003_neg.ksh new file mode 100644 index 0000000000..13260f1623 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_003_neg.ksh @@ -0,0 +1,73 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# 'zfs set mountpoint/sharenfs' should fail when the mountpoint is invlid +# +# STRATEGY: +# 1. Create invalid scenarios +# 2. Run zfs set mountpoint/sharenfs with invalid value +# 3. Verify that zfs set returns expected errors +# + +verify_runnable "both" + +function cleanup +{ + if [ -e $badpath ]; then + $RM -f $badpath + fi + if datasetexists $TESTPOOL/foo; then + log_must $ZFS destroy $TESTPOOL/foo + fi +} + +log_assert "'zfs set mountpoint/sharenfs' fails with invalid scenarios" +log_onexit cleanup + +badpath=/tmp/foo1.$$ +$TOUCH $badpath +longpath=$(gen_dataset_name 1030 "abcdefg") + +log_must $ZFS create -o mountpoint=legacy $TESTPOOL/foo + +# Do the negative testing about "property may be set but unable to remount filesystem" +log_mustnot eval "$ZFS set mountpoint=$badpath $TESTPOOL/foo >/dev/null 2>&1" + +# Do the negative testing about "property may be set but unable to reshare filesystem" +log_mustnot eval "$ZFS set sharenfs=on $TESTPOOL/foo >/dev/null 2>&1" + +# Do the negative testing about "sharenfs property can not be set to null" +log_mustnot eval "$ZFS set sharenfs= $TESTPOOL/foo >/dev/null 2>&1" + +# Do the too long pathname testing (>1024) +log_mustnot eval "$ZFS set mountpoint=/$longpath $TESTPOOL/foo >/dev/null 2>&1" + +log_pass "'zfs set mountpoint/sharenfs' fails with invalid scenarios as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib new file mode 100644 index 0000000000..17c954cd51 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib @@ -0,0 +1,260 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +set -A VALID_NAME_CHAR a b c d e f g h i j k l m n o p q r s t u v w x y z \ + 0 1 2 3 4 5 6 7 8 9 ':' '-' '.' '_' +set -A INVALID_NAME_CHAR A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ + '`' '~' '!' '@' '#' '$' '%' '^' '&' '(' ')' '+' '=' '|' "\\" '{' '[' ']' \ + '}' ';' '"' '<' ',' '>' '?' '/' ' ' +set -A ALL_CHAR ${VALID_NAME_CHAR[*]} ${INVALID_NAME_CHAR[*]} + +# +# Firstly, set the property value to dataset. Then checking if the property +# value is equal with the expected value, according to the expected result. +# +# $1 property value +# $2 property name +# $3 dataset +# $4 expected result +# +function set_n_check_prop +{ + typeset expect_value=$1 + typeset prop=$2 + typeset dataset=$3 + typeset expect_result=${4:-true} + + typeset old_value="" + typeset cur_value="" + + [[ -n $prop ]] && old_value=$(get_prop $prop $dataset) + + if [[ $expect_result == true ]]; then + [[ -z $prop || -z $dataset ]] && \ + log_fail "property or dataset isn't defined." + + log_must $ZFS set $prop=$expect_value $dataset + if [[ $expect_value == "gzip-6" ]]; then + expect_value="gzip" + fi + + [[ -n $prop ]] && cur_value=$(get_prop $prop $dataset) + + case $prop in + reservation|reserv|quota ) + if [[ $expect_value == "none" ]]; then + [[ $cur_value != "0" ]] && \ + log_fail "The '$dataset' '$prop' value \ + '$cur_value' is not expected." + elif [[ $cur_value != $expect_value ]]; then + log_fail "The '$dataset' '$prop' value '$cur_value' \ + does not equal the expected value '$expect_value'." + fi + ;; + * ) + if [[ $cur_value != $expect_value ]]; then + log_fail "The '$dataset' '$prop' value '$cur_value' \ + does not equal the expected value '$expect_value'." + fi + ;; + esac + + else + log_mustnot $ZFS set $prop=$expect_value $dataset + + [[ -n $prop ]] && cur_value=$(get_prop $prop $dataset) + + if [[ "$expect_value" != "" && "$cur_value" != "$old_value" ]]; + then + log_fail "The '$dataset' '$prop' value '$cur_value' \ + should equal with '$old_value'." + fi + fi +} + +# +# Cleanup all the user properties of the pool and the dataset reside it. +# +# $1 pool name +# +function cleanup_user_prop +{ + typeset pool=$1 + typeset dtst=$($ZFS list -H -r -o name -t filesystem,volume $pool) + + typeset user_prop + for dt in $dtst; do + user_prop=$($ZFS get -H -o property all $dtst | grep ":") + + typeset prop + for prop in $user_prop; do + $ZFS inherit $prop $dt + (($? != 0)) && log_must $ZFS inherit $prop $dt + done + done +} + +# +# Random select charactor from the specified charactor set and combine into a +# random string +# +# $1 character set name +# $2 String length +# +function random_string +{ + typeset char_set=${1:-VALID_NAME_CHAR} + typeset -i len=${2:-5} + + eval typeset -i count=\${#$char_set[@]} + + typeset str + typeset -i i=0 + while ((i < len)); do + typeset -i ind + ((ind = RANDOM % count)) + eval str=\${str}\${$char_set[\$ind]} + + ((i += 1)) + done + + $ECHO "$str" +} + +# +# Get vaild user defined property name +# +# $1 user defined property name length +# +function valid_user_property +{ + typeset -i sumlen=${1:-10} + ((sumlen < 2 )) && sumlen=2 + typeset -i len + ((len = RANDOM % sumlen)) + typeset part1 part2 + + while true; do + part1="$(random_string VALID_NAME_CHAR $len)" + if [[ "$part1" == "-"* ]]; then + continue + fi + break + done + ((len = sumlen - (len + 1))) + + while true; do + part2="$(random_string VALID_NAME_CHAR $len)" + if [[ -z $part1 && -z $part2 ]]; then + continue + fi + break + done + + $ECHO "${part1}:${part2}" +} + +# +# Get invaild user defined property name +# +# $1 user defined property name length +# +function invalid_user_property +{ + typeset -i sumlen=${1:-10} + ((sumlen == 0)) && sumlen=1 + typeset -i len + ((len = RANDOM % sumlen)) + + typeset part1 part2 + while true; do + part1="$(random_string VALID_NAME_CHAR $len)" + ((len = sumlen - len)) + part2="$(random_string INVALID_NAME_CHAR $len)" + + # Avoid $part1 is *:* and $part2 is "=*" + if [[ "$part1" == *":"* && "$part2" == "="* ]]; then + continue + fi + break + done + + $ECHO "${part1}${part2}" +} + +# +# Get user property value +# +# $1 user defined property name length +# +function user_property_value +{ + typeset -i len=${1:-100} + + typeset value=$(random_string ALL_CHAR $len) + + $ECHO "$value" +} + +# +# Check if the user property is identical to the expected value. +# +# $1 dataset +# $2 user property +# $3 expected value +# +function check_user_prop +{ + typeset dtst=$1 + typeset user_prop="$2" + typeset expect_value="$3" + typeset value=$($ZFS get -p -H -o value "$user_prop" $dtst 2>&1) + + if [[ "$expect_value" == "$value" ]]; then + return 0 + else + return 1 + fi +} + +# +# Get source of the dataset +# +function get_source +{ + typeset prop=$1 + typeset dataset=$2 + typeset source + + source=$($ZFS get -H -o source $prop $dataset) + if (($? != 0)); then + log_fail "Unable to get $prop source for dataset $dataset" + fi + + $ECHO "$source" +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/Makefile new file mode 100644 index 0000000000..7a0d515c11 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/Makefile @@ -0,0 +1,53 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_share + +PROGS = cleanup \ + setup \ + zfs_share_001_pos \ + zfs_share_002_pos \ + zfs_share_003_pos \ + zfs_share_004_pos \ + zfs_share_005_pos \ + zfs_share_006_pos \ + zfs_share_007_neg \ + zfs_share_008_neg \ + zfs_share_009_neg \ + zfs_share_010_neg \ + zfs_share_011_pos + +FILES = zfs_share.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/setup.ksh new file mode 100644 index 0000000000..bf935ad9f5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/setup.ksh @@ -0,0 +1,34 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# Make sure NFS server is running before testing. +setup_nfs_server + +DISK=${DISKS%% *} +default_container_volume_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share.cfg new file mode 100644 index 0000000000..5c31c8fbb6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share.cfg @@ -0,0 +1,32 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export SNAPROOT=".zfs/snapshot" +export NONEXISTFSNAME="nonexistfs50charslong_0123456789012345678901234567" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_001_pos.ksh new file mode 100644 index 0000000000..084b18d1f1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_001_pos.ksh @@ -0,0 +1,145 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that 'zfs set sharenfs' and 'zfs share' shares a given dataset. +# +# STRATEGY: +# 1. Invoke 'zfs set sharenfs'. +# 2. Verify that the file system is shared. +# 3. Invoke 'zfs share'. +# 4. Verify that the file system is shared. +# 5. Verify that a shared filesystem cannot be shared again. +# 6. Verify that share -a succeeds. +# + +verify_runnable "global" + +set -A fs \ + "$TESTDIR" "$TESTPOOL/$TESTFS" \ + "$TESTDIR1" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTDIR2" "$TESTPOOL/$TESTFS-clone" + +function cleanup +{ + typeset -i i=0 + while (( i < ${#fs[*]} )); do + log_must $ZFS set sharenfs=off ${fs[((i+1))]} + unshare_fs ${fs[i]} + + ((i = i + 2)) + done + + if mounted $TESTPOOL/$TESTFS-clone; then + log_must $ZFS unmount $TESTDIR2 + fi + + datasetexists $TESTPOOL/$TESTFS-clone && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTFS-clone + + if snapexists "$TESTPOOL/$TESTFS@snapshot"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS@snapshot + fi +} + + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# share the mountpoint and then verify it has been shared. +# +function test_share # mntp filesystem +{ + typeset mntp=$1 + typeset filesystem=$2 + + not_shared $mntp || \ + log_fail "File system $filesystem is already shared." + + log_must $ZFS set sharenfs=on $filesystem + is_shared $mntp || \ + log_fail "File system $filesystem is not shared (set sharenfs)." + + # + # Verify 'zfs share' works as well. + # + log_must $ZFS unshare $filesystem + is_shared $mntp && \ + log_fail "File system $filesystem is still shared." + + log_must $ZFS share $filesystem + is_shared $mntp || \ + log_fail "file system $filesystem is not shared (zfs share)." + + log_note "Sharing a shared file system fails." + log_mustnot $ZFS share $filesystem +} + +log_assert "Verify that 'zfs share' succeeds as root." +log_onexit cleanup + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot +log_must $ZFS clone $TESTPOOL/$TESTFS@snapshot $TESTPOOL/$TESTFS-clone +log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL/$TESTFS-clone + +typeset -i i=0 +while (( i < ${#fs[*]} )); do + test_share ${fs[i]} ${fs[((i + 1))]} + + ((i = i + 2)) +done + +log_note "Verify 'zfs share -a' succeeds." + +# +# Unshare each of the file systems. +# +i=0 +while (( i < ${#fs[*]} )); do + unshare_fs ${fs[i]} + + ((i = i + 2)) +done + +# +# Try a zfs share -a and verify all file systems are shared. +# +log_must $ZFS share -a + +i=0 +while (( i < ${#fs[*]} )); do + is_shared ${fs[i]} || \ + log_fail "File system ${fs[i]} is not shared (share -a)" + + ((i = i + 2)) +done + +log_pass "'$ZFS share [ -a ] <filesystem>' succeeds as root." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_002_pos.ksh new file mode 100644 index 0000000000..4005bf056c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_002_pos.ksh @@ -0,0 +1,73 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_share/zfs_share.cfg + +# +# DESCRIPTION: +# Verify that "zfs share" with a non-existent file system fails. +# +# STRATEGY: +# 1. Make sure the NONEXISTFSNAME ZFS file system is not in 'zfs list'. +# 2. Invoke 'zfs share <file system>'. +# 3. Verify that share fails +# + +verify_runnable "both" + +function cleanup +{ + typeset fs + for fs in $NONEXISTFSNAME $TESTFS ; do + log_must unshare_fs $TESTPOOL/$fs + done +} + +typeset -i ret=0 + +log_assert "Verify that "zfs share" with a non-existent file system fails." + +log_onexit cleanup + +log_mustnot $ZFS list $TESTPOOL/$NONEXISTFSNAME + +$ZFS share $TESTPOOL/$NONEXISTFSNAME +ret=$? +(( ret == 1)) || \ + log_fail "'$ZFS share $TESTPOOL/$NONEXISTFSNAME' " \ + "failed with an unexpected return code of $ret." + +log_note "Make sure the file system $TESTPOOL/$NONEXISTFSNAME is unshared" +not_shared $TESTPOOL/$NONEXISTFSNAME || \ + log_fail "File system $TESTPOOL/$NONEXISTFSNAME is unexpectedly shared." + +log_pass "'$ZFS share' with a non-existent file system fails." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_003_pos.ksh new file mode 100644 index 0000000000..e4ab8c6f5b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_003_pos.ksh @@ -0,0 +1,106 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Invoking "zfs share <file system>" with a file system +# whose sharenfs property is 'off' , will fail with a +# return code of 1 and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS file system is unshared. +# 2. Mount the file system using the various combinations +# - zfs set sharenfs=off <file system> +# - zfs set sharenfs=none <file system> +# 3. Verify that share failed with return code of 1. +# + +verify_runnable "both" + +set -A fs \ + "$TESTDIR" "$TESTPOOL/$TESTFS" \ + "$TESTDIR1" "$TESTPOOL/$TESTCTR/$TESTFS1" + +function cleanup +{ + typeset -i i=0 + while (( i < ${#fs[*]} )); do + log_must $ZFS inherit -r sharenfs ${fs[((i + 1))]} + log_must unshare_fs ${fs[i]} + + ((i = i + 2)) + done +} + + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# to share a legacy mountpoint and then verify the share fails as +# expected. +# +function test_legacy_share # mntp filesystem +{ + typeset mntp=$1 + typeset filesystem=$2 + + not_shared $mntp || \ + log_fail "File system $filesystem is already shared." + + if is_global_zone ; then + log_must $ZFS set sharenfs=off $filesystem + not_shared $mntp || \ + log_fail "File system $filesystem is still shared (set sharenfs)." + fi + + $ZFS share $filesystem + ret=$? + (( ret == 1)) || \ + log_fail "'$ZFS share $filesystem' " \ + "unexpected return code of $ret." + + not_shared $mntp || \ + log_fail "file system $filesystem is shared (zfs share)." +} + +log_assert "Verify that '$ZFS share' with a file system " \ + "whose sharenfs property is 'off' " \ + "will fail with return code 1." +log_onexit cleanup + +typeset -i i=0 +while (( i < ${#fs[*]} )); do + test_legacy_share ${fs[i]} ${fs[((i + 1))]} + + ((i = i + 2)) +done + +log_pass "Verify that '$ZFS share' with a file system " \ + "whose sharenfs property is 'off' fails." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_004_pos.ksh new file mode 100644 index 0000000000..04cf72efcd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_004_pos.ksh @@ -0,0 +1,96 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_share/zfs_share.cfg + +# +# DESCRIPTION: +# Verify that a file system and its snapshot are shared. +# +# STRATEGY: +# 1. Create a file system +# 2. Set the sharenfs property on the file system +# 3. Create a snapshot +# 4. Verify that both are shared. +# + +verify_runnable "global" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@snapshot; then + log_must $ZFS destroy $TESTPOOL/$TESTFS@snapshot + fi + + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + log_must unshare_fs $TESTPOOL/$TESTFS +} + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# share the mountpoint and then verify a snapshot of the mounpoint +# is also shared. +# +function test_snap_share # mntp filesystem +{ + typeset mntp=$1 + typeset filesystem=$2 + + not_shared $mntp || \ + log_fail "File system $filesystem is already shared." + + log_must $ZFS set sharenfs=on $filesystem + is_shared $mntp || \ + log_fail "File system $filesystem is not shared (set sharenfs)." + + log_must $LS -l $mntp/$SNAPROOT/snapshot + # + # Verify 'zfs share' works as well. + # + log_must $ZFS unshare $filesystem + log_must $ZFS share $filesystem + + is_shared $mntp || \ + log_fail "file system $filesystem is not shared (zfs share)." + + log_must $LS -l $mntp/$SNAPROOT/snapshot +} + +log_assert "Verify that a file system and its snapshot are shared." +log_onexit cleanup + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot +test_snap_share $TESTDIR $TESTPOOL/$TESTFS + +log_pass "A file system and its snapshot are both shared as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_005_pos.ksh new file mode 100644 index 0000000000..eed0eaad4d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_005_pos.ksh @@ -0,0 +1,79 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that NFS share options are propagated correctly. +# +# STRATEGY: +# 1. Create a ZFS file system. +# 2. For each option in the list, set the sharenfs property. +# 3. Verify through the share command that the options are propagated. +# + +verify_runnable "global" + +function cleanup +{ + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + is_shared $TESTPOOL/$TESTFS && \ + log_must unshare_fs $TESTPOOL/$TESTFS +} + +set -A shareopts \ + "ro" "ro=machine1" "ro=machine1:machine2" \ + "rw" "rw=machine1" "rw=machine1:machine2" \ + "ro=machine1:machine2,rw" "anon=0" "anon=0,sec=sys,rw" \ + "nosuid" "root=machine1:machine2" "rw=.mydomain.mycompany.com" \ + "rw=-terra:engineering" "log" "public" + +log_assert "Verify that NFS share options are propagated correctly." +log_onexit cleanup + +cleanup + +typeset -i i=0 +while (( i < ${#shareopts[*]} )) +do + log_must $ZFS set sharenfs="${shareopts[i]}" $TESTPOOL/$TESTFS + + option=`get_prop sharenfs $TESTPOOL/$TESTFS` + if [[ $option != ${shareopts[i]} ]]; then + log_fail "get sharenfs failed. ($option != ${shareopts[i]})" + fi + + $SHARE | $GREP $option > /dev/null 2>&1 + if (( $? != 0 )); then + log_fail "The '$option' option was not found in share output." + fi + + ((i = i + 1)) +done + +log_pass "NFS options were propagated correctly." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_006_pos.ksh new file mode 100644 index 0000000000..20884899bc --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_006_pos.ksh @@ -0,0 +1,101 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that a dataset could not be shared but filesystems are shared. +# +# STRATEGY: +# 1. Create a dataset and file system +# 2. Set the sharenfs property on the dataset +# 3. Verify that the dataset is unable be shared. +# 4. Add a new file system to the dataset. +# 5. Verify that the newly added file system be shared. +# + +verify_runnable "global" + +function cleanup +{ + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTCTR + if mounted $TESTDIR2; then + log_must $ZFS unmount $TESTDIR2 + fi + + datasetexists $TESTPOOL/$TESTCTR/$TESTFS2 && \ + log_must $ZFS destroy $TESTPOOL/$TESTCTR/$TESTFS2 + + typeset fs="" + for fs in $mntp $TESTDIR1 $TESTDIR2 + do + log_must unshare_fs $fs + done +} + +# +# Main test routine. +# +# Given a mountpoint and a dataset, this routine will set the +# sharenfs property on the dataset and verify that dataset +# is unable to be shared but the existing contained file systems +# could be shared. +# +function test_ctr_share # mntp ctr +{ + typeset mntp=$1 + typeset ctr=$2 + + not_shared $mntp || \ + log_fail "Mountpoint: $mntp is already shared." + + log_must $ZFS set sharenfs=on $ctr + + not_shared $mntp || \ + log_fail "File system $mntp is shared (set sharenfs)." + + # + # Add a new file system to the dataset and verify it is shared. + # + typeset mntp2=$TESTDIR2 + log_must $ZFS create $ctr/$TESTFS2 + log_must $ZFS set mountpoint=$mntp2 $ctr/$TESTFS2 + + is_shared $mntp2 || \ + log_fail "File system $mntp2 was not shared (set sharenfs)." +} + +log_assert "Verify that a dataset could not be shared, " \ + "but its sub-filesystems could be shared." +log_onexit cleanup + +typeset mntp=$(get_prop mountpoint $TESTPOOL/$TESTCTR) +test_ctr_share $mntp $TESTPOOL/$TESTCTR + +log_pass "A dataset could not be shared, " \ + "but its sub-filesystems could be shared as expect." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_007_neg.ksh new file mode 100644 index 0000000000..ace4e439b9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_007_neg.ksh @@ -0,0 +1,81 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that invalid share parameters and options are caught. +# +# STRATEGY: +# 1. Create a ZFS file system. +# 2. For each option in the list, set the sharenfs property. +# 3. Verify that the error code and sharenfs property. +# + +verify_runnable "both" + +function cleanup { + if is_global_zone; then + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + fi +} + +set -A badopts \ + "r0" "r0=machine1" "r0=machine1:machine2" \ + "-g" "-b" "-c" "-d" "--invalid" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL\$TESTCTR\$TESTFS1" + +log_assert "Verify that invalid share parameters and options are caught." +log_onexit cleanup + +typeset -i i=0 +while (( i < ${#badopts[*]} )) +do + log_note "Setting sharenfs=${badopts[i]} $i " + log_mustnot $ZFS set sharenfs="${badopts[i]}" $TESTPOOL/$TESTFS + + $SHARE | $GREP $option > /dev/null 2>&1 + if (( $? == 0 )); then + log_fail "An invalid setting '$option' was propagated." + fi + + # + # To global zone, sharenfs must be set 'off' before malformed testing. + # Otherwise, the malformed test return '0'. + # + # To non-global zone, sharenfs can be set even 'off' or 'on'. + # + if is_global_zone; then + log_note "Resetting sharenfs option" + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + fi + + ((i = i + 1)) +done + +log_pass "Invalid share parameters and options we caught as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_008_neg.ksh new file mode 100644 index 0000000000..a945ddd2cf --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_008_neg.ksh @@ -0,0 +1,70 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that sharing a dataset other than filesystem fails. +# +# STRATEGY: +# 1. Create a ZFS file system. +# 2. For each dataset in the list, set the sharenfs property. +# 3. Verify that the invalid datasets are not shared. +# + +verify_runnable "global" + +if is_global_zone ; then + set -A datasets \ + "$TESTPOOL/$TESTVOL" "$TESTDIR" +fi + +log_assert "Verify that sharing a dataset other than filesystem fails." + +typeset -i i=0 +while (( i < ${#datasets[*]} )) +do + log_mustnot $ZFS set sharenfs=on ${datasets[i]} + + option=`get_prop sharenfs ${datasets[i]}` + if [[ $option == ${datasets[i]} ]]; then + log_fail "set sharenfs failed. ($option == ${datasets[i]})" + fi + + not_shared ${datasets[i]} || \ + log_fail "An invalid setting '$option' was propagated." + + log_mustnot $ZFS share ${datasets[i]} + + not_shared ${datasets[i]} || \ + log_fail "An invalid dataset '${datasets[i]}' was shared." + + ((i = i + 1)) +done + +log_pass "Sharing datasets other than filesystems failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_009_neg.ksh new file mode 100644 index 0000000000..6b4f3037d9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_009_neg.ksh @@ -0,0 +1,69 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that zfs share should fail when sharing a shared zfs filesystem +# +# STRATEGY: +# 1. Make a zfs filesystem shared +# 2. Use zfs share to share the filesystem +# 3. Verify that zfs share returns error +# + +verify_runnable "global" + +function cleanup +{ + typeset val + + val=$(get_prop sharenfs $fs) + if [[ $val == on ]]; then + log_must $ZFS set sharenfs=off $fs + fi +} + +log_assert "zfs share fails with shared filesystem" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +sharenfs_val=$(get_prop sharenfs $fs) +mpt=$(get_prop mountpoint $fs) +if [[ $sharenfs_val == off ]]; then + log_must $ZFS set sharenfs=on $fs +fi + +$SHARE | $GREP $mpt >/dev/null 2>&1 +if (( $? != 0 )); then + log_must $ZFS share $fs +fi + +log_mustnot $ZFS share $fs + +log_pass "zfs share fails with shared filesystem as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_010_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_010_neg.ksh new file mode 100644 index 0000000000..a56761e82c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_010_neg.ksh @@ -0,0 +1,56 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that zfs share should fail with bad parameters +# +# STRATEGY: +# 1. Make an array of bad parameters +# 2. Use zfs share to share the filesystem +# 3. Verify that zfs share returns error +# + +verify_runnable "both" + +log_assert "zfs share fails with bad parameters" + +fs=$TESTPOOL/$TESTFS +set -A badargs "A" "-A" "-" "-x" "-?" "=" "-a *" "-a" + +for arg in "${badargs[@]}"; do + log_mustnot eval "$ZFS share $arg $fs >/dev/null 2>&1" +done + +#zfs share failed when missing arguments or invalid datasetname +for obj in "" "/$fs"; do + log_mustnot eval "$ZFS share $obj >/dev/null 2>&1" +done + +log_pass "zfs share fails with bad parameters as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_011_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_011_pos.ksh new file mode 100644 index 0000000000..8f519b3808 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_share/zfs_share_011_pos.ksh @@ -0,0 +1,85 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that umount and destroy fail, and do not unshare the shared +# file system +# +# STRATEGY: +# 1. Share the filesystem via 'zfs set sharenfs'. +# 2. Try umount failure, and verify that the file system is still shared. +# 3. Try destroy failure, and verify that the file system is still shared. +# + +verify_runnable "global" + +function cleanup +{ + log_must cd $origdir + + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS + unshare_fs $TESTPOOL/$TESTFS + + if snapexists "$TESTPOOL/$TESTFS@snapshot"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS@snapshot + fi + + if datasetexists $TESTPOOL/$TESTFS/fs2 ; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS/fs2 + fi +} + +log_assert "Verify that umount and destroy fail, and do not unshare the shared" \ + "file system" +log_onexit cleanup + +typeset origdir=$PWD + +# unmount fails will not unshare the shared filesystem +log_must $ZFS set sharenfs=on $TESTPOOL/$TESTFS +log_must is_shared $TESTDIR +if cd $TESTDIR ; then + log_mustnot $ZFS umount $TESTPOOL/$TESTFS +else + log_fail "cd $TESTDIR fails" +fi +log_must is_shared $TESTDIR + +# destroy fails will not unshare the shared filesystem +log_must $ZFS create $TESTPOOL/$TESTFS/fs2 +if cd $TESTDIR/fs2 ; then + log_mustnot $ZFS destroy $TESTPOOL/$TESTFS/fs2 +else + log_fail "cd $TESTDIR/fs2 fails" +fi +log_must is_shared $TESTDIR/fs2 + +log_pass "Verify that umount and destroy fail, and do not unshare the shared" \ + "file system" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/Makefile new file mode 100644 index 0000000000..a605b26d6a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/Makefile @@ -0,0 +1,51 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_snapshot + +PROGS = cleanup \ + setup \ + zfs_snapshot_001_neg \ + zfs_snapshot_002_neg \ + zfs_snapshot_003_neg \ + zfs_snapshot_004_neg \ + zfs_snapshot_005_neg \ + zfs_snapshot_006_pos \ + zfs_snapshot_007_neg \ + zfs_snapshot_008_neg \ + zfs_snapshot_009_pos + +FILES = zfs_snapshot.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/cleanup.ksh new file mode 100644 index 0000000000..cb9756df75 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_container_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/setup.ksh new file mode 100644 index 0000000000..5dc0d00361 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_container_volume_setup ${DISK} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot.cfg new file mode 100644 index 0000000000..fb22367be8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot.cfg @@ -0,0 +1,42 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +export SNAPFS="$TESTPOOL/$TESTFS@$TESTSNAP" +export SNAPFS1="$TESTPOOL/$TESTVOL@$TESTSNAP" +export SNAPDIR="$TESTDIR@$TESTSNAP" +export SNAPDIR1="$ZFSROOT/$SNAPFS1" +export SNAPDEV1="/$TESTDIR/snap1.dat" +export SNAPDEV2="/$TESTDIR/snap2.dat" + +# Name lengths for snappool1 and snappool2 must the same +export SNAPPOOL1="snappool1" +export SNAPPOOL2="snappool2" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_001_neg.ksh new file mode 100644 index 0000000000..860dd6ca43 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_001_neg.ksh @@ -0,0 +1,117 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_snapshot/zfs_snapshot.cfg + +# +# DESCRIPTION: +# Try each 'zfs snapshot' with inapplicable scenarios to make sure +# it returns an error. include: +# * No arguments given. +# * The argument contains invalid characters for the ZFS namesapec +# * Leading slash in snapshot name +# * The argument contains an empty component. +# * Missing '@' delimiter. +# * Multiple '@' delimiters in snapshot name. +# * The snapshot already exist. +# * Create snapshot upon the pool. +# (Be removed since pool is treated as filesystem as well) +# * Create snapshot upon a non-existent filesystem. +# * Too many arguments. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# + +verify_runnable "both" + +set -A args "" \ + "$TESTPOOL/$TESTFS@blah*" "$TESTPOOL/$TESTFS@blah?" \ + "$TESTPOOL/$TESTVOL@blah*" "$TESTPOOL/$TESTVOL@blah?" \ + "/$TESTPOOL/$TESTFS@$TESTSNAP" "/$TESTPOOL/$TESTVOL@$TESTSNAP" \ + "@$TESTSNAP" "$TESTPOOL/$TESTFS@" "$TESTPOOL/$TESTVOL@" \ + "$TESTPOOL//$TESTFS@$TESTSNAP" "$TESTPOOL//$TESTVOL@$TESTSNAP" \ + "$TESTPOOL/$TESTFS/$TESTSNAP" "$TESTPOOL/$TESTVOL/$TESTSNAP" \ + "$TESTPOOL/$TESTFS@$TESTSNAP@$TESTSNAP1" \ + "$TESTPOOL/$TESTVOL@$TESTSNAP@$TESTSNAP1" \ + "$SNAPFS" "$SNAPFS1" \ + "blah/blah@$TESTSNAP" + + + +function setup_all +{ + log_note "Create snapshots and mount them..." + + for snap in $SNAPFS $SNAPFS1; do + if ! snapexists $snap; then + log_must $ZFS snapshot $snap + fi + done + + return 0 +} + +function cleanup_all +{ + typeset -i i=0 + + while (( i < ${#args[*]} )); do + for snap in ${args[i]}; do + snapexists $snap && log_must $ZFS destroy -f $snap + done + (( i = i + 1 )) + done + + for mtpt in $SNAPDIR $SNAPDIR1; do + [[ -d $mtpt ]] && log_must $RM -rf $mtpt + done + + return 0 +} + +log_assert "Badly-formed 'zfs snapshot' with inapplicable scenarios " \ + "should return an error." +log_onexit cleanup_all + +setup_all + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS snapshot ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly formed 'zfs snapshot' with inapplicable scenarios " \ + "fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_002_neg.ksh new file mode 100644 index 0000000000..907d0dd12a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_002_neg.ksh @@ -0,0 +1,93 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# "zfs snapshot -r" fails with invalid arguments or scenarios. +# The invalid scenarios may include: +# (1) The child filesystem already has snapshot with the same name +# (2) The child volume already has snapshot with the same name +# +# STRATEGY: +# 1. Create an array of invalid arguments +# 2. Execute 'zfs snapshot -r' with each argument in the array, +# 3. Verify an error is returned. +# + +verify_runnable "both" + +function cleanup +{ + typeset snap + + for snap in $TESTPOOL/$TESTCTR/$TESTFS1@$TESTSNAP \ + $TESTPOOL/$TESTCTR/$TESTVOL@$TESTSNAP; + do + snapexists $snap && \ + log_must $ZFS destroy $snap + done + + datasetexists $TESTPOOL/$TESTCTR/$TESTVOL && \ + log_must $ZFS destroy -rf $TESTPOOL/$TESTCTR/$TESTVOL + +} + +log_assert "'zfs snapshot -r' fails with invalid arguments or scenarios. " +log_onexit cleanup + +set -A args "" \ + "$TESTPOOL/$TESTCTR@$TESTSNAP" "$TESTPOOL/$TESTCTR@blah?" \ + "$TESTPOOL/$TESTCTR@blah*" "@$TESTSNAP" "$TESTPOOL/$TESTCTR@" \ + "$TESTPOOL/$TESTFS/$TESTSNAP" "blah/blah@$TESTSNAP" \ + "$TESTPOOL/$TESTCTR@$TESTSNAP@$TESTSNAP" + +# setup preparations +log_must $ZFS snapshot $TESTPOOL/$TESTCTR/$TESTFS1@$TESTSNAP + +# testing +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS snapshot -r ${args[i]} + + ((i = i + 1)) +done + +# Testing the invalid senario: the child volume already has an +# identical name snapshot, zfs snapshot -r should fail when +# creating snapshot with -r for the parent +log_must $ZFS destroy $TESTPOOL/$TESTCTR/$TESTFS1@$TESTSNAP +if is_global_zone; then + log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTCTR/$TESTVOL +else + log_must $ZFS create $TESTPOOL/$TESTCTR/$TESTVOL +fi +log_must $ZFS snapshot $TESTPOOL/$TESTCTR/$TESTVOL@$TESTSNAP + +log_mustnot $ZFS snapshot -r $TESTPOOL/$TESTCTR@$TESTSNAP + +log_pass "'zfs snapshot -r' fails with invalid arguments or scenarios as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_003_neg.ksh new file mode 100644 index 0000000000..e424b9b811 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_003_neg.ksh @@ -0,0 +1,61 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# "zfs snapshot" fails with bad options,too many arguments or too long +# snapshot name +# +# STRATEGY: +# 1. Create an array of invalid arguments +# 2. Execute 'zfs snapshot' with each argument in the array, +# 3. Verify an error is returned. +# + +verify_runnable "both" + +log_assert "'zfs snapshot' fails with bad options, or too many arguments. " + +set -A badopts "r" "R" "-R" "-x" "-rR" "-?" "-*" "-123" + +# set too long snapshot name (>256) +l_name="$(gen_dataset_name 260 abcdefg)" + +for ds in $TESTPOOL/$TESTFS $TESTPOOL/$TESTCTR $TESTPOOL/$TESTVOL; do + for opt in ${badopts[@]}; do + log_mustnot $ZFS snapshot $opt $ds@$TESTSNAP + done + + log_mustnot $ZFS snapshot $ds@snap $ds@snap1 + log_mustnot $ZFS snapshot -r $ds@snap $ds@snap1 + + log_mustnot $ZFS snapshot $ds@$l_name + log_mustnot $ZFS snapshot -r $ds@$l_name +done + +log_pass "'zfs snapshot' fails with bad options or too many arguments as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_004_neg.ksh new file mode 100644 index 0000000000..319e5c44c5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_004_neg.ksh @@ -0,0 +1,92 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify recursive snapshotting could not break ZFS. +# +# STRATEGY: +# 1. Create deeply-nested filesystems until it is too long to create snap +# 2. Verify zfs snapshot -r pool@snap will not break ZFS +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $initfs ; then + log_must $ZFS destroy -rf $initfs + fi +} + +log_assert "Verify recursive snapshotting could not break ZFS." +log_onexit cleanup + +initfs=$TESTPOOL/$TESTFS/$TESTFS +basefs=$initfs +typeset -i ret=0 len snaplen +while ((ret == 0)); do + $ZFS create $basefs + $ZFS snapshot $basefs@snap1 + ret=$? + + if ((ret != 0)); then + len=$($ECHO $basefs| $WC -c) + log_note "The deeply-nested filesystem len: $len" + + # + # Make sure there are at lease 2 characters left + # for snapshot name space, otherwise snapshot name + # is incorrect + # + if ((len >= 255)); then + if datasetexists $basefs; then + log_must $ZFS destroy -r $basefs + fi + basefs=${basefs%/*} + len=$($ECHO $basefs| $WC -c) + fi + break + fi + + basefs=$basefs/$TESTFS +done + +# Make snapshot name is longer than the max length +((snaplen = 256 - len + 10)) +snap=$(gen_dataset_name $snaplen "s") +log_mustnot $ZFS snapshot -r $TESTPOOL@$snap + +log_must datasetnonexists $TESTPOOL@$snap +while [[ $basefs != $TESTPOOL ]]; do + log_must datasetnonexists $basefs@$snap + basefs=${basefs%/*} +done + +log_pass "Verify recursive snapshotting could not break ZFS." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_005_neg.ksh new file mode 100644 index 0000000000..8794cba84f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_005_neg.ksh @@ -0,0 +1,92 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Long name filesystem with snapshot should not break ZFS. +# +# STRATEGY: +# 1. Create filesystem and snapshot. +# 2. When the snapshot length is 256, rename the filesystem. +# 3. Verify it does not break ZFS +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $initfs ; then + log_must $ZFS destroy -rf $initfs + fi +} + +log_assert "Verify long name filesystem with snapshot should not break ZFS." +log_onexit cleanup + +initfs=$TESTPOOL/$TESTFS/$TESTFS +basefs=$initfs +typeset -i ret=0 len snaplen +while ((ret == 0)); do + $ZFS create $basefs + $ZFS snapshot $basefs@snap1 + ret=$? + + if ((ret != 0)); then + len=$($ECHO $basefs | $WC -c) + log_note "The deeply-nested filesystem len: $len" + + # + # Make sure there are at lease 2 characters left + # for snapshot name space, otherwise snapshot name + # is incorrect + # + if ((len >= 255)); then + if datasetexists $basefs; then + log_must $ZFS destroy -r $basefs + fi + basefs=${basefs%/*} + len=$($ECHO $basefs| $WC -c) + fi + break + fi + + basefs=$basefs/$TESTFS +done + +# Make snapshot name length match the longest one +((snaplen = 256 - len - 1)) # 1: @ +snap=$(gen_dataset_name $snaplen "s") +log_must $ZFS snapshot $basefs@$snap + +log_mustnot $ZFS rename $basefs ${basefs}a +log_mustnot $ZFS rename $basefs ${basefs}-new +log_mustnot $ZFS rename $initfs ${initfs}-new +log_mustnot $ZFS rename $TESTPOOL/$TESTFS $TESTPOOL/$TESTFS-new + +log_pass "Verify long name filesystem with snapshot should not break ZFS." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_006_pos.ksh new file mode 100644 index 0000000000..6d5f03cb85 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_006_pos.ksh @@ -0,0 +1,124 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# User property could be set via creation time by 'zfs snapshot -o' +# +# STRATEGY: +# 1. Create snapshot and give '-o property=value' +# 2. Verify the snapshot be created and user property have been set. +# + +verify_runnable "both" + +function cleanup +{ + for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + if datasetexists $fssnap ; then + log_must $ZFS destroy -rf $fssnap + fi + done + cleanup_user_prop $TESTPOOL +} + +function nonexist_user_prop +{ + typeset user_prop=$1 + typeset dtst=$2 + + typeset source=$(get_source $user_prop $dtst) + typeset value=$(get_prop $user_prop $dtst) + if [[ $source == '-' && $value == '-' ]]; then + return 0 + else + return 1 + fi +} + +log_assert "User property could be set upon snapshot via 'zfs snapshot -o'." +log_onexit cleanup + +typeset snap_property= + +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + prop_name=$(valid_user_property 10) + value=$(user_property_value 16) + + log_must eval "$ZFS snapshot -o $prop_name='$value' $fssnap" + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + + log_must $ZFS destroy -f $fssnap + + prop_name2=$(valid_user_property 10) + value2=$(user_property_value 16) + + log_must eval "$ZFS snapshot -o $prop_name='$value' -o $prop_name2='$value2' $fssnap" + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + log_mustnot nonexist_user_prop $prop_name2 $fssnap +done + +cleanup + +prop_name=$(valid_user_property 10) +value=$(user_property_value 16) + +log_must eval "$ZFS snapshot -r -o $prop_name='$value' $TESTPOOL@snap" +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + + log_must $ZFS destroy -rf $fssnap +done + +cleanup + +prop_name2=$(valid_user_property 10) +value2=$(user_property_value 16) + +log_must eval "$ZFS snapshot -r -o $prop_name='$value' -o $prop_name2='$value2' $TESTPOOL@snap" +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL ; do + typeset fssnap=$fs@snap + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + log_mustnot nonexist_user_prop $prop_name2 $fssnap + + log_must $ZFS destroy -rf $fssnap +done + +log_pass "User property could be set upon snapshot via 'zfs snapshot -o'." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_007_neg.ksh new file mode 100644 index 0000000000..1a80e4f58b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_007_neg.ksh @@ -0,0 +1,128 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_set/zfs_set_common.kshlib + +# +# DESCRIPTION: +# 'zfs snapshot -o' cannot set properties other than user property +# +# STRATEGY: +# 1. Create snapshot and give '-o property=value' with regular property. +# 2. Verify the snapshot creation failed. +# + +verify_runnable "both" + +function cleanup +{ + for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR $TESTPOOL ; do + typeset fssnap=$fs@snap + if datasetexists $fssnap ; then + log_must $ZFS destroy -rf $fssnap + fi + done + cleanup_user_prop $TESTPOOL +} + +function nonexist_user_prop +{ + typeset user_prop=$1 + typeset dtst=$2 + + typeset source=$(get_source $user_prop $dtst) + typeset value=$(get_prop $user_prop $dtst) + if [[ $source == '-' && $value == '-' ]]; then + return 0 + else + return 1 + fi +} + +log_assert "'zfs snapshot -o' cannot set properties other than user property." +log_onexit cleanup + +typeset ro_props="type used available avail creation referenced refer compressratio \ + mounted origin" +typeset snap_ro_props="volsize recordsize recsize quota reservation reserv mountpoint \ + sharenfs checksum compression compress atime devices exec readonly rdonly \ + setuid zoned" + +$ZFS upgrade -v > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + snap_ro_props="$snap_ro_props version" +fi + + +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR $TESTPOOL ; do + typeset fssnap=$fs@snap + prop_name=$(valid_user_property 10) + value=$(user_property_value 16) + + log_must eval "$ZFS snapshot -o $prop_name='$value' $fssnap" + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + + log_must $ZFS destroy -f $fssnap + + prop_name2=$(valid_user_property 10) + value2=$(user_property_value 16) + + log_must eval "$ZFS snapshot -o $prop_name='$value' -o $prop_name2='$value2' $fssnap" + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + log_mustnot nonexist_user_prop $prop_name2 $fssnap + + log_must $ZFS destroy -f $fssnap +done + +cleanup + +prop_name=$(valid_user_property 10) +value=$(user_property_value 16) + +log_must eval "$ZFS snapshot -r -o $prop_name='$value' $TESTPOOL@snap" +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR $TESTPOOL ; do + typeset fssnap=$fs@snap + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap +done + +cleanup + +prop_name2=$(valid_user_property 10) +value2=$(user_property_value 16) + +log_must eval "$ZFS snapshot -r -o $prop_name='$value' -o $prop_name2='$value2' $TESTPOOL@snap" +for fs in $TESTPOOL/$TESTFS $TESTPOOL/$TESTVOL $TESTPOOL/$TESTCTR $TESTPOOL ; do + typeset fssnap=$fs@snap + log_must snapexists $fssnap + log_mustnot nonexist_user_prop $prop_name $fssnap + log_mustnot nonexist_user_prop $prop_name2 $fssnap +done + +log_pass "'zfs snapshot -o' cannot set properties other than user property." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_008_neg.ksh new file mode 100644 index 0000000000..153a0166c7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_008_neg.ksh @@ -0,0 +1,68 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_snapshot/zfs_snapshot.cfg + +# +# DESCRIPTION: +# 'zfs snapshot pool1@snap pool2@snap' should fail since both snapshots +# are not in the same pool. +# +# STRATEGY: +# 1. Create 2 separate zpools, zpool name lenghts must be the same. +# 2. Attempt to simultaneously create a snapshot of each pool. +# 3. Veriy the snapshot creation failed. +# + +verify_runnable "both" + +function cleanup +{ + for pool in $SNAPPOOL1 $SNAPPOOL2 ; do + if poolexists $pool ; then + log_must $ZPOOL destroy -f $pool + fi + done + + for dev in $SNAPDEV1 $SNAPDEV2 ; do + if [[ -f $dev ]] ; then + log_must rm -f $dev + fi + done +} + +log_assert "'zfs snapshot pool1@snap1 pool2@snap2' should fail since snapshots are in different pools." +log_onexit cleanup + +log_must $MKFILE 64m $SNAPDEV1 +log_must $MKFILE 64m $SNAPDEV2 + +log_must $ZPOOL create $SNAPPOOL1 $SNAPDEV1 +log_must $ZPOOL create $SNAPPOOL2 $SNAPDEV2 + +log_mustnot $ZFS snapshot $SNAPPOOL1@snap1 $SNAPPOOL2@snap2 + +log_pass "'zfs snapshot pool1@snap1 pool2@snap2' should fail since snapshots are in different pools." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_009_pos.ksh new file mode 100644 index 0000000000..db78c4c218 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_snapshot/zfs_snapshot_009_pos.ksh @@ -0,0 +1,102 @@ +#!/bin/ksh +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +# +# DESCRIPTION +# verify 'zfs snapshot <list of snapshots>' works correctly +# +# STRATEGY +# 1. Create multiple datasets +# 2. Create mutiple snapshots with a list of valid and invalid +# snapshot names +# 3. Verify the valid snpashot creation + +. $STF_SUITE/include/libtest.shlib + +function cleanup +{ + for ds in $datasets; do + datasetexists $ds && log_must $ZFS destroy -r $ds + done + $ZFS destroy -r $TESTPOOL/TESTFS4 +} +datasets="$TESTPOOL/$TESTFS1 $TESTPOOL/$TESTFS2 + $TESTPOOL/$TESTFS3" + +invalid_args=("$TESTPOOL/$TESTFS1@now $TESTPOOL/$TESTFS2@now \ + $TESTPOOL/$TESTFS@blah?" "$TESTPOOL/$TESTFS1@blah* \ + $TESTPOOL/$TESTFS2@blah? $TESTPOOL/$TESTFS3@blah%" \ + "$TESTPOOL/$TESTFS1@$($PYTHON -c 'print "x" * 300') $TESTPOOL/$TESTFS2@300 \ + $TESTPOOL/$TESTFS3@300") + +valid_args=("$TESTPOOL/$TESTFS1@snap $TESTPOOL/$TESTFS2@snap \ + $TESTPOOL/$TESTFS3@snap" "$TESTPOOL/$TESTFS1@$($PYTHON -c 'print "x" * 200')\ + $TESTPOOL/$TESTFS2@2 $TESTPOOL/$TESTFS3@s") + +log_assert "verify zfs supports multiple consistent snapshots" +log_onexit cleanup +typeset -i i=1 +test_data=$STF_SUITE/tests/functional/cli_root/zpool_upgrade/blockfiles + +log_note "destroy a list of valid snapshots" +for ds in $datasets; do + log_must $ZFS create $ds + log_must $CP -r $test_data /$ds +done +i=0 +while (( i < ${#valid_args[*]} )); do + log_must $ZFS snapshot ${valid_args[i]} + for token in ${valid_args[i]}; do + log_must snapexists $token && \ + log_must $ZFS destroy $token + done + ((i = i + 1)) +done +log_note "destroy a list of invalid snapshots" +i=0 +while (( i < ${#invalid_args[*]} )); do + log_mustnot $ZFS snapshot ${invalid_args[i]} + for token in ${invalid_args[i]}; do + log_mustnot snapexists $token + done + ((i = i + 1)) +done +log_note "verify multiple snapshot transaction group" +txg_group=$($ZDB -Pd $TESTPOOL | $GREP snap | $AWK '{print $7}') +for i in 1 2 3; do + txg_tag=$($ECHO "$txg_group" | $NAWK -v j=$i 'FNR == j {print}') + [[ $txg_tag != $($ECHO "$txg_group" | \ + $NAWK -v j=$i 'FNR == j {print}') ]] \ + && log_fail "snapshots belong to differnt transaction groups" +done +log_note "verify snapshot contents" +for ds in $datasets; do + status=$($DIRCMP /$ds /$ds/.zfs/snapshot/snap | $GREP "different") + [[ -z $status ]] || log_fail "snapshot contents are different from" \ + "the filesystem" +done + +log_note "verify multiple snapshot with -r option" +log_must $ZFS create $TESTPOOL/TESTFS4 +log_must $ZFS create -p $TESTPOOL/$TESTFS3/TESTFSA$($PYTHON -c 'print "x" * 210')/TESTFSB +log_mustnot $ZFS snapshot -r $TESTPOOL/$TESTFS1@snap1 $TESTPOOL/$TESTFS2@snap1 \ + $TESTPOOL/$TESTFS3@snap1 $TESTPOOL/TESTFS4@snap1 +log_must $ZFS rename $TESTPOOL/$TESTFS3/TESTFSA$($PYTHON -c 'print "x" * 210') \ + $TESTPOOL/$TESTFS3/TESTFSA +log_must $ZFS snapshot -r $TESTPOOL/$TESTFS1@snap1 $TESTPOOL/$TESTFS2@snap1 \ + $TESTPOOL/$TESTFS3@snap1 $TESTPOOL/TESTFS4@snap1 + +log_pass "zfs multiple snapshot verified correctly" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/Makefile new file mode 100644 index 0000000000..6f5fe1f9ee --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/Makefile @@ -0,0 +1,53 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_unmount + +PROGS = cleanup \ + setup \ + zfs_unmount_001_pos \ + zfs_unmount_002_pos \ + zfs_unmount_003_pos \ + zfs_unmount_004_pos \ + zfs_unmount_005_pos \ + zfs_unmount_006_pos \ + zfs_unmount_007_neg \ + zfs_unmount_008_neg \ + zfs_unmount_009_pos \ + zfs_unmount_all_001_pos + +FILES = zfs_unmount.cfg \ + zfs_unmount.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.cfg new file mode 100644 index 0000000000..c8e46895d2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.cfg @@ -0,0 +1,39 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export mountcmd=mount +export mountforce="$mountcmd -f" +export mountall="$mountcmd -a" + +export unmountcmd=unmount +export unmountforce="$unmountcmd -f" +export unmountall="$unmountcmd -a" + +export NONEXISTFSNAME="nonexistfs50charslong_0123456789012345678901234567" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib new file mode 100644 index 0000000000..9c9cb71ba9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib @@ -0,0 +1,77 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_unmount/zfs_unmount.cfg + +function do_unmount #cmd #opt #mnt #expect +{ + typeset cmd=$1 + typeset opt=$2 + typeset mnt=$3 + typeset -i expect=${4-0} + typeset -i ret + typeset -i wasmounted=1 + + mounted $mnt || wasmounted=0 + + if (( expect == 0 )) ; then + log_must $ZFS $cmd $opt $mnt + + log_must unmounted $mnt + + log_note "Successfully $ZFS $cmd $opt $mnt" + + else + log_note "$ZFS $cmd $opt $mnt" + + $ZFS $cmd $opt $mnt + ret=$? + if (( ret != expect)); then + log_fail "'$ZFS $cmd $opt $mnt' " \ + "unexpected return code of $ret." + fi + + if (( wasmounted == 1 )) ; then + log_must mounted $mnt + else + log_must unmounted $mnt + fi + log_note "Mount status of $mnt not changed." + fi +} + +function cleanup +{ + [[ -n $cwd ]] && cd $cwd + + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + mounted $TESTPOOL/$TESTFS || \ + log_must $ZFS $mountcmd $TESTPOOL/$TESTFS +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_001_pos.ksh new file mode 100644 index 0000000000..924e6ac179 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_001_pos.ksh @@ -0,0 +1,112 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Creates a file system and verifies that it can be unmounted +# using each of the various unmount options and sub-command +# variants. +# +# STRATEGY: +# 1. Create and mount a file system as necessary. +# 2. Umount the file system using the various combinations. +# - With force option. +# - Without force option. +# - Using the unmount sub-command. +# - Using the umount sub-command. +# + +verify_runnable "both" + + +function cleanup +{ + mounted $TESTDIR2 && \ + log_must $ZFS umount -f $TESTDIR2 + + datasetexists $TESTPOOL/$TESTFS2 && \ + log_must $ZFS destroy $TESTPOOL/$TESTFS2 + + [[ -d $TESTDIR2 ]] && \ + log_must $RM -rf $TESTDIR2 +} +function do_unmount +{ + typeset cmd=$1 + typeset opt=$2 + typeset mnt=$3 + + [[ ! -d $TESTDIR2 ]] && \ + log_must $MKDIR $TESTDIR2 + + if ! datasetexists $TESTPOOL/$TESTFS2 ; then + log_must $ZFS create $TESTPOOL/$TESTFS2 + log_must $ZFS set mountpoint=$TESTDIR2 \ + $TESTPOOL/$TESTFS2 + fi + + unmounted $TESTPOOL/$TESTFS2 && \ + log_must $ZFS mount $TESTPOOL/$TESTFS2 + + log_must $ZFS $cmd $options $mnt + + unmounted "$mnt" || \ + log_fail "Unable to unmount $options $mnt" + + log_note "Successfully unmounted $options $mnt" +} + +log_onexit cleanup + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$TESTFS2" "$TESTDIR2" + +log_assert "Verify the u[n]mount [-f] sub-command." + +typeset -i i=0 +typeset -i j=0 +typeset -i k=0 +while [[ $i -lt ${#cmd[*]} ]]; do + j=0 + while [[ $j -lt ${#options[*]} ]]; do + k=0 + while [[ $k -lt ${#dev[*]} ]]; do + do_unmount "${cmd[i]}" "${options[j]}" \ + "${dev[k]}" + + ((k = k + 1)) + done + + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "zfs u[n]mount [-f] completed successfully." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_002_pos.ksh new file mode 100644 index 0000000000..1b0e621345 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_002_pos.ksh @@ -0,0 +1,94 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib + +# +# DESCRIPTION: +# If invoke "zfs unmount [-f]" with a filesystem|mountpoint +# whose name is not in "zfs list", +# it will fail with a return code of 1 +# and issue an error message. +# +# STRATEGY: +# 1. Make sure that the non-existent ZFS filesystem|mountpoint +# not in 'zfs list'. +# 2. Unmount the file system using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 3. Unmount the mountpoint using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 4. Verify the above expected results of the filesystem|mountpoint. +# + +verify_runnable "both" + + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$NONEXISTFSNAME" "${TEST_BASE_DIR%%/}/$NONEXISTFSNAME" + +function do_unmount_multiple #options #expect +{ + typeset opt=$1 + typeset -i expect=${2-0} + + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#cmd[*]} )); do + j=0 + while (( j < ${#dev[*]} )); do + log_note "Make sure ${dev[j]} is not in 'zfs list'" + log_mustnot $ZFS list ${dev[j]} + + do_unmount "${cmd[i]}" "$opt" \ + "${dev[j]}" $expect + + ((j = j + 1)) + done + + ((i = i + 1)) + done +} + +log_assert "Verify that '$ZFS $unmountcmd [-f] <filesystem|mountpoint>' " \ + "whose name is not in 'zfs list' will fail with return code 1." + +log_onexit cleanup + +typeset -i i=0 + +while (( i < ${#options[*]} )); do + do_unmount_multiple "${options[i]}" 1 + ((i = i + 1)) +done + +log_pass "'$ZFS $unmountcmd [-f] <filesystem|mountpoint>' " \ + "whose name is not in 'zfs list' failed with return code 1." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_003_pos.ksh new file mode 100644 index 0000000000..8f1b9497e8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_003_pos.ksh @@ -0,0 +1,105 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib + +# +# DESCRIPTION: +# If invoke "zfs unmount [-f]" with a filesystem|mountpoint +# whose mountpoint property is 'legacy' or 'none', +# it will fail with a return code of 1 +# and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is mounted. +# 2. Apply 'zfs set mountpoint=legacy|none <filesystem>'. +# 3. Unmount the file system using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 4. Unmount the mountpoint using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 5. Verify the above expected results of the filesystem|mountpoint. +# + +verify_runnable "both" + + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$TESTFS" "$TESTDIR" +set -A mopts "legacy" "none" + +function do_unmount_multiple #options #expect #mountpoint +{ + typeset opt=$1 + typeset -i expect=${2-0} + typeset mopt=$3 + + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#cmd[*]} )); do + j=0 + while (( j < ${#dev[*]} )); do + [[ -n $mopt ]] && \ + log_must $ZFS set mountpoint=$mopt ${dev[0]} + + do_unmount "${cmd[i]}" "$opt" \ + "${dev[j]}" $expect + + cleanup + + ((j = j + 1)) + done + + ((i = i + 1)) + done +} + +log_assert "Verify that '$ZFS $unmountcmd [-f] <filesystem|mountpoint>' " \ + "whose mountpoint property is 'legacy' or 'none' " \ + "will fail with return code 1." + +log_onexit cleanup + +typeset -i i=0 +typeset -i j=0 + +while (( i < ${#mopts[*]} )); do + j=0 + while (( j < ${#options[*]} )); do + do_unmount_multiple "${options[j]}" 1 "${mopts[i]}" + ((j = j + 1)) + done + ((i = i + 1)) +done + +log_pass "'$ZFS $unmountcmd [-f] <filesystem|mountpoint>' " \ + "whose mountpoint property is 'legacy' or 'none' " \ + "will fail with return code 1." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_004_pos.ksh new file mode 100644 index 0000000000..8f3def6e5a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_004_pos.ksh @@ -0,0 +1,95 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib + +# +# DESCRIPTION: +# If invoke "zfs unmount [-f]" with a specific filesystem|mountpoint, +# which is not currently mounted, +# it will fail with a return code of 1 +# and issue an error message. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is mounted. +# 2. Invoke 'zfs unmount <filesystem>'. +# 3. Verify that the filesystem is unmounted. +# 4. Unmount the file system using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 5. Unmount the mountpoint using the various combinations. +# - Without force option. (FAILED) +# - With force option. (FAILED) +# 6. Verify the above expected results of the filesystem|mountpoint. +# + +verify_runnable "both" + + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$TESTFS" "$TESTDIR" + +function do_unmount_multiple #options #expect +{ + typeset opt=$1 + typeset -i expect=${2-0} + + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#cmd[*]} )); do + j=0 + while (( j < ${#dev[*]} )); do + unmounted ${dev[j]} || \ + log_must $ZFS $unmountforce ${dev[j]} + + do_unmount "${cmd[i]}" "$opt" \ + "${dev[j]}" $expect + + ((j = j + 1)) + done + + ((i = i + 1)) + done +} + +log_assert "Verify that '$ZFS $unmountcmd [-f] <filesystem|mountpoint>' " \ + "with an unmounted filesystem will fail with return code 1." + +log_onexit cleanup + +typeset -i i=0 + +while (( i < ${#options[*]} )); do + do_unmount_multiple "${options[i]}" 1 + ((i = i + 1)) +done + +log_pass "'$ZFS $unmountcmd [-f] <filesystem|mountpoint>' " \ + "with an unmounted filesystem failed with return code 1." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_005_pos.ksh new file mode 100644 index 0000000000..ac2de65ae7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_005_pos.ksh @@ -0,0 +1,109 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib + +# +# DESCRIPTION: +# If invoke "zfs unmount" with a specific filesystem|mountpoint +# that have been mounted, but it's currently in use, +# it will fail with a return code of 1 +# and issue an error message. +# But unmount forcefully will bypass this restriction and +# unmount that given filesystem successfully. +# +# STRATEGY: +# 1. Make sure that the ZFS filesystem is mounted. +# 2. Change directory to that given mountpoint. +# 3. Unmount the file system using the various combinations. +# - Without force option. (FAILED) +# - With force option. (PASS) +# 4. Unmount the mountpoint using the various combinations. +# - Without force option. (FAILED) +# - With force option. (PASS) +# 5. Verify the above expected results of the filesystem|mountpoint. +# + +verify_runnable "both" + + +set -A cmd "umount" "unmount" +set -A options "" "-f" +set -A dev "$TESTPOOL/$TESTFS" "$TESTDIR" + +function do_unmount_multiple #options #expect +{ + typeset opt=$1 + typeset -i expect=${2-0} + + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#cmd[*]} )); do + j=0 + while (( j < ${#dev[*]} )); do + mounted ${dev[j]} || \ + log_must $ZFS $mountcmd ${dev[0]} + + cd $TESTDIR || \ + log_unresolved "Unable change dir to $TESTDIR" + + do_unmount "${cmd[i]}" "$opt" \ + "${dev[j]}" $expect + + cleanup + + ((j = j + 1)) + done + + ((i = i + 1)) + done +} + +log_assert "Verify that '$ZFS $unmountcmd <filesystem|mountpoint>' " \ + "with a filesystem which mountpoint is currently in use " \ + "will fail with return code 1, and forcefully will succeeds as root." + +log_onexit cleanup + +cwd=$PWD + +typeset -i i=0 + +while (( i < ${#options[*]} )); do + if [[ ${options[i]} == "-f" ]]; then + do_unmount_multiple "${options[i]}" + else + do_unmount_multiple "${options[i]}" 1 + fi + ((i = i + 1)) +done + +log_pass "'$ZFS $unmountcmd <filesystem|mountpoint>' " \ + "with a filesystem which mountpoint is currently in use " \ + "will fail with return code 1, and forcefully will succeeds as root." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_006_pos.ksh new file mode 100644 index 0000000000..3e2ac07b2d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_006_pos.ksh @@ -0,0 +1,67 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Re-creating zfs files, 'zfs unmount' still succeed. +# +# STRATEGY: +# 1. Create pool and filesystem. +# 2. Recreating the same file in this fs for a while, then breaking out. +# 3. Verify the filesystem can be unmount successfully. +# + +verify_runnable "both" + +function cleanup +{ + if ! ismounted $TESTPOOL/$TESTFS ; then + log_must $ZFS mount $TESTPOOL/$TESTFS + fi +} + +log_assert "Re-creating zfs files, 'zfs unmount' still succeed." +log_onexit cleanup + +# Call cleanup to make sure the file system are mounted. +cleanup +mntpnt=$(get_prop mountpoint $TESTPOOL/$TESTFS) +(($? != 0)) && log_fail "get_prop mountpoint $TESTPOOL/$TESTFS" + +typeset -i i=0 +while (( i < 10000 )); do + $CP $STF_SUITE/include/libtest.shlib $mntpnt + + (( i += 1 )) +done +log_note "Recreating zfs files for 10000 times." + +log_must $ZFS unmount $TESTPOOL/$TESTFS + +log_pass "Re-creating zfs files, 'zfs unmount' passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_007_neg.ksh new file mode 100644 index 0000000000..c1000e85ec --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_007_neg.ksh @@ -0,0 +1,106 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib + +# +# DESCRIPTION: +# Try each 'zfs unmount' with inapplicable scenarios to make sure +# it returns an error. include: +# * Multiple filesystem|mountpoint specified +# * '-a', but also with a specific filesystem|mountpoint. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# + +verify_runnable "both" + +multifs="$TESTFS $TESTFS1" +datasets="" + +for fs in $multifs ; do + datasets="$datasets $TESTPOOL/$fs" +done + +set -A args "$unmountall $TESTPOOL/$TESTFS" \ + "$unmountcmd $datasets" + +function setup_all +{ + typeset fs + + for fs in $multifs ; do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "$fs" \ + "${TEST_BASE_DIR%%/}/testroot$$/$TESTPOOL/$fs" + done + return 0 +} + +function cleanup_all +{ + typeset fs + + cleanup_filesystem "$TESTPOOL" "$TESTFS1" + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + [[ -d ${TEST_BASE_DIR%%/}/testroot$$ ]] && \ + $RM -rf ${TEST_BASE_DIR%%/}/testroot$$ + + return 0 +} + +function verify_all +{ + typeset fs + + for fs in $multifs ; do + log_must mounted $TESTPOOL/$fs + done + return 0 +} + +log_assert "Badly-formed 'zfs $unmountcmd' with inapplicable scenarios " \ + "should return an error." +log_onexit cleanup_all + +log_must setup_all + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS ${args[i]} + ((i = i + 1)) +done + +log_must verify_all + +log_pass "Badly formed 'zfs $unmountcmd' with inapplicable scenarios " \ + "fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_008_neg.ksh new file mode 100644 index 0000000000..e274e66690 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_008_neg.ksh @@ -0,0 +1,139 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that zfs unmount should fail with bad parameters or scenarios: +# 1. bad option; +# 2. too many arguments; +# 3. null arguments; +# 4. invalid datasets; +# 5. invalid mountpoint; +# 6. already unmounted zfs filesystem; +# 7. legacy mounted zfs filesystem +# +# STRATEGY: +# 1. Make an array of bad parameters +# 2. Use zfs unmount to unmount the filesystem +# 3. Verify that zfs unmount returns error +# + +verify_runnable "both" + +function cleanup +{ + for ds in $vol $fs1; do + if datasetexists $ds; then + log_must $ZFS destroy -f $ds + fi + done + + if snapexists $snap; then + log_must $ZFS destroy $snap + fi + + if [[ -e /tmp/$file ]]; then + $RM -f /tmp/$file + fi + if [[ -d /tmp/$dir ]]; then + $RM -rf /tmp/$dir + fi + +} + +log_assert "zfs unmount fails with bad parameters or scenarios" +log_onexit cleanup + +fs=$TESTPOOL/$TESTFS +vol=$TESTPOOL/vol.$$ +snap=$TESTPOOL/$TESTFS@snap.$$ +set -A badargs "A" "-A" "F" "-F" "-" "-x" "-?" + +if ! ismounted $fs; then + log_must $ZFS mount $fs +fi + +log_must $ZFS snapshot $snap +if is_global_zone; then + log_must $ZFS create -V 10m $vol +else + vol="" +fi + +# Testing bad options +for arg in ${badargs[@]}; do + log_mustnot eval "$ZFS unmount $arg $fs >/dev/null 2>&1" +done + + +#Testing invalid datasets +for ds in $snap $vol "blah"; do + for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt $ds >/dev/null 2>&1" + done +done + +#Testing invalid mountpoint +dir=foodir.$$ +file=foo.$$ +fs1=$TESTPOOL/fs.$$ +$MKDIR /tmp/$dir +$TOUCH /tmp/$file +log_must $ZFS create -o mountpoint=/tmp/$dir $fs1 +curpath=`$DIRNAME $0` +cd /tmp +for mpt in "./$dir" "./$file" "/tmp"; do + for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt $mpt >/dev/null 2>&1" + done +done +cd $curpath + +#Testing null argument and too many arguments +for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt >/dev/null 2>&1" + log_mustnot eval "$ZFS unmount $opt $fs $fs1 >/dev/null 2>&1" +done + +#Testing already unmounted filesystem +log_must $ZFS unmount $fs1 +for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt $fs1 >/dev/null 2>&1" + log_mustnot eval "$ZFS unmount /tmp/$dir >/dev/null 2>&1" +done + +#Testing legacy mounted filesystem +log_must $ZFS set mountpoint=legacy $fs1 +log_must $MOUNT -F zfs $fs1 /tmp/$dir +for opt in "" "-f"; do + log_mustnot eval "$ZFS unmount $opt $fs1 >/dev/null 2>&1" +done +$UMOUNT /tmp/$dir + +log_pass "zfs unmount fails with bad parameters or scenarios as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_009_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_009_pos.ksh new file mode 100644 index 0000000000..79c6fdabf0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_009_pos.ksh @@ -0,0 +1,123 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that zfs unmount and destroy in a snapshot directory will not cause error. +# +# STRATEGY: +# 1. Create a file in a zfs filesystem, snapshot it and change directory to snapshot directory +# 2. Verify that 'zfs unmount -a' will fail and 'zfs unmount -fa' will succeed +# 3. Verify 'ls' and 'cd /' will succeed +# 4. 'zfs mount -a' and change directory to snapshot directory again +# 5. Verify that zfs destroy snapshot will succeed +# 6. Verify 'ls' and 'cd /' will succeed +# 7. Create zfs filesystem, create a file, snapshot it and change to snapshot directory +# 8. Verify that zpool destroy the pool will succeed +# 9. Verify 'ls' 'cd /' 'zpool list' and etc will succeed +# + +verify_runnable "both" + +function cleanup +{ + DISK=${DISKS%% *} + + for fs in $TESTPOOL/$TESTFS $TESTPOOL ; do + typeset snap=$fs@$TESTSNAP + if snapexists $snap; then + log_must $ZFS destroy $snap + fi + done + + if ! poolexists $TESTPOOL && is_global_zone; then + log_must $ZPOOL create $TESTPOOL $DISK + fi + + if ! datasetexists $TESTPOOL/$TESTFS; then + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + fi +} + +function restore_dataset +{ + if ! datasetexists $TESTPOOL/$TESTFS ; then + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + log_must cd $TESTDIR + $ECHO hello > world + log_must $ZFS snapshot $TESTPOOL/$TESTFS@$TESTSNAP + log_must cd .zfs/snapshot/$TESTSNAP + fi +} + + +log_assert "zfs fource unmount and destroy in snapshot directory will not cause error." +log_onexit cleanup + +for fs in $TESTPOOL/$TESTFS $TESTPOOL ; do + typeset snap=$fs@$TESTSNAP + typeset mtpt=$(get_prop mountpoint $fs) + + log_must cd $mtpt + $ECHO hello > world + log_must $ZFS snapshot $snap + log_must cd .zfs/snapshot/$TESTSNAP + + log_mustnot $ZFS unmount -a + log_must $ZFS unmount -fa + log_mustnot $LS + log_must cd / + + log_must $ZFS mount -a + log_must cd $mtpt + log_must cd .zfs/snapshot/$TESTSNAP + + if is_global_zone || [[ $fs != $TESTPOOL ]] ; then + log_must $ZFS destroy -rf $fs + log_mustnot $LS + log_must cd / + fi + + restore_dataset +done + +if is_global_zone ; then + log_must $ZPOOL destroy -f $TESTPOOL + log_mustnot $LS + log_must cd / +fi + +log_must eval $ZFS list > /dev/null 2>&1 +log_must eval $ZPOOL list > /dev/null 2>&1 +log_must eval $ZPOOL status > /dev/null 2>&1 +$ZPOOL iostat > /dev/null 2>&1 + +log_pass "zfs fource unmount and destroy in snapshot directory will not cause error." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_all_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_all_001_pos.ksh new file mode 100644 index 0000000000..454293f01a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unmount/zfs_unmount_all_001_pos.ksh @@ -0,0 +1,195 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_unmount/zfs_unmount.kshlib + +# +# DESCRIPTION: +# Verify that 'zfs unmount -a[f]' succeeds as root. +# +# STRATEGY: +# 1. Create a group of pools with specified vdev. +# 2. Create zfs filesystems within the given pools. +# 3. Mount all the filesystems. +# 4. Verify that 'zfs unmount -a[f]' command succeed, +# and all available ZFS filesystems are unmounted. +# 5. Verify that 'zfs mount' is identical with 'df -F zfs' +# + +verify_runnable "both" + +set -A fs "$TESTFS" "$TESTFS1" +set -A ctr "" "$TESTCTR" "$TESTCTR1" "$TESTCTR/$TESTCTR1" +set -A vol "$TESTVOL" "$TESTVOL1" + +function setup_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + + while (( i < ${#ctr[*]} )); do + + path=${TEST_BASE_DIR%%/}/testroot$$/$TESTPOOL + if [[ -n ${ctr[i]} ]]; then + path=$path/${ctr[i]} + + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}" "$path" \ + "ctr" + fi + + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}/${vol[j]}" \ + "$path/${vol[j]}" \ + "vol" + ((j = j + 1)) + done + fi + j=0 + while (( j < ${#fs[*]} )); do + setup_filesystem "$DISKS" "$TESTPOOL" \ + "${ctr[i]}/${fs[j]}" \ + "$path/${fs[j]}" + ((j = j + 1)) + done + + ((i = i + 1)) + done + + return 0 +} + +function cleanup_all +{ + typeset -i i=0 + typeset -i j=0 + + ((i = ${#ctr[*]} - 1)) + + while (( i >= 0 )); do + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + cleanup_filesystem "$TESTPOOL" \ + "${ctr[i]}/${vol[j]}" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + cleanup_filesystem "$TESTPOOL" \ + "${ctr[i]}/${fs[j]}" + ((j = j + 1)) + done + + [[ -n ${ctr[i]} ]] && \ + cleanup_filesystem "$TESTPOOL" "${ctr[i]}" + + ((i = i - 1)) + done + + [[ -d ${TEST_BASE_DIR%%/}/testroot$$ ]] && \ + $RM -rf ${TEST_BASE_DIR%%/}/testroot$$ +} + +function verify_all +{ + typeset -i i=0 + typeset -i j=0 + typeset path + + while (( i < ${#ctr[*]} )); do + + path=$TESTPOOL + [[ -n ${ctr[i]} ]] && \ + path=$path/${ctr[i]} + + if is_global_zone ; then + j=0 + while (( j < ${#vol[*]} )); do + log_must unmounted "$path/${vol[j]}" + ((j = j + 1)) + done + fi + + j=0 + while (( j < ${#fs[*]} )); do + log_must unmounted "$path/${fs[j]}" + ((j = j + 1)) + done + + log_must unmounted "$path" + + ((i = i + 1)) + done + + return 0 +} + + +log_assert "Verify that 'zfs $unmountall' succeeds as root, " \ + "and all available ZFS filesystems are unmounted." + +log_onexit cleanup_all + +log_must setup_all + +typeset opt +for opt in "-a" "-fa"; do + export __ZFS_POOL_RESTRICT="$TESTPOOL" + log_must $ZFS $mountall + unset __ZFS_POOL_RESTRICT + + if [[ $opt == "-fa" ]]; then + mntpnt=$(get_prop mountpoint ${TESTPOOL}/${TESTCTR}/${TESTFS}) + cd $mntpnt + log_mustnot $ZFS unmount -a + fi + + export __ZFS_POOL_RESTRICT="$TESTPOOL" + log_must $ZFS unmount $opt + unset __ZFS_POOL_RESTRICT + + if [[ $opt == "-fa" ]]; then + cd /tmp + fi + + log_must verify_all + log_note "Verify that 'zfs $mountcmd' will display " \ + "all ZFS filesystems currently mounted." + log_must verify_mount_display + +done + +log_pass "'zfs mount -[f]a' succeeds as root, " \ + "and all available ZFS filesystems are unmounted." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/Makefile new file mode 100644 index 0000000000..a17c915078 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/Makefile @@ -0,0 +1,45 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_unshare + +PROGS = cleanup \ + setup \ + zfs_unshare_001_pos \ + zfs_unshare_002_pos \ + zfs_unshare_003_pos \ + zfs_unshare_004_neg \ + zfs_unshare_005_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/setup.ksh new file mode 100644 index 0000000000..bf935ad9f5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/setup.ksh @@ -0,0 +1,34 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# Make sure NFS server is running before testing. +setup_nfs_server + +DISK=${DISKS%% *} +default_container_volume_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_001_pos.ksh new file mode 100644 index 0000000000..033865b51a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_001_pos.ksh @@ -0,0 +1,173 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that 'zfs unshare <filesystem|mountpoint>' unshares a given shared +# filesystem. +# +# STRATEGY: +# 1. Share filesystems +# 2. Invoke 'zfs unshare <filesystem|mountpoint>' to unshare zfs file system +# 3. Verify that the file system is unshared +# 4. Verify that unsharing an unshared file system fails +# 5. Verify that "zfs unshare -a" succeeds to unshare all zfs file systems. +# + +verify_runnable "global" + +function cleanup +{ + typeset -i i=0 + while (( i < ${#mntp_fs[*]} )); do + log_must $ZFS set sharenfs=off ${mntp_fs[((i+1))]} + + ((i = i + 2)) + done + + if mounted $TESTPOOL/$TESTCLONE; then + log_must $ZFS unmount $TESTDIR2 + fi + + [[ -d $TESTDIR2 ]] && \ + log_must $RM -rf $TESTDIR2 + + if datasetexists "$TESTPOOL/$TESTCLONE"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTCLONE + fi + + if snapexists "$TESTPOOL/$TESTFS2@snapshot"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS2@snapshot + fi + + if datasetexists "$TESTPOOL/$TESTFS2"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS2 + fi +} + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# unshare the filesystem via <filesystem|mountpoint> argument +# and then verify it has been unshared. +# +function test_unshare # <mntp> <filesystem> +{ + typeset mntp=$1 + typeset filesystem=$2 + typeset prop_value + + prop_value=$(get_prop "sharenfs" $filesystem) + + if [[ $prop_value == "off" ]]; then + not_shared $mntp || + log_must $UNSHARE -F nfs $mntp + log_must $ZFS set sharenfs=on $filesystem + is_shared $mntp || \ + log_fail "'$ZFS set sharenfs=on' fails to make" \ + "file system $filesystem shared." + fi + + is_shared $mntp || log_must $ZFS share $filesystem + + # + # Verify 'zfs unshare <filesystem>' works as well. + # + log_must $ZFS unshare $filesystem + not_shared $mntp || log_fail "'zfs unshare <filesystem>' fails" + + log_must $ZFS share $filesystem + + log_must $ZFS unshare $mntp + not_shared $mntp || log_fail "'zfs unshare <mountpoint>' fails" + + log_note "Unsharing an unshared file system fails." + log_mustnot $ZFS unshare $filesystem + log_mustnot $ZFS unshare $mntp +} + +set -A mntp_fs \ + "$TESTDIR" "$TESTPOOL/$TESTFS" \ + "$TESTDIR1" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTDIR2" "$TESTPOOL/$TESTCLONE" + +log_assert "Verify that 'zfs unshare [-a] <filesystem|mountpoint>' succeeds as root." +log_onexit cleanup + +log_must $ZFS create $TESTPOOL/$TESTFS2 +log_must $ZFS snapshot $TESTPOOL/$TESTFS2@snapshot +log_must $ZFS clone $TESTPOOL/$TESTFS2@snapshot $TESTPOOL/$TESTCLONE +log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL/$TESTCLONE + +# +# Invoke 'test_unshare' routine to test 'zfs unshare <filesystem|mountpoint>'. +# +typeset -i i=0 +while (( i < ${#mntp_fs[*]} )); do + test_unshare ${mntp_fs[i]} ${mntp_fs[((i + 1 ))]} + + ((i = i + 2)) +done + +log_note "Verify '$ZFS unshare -a' succeds as root." + +i=0 +typeset sharenfs_val +while (( i < ${#mntp_fs[*]} )); do + sharenfs_val=$(get_prop "sharenfs" ${mntp_fs[((i+1))]}) + if [[ $sharenfs_val == "on" ]]; then + not_shared ${mntp_fs[i]} && \ + log_must $ZFS share ${mntp_fs[((i+1))]} + else + log_must $ZFS set sharenfs=on ${mntp_fs[((i+1))]} + is_shared ${mntp_fs[i]} || \ + log_fail "'$ZFS set sharenfs=on' fails to share filesystem." + fi + + ((i = i + 2)) +done + +# +# test 'zfs unshare -a ' +# +log_must $ZFS unshare -a + +# +# verify all shared filesystems become unshared +# +i=0 +while (( i < ${#mntp_fs[*]} )); do + not_shared ${mntp_fs[i]} || \ + log_fail "'$ZFS unshare -a' fails to unshare all shared zfs filesystems." + + ((i = i + 2)) +done + +log_pass "'$ZFS unshare [-a] <filesystem|mountpoint>' succeeds as root." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_002_pos.ksh new file mode 100644 index 0000000000..ea1d079df4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_002_pos.ksh @@ -0,0 +1,177 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that 'zfs unshare [-a] <filesystem|mountpoint>' is aware of legacy share. +# +# STRATEGY: +# 1. Set 'zfs set sharenfs=off' +# 2. Use 'share' to share given filesystem +# 3. Verify that 'zfs unshare <filesystem|mountpoint>' is aware of legacy share +# 4. Verify that 'zfs unshare -a' is aware of legacy share. +# + +verify_runnable "global" + +function cleanup +{ + typeset -i i=0 + while (( i < ${#mntp_fs[*]} )); do + is_shared ${mntp_fs[i]} && \ + log_must $UNSHARE -F nfs ${mntp_fs[i]} + + ((i = i + 2)) + done + + if mounted $TESTPOOL/$TESTCLONE; then + log_must $ZFS unmount $TESTDIR2 + fi + + [[ -d $TESTDIR2 ]] && \ + log_must $RM -rf $TESTDIR2 + + if datasetexists "$TESTPOOL/$TESTCLONE"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTCLONE + fi + + if snapexists "$TESTPOOL/$TESTFS2@snapshot"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS2@snapshot + fi + + if datasetexists "$TESTPOOL/$TESTFS2"; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS2 + fi +} + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# to verify 'zfs unshare' is aware of legacy share. +# +function test_legacy_unshare # <mntp> <filesystem> +{ + typeset mntp=$1 + typeset filesystem=$2 + + log_must $ZFS set sharenfs=off $filesystem + not_shared $mntp || \ + log_fail "'zfs set sharenfs=off' fails to make ZFS " \ + "filesystem $filesystem unshared." + + log_must $SHARE -F nfs $mntp + is_shared $mntp || \ + log_fail "'share' command fails to share ZFS file system." + # + # Verify 'zfs unshare <filesystem>' is aware of legacy share. + # + log_mustnot $ZFS unshare $filesystem + is_shared $mntp || \ + log_fail "'zfs unshare <filesystem>' fails to be aware" \ + "of legacy share." + + # + # Verify 'zfs unshare <filesystem>' is aware of legacy share. + # + log_mustnot $ZFS unshare $mntp + is_shared $mntp || \ + log_fail "'zfs unshare <mountpoint>' fails to be aware" \ + "of legacy share." +} + + +set -A mntp_fs \ + "$TESTDIR" "$TESTPOOL/$TESTFS" \ + "$TESTDIR1" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTDIR2" "$TESTPOOL/$TESTCLONE" + +log_assert "Verify that 'zfs unshare [-a]' is aware of legacy share." +log_onexit cleanup + +log_must $ZFS create $TESTPOOL/$TESTFS2 +log_must $ZFS snapshot $TESTPOOL/$TESTFS2@snapshot +log_must $ZFS clone $TESTPOOL/$TESTFS2@snapshot $TESTPOOL/$TESTCLONE +log_must $ZFS set mountpoint=$TESTDIR2 $TESTPOOL/$TESTCLONE + +# +# Invoke 'test_legacy_unshare' routine to verify. +# +typeset -i i=0 +while (( i < ${#mntp_fs[*]} )); do + test_legacy_unshare ${mntp_fs[i]} ${mntp_fs[((i + 1 ))]} + + ((i = i + 2)) +done + + +log_note "Verify '$ZFS unshare -a' is aware of legacy share." + +# +# set the 'sharenfs' property to 'off' for each filesystem +# +i=0 +while (( i < ${#mntp_fs[*]} )); do + log_must $ZFS set sharenfs=off ${mntp_fs[((i + 1))]} + not_shared ${mntp_fs[i]} || \ + log_fail "'$ZFS set sharenfs=off' unshares file system failed." + + ((i = i + 2)) +done + +# +# Share each of the file systems via legacy share. +# +i=0 +while (( i < ${#mntp_fs[*]} )); do + $SHARE -F nfs ${mntp_fs[i]} + is_shared ${mntp_fs[i]} || \ + log_fail "'$SHARE' shares ZFS filesystem failed." + + ((i = i + 2)) +done + +# +# Verify that 'zfs unshare -a' is aware of legacy share +# +log_must $ZFS unshare -a + +# +# verify ZFS filesystems are still shared +# +i=0 +while (( i < ${#mntp_fs[*]} )); do + is_shared ${mntp_fs[i]} || \ + log_fail "'$ZFS unshare -a' fails to be aware of legacy share." + + ((i = i + 2)) +done + +log_pass "'$ZFS unshare [-a]' succeeds to be aware of legacy share." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_003_pos.ksh new file mode 100644 index 0000000000..74cc41dbc7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_003_pos.ksh @@ -0,0 +1,90 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that a file system and its dependant are unshared when turn off sharenfs +# property. +# +# STRATEGY: +# 1. Create a file system +# 2. Set the sharenfs property on the file system +# 3. Create a snapshot +# 4. Verify that both are shared +# 5. Turn off the sharenfs property +# 6. Verify that both are unshared. +# + +verify_runnable "global" + +function cleanup +{ + if snapexists $TESTPOOL/$TESTFS@snapshot; then + log_must $ZFS destroy $TESTPOOL/$TESTFS@snapshot + fi + + log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS +} + +# +# Main test routine. +# +# Given a mountpoint and file system this routine will attempt +# unshare the mountpoint and then verify a snapshot of the mounpoint +# is also unshared. +# +function test_snap_unshare # <mntp> <filesystem> +{ + typeset mntp=$1 + typeset filesystem=$2 + typeset prop_value + + prop_value=$(get_prop "sharenfs" $filesystem) + + if [[ $prop_value == "off" ]]; then + is_shared $mntp || $UNSHARE -F nfs $mntp + log_must $ZFS set sharenfs=on $filesystem + fi + + log_must $ZFS set sharenfs=off $filesystem + + not_shared $mntp || \ + log_fail "File system $filesystem is shared (set sharenfs)." + + not_shared $mntp@snapshot || \ + log_fail "Snapshot $mntpt@snapshot is shared (set sharenfs)." +} + +log_assert "Verify that a file system and its dependant are unshared." +log_onexit cleanup + +log_must $ZFS snapshot $TESTPOOL/$TESTFS@snapshot +test_snap_unshare $TESTDIR $TESTPOOL/$TESTFS + +log_pass "A file system and its dependant are both unshared as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_004_neg.ksh new file mode 100644 index 0000000000..29c5fb9395 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_004_neg.ksh @@ -0,0 +1,84 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that "zfs unshare" issue error message with badly formed parameter. +# +# STRATEGY: +# 1. Define badly formed parameters +# 2. Invoke 'zfs unshare' +# 3. Verify that unshare fails and issue error message. +# + +verify_runnable "global" + +export NONEXISTFSNAME="nonexistfs50charslong_0123456789012345678901234567" +export NONEXISTMOUNTPOINT="/nonexistmountpoint_0123456789" + +set -A opts "" "$TESTPOOL/$NONEXISTFSNAME" "$NONEEXISTMOUNTPOINT" "-?" "-1" \ + "-a blah" "$TESTPOOL/$TESTFS $TESTPOOL/$TESTFS1" \ + "-f $TESTPOOL/$TESTFS $TESTPOOL/$TESTFS1" \ + "$TESTPOOL/$TESTFS $TESTDIR" "-f $TESTPOOL/$TESTFS $TESTDIR" \ + "${TESTDIR#/}" "-f ${TESTDIR#/}" + +log_assert "Verify that '$ZFS unshare' issue error message with badly formed parameter." + +shareval=$(get_prop sharenfs $TESTPOOL/$TESTFS) +if [[ $shareval == off ]]; then + log_must $ZFS set sharenfs=on $TESTPOOL/$TESTFS +fi + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZFS unshare ${args[i]} + + ((i = i + 1)) +done + +#Testing that unsharing unshared filesystem fails. +mpt=$(get_prop mountpoint $TESTPOOL/$TESTFS) +log_must $ZFS unshare $TESTPOOL/$TESTFS +for opt in "" "-f"; do + log_mustnot eval "$ZFS unshare $opt $TESTPOOL/$TESTFS >/dev/null 2>&1" + log_mustnot eval "$ZFS unshare $opt $mpt >/dev/null 2>&1" +done + +#Testing zfs unshare fails with legacy share set +log_must $ZFS set sharenfs=off $TESTPOOL/$TESTFS +for opt in "" "-f"; do + log_mustnot eval "$ZFS unshare $opt $TESTPOOL/$TESTFS >/dev/null 2>&1" + log_mustnot eval "$ZFS unshare $opt $mpt >/dev/null 2>&1" +done + +log_pass "'$ZFS unshare' fails as expected with badly-formed parameters." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_005_neg.ksh new file mode 100644 index 0000000000..d6fd5d0b8c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_unshare/zfs_unshare_005_neg.ksh @@ -0,0 +1,56 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify that unsharing a dataset and mountpoint other than filesystem fails. +# +# STRATEGY: +# 1. Create a volume, dataset other than a ZFS file system +# 2. Verify that the datasets other than file system are not support by 'zfs unshare'. +# + +verify_runnable "both" + +set -A datasets \ + "$TESTPOOL" "$ZFSROOT/$TESTPOOL" \ + "$TESTPOOL/$TESTCTR" "$ZFSROOT/$TESTPOOL/$TESTCTR" \ + "$TESTPOOL/$TESTVOL" "/dev/zvol/dsk/$TESTPOOL/$TESTVOL" + +log_assert "Verify that unsharing a dataset other than filesystem fails." + +typeset -i i=0 +while (( i < ${#datasets[*]} )) +do + log_mustnot $ZFS unshare ${datasets[i]} + + ((i = i + 1)) +done + +log_pass "Unsharing datasets other than filesystem failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/Makefile new file mode 100644 index 0000000000..565b0b9ae4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/Makefile @@ -0,0 +1,49 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zfs_upgrade + +PROGS = cleanup \ + setup \ + zfs_upgrade_001_pos \ + zfs_upgrade_002_pos \ + zfs_upgrade_003_pos \ + zfs_upgrade_004_pos \ + zfs_upgrade_005_pos \ + zfs_upgrade_006_neg \ + zfs_upgrade_007_neg + +FILES = zfs_upgrade.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/cleanup.ksh new file mode 100644 index 0000000000..833f96b024 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/cleanup.ksh @@ -0,0 +1,33 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "both" + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/setup.ksh new file mode 100644 index 0000000000..a9258759c4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/setup.ksh @@ -0,0 +1,42 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "both" + +# This should have been set by the .cfg script - verify it's set to something +# (we check that something later on) +if [ -z "$ZFS_VERSION" ] +then + log_unresolved "Unable to determine ZFS Filesystem version of this machine" +else + log_note "This machine is running ZFS Filesystem version $ZFS_VERSION" +fi + +default_setup $DISKS diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib new file mode 100644 index 0000000000..b622c94e4e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib @@ -0,0 +1,179 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# For zfs create. +# +set -A zpl_create_versions 3 4 5 +set -A spa_create_versions 9 15 24 + +# +# For zfs upgrade +# +set -A zpl_upgrade_versions 3 4 5 +set -A spa_upgrade_versions 9 15 24 + +function default_setup_datasets #rootfs +{ + typeset rootfs=$1 + typeset pool=${rootfs%%/*} + typeset -i vp=$(get_pool_prop version $pool) + typeset -i version + typeset -i m + typeset -i spa_version + typeset -i zpl_version + + for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + + (( m=0 )) + (( spa_version=0 )) + while (( m < ${#zpl_create_versions[@]} )); do + (( zpl_version=${zpl_create_versions[m]} )) + if (( version == zpl_version )); then + (( spa_version=${spa_create_versions[m]} )) + break + fi + (( m+=1 )) + done + if (( spa_version != 0 )) && (( vp < spa_version )); then + log_mustnot $ZFS create -o version=${version} ${current_fs} + continue + fi + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + + for subversion in $ZFS_ALL_VERSIONS ; do + typeset subverfs + eval subverfs=\$ZFS_VERSION_$subversion + + (( m=0 )) + (( spa_version=0 )) + while (( m < ${#zpl_create_versions[@]} )); do + (( zpl_version=${zpl_create_versions[m]} )) + if (( subversion == zpl_version )); then + (( spa_version=${spa_create_versions[m]} )) + break + fi + (( m+=1 )) + done + if (( spa_version != 0 )) && (( vp < spa_version )); then + log_mustnot $ZFS create -o \ + version=${subversion} ${current_fs}/$subverfs + else + log_must $ZFS create -o \ + version=${subversion} ${current_fs}/$subverfs + fi + done + done +} + +function default_cleanup_datasets #rootfs +{ + typeset rootfs=$1 + + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + + if datasetnonexists $rootfs ; then + log_must $ZFS create $rootfs + fi +} + +function default_check_zfs_upgrade #rootfs +{ + typeset rootfs=$1 + typeset pool=${rootfs%%/*} + typeset -i vp=$(get_pool_prop version $pool) + typeset -i m + typeset -i spa_version + typeset -i zpl_version + typeset newv + typeset -i df_ret + + $DF -F zfs / > /dev/null 2>&1 + df_ret=$? + + for newv in "" $ZFS_VERSION; do + default_setup_datasets $rootfs + if [[ -n $newv ]]; then + opt="-V $newv" + else + newv=$ZFS_VERSION + fi + + (( m=0 )) + (( spa_version=0 )) + while (( m < ${#zpl_upgrade_versions[@]} )); do + (( zpl_version=${zpl_upgrade_versions[m]} )) + if (( newv == zpl_version )); then + (( spa_version=${spa_upgrade_versions[m]} )) + break + fi + (( m+=1 )) + done + + if (( df_ret != 0 )); then + if (( spa_version != 0 )) && (( vp < spa_version )); then + log_mustnot eval '$ZFS upgrade $opt -a > /dev/null 2>&1' + log_must eval '$ZPOOL upgrade $pool > /dev/null 2>&1' + vp=$(get_pool_prop version $pool) + fi + + log_must eval '$ZFS upgrade $opt -a > /dev/null 2>&1' + + for fs in $($ZFS list -rH -t filesystem -o name $rootfs) ; do + log_must check_fs_version $fs $newv + done + fi + + default_cleanup_datasets $rootfs + done +} + +function check_fs_version #filesystem version +{ + typeset fs=$1 + typeset -i version=${2:-$ZFS_VERSION} + + if [[ -z $fs ]]; then + log_fail "No filesystem specified." + fi + + typeset -i curv=$(get_prop version $fs) + if (( curv != version )); then + return 1 + fi + return 0 +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_001_pos.ksh new file mode 100644 index 0000000000..0a4c76b254 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_001_pos.ksh @@ -0,0 +1,136 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# Executing 'zfs upgrade' command succeeds, it should report +# the current system version and list all old-version filesystems. +# If no old-version filesystems be founded, it prints out +# "All filesystems are formatted with the current version." +# +# STRATEGY: +# 1. Prepare a set of datasets which contain old-version and current version. +# 2. Execute 'zfs upgrade', verify return 0, and it prints out +# the current system version and list all old-version filesystems. +# 3. Remove all old-version filesystems, then execute 'zfs upgrade' again, +# verify return 0, and get the expected message. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + log_must $ZFS create $rootfs + + for file in $output $oldoutput ; do + if [[ -f $file ]]; then + log_must $RM -f $file + fi + done +} + +log_assert "Executing 'zfs upgrade' command succeeds." +log_onexit cleanup + +rootfs=$TESTPOOL/$TESTFS +typeset output=/tmp/zfs-versions.$$ +typeset oldoutput=/tmp/zfs-versions-old.$$ +typeset expect_str1="This system is currently running ZFS filesystem version" +typeset expect_str2="All filesystems are formatted with the current version" +typeset expect_str3="The following filesystems are out of date, and can be upgraded" +typeset -i COUNT OLDCOUNT + +$ZFS upgrade | $NAWK '$1 ~ "^[0-9]+$" {print $2}'> $oldoutput +OLDCOUNT=$( $WC -l $oldoutput | $AWK '{print $1}' ) + +old_datasets="" +for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + + if (( version != $ZFS_VERSION )); then + old_datasets="$old_datasets ${current_fs} ${current_clone}" + fi +done + +if is_global_zone; then + log_must $ZFS create -V 100m $rootfs/$TESTVOL +fi + +log_must eval '$ZFS upgrade > $output 2>&1' + +# we also check that the usage message contains at least a description +# of the current ZFS version. +log_must eval '$GREP "${expect_str1} $ZFS_VERSION" $output > /dev/null 2>&1' +$ZFS upgrade | $NAWK '$1 ~ "^[0-9]+$" {print $2}'> $output +COUNT=$( $WC -l $output | $AWK '{print $1}' ) + +typeset -i i=0 +for fs in ${old_datasets}; do + log_must $GREP "^$fs$" $output + (( i = i + 1 )) +done + +if (( i != COUNT - OLDCOUNT )); then + $CAT $output + log_fail "More old-version filesystems print out than expect." +fi + +for fs in $old_datasets ; do + if datasetexists $fs ; then + log_must $ZFS destroy -Rf $fs + fi +done + +log_must eval '$ZFS upgrade > $output 2>&1' +log_must eval '$GREP "${expect_str1} $ZFS_VERSION" $output > /dev/null 2>&1' +if (( OLDCOUNT == 0 )); then + log_must eval '$GREP "${expect_str2}" $output > /dev/null 2>&1' +else + log_must eval '$GREP "${expect_str3}" $output > /dev/null 2>&1' +fi +$ZFS upgrade | $NAWK '$1 ~ "^[0-9]+$" {print $2}'> $output +COUNT=$( $WC -l $output | $AWK '{print $1}' ) + +if (( COUNT != OLDCOUNT )); then + $CAT $output + log_fail "Unexpect old-version filesystems print out." +fi + +log_pass "Executing 'zfs upgrade' command succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_002_pos.ksh new file mode 100644 index 0000000000..2b7fd3999e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_002_pos.ksh @@ -0,0 +1,63 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# Executing 'zfs upgrade -v ' command succeeds, it should +# show the info of available versions. +# +# STRATEGY: +# 1. Execute 'zfs upgrade -v', verify return value is 0. +# 2, Verify all the available versions info are printed out. +# + +verify_runnable "both" + +function cleanup +{ + if [[ -f $output ]]; then + log_must $RM -f $output + fi +} + +log_assert "Executing 'zfs upgrade -v' command succeeds." +log_onexit cleanup + +typeset output=/tmp/zfs-versions.$$ +typeset expect_str1="Initial ZFS filesystem version" +typeset expect_str2="Enhanced directory entries" + +log_must eval '$ZFS upgrade -v > /dev/null 2>&1' + +$ZFS upgrade -v | $NAWK '$1 ~ "^[0-9]+$" {print $0}'> $output +log_must eval '$GREP "${expect_str1}" $output > /dev/null 2>&1' +log_must eval '$GREP "${expect_str2}" $output > /dev/null 2>&1' + +log_pass "Executing 'zfs upgrade -v' command succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_003_pos.ksh new file mode 100644 index 0000000000..95b05b20f9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_003_pos.ksh @@ -0,0 +1,100 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# Executing 'zfs upgrade [-V version] filesystem' command succeeds, +# it could upgrade a filesystem to specific version or current version. +# +# STRATEGY: +# 1. Prepare a set of datasets which contain old-version and current version. +# 2. Execute 'zfs upgrade [-V version] filesystem', verify return 0, +# 3. Verify the filesystem be updated as expected. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + log_must $ZFS create $rootfs +} + +function setup_datasets +{ + datasets="" + for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + datasets="$datasets ${current_fs} ${current_clone}" + done +} + +log_assert "Executing 'zfs upgrade [-V version] filesystem' command succeeds." +log_onexit cleanup + +rootfs=$TESTPOOL/$TESTFS +typeset datasets + +typeset newv +for newv in "" "current" $ZFS_ALL_VERSIONS; do + setup_datasets + for fs in $datasets ; do + typeset -i oldv=$(get_prop version $fs) + + if [[ -n $newv ]]; then + opt="-V $newv" + if [[ $newv == current ]]; then + newv=$ZFS_VERSION + fi + else + newv=$ZFS_VERSION + fi + + if (( newv >= oldv )); then + log_must eval '$ZFS upgrade $opt $fs > /dev/null 2>&1' + log_must check_fs_version $fs $newv + else + log_mustnot eval '$ZFS upgrade $opt $fs > /dev/null 2>&1' + log_must check_fs_version $fs $oldv + fi + done + cleanup +done + +log_pass "Executing 'zfs upgrade [-V version] filesystem' command succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_004_pos.ksh new file mode 100644 index 0000000000..67f441928a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_004_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# Executing 'zfs upgrade -r [-V version] filesystem' command succeeds, +# it upgrade filesystem recursively to specific or current version. +# +# STRATEGY: +# 1. Prepare a set of datasets which contain old-version and current version. +# 2. Execute 'zfs upgrade -r [-V version] filesystem', verify return 0, +# 3. Verify the filesystem be updated recursively as expected. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + log_must $ZFS create $rootfs +} + +function setup_datasets +{ + datasets="" + for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + + for subversion in $ZFS_ALL_VERSIONS ; do + typeset subverfs + eval subverfs=\$ZFS_VERSION_$subversion + log_must $ZFS create -o version=${subversion} \ + ${current_fs}/$subverfs + done + datasets="$datasets ${current_fs}" + done +} + +log_assert "Executing 'zfs upgrade -r [-V version] filesystem' command succeeds." +log_onexit cleanup + +rootfs=$TESTPOOL/$TESTFS + +typeset datasets + +typeset newv +for newv in "" "current" $ZFS_VERSION; do + setup_datasets + for topfs in $datasets ; do + if [[ -n $newv ]]; then + opt="-V $newv" + if [[ $newv == current ]]; then + newv=$ZFS_VERSION + fi + else + newv=$ZFS_VERSION + fi + + log_must eval '$ZFS upgrade -r $opt $topfs > /dev/null 2>&1' + + for fs in $($ZFS list -rH -t filesystem -o name $topfs) ; do + log_must check_fs_version $fs $newv + done + done + cleanup +done + +log_pass "Executing 'zfs upgrade -r [-V version] filesystem' command succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_005_pos.ksh new file mode 100644 index 0000000000..7612071905 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_005_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# Executing 'zfs upgrade [-V version] -a' command succeeds, +# it upgrade all filesystems to specific or current version. +# +# STRATEGY: +# 1. Prepare a set of datasets which contain old-version and current version. +# 2. Execute 'zfs upgrade [-V version] -a', verify return 0, +# 3. Verify all the filesystems be updated as expected. +# + +verify_runnable "both" + +function cleanup +{ + if datasetexists $rootfs ; then + log_must $ZFS destroy -Rf $rootfs + fi + log_must $ZFS create $rootfs +} + +function setup_datasets +{ + datasets="" + for version in $ZFS_ALL_VERSIONS ; do + typeset verfs + eval verfs=\$ZFS_VERSION_$version + typeset current_fs=$rootfs/$verfs + typeset current_snap=${current_fs}@snap + typeset current_clone=$rootfs/clone$verfs + log_must $ZFS create -o version=${version} ${current_fs} + log_must $ZFS snapshot ${current_snap} + log_must $ZFS clone ${current_snap} ${current_clone} + + for subversion in $ZFS_ALL_VERSIONS ; do + typeset subverfs + eval subverfs=\$ZFS_VERSION_$subversion + log_must $ZFS create -o version=${subversion} \ + ${current_fs}/$subverfs + done + datasets="$datasets ${current_fs}" + done +} + +log_assert "Executing 'zfs upgrade [-V version] -a' command succeeds." +log_onexit cleanup + +rootfs=$TESTPOOL/$TESTFS + +typeset datasets + +typeset newv +for newv in "" "current" $ZFS_VERSION; do + setup_datasets + if [[ -n $newv ]]; then + opt="-V $newv" + if [[ $newv == current ]]; then + newv=$ZFS_VERSION + fi + else + newv=$ZFS_VERSION + fi + + export __ZFS_POOL_RESTRICT="$TESTPOOL" + log_must $ZFS upgrade $opt -a + unset __ZFS_POOL_RESTRICT + + for fs in $($ZFS list -rH -t filesystem -o name $rootfs) ; do + log_must check_fs_version $fs $newv + done + cleanup +done + +log_pass "Executing 'zfs upgrade [-V version] -a' command succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_006_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_006_neg.ksh new file mode 100644 index 0000000000..6cd3bb4536 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_006_neg.ksh @@ -0,0 +1,54 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# Verify that invalid upgrade parameters and options are caught. +# +# STRATEGY: +# 1. Create a ZFS file system. +# 2. For each option in the list, try 'zfs upgrade'. +# 3. Verify that the operation fails as expected. +# + +verify_runnable "both" + +set -A args "" "-?" "-A" "-R" "-b" "-c" "-d" "--invalid" \ + "-V" "-V $TESTPOOL/$TESTFS" "-V $TESTPOOL $TESTPOOL/$TESTFS" + +log_assert "Badly-formed 'zfs upgrade' should return an error." + +typeset -i i=1 +while (( i < ${#args[*]} )); do + log_mustnot $ZFS upgrade ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly-formed 'zfs upgrade' fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_007_neg.ksh new file mode 100644 index 0000000000..cdc7e4140e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zfs_upgrade/zfs_upgrade_007_neg.ksh @@ -0,0 +1,55 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# Verify that version should only by '1' '2' or current version, +# non-digit input are invalid. +# +# STRATEGY: +# 1. For each invalid value of version in the list, try 'zfs upgrade -V version'. +# 2. Verify that the operation fails as expected. +# + +verify_runnable "both" + +set -A args \ + "0" "0.000" "0.5" "-1.234" "-1" "1234b" "5678x" + +log_assert "Set invalid value or non-digit version should fail as expected." + +typeset -i i=0 +while (( i < ${#args[*]} )) +do + log_mustnot $ZFS upgrade -V ${args[i]} $TESTPOOL/$TESTFS + ((i = i + 1)) +done + +log_pass "Set invalid value or non-digit version fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/Makefile new file mode 100644 index 0000000000..e52cadaae9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/Makefile @@ -0,0 +1,43 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool + +PROGS = cleanup \ + setup \ + zpool_001_neg \ + zpool_002_pos \ + zpool_003_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/zpool_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/zpool_001_neg.ksh new file mode 100644 index 0000000000..7b37644265 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/zpool_001_neg.ksh @@ -0,0 +1,65 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# A badly formed sub-command passed to zpool(1) should +# return an error. +# +# STRATEGY: +# 1. Create an array containg each zpool sub-command name. +# 2. For each element, execute the sub-command. +# 3. Verify it returns an error. +# + +verify_runnable "both" + + +set -A args "" "create" "add" "destroy" "import fakepool" \ + "export fakepool" "create fakepool" "add fakepool" \ + "create mirror" "create raidz" "create raidz1" \ + "create mirror fakepool" "create raidz fakepool" \ + "create raidz1 fakepool" "create raidz2 fakepool" \ + "create fakepool mirror" "create fakepool raidz" \ + "create fakepool raidz1" "create fakepool raidz2" \ + "add fakepool mirror" "add fakepool raidz" \ + "add fakepool raidz1" "add fakepool raidz2" \ + "add mirror fakepool" "add raidz fakepool" \ + "add raidz1 fakepool" "add raidz2 fakepool" \ + "setvprop" "blah blah" "-%" "--" "--?" "-*" "-=" + +log_assert "Execute zpool sub-command without proper parameters." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL ${args[i]} + + ((i = i + 1)) +done + +log_pass "Badly formed zpool sub-commands fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/zpool_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/zpool_002_pos.ksh new file mode 100644 index 0000000000..e8ed789b5a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/zpool_002_pos.ksh @@ -0,0 +1,94 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# With ZFS_ABORT set, all zpool commands should be able to abort and generate a core file. +# +# STRATEGY: +# 1. Create an array of zpool command +# 2. Execute each command in the array +# 3. Verify the command aborts and generate a core file +# + +verify_runnable "global" + +function cleanup +{ + unset ZFS_ABORT + + if [[ -d $corepath ]]; then + $RM -rf $corepath + fi + if poolexists $pool; then + log_must $ZPOOL destroy -f $pool + fi +} + +log_assert "With ZFS_ABORT set, all zpool commands can abort and generate a core file." +log_onexit cleanup + +#preparation work for testing +corepath=$TESTDIR/core +if [[ -d $corepath ]]; then + $RM -rf $corepath +fi +$MKDIR $corepath + +pool=pool.$$ +vdev1=$TESTDIR/file1 +vdev2=$TESTDIR/file2 +vdev3=$TESTDIR/file3 +for vdev in $vdev1 $vdev2 $vdev3; do + $MKFILE 64m $vdev +done + +set -A cmds "create $pool mirror $vdev1 $vdev2" "list $pool" "iostat $pool" \ + "status $pool" "upgrade $pool" "get delegation $pool" "set delegation=off $pool" \ + "export $pool" "import -d $TESTDIR $pool" "offline $pool $vdev1" \ + "online $pool $vdev1" "clear $pool" "detach $pool $vdev2" \ + "attach $pool $vdev1 $vdev2" "replace $pool $vdev2 $vdev3" \ + "scrub $pool" "destroy -f $pool" + +set -A badparams "" "create" "destroy" "add" "remove" "list *" "iostat" "status" \ + "online" "offline" "clear" "attach" "detach" "replace" "scrub" \ + "import" "export" "upgrade" "history -?" "get" "set" + +$COREADM -p ${corepath}/core.%f +export ZFS_ABORT=yes + +for subcmd in "${cmds[@]}" "${badparams[@]}"; do + $ZPOOL $subcmd >/dev/null 2>&1 + corefile=${corepath}/core.zpool + if [[ ! -e $corefile ]]; then + log_fail "$ZPOOL $subcmd cannot generate core file with ZFS_ABORT set." + fi + $RM -f $corefile +done + +log_pass "With ZFS_ABORT set, zpool command can abort and generate core file as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/zpool_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/zpool_003_pos.ksh new file mode 100644 index 0000000000..dc6b6b287b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool/zpool_003_pos.ksh @@ -0,0 +1,70 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify debugging features of zpool such as ABORT and freeze/unfreeze +# should run successfully. +# +# STRATEGY: +# 1. Create an array containg each zpool options. +# 2. For each element, execute the zpool command. +# 3. Verify it run successfully. +# + +verify_runnable "both" + +log_assert "Debugging features of zpool should succeed." + +log_must $ZPOOL -? > /dev/null 2>&1 + +if is_global_zone ; then + log_must $ZPOOL freeze $TESTPOOL +else + log_mustnot $ZPOOL freeze $TESTPOOL + log_mustnot $ZPOOL freeze ${TESTPOOL%%/*} +fi + +log_mustnot $ZPOOL freeze fakepool + +# Remove corefile possibly left by previous failing run of this test. +[[ -f core ]] && log_must rm -f core + +ZFS_ABORT=1; export ZFS_ABORT +$ZPOOL > /dev/null 2>&1 +unset ZFS_ABORT + +[[ -f core ]] || log_fail "$ZPOOL did not dump core by request." +[[ -f core ]] && log_must rm -f core + +log_pass "Debugging features of zpool succeed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/Makefile new file mode 100644 index 0000000000..64e80bc285 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/Makefile @@ -0,0 +1,52 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_add + +PROGS = cleanup \ + setup \ + zpool_add_001_pos \ + zpool_add_002_pos \ + zpool_add_003_pos \ + zpool_add_004_pos \ + zpool_add_005_pos \ + zpool_add_006_pos \ + zpool_add_007_neg \ + zpool_add_008_neg \ + zpool_add_009_neg + +FILES = zpool_add.cfg \ + zpool_add.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/cleanup.ksh new file mode 100644 index 0000000000..15f77dd7e1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/cleanup.ksh @@ -0,0 +1,37 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +cleanup_devices $DISKS + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/setup.ksh new file mode 100644 index 0000000000..4457e2a0a1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/setup.ksh @@ -0,0 +1,56 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +verify_runnable "global" + +if ! $(is_physical_device $DISKS) ; then + log_unsupported "This directory cannot be run on raw files." +fi + +if [[ -n $DISK ]]; then + # + # Use 'zpool create' to clean up the infomation in + # in the given disk to avoid slice overlapping. + # + cleanup_devices $DISK + + partition_disk $SIZE $DISK 7 +else + for disk in `$ECHO $DISKSARRAY`; do + cleanup_devices $disk + partition_disk $SIZE $disk 7 + done +fi + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.cfg new file mode 100644 index 0000000000..e8578830fa --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.cfg @@ -0,0 +1,100 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export DISK_ARRAY_NUM=0 +export DISK_ARRAY_LIMIT=4 +export DISKSARRAY="" + +# +# Variables for zpool_add_006 +# +export STF_TIMEOUT=2400 +export VDEVS_NUM=300 +export FILE_SIZE=100 #100mb + +function set_disks +{ + set -A disk_array $(find_disks $DISKS) + + if (( ${#disk_array[*]} <= 1 )); then + export DISK=${DISKS%% *} + else + export DISK="" + typeset -i i=0 + while (( i < ${#disk_array[*]} )); do + export DISK${i}="${disk_array[$i]}" + DISKSARRAY="$DISKSARRAY ${disk_array[$i]}" + (( i = i + 1 )) + (( i>$DISK_ARRAY_LIMIT )) && break + done + export DISK_ARRAY_NUM=$i + export DISKSARRAY + fi + + if (( $DISK_ARRAY_NUM == 0 )); then + export disk=$DISK + else + export disk=$DISK0 + fi + +} + +set_disks + +export FILESIZE="100m" +export FILESIZE1="150m" +export SIZE="150m" +export SIZE1="250m" +export SLICE0=0 +export SLICE1=1 +export SLICE2=2 +export SLICE3=3 +export SLICE4=4 +export SLICE5=5 +export SLICE6=6 +export SLICE7=7 + +export FILEDISK=filedisk.zpool_add +export FILEDISK0=filedisk0.zpool_add +export FILEDISK1=filedisk1.zpool_add +export FILEDISK2=filedisk2.zpool_add +export FILEDISK3=filedisk3.zpool_add + +export VOLSIZE=64mb + +export BYND_MAX_NAME="byondmaxnamelength\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.kshlib new file mode 100644 index 0000000000..3a3498be87 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add.kshlib @@ -0,0 +1,147 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.cfg + +# +# check if the <pool> contains <vdev> ... +# +# $1 pool +# $2..n <vdev> ... +# +# Return 0 if <vdev> are contained in the <pool>; 1 if not used; 2 if pool +# name is missing +# +function iscontained +{ + typeset pool=$1 + typeset vdev + + if [[ -z $pool ]]; then + log_note "Missing pool name." + return 2 + fi + + shift + + for vdev in $@; do + +# remove /dev/dsk in vdev if there is + $ECHO $vdev | $GREP "^/dev/dsk" >/dev/null 2>&1 + (( $? == 0 )) && \ + vdev=${vdev##*/} + + $ZPOOL status "$pool" | $AWK '$1 == vdevname {exit 1}' \ + vdevname=$vdev >/dev/null 2>&1 + (( $? != 1 )) && \ + return 1 + done + + return 0; + +} + +# +# Find the storage device in /etc/vfstab +# +function find_vfstab_dev +{ + typeset vfstab="/etc/vfstab" + typeset tmpfile="/tmp/vfstab.tmp" + typeset vfstabdev + typeset vfstabdevs="" + typeset line + + $CAT $vfstab | $GREP "^/dev/dsk" >$tmpfile + while read -r line + do + vfstabdev=`$ECHO "$line" | $AWK '{print $1}'` + vfstabdev=${vfstabdev%%:} + vfstabdevs="$vfstabdev $vfstabdevs" + done <$tmpfile + + $RM -f $tmpfile + $ECHO $vfstabdevs +} + +# +# Find the storage device in /etc/mnttab +# +function find_mnttab_dev +{ + typeset mnttab="/etc/mnttab" + typeset tmpfile="/tmp/mnttab.tmp" + typeset mnttabdev + typeset mnttabdevs="" + typeset line + + $CAT $mnttab | $GREP "^/dev/dsk" >$tmpfile + while read -r line + do + mnttabdev=`$ECHO "$line" | $AWK '{print $1}'` + mnttabdev=${mnttabdev%%:} + mnttabdevs="$mnttabdev $mnttabdevs" + done <$tmpfile + + $RM -f $tmpfile + $ECHO $mnttabdevs +} + +# +# Save the systme current dump device configuration +# +function save_dump_dev +{ + + typeset dumpdev + typeset fnd="Dump device" + + dumpdev=`$DUMPADM | $GREP "$fnd" | $CUT -f2 -d : | \ + $AWK '{print $1}'` + $ECHO $dumpdev +} + +# +# Common cleanup routine for partitions used in testing +# +function partition_cleanup +{ + + if [[ -n $DISK ]]; then + partition_disk $SIZE $DISK 7 + else + typeset disk="" + for disk in $DISK0 $DISK1; do + partition_disk $SIZE $disk 7 + done + fi + +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_001_pos.ksh new file mode 100644 index 0000000000..f0ea12641b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_001_pos.ksh @@ -0,0 +1,123 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +# +# DESCRIPTION: +# 'zpool add <pool> <vdev> ...' can successfully add the specified +# devices to the given pool +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add spare devices to the pool +# 3. Verify the devices are added to the pool successfully +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +log_assert "'zpool add <pool> <vdev> ...' can add devices to the pool." + +log_onexit cleanup + +set -A keywords "" "mirror" "raidz" "raidz1" "spare" + +case $DISK_ARRAY_NUM in +0|1) + pooldevs="${disk}s${SLICE0} \ + /dev/dsk/${disk}s${SLICE0} \ + \"${disk}s${SLICE0} ${disk}s${SLICE1}\"" + mirrordevs="\"/dev/dsk/${disk}s${SLICE0} ${disk}s${SLICE1}\"" + raidzdevs="\"/dev/dsk/${disk}s${SLICE0} ${disk}s${SLICE1}\"" + + ;; +2|*) + pooldevs="${DISK0}s${SLICE0}\ + \"/dev/dsk/${DISK0}s${SLICE0} ${DISK1}s${SLICE0}\" \ + \"${DISK0}s${SLICE0} ${DISK0}s${SLICE1} ${DISK1}s${SLICE1}\"\ + \"${DISK0}s${SLICE0} ${DISK1}s${SLICE0} ${DISK0}s${SLICE1}\ + ${DISK1}s${SLICE1}\"" + mirrordevs="\"/dev/dsk/${DISK0}s${SLICE0} ${DISK1}s${SLICE0}\"" + raidzdevs="\"/dev/dsk/${DISK0}s${SLICE0} ${DISK1}s${SLICE0}\"" + + ;; +esac + +typeset -i i=0 +typeset vdev +eval set -A poolarray $pooldevs +eval set -A mirrorarray $mirrordevs +eval set -A raidzarray $raidzdevs + +while (( $i < ${#keywords[*]} )); do + case ${keywords[i]} in + ""|spare) + for vdev in "${poolarray[@]}"; do + create_pool "$TESTPOOL" "${disk}s${SLICE6}" + log_must poolexists "$TESTPOOL" + log_must $ZPOOL add -f "$TESTPOOL" ${keywords[i]} $vdev + log_must iscontained "$TESTPOOL" "$vdev" + destroy_pool "$TESTPOOL" + done + + ;; + mirror) + for vdev in "${mirrorarray[@]}"; do + create_pool "$TESTPOOL" "${keywords[i]}" \ + "${disk}s${SLICE4}" "${disk}s${SLICE5}" + log_must poolexists "$TESTPOOL" + log_must $ZPOOL add "$TESTPOOL" ${keywords[i]} $vdev + log_must iscontained "$TESTPOOL" "$vdev" + destroy_pool "$TESTPOOL" + done + + ;; + raidz|raidz1) + for vdev in "${raidzarray[@]}"; do + create_pool "$TESTPOOL" "${keywords[i]}" \ + "${disk}s${SLICE4}" "${disk}s${SLICE5}" + log_must poolexists "$TESTPOOL" + log_must $ZPOOL add "$TESTPOOL" ${keywords[i]} $vdev + log_must iscontained "$TESTPOOL" "$vdev" + destroy_pool "$TESTPOOL" + done + + ;; + esac + + (( i = i+1 )) +done + +log_pass "'zpool add <pool> <vdev> ...' executes successfully" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_002_pos.ksh new file mode 100644 index 0000000000..7e245c43cc --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_002_pos.ksh @@ -0,0 +1,67 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +# +# DESCRIPTION: +# 'zpool add -f <pool> <vdev> ...' can successfully add the specified +# devices to given pool in some cases. +# +# STRATEGY: +# 1. Create a mirrored pool +# 2. Without -f option to add 1-way device the mirrored pool will fail +# 3. Use -f to override the errors to add 1-way device to the mirrored +# pool +# 4. Verify the device is added successfully +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup +} + +log_assert "'zpool add -f <pool> <vdev> ...' can successfully add" \ + "devices to the pool in some cases." + +log_onexit cleanup + +create_pool "$TESTPOOL" mirror "${disk}s${SLICE0}" "${disk}s${SLICE1}" +log_must poolexists "$TESTPOOL" + +log_mustnot $ZPOOL add "$TESTPOOL" ${disk}s${SLICE3} +log_mustnot iscontained "$TESTPOOL" "${disk}s${SLICE3}" + +log_must $ZPOOL add -f "$TESTPOOL" ${disk}s${SLICE3} +log_must iscontained "$TESTPOOL" "${disk}s${SLICE3}" + +log_pass "'zpool add -f <pool> <vdev> ...' executes successfully." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_003_pos.ksh new file mode 100644 index 0000000000..e4704dbd2e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_003_pos.ksh @@ -0,0 +1,73 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +# +# DESCRIPTION: +# 'zpool add -n <pool> <vdev> ...' can display the configuration without +# adding the specified devices to given pool +# +# STRATEGY: +# 1. Create a storage pool +# 2. Use -n to add a device to the pool +# 3. Verify the device is not added actually +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + partition_cleanup + + [[ -e $tmpfile ]] && \ + log_must $RM -f $tmpfile +} + +log_assert "'zpool add -n <pool> <vdev> ...' can display the configuration" \ + "without actually adding devices to the pool." + +log_onexit cleanup + +tmpfile="/var/tmp/zpool_add_003.tmp$$" + +create_pool "$TESTPOOL" "${disk}s${SLICE0}" +log_must poolexists "$TESTPOOL" + +$ZPOOL add -n "$TESTPOOL" ${disk}s${SLICE1} > $tmpfile + +log_mustnot iscontained "$TESTPOOL" "${disk}s${SLICE1}" + +str="would update '$TESTPOOL' to the following configuration:" +$CAT $tmpfile | $GREP "$str" >/dev/null 2>&1 +(( $? != 0 )) && \ + log_fail "'zpool add -n <pool> <vdev> ...' is executed as unexpected" + +log_pass "'zpool add -n <pool> <vdev> ...'executes successfully." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_004_pos.ksh new file mode 100644 index 0000000000..6f52126874 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_004_pos.ksh @@ -0,0 +1,72 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +# +# DESCRIPTION: +# 'zpool add <pool> <vdev> ...' can successfully add a zfs volume +# to the given pool +# +# STRATEGY: +# 1. Create a storage pool and a zfs volume +# 2. Add the volume to the pool +# 3. Verify the devices are added to the pool successfully +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + destroy_pool "$TESTPOOL" + + datasetexists $TESTPOOL1/$TESTVOL && \ + log_must $ZFS destroy -f $TESTPOOL1/$TESTVOL + poolexists $TESTPOOL1 && \ + destroy_pool "$TESTPOOL1" + + partition_cleanup + +} + +log_assert "'zpool add <pool> <vdev> ...' can add zfs volume to the pool." + +log_onexit cleanup + +create_pool "$TESTPOOL" "${disk}s${SLICE0}" +log_must poolexists "$TESTPOOL" + +create_pool "$TESTPOOL1" "${disk}s${SLICE1}" +log_must poolexists "$TESTPOOL1" +log_must $ZFS create -V $VOLSIZE $TESTPOOL1/$TESTVOL + +log_must $ZPOOL add "$TESTPOOL" /dev/zvol/dsk/$TESTPOOL1/$TESTVOL + +log_must iscontained "$TESTPOOL" "/dev/zvol/dsk/$TESTPOOL1/$TESTVOL" + +log_pass "'zpool add <pool> <vdev> ...' adds zfs volume to the pool successfully" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_005_pos.ksh new file mode 100644 index 0000000000..9ae26304f2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_005_pos.ksh @@ -0,0 +1,84 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +# +# DESCRIPTION: +# 'zpool add' should return fail if +# 1. vdev is part of an active pool +# 2. vdev is currently mounted +# 3. vdev is in /etc/vfstab +# 3. vdev is specified as the dedicated dump device +# +# STRATEGY: +# 1. Create case scenarios +# 2. For each scenario, try to add the device to the pool +# 3. Verify the add operation get failed +# + +verify_runnable "global" + +function cleanup +{ + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + poolexists "$TESTPOOL1" && \ + destroy_pool "$TESTPOOL1" + + if [[ -n $saved_dump_dev ]]; then + log_must eval "$DUMPADM -u -d $saved_dump_dev > /dev/null" + fi + + partition_cleanup +} + +log_assert "'zpool add' should fail with inapplicable scenarios." + +log_onexit cleanup + +mnttab_dev=$(find_mnttab_dev) +vfstab_dev=$(find_vfstab_dev) +saved_dump_dev=$(save_dump_dev) +dump_dev=${disk}s${SLICE3} + +create_pool "$TESTPOOL" "${disk}s${SLICE0}" +log_must poolexists "$TESTPOOL" + +create_pool "$TESTPOOL1" "${disk}s${SLICE1}" +log_must poolexists "$TESTPOOL1" +log_mustnot $ZPOOL add -f "$TESTPOOL" ${disk}s${SLICE1} + +log_mustnot $ZPOOL add -f "$TESTPOOL" $mnttab_dev + +log_mustnot $ZPOOL add -f "$TESTPOOL" $vfstab_dev + +log_must $ECHO "y" | $NEWFS /dev/dsk/$dump_dev > /dev/null 2>&1 +log_must $DUMPADM -u -d /dev/dsk/$dump_dev > /dev/null +log_mustnot $ZPOOL add -f "$TESTPOOL" $dump_dev + +log_pass "'zpool add' should fail with inapplicable scenarios." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_006_pos.ksh new file mode 100644 index 0000000000..df263112db --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_006_pos.ksh @@ -0,0 +1,153 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +# +# DESCRIPTION: +# 'zpool add [-f]' can add large numbers of file-in-zfs-filesystem-based vdevs +# to the specified pool without any errors. +# +# STRATEGY: +# 1. Create assigned number of files in ZFS filesystem as vdevs and use the first +# file to create a pool +# 2. Add other vdevs to the pool should get success +# 3 Fill in the filesystem and create a partially written file +# as vdev +# 4. Add the new file into the pool should be failed. +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL1 && \ + destroy_pool $TESTPOOL1 + + datasetexists $TESTPOOL/$TESTFS && \ + log_must $ZFS destroy -f $TESTPOOL/$TESTFS + poolexists $TESTPOOL && \ + destroy_pool $TESTPOOL + + if [[ -d $TESTDIR ]]; then + log_must $RM -rf $TESTDIR + fi + + partition_cleanup +} + + +# +# Create a pool and fs on the assigned disk, and dynamically create large +# numbers of files as vdevs.(the default value is <VDEVS_NUM>) +# the first file will be used to create a pool for other vdevs to be added into +# + +function setup_vdevs #<disk> +{ + typeset disk=$1 + typeset -l count=0 + typeset -l largest_num=0 + typeset -l slicesize=0 + typeset vdev="" + + + # + # Get disk size for zfs filesystem + # + create_pool foo $disk + log_must $ZFS create foo/fs + typeset -l fs_size=$(get_prop "available" foo/fs) + destroy_pool foo + + #64m is the minmum size for pool + (( largest_num = fs_size / (1024 * 1024 * 64) )) + if (( largest_num < $VDEVS_NUM )); then + # minus $largest_num/40 to leave 2.5% space for metadata. + (( vdevs_num=largest_num - largest_num/40 )) + file_size=64 + vdev=$disk + else + vdevs_num=$VDEVS_NUM + file_size=$((fs_size / (1024 * 1024 * \ + (vdevs_num + vdevs_num / 40)))) + if (( file_size > FILE_SIZE )); then + file_size=$FILE_SIZE + fi + # plus $vdevs_num/40 to provide enough space for metadata. + (( slice_size = file_size * (vdevs_num + vdevs_num/40) )) + set_partition 0 "" ${slice_size}m $disk + vdev=${disk}s0 + fi + + create_pool $TESTPOOL $vdev + [[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR + log_must $MKDIR -p $TESTDIR + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + # Create a pool first using the first file, and make subsequent files + # ready as vdevs to add to the pool + + log_must $MKFILE ${file_size}m ${TESTDIR}/file.$count + create_pool "$TESTPOOL1" "${TESTDIR}/file.$count" + log_must poolexists "$TESTPOOL1" + + while (( count < vdevs_num )); do # minus 1 to avoid space non-enough + (( count = count + 1 )) + log_must $MKFILE ${file_size}m ${TESTDIR}/file.$count + vdevs_list="$vdevs_list ${TESTDIR}/file.$count" + done +} + +log_assert " 'zpool add [-f]' can add large numbers of vdevs to the specified" \ + " pool without any errors." +log_onexit cleanup + +if [[ $DISK_ARRAY_NUM == 0 ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +vdevs_list="" +vdevs_num=$VDEVS_NUM +file_size=$FILE_SIZE + +setup_vdevs $disk +log_must $ZPOOL add -f "$TESTPOOL1" $vdevs_list +log_must iscontained "$TESTPOOL1" "$vdevs_list" + +(( file_size = file_size * (vdevs_num/40 + 1 ) )) +log_mustnot $MKFILE ${file_size}m ${TESTDIR}/broken_file + +log_mustnot $ZPOOL add -f "$TESTPOOL1" ${TESTDIR}/broken_file +log_mustnot iscontained "$TESTPOOL1" "${TESTDIR}/broken_file" + +log_pass "'zpool successfully add [-f]' can add large numbers of vdevs to the" \ + "specified pool without any errors." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_007_neg.ksh new file mode 100644 index 0000000000..15e7c087c9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_007_neg.ksh @@ -0,0 +1,66 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +# +# DESCRIPTION: +# 'zpool add' should return an error with badly-formed parameters, +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool add' +# 3. Verify an error is returned. +# + +verify_runnable "global" + +function cleanup +{ + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + + partition_cleanup +} + +log_assert "'zpool add' should return an error with badly-formed parameters." + +log_onexit cleanup + +set -A args "" "-f" "-n" "-?" "-nf" "-fn" "-f -n" "--f" "-blah" \ + "-? $TESTPOOL ${disk}s${SLICE1}" + +create_pool "$TESTPOOL" "${disk}s${SLICE0}" +log_must poolexists "$TESTPOOL" + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL add ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool add' badly formed parameters fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_008_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_008_neg.ksh new file mode 100644 index 0000000000..e764aa6f35 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_008_neg.ksh @@ -0,0 +1,67 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +# +# DESCRIPTION: +# 'zpool add' should return an error with nonexistent pools or vdevs +# +# STRATEGY: +# 1. Create an array of parameters which contains nonexistent pools/vdevs +# 2. For each parameter in the array, execute 'zpool add' +# 3. Verify an error is returned +# + +verify_runnable "global" + +function cleanup +{ + + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + + partition_cleanup +} + +log_assert "'zpool add' should return an error with nonexistent pools and vdevs" + +log_onexit cleanup + +set -A args "" "-f nonexistent_pool ${disk}s${SLICE1}" \ + "-f $TESTPOOL nonexistent_vdev" + +create_pool "$TESTPOOL" "${disk}s${SLICE0}" +log_must poolexists "$TESTPOOL" + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL add ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool add' with nonexistent pools and vdevs fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_009_neg.ksh new file mode 100644 index 0000000000..fab56cf8b7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_add/zpool_add_009_neg.ksh @@ -0,0 +1,65 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_add/zpool_add.kshlib + +# +# DESCRIPTION: +# 'zpool add' should return fail if vdevs are the same or vdev is +# contained in the given pool +# +# STRATEGY: +# 1. Create a storage pool +# 2. Add the two same devices to pool A +# 3. Add the device in pool A to pool A again +# + +verify_runnable "global" + +function cleanup +{ + + poolexists "$TESTPOOL" && \ + destroy_pool "$TESTPOOL" + + partition_cleanup + +} + +log_assert "'zpool add' should fail if vdevs are the same or vdev is " \ + "contained in the given pool." + +log_onexit cleanup + +create_pool "$TESTPOOL" "${disk}s${SLICE0}" +log_must poolexists "$TESTPOOL" + +log_mustnot $ZPOOL add -f "$TESTPOOL" ${disk}s${SLICE1} ${disk}s${SLICE1} +log_mustnot $ZPOOL add -f "$TESTPOOL" ${disk}s${SLICE0} + +log_pass "'zpool add' get fail as expected if vdevs are the same or vdev is " \ + "contained in the given pool." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/Makefile new file mode 100644 index 0000000000..da4352afad --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/Makefile @@ -0,0 +1,41 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_attach + +PROGS = cleanup \ + setup \ + zpool_attach_001_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/cleanup.ksh new file mode 100644 index 0000000000..b2b93316e4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/setup.ksh new file mode 100644 index 0000000000..51dfd8107b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" +verify_disk_count "$DISKS" 2 + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/zpool_attach_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/zpool_attach_001_neg.ksh new file mode 100644 index 0000000000..df53b1214f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_attach/zpool_attach_001_neg.ksh @@ -0,0 +1,78 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Executing 'zpool attach' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool attach' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-f" "-?" "-z fakepool" "-f fakepool" "-ev fakepool" "fakepool" \ + "$TESTPOOL" "-t $TESTPOOL/$TESTFS" "-t $TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "-t $TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "-t $TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" \ + "fakepool fakedevice" "fakepool fakedevice fakenewdevice" \ + "$TESTPOOL fakedevice" "$TESTPOOL $DISKLIST" \ + "$TESTPOOL fakedevice fakenewdevice fakenewdevice" \ + "-f $TESTPOOL" "-f $TESTPOOL/$TESTFS" "-f $TESTPOOL/$TESTFS $DISKLIST" \ + "-f $TESTPOOL/$TESTCTR" "-f $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-f $TESTPOOL/$TESTCTR $DISKLIST" "-f $TESTPOOL/$TESTVOL" \ + "-f $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-f $TESTPOOL/$TESTVOL $DISKLIST" \ + "-f $DISKLIST" \ + "-f fakepool fakedevice" "-f fakepool fakedevice fakenewdevice" \ + "-f $TESTPOOL fakedevice fakenewdevice fakenewdevice" \ + "-f $TESTPOOL fakedevice" "-f $TESTPOOL $DISKLIST" + +log_assert "Executing 'zpool attach' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL attach ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool attach' command with bad options failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/Makefile new file mode 100644 index 0000000000..180e4a5cb7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/Makefile @@ -0,0 +1,45 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_clear + +PROGS = cleanup \ + setup \ + zpool_clear_001_pos \ + zpool_clear_002_neg \ + zpool_clear_003_neg + +FILES = zpool_clear.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear.cfg new file mode 100644 index 0000000000..097a43b0ed --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear.cfg @@ -0,0 +1,33 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export FILESIZE=100m +export BLOCKSZ=$(( 1024 * 1024 )) +export NUM_WRITES=40 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_001_pos.ksh new file mode 100644 index 0000000000..b2a2ed5e4d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_001_pos.ksh @@ -0,0 +1,217 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_clear/zpool_clear.cfg + +# +# DESCRIPTION: +# Verify 'zpool clear' can clear pool errors. +# +# STRATEGY: +# 1. Create various configuration pools +# 2. Make errors to pool +# 3. Use zpool clear to clear errors +# 4. Verify the errors has been cleared. +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL1 && \ + log_must $ZPOOL destroy -f $TESTPOOL1 + + for file in `$LS $TESTDIR/file.*`; do + log_must $RM -f $file + done +} + + +log_assert "Verify 'zpool clear' can clear errors of a storage pool." +log_onexit cleanup + +#make raw files to create various configuration pools +typeset -i i=0 +while (( i < 3 )); do + log_must $MKFILE $FILESIZE $TESTDIR/file.$i + + (( i = i + 1 )) +done + +fbase=$TESTDIR/file +set -A poolconf "mirror $fbase.0 $fbase.1 $fbase.2" \ + "raidz1 $fbase.0 $fbase.1 $fbase.2" \ + "raidz2 $fbase.0 $fbase.1 $fbase.2" + +function check_err # <pool> [<vdev>] +{ + typeset pool=$1 + shift + if (( $# > 0 )); then + typeset checkvdev=$1 + else + typeset checkvdev="" + fi + typeset -i errnum=0 + typeset c_read=0 + typeset c_write=0 + typeset c_cksum=0 + typeset tmpfile=/var/tmp/file.$$ + typeset healthstr="pool '$pool' is healthy" + typeset output="`$ZPOOL status -x $pool`" + + [[ "$output" == "$healthstr" ]] && return $errnum + + $ZPOOL status -x $pool | $GREP -v "^$" | $GREP -v "pool:" \ + | $GREP -v "state:" | $GREP -v "config:" \ + | $GREP -v "errors:" > $tmpfile + typeset line + typeset -i fetchbegin=1 + while read line; do + if (( $fetchbegin != 0 )); then + $ECHO $line | $GREP "NAME" >/dev/null 2>&1 + (( $? == 0 )) && (( fetchbegin = 0 )) + continue + fi + + if [[ -n $checkvdev ]]; then + $ECHO $line | $GREP $checkvdev >/dev/null 2>&1 + (( $? != 0 )) && continue + c_read=`$ECHO $line | $AWK '{print $3}'` + c_write=`$ECHO $line | $AWK '{print $4}'` + c_cksum=`$ECHO $line | $AWK '{print $5}'` + if [ $c_read != 0 ] || [ $c_write != 0 ] || \ + [ $c_cksum != 0 ] + then + (( errnum = errnum + 1 )) + fi + break + fi + + c_read=`$ECHO $line | $AWK '{print $3}'` + c_write=`$ECHO $line | $AWK '{print $4}'` + c_cksum=`$ECHO $line | $AWK '{print $5}'` + if [ $c_read != 0 ] || [ $c_write != 0 ] || \ + [ $c_cksum != 0 ] + then + (( errnum = errnum + 1 )) + fi + done <$tmpfile + + return $errnum +} + +function do_testing #<clear type> <vdevs> +{ + typeset FS=$TESTPOOL1/fs + typeset file=/$FS/f + typeset type=$1 + shift + typeset vdev="$@" + + log_must $ZPOOL create -f $TESTPOOL1 $vdev + log_must $ZFS create $FS + # + # Fully fill up the zfs filesystem in order to make data block errors + # zfs filesystem + # + typeset -i ret=0 + typeset -i i=0 + while $TRUE ; do + $FILE_WRITE -o create -f $file.$i -b $BLOCKSZ -c $NUM_WRITES + ret=$? + (( $ret != 0 )) && break + (( i = i + 1 )) + done + (( $ret != 28 )) && log_fail "$FILE_WRITE fails to fully fill up the $FS." + + # + #Make errors to the testing pool by overwrite the vdev device with + #/usr/bin/dd command. We donot want to have a full overwrite. That + #may cause the system panic. So, we should skip the vdev label space. + # + (( i = $RANDOM % 3 )) + typeset -i wcount=0 + typeset -i size + case $FILESIZE in + *g|*G) + (( size = ${FILESIZE%%[g|G]} )) + (( wcount = size*1024*1024 - 512 )) + ;; + *m|*M) + (( size = ${FILESIZE%%[m|M]} )) + (( wcount = size*1024 - 512 )) + ;; + *k|*K) + (( size = ${FILESIZE%%[k|K]} )) + (( wcount = size - 512 )) + ;; + *) + (( wcount = FILESIZE/1024 - 512 )) + ;; + esac + $DD if=/dev/zero of=$fbase.$i seek=512 bs=1024 count=$wcount conv=notrunc \ + > /dev/null 2>&1 + log_must $SYNC + log_must $ZPOOL scrub $TESTPOOL1 + # Wait for the completion of scrub operation + while is_pool_scrubbing $TESTPOOL1; do + $SLEEP 1 + done + + check_err $TESTPOOL1 && \ + log_fail "No error generated." + if [[ $type == "device" ]]; then + log_must $ZPOOL clear $TESTPOOL1 $fbase.$i + ! check_err $TESTPOOL1 $fbase.$i && \ + log_fail "'zpool clear' fails to clear error for $fbase.$i device." + fi + + if [[ $type == "pool" ]]; then + log_must $ZPOOL clear $TESTPOOL1 + ! check_err $TESTPOOL1 && \ + log_fail "'zpool clear' fails to clear error for pool $TESTPOOL1." + fi + + log_must $ZPOOL destroy $TESTPOOL1 +} + +log_note "'zpool clear' clears leaf-device error." +for devconf in "${poolconf[@]}"; do + do_testing "device" $devconf +done +log_note "'zpool clear' clears top-level pool error." +for devconf in "${poolconf[@]}"; do + do_testing "pool" $devconf +done + +log_pass "'zpool clear' clears pool errors as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_002_neg.ksh new file mode 100644 index 0000000000..35c2b643dc --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_002_neg.ksh @@ -0,0 +1,76 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_clear/zpool_clear.cfg + +# +# DESCRIPTION: +# A badly formed parameter passed to 'zpool clear' should +# return an error. +# +# STRATEGY: +# 1. Create an array containing bad 'zpool clear' parameters. +# 2. For each element, execute the sub-command. +# 3. Verify it returns an error. +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL1 && \ + log_must $ZPOOL destroy -f $TESTPOOL1 + [[ -e $file ]] && \ + log_must $RM -f $file +} + +log_assert "Execute 'zpool clear' using invalid parameters." +log_onexit cleanup + +# Create another pool for negative testing, which clears pool error +# with vdev device not in the pool vdev devices. +file=$TESTDIR/file.$$ +log_must $MKFILE $FILESIZE $file +log_must $ZPOOL create $TESTPOOL1 $file + +set -A args "" "-?" "--%" "-1234567" "0.0001" "0.7644" "-0.7644" \ + "blah" "blah $DISK" "$TESTPOOL c0txdx" "$TESTPOOL $file" \ + "$TESTPOOL c0txdx blah" "$TESTPOOL $file blah" + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZPOOL clear ${args[i]} + + ((i = i + 1)) +done + +log_pass "Invalid parameters to 'zpool clear' fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_003_neg.ksh new file mode 100644 index 0000000000..241ac035e5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_clear/zpool_clear_003_neg.ksh @@ -0,0 +1,73 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_clear/zpool_clear.cfg + +# +# DESCRIPTION: +# Verify 'zpool clear' cannot used to spare device. +# +# STRATEGY: +# 1. Create a spare pool. +# 2. Try to clear the spare device +# 3. Verify it returns an error. +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL1 && \ + log_must $ZPOOL destroy -f $TESTPOOL1 + + for file in `$LS $TESTDIR/file.*`; do + log_must $RM -f $file + done +} + + +log_assert "Verify 'zpool clear' cannot clear error for spare device." +log_onexit cleanup + +#make raw files to create a spare pool +typeset -i i=0 +while (( i < 5 )); do + log_must $MKFILE $FILESIZE $TESTDIR/file.$i + + (( i = i + 1 )) +done +log_must $ZPOOL create $TESTPOOL1 raidz $TESTDIR/file.1 $TESTDIR/file.2 \ + $TESTDIR/file.3 spare $TESTDIR/file.4 + +log_mustnot $ZPOOL clear $TESTPOOL1 $TESTDIR/file.4 + +log_pass "'zpool clear' works on spare device failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/Makefile new file mode 100644 index 0000000000..c9ea8dcb04 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/Makefile @@ -0,0 +1,70 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_create + +PROGS = cleanup \ + setup \ + zpool_create_001_pos \ + zpool_create_002_pos \ + zpool_create_003_pos \ + zpool_create_004_pos \ + zpool_create_005_pos \ + zpool_create_006_pos \ + zpool_create_007_neg \ + zpool_create_008_pos \ + zpool_create_009_neg \ + zpool_create_010_neg \ + zpool_create_011_neg \ + zpool_create_012_neg \ + zpool_create_013_neg \ + zpool_create_014_neg \ + zpool_create_015_neg \ + zpool_create_016_pos \ + zpool_create_017_neg \ + zpool_create_018_pos \ + zpool_create_019_pos \ + zpool_create_020_pos \ + zpool_create_021_pos \ + zpool_create_022_pos \ + zpool_create_023_neg \ + zpool_create_features_001_pos \ + zpool_create_features_002_pos \ + zpool_create_features_003_pos \ + zpool_create_features_004_neg + +FILES = zpool_create.cfg \ + zpool_create.shlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/cleanup.ksh new file mode 100644 index 0000000000..281617dea9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/cleanup.ksh @@ -0,0 +1,39 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +clean_blockfile "$TESTDIR $TESTDIR0 $TESTDIR1" + +cleanup_devices $DISKS + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/setup.ksh new file mode 100644 index 0000000000..7c7e489541 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/setup.ksh @@ -0,0 +1,57 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +verify_runnable "global" + +if ! $(is_physical_device $DISKS) ; then + log_unsupported "This directory cannot be run on raw files." +fi + +if [[ -n $DISK ]]; then + # + # Use 'zpool create' to clean up the infomation in + # in the given disk to avoid slice overlapping. + # + cleanup_devices $DISK + + partition_disk $SIZE $DISK 7 +else + for disk in `$ECHO $DISKSARRAY`; do + cleanup_devices $disk + + partition_disk $SIZE $disk 7 + done +fi + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.cfg new file mode 100644 index 0000000000..1a8a3d876a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.cfg @@ -0,0 +1,102 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +export DISK_ARRAY_NUM=0 +export DISK_ARRAY_LIMIT=4 +export DISKSARRAY="" + +# +# Variables for zpool_create_005 +# +export VDEVS_NUM=300 +export FILE_SIZE=100 #100mb +export MD_OVERHEAD=10 # 10% +export POOL_MINSIZE=64 # the minimum size(64m) to create a storage pool + +function set_disks +{ + typeset -a disk_array=($(find_disks $DISKS)) + + if (( ${#disk_array[*]} <= 1 )); then + export DISK=${DISKS%% *} + else + export DISK="" + typeset -i i=0 + while (( i < ${#disk_array[*]} )); do + export DISK${i}="${disk_array[$i]}" + DISKSARRAY="$DISKSARRAY ${disk_array[$i]}" + (( i = i + 1 )) + (( i>$DISK_ARRAY_LIMIT )) && break + done + export DISK_ARRAY_NUM=$i + export DISKSARRAY + fi +} + +set_disks + +export FILESIZE="100m" +export FILESIZE1="150m" +export SIZE="200m" +export SIZE1="250m" +export SLICE0=0 +export SLICE1=1 +export SLICE2=2 +export SLICE3=3 +export SLICE4=4 +export SLICE5=5 +export SLICE6=6 +export SLICE7=7 + +export FILEDISK=filedisk_create +export FILEDISK0=filedisk0_create +export FILEDISK1=filedisk1_create +export FILEDISK2=filedisk2_create +export FILEDISK3=filedisk3_create + +export BYND_MAX_NAME="byondmaxnamelength\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789\ +012345678901234567890123456789" + +export TOOSMALL="toosmall" + +export TESTPOOL4=testpool4.create +export TESTPOOL5=testpool5.create +export TESTPOOL6=testpool6.create + +export CPATH="/var/tmp/cachefile.create" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.shlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.shlib new file mode 100644 index 0000000000..853b618564 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create.shlib @@ -0,0 +1,142 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.cfg + +# +# Given a pool vdevs list, create the pool,verify the created pool, +# and destroy the pool +# $1, pool name +# $2, pool type, mirror, raidz, or none +# $3, vdevs list +# +function create_pool_test +{ + typeset pool=$1 + typeset keywd=$2 + typeset vdevs + eval "typeset -a diskarray=($3)" + + for vdevs in "${diskarray[@]}";do + create_pool $pool $keywd $vdevs + log_must poolexists $pool + destroy_pool $pool + done +} + +# +# Create a ufs file system and make a file within the file +# system for storage pool vdev +# $1, file size +# $2, file name +# $3, disk name to create ufs file system +# +function create_blockfile +{ + typeset size=$1 + typeset file=$2 + typeset disk=$3 + typeset dir=`$DIRNAME $file` + + if [[ -d $dir ]]; then + ismounted $dir ufs + (( $? == 0 )) && \ + log_must $UMOUNT -f $dir + else + log_must $MKDIR -p $dir + fi + + $ECHO "y" | $NEWFS /dev/rdsk/$disk >/dev/null 2>&1 + (( $? != 0 )) && + log_fail "Create ufs file system fail." + + log_must $MOUNT /dev/dsk/$disk $dir + log_must $MKFILE $size $file +} + +# +# Umount the ufs filesystem and remove the mountpoint +# $1, the mount point +# +function clean_blockfile +{ + typeset dirs=$1 + + for dir in $dirs; do + if [[ -d $dir ]]; then + if ismounted $dir ufs; then + typeset dev=$($DF -lhF ufs | $GREP "$dir" | \ + $AWK '{print $1}') + log_must $UMOUNT -f $dir + create_pool ${TESTPOOL}.tmp $dev + destroy_pool ${TESTPOOL}.tmp + fi + log_must $RM -rf $dir + fi + done +} + +# +# Find the storage device in /etc/vfstab +# +function find_vfstab_dev +{ + typeset vfstab="/etc/vfstab" + typeset tmpfile="/tmp/vfstab.tmp" + typeset vfstabdev + typeset vfstabdevs="" + typeset line + + $CAT $vfstab | $GREP "^/dev/dsk" >$tmpfile + while read -r line + do + vfstabdev=`$ECHO "$line" | $AWK '{print $1}'` + vfstabdev=${vfstabdev%%:} + vfstabdevs="$vfstabdev $vfstabdevs" + done <$tmpfile + + $RM -f $tmpfile + $ECHO $vfstabdevs +} + +# +# Save the systme current dump device configuration +# +function save_dump_dev +{ + + typeset dumpdev + typeset fnd="Dump device" + + dumpdev=`$DUMPADM | $GREP "$fnd" | $CUT -f2 -d : | \ + $AWK '{print $1}'` + $ECHO $dumpdev +} diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_001_pos.ksh new file mode 100644 index 0000000000..cd4fd38be5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_001_pos.ksh @@ -0,0 +1,125 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# 'zpool create <pool> <vspec> ...' can successfully create a +# new pool with a name in ZFS namespace. +# +# STRATEGY: +# 1. Create storage pools with a name in ZFS namespace with different +# vdev specs. +# 2. Verify the pool created successfully +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && destroy_pool $TESTPOOL + + clean_blockfile "$TESTDIR0 $TESTDIR1" + + if [[ -n $DISK ]]; then + partition_disk $SIZE $DISK 7 + else + typeset disk="" + for disk in $DISK0 $DISK1; do + partition_disk $SIZE $disk 7 + done + fi +} + +log_assert "'zpool create <pool> <vspec> ...' can successfully create" \ + "a new pool with a name in ZFS namespace." + +log_onexit cleanup + +set -A keywords "" "mirror" "raidz" "raidz1" + +case $DISK_ARRAY_NUM in +0|1) + typeset disk="" + if (( $DISK_ARRAY_NUM == 0 )); then + disk=$DISK + else + disk=$DISK0 + fi + create_blockfile $FILESIZE $TESTDIR0/$FILEDISK0 ${disk}s${SLICE5} + create_blockfile $FILESIZE $TESTDIR1/$FILEDISK1 ${disk}s${SLICE6} + + pooldevs="${disk}s${SLICE0} \ + /dev/dsk/${disk}s${SLICE0} \ + \"${disk}s${SLICE0} ${disk}s${SLICE1}\" \ + $TESTDIR0/$FILEDISK0" + raidzdevs="\"/dev/dsk/${disk}s${SLICE0} ${disk}s${SLICE1}\" \ + \"${disk}s${SLICE0} ${disk}s${SLICE1} ${disk}s${SLICE3}\" \ + \"${disk}s${SLICE0} ${disk}s${SLICE1} ${disk}s${SLICE3} \ + ${disk}s${SLICE4}\"\ + \"$TESTDIR0/$FILEDISK0 $TESTDIR1/$FILEDISK1\"" + mirrordevs=$raidzdevs + ;; +2|*) + create_blockfile $FILESIZE $TESTDIR0/$FILEDISK0 ${DISK0}s${SLICE5} + create_blockfile $FILESIZE $TESTDIR1/$FILEDISK1 ${DISK1}s${SLICE5} + + pooldevs="${DISK0}s${SLICE0}\ + \"/dev/dsk/${DISK0}s${SLICE0} ${DISK1}s${SLICE0}\" \ + \"${DISK0}s${SLICE0} ${DISK0}s${SLICE1} ${DISK1}s${SLICE1}\"\ + \"${DISK0}s${SLICE0} ${DISK1}s${SLICE0} ${DISK0}s${SLICE1}\ + ${DISK1}s${SLICE1}\" \ + \"$TESTDIR0/$FILEDISK0 $TESTDIR1/$FILEDISK1\"" + raidzdevs="\"/dev/dsk/${DISK0}s${SLICE0} ${DISK1}s${SLICE0}\" \ + \"${DISK0}s${SLICE0} ${DISK0}s${SLICE1} ${DISK1}s${SLICE1}\"\ + \"${DISK0}s${SLICE0} ${DISK1}s${SLICE0} ${DISK0}s${SLICE1}\ + ${DISK1}s${SLICE1}\" \ + \"$TESTDIR0/$FILEDISK0 $TESTDIR1/$FILEDISK1\"" + mirrordevs=$raidzdevs + ;; +esac + +typeset -i i=0 +while (( $i < ${#keywords[*]} )); do + case ${keywords[i]} in + "") + create_pool_test "$TESTPOOL" "${keywords[i]}" "$pooldevs";; + mirror) + create_pool_test "$TESTPOOL" "${keywords[i]}" "$mirrordevs";; + raidz|raidz1) + create_pool_test "$TESTPOOL" "${keywords[i]}" "$raidzdevs" ;; + esac + (( i = i+1 )) +done + +log_pass "'zpool create <pool> <vspec> ...' success." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_002_pos.ksh new file mode 100644 index 0000000000..44cbb24a5c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_002_pos.ksh @@ -0,0 +1,122 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# 'zpool create -f <pool> <vspec> ...' can successfully create a +# new pool in some cases. +# +# STRATEGY: +# 1. Prepare the scenarios for '-f' option +# 2. Use -f to override the devices to create new pools +# 3. Verify the pool created successfully +# + +verify_runnable "global" + +function cleanup +{ + for pool in $TESTPOOL $TESTPOOL1 $TESTPOOL2 $TESTPOOL3 $TESTPOOL4 \ + $TESTPOOL5 $TESTPOOL6 + do + poolexists $pool && destroy_pool $pool + done + + clean_blockfile "$TESTDIR0 $TESTDIR1" + + for file in /var/tmp/$FILEDISK0 /var/tmp/$FILEDISK1 /var/tmp/$FILEDISK2 + do + if [[ -e $file ]]; then + $RM -rf $file + fi + done + + partition_disk $SIZE $disk 6 +} + +log_onexit cleanup + +log_assert "'zpool create -f <pool> <vspec> ...' can successfully create" \ + "a new pool in some cases." + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi +create_pool "$TESTPOOL" "${disk}s${SLICE0}" +log_must $ECHO "y" | $NEWFS /dev/rdsk/${disk}s${SLICE1} >/dev/null 2>&1 +create_blockfile $FILESIZE $TESTDIR0/$FILEDISK0 ${disk}s${SLICE4} +create_blockfile $FILESIZE1 $TESTDIR1/$FILEDISK1 ${disk}s${SLICE5} +log_must $MKFILE $SIZE /var/tmp/$FILEDISK0 +log_must $MKFILE $SIZE /var/tmp/$FILEDISK1 +log_must $MKFILE $SIZE /var/tmp/$FILEDISK2 + +log_must $ZPOOL export $TESTPOOL +log_note "'zpool create' without '-f' will fail " \ + "while device is belong to an exported pool." +log_mustnot $ZPOOL create "$TESTPOOL1" "${disk}s${SLICE0}" +create_pool "$TESTPOOL1" "${disk}s${SLICE0}" +log_must poolexists $TESTPOOL1 + +log_note "'zpool create' without '-f' will fail " \ + "while device is using by an ufs filesystem." +log_mustnot $ZPOOL create "$TESTPOOL2" "${disk}s${SLICE1}" +create_pool "$TESTPOOL2" "${disk}s${SLICE1}" +log_must poolexists $TESTPOOL2 + +log_note "'zpool create' mirror without '-f' will fail " \ + "while devices have different size." +log_mustnot $ZPOOL create "$TESTPOOL3" "mirror" $TESTDIR0/$FILEDISK0 $TESTDIR1/$FILEDISK1 +create_pool "$TESTPOOL3" "mirror" $TESTDIR0/$FILEDISK0 $TESTDIR1/$FILEDISK1 +log_must poolexists $TESTPOOL3 + +log_note "'zpool create' mirror without '-f' will fail " \ + "while devices are of different types." +log_mustnot $ZPOOL create "$TESTPOOL4" "mirror" /var/tmp/$FILEDISK0 \ + ${disk}s${SLICE3} +create_pool "$TESTPOOL4" "mirror" /var/tmp/$FILEDISK0 ${disk}s${SLICE3} +log_must poolexists $TESTPOOL4 + +log_note "'zpool create' without '-f' will fail " \ + "while device is part of potentially active pool." +create_pool "$TESTPOOL5" "mirror" /var/tmp/$FILEDISK1 \ + /var/tmp/$FILEDISK2 +log_must $ZPOOL offline $TESTPOOL5 /var/tmp/$FILEDISK2 +log_must $ZPOOL export $TESTPOOL5 +log_mustnot $ZPOOL create "$TESTPOOL6" /var/tmp/$FILEDISK2 +create_pool $TESTPOOL6 /var/tmp/$FILEDISK2 +log_must poolexists $TESTPOOL6 + +log_pass "'zpool create -f <pool> <vspec> ...' success." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos.ksh new file mode 100644 index 0000000000..303c72afbc --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_003_pos.ksh @@ -0,0 +1,81 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# 'zpool create -n <pool> <vspec> ...' can display the configuration without +# actually creating the pool. +# +# STRATEGY: +# 1. Create storage pool with -n option +# 2. Verify the pool has not been actually created +# + +verify_runnable "global" + +function cleanup +{ + [[ -e $tmpfile ]] && log_must $RM -f $tmpfile +} + +tmpfile="/var/tmp/zpool_create_003.tmp$$" + +log_assert "'zpool create -n <pool> <vspec> ...' can display the configureation" \ + "without actually creating the pool." + +log_onexit cleanup + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +# +# Make sure disk is clean before we use it +# +create_pool $TESTPOOL ${disk}s${SLICE0} > $tmpfile +destroy_pool $TESTPOOL + +$ZPOOL create -n $TESTPOOL ${disk}s${SLICE0} > $tmpfile + +poolexists $TESTPOOL && \ + log_fail "'zpool create -n <pool> <vspec> ...' fail." + +str="would create '$TESTPOOL' with the following layout:" +$CAT $tmpfile | $GREP "$str" >/dev/null 2>&1 +(( $? != 0 )) && \ + log_fail "'zpool create -n <pool> <vspec>...' is executed as unexpected." + +log_pass "'zpool create -n <pool> <vspec>...' success." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_004_pos.ksh new file mode 100644 index 0000000000..568da695c1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_004_pos.ksh @@ -0,0 +1,181 @@ +#!/usr/bin/ksh +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# 'zpool create [-f]' can create a storage pool with large number of +# file-in-zfs-filesystem-based vdevs without any errors. +# +# STRATEGY: +# 1. Create assigned number of files in ZFS filesystem as vdevs +# 2. Creating a new pool based on the vdevs should get success +# 3. Fill in the filesystem and create a partially writen file as vdev +# 4. Add the new file into vdevs list and create a pool +# 5. Creating a storage pool with the new vdevs list should be failed. +# + +verify_runnable "global" + +function cleanup +{ + typeset pool="" + + for pool in foo $TESTPOOL2 $TESTPOOL1; do + poolexists $pool && \ + destroy_pool $pool + done + + if datasetexists $TESTPOOL/$TESTFS; then + log_must $ZFS destroy -f $TESTPOOL/$TESTFS + fi + + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi + + if [[ -d $TESTDIR ]]; then + log_must $RM -rf $TESTDIR + fi + + partition_disk $SIZE $disk 6 +} + +# +# Create a pool and fs on the assigned disk, and dynamically create large +# numbers of files as vdevs.(the default value is <VDEVS_NUM>) +# + +function setup_vdevs #<disk> +{ + typeset disk=$1 + typeset -l largest_num=0 + typeset -l slice_size=0 + typeset vdev="" + + + # + # Get disk size for zfs filesystem + # + create_pool foo $disk + log_must $ZFS create foo/fs + typeset -l fs_size=$(get_prop "available" foo/fs) + destroy_pool foo + + (( largest_num = fs_size / (1024 * 1024 * ${POOL_MINSIZE}) )) + if (( largest_num < $VDEVS_NUM )); then + #minus $largest_num/$MD_OVERHEAD to leave space for metadata + (( vdevs_num=largest_num - largest_num/$MD_OVERHEAD )) + file_size=$POOL_MINSIZE + vdev=$disk + else + vdevs_num=$VDEVS_NUM + (( file_size = fs_size / \ + (1024 * 1024 * (vdevs_num + vdevs_num/$MD_OVERHEAD)) )) + if (( file_size > FILE_SIZE )); then + # If file_size too large, the time cost will increase so + # we limit the file_size to $FILE_SIZE, and thus the + # total time spent on creating file can be controlled + # within the timeout. + file_size=$FILE_SIZE + fi + # Add $vdevs_num/$MD_OVERHEAD to provide enough space for + # metadata + (( slice_size = file_size * (vdevs_num + \ + vdevs_num/$MD_OVERHEAD) )) + set_partition 0 "" ${slice_size}m $disk + vdev=${disk}s0 + fi + + create_pool $TESTPOOL $vdev + [[ -d $TESTDIR ]] && \ + log_must $RM -rf $TESTDIR + log_must $MKDIR -p $TESTDIR + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + typeset -l count=0 + typeset PIDLIST="" + while (( count < vdevs_num )); do + $MKFILE ${file_size}m ${TESTDIR}/file.$count & + PIDLIST="$PIDLIST $!" + vdevs_list="$vdevs_list ${TESTDIR}/file.$count" + (( count = count + 1 )) + done + + # wait all mkfiles to finish + wait $PIDLIST + if (( $? != 0 )); then + log_fail "create vdevs failed." + fi + + return 0 +} + +log_assert " 'zpool create [-f]' can create a storage pool with large " \ + "numbers of vdevs without any errors." +log_onexit cleanup + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +log_note "Create storage pool with number of $VDEVS_NUM file vdevs should " \ + "succeed." +vdevs_list="" +vdevs_num=$VDEVS_NUM +file_size=$FILE_SIZE + +setup_vdevs $disk +create_pool $TESTPOOL1 $vdevs_list + +if poolexists $TESTPOOL1; then + destroy_pool $TESTPOOL1 +else + log_fail " Creating pool with large numbers of file-vdevs fail." +fi + +log_note "Creating storage pool with partially written file as vdev should " \ + "fail." + +left_space=$(get_prop "available" $TESTPOOL/$TESTFS) +# Count the broken file size. make sure it should be greater than $left_space +# so, here, we plus a number -- $file_size, this number can be any other number. +(( file_size = left_space / (1024 * 1024) + file_size )) +log_mustnot $MKFILE ${file_size}m ${TESTDIR}/broken_file +vdevs_list="$vdevs_list ${TESTDIR}/broken_file" + +log_mustnot $ZPOOL create -f $TESTPOOL2 $vdevs_list + +log_pass "'zpool create [-f]' with $vdevs_num vdevs success." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_005_pos.ksh new file mode 100644 index 0000000000..2458cf350c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_005_pos.ksh @@ -0,0 +1,126 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# 'zpool create [-R root][-m mountpoint] <pool> <vdev> ...' can create an +# alternate root pool or a new pool mounted at the specified mountpoint. +# +# STRATEGY: +# 1. Create a pool with '-m' option +# 2. Verify the pool is mounted at the specified mountpoint +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL && \ + log_must $ZPOOL destroy -f $TESTPOOL + + for dir in $TESTDIR $TESTDIR1; do + [[ -d $dir ]] && $RM -rf $dir + done +} + +log_assert "'zpool create [-R root][-m mountpoint] <pool> <vdev> ...' can create" \ + "an alternate pool or a new pool mounted at the specified mountpoint." +log_onexit cleanup + +set -A pooltype "" "mirror" "raidz" "raidz1" "raidz2" + +# +# cleanup the pools created in previous case if zpool_create_004_pos timedout +# +for pool in $TESTPOOL2 $TESTPOOL1 $TESTPOOL; do + if poolexists $pool; then + destroy_pool $pool + fi +done + +#prepare raw file for file disk +[[ -d $TESTDIR ]] && $RM -rf $TESTDIR +log_must $MKDIR -p $TESTDIR +typeset -i i=1 +while (( i < 4 )); do + log_must $MKFILE $FILESIZE $TESTDIR/file.$i + + (( i = i + 1 )) +done + +#Remove the directory with name as pool name if it exists +[[ -d /$TESTPOOL ]] && $RM -rf /$TESTPOOL +file=$TESTDIR/file + +for opt in "-R $TESTDIR1" "-m $TESTDIR1" \ + "-R $TESTDIR1 -m $TESTDIR1" "-m $TESTDIR1 -R $TESTDIR1" +do + i=0 + while (( i < ${#pooltype[*]} )); do + #Remove the testing pool and its mount directory + poolexists $TESTPOOL && \ + log_must $ZPOOL destroy -f $TESTPOOL + [[ -d $TESTDIR1 ]] && $RM -rf $TESTDIR1 + log_must $ZPOOL create $opt $TESTPOOL ${pooltype[i]} \ + $file.1 $file.2 $file.3 + ! poolexists $TESTPOOL && \ + log_fail "Createing pool with $opt fails." + mpt=`$ZFS mount | $EGREP "^$TESTPOOL[^/]" | $AWK '{print $2}'` + (( ${#mpt} == 0 )) && \ + log_fail "$TESTPOOL created with $opt is not mounted." + mpt_val=$(get_prop "mountpoint" $TESTPOOL) + [[ "$mpt" != "$mpt_val" ]] && \ + log_fail "The value of mountpoint property is different\ + from the output of zfs mount" + if [[ "$opt" == "-R $TESTDIR1" ]] || [[ "$opt" == "-m $TESTDIR1" ]]; + then + [[ ! -d $TESTDIR1 ]] && \ + log_fail "$TESTDIR1 is not created auotmatically." + [[ "$mpt" != "$TESTDIR1" ]] && \ + log_fail "$TESTPOOL is not mounted on $TESTDIR1." + else + [[ ! -d ${TESTDIR1}$TESTDIR1 ]] && \ + log_fail "${TESTDIR1}$TESTDIR1 is not created automatically." + [[ "$mpt" != "${TESTDIR1}$TESTDIR1" ]] && \ + log_fail "$TESTPOOL is not mounted on ${TESTDIR1}$TESTDIR1." + fi + [[ -d /$TESTPOOL ]] && \ + log_fail "The default mountpoint /$TESTPOOL is created" \ + "while with $opt option." + + (( i = i + 1 )) + done +done + +log_pass "'zpool create [-R root][-m mountpoint] <pool> <vdev> ...' works as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_006_pos.ksh new file mode 100644 index 0000000000..70dcadc91c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_006_pos.ksh @@ -0,0 +1,123 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify zpool create succeed with multiple keywords combination. +# +# STRATEGY: +# 1. Create base filesystem to hold virtual disk files. +# 2. Create several files >= 64M. +# 3. Verify 'zpool create' succeed with valid keywords combination. +# + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL1 && destroy_pool $TESTPOOL1 + datasetexists $TESTPOOL && destroy_pool $TESTPOOL +} + + +log_assert "Verify 'zpool create' succeed with keywords combination." +log_onexit cleanup + +create_pool $TESTPOOL $DISKS +mntpnt=$(get_prop mountpoint $TESTPOOL) + +typeset -i i=0 +while ((i < 10)); do + log_must $MKFILE 64M $mntpnt/vdev$i + + eval vdev$i=$mntpnt/vdev$i + ((i += 1)) +done + +set -A valid_args \ + "mirror $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 $vdev5" \ + "mirror $vdev0 $vdev1 mirror $vdev2 $vdev3 mirror $vdev4 $vdev5" \ + "mirror $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 $vdev5 \ + spare $vdev6" \ + "mirror $vdev0 $vdev1 mirror $vdev2 $vdev3 mirror $vdev4 $vdev5 \ + spare $vdev6 $vdev7" \ + "mirror $vdev0 $vdev1 spare $vdev2 mirror $vdev3 $vdev4" \ + "raidz $vdev0 $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5" \ + "raidz $vdev0 $vdev1 raidz1 $vdev2 $vdev3 raidz $vdev4 $vdev5" \ + "raidz $vdev0 $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5 \ + spare $vdev6" \ + "raidz $vdev0 $vdev1 raidz1 $vdev2 $vdev3 raidz $vdev4 $vdev5 \ + spare $vdev6 $vdev7" \ + "raidz $vdev0 $vdev1 spare $vdev2 raidz $vdev3 $vdev4" \ + "raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5" \ + "raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5 \ + raidz2 $vdev6 $vdev7 $vdev8" \ + "raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5 \ + spare $vdev6" \ + "raidz2 $vdev0 $vdev1 $vdev2 raidz2 $vdev3 $vdev4 $vdev5 \ + raidz2 $vdev6 $vdev7 $vdev8 spare $vdev9" \ + "raidz2 $vdev0 $vdev1 $vdev2 spare $vdev3 raidz2 $vdev4 $vdev5 $vdev6" + +set -A forced_args \ + "$vdev0 raidz $vdev1 $vdev2 raidz1 $vdev3 $vdev4 $vdev5" \ + "$vdev0 raidz2 $vdev1 $vdev2 $vdev3 raidz2 $vdev4 $vdev5 $vdev6" \ + "$vdev0 mirror $vdev1 $vdev2 mirror $vdev3 $vdev4" \ + "$vdev0 mirror $vdev1 $vdev2 raidz $vdev3 $vdev4 \ + raidz2 $vdev5 $vdev6 $vdev7 spare $vdev8" \ + "$vdev0 mirror $vdev1 $vdev2 spare $vdev3 raidz $vdev4 $vdev5" \ + "raidz $vdev0 $vdev1 raidz2 $vdev2 $vdev3 $vdev4" \ + "raidz $vdev0 $vdev1 raidz2 $vdev2 $vdev3 $vdev4 spare $vdev5" \ + "raidz $vdev0 $vdev1 spare $vdev2 raidz2 $vdev3 $vdev4 $vdev5" \ + "mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 raidz2 $vdev4 $vdev5 $vdev6" \ + "mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 \ + raidz2 $vdev4 $vdev5 $vdev6 spare $vdev7" \ + "mirror $vdev0 $vdev1 raidz $vdev2 $vdev3 \ + spare $vdev4 raidz2 $vdev5 $vdev6 $vdev7" \ + "spare $vdev0 $vdev1 $vdev2 mirror $vdev3 $vdev4 raidz $vdev5 $vdev6" + +i=0 +while ((i < ${#valid_args[@]})); do + log_must $ZPOOL create $TESTPOOL1 ${valid_args[$i]} + $SYNC; $SYNC + log_must $ZPOOL destroy -f $TESTPOOL1 + + ((i += 1)) +done + +i=0 +while ((i < ${#forced_args[@]})); do + log_mustnot $ZPOOL create $TESTPOOL1 ${forced_args[$i]} + log_must $ZPOOL create -f $TESTPOOL1 ${forced_args[$i]} + $SYNC; $SYNC + log_must $ZPOOL destroy -f $TESTPOOL1 + + ((i += 1)) +done + +log_pass "'zpool create' succeed with keywords combination." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_007_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_007_neg.ksh new file mode 100644 index 0000000000..6327e5a66d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_007_neg.ksh @@ -0,0 +1,85 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# 'zpool create' should return an error with badly formed parameters. +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool create' +# 3. Verify an error is returned. +# + +verify_runnable "global" + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +set -A args "" "-?" "-n" "-f" "-nf" "-fn" "-f -n" "--f" "-e" "-s" \ + "-m" "-R" "-m -R" "-Rm" "-mR" "-m $TESTDIR $TESTPOOL" \ + "-R $TESTDIR $TESTPOOL" "-m nodir $TESTPOOL $disk" \ + "-R nodir $TESTPOOL $disk" "-m nodir -R nodir $TESTPOOL $disk" \ + "-R nodir -m nodir $TESTPOOL $disk" "-R $TESTDIR -m nodir $TESTPOOL $disk" \ + "-R nodir -m $TESTDIR $TESTPOOL $disk" \ + "-blah" "$TESTPOOL" "$TESTPOOL blah" "$TESTPOOL c?t0d0" \ + "$TESTPOOL c0txd0" "$TESTPOOL c0t0dx" "$TESTPOOL cxtxdx" \ + "$TESTPOOL mirror" "$TESTPOOL raidz" "$TESTPOOL mirror raidz" \ + "$TESTPOOL raidz1" "$TESTPOOL mirror raidz1" \ + "$TESTPOOL mirror c?t?d?" "$TESTPOOL mirror $disk c0t1d?" \ + "$TESTPOOL RAIDZ ${disk}s${SLICE0} ${disk}s${SLICE1}" \ + "$TESTPOOL ${disk}s${SLICE0} log ${disk}s${SLICE1} \ + log ${disk}s${SLICE3}" \ + "$TESTPOOL ${disk}s${SLICE0} spare ${disk}s${SLICE1} \ + spare ${disk}s${SLICE3}" \ + "$TESTPOOL RAIDZ1 ${disk}s${SLICE0} ${disk}s${SLICE1}" \ + "$TESTPOOL MIRROR $disk" "$TESTPOOL raidz $disk" \ + "$TESTPOOL raidz1 $disk" \ + "1tank $disk" "1234 $disk" "?tank $disk" \ + "tan%k $disk" "ta@# $disk" "tan+k $disk" \ + "$BYND_MAX_NAME $disk" + +log_assert "'zpool create' should return an error with badly-formed parameters." +log_onexit default_cleanup_noexit + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL create ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool create' with badly formed parameters failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_008_pos.ksh new file mode 100644 index 0000000000..1a7d4f864a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_008_pos.ksh @@ -0,0 +1,148 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# 'zpool create' have to use '-f' scenarios +# +# STRATEGY: +# 1. Prepare the scenarios +# 2. Create pool without '-f' and verify it fails +# 3. Create pool with '-f' and verify it succeeds +# + +verify_runnable "global" + +function cleanup +{ + if [[ $exported_pool == true ]]; then + if [[ $force_pool == true ]]; then + log_must $ZPOOL create -f $TESTPOOL ${disk}s${SLICE0} + else + log_must $ZPOOL import $TESTPOOL + fi + fi + + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi + + if poolexists $TESTPOOL1 ; then + destroy_pool $TESTPOOL1 + fi + + # + # recover it back to EFI label + # + create_pool $TESTPOOL $disk + destroy_pool $TESTPOOL + + partition_disk $SIZE $disk 6 +} + +# +# create overlap slice 0 and 1 on $disk +# +function create_overlap_slice +{ + typeset format_file=/var/tmp/format_overlap.$$ + typeset disk=$1 + + $ECHO "partition" >$format_file + $ECHO "0" >> $format_file + $ECHO "" >> $format_file + $ECHO "" >> $format_file + $ECHO "0" >> $format_file + $ECHO "200m" >> $format_file + $ECHO "1" >> $format_file + $ECHO "" >> $format_file + $ECHO "" >> $format_file + $ECHO "0" >> $format_file + $ECHO "400m" >> $format_file + $ECHO "label" >> $format_file + $ECHO "" >> $format_file + $ECHO "q" >> $format_file + $ECHO "q" >> $format_file + + $FORMAT -e -s -d $disk -f $format_file + typeset -i ret=$? + $RM -fr $format_file + + if (( ret != 0 )); then + log_fail "unable to create overlap slice." + fi + + return 0 +} + +log_assert "'zpool create' have to use '-f' scenarios" +log_onexit cleanup + +typeset exported_pool=false +typeset force_pool=false + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +# overlapped slices as vdev need -f to create pool + +# Make the disk is EFI labeled first via pool creation +create_pool $TESTPOOL $disk +destroy_pool $TESTPOOL + +# Make the disk is VTOC labeled since only VTOC label supports overlap +log_must labelvtoc $disk +log_must create_overlap_slice $disk + +log_mustnot $ZPOOL create $TESTPOOL ${disk}s${SLICE0} +log_must $ZPOOL create -f $TESTPOOL ${disk}s${SLICE0} +destroy_pool $TESTPOOL + +# exported device to be as spare vdev need -f to create pool + +log_must $ZPOOL create -f $TESTPOOL $disk +destroy_pool $TESTPOOL +log_must partition_disk $SIZE $disk 6 +create_pool $TESTPOOL ${disk}s${SLICE0} ${disk}s${SLICE1} +log_must $ZPOOL export $TESTPOOL +exported_pool=true +log_mustnot $ZPOOL create $TESTPOOL1 ${disk}s${SLICE3} spare ${disk}s${SLICE1} +create_pool $TESTPOOL1 ${disk}s${SLICE3} spare ${disk}s${SLICE1} +force_pool=true +destroy_pool $TESTPOOL1 + +log_pass "'zpool create' have to use '-f' scenarios" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_009_neg.ksh new file mode 100644 index 0000000000..089c47505a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_009_neg.ksh @@ -0,0 +1,93 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# Create a pool with same devices twice or create two pools with same +# devices, 'zpool create' should failed. +# +# STRATEGY: +# 1. Loop to create the following three kinds of pools. +# - Regular pool +# - Mirror +# - Raidz +# 2. Create two pools but using the same disks, expect failed. +# 3. Create one pool but using the same disks twice, expect failed. +# + +verify_runnable "global" + +function cleanup +{ + typeset dtst + typeset disk + + for dtst in $TESTPOOL $TESTPOOL1; do + poolexists $dtst && destroy_pool $dtst + done + + for disk in $DISKS; do + partition_disk $SIZE $disk 6 + done +} + +log_assert "Create a pool with same devices twice or create two pools with " \ + "same devices, 'zpool create' should fail." +log_onexit cleanup + +typeset opt +for opt in "" "mirror" "raidz" "raidz1"; do + typeset disk="$DISKS" + (( ${#opt} == 0 )) && disk=${DISKS%% *} + + typeset -i count=$(get_word_count $disk) + if (( count < 2 && ${#opt} != 0 )) ; then + continue + fi + + # Create two pools but using the same disks. + create_pool $TESTPOOL $opt $disk + log_mustnot $ZPOOL create -f $TESTPOOL1 $opt $disk + destroy_pool $TESTPOOL + + # Create two pools and part of the devices were overlapped + create_pool $TESTPOOL $opt $disk + log_mustnot $ZPOOL create -f $TESTPOOL1 $opt ${DISKS% *} + destroy_pool $TESTPOOL + + # Create one pool but using the same disks twice. + log_mustnot $ZPOOL create -f $TESTPOOL $opt $disk $disk +done + +log_pass "Using overlapping or in-use disks to create a new pool fails as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_010_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_010_neg.ksh new file mode 100644 index 0000000000..7b555de9bd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_010_neg.ksh @@ -0,0 +1,88 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# 'zpool create' should return an error with VDEVsof size <64mb +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool create' +# 3. Verify an error is returned. +# + +log_assert "'zpool create' should return an error with VDEVs <64mb" + +verify_runnable "global" + +function cleanup +{ + poolexists $TOOSMALL && destroy_pool $TOOSMALL + poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1 + + poolexists $TESTPOOL && destroy_pool $TESTPOOL + + [[ -d $TESTDIR ]] && $RM -rf $TESTDIR + + partition_disk $SIZE $disk 6 +} +log_onexit cleanup + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +create_pool $TESTPOOL $disk +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + +for files in $TESTDIR/file1 $TESTDIR/file2 +do + log_must $MKFILE 63m $files +done + +set -A args \ + "$TOOSMALL $TESTDIR/file1" "$TESTPOOL1 $TESTDIR/file1 $TESTDIR/file2" \ + "$TOOSMALL mirror $TESTDIR/file1 $TESTDIR/file2" \ + "$TOOSMALL raidz $TESTDIR/file1 $TESTDIR/file2" + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL create ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool create' with badly formed parameters failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_011_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_011_neg.ksh new file mode 100644 index 0000000000..ea1fb7e6e0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_011_neg.ksh @@ -0,0 +1,129 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# 'zpool create' will fail in the following cases: +# existent pool; device is part of an active pool; nested virtual devices; +# differently sized devices without -f option; device being currently +# mounted; devices in /etc/vfstab; specified as the dedicated dump device. +# +# STRATEGY: +# 1. Create case scenarios +# 2. For each scenario, try to create a new pool with the virtual devices +# 3. Verify the creation is failed. +# + +verify_runnable "global" + +function cleanup +{ + for pool in $TESTPOOL $TESTPOOL1 + do + destroy_pool $pool + done + + if [[ -n $saved_dump_dev ]]; then + log_must $DUMPADM -u -d $saved_dump_dev + fi + + partition_disk $SIZE $disk 6 +} + +log_assert "'zpool create' should be failed with inapplicable scenarios." +log_onexit cleanup + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi +pooldev1=${disk}s${SLICE0} +pooldev2=${disk}s${SLICE1} +mirror1="${disk}s${SLICE1} ${disk}s${SLICE3}" +mirror2="${disk}s${SLICE4} ${disk}s${SLICE5}" +raidz1=$mirror1 +raidz2=$mirror2 +diff_size_dev="${disk}s${SLICE6} ${disk}s${SLICE7}" +vfstab_dev=$(find_vfstab_dev) +specified_dump_dev=${disk}s${SLICE0} +saved_dump_dev=$(save_dump_dev) + +cyl=$(get_endslice $disk $SLICE6) +set_partition $SLICE7 "$cyl" $SIZE1 $disk +create_pool "$TESTPOOL" "$pooldev1" + +# +# Set up the testing scenarios parameters +# +set -A arg "$TESTPOOL $pooldev2" \ + "$TESTPOOL1 $pooldev1" \ + "$TESTPOOL1 $TESTDIR0/$FILEDISK0" \ + "$TESTPOOL1 mirror mirror $mirror1 mirror $mirror2" \ + "$TESTPOOL1 raidz raidz $raidz1 raidz $raidz2" \ + "$TESTPOOL1 raidz1 raidz1 $raidz1 raidz1 $raidz2" \ + "$TESTPOOL1 mirror raidz $raidz1 raidz $raidz2" \ + "$TESTPOOL1 mirror raidz1 $raidz1 raidz1 $raidz2" \ + "$TESTPOOL1 raidz mirror $mirror1 mirror $mirror2" \ + "$TESTPOOL1 raidz1 mirror $mirror1 mirror $mirror2" \ + "$TESTPOOL1 mirror $diff_size_dev" \ + "$TESTPOOL1 raidz $diff_size_dev" \ + "$TESTPOOL1 raidz1 $diff_size_dev" \ + "$TESTPOOL1 mirror $mirror1 spare $mirror2 spare $diff_size_dev" \ + "$TESTPOOL1 $vfstab_dev" \ + "$TESTPOOL1 ${disk}s10" \ + "$TESTPOOL1 spare $pooldev2" + +typeset -i i=0 +while (( i < ${#arg[*]} )); do + log_mustnot $ZPOOL create ${arg[i]} + (( i = i+1 )) +done + +# now destroy the pool to be polite +log_must $ZPOOL destroy -f $TESTPOOL + +# create/destroy a pool as a simple way to set the partitioning +# back to something normal so we can use this $disk as a dump device +log_must $ZPOOL create -f $TESTPOOL3 $disk +log_must $ZPOOL destroy -f $TESTPOOL3 + +log_must $DUMPADM -d /dev/dsk/$specified_dump_dev +log_mustnot $ZPOOL create -f $TESTPOOL1 "$specified_dump_dev" + +# Also check to see that in-use checking prevents us from creating +# a zpool from just the first slice on the disk. +log_mustnot $ZPOOL create -f $TESTPOOL1 ${specified_dump_dev}s0 + +log_pass "'zpool create' is failed as expected with inapplicable scenarios." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_012_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_012_neg.ksh new file mode 100644 index 0000000000..f3e438f2c2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_012_neg.ksh @@ -0,0 +1,63 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# +# DESCRIPTION: +# 'zpool create' will fail with formal disk slice in swap +# +# +# STRATEGY: +# 1. Get all the disk devices in swap +# 2. For each device, try to create a new pool with this device +# 3. Verify the creation is failed. +# + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi + +} +typeset swap_disks=`$SWAP -l | $GREP "c[0-9].*d[0-9].*s[0-9]" | \ + $AWK '{print $1}'` + +log_assert "'zpool create' should fail with disk slice in swap." +log_onexit cleanup + +for sdisk in $swap_disks; do + for opt in "-n" "" "-f"; do + log_mustnot $ZPOOL create $opt $TESTPOOL $sdisk + done +done + +log_pass "'zpool create' passed as expected with inapplicable scenario." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_013_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_013_neg.ksh new file mode 100644 index 0000000000..55a5e5774a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_013_neg.ksh @@ -0,0 +1,104 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# +# DESCRIPTION: +# 'zpool create' will fail with metadevice in swap +# +# STRATEGY: +# 1. Create a one way strip metadevice +# 2. Try to create a new pool with metadevice in swap +# 3. Verify the creation is failed. +# + +verify_runnable "global" + +function cleanup +{ + # cleanup SVM + $METASTAT $md_name > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + $SWAP -l | $GREP /dev/md/dsk/$md_name > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + $SWAP -d /dev/md/dsk/$md_name + fi + $METACLEAR $md_name + fi + + $METADB | $GREP $mddb_dev > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + $METADB -df /dev/dsk/$mddb_dev + fi + + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi + +} + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +typeset mddb_dev=${disk}s${SLICE0} +typeset md_dev=${disk}s${SLICE1} +typeset md_name=d0 +typeset MD_DSK=/dev/md/dsk/d0 + +log_assert "'zpool create' should fail with metadevice in swap." +log_onexit cleanup + +# +# use metadevice in swap to create pool, which should fail. +# +$METADB | $GREP $mddb_dev > /dev/null 2>&1 +if [[ $? -ne 0 ]]; then + log_must $METADB -af $mddb_dev +fi + +$METASTAT $md_name > /dev/null 2>&1 +if [[ $? -eq 0 ]]; then + $METACLEAR $md_name +fi + +log_must $METAINIT $md_name 1 1 $md_dev +log_must $SWAP -a $MD_DSK +for opt in "-n" "" "-f"; do + log_mustnot $ZPOOL create $opt $TESTPOOL $MD_DSK +done + +log_pass "'zpool create' passed as expected with inapplicable scenario." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_014_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_014_neg.ksh new file mode 100644 index 0000000000..678e2b0707 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_014_neg.ksh @@ -0,0 +1,91 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# +# DESCRIPTION: +# 'zpool create' will fail with ordinary file in swap +# +# STRATEGY: +# 1. Create a regular file on top of UFS-zvol filesystem +# 2. Try to create a new pool with regular file in swap +# 3. Verify the creation is failed. +# + +verify_runnable "global" + +function cleanup +{ + if datasetexists $vol_name; then + $SWAP -l | $GREP $TMP_FILE > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + log_must $SWAP -d $TMP_FILE + fi + $RM -f $TMP_FILE + log_must $UMOUNT $mntp + $ZFS destroy $vol_name + fi + + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi +} + +log_assert "'zpool create' should fail with regular file in swap." +log_onexit cleanup + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +typeset pool_dev=${disk}s${SLICE0} +typeset vol_name=$TESTPOOL/$TESTVOL +typeset mntp=/mnt +typeset TMP_FILE=$mntp/tmpfile.$$ + +create_pool $TESTPOOL $pool_dev +log_must $ZFS create -V 100m $vol_name +log_must $ECHO "y" | $NEWFS /dev/zvol/dsk/$vol_name > /dev/null 2>&1 +log_must $MOUNT /dev/zvol/dsk/$vol_name $mntp + +log_must $MKFILE 50m $TMP_FILE +log_must $SWAP -a $TMP_FILE + +for opt in "-n" "" "-f"; do + log_mustnot $ZPOOL create $opt $TESTPOOL $TMP_FILE +done + +log_pass "'zpool create' passed as expected with inapplicable scenario." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_015_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_015_neg.ksh new file mode 100644 index 0000000000..2edcdd7169 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_015_neg.ksh @@ -0,0 +1,96 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# +# DESCRIPTION: +# 'zpool create' will fail with zfs vol device in swap +# +# +# STRATEGY: +# 1. Create a zpool +# 2. Create a zfs vol on zpool +# 3. Add this zfs vol device to swap +# 4. Try to create a new pool with devices in swap +# 5. Verify the creation is failed. +# + +verify_runnable "global" + +function cleanup +{ + # cleanup zfs pool and dataset + if datasetexists $vol_name; then + $SWAP -l | $GREP /dev/zvol/dsk/$vol_name > /dev/null 2>&1 + if [[ $? -eq 0 ]]; then + $SWAP -d /dev/zvol/dsk/${vol_name} + fi + fi + + for pool in $TESTPOOL1 $TESTPOOL; do + if poolexists $pool; then + destroy_pool $pool + fi + done + +} + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +typeset pool_dev=${disk}s${SLICE0} +typeset vol_name=$TESTPOOL/$TESTVOL + +log_assert "'zpool create' should fail with zfs vol device in swap." +log_onexit cleanup + +# +# use zfs vol device in swap to create pool which should fail. +# +create_pool $TESTPOOL $pool_dev +log_must $ZFS create -V 100m $vol_name +log_must $SWAP -a /dev/zvol/dsk/$vol_name +for opt in "-n" "" "-f"; do + log_mustnot $ZPOOL create $opt $TESTPOOL1 /dev/zvol/dsk/${vol_name} +done + +# cleanup +log_must $SWAP -d /dev/zvol/dsk/${vol_name} +log_must $ZFS destroy $vol_name +log_must $ZPOOL destroy $TESTPOOL + +log_pass "'zpool create' passed as expected with inapplicable scenario." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_016_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_016_pos.ksh new file mode 100644 index 0000000000..f13637e41e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_016_pos.ksh @@ -0,0 +1,96 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# +# DESCRIPTION: +# 'zpool create' will success with no device in swap +# +# +# STRATEGY: +# 1. delete all devices in the swap +# 2. create a zpool +# 3. Verify the creation is successed. +# + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi + + #recover swap devices + FSTAB=/tmp/fstab_$$ + $RM -f $FSTAB + for sdisk in $swap_disks; do + $ECHO "$sdisk - - swap - no -" >> $FSTAB + done + if [ -e $FSTAB ] + then + log_must $SWAPADD $FSTAB + fi + $RM -f $FSTAB + if [ $dump_device != "none" ] + then + log_must $DUMPADM -u -d $dump_device + fi +} + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi +typeset pool_dev=${disk}s${SLICE0} +typeset swap_disks=$($SWAP -l | $GREP -v "swapfile" | $AWK '{print $1}') +typeset dump_device=$($DUMPADM | $GREP "Dump device" | $AWK '{print $3}') + +log_assert "'zpool create' should success with no device in swap." +log_onexit cleanup + +for sdisk in $swap_disks; do + log_note "Executing: swap -d $sdisk" + $SWAP -d $sdisk >/dev/null 2>&1; + if [[ $? != 0 ]]; then + log_untested "Unable to delete swap device $sdisk because of" \ + "insufficient RAM" + fi +done + +log_must $ZPOOL create $TESTPOOL $pool_dev +log_must $ZPOOL destroy $TESTPOOL + +log_pass "'zpool create' passed as expected with applicable scenario." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_017_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_017_neg.ksh new file mode 100644 index 0000000000..1584d2f04b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_017_neg.ksh @@ -0,0 +1,90 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# +# DESCRIPTION: +# 'zpool create' will fail with mountpoint exists and is not empty. +# +# +# STRATEGY: +# 1. Prepare the mountpoint put some stuff into it. +# 2. Verify 'zpool create' over that mountpoint fails. +# + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi + + if [[ -d $TESTDIR ]]; then + log_must $RM -rf $TESTDIR + fi +} + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +typeset pool_dev=${disk}s${SLICE0} + +log_assert "'zpool create' should fail with mountpoint exists and not empty." +log_onexit cleanup + +if [[ ! -d $TESTDIR ]]; then + log_must $MKDIR -p $TESTDIR +fi + +typeset -i i=0 + +while (( i < 2 )); do + log_must $RM -rf $TESTDIR/* + if (( i == 0 )); then + log_must $MKDIR $TESTDIR/testdir + else + log_must $TOUCH $TESTDIR/testfile + fi + + log_mustnot $ZPOOL create -m $TESTDIR -f $TESTPOOL $pool_dev + log_mustnot poolexists $TESTPOOL + + (( i = i + 1 )) +done + +log_pass "'zpool create' fail as expected with mountpoint exists and not empty." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_018_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_018_pos.ksh new file mode 100644 index 0000000000..d3969c7d3b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_018_pos.ksh @@ -0,0 +1,104 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.shlib + +# +# DESCRIPTION: +# +# zpool create can create pools with specified properties +# +# STRATEGY: +# 1. Create a pool with all editable properties +# 2. Verify those properties are set +# 3. Create a pool with two properties set +# 4. Verify both properties are set correctly +# + +function cleanup +{ + poolexists $TESTPOOL && destroy_pool $TESTPOOL + [[ -f $CPATH ]] && log_must $RM $CPATH +} + +log_onexit cleanup +log_assert "zpool create can create pools with specified properties" + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +# +# we don't include "root" property in this list, as it requires both "cachefile" +# and "root" to be set at the same time. A test for this is included in +# ../../root. +# +typeset props=("autoreplace" "delegation" "cachefile" "version" "autoexpand") +typeset vals=("off" "off" "$CPATH" "3" "on") + +typeset -i i=0; +while [ $i -lt "${#props[@]}" ] +do + log_must $ZPOOL create -o ${props[$i]}=${vals[$i]} $TESTPOOL $disk + RESULT=$(get_pool_prop ${props[$i]} $TESTPOOL) + if [[ $RESULT != ${vals[$i]} ]] + then + $ZPOOL get all $TESTPOOL + log_fail "Pool was created without setting the ${props[$i]} " \ + "property" + fi + log_must $ZPOOL destroy $TESTPOOL + ((i = i + 1)) +done + +# Destroy our pool +poolexists $TESTPOOL && destroy_pool $TESTPOOL + +# pick two properties, and verify we can create with those as well +log_must $ZPOOL create -o delegation=off -o cachefile=$CPATH $TESTPOOL $disk +RESULT=$(get_pool_prop delegation $TESTPOOL) +if [[ $RESULT != off ]] +then + $ZPOOL get all $TESTPOOL + log_fail "Pool created without the delegation prop." +fi + +RESULT=$(get_pool_prop cachefile $TESTPOOL) +if [[ $RESULT != $CPATH ]] +then + $ZPOOL get all $TESTPOOL + log_fail "Pool created without the cachefile prop." +fi + +log_pass "zpool create can create pools with specified properties" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_019_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_019_pos.ksh new file mode 100644 index 0000000000..74f73671ec --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_019_pos.ksh @@ -0,0 +1,72 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# zpool create cannot create pools specifying readonly properties +# +# STRATEGY: +# 1. Attempt to create a pool, specifying each readonly property in turn +# 2. Verify the pool was not created +# + +function cleanup +{ + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi +} + +log_onexit cleanup + +log_assert "zpool create cannot create pools specifying readonly properties" + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +set -A props "available" "capacity" "guid" "health" "size" "used" +set -A vals "100" "10" "12345" "HEALTHY" "10" "10" + +typeset -i i=0; +while [ $i -lt "${#props[@]}" ] +do + # try to set each property in the prop list with it's corresponding val + log_mustnot $ZPOOL create -o ${props[$i]}=${vals[$i]} $TESTPOOL $disk + if poolexists $TESTPOOL + then + log_fail "$TESTPOOL was created when setting ${props[$i]}!" + fi + i=$(( $i + 1)) +done + +log_pass "zpool create cannot create pools specifying readonly properties" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_020_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_020_pos.ksh new file mode 100644 index 0000000000..53c3a64ca5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_020_pos.ksh @@ -0,0 +1,111 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_create/zpool_create.cfg + +# +# DESCRIPTION: +# +# zpool create -R works as expected +# +# STRATEGY: +# 1. Create a -R altroot pool +# 2. Verify the pool is mounted at the correct location +# 3. Verify that cachefile=none for the pool +# 4. Verify that root=<mountpoint> for the pool +# 5. Verify that no reference to the pool is found in /etc/zfs/zpool.cache + +function cleanup +{ + if poolexists $TESTPOOL ; then + destroy_pool $TESTPOOL + fi + if [ -d ${TESTPOOL}.root ] + then + log_must $RMDIR ${TESTPOOL}.root + fi +} + +log_onexit cleanup + +log_assert "zpool create -R works as expected" + +if [[ -n $DISK ]]; then + disk=$DISK +else + disk=$DISK0 +fi + +log_must $MKDIR /${TESTPOOL}.root +log_must $ZPOOL create -R /${TESTPOOL}.root $TESTPOOL $disk +if [ ! -d /${TESTPOOL}.root ] +then + log_fail "Mountpoint was not create when using zpool with -R flag!" +fi + +FS=$($ZFS list $TESTPOOL) +if [ -z "$FS" ] +then + log_fail "Mounted filesystem at /${TESTPOOL}.root isn't ZFS!" +fi + +log_must $ZPOOL get all $TESTPOOL +$ZPOOL get all $TESTPOOL > /tmp/values.$$ + +# check for the cachefile property, verifying that it's set to 'none' +$GREP "$TESTPOOL[ ]*cachefile[ ]*none" /tmp/values.$$ > /dev/null 2>&1 +if [ $? -ne 0 ] +then + log_fail "zpool property \'cachefile\' was not set to \'none\'." +fi + +# check that the root = /mountpoint property is set correctly +$GREP "$TESTPOOL[ ]*altroot[ ]*/${TESTPOOL}.root" /tmp/values.$$ > /dev/null 2>&1 +if [ $? -ne 0 ] +then + log_fail "zpool property root was not found in pool output." +fi + +$RM /tmp/values.$$ + +# finally, check that the pool has no reference in /etc/zfs/zpool.cache +if [[ -f /etc/zfs/zpool.cache ]] ; then + REF=$($STRINGS /etc/zfs/zpool.cache | $GREP ${TESTPOOL}) + if [ ! -z "$REF" ] + then + $STRINGS /etc/zfs/zpool.cache + log_fail "/etc/zfs/zpool.cache appears to have a reference to $TESTPOOL" + fi +fi + + +log_pass "zpool create -R works as expected" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_021_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_021_pos.ksh new file mode 100644 index 0000000000..ab3ea8fa10 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_021_pos.ksh @@ -0,0 +1,89 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib + +# +# DESCRIPTION: +# 'zpool create -O property=value pool' can successfully create a pool +# with correct filesystem property set. +# +# STRATEGY: +# 1. Create a storage pool with -O option +# 2. Verify the pool created successfully +# 3. Verify the filesystem property is correctly set +# + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL && destroy_pool $TESTPOOL +} + +log_onexit cleanup + +log_assert "'zpool create -O property=value pool' can successfully create a pool \ + with correct filesystem property set." + +set -A RW_FS_PROP "quota=512M" \ + "reservation=512M" \ + "recordsize=64K" \ + "mountpoint=/tmp/mnt$$" \ + "checksum=fletcher2" \ + "compression=lzjb" \ + "atime=off" \ + "devices=off" \ + "exec=off" \ + "setuid=off" \ + "readonly=on" \ + "snapdir=visible" \ + "aclmode=discard" \ + "aclinherit=discard" \ + "canmount=off" \ + "sharenfs=on" \ + "zoned=on" + +typeset -i i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + log_must $ZPOOL create -O ${RW_FS_PROP[$i]} -f $TESTPOOL $DISKS + datasetexists $TESTPOOL || \ + log_fail "zpool create $TESTPOOL fail." + propertycheck $TESTPOOL ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + log_must $ZPOOL destroy $TESTPOOL + (( i = i + 1 )) +done + +log_pass "'zpool create -O property=value pool' can successfully create a pool \ + with correct filesystem property set." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_022_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_022_pos.ksh new file mode 100644 index 0000000000..03bd672253 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_022_pos.ksh @@ -0,0 +1,95 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_create/zfs_create_common.kshlib + +# +# DESCRIPTION: +# 'zpool create -O property=value pool' can successfully create a pool +# with multiple filesystem properties set. +# +# STRATEGY: +# 1. Create a storage pool with multiple -O options +# 2. Verify the pool created successfully +# 3. Verify the properties are correctly set +# + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL && log_must $ZPOOL destroy $TESTPOOL +} + +log_onexit cleanup + +log_assert "'zpool create -O property=value pool' can successfully create a pool \ + with multiple filesystem properties set." + +set -A RW_FS_PROP "quota=512M" \ + "reservation=512M" \ + "recordsize=64K" \ + "mountpoint=/tmp/mnt$$" \ + "checksum=fletcher2" \ + "compression=lzjb" \ + "atime=off" \ + "devices=off" \ + "exec=off" \ + "setuid=off" \ + "readonly=on" \ + "snapdir=visible" \ + "aclmode=discard" \ + "aclinherit=discard" \ + "canmount=off" \ + "sharenfs=on" + +typeset -i i=0 +typeset opts="" + +while (( $i < ${#RW_FS_PROP[*]} )); do + opts="$opts -O ${RW_FS_PROP[$i]}" + (( i = i + 1 )) +done + +log_must $ZPOOL create $opts -f $TESTPOOL $DISKS +datasetexists $TESTPOOL || log_fail "zpool create $TESTPOOL fail." + +i=0 +while (( $i < ${#RW_FS_PROP[*]} )); do + propertycheck $TESTPOOL ${RW_FS_PROP[i]} || \ + log_fail "${RW_FS_PROP[i]} is failed to set." + (( i = i + 1 )) +done + +log_pass "'zpool create -O property=value pool' can successfully create a pool \ + with multiple filesystem properties set." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_023_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_023_neg.ksh new file mode 100644 index 0000000000..20b2daa806 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_023_neg.ksh @@ -0,0 +1,81 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zpool create -O' should return an error with badly formed parameters. +# +# STRATEGY: +# 1. Create an array of parameters with '-O' +# 2. For each parameter in the array, execute 'zpool create -O' +# 3. Verify an error is returned. +# + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL && log_must $ZPOOL destroy $TESTPOOL +} + +log_onexit cleanup + +set -A args "QuOta=none" "quota=non" "quota=abcd" "quota=0" "quota=" \ + "ResErVaTi0n=none" "reserV=none" "reservation=abcd" "reserv=" \ + "recorDSize=64k" "recordsize=256K" "recordsize=256" \ + "recsize=" "recsize=zero" "recordsize=0" \ + "mountPoint=/tmp/tmpfile$$" "mountpoint=non0" "mountpoint=" \ + "mountpoint=LEGACY" "mounpoint=none" \ + "sharenfs=ON" "ShareNFS=off" "sharenfs=sss" \ + "checkSUM=on" "checksum=SHA256" "chsum=off" "checksum=aaa" \ + "compression=of" "ComPression=lzjb" "compress=ON" "compress=a" \ + "atime=ON" "ATime=off" "atime=bbb" \ + "deviCes=on" "devices=OFF" "devices=aaa" \ + "exec=ON" "EXec=off" "exec=aaa" \ + "readonly=ON" "reADOnly=off" "rdonly=OFF" "rdonly=aaa" \ + "zoned=ON" "ZoNed=off" "zoned=aaa" \ + "snapdIR=hidden" "snapdir=VISible" "snapdir=aaa" \ + "aclmode=DIScard" "aclmODE=groupmask" "aclmode=aaa" \ + "aclinherit=deny" "aclinHerit=secure" "aclinherit=aaa" \ + "type=volume" "type=snapshot" "type=filesystem" \ + "creation=aaa" "used=10K" "available=10K" \ + "referenced=10K" "compressratio=1.00x" \ + "version=0" "version=1.234" "version=10K" "version=-1" \ + "version=aaa" "version=999" + +log_assert "'zpool create -O' should return an error with badly formed parameters." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL create -O ${args[i]} -f $TESTPOOL $DISKS + ((i = i + 1)) +done + +log_pass "'zpool create -O' should return an error with badly formed parameters." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_001_pos.ksh new file mode 100644 index 0000000000..296a7b47fb --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_001_pos.ksh @@ -0,0 +1,70 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +################################################################################ +# +# Newly created pools should have all features enabled. +# Specifying a feature to be enabled with '-o' should be a no-op. +# +# 1. Create a new pool. +# 2. Verify that every feature@ property is in the 'enabled' or 'active' state +# 3. Destroy the pool and create a new pool with +# '-o feature@async_destroy=enabled' +# 4. Verify again. +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL && log_must $ZPOOL destroy $TESTPOOL +} + +function check_features +{ + for state in $($ZPOOL get all $TESTPOOL | \ + $AWK '$2 ~ /feature@/ { print $3 }'); do + if [[ "$state" != "enabled" && "$state" != "active" ]]; then + log_fail "some features are not enabled on new pool" + fi + done +} + +log_onexit cleanup + +log_assert "'zpool create' creates pools with all features enabled" + +log_must $ZPOOL create -f $TESTPOOL $DISKS +check_features +log_must $ZPOOL destroy -f $TESTPOOL + +log_must $ZPOOL create -f -o feature@async_destroy=enabled $TESTPOOL $DISKS +check_features + +log_pass "'zpool create' creates pools with all features enabled" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_002_pos.ksh new file mode 100644 index 0000000000..ce24b38dd8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_002_pos.ksh @@ -0,0 +1,69 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +################################################################################ +# +# When using the '-d' option or specifying '-o version=X' new pools should +# have all features disabled. +# +# 1. Create a new pool with '-d'. +# 2. Verify that every feature@ property is in the 'disabled' state +# 3. Destroy pool and re-create with -o version=28 +# 4. Verify again. +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL && log_must $ZPOOL destroy $TESTPOOL +} + +function check_features +{ + for prop in $($ZPOOL get all $TESTPOOL | $AWK '$2 ~ /feature@/ { print $2 }'); do + state=$($ZPOOL list -Ho "$prop" $TESTPOOL) + if [[ "$state" != "disabled" ]]; then + log_fail "$prop is enabled on new pool" + fi + done +} + +log_onexit cleanup + +log_assert "'zpool create -d' creates pools with all features disabled" + +log_must $ZPOOL create -f -d $TESTPOOL $DISKS +check_features +log_must $ZPOOL destroy -f $TESTPOOL + +log_must $ZPOOL create -f -o version=28 $TESTPOOL $DISKS +check_features + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_003_pos.ksh new file mode 100644 index 0000000000..936a1cd571 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_003_pos.ksh @@ -0,0 +1,69 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +################################################################################ +# +# When using the '-d' option with '-o feature@XXX=enabled' only the specified +# feature is enabled. +# +# 1. Create a new pool with '-d' and '-o feature@async_destroy=enabled'. +# async_destroy does not depend on anything so it should be the only +# feature that gets enabled. +# 2. Verify that every feature@ property except feature@async_destroy is in +# the 'disabled' state +# +################################################################################ + +verify_runnable "global" + +function cleanup +{ + datasetexists $TESTPOOL && log_must $ZPOOL destroy $TESTPOOL +} + +log_onexit cleanup + +log_assert "'zpool create -d -o feature@async_destroy=enabled' only " \ + "enables async_destroy" + +log_must $ZPOOL create -f -d -o feature@async_destroy=enabled $TESTPOOL $DISKS + +state=$($ZPOOL list -Ho feature@async_destroy $TESTPOOL) +if [[ "$state" != "enabled" ]]; then + log_fail "async_destroy has state $state" +fi + +for prop in $($ZPOOL get all $TESTPOOL | $AWK '$2 ~ /feature@/ { print $2 }'); do + state=$($ZPOOL list -Ho "$prop" $TESTPOOL) + if [[ "$prop" != "feature@async_destroy" \ + && "$state" != "disabled" ]]; then + log_fail "$prop is enabled on new pool" + fi +done + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_004_neg.ksh new file mode 100644 index 0000000000..fb651f56dd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_create/zpool_create_features_004_neg.ksh @@ -0,0 +1,59 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +################################################################################ +# +# Specifying invalid features/states should cause the create to fail. +# +# 1. Try to create the pool with a variety of invalid feature flags options. +# 2. Verify no pool was created. +# +################################################################################ + +verify_runnable "global" + +properties="feature@async_destroy=disabled " \ + "feature@async_destroy=active " \ + "feature@xxx_fake_xxx=enabled " \ + "unsupported@some_feature=inactive " \ + "unsupported@some_feature=readonly " + +function cleanup +{ + datasetexists $TESTPOOL && log_must $ZPOOL destroy $TESTPOOL +} + +log_assert "'zpool create with invalid features fails" +log_onexit cleanup + +for prop in $properties; do + log_mustnot $ZPOOL create -f -o "$prop" $TESTPOOL $DISKS + log_mustnot datasetexists $TESTPOOL +done + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/Makefile new file mode 100644 index 0000000000..f40ceafc93 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/Makefile @@ -0,0 +1,43 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_destroy + +PROGS = zpool_destroy_001_pos \ + zpool_destroy_002_pos \ + zpool_destroy_003_neg + +FILES = zpool_destroy.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy.cfg new file mode 100644 index 0000000000..d8d828891b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy.cfg @@ -0,0 +1,34 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export DISK=${DISKS%% *} +export SLICE0=0 +export SLICE1=1 +export SLICE_SIZE=500m diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_001_pos.ksh new file mode 100644 index 0000000000..e7a820b99d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_001_pos.ksh @@ -0,0 +1,87 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_destroy/zpool_destroy.cfg + + +# +# DESCRIPTION: +# 'zpool destroy <pool>' can successfully destroy the specified pool. +# +# STRATEGY: +# 1. Create a storage pool +# 2. Destroy the pool +# 3. Verify the is destroyed successfully +# + +verify_runnable "global" + +function cleanup +{ + poolexists $TESTPOOL2 && destroy_pool $TESTPOOL2 + datasetexists $TESTPOOL1/$TESTVOL && \ + log_must $ZFS destroy -f $TESTPOOL1/$TESTVOL + + typeset pool + for pool in $TESTPOOL1 $TESTPOOL; do + poolexists $pool && destroy_pool $pool + done + + zero_partitions $DISK +} + +set -A datasets "$TESTPOOL" "$TESTPOOL2" + +if ! $(is_physical_device $DISKS) ; then + log_unsupported "This case cannot be run on raw files." +fi + +log_assert "'zpool destroy <pool>' can destroy a specified pool." + +log_onexit cleanup + +partition_disk $SLICE_SIZE $DISK 2 + +create_pool "$TESTPOOL" "${DISK}s${SLICE0}" +create_pool "$TESTPOOL1" "${DISK}s${SLICE1}" +log_must $ZFS create -s -V $VOLSIZE $TESTPOOL1/$TESTVOL +create_pool "$TESTPOOL2" "/dev/zvol/dsk/$TESTPOOL1/$TESTVOL" + +typeset -i i=0 +while (( i < ${#datasets[*]} )); do + log_must poolexists "${datasets[i]}" + log_must $ZPOOL destroy "${datasets[i]}" + log_mustnot poolexists "${datasets[i]}" + ((i = i + 1)) +done + +log_pass "'zpool destroy <pool>' executes successfully" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_002_pos.ksh new file mode 100644 index 0000000000..682e9c0882 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_002_pos.ksh @@ -0,0 +1,117 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_destroy/zpool_destroy.cfg + +# +# DESCRIPTION: +# 'zpool destroy -f <pool>' can forcely destroy the specified pool. +# +# STRATEGY: +# 1. Create a storage pool +# 2. Create some datasets within the pool +# 3. Change directory to any mountpoint of these datasets, +# Verify 'zpool destroy' without '-f' will fail. +# 4. 'zpool destroy -f' the pool +# 5. Verify the pool is destroyed successfully +# + +verify_runnable "global" + +function cleanup +{ + [[ -n $cwd ]] && log_must cd $cwd + + if [[ -d $TESTDIR ]]; then + ismounted $TESTDIR + (( $? == 0 )) && \ + log_must $UNMOUNT $TESTDIR + log_must $RM -rf $TESTDIR + fi + + typeset -i i=0 + while (( $i < ${#datasets[*]} )); do + datasetexists ${datasets[i]} && \ + log_must $ZFS destroy ${datasets[i]} + (( i = i + 1 )) + done + + poolexists $TESTPOOL && destroy_pool $TESTPOOL +} + +set -A datasets "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTVOL" \ + +log_assert "'zpool destroy -f <pool>' can forcely destroy the specified pool" + +log_onexit cleanup + +typeset cwd="" + +create_pool "$TESTPOOL" "$DISK" +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $MKDIR -p $TESTDIR +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS +log_must $ZFS create $TESTPOOL/$TESTCTR +log_must $ZFS create $TESTPOOL/$TESTCTR/$TESTFS1 +log_must $ZFS create -V $VOLSIZE $TESTPOOL/$TESTVOL + +typeset -i i=0 +while (( $i < ${#datasets[*]} )); do + datasetexists "${datasets[i]}" || \ + log_fail "Create datasets fail." + ((i = i + 1)) +done + +cwd=$PWD +log_note "'zpool destroy' without '-f' will fail " \ + "while pool is busy." + +for dir in $TESTDIR /$TESTPOOL/$TESTCTR /$TESTPOOL/$TESTCTR/$TESTFS1 ; do + log_must cd $dir + log_mustnot $ZPOOL destroy $TESTPOOL + + # Need mount here, otherwise some dataset may be unmounted. + log_must $ZFS mount -a + + i=0 + while (( i < ${#datasets[*]} )); do + datasetexists "${datasets[i]}" || \ + log_fail "Dataset ${datasets[i]} removed unexpected." + ((i = i + 1)) + done +done + +destroy_pool $TESTPOOL +log_mustnot poolexists "$TESTPOOL" + +log_pass "'zpool destroy -f <pool>' success." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_003_neg.ksh new file mode 100644 index 0000000000..fb104f1f34 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_destroy/zpool_destroy_003_neg.ksh @@ -0,0 +1,52 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zpool destroy' should return an error with badly formed parameters, +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool destroy' +# 3. Verify an error is returned. +# + +verify_runnable "global" + +set -A args "" "-f" "-? $TESTPOOL" "nonexistent_pool" \ + "$TESTPOOL abcd" "abcd $TESTPOOL" + +log_assert "'zpool destroy' should return an error with badly-formed parameters." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL destroy ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool destroy' badly formed parameters fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/Makefile new file mode 100644 index 0000000000..e9c05c2d74 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/Makefile @@ -0,0 +1,41 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_detach + +PROGS = cleanup \ + setup \ + zpool_detach_001_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/cleanup.ksh new file mode 100644 index 0000000000..b2b93316e4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/setup.ksh new file mode 100644 index 0000000000..51dfd8107b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" +verify_disk_count "$DISKS" 2 + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/zpool_detach_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/zpool_detach_001_neg.ksh new file mode 100644 index 0000000000..848ce8c827 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_detach/zpool_detach_001_neg.ksh @@ -0,0 +1,65 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Executing 'zpool detach' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool detach' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-?" "-t fakepool" "-f fakepool" "-ev fakepool" "fakepool" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" + +log_assert "Executing 'zpool detach' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL detach ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool detach' command with bad options failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/Makefile new file mode 100644 index 0000000000..72ef62ce25 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/Makefile @@ -0,0 +1,45 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_expand + +PROGS = cleanup \ + setup \ + zpool_expand_001_pos \ + zpool_expand_002_pos \ + zpool_expand_003_neg + +FILES = zpool_expand.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/cleanup.ksh new file mode 100644 index 0000000000..8f47659bd7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/setup.ksh new file mode 100644 index 0000000000..af91f6cea6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/setup.ksh @@ -0,0 +1,34 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand.cfg new file mode 100644 index 0000000000..16df1d91d3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand.cfg @@ -0,0 +1,38 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + + +export org_size=1g +export exp_size=2g + +export VFS=$TESTPOOL/$TESTFS + +export EX_1GB=1073741824 +export EX_3GB=3221225472 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_001_pos.ksh new file mode 100644 index 0000000000..85c887a174 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_001_pos.ksh @@ -0,0 +1,146 @@ +#! /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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_expand/zpool_expand.cfg + +# +# DESCRIPTION: +# Once zpool set autoexpand=on poolname, zpool can autoexpand by +# Dynamic LUN Expansion +# +# +# STRATEGY: +# 1) Create a pool +# 2) Create volume on top of the pool +# 3) Create pool by using the zvols and set autoexpand=on +# 4) Expand the vol size by 'zfs set volsize' +# 5) Check that the pool size was expanded +# + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL1; then + log_must $ZPOOL destroy $TESTPOOL1 + fi + + for i in 1 2 3; do + if datasetexists $VFS/vol$i; then + log_must $ZFS destroy $VFS/vol$i + fi + done +} + +log_onexit cleanup + +log_assert "zpool can be autoexpanded after set autoexpand=on on LUN expansion" + +for i in 1 2 3; do + log_must $ZFS create -V $org_size $VFS/vol$i +done + +for type in " " mirror raidz raidz2; do + + log_must $ZPOOL create -o autoexpand=on $TESTPOOL1 $type \ + /dev/zvol/dsk/$VFS/vol1 /dev/zvol/dsk/$VFS/vol2 \ + /dev/zvol/dsk/$VFS/vol3 + + typeset autoexp=$(get_pool_prop autoexpand $TESTPOOL1) + if [[ $autoexp != "on" ]]; then + log_fail "zpool $TESTPOOL1 autoexpand should on but is $autoexp" + fi + + typeset prev_size=$(get_pool_prop size $TESTPOOL1) + typeset zfs_prev_size=$($ZFS get -p avail $TESTPOOL1 | $TAIL -1 | \ + $AWK '{print $3}') + + for i in 1 2 3; do + log_must $ZFS set volsize=$exp_size $VFS/vol$i + done + + $SYNC + $SLEEP 10 + $SYNC + + typeset expand_size=$(get_pool_prop size $TESTPOOL1) + typeset zfs_expand_size=$($ZFS get -p avail $TESTPOOL1 | $TAIL -1 | \ + $AWK '{print $3}') + + log_note "$TESTPOOL1 $type has previous size: $prev_size and " \ + "expanded size: $expand_size" + # compare available pool size from zfs + if [[ $zfs_expand_size > $zfs_prev_size ]]; then + # check for zpool history for the pool size expansion + if [[ $type == " " ]]; then + typeset size_addition=$($ZPOOL history -il $TESTPOOL1 |\ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "vdev online" | \ + $GREP "(+${EX_1GB}" | wc -l) + + if [[ $size_addition -ne $i ]]; then + log_fail "pool $TESTPOOL1 is not autoexpand " \ + "after LUN expansion" + fi + elif [[ $type == "mirror" ]]; then + $ZPOOL history -il $TESTPOOL1 | \ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "vdev online" | \ + $GREP "(+${EX_1GB})" >/dev/null 2>&1 + + if [[ $? -ne 0 ]] ; then + log_fail "pool $TESTPOOL1 is not autoexpand " \ + "after LUN expansion" + fi + else + $ZPOOL history -il $TESTPOOL1 | \ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "vdev online" | \ + $GREP "(+${EX_3GB})" >/dev/null 2>&1 + + if [[ $? -ne 0 ]]; then + log_fail "pool $TESTPOOL is not autoexpand " \ + "after LUN expansion" + fi + fi + else + log_fail "pool $TESTPOOL1 is not autoexpanded after LUN " \ + "expansion" + fi + + log_must $ZPOOL destroy $TESTPOOL1 + for i in 1 2 3; do + log_must $ZFS set volsize=$org_size $VFS/vol$i + done + +done +log_pass "zpool can be autoexpanded after set autoexpand=on on LUN expansion" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_002_pos.ksh new file mode 100644 index 0000000000..e481682f45 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_002_pos.ksh @@ -0,0 +1,148 @@ +#! /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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_expand/zpool_expand.cfg + +# +# DESCRIPTION: +# After zpool online -e poolname zvol vdevs, zpool can autoexpand by +# Dynamic LUN Expansion +# +# +# STRATEGY: +# 1) Create a pool +# 2) Create volume on top of the pool +# 3) Create pool by using the zvols +# 4) Expand the vol size by zfs set volsize +# 5 Use zpool online -e to online the zvol vdevs +# 6) Check that the pool size was expaned +# + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL1; then + log_must $ZPOOL destroy $TESTPOOL1 + fi + + for i in 1 2 3; do + if datasetexists $VFS/vol$i; then + log_must $ZFS destroy $VFS/vol$i + fi + done +} + +log_onexit cleanup + +log_assert "zpool can expand after zpool online -e zvol vdevs on LUN expansion" + +for i in 1 2 3; do + log_must $ZFS create -V $org_size $VFS/vol$i +done + +for type in " " mirror raidz raidz2; do + log_must $ZPOOL create $TESTPOOL1 $type /dev/zvol/dsk/$VFS/vol1 \ + /dev/zvol/dsk/$VFS/vol2 /dev/zvol/dsk/$VFS/vol3 + + typeset autoexp=$(get_pool_prop autoexpand $TESTPOOL1) + + if [[ $autoexp != "off" ]]; then + log_fail "zpool $TESTPOOL1 autoexpand should off but is " \ + "$autoexp" + fi + typeset prev_size=$(get_pool_prop size $TESTPOOL1) + typeset zfs_prev_size=$($ZFS get -p avail $TESTPOOL1 | $TAIL -1 | \ + $AWK '{print $3}') + + for i in 1 2 3; do + log_must $ZFS set volsize=$exp_size $VFS/vol$i + done + + for i in 1 2 3; do + log_must $ZPOOL online -e $TESTPOOL1 /dev/zvol/dsk/$VFS/vol$i + done + + $SYNC + $SLEEP 10 + $SYNC + + typeset expand_size=$(get_pool_prop size $TESTPOOL1) + typeset zfs_expand_size=$($ZFS get -p avail $TESTPOOL1 | $TAIL -1 | \ + $AWK '{print $3}') + log_note "$TESTPOOL1 $type has previous size: $prev_size and " \ + "expanded size: $expand_size" + + # compare available pool size from zfs + if [[ $zfs_expand_size > $zfs_prev_size ]]; then + # check for zpool history for the pool size expansion + if [[ $type == " " ]]; then + typeset size_addition=$($ZPOOL history -il $TESTPOOL1 \ + | $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "vdev online" | \ + $GREP "(+${EX_1GB}" | wc -l) + + if [[ $size_addition -ne $i ]]; then + log_fail "pool $TESTPOOL1 is not autoexpand " \ + "after LUN expansion" + fi + elif [[ $type == "mirror" ]]; then + $ZPOOL history -il $TESTPOOL1 | \ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "vdev online" | \ + $GREP "(+${EX_1GB})" >/dev/null 2>&1 + + if [[ $? -ne 0 ]]; then + log_fail "pool $TESTPOOL1 is not autoexpand " \ + "after LUN expansion" + fi + else + $ZPOOL history -il $TESTPOOL1 | \ + $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "vdev online" | \ + $GREP "(+${EX_3GB})" >/dev/null 2>&1 + + if [[ $? -ne 0 ]] ; then + log_fail "pool $TESTPOOL1 is not autoexpand " \ + "after LUN expansion" + fi + fi + else + log_fail "pool $TESTPOOL1 is not autoexpanded after LUN " \ + "expansion" + fi + log_must $ZPOOL destroy $TESTPOOL1 + for i in 1 2 3; do + log_must $ZFS set volsize=$org_size $VFS/vol$i + done +done +log_pass "zpool can expand after zpool online -e zvol vdevs on LUN expansion" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_003_neg.ksh new file mode 100644 index 0000000000..c686afe3d5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_expand/zpool_expand_003_neg.ksh @@ -0,0 +1,115 @@ +#! /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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_expand/zpool_expand.cfg + +# +# Description: +# Once set zpool autoexpand=off, zpool can *NOT* autoexpand by +# Dynamic LUN Expansion +# +# +# STRATEGY: +# 1) Create a pool +# 2) Create volumes on top of the pool +# 3) Create pool by using the zvols and set autoexpand=off +# 4) Expand the vol size by zfs set volsize +# 5) Check that the pool size is not changed +# + +verify_runnable "global" + +function cleanup +{ + if poolexists $TESTPOOL1; then + log_must $ZPOOL destroy $TESTPOOL1 + fi + + for i in 1 2 3; do + if datasetexists $VFS/vol$i; then + log_must $ZFS destroy $VFS/vol$i + fi + done +} + +log_onexit cleanup + +log_assert "zpool can not expand if set autoexpand=off after LUN expansion" + +for i in 1 2 3; do + log_must $ZFS create -V $org_size $VFS/vol$i +done + +for type in " " mirror raidz raidz2; do + log_must $ZPOOL create $TESTPOOL1 $type /dev/zvol/dsk/$VFS/vol1 \ + /dev/zvol/dsk/$VFS/vol2 /dev/zvol/dsk/$VFS/vol3 + + typeset autoexp=$(get_pool_prop autoexpand $TESTPOOL1) + if [[ $autoexp != "off" ]]; then + log_fail "zpool $TESTPOOL1 autoexpand should off but is " \ + "$autoexp" + fi + + typeset prev_size=$(get_pool_prop size $TESTPOOL1) + + for i in 1 2 3; do + log_must $ZFS set volsize=$exp_size $VFS/vol$i + done + + $SYNC + $SLEEP 10 + $SYNC + + # check for zpool history for the pool size expansion + $ZPOOL history -il $TESTPOOL1 | $GREP "pool '$TESTPOOL1' size:" | \ + $GREP "vdev online" >/dev/null 2>&1 + + if [[ $? -eq 0 ]]; then + log_fail "pool $TESTPOOL1 is not autoexpand after LUN " \ + "expansion" + fi + + typeset expand_size=$(get_pool_prop size $TESTPOOL1) + + if [[ "$prev_size" != "$expand_size" ]]; then + log_fail "pool $TESTPOOL1 size changed after LUN expansion" + fi + + log_must $ZPOOL destroy $TESTPOOL1 + + for i in 1 2 3; do + log_must $ZFS set volsize=$org_size $VFS/vol$i + done + +done + +log_pass "zpool can not expand if set autoexpand=off after LUN expansion" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/Makefile new file mode 100644 index 0000000000..8b92ff939c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/Makefile @@ -0,0 +1,44 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_export + +PROGS = cleanup \ + setup \ + zpool_export_001_pos \ + zpool_export_002_pos \ + zpool_export_003_neg \ + zpool_export_004_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_001_pos.ksh new file mode 100644 index 0000000000..6f404ce128 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_001_pos.ksh @@ -0,0 +1,65 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Exported pools should no longer be visible from 'zpool list'. +# Therefore, we export an existing pool and verify it cannot +# be accessed. +# +# STRATEGY: +# 1. Unmount the test directory. +# 2. Export the pool. +# 3. Verify the pool is no longer present in the list output. +# + +verify_runnable "global" + +function cleanup +{ + typeset dir=$(get_device_dir $DISKS) + + datasetexists "$TESTPOOL/$TESTFS" || \ + log_must $ZPOOL import -d $dir $TESTPOOL + + ismounted "$TESTPOOL/$TESTFS" + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS +} + +log_onexit cleanup + +log_assert "Verify a pool can be exported." + +log_must $ZFS umount $TESTDIR +log_must $ZPOOL export $TESTPOOL + +poolexists $TESTPOOL && \ + log_fail "$TESTPOOL unexpectedly found in 'zpool list' output." + +log_pass "Successfully exported a ZPOOL." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_002_pos.ksh new file mode 100644 index 0000000000..ee1895eaa4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_002_pos.ksh @@ -0,0 +1,76 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# The 'zpool export' command must fail when a pool is +# busy i.e. mounted. +# +# STRATEGY: +# 1. Try and export the default pool when mounted and busy. +# 2. Verify an error is returned. +# + +verify_runnable "global" + +function cleanup +{ + typeset dir=$(get_device_dir $DISKS) + cd $olddir || \ + log_fail "Couldn't cd back to $olddir" + + datasetexists "$TESTPOOL/$TESTFS" || \ + log_must $ZPOOL import -d $dir $TESTPOOL + + ismounted "$TESTPOOL/$TESTFS" + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS + + [[ -e $TESTDIR/$TESTFILE0 ]] && \ + log_must $RM -rf $TESTDIR/$TESTFILE0 +} + +olddir=$PWD + +log_onexit cleanup + +log_assert "Verify a busy ZPOOL cannot be exported." + +ismounted "$TESTPOOL/$TESTFS" +(( $? != 0 )) && \ + log_fail "$TESTDIR not mounted. Unable to continue." + +cd $TESTDIR || \ + log_fail "Couldn't cd to $TESTDIR" + +log_mustnot $ZPOOL export $TESTPOOL + +poolexists $TESTPOOL || \ + log_fail "$TESTPOOL not found in 'zpool list' output." + +log_pass "Unable to export a busy ZPOOL as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_003_neg.ksh new file mode 100644 index 0000000000..c3d6c632ac --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_003_neg.ksh @@ -0,0 +1,64 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# 'zpool export' should return an error with badly formed parameters, +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute 'zpool export' +# 3. Verify an error is returned. +# + +verify_runnable "global" + +function cleanup +{ + typeset dir=$(get_device_dir $DISKS) + datasetexists "$TESTPOOL/$TESTFS" || \ + log_must $ZPOOL import -d $dir $TESTPOOL + + ismounted "$TESTPOOL/$TESTFS" + (( $? != 0 )) && \ + log_must $ZFS mount $TESTPOOL/$TESTFS +} + +log_onexit cleanup + +set -A args "" "-f" "-? $TESTPOOL" "-QWERTYUIO $TESTPOOL" + +log_assert "'zpool export' should return an error with badly-formed parameters." + +typeset -i i=0 +while (( $i < ${#args[*]} )); do + log_mustnot $ZPOOL export ${args[i]} + ((i = i + 1)) +done + +log_pass "'zpool export' badly formed parameters fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_004_pos.ksh new file mode 100644 index 0000000000..91f2968817 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_export/zpool_export_004_pos.ksh @@ -0,0 +1,95 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify zpool export succeed or fail with spare. +# +# STRATEGY: +# 1. Create two mirror pools with same spare. +# 2. Verify zpool export one pool succeed. +# 3. Import the pool. +# 4. Replace one device with the spare and detach it in one pool. +# 5. Verify zpool export the pool succeed. +# 6. Import the pool. +# 7. Replace one device with the spare in one pool. +# 8. Verify zpool export the pool fail. +# 9. Verify zpool export the pool with "-f" succeed. +# 10. Import the pool. +# + +verify_runnable "global" + +function cleanup +{ + mntpnt=$(get_prop mountpoint $TESTPOOL) + datasetexists $TESTPOOL1 || log_must $ZPOOL import -d $mntpnt $TESTPOOL1 + datasetexists $TESTPOOL1 && destroy_pool $TESTPOOL1 + datasetexists $TESTPOOL2 && destroy_pool $TESTPOOL2 + typeset -i i=0 + while ((i < 5)); do + if [[ -e $mntpnt/vdev$i ]]; then + log_must $RM -f $mntpnt/vdev$i + fi + ((i += 1)) + done +} + + +log_assert "Verify zpool export succeed or fail with spare." +log_onexit cleanup + +mntpnt=$(get_prop mountpoint $TESTPOOL) + +typeset -i i=0 +while ((i < 5)); do + log_must $MKFILE 64M $mntpnt/vdev$i + eval vdev$i=$mntpnt/vdev$i + ((i += 1)) +done + +log_must $ZPOOL create $TESTPOOL1 mirror $vdev0 $vdev1 spare $vdev4 +log_must $ZPOOL create $TESTPOOL2 mirror $vdev2 $vdev3 spare $vdev4 + +log_must $ZPOOL export $TESTPOOL1 +log_must $ZPOOL import -d $mntpnt $TESTPOOL1 + +log_must $ZPOOL replace $TESTPOOL1 $vdev0 $vdev4 +log_must $ZPOOL detach $TESTPOOL1 $vdev4 +log_must $ZPOOL export $TESTPOOL1 +log_must $ZPOOL import -d $mntpnt $TESTPOOL1 + +log_must $ZPOOL replace $TESTPOOL1 $vdev0 $vdev4 +log_mustnot $ZPOOL export $TESTPOOL1 + +log_must $ZPOOL export -f $TESTPOOL1 +log_must $ZPOOL import -d $mntpnt $TESTPOOL1 + +log_pass "Verify zpool export succeed or fail with spare." + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/Makefile new file mode 100644 index 0000000000..52c68f4907 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/Makefile @@ -0,0 +1,46 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_get + +PROGS = cleanup \ + setup \ + zpool_get_001_pos \ + zpool_get_002_pos \ + zpool_get_003_pos \ + zpool_get_004_neg + +FILES = zpool_get.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/cleanup.ksh new file mode 100644 index 0000000000..c0bfa4c59f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/cleanup.ksh @@ -0,0 +1,36 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "both" + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/setup.ksh new file mode 100644 index 0000000000..da41015c2a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/setup.ksh @@ -0,0 +1,37 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +verify_runnable "both" + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get.cfg new file mode 100644 index 0000000000..72dd0904ef --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get.cfg @@ -0,0 +1,35 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +# Set the expected properties of zpool +typeset -a properties=("size" "capacity" "altroot" "health" "guid" "version" + "bootfs" "delegation" "autoreplace" "cachefile" "dedupditto" "dedupratio" + "free" "allocated" "readonly" "comment" "expandsize" "freeing" "failmode" + "listsnapshots" "autoexpand" "feature@async_destroy" "feature@empty_bpobj") diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_001_pos.ksh new file mode 100644 index 0000000000..f1f300ce3f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_001_pos.ksh @@ -0,0 +1,57 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# Zpool get usage message is displayed when called with no arguments +# +# STRATEGY: +# 1. Run zpool get +# 2. Check that exit status is set to 2 +# 3. Check usage message contains text "usage" +# + +log_assert "Zpool get usage message is displayed when called with no arguments." + +$ZPOOL get > /dev/null 2>&1 +RET=$? +if [ $RET != 2 ] +then + log_fail "\"zpool get\" exit status $RET should be equal to 2." +fi + +OUTPUT=$($ZPOOL get 2>&1 | $GREP -i usage) +RET=$? +if [ $RET != 0 ] +then + log_fail "Usage message for zpool get did not contain the word 'usage'." +fi + +log_pass "Zpool get usage message is displayed when called with no arguments." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos.ksh new file mode 100644 index 0000000000..4c8d0393ca --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_002_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_get/zpool_get.cfg + +# +# DESCRIPTION: +# +# zpool get all works as expected +# +# STRATEGY: +# +# 1. Using zpool get, retrieve all default values +# 2. Verify that the header is printed +# 3. Verify that we can see all the properties we expect to see +# 4. Verify that the total output contains just those properties + header. +# +# Test for those properties are expected to check whether their +# default values are sane, or whether they can be changed with zpool set. +# + +log_assert "Zpool get all works as expected" + +typeset -i i=0; + +if ! is_global_zone ; then + TESTPOOL=${TESTPOOL%%/*} +fi + +log_must $ZPOOL get all $TESTPOOL +$ZPOOL get all $TESTPOOL > /tmp/values.$$ + +log_note "Checking zpool get all output for a header." +$GREP ^"NAME " /tmp/values.$$ > /dev/null 2>&1 +if [ $? -ne 0 ] +then + log_fail "The header was not printed from zpool get all" +fi + + +while [ $i -lt "${#properties[@]}" ] +do + log_note "Checking for ${properties[$i]} property" + $GREP "$TESTPOOL *${properties[$i]}" /tmp/values.$$ > /dev/null 2>&1 + if [ $? -ne 0 ] + then + log_fail "zpool property ${properties[$i]} was not found\ + in pool output." + fi + i=$(( $i + 1 )) +done + +# increment the counter to include the header line +i=$(( $i + 1 )) + +COUNT=$($WC /tmp/values.$$ | $AWK '{print $1}') +if [ $i -ne $COUNT ] +then + log_fail "Length of output $COUNT was not equal to number of props + 1." +fi + + + +$RM /tmp/values.$$ +log_pass "Zpool get all works as expected" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_003_pos.ksh new file mode 100644 index 0000000000..d9cde6f7c2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_003_pos.ksh @@ -0,0 +1,67 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_get/zpool_get.cfg + +# +# DESCRIPTION: +# +# Zpool get returns values for all known properties +# +# STRATEGY: +# 1. For all properties, verify zpool get retrieves a value +# + +log_assert "Zpool get returns values for all known properties" + +if ! is_global_zone ; then + TESTPOOL=${TESTPOOL%%/*} +fi + +typeset -i i=0; + +while [ $i -lt "${#properties[@]}" ] +do + log_note "Checking for ${properties[$i]} property" + log_must eval "$ZPOOL get ${properties[$i]} $TESTPOOL > /tmp/value.$$" + $GREP "${properties[$i]}" /tmp/value.$$ > /dev/null 2>&1 + if [ $? -ne 0 ] + then + log_fail "${properties[$i]} not seen in output" + fi + $GREP "^NAME " /tmp/value.$$ > /dev/null 2>&1 + # only need to check this once. + if [ $i -eq 0 ] && [ $? -ne 0 ] + then + log_fail "Header not seen in zpool get output" + fi + i=$(( $i + 1 )) +done + +$RM /tmp/value.$$ +log_pass "Zpool get returns values for all known properties" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_004_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_004_neg.ksh new file mode 100644 index 0000000000..d688c8dd98 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_get/zpool_get_004_neg.ksh @@ -0,0 +1,57 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# Malformed zpool get commands are rejected +# +# STRATEGY: +# +# 1. Run several different "zpool get" commands that should fail. +# + +log_assert "Malformed zpool get commands are rejected" + +if ! is_global_zone ; then + TESTPOOL=${TESTPOOL%%/*} +fi + +set -A arguments "$TESTPOOL $TESTPOOL" "$TESTPOOL rubbish" "-v $TESTPOOL" \ + "nosuchproperty $TESTPOOL" "--$TESTPOOL" "all all" \ + "type $TESTPOOL" "usage: $TESTPOOL" "bootfs $TESTPOOL@" \ + "bootfs,bootfs $TESTPOOL" "name $TESTPOOL" "t%d%s" \ + "bootfs,delegation $TESTPOOL" "delegation $TESTPOOL@" + +for arg in $arguments +do + log_mustnot $ZPOOL get $arg +done + +log_pass "Malformed zpool get commands are rejected" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/Makefile new file mode 100644 index 0000000000..8248da43db --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/Makefile @@ -0,0 +1,42 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_history + +PROGS = cleanup \ + setup \ + zpool_history_001_neg \ + zpool_history_002_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/cleanup.ksh new file mode 100644 index 0000000000..efa1ecce15 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/cleanup.ksh @@ -0,0 +1,34 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/setup.ksh new file mode 100644 index 0000000000..ff6793d801 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} +default_container_volume_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_001_neg.ksh new file mode 100644 index 0000000000..a722fe7cad --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_001_neg.ksh @@ -0,0 +1,65 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify 'zpool history' can deal with non-existent pools and garbage +# to the command. +# +# STRATEGY: +# 1. Create pool, volume & snap +# 2. Verify 'zpool history' can cope with incorret arguments. +# + +verify_runnable "global" + +snap=$TESTPOOL/$TESTFS@snap +clone=$TESTPOOL/clone + +set -A neg_opt "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTVOL" "-t $TESTPOOL" \ + "-v $TESTPOOL" "$snap" "$clone" "nonexist" "TESTPOOL" + +function cleanup +{ + datasetexists $clone && log_must $ZFS destroy $clone + datasetexists $snap && log_must $ZFS destroy $snap +} + +log_assert "Verify 'zpool history' can deal with non-existent pools and " \ + "garbage to the command." +log_onexit cleanup + +log_must $ZFS snapshot $snap +log_must $ZFS clone $snap $clone + +for opt in "${neg_opt[@]}"; do + log_mustnot eval "$ZPOOL history $opt > /dev/null" +done + +log_pass "'zpool history' command line negation test passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_002_pos.ksh new file mode 100644 index 0000000000..bd5bf19034 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_history/zpool_history_002_pos.ksh @@ -0,0 +1,53 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify zpool history can handle options [-il] correctly. +# +# STRATEGY: +# 1. Create varied combinations of option -i & -l. +# 2. Verify 'zpool history' can cope with these combination correctly. +# + +verify_runnable "global" + +log_assert "Verify zpool history can handle options [-il] correctly." + +options="-i -l -il -li -lil -ili -lli -iill -liil" + +for opt in $options; do + log_must eval "$ZPOOL history $opt $TESTPOOL > /dev/null 2>&1" +done + +log_pass "Verify zpool history can handle options [-il] passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/Makefile new file mode 100644 index 0000000000..afd7be9a5a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/Makefile @@ -0,0 +1,67 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_import + +PROGS = cleanup \ + setup \ + zpool_import_001_pos \ + zpool_import_002_pos \ + zpool_import_003_pos \ + zpool_import_004_pos \ + zpool_import_005_pos \ + zpool_import_006_pos \ + zpool_import_007_pos \ + zpool_import_008_pos \ + zpool_import_009_neg \ + zpool_import_010_pos \ + zpool_import_011_neg \ + zpool_import_012_pos \ + zpool_import_013_neg \ + zpool_import_all_001_pos \ + zpool_import_features_001_pos \ + zpool_import_features_002_neg \ + zpool_import_features_003_pos \ + zpool_import_missing_001_pos \ + zpool_import_missing_002_pos \ + zpool_import_missing_003_pos \ + zpool_import_rename_001_pos + +FILES = zpool_import.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) + +SUBDIRS = blockfiles + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/Makefile new file mode 100644 index 0000000000..da96980c29 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/Makefile @@ -0,0 +1,36 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +BLOCKFILESDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_import/blockfiles + +FILES = unclean_export.dat.bz2 + +CMDS = $(FILES:%=$(BLOCKFILESDIR)/%) +$(CMDS) := FILEMODE = 0444 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(BLOCKFILESDIR) + +$(BLOCKFILESDIR): + $(INS.dir) + +$(BLOCKFILESDIR)/%: % + $(INS.file) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/README b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/README new file mode 100644 index 0000000000..e7f7c2e445 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/README @@ -0,0 +1,29 @@ +# +# 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 (c) 2012 by Delphix. All rights reserved. +# + +Unless otherwise noted, all files in this distribution are released +under the Common Development and Distribution License (CDDL). + +This directory contains compressed blockfiles for zpool import testing. diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/unclean_export.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/unclean_export.dat.bz2 Binary files differnew file mode 100644 index 0000000000..a7e042b523 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/blockfiles/unclean_export.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/cleanup.ksh new file mode 100644 index 0000000000..8e28f23da7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/cleanup.ksh @@ -0,0 +1,63 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +verify_runnable "global" + +for pool in "$TESTPOOL" "$TESTPOOL1"; do + datasetexists $pool/$TESTFS && \ + log_must $ZFS destroy -Rf $pool/$TESTFS + destroy_pool "$pool" +done + +ismounted $DEVICE_DIR ufs +(( $? == 0 )) && log_must $UMOUNT -f $DEVICE_DIR + +for dir in "$TESTDIR" "$TESTDIR1" "$DEVICE_DIR" ; do + [[ -d $dir ]] && \ + log_must $RM -rf $dir +done + +# recreate and destroy a zpool over the disks to restore the partitions to +# normal +case $DISK_COUNT in +0|1) + log_note "No disk devices to restore" + ;; +*) + log_must cleanup_devices $ZFS_DISK1 + log_must cleanup_devices $ZFS_DISK2 + ;; +esac + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/setup.ksh new file mode 100644 index 0000000000..d59cfc3886 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/setup.ksh @@ -0,0 +1,80 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +verify_runnable "global" +verify_disk_count "$DISKS" 2 + +DISK=${DISKS%% *} + +for dev in $ZFS_DISK1 $ZFS_DISK2 ; do + log_must cleanup_devices $dev +done + +typeset -i i=0 +while (( i <= $GROUP_NUM )); do + if (( i == 2 )); then + (( i = i + 1 )) + continue + fi + log_must set_partition $i "$cyl" $SLICE_SIZE $ZFS_DISK1 + cyl=$(get_endslice $ZFS_DISK1 $i) + (( i = i + 1 )) +done + +create_pool "$TESTPOOL" "$ZFSSIDE_DISK1" + +if [[ -d $TESTDIR ]]; then + $RM -rf $TESTDIR || log_unresolved Could not remove $TESTDIR + $MKDIR -p $TESTDIR || log_unresolved Could not create $TESTDIR +fi + +log_must $ZFS create $TESTPOOL/$TESTFS +log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + +$ECHO "y" | $NEWFS -v /dev/rdsk/$ZFSSIDE_DISK2 >/dev/null 2>&1 +(( $? != 0 )) && + log_untested "Unable to setup a UFS file system" + +[[ ! -d $DEVICE_DIR ]] && \ + log_must $MKDIR -p $DEVICE_DIR + +log_must $MOUNT /dev/dsk/$ZFSSIDE_DISK2 $DEVICE_DIR + +i=0 +while (( i < $MAX_NUM )); do + log_must $MKFILE $FILE_SIZE ${DEVICE_DIR}/${DEVICE_FILE}$i + (( i = i + 1 )) +done + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg new file mode 100644 index 0000000000..baa67d05d1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg @@ -0,0 +1,85 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +typeset -a disk_array=($(find_disks $DISKS)) +case "${#disk_array[*]}" in +0) + # + # on stf_configure, disk_freelist returns empty. + # + DISK_COUNT=0 + ;; +1) + # We need to repartition the single disk to two slices. + DISK_COUNT=1 + ZFS_DISK1=${disk_array[0]} + ZFSSIDE_DISK1=${ZFS_DISK1}s0 + ZFS_DISK2=${disk_array[0]} + ZFSSIDE_DISK2=${ZFS_DISK2}s1 + ;; +*) + # We need to repartition the single disk to two slices. + DISK_COUNT=2 + ZFS_DISK1=${disk_array[0]} + ZFSSIDE_DISK1=${ZFS_DISK1}s0 + ZFS_DISK2=${disk_array[1]} + ZFSSIDE_DISK2=${ZFS_DISK2}s0 + ;; +esac + +export DISK_COUNT ZFS_DISK1 ZFSSIDE_DISK1 ZFS_DISK2 ZFSSIDE_DISK2 + +export FS_SIZE=2gb +export FILE_SIZE=64m +export SLICE_SIZE=128m +export MAX_NUM=5 +export GROUP_NUM=3 +export DEVICE_DIR=/dev_import-test +export BACKUP_DEVICE_DIR=/bakdev_import-test +export DEVICE_FILE=disk +export DEVICE_ARCHIVE=archive_import-test +export MYTESTFILE=$STF_SUITE/include/libtest.shlib + +typeset -i num=0 +while (( num < $GROUP_NUM )); do + DEVICE_FILES="$DEVICE_FILES ${DEVICE_DIR}/${DEVICE_FILE}$num" + (( num = num + 1 )) +done +export DEVICE_FILES + +export VDEV0=$DEVICE_DIR/${DEVICE_FILE}0 +export VDEV1=$DEVICE_DIR/${DEVICE_FILE}1 +export VDEV2=$DEVICE_DIR/${DEVICE_FILE}2 +export VDEV3=$DEVICE_DIR/${DEVICE_FILE}3 +export VDEV4=$DEVICE_DIR/${DEVICE_FILE}4 + +export ALTER_ROOT=/alter_import-test diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_001_pos.ksh new file mode 100644 index 0000000000..3562b045b5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_001_pos.ksh @@ -0,0 +1,138 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Once a pool has been exported, it should be recreated after a +# successful import. Verify that is true. +# +# STRATEGY: +# 1. Populate the default test directory and unmount it. +# 2. Export the default test pool. +# 3. Import it using the various combinations. +# - Regular import +# - Alternate Root Specified +# Try to import it by name or guid randomly. +# 4. Verify it shows up under 'zpool list'. +# 5. Verify it can be mounted again and contains a file. +# + +verify_runnable "global" + +set -A pools "$TESTPOOL" "$TESTPOOL1" +set -A devs "" "-d $DEVICE_DIR" +set -A options "" "-R $ALTER_ROOT" +set -A mtpts "$TESTDIR" "$TESTDIR1" + + +function cleanup +{ + typeset -i i=0 + + while (( i < ${#pools[*]} )); do + poolexists ${pools[i]} && \ + log_must $ZPOOL export ${pools[i]} + + datasetexists "${pools[i]}/$TESTFS" || \ + log_must $ZPOOL import ${devs[i]} ${pools[i]} + + ismounted "${pools[i]}/$TESTFS" || \ + log_must $ZFS mount ${pools[i]}/$TESTFS + + [[ -e ${mtpts[i]}/$TESTFILE0 ]] && \ + log_must $RM -rf ${mtpts[i]}/$TESTFILE0 + + ((i = i + 1)) + done + + cleanup_filesystem $TESTPOOL1 $TESTFS + + destroy_pool $TESTPOOL1 + + [[ -d $ALTER_ROOT ]] && \ + log_must $RM -rf $ALTER_ROOT +} + +log_onexit cleanup + +log_assert "Verify that an exported pool can be imported." + +setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +typeset -i i=0 +typeset -i j=0 +typeset basedir + +while (( i < ${#pools[*]} )); do + guid=$(get_config ${pools[i]} pool_guid) + log_must $CP $MYTESTFILE ${mtpts[i]}/$TESTFILE0 + + log_must $ZFS umount ${mtpts[i]} + + j=0 + while (( j < ${#options[*]} )); do + log_must $ZPOOL export ${pools[i]} + + typeset target=${pools[i]} + if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." + fi + log_must $ZPOOL import ${devs[i]} ${options[j]} $target + + log_must poolexists ${pools[i]} + + log_must ismounted ${pools[i]}/$TESTFS + + basedir=${mtpts[i]} + [[ -n ${options[j]} ]] && \ + basedir=$ALTER_ROOT/${mtpts[i]} + + [[ ! -e $basedir/$TESTFILE0 ]] && \ + log_fail "$basedir/$TESTFILE0 missing after import." + + checksum2=$($SUM $basedir/$TESTFILE0 | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "Successfully imported a ZPOOL" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_002_pos.ksh new file mode 100644 index 0000000000..73f24a4a6a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_002_pos.ksh @@ -0,0 +1,142 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Verify that an exported pool cannot be imported +# more than once. +# +# STRATEGY: +# 1. Populate the default test directory and unmount it. +# 2. Export the default test pool. +# 3. Import it using the various combinations. +# - Regular import +# - Alternate Root Specified +# 4. Verify it shows up under 'zpool list'. +# 5. Verify it contains a file. +# 6. Attempt to import it for a second time. Verify this fails. +# + +verify_runnable "global" + +set -A pools "$TESTPOOL" "$TESTPOOL1" +set -A devs "" "-d $DEVICE_DIR" +set -A options "" "-R $ALTER_ROOT" +set -A mtpts "$TESTDIR" "$TESTDIR1" + + +function cleanup +{ + typeset -i i=0 + while (( i < ${#pools[*]} )); do + poolexists ${pools[i]} && \ + log_must $ZPOOL export ${pools[i]} + + datasetexists "${pools[i]}/$TESTFS" || \ + log_must $ZPOOL import ${devs[i]} ${pools[i]} + + ismounted "${pools[i]}/$TESTFS" || \ + log_must $ZFS mount ${pools[i]}/$TESTFS + + [[ -e ${mtpts[i]}/$TESTFILE0 ]] && \ + log_must $RM -rf ${mtpts[i]}/$TESTFILE0 + + ((i = i + 1)) + done + + cleanup_filesystem $TESTPOOL1 $TESTFS + + destroy_pool $TESTPOOL1 + + [[ -d $ALTER_ROOT ]] && \ + log_must $RM -rf $ALTER_ROOT +} + +log_onexit cleanup + +log_assert "Verify that an exported pool cannot be imported more than once." + +setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +typeset -i i=0 +typeset -i j=0 +typeset basedir + +while (( i < ${#pools[*]} )); do + guid=$(get_config ${pools[i]} pool_guid) + + log_must $CP $MYTESTFILE ${mtpts[i]}/$TESTFILE0 + + log_must $ZFS umount ${mtpts[i]} + + j=0 + while (( j < ${#options[*]} )); do + log_must $ZPOOL export ${pools[i]} + + typeset target=${pools[i]} + if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." + fi + + log_must $ZPOOL import ${devs[i]} ${options[j]} $target + + log_must poolexists ${pools[i]} + + log_must ismounted ${pools[i]}/$TESTFS + + basedir=${mtpts[i]} + [[ -n ${options[j]} ]] && \ + basedir=$ALTER_ROOT/${mtpts[i]} + + [[ ! -e $basedir/$TESTFILE0 ]] && \ + log_fail "$basedir/$TESTFILE0 missing after import." + + checksum2=$($SUM $basedir/$TESTFILE0 | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + log_mustnot $ZPOOL import ${devs[i]} $target + + ((j = j + 1)) + done + + ((i = i + 1)) + +done + +log_pass "Unable to import the same pool twice as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_003_pos.ksh new file mode 100644 index 0000000000..26ed492095 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_003_pos.ksh @@ -0,0 +1,67 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Destroyed pools are not listed unless with -D option is specified. +# +# STRATEGY: +# 1. Create test pool A. +# 2. Destroy pool A. +# 3. Verify only 'import -D' can list pool A. +# + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + log_must $RM $VDEV0 $VDEV1 + log_must $MKFILE $FILE_SIZE $VDEV0 $VDEV1 +} + +log_assert "Destroyed pools are not listed unless with -D option is specified." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 +log_must $ZPOOL destroy $TESTPOOL1 + +# +# 'pool:' is the keywords of 'zpool import -D' output. +# +log_mustnot eval "$ZPOOL import -d $DEVICE_DIR | $GREP pool:" +log_must eval "$ZPOOL import -d $DEVICE_DIR -D | $GREP pool:" + +log_pass "Destroyed pool only can be listed with -D option." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_004_pos.ksh new file mode 100644 index 0000000000..f584200628 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_004_pos.ksh @@ -0,0 +1,88 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Destroyed pools devices was moved to another directory, it still can be +# imported correctly. +# +# STRATEGY: +# 1. Create test pool A with several devices. +# 2. Destroy pool A. +# 3. Move devices to another directory. +# 4. Verify 'zpool import -D' succeed. +# + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must $MKFILE $FILE_SIZE ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "Destroyed pools devices was moved to another directory," \ + "it still can be imported correctly." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 $VDEV2 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +typeset target=$TESTPOOL1 +if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." +fi +log_must $ZPOOL destroy $TESTPOOL1 + +log_note "Devices was moved to different directories." +log_must $MKDIR $DEVICE_DIR/newdir1 $DEVICE_DIR/newdir2 +log_must $MV $VDEV1 $DEVICE_DIR/newdir1 +log_must $MV $VDEV2 $DEVICE_DIR/newdir2 +log_must $ZPOOL import -d $DEVICE_DIR/newdir1 -d $DEVICE_DIR/newdir2 \ + -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy -f $TESTPOOL1 + +log_note "Devices was moved to same directory." +log_must $MV $VDEV0 $DEVICE_DIR/newdir2 +log_must $MV $DEVICE_DIR/newdir1/* $DEVICE_DIR/newdir2 +log_must $ZPOOL import -d $DEVICE_DIR/newdir2 -D -f $target +log_must $ZPOOL destroy -f $TESTPOOL1 + +log_pass "Destroyed pools devices was moved, 'zpool import -D' passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_005_pos.ksh new file mode 100644 index 0000000000..12bd14d33c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_005_pos.ksh @@ -0,0 +1,85 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Destroyed pools devices was renamed, it still can be imported correctly. +# +# STRATEGY: +# 1. Create test pool A with several devices. +# 2. Destroy pool A and rename devices name. +# 3. Verify 'zpool import -D' succeed. +# + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must $MKFILE $FILE_SIZE ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "Destroyed pools devices was renamed, it still can be imported " \ + "correctly." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 $VDEV2 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +typeset target=$TESTPOOL1 +if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." +fi +log_must $ZPOOL destroy $TESTPOOL1 + +log_note "Part of devices was renamed in the same directory." +log_must $MV $VDEV0 $DEVICE_DIR/vdev0-new +log_must $ZPOOL import -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy -f $TESTPOOL1 + +log_note "All of devices was rename to different directories." +log_must $MKDIR $DEVICE_DIR/newdir1 $DEVICE_DIR/newdir2 +log_must $MV $VDEV1 $DEVICE_DIR/newdir1/vdev1-new +log_must $MV $VDEV2 $DEVICE_DIR/newdir2/vdev2-new +log_must $ZPOOL import -d $DEVICE_DIR/newdir1 -d $DEVICE_DIR/newdir2 \ + -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy -f $TESTPOOL1 + +log_pass "Destroyed pools devices was renamed, 'zpool import -D' passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_006_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_006_pos.ksh new file mode 100644 index 0000000000..b35e3ccff6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_006_pos.ksh @@ -0,0 +1,83 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# For mirror, N-1 destroyed pools devices was removed or used by other +# pool, it still can be imported correctly. +# +# STRATEGY: +# 1. Create mirror with N disks. +# 2. Destroy this mirror. +# 3. Create another pool with N-1 disks which was used by this mirror. +# 4. Verify import mirror can succeed. +# + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL2 + destroy_pool $TESTPOOL1 + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must $MKFILE $FILE_SIZE ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "For mirror, N-1 destroyed pools devices was removed or used " \ + "by other pool, it still can be imported correctly." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 mirror $VDEV0 $VDEV1 $VDEV2 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +typeset target=$TESTPOOL1 +if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." +fi +log_must $ZPOOL destroy $TESTPOOL1 + +log_must $ZPOOL create $TESTPOOL2 $VDEV0 $VDEV2 +log_must $ZPOOL import -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy $TESTPOOL1 + +log_must $ZPOOL destroy $TESTPOOL2 +log_must $RM -rf $VDEV2 +log_must $ZPOOL import -d $DEVICE_DIR -D -f $target + +log_pass "zpool import -D mirror passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_007_pos.ksh new file mode 100644 index 0000000000..ec7a8672d3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_007_pos.ksh @@ -0,0 +1,90 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# For raidz, one destroyed pools devices was removed or used by other +# pool, it still can be imported correctly. +# +# STRATEGY: +# 1. Create a raidz pool A with N disks. +# 2. Destroy this pool A. +# 3. Create another pool B with 1 disk which was used by pool A. +# 4. Verify import this raidz pool can succeed. +# + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL2 + destroy_pool $TESTPOOL1 + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must $MKFILE $FILE_SIZE ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "For raidz, one destroyed pools devices was removed or used by " \ + "other pool, it still can be imported correctly." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 raidz $VDEV0 $VDEV1 $VDEV2 $VDIV3 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +typeset target=$TESTPOOL1 +if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." +fi +log_must $ZPOOL destroy $TESTPOOL1 + +log_must $ZPOOL create $TESTPOOL2 $VDEV0 +log_must $ZPOOL import -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy $TESTPOOL1 + +log_must $ZPOOL destroy $TESTPOOL2 +log_must $RM -rf $VDEV0 +log_must $ZPOOL import -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy $TESTPOOL1 + +log_note "For raidz, two destroyed pool's devices were used, import failed." +log_must $MKFILE $FILE_SIZE $VDEV0 +log_must $ZPOOL create $TESTPOOL2 $VDEV0 $VDEV1 +log_mustnot $ZPOOL import -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy $TESTPOOL2 + +log_pass "zpool import -D raidz passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_008_pos.ksh new file mode 100644 index 0000000000..45d76b369b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_008_pos.ksh @@ -0,0 +1,91 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# For raidz2, two destroyed pool's devices were removed or used by other +# pool, it still can be imported correctly. +# +# STRATEGY: +# 1. Create a raidz2 pool A with N disks. +# 2. Destroy this pool A. +# 3. Create another pool B with two disks which were used by pool A. +# 4. Verify import this raidz2 pool can succeed. +# + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL2 + destroy_pool $TESTPOOL1 + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must $MKFILE $FILE_SIZE ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "For raidz2, two destroyed pools devices was removed or used by " \ + "other pool, it still can be imported correctly." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 raidz2 $VDEV0 $VDEV1 $VDEV2 $VDIV3 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +typeset target=$TESTPOOL1 +if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." +fi +log_must $ZPOOL destroy $TESTPOOL1 + +log_must $ZPOOL create $TESTPOOL2 $VDEV0 $VDEV1 +log_must $ZPOOL import -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy $TESTPOOL1 + +log_must $ZPOOL destroy $TESTPOOL2 +log_must $RM -rf $VDEV0 $VDEV1 +log_must $ZPOOL import -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy $TESTPOOL1 + +log_note "For raidz2, more than two destroyed pool's devices were used, " \ + "import failed." +log_must $MKFILE $FILE_SIZE $VDEV0 $VDEV1 +log_must $ZPOOL create $TESTPOOL2 $VDEV0 $VDEV1 $VDEV2 +log_mustnot $ZPOOL import -d $DEVICE_DIR -D -f $target +log_must $ZPOOL destroy $TESTPOOL2 + +log_pass "zpool import -D raidz2 passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_009_neg.ksh new file mode 100644 index 0000000000..a572ba00a6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_009_neg.ksh @@ -0,0 +1,103 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# DESCRIPTION: +# Try each 'zpool import' with inapplicable scenarios to make sure +# it returns an error. include: +# * A non-existent pool name is given +# * '-d', but no device directory specified +# * '-R', but no alter root directory specified +# * '-a', but a pool name specified either +# * more than 2 pool names is given +# * The new pool name specified already exists +# * Contain invalid characters not allowed in the ZFS namespace +# +# STRATEGY: +# 1. Create an array of parameters +# 2. For each parameter in the array, execute the sub-command +# 3. Verify an error is returned. +# + +verify_runnable "global" + +set -A args "blah" "-d" "-R" "-a $TESTPOOL" \ + "$TESTPOOL ${TESTPOOL}-new ${TESTPOOL}-new" \ + "$TESTPOOL $TESTPOOL1" \ + "$TESTPOOL ${TESTPOOL1}*" "$TESTPOOL ${TESTPOOL1}?" + +set -A pools "$TESTPOOL" "$TESTPOOL1" +set -A devs "" "-d $DEVICE_DIR" + +function cleanup +{ + typeset -i i=0 + typeset -i j=0 + + while (( i < ${#pools[*]} )); do + + poolexists ${pools[i]} && \ + log_must $ZPOOL export ${pools[i]} + + datasetexists "${pools[i]}/$TESTFS" || \ + log_must $ZPOOL import ${devs[i]} ${pools[i]} + + ismounted "${pools[i]}/$TESTFS" || \ + log_must $ZFS mount ${pools[i]}/$TESTFS + + ((i = i + 1)) + done + + cleanup_filesystem $TESTPOOL1 $TESTFS + + destroy_pool $TESTPOOL1 +} + +log_onexit cleanup + +log_assert "Badly-formed 'zpool import' with inapplicable scenarios " \ + "should return an error." + +setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 + +log_must $ZPOOL export $TESTPOOL + +typeset -i i=0 +while (( i < ${#args[*]} )); do + log_mustnot $ZPOOL import ${args[i]} + ((i = i + 1)) +done + +log_pass "Badly formed 'zpool import' with inapplicable scenarios " \ + "fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_010_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_010_pos.ksh new file mode 100644 index 0000000000..23d7f916f3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_010_pos.ksh @@ -0,0 +1,92 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# 'zpool -D -a' can import all the specified directories destroyed pools. +# +# STRATEGY: +# 1. Create a 5 ways mirror pool A with dev0/1/2/3/4, then destroy it. +# 2. Create a stripe pool B with dev1. Then destroy it. +# 3. Create a raidz2 pool C with dev2/3/4. Then destroy it. +# 4. Create a raidz pool D with dev3/4. Then destroy it. +# 5. Create a stripe pool E with dev4. Then destroy it. +# 6. Verify 'zpool import -D -a' recover all the pools. +# + +verify_runnable "global" + +function cleanup +{ + typeset dt + for dt in $poolE $poolD $poolC $poolB $poolA; do + destroy_pool $dt + done + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must $MKFILE $FILE_SIZE ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_assert "'zpool -D -a' can import all the specified directories " \ + "destroyed pools." +log_onexit cleanup + +poolA=poolA.$$; poolB=poolB.$$; poolC=poolC.$$; poolD=poolD.$$; poolE=poolE.$$ + +log_must $ZPOOL create $poolA mirror $VDEV0 $VDEV1 $VDEV2 $VDEV3 $VDEV4 +log_must $ZPOOL destroy $poolA + +log_must $ZPOOL create $poolB $VDEV1 +log_must $ZPOOL destroy $poolB + +log_must $ZPOOL create $poolC raidz2 $VDEV2 $VDEV3 $VDEV4 +log_must $ZPOOL destroy $poolC + +log_must $ZPOOL create $poolD raidz $VDEV3 $VDEV4 +log_must $ZPOOL destroy $poolD + +log_must $ZPOOL create $poolE $VDEV4 +log_must $ZPOOL destroy $poolE + +log_must $ZPOOL import -d $DEVICE_DIR -D -f -a + +for dt in $poolA $poolB $poolC $poolD $poolE; do + log_must datasetexists $dt +done + +log_pass "'zpool -D -a' test passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_011_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_011_neg.ksh new file mode 100644 index 0000000000..fbc6e6d27a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_011_neg.ksh @@ -0,0 +1,81 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# For strip pool, any destroyed pool devices was demaged, zpool import -D +# will failed. +# +# STRATEGY: +# 1. Create strip pool A with three devices. +# 2. Destroy this pool B. +# 3. Create pool B with one of devices in step 1. +# 4. Verify 'import -D' pool A will failed whenever pool B was destroyed +# or not. +# + +verify_runnable "global" + +function cleanup +{ + destroy_pool $TESTPOOL1 + destroy_pool $TESTPOOL2 + + # + # Recreate virtual devices to avoid destroyed pool information on files. + # + log_must $RM -rf $VDEV0 $VDEV1 $VDEV2 + log_must $MKFILE $FILE_SIZE $VDEV0 $VDEV1 $VDEV2 +} + +log_assert "For strip pool, any destroyed pool devices was demaged," \ + "zpool import -D will failed." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 $VDEV1 $VDEV2 +typeset guid=$(get_config $TESTPOOL1 pool_guid) +typeset target=$TESTPOOL1 +if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." +fi +log_must $ZPOOL destroy $TESTPOOL1 +log_must $ZPOOL create $TESTPOOL2 $VDEV2 + +log_mustnot $ZPOOL import -d $DEVICE_DIR -D -f $target + +log_must $ZPOOL destroy $TESTPOOL2 +log_mustnot $ZPOOL import -d $DEVICE_DIR -D -f $target + +log_pass "Any strip pool devices damaged, pool can't be import passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_012_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_012_pos.ksh new file mode 100644 index 0000000000..b4453b8a8c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_012_pos.ksh @@ -0,0 +1,209 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Once a pool has been exported, it should be recreated after a +# successful import, all the sub-filesystems within it should all be restored, +# include mount & share status. Verify that is true. +# +# STRATEGY: +# 1. Create the test pool and hierarchical filesystems. +# 2. Export the test pool, or destroy the test pool, +# depend on testing import [-Df]. +# 3. Import it using the various combinations. +# - Regular import +# - Alternate Root Specified +# 4. Verify the mount & share status is restored. +# + +verify_runnable "global" + +set -A pools "$TESTPOOL" "$TESTPOOL1" +set -A devs "" "-d $DEVICE_DIR" +set -A options "" "-R $ALTER_ROOT" +set -A mtpts "$TESTDIR" "$TESTDIR1" + + +function cleanup +{ + typeset -i i=0 + + while ((i < ${#pools[*]})); do + if poolexists ${pools[i]}; then + log_must $ZPOOL export ${pools[i]} + log_note "Try to import ${devs[i]} ${pools[i]}" + $ZPOOL import ${devs[i]} ${pools[i]} + else + log_note "Try to import $option ${devs[i]} ${pools[i]}" + $ZPOOL import $option ${devs[i]} ${pools[i]} + fi + + if poolexists ${pools[i]}; then + is_shared ${pools[i]} && \ + log_must $ZFS set sharenfs=off ${pools[i]} + + ismounted "${pools[i]}/$TESTFS" || \ + log_must $ZFS mount ${pools[i]}/$TESTFS + fi + + ((i = i + 1)) + done + + destroy_pool $TESTPOOL1 + + if datasetexists $TESTPOOL/$TESTFS; then + log_must $ZFS destroy -Rf $TESTPOOL/$TESTFS + fi + log_must $ZFS create $TESTPOOL/$TESTFS + log_must $ZFS set mountpoint=$TESTDIR $TESTPOOL/$TESTFS + + [[ -d $ALTER_ROOT ]] && \ + log_must $RM -rf $ALTER_ROOT +} + +log_onexit cleanup + +log_assert "Verify all mount & share status of sub-filesystems within a pool \ + can be restored after import [-Df]." + +setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 +# create a heirarchy of filesystem +for pool in ${pools[@]} ; do + log_must $ZFS create $pool/$TESTFS/$TESTCTR + log_must $ZFS create $pool/$TESTFS/$TESTCTR/$TESTCTR1 + log_must $ZFS set canmount=off $pool/$TESTFS/$TESTCTR + log_must $ZFS set canmount=off $pool/$TESTFS/$TESTCTR/$TESTCTR1 + log_must $ZFS create $pool/$TESTFS/$TESTCTR/$TESTFS1 + log_must $ZFS create $pool/$TESTFS/$TESTCTR/$TESTCTR1/$TESTFS1 + log_must $ZFS create $pool/$TESTFS/$TESTFS1 + log_must $ZFS snapshot $pool/$TESTFS/$TESTFS1@snap + log_must $ZFS clone $pool/$TESTFS/$TESTFS1@snap $pool/$TESTCLONE1 +done + +typeset mount_fs="$TESTFS $TESTFS/$TESTFS1 $TESTCLONE1 \ + $TESTFS/$TESTCTR/$TESTFS1 $TESTFS/$TESTCTR/$TESTCTR1/$TESTFS1" +typeset nomount_fs="$TESTFS/$TESTCTR $TESTFS/$TESTCTR/$TESTCTR1" + +typeset -i i=0 +typeset -i j=0 +typeset -i nfs_share_bit=0 +typeset -i guid_bit=0 +typeset basedir + +for option in "" "-Df"; do + i=0 + while ((i < ${#pools[*]})); do + pool=${pools[i]} + guid=$(get_pool_prop guid $pool) + j=0 + while ((j < ${#options[*]})); do + # set sharenfs property off/on + nfs_share_bit=0 + while ((nfs_share_bit <= 1)); do + typeset f_share="" + typeset nfs_flag="sharenfs=off" + if ((nfs_share_bit == 1)); then + log_note "Set sharenfs=on $pool" + log_must $ZFS set sharenfs=on $pool + log_must is_shared $pool + f_share="true" + nfs_flag="sharenfs=on" + fi + # for every off/on nfs bit import guid/pool_name + guid_bit=0 + while ((guid_bit <= 1)); do + typeset guid_flag="pool name" + if [[ -z $option ]]; then + log_must $ZPOOL export $pool + else + log_must $ZPOOL destroy $pool + fi + + typeset target=$pool + if ((guid_bit == 1)); then + log_note "Import by guid." + if [[ -z $guid ]]; then + log_fail "guid should "\ + "not be empty!" + else + target=$guid + guid_flag="$guid" + fi + fi + log_note "Import with $nfs_flag and " \ + "$guid_flag" + $ZPOOL import $option ${devs[i]} \ + ${options[j]} $target + #import by GUID if import by pool name fails + if [[ $? != 0 ]]; then + log_note "Possible pool name" \ + "duplicates. Try GUID import" + target=$guid + log_must $ZPOOL import $option \ + ${devs[i]} ${options[j]} \ + $target + fi + log_must poolexists $pool + + for fs in $mount_fs; do + log_must ismounted $pool/$fs + [[ -n $f_share ]] && \ + log_must is_shared $pool/$fs + done + + for fs in $nomount_fs; do + log_mustnot ismounted $pool/$fs + log_mustnot is_shared $pool/$fs + done + ((guid_bit = guid_bit + 1)) + done + # reset nfsshare=off + if [[ -n $f_share ]]; then + log_must $ZFS set sharenfs=off $pool + log_mustnot is_shared $pool + fi + ((nfs_share_bit = nfs_share_bit + 1)) + done + + ((j = j + 1)) + done + + ((i = i + 1)) + done +done + +log_pass "All mount & share status of sub-filesystems within a pool \ + can be restored after import [-Df]." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_013_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_013_neg.ksh new file mode 100644 index 0000000000..d5522142ed --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_013_neg.ksh @@ -0,0 +1,75 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# For pool may be in use from other system, +# 'zpool import' will prompt the warning and fails. +# +# STRATEGY: +# 1. Prepare rawfile that are created from other system. +# 2. Verify 'zpool import' will fail. +# 3. Verify 'zpool import -f' succeed. +# + +verify_runnable "global" + +POOL_NAME=unclean_export +POOL_FILE=unclean_export.dat + +function uncompress_pool +{ + + log_note "Creating pool from $POOL_FILE" + log_must $BZCAT \ + $STF_SUITE/tests/functional/cli_root/zpool_import/blockfiles/$POOL_FILE.bz2 \ + > /$TESTPOOL/$POOL_FILE + return 0 +} + +function cleanup +{ + poolexists $POOL_NAME && log_must $ZPOOL destroy $POOL_NAME + [[ -e /$TESTPOOL/$POOL_FILE ]] && $RM /$TESTPOOL/$POOL_FILE + return 0 +} + +log_assert "'zpool import' fails for pool that was not cleanly exported" +log_onexit cleanup + +uncompress_pool +log_mustnot $ZPOOL import -d /$TESTPOOL $POOL_NAME +log_must $ZPOOL import -d /$TESTPOOL -f $POOL_NAME + +log_pass "'zpool import' fails for pool that was not cleanly exported" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_all_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_all_001_pos.ksh new file mode 100644 index 0000000000..5264399055 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_all_001_pos.ksh @@ -0,0 +1,223 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Verify that 'zpool import -a' succeeds as root. +# +# STRATEGY: +# 1. Create a group of pools with specified vdev. +# 2. Create zfs filesystems within the given pools. +# 3. Export the pools. +# 4. Verify that import command succeed. +# + +verify_runnable "global" + +set -A options "" "-R $ALTER_ROOT" + +typeset -i number=0 +typeset -i id=0 +typeset -i i=0 +typeset checksum1 +typeset unwantedpool + +function setup_single_disk #disk #pool #fs #mtpt +{ + typeset disk=$1 + typeset pool=$2 + typeset fs=${3##/} + typeset mtpt=$4 + + setup_filesystem "$disk" "$pool" "$fs" "$mtpt" + + log_must $CP $MYTESTFILE $mtpt/$TESTFILE0 + + log_must $ZPOOL export $pool + + [[ -d $mtpt ]] && \ + $RM -rf $mtpt +} + +function cleanup_all +{ + typeset -i id=0 + + # + # Try import individually if 'import -a' failed. + # + for pool in `$ZPOOL import | $GREP "pool:" | $AWK '{print $2}'`; do + $ZPOOL import -f $pool + done + + for pool in `$ZPOOL import -d $DEVICE_DIR | $GREP "pool:" | $AWK '{print $2}'`; do + log_must $ZPOOL import -d $DEVICE_DIR -f $pool + done + + while (( id < number )); do + if ! poolexists ${TESTPOOL}-$id ; then + (( id = id + 1 )) + continue + fi + + if (( id == 0 )); then + log_must $ZPOOL export ${TESTPOOL}-$id + + [[ -d /${TESTPOOL}-$id ]] && \ + log_must $RM -rf /${TESTPOOL}-$id + + log_must $ZPOOL import -f ${TESTPOOL}-$id $TESTPOOL + + [[ -e $TESTDIR/$TESTFILE0 ]] && \ + log_must $RM -rf $TESTDIR/$TESTFILE0 + else + cleanup_filesystem "${TESTPOOL}-$id" $TESTFS + + destroy_pool ${TESTPOOL}-$id + fi + + (( id = id + 1 )) + done + + [[ -d $ALTER_ROOT ]] && \ + $RM -rf $ALTER_ROOT +} + +function checksum_all #alter_root +{ + typeset alter_root=$1 + typeset -i id=0 + typeset file + typeset checksum2 + + while (( id < number )); do + if (( id == 2 )); then + (( id = id + 1 )) + continue + fi + + if (( id == 0 )); then + file=${alter_root}/$TESTDIR/$TESTFILE0 + else + file=${alter_root}/$TESTDIR.$id/$TESTFILE0 + fi + [[ ! -e $file ]] && \ + log_fail "$file missing after import." + + checksum2=$($SUM $file | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + (( id = id + 1 )) + done + + return 0 +} + + +log_assert "Verify that 'zpool import -a' succeeds as root." + +log_onexit cleanup_all + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +log_must $ZPOOL export $TESTPOOL +log_must $ZPOOL import $TESTPOOL ${TESTPOOL}-0 +log_must $CP $MYTESTFILE $TESTDIR/$TESTFILE0 +log_must $ZPOOL export ${TESTPOOL}-0 +[[ -d /${TESTPOOL}-0 ]] && \ + log_must $RM -rf /${TESTPOOL}-0 + +# +# setup exported pools on normal devices +# +number=1 +while (( number <= $GROUP_NUM )); do + if (( number == 2)); then + (( number = number + 1 )) + continue + fi + + setup_single_disk "${ZFS_DISK1}s${number}" \ + "${TESTPOOL}-$number" \ + "$TESTFS" \ + "$TESTDIR.$number" + + (( number = number + 1 )) +done + +# +# setup exported pools on raw files +# +for disk in $DEVICE_FILES +do + + setup_single_disk "$disk" \ + "${TESTPOOL}-$number" \ + "$TESTFS" \ + "$TESTDIR.$number" + + (( number = number + 1 )) +done + +while (( i < ${#options[*]} )); do + + log_must $ZPOOL import -d /dev/dsk -d $DEVICE_DIR ${options[i]} -a -f + + # destroy unintentional imported pools + typeset exclude=`eval $ECHO \"'(${KEEP})'\"` + for unwantedpool in $($ZPOOL list -H -o name \ + | $EGREP -v "$exclude" | $GREP -v $TESTPOOL); do + log_must $ZPOOL export $unwantedpool + done + + if [[ -n ${options[i]} ]]; then + checksum_all $ALTER_ROOT + else + checksum_all + fi + + id=0 + while (( id < number )); do + if poolexists ${TESTPOOL}-$id ; then + log_must $ZPOOL export ${TESTPOOL}-$id + fi + (( id = id + 1 )) + done + + (( i = i + 1 )) +done + +log_pass "'zpool import -a' succeeds as root." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_001_pos.ksh new file mode 100644 index 0000000000..ea71acfd2c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_001_pos.ksh @@ -0,0 +1,71 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +################################################################################# +# +# Pool can be imported with inactive unsupported features. +# +# 1. Create new pool. +# 2. Export and inject unsuppored features with zhack. +# 3. Import pool normally with no problems. +# 4. Verify that unsupported@ properties exist for the unsupported features. +# +################################################################################ + +verify_runnable "global" + +features="com.test:xxx_unsup0 com.test:xxx_unsup1 com.test:xxx_unsup2" + +function cleanup +{ + poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1 + + log_must $RM $VDEV0 + log_must $MKFILE $FILE_SIZE $VDEV0 +} + +log_assert "Pool with inactive unsupported features can be imported." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 +log_must $ZPOOL export $TESTPOOL1 + +for feature in $features; do + log_must $ZHACK -d $DEVICE_DIR feature enable $TESTPOOL1 $feature +done + +log_must $ZPOOL import -d $DEVICE_DIR $TESTPOOL1 +for feature in $features; do + state=$($ZPOOL list -Ho unsupported@$feature $TESTPOOL1) + if [[ "$state" != "inactive" ]]; then + log_fail "unsupported@$feature is '$state'" + fi +done + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_002_neg.ksh new file mode 100644 index 0000000000..26b99f07a7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_002_neg.ksh @@ -0,0 +1,87 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +################################################################################# +# +# Pool cannot be opened with active unsupported features. Error message should +# list active unsupported features. +# +# 1. Create new pool. +# 2. Export and inject unsuppored features with zhack, make some of them active. +# 3. Try to import pool, error should only list active features. It should +# not say anything about being able to import the pool in readonly mode. +# +################################################################################ + +verify_runnable "global" + +enabled_features="com.test:xxx_unsup1 com.test:xxx_unsup3" +active_features="com.test:xxx_unsup0 com.test:xxx_unsup2" + +function cleanup +{ + poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1 + + log_must $RM $VDEV0 + log_must $MKFILE $FILE_SIZE $VDEV0 +} + +log_assert "Pool with active unsupported features cannot be imported." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 +log_must $ZPOOL export $TESTPOOL1 + +for feature in $enabled_features $active_features; do + log_must $ZHACK -d $DEVICE_DIR feature enable $TESTPOOL1 $feature +done + +for feature in $active_features; do + log_must $ZHACK -d $DEVICE_DIR feature ref $TESTPOOL1 $feature +done + +log_mustnot $ZPOOL import -d $DEVICE_DIR $TESTPOOL1 + +# error message should not mention "readonly" +log_mustnot eval "$ZPOOL import -d $DEVICE_DIR $TESTPOOL1 | $GREP readonly" +log_mustnot poolexists $TESTPOOL1 + +for feature in $active_features; do + log_must eval "$ZPOOL import -d $DEVICE_DIR $TESTPOOL1 \ + | $GREP $feature" + log_mustnot poolexists $TESTPOOL1 +done + +for feature in $enabled_features; do + log_mustnot eval "$ZPOOL import -d $DEVICE_DIR $TESTPOOL1 \ + | $GREP $feature" + log_mustnot poolexists $TESTPOOL1 +done + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_003_pos.ksh new file mode 100644 index 0000000000..3f0ea63d62 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_features_003_pos.ksh @@ -0,0 +1,106 @@ +#!/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 (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +################################################################################# +# +# Pool can be imported with active read-only compatible features. If a feature +# is read-only compatible but also inactive its property status should be +# "inactive" rather than "readonly". +# +# 1. Create new pool. +# 2. Export and inject variety of unsupported features. +# 3. Try to import read-write, this should fail. The error should only list +# the active read-only compatible feature and mention "readonly=on". +# 4. Import the pool in read-only mode. +# 5. Verify values of unsupported@ properties. +# +################################################################################ + +verify_runnable "global" + +enabled_features="com.test:xxx_unsup0 com.test:xxx_unsup2" +active_features="com.test:xxx_unsup1 com.test:xxx_unsup3" + +function cleanup +{ + poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1 + + log_must $RM $VDEV0 + log_must $MKFILE $FILE_SIZE $VDEV0 +} + +log_assert "Pool with active read-only compatible features can be imported." +log_onexit cleanup + +log_must $ZPOOL create $TESTPOOL1 $VDEV0 +log_must $ZPOOL export $TESTPOOL1 + +for feature in $enabled_features $active_features; do + log_must $ZHACK -d $DEVICE_DIR feature enable -r $TESTPOOL1 $feature +done + +for feature in $active_features; do + log_must $ZHACK -d $DEVICE_DIR feature ref $TESTPOOL1 $feature +done + +log_mustnot $ZPOOL import -d $DEVICE_DIR $TESTPOOL1 + +# error message should mention "readonly" +log_must eval "$ZPOOL import -d $DEVICE_DIR $TESTPOOL1 | $GREP readonly" +log_mustnot poolexists $TESTPOOL1 + +for feature in $enabled_features; do + log_mustnot eval "$ZPOOL import -d $DEVICE_DIR $TESTPOOL1 \ + | $GREP $feature" + log_mustnot poolexists $TESTPOOL1 +done + +for feature in $active_features; do + log_must eval "$ZPOOL import -d $DEVICE_DIR $TESTPOOL1 \ + | $GREP $feature" + log_mustnot poolexists $TESTPOOL1 +done + +log_must $ZPOOL import -o readonly=on -d $DEVICE_DIR $TESTPOOL1 + +for feature in $enabled_features; do + state=$($ZPOOL list -Ho unsupported@$feature $TESTPOOL1) + if [[ "$state" != "inactive" ]]; then + log_fail "unsupported@$feature is '$state'" + fi +done + +for feature in $active_features; do + state=$($ZPOOL list -Ho unsupported@$feature $TESTPOOL1) + if [[ "$state" != "readonly" ]]; then + log_fail "unsupported@$feature is '$state'" + fi +done + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_001_pos.ksh new file mode 100644 index 0000000000..d0447596b3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_001_pos.ksh @@ -0,0 +1,203 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Once a pool has been exported, and one or more devices are +# damaged or missing (d/m), import should handle this kind of situation +# as described: +# - Regular, report error while any number of devices failing. +# - Mirror could withstand (N-1) devices failing +# before data integrity is compromised +# - Raidz could withstand one devices failing +# before data integrity is compromised +# Verify those are true. +# +# STRATEGY: +# 1. Create test pool upon device files using the various combinations. +# - Regular pool +# - Mirror +# - Raidz +# 2. Create necessary filesystem and test files. +# 3. Export the test pool. +# 4. Remove one or more devices +# 5. Verify 'zpool import' will handle d/m device successfully. +# Using the various combinations. +# - Regular import +# - Alternate Root Specified +# It should be succeed with single d/m device upon 'raidz' & 'mirror', +# but failed against 'regular' or more d/m devices. +# 6. If import succeed, verify following is true: +# - The pool shows up under 'zpool list'. +# - The pool's health should be DEGRADED. +# - It contains the correct test file +# + +verify_runnable "global" + +set -A vdevs "" "mirror" "raidz" +set -A options "" "-R $ALTER_ROOT" + +function cleanup +{ + # recover the vdevs + recreate_files + + [[ -d $ALTER_ROOT ]] && \ + log_must $RM -rf $ALTER_ROOT +} + +function recreate_files +{ + if poolexists "$TESTPOOL1" ; then + cleanup_filesystem $TESTPOOL1 $TESTFS + destroy_pool $TESTPOOL1 + fi + + log_must $RM -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must $MKFILE $FILE_SIZE ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +log_onexit cleanup + +log_assert "Verify that import could handle damaged or missing device." + +CWD=$PWD +cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR" + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +typeset -i i=0 +typeset -i j=0 +typeset -i count=0 +typeset basedir backup + +while (( i < ${#vdevs[*]} )); do + + setup_filesystem "$DEVICE_FILES" \ + $TESTPOOL1 $TESTFS $TESTDIR1 \ + "" ${vdevs[i]} + + backup="" + + guid=$(get_config $TESTPOOL1 pool_guid) + log_must $CP $MYTESTFILE $TESTDIR1/$TESTFILE0 + + log_must $ZFS umount $TESTDIR1 + + j=0 + while (( j < ${#options[*]} )); do + + count=0 + action=log_must + + # + # Restore all device files. + # + [[ -n $backup ]] && \ + log_must $TAR xf $DEVICE_DIR/$DEVICE_ARCHIVE + + for device in $DEVICE_FILES ; do + log_must $RM -f $device + + poolexists $TESTPOOL1 && \ + log_must $ZPOOL export $TESTPOOL1 + + # + # Backup all device files while filesystem prepared. + # + if [[ -z $backup ]]; then + log_must $TAR cf $DEVICE_DIR/$DEVICE_ARCHIVE \ + ${DEVICE_FILE}* + backup="true" + fi + + (( count = count + 1 )) + + case "${vdevs[i]}" in + 'mirror') (( count == $GROUP_NUM )) && \ + action=log_mustnot + ;; + 'raidz') (( count > 1 )) && \ + action=log_mustnot + ;; + '') action=log_mustnot + ;; + esac + + typeset target=$TESTPOOL1 + if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." + fi + $action $ZPOOL import \ + -d $DEVICE_DIR ${options[j]} $target + + [[ $action == "log_mustnot" ]] && continue + + log_must poolexists $TESTPOOL1 + + health=$($ZPOOL list -H -o health $TESTPOOL1) + + [[ $health == "DEGRADED" ]] || \ + log_fail "$TESTPOOL1: Incorrect health($health)" + log_must ismounted $TESTPOOL1/$TESTFS + + basedir=$TESTDIR1 + [[ -n ${options[j]} ]] && \ + basedir=$ALTER_ROOT/$TESTDIR1 + + [[ ! -e $basedir/$TESTFILE0 ]] && \ + log_fail "$basedir/$TESTFILE0 missing after import." + + checksum2=$($SUM $basedir/$TESTFILE0 | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + done + + ((j = j + 1)) + done + + recreate_files + + ((i = i + 1)) +done + +log_pass "Import could handle damaged or missing device." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_002_pos.ksh new file mode 100644 index 0000000000..36fbe447e5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_002_pos.ksh @@ -0,0 +1,197 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Once a pool has been exported, and one or more devices are +# move to other place, import should handle this kind of situation +# as described: +# - Regular, report error while any number of devices failing. +# - Mirror could withstand (N-1) devices failing +# before data integrity is compromised +# - Raidz could withstand one devices failing +# before data integrity is compromised +# Verify that is true. +# +# STRATEGY: +# 1. Create test pool upon device files using the various combinations. +# - Regular pool +# - Mirror +# - Raidz +# 2. Create necessary filesystem and test files. +# 3. Export the test pool. +# 4. Move one or more device files to other directory +# 5. Verify 'zpool import -d' with the new directory +# will handle moved files successfullly. +# Using the various combinations. +# - Regular import +# - Alternate Root Specified +# + +verify_runnable "global" + +set -A vdevs "" "mirror" "raidz" +set -A options "" "-R $ALTER_ROOT" + +function cleanup +{ + cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR" + [[ -e $DEVICE_DIR/$DEVICE_ARCHIVE ]] && \ + log_must $TAR xf $DEVICE_DIR/$DEVICE_ARCHIVE + + poolexists $TESTPOOL1 || \ + log_must $ZPOOL import -d $DEVICE_DIR $TESTPOOL1 + + cleanup_filesystem $TESTPOOL1 $TESTFS + + destroy_pool $TESTPOOL1 +} + +function cleanup_all +{ + cleanup + + # recover dev files + typeset i=0 + while (( i < $MAX_NUM )); do + typeset dev_file=${DEVICE_DIR}/${DEVICE_FILE}$i + if [[ ! -e ${dev_file} ]]; then + log_must $MKFILE $FILE_SIZE ${dev_file} + fi + ((i += 1)) + done + + log_must $RM -f $DEVICE_DIR/$DEVICE_ARCHIVE + cd $CWD || log_fail "Unable change directory to $CWD" + + [[ -d $ALTER_ROOT ]] && \ + log_must $RM -rf $ALTER_ROOT + + [[ -d $BACKUP_DEVICE_DIR ]] && \ + log_must $RM -rf $BACKUP_DEVICE_DIR +} + +log_onexit cleanup_all + +log_assert "Verify that import could handle moving device." + +CWD=$PWD + +[[ ! -d $BACKUP_DEVICE_DIR ]] && + log_must $MKDIR -p $BACKUP_DEVICE_DIR + +cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR" + +typeset -i i=0 +typeset -i j=0 +typeset -i count=0 +typeset basedir backup +typeset action + +while (( i < ${#vdevs[*]} )); do + + (( i != 0 )) && \ + log_must $TAR xf $DEVICE_DIR/$DEVICE_ARCHIVE + + setup_filesystem "$DEVICE_FILES" \ + $TESTPOOL1 $TESTFS $TESTDIR1 \ + "" ${vdevs[i]} + + guid=$(get_config $TESTPOOL1 pool_guid) + backup="" + + log_must $CP $MYTESTFILE $TESTDIR1/$TESTFILE0 + + log_must $ZFS umount $TESTDIR1 + + j=0 + while (( j < ${#options[*]} )); do + + count=0 + + # + # Restore all device files. + # + [[ -n $backup ]] && \ + log_must $TAR xf $DEVICE_DIR/$DEVICE_ARCHIVE + + log_must $RM -f $BACKUP_DEVICE_DIR/* + + for device in $DEVICE_FILES ; do + + poolexists $TESTPOOL1 && \ + log_must $ZPOOL export $TESTPOOL1 + + # + # Backup all device files while filesystem prepared. + # + if [[ -z $backup ]] ; then + log_must $TAR cf $DEVICE_DIR/$DEVICE_ARCHIVE ${DEVICE_FILE}* + backup="true" + fi + + log_must $MV $device $BACKUP_DEVICE_DIR + + (( count = count + 1 )) + + action=log_mustnot + case "${vdevs[i]}" in + 'mirror') (( count < $GROUP_NUM )) && \ + action=log_must + ;; + 'raidz') (( count == 1 )) && \ + action=log_must + ;; + esac + + typeset target=$TESTPOOL1 + if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." + fi + $action $ZPOOL import \ + -d $DEVICE_DIR ${options[j]} $target + + done + + ((j = j + 1)) + done + + cleanup + + ((i = i + 1)) +done + +log_pass "Import could handle moving device." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_003_pos.ksh new file mode 100644 index 0000000000..7f2d4f4a30 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_missing_003_pos.ksh @@ -0,0 +1,232 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# Once a pool has been exported, but one or more devices are +# overlapped with other exported pool, import should handle +# this kind of situation properly. +# +# STRATEGY: +# 1. Repeat 1-3, create two test pools upon device files separately. +# These two pools should have one or more devices are overlapped. +# using the various combinations. +# - Regular pool +# - Mirror +# - Raidz +# 2. Create necessary filesystem and test files. +# 3. Export the test pool. +# 4. Verify 'zpool import -d' with these two pools will have results +# as described: +# - Regular, report error while any number of devices failing. +# - Mirror could withstand (N-1) devices failing +# before data integrity is compromised +# - Raidz could withstand one devices failing +# before data integrity is compromised +# + +verify_runnable "global" + +set -A vdevs "" "mirror" "raidz" + +function verify +{ + typeset pool=$1 + typeset fs=$2 + typeset mtpt=$3 + typeset health=$4 + typeset file=$5 + typeset checksum1=$6 + + typeset myhealth + typeset mymtpt + typeset checksum2 + + log_must poolexists $pool + + myhealth=$($ZPOOL list -H -o health $pool) + + [[ $myhealth == $health ]] || \ + log_fail "$pool: Incorrect health ($myhealth), " \ + "expected ($health)." + + log_must ismounted $pool/$fs + + mymtpt=$(get_prop mountpoint $pool/$fs) + [[ $mymtpt == $mtpt ]] || \ + log_fail "$pool/$fs: Incorrect mountpoint ($mymtpt), " \ + "expected ($mtpt)." + + [[ ! -e $mtpt/$file ]] && \ + log_fail "$mtpt/$file missing after import." + + checksum2=$($SUM $mymtpt/$file | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + return 0 + +} + +function cleanup +{ + cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR" + + for pool in $TESTPOOL1 $TESTPOOL2; do + if poolexists "$pool" ; then + cleanup_filesystem $pool $TESTFS + destroy_pool $pool + fi + done + + [[ -e $DEVICE_DIR/$DEVICE_ARCHIVE ]] && \ + log_must $TAR xf $DEVICE_DIR/$DEVICE_ARCHIVE +} + +function cleanup_all +{ + cleanup + + # recover dev files + typeset i=0 + while (( i < $MAX_NUM )); do + typeset file=${DEVICE_DIR}/${DEVICE_FILE}$i + if [[ -e $file ]]; then + log_must $RM $file + fi + log_must $MKFILE $FILE_SIZE $file + ((i += 1)) + done + + log_must $RM -f $DEVICE_DIR/$DEVICE_ARCHIVE + cd $CWD || log_fail "Unable change directory to $CWD" + +} + +log_onexit cleanup_all + +log_assert "Verify that import could handle device overlapped." + +CWD=$PWD + +cd $DEVICE_DIR || log_fail "Unable change directory to $DEVICE_DIR" +log_must $TAR cf $DEVICE_DIR/$DEVICE_ARCHIVE ${DEVICE_FILE}* + +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +typeset -i i=0 +typeset -i j=0 +typeset -i count=0 +typeset -i num=0 +typeset vdev1="" +typeset vdev2="" +typeset action + +while (( num < $GROUP_NUM )); do + vdev1="$vdev1 ${DEVICE_DIR}/${DEVICE_FILE}$num" + (( num = num + 1 )) +done + +while (( i < ${#vdevs[*]} )); do + j=0 + while (( j < ${#vdevs[*]} )); do + + (( j != 0 )) && \ + log_must $TAR xf $DEVICE_DIR/$DEVICE_ARCHIVE + + typeset -i overlap=1 + typeset -i begin + typeset -i end + + while (( overlap <= $GROUP_NUM )); do + vdev2="" + (( begin = $GROUP_NUM - overlap )) + (( end = 2 * $GROUP_NUM - overlap - 1 )) + (( num = begin )) + while (( num <= end )); do + vdev2="$vdev2 ${DEVICE_DIR}/${DEVICE_FILE}$num" + (( num = num + 1 )) + done + + setup_filesystem "$vdev1" $TESTPOOL1 $TESTFS $TESTDIR1 \ + "" ${vdevs[i]} + log_must $CP $MYTESTFILE $TESTDIR1/$TESTFILE0 + log_must $ZFS umount $TESTDIR1 + poolexists $TESTPOOL1 && \ + log_must $ZPOOL export $TESTPOOL1 + + setup_filesystem "$vdev2" $TESTPOOL2 $TESTFS $TESTDIR2 \ + "" ${vdevs[j]} + log_must $CP $MYTESTFILE $TESTDIR2/$TESTFILE0 + log_must $ZFS umount $TESTDIR2 + poolexists $TESTPOOL2 && \ + log_must $ZPOOL export $TESTPOOL2 + + action=log_must + case "${vdevs[i]}" in + 'mirror') (( overlap == $GROUP_NUM )) && \ + action=log_mustnot + ;; + 'raidz') (( overlap > 1 )) && \ + action=log_mustnot + ;; + '') action=log_mustnot + ;; + esac + + $action $ZPOOL import -d $DEVICE_DIR $TESTPOOL1 + log_must $ZPOOL import -d $DEVICE_DIR $TESTPOOL2 + + if [[ $action == log_must ]]; then + verify "$TESTPOOL1" "$TESTFS" "$TESTDIR1" \ + "DEGRADED" "$TESTFILE0" "$checksum1" + fi + + verify "$TESTPOOL2" "$TESTFS" "$TESTDIR2" \ + "ONLINE" "$TESTFILE0" "$checksum1" + + cleanup + + (( overlap = overlap + 1 )) + + done + + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "Import could handle device overlapped." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_rename_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_rename_001_pos.ksh new file mode 100644 index 0000000000..60ccc0dd60 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_rename_001_pos.ksh @@ -0,0 +1,162 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.kshlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# DESCRIPTION: +# An exported pool can be imported under a different name. Hence +# we test that a previously exported pool can be renamed. +# +# STRATEGY: +# 1. Copy a file into the default test directory. +# 2. Umount the default directory. +# 3. Export the pool. +# 4. Import the pool using the name ${TESTPOOL}-new, +# and using the various combinations. +# - Regular import +# - Alternate Root Specified +# 5. Verify it exists in the 'zpool list' output. +# 6. Verify the default file system is mounted and that the file +# from step (1) is present. +# + +verify_runnable "global" + +set -A pools "$TESTPOOL" "$TESTPOOL1" +set -A devs "" "-d $DEVICE_DIR" +set -A options "" "-R $ALTER_ROOT" +set -A mtpts "$TESTDIR" "$TESTDIR1" + + +function cleanup +{ + typeset -i i=0 + while (( i < ${#pools[*]} )); do + if poolexists "${pools[i]}-new" ; then + log_must $ZPOOL export "${pools[i]}-new" + + [[ -d /${pools[i]}-new ]] && \ + log_must $RM -rf /${pools[i]}-new + + log_must $ZPOOL import ${devs[i]} \ + "${pools[i]}-new" ${pools[i]} + fi + + datasetexists "${pools[i]}" || \ + log_must $ZPOOL import ${devs[i]} ${pools[i]} + + ismounted "${pools[i]}/$TESTFS" || \ + log_must $ZFS mount ${pools[i]}/$TESTFS + + [[ -e ${mtpts[i]}/$TESTFILE0 ]] && \ + log_must $RM -rf ${mtpts[i]}/$TESTFILE0 + + ((i = i + 1)) + + done + + cleanup_filesystem $TESTPOOL1 $TESTFS $TESTDIR1 + + destroy_pool $TESTPOOL1 + + [[ -d $ALTER_ROOT ]] && \ + log_must $RM -rf $ALTER_ROOT +} + +log_onexit cleanup + +log_assert "Verify that an imported pool can be renamed." + +setup_filesystem "$DEVICE_FILES" $TESTPOOL1 $TESTFS $TESTDIR1 +checksum1=$($SUM $MYTESTFILE | $AWK '{print $1}') + +typeset -i i=0 +typeset -i j=0 +typeset basedir + +while (( i < ${#pools[*]} )); do + guid=$(get_config ${pools[i]} pool_guid) + log_must $CP $MYTESTFILE ${mtpts[i]}/$TESTFILE0 + + log_must $ZFS umount ${mtpts[i]} + + j=0 + while (( j < ${#options[*]} )); do + log_must $ZPOOL export ${pools[i]} + + [[ -d /${pools[i]} ]] && \ + log_must $RM -rf /${pools[i]} + + typeset target=${pools[i]} + if (( RANDOM % 2 == 0 )) ; then + target=$guid + log_note "Import by guid." + fi + + log_must $ZPOOL import ${devs[i]} ${options[j]} \ + $target ${pools[i]}-new + + log_must poolexists "${pools[i]}-new" + + log_must ismounted ${pools[i]}-new/$TESTFS + + basedir=${mtpts[i]} + [[ -n ${options[j]} ]] && \ + basedir=$ALTER_ROOT/${mtpts[i]} + + [[ ! -e $basedir/$TESTFILE0 ]] && \ + log_fail "$basedir/$TESTFILE0 missing after import." + + checksum2=$($SUM $basedir/$TESTFILE0 | $AWK '{print $1}') + [[ "$checksum1" != "$checksum2" ]] && \ + log_fail "Checksums differ ($checksum1 != $checksum2)" + + log_must $ZPOOL export "${pools[i]}-new" + + [[ -d /${pools[i]}-new ]] && \ + log_must $RM -rf /${pools[i]}-new + + target=${pools[i]}-new + if (( RANDOM % 2 == 0 )) ; then + target=$guid + fi + log_must $ZPOOL import ${devs[i]} $target ${pools[i]} + + ((j = j + 1)) + done + + ((i = i + 1)) +done + +log_pass "Successfully imported and renamed a ZPOOL" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/Makefile new file mode 100644 index 0000000000..bfe3b8b723 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/Makefile @@ -0,0 +1,42 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_offline + +PROGS = cleanup \ + setup \ + zpool_offline_001_pos \ + zpool_offline_002_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/cleanup.ksh new file mode 100644 index 0000000000..b2b93316e4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/setup.ksh new file mode 100644 index 0000000000..51dfd8107b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" +verify_disk_count "$DISKS" 2 + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_001_pos.ksh new file mode 100644 index 0000000000..ddd657477f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_001_pos.ksh @@ -0,0 +1,120 @@ +#!/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Executing 'zpool offline' with valid parameters succeeds. +# +# STRATEGY: +# 1. Create an array of correctly formed 'zpool offline' options +# 2. Execute each element of the array. +# 3. Verify use of each option is successful. +# + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) +set -A disks $DISKLIST +typeset -i num=${#disks[*]} + +set -A args "" "-t" + +function cleanup +{ + # + # Ensure we don't leave disks in the offline state + # + for disk in $DISKLIST; do + log_must $ZPOOL online $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "Unable to online $disk" + fi + + done +} + +log_assert "Executing 'zpool offline' with correct options succeeds" + +log_onexit cleanup + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 +typeset -i j=1 + +for disk in $DISKLIST; do + i=0 + while [[ $i -lt ${#args[*]} ]]; do + if (( j < num )) ; then + log_must $ZPOOL offline ${args[$i]} $TESTPOOL $disk + check_state $TESTPOOL $disk "offline" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match offline state" + fi + else + log_mustnot $ZPOOL offline ${args[$i]} $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match online state" + fi + fi + + (( i = i + 1 )) + done + (( j = j + 1 )) +done + +log_note "Issuing repeated 'zpool offline' commands succeeds." + +typeset -i iters=20 +typeset -i index=0 + +for disk in $DISKLIST; do + i=0 + while [[ $i -lt $iters ]]; do + index=`expr $RANDOM % ${#args[*]}` + log_must $ZPOOL offline ${args[$index]} $TESTPOOL $disk + check_state $TESTPOOL $disk "offline" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL is not offline." + fi + + (( i = i + 1 )) + done + + log_must $ZPOOL online $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match online state" + fi +done + +log_pass "'zpool offline' with correct options succeeded" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_002_neg.ksh new file mode 100644 index 0000000000..9834d0731e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_offline/zpool_offline_002_neg.ksh @@ -0,0 +1,91 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Executing 'zpool offline' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool offline' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-?" "-t fakepool" "-f fakepool" "-ev fakepool" "fakepool" \ + "-t $TESTPOOL" "-t $TESTPOOL/$TESTFS" "-t $TESTPOOL/$TESTFS $DISKLIST" \ + "-t $TESTPOOL/$TESTCTR" "-t $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-t $TESTPOOL/$TESTCTR $DISKLIST" "-t $TESTPOOL/$TESTVOL" \ + "-t $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-t $TESTPOOL/$TESTVOL $DISKLIST" \ + "-t $DISKLIST" \ + "-f $TESTPOOL" "-f $TESTPOOL/$TESTFS" "-f $TESTPOOL/$TESTFS $DISKLIST" \ + "-f $TESTPOOL/$TESTCTR" "-f $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-f $TESTPOOL/$TESTCTR $DISKLIST" "-f $TESTPOOL/$TESTVOL" \ + "-f $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-f $TESTPOOL/$TESTVOL $DISKLIST" \ + "-f $DISKLIST" \ + "-ft $TESTPOOL" "-ft $TESTPOOL/$TESTFS" \ + "-ft $TESTPOOL/$TESTFS $DISKLIST" \ + "-ft $TESTPOOL/$TESTCTR" "-ft $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-ft $TESTPOOL/$TESTCTR $DISKLIST" "-ft $TESTPOOL/$TESTVOL" \ + "-ft $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-ft $TESTPOOL/$TESTVOL $DISKLIST" \ + "-ft $DISKLIST" \ + "-tf $TESTPOOL" "-tf $TESTPOOL/$TESTFS" \ + "-tf $TESTPOOL/$TESTFS $DISKLIST" \ + "-tf $TESTPOOL/$TESTCTR" "-tf $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-tf $TESTPOOL/$TESTCTR $DISKLIST" "-tf $TESTPOOL/$TESTVOL" \ + "-tf $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-tf $TESTPOOL/$TESTVOL $DISKLIST" \ + "-tf $DISKLIST" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" + +log_assert "Executing 'zpool offline' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL offline ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool offline' command with bad options failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/Makefile new file mode 100644 index 0000000000..92fa336b18 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/Makefile @@ -0,0 +1,42 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_online + +PROGS = cleanup \ + setup \ + zpool_online_001_pos \ + zpool_online_002_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/cleanup.ksh new file mode 100644 index 0000000000..b2b93316e4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/setup.ksh new file mode 100644 index 0000000000..51dfd8107b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" +verify_disk_count "$DISKS" 2 + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_001_pos.ksh new file mode 100644 index 0000000000..f1ed6a047e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_001_pos.ksh @@ -0,0 +1,108 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Executing 'zpool online' with valid parameters succeeds. +# +# STRATEGY: +# 1. Create an array of correctly formed 'zpool online' options +# 2. Execute each element of the array. +# 3. Verify use of each option is successful. +# + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" + +function cleanup +{ + # + # Ensure we don't leave disks in temporary online state (-t) + # + for disk in $DISKLIST; do + log_must $ZPOOL online $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "Unable to online $disk" + fi + + done +} + +log_assert "Executing 'zpool online' with correct options succeeds" + +log_onexit cleanup + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +for disk in $DISKLIST; do + i=0 + while [[ $i -lt ${#args[*]} ]]; do + log_must $ZPOOL offline $TESTPOOL $disk + check_state $TESTPOOL $disk "offline" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match offline state" + fi + + log_must $ZPOOL online ${args[$i]} $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match online state" + fi + + (( i = i + 1 )) + done +done + +log_note "Issuing repeated 'zpool online' commands succeeds." + +typeset -i iters=20 +typeset -i index=0 + +for disk in $DISKLIST; do + i=0 + while [[ $i -lt $iters ]]; do + index=`expr $RANDOM % ${#args[*]}` + log_must $ZPOOL online ${args[$index]} $TESTPOOL $disk + check_state $TESTPOOL $disk "online" + if [[ $? != 0 ]]; then + log_fail "$disk of $TESTPOOL did not match online state" + fi + + (( i = i + 1 )) + done +done + +log_pass "'zpool online' with correct options succeeded" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_002_neg.ksh new file mode 100644 index 0000000000..307d196dc5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_online/zpool_online_002_neg.ksh @@ -0,0 +1,70 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Executing 'zpool online' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool online' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-?" "-e fakepool" "-v fakepool" "-ev fakepool" "-ve fakepool" \ + "-t $TESTPOOL" "-t $TESTPOOL/$TESTFS" "-t $TESTPOOL/$TESTFS $DISKLIST" \ + "-t $TESTPOOL/$TESTCTR" "-t $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-t $TESTPOOL/$TESTCTR $DISKLIST" "-t $TESTPOOL/$TESTVOL" \ + "-t $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-t $TESTPOOL/$TESTVOL $DISKLIST" \ + "-t $DISKLIST" \ + "$TESTPOOL" "$TESTPOOL/$TESTFS" "$TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "$TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "$TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" + +log_assert "Executing 'zpool online' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL online ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool online' command with bad options failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/Makefile new file mode 100644 index 0000000000..f84c999441 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/Makefile @@ -0,0 +1,45 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_remove + +PROGS = cleanup \ + setup \ + zpool_remove_001_neg \ + zpool_remove_002_pos \ + zpool_remove_003_pos + +FILES = zpool_remove.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/cleanup.ksh new file mode 100644 index 0000000000..283949263c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +cleanup_devices $DISKS + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/setup.ksh new file mode 100644 index 0000000000..539e7c6544 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/setup.ksh @@ -0,0 +1,43 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_remove/zpool_remove.cfg + +verify_runnable "global" + +if ! $(is_physical_device $DISKS) ; then + log_unsupported "This directory cannot be run on raw files." +fi + +partition_disk $SIZE $DISK 6 + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove.cfg new file mode 100644 index 0000000000..4725c74ab0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove.cfg @@ -0,0 +1,40 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export DISK=${DISKS%% *} +export SIZE="200m" +export SLICE0=0 +export SLICE1=1 +export SLICE2=2 +export SLICE3=3 +export SLICE4=4 +export SLICE5=5 +export SLICE6=6 +export SLICE7=7 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_001_neg.ksh new file mode 100644 index 0000000000..d4c2026ff6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_001_neg.ksh @@ -0,0 +1,96 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_remove/zpool_remove.cfg + +# +# DESCRIPTION: +# Verify that 'zpool can not remove device except inactive hot spares from pool' +# +# STRATEGY: +# 1. Create all kinds of pool (strip, mirror, raidz, hotspare) +# 2. Try to remove device from the pool +# 3. Verify that the remove failed. +# + +typeset disk=${DISK} +typeset vdev_devs="${disk}s${SLICE0}" +typeset mirror_devs="${disk}s${SLICE0} ${disk}s${SLICE1}" +typeset raidz_devs=${mirror_devs} +typeset raidz1_devs=${mirror_devs} +typeset raidz2_devs="${mirror_devs} ${disk}s${SLICE3}" +typeset spare_devs1="${disk}s${SLICE0}" +typeset spare_devs2="${disk}s${SLICE1}" + +function check_remove +{ + typeset pool=$1 + typeset devs="$2" + typeset dev + + for dev in $devs; do + log_mustnot $ZPOOL remove $dev + done + + destroy_pool $pool + +} + +function cleanup +{ + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi +} + +set -A create_args "$vdev_devs" "mirror $mirror_devs" \ + "raidz $raidz_devs" "raidz $raidz1_devs" \ + "raidz2 $raidz2_devs" \ + "$spare_devs1 spare $spare_devs2" + +set -A verify_disks "$vdev_devs" "$mirror_devs" "$raidz_devs" \ + "$raidz1_devs" "$raidz2_devs" "$spare_devs1" + + +log_assert "Check zpool remove <pool> <device> can not remove " \ + "active device from pool" + +log_onexit cleanup + +typeset -i i=0 +while [[ $i -lt ${#create_args[*]} ]]; do + log_must $ZPOOL create $TESTPOOL ${create_args[i]} + check_remove $TESTPOOL "${verify_disks[i]}" + (( i = i + 1)) +done + +log_pass "'zpool remove <pool> <device> fail as expected .'" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_002_pos.ksh new file mode 100644 index 0000000000..d77132ceb3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_002_pos.ksh @@ -0,0 +1,69 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_remove/zpool_remove.cfg + +# +# DESCRIPTION: +# Verify that 'zpool can only remove inactive hot spare devices from pool' +# +# STRATEGY: +# 1. Create a hotspare pool +# 2. Try to remove the inactive hotspare device from the pool +# 3. Verify that the remove succeed. +# + +function cleanup +{ + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi +} + +log_onexit cleanup +typeset disk=${DISK} + +typeset spare_devs1="${disk}s${SLICE0}" +typeset spare_devs2="${disk}s${SLICE1}" + +log_assert "zpool remove can only remove inactive hotspare device from pool" + +log_note "check hotspare device which is created by zpool create" +log_must $ZPOOL create $TESTPOOL $spare_devs1 spare $spare_devs2 +log_must $ZPOOL remove $TESTPOOL $spare_devs2 + +log_note "check hotspare device which is created by zpool add" +log_must $ZPOOL add $TESTPOOL spare $spare_devs2 +log_must $ZPOOL remove $TESTPOOL $spare_devs2 +log_must $ZPOOL destroy $TESTPOOL + +log_pass "zpool remove can only remove inactive hotspare device from pool" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_003_pos.ksh new file mode 100644 index 0000000000..afe944af88 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_remove/zpool_remove_003_pos.ksh @@ -0,0 +1,73 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_remove/zpool_remove.cfg + +# +# DESCRIPTION: +# Verify that 'zpool can remove hotspare devices from pool when it state +# switch from active to inactive' +# +# STRATEGY: +# 1. Create a hotspare pool +# 2. Try to replace the inactive hotspare device to active device in the pool +# 3. Try to detach active (spare) device to make it inactive +# 3. Verify that the zpool remove succeed. +# + +function cleanup +{ + if poolexists $TESTPOOL; then + destroy_pool $TESTPOOL + fi +} + +log_onexit cleanup +typeset disk=${DISK} + +typeset spare_devs1="${disk}s${SLICE0}" +typeset spare_devs2="${disk}s${SLICE1}" +typeset spare_devs3="${disk}s${SLICE3}" +typeset spare_devs4="${disk}s${SLICE4}" + +log_assert "zpool remove can remove hotspare device which state go though" \ + " active to inactive in pool" + +log_note "Check spare device which state go through active to inactive" +log_must $ZPOOL create $TESTPOOL $spare_devs1 $spare_devs2 spare \ + $spare_devs3 $spare_devs4 +log_must $ZPOOL replace $TESTPOOL $spare_devs2 $spare_devs3 +log_mustnot $ZPOOL remove $TESTPOOL $spare_devs3 +log_must $ZPOOL detach $TESTPOOL $spare_devs3 +log_must $ZPOOL remove $TESTPOOL $spare_devs3 + +log_pass "'zpool remove device passed as expected.'" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/Makefile new file mode 100644 index 0000000000..7abdefe9b7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/Makefile @@ -0,0 +1,41 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_replace + +PROGS = cleanup \ + setup \ + zpool_replace_001_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/cleanup.ksh new file mode 100644 index 0000000000..b2b93316e4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/setup.ksh new file mode 100644 index 0000000000..51dfd8107b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/setup.ksh @@ -0,0 +1,35 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" +verify_disk_count "$DISKS" 2 + +DISK=${DISKS%% *} + +default_mirror_setup $DISKS diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/zpool_replace_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/zpool_replace_001_neg.ksh new file mode 100644 index 0000000000..853387798b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_replace/zpool_replace_001_neg.ksh @@ -0,0 +1,78 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Executing 'zpool replace' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool replace' options. +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# + +verify_runnable "global" + +DISKLIST=$(get_disklist $TESTPOOL) + +set -A args "" "-f" "-?" "-z fakepool" "-f fakepool" "-ev fakepool" "fakepool" \ + "$TESTPOOL" "-t $TESTPOOL/$TESTFS" "-t $TESTPOOL/$TESTFS $DISKLIST" \ + "$TESTPOOL/$TESTCTR" "-t $TESTPOOL/$TESTCTR/$TESTFS1" \ + "$TESTPOOL/$TESTCTR $DISKLIST" "-t $TESTPOOL/$TESTVOL" \ + "$TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "$TESTPOOL/$TESTVOL $DISKLIST" \ + "$DISKLIST" \ + "fakepool fakedevice" "fakepool fakedevice fakenewdevice" \ + "$TESTPOOL fakedevice" "$TESTPOOL $DISKLIST" \ + "$TESTPOOL fakedevice fakenewdevice fakenewdevice" \ + "-f $TESTPOOL" "-f $TESTPOOL/$TESTFS" "-f $TESTPOOL/$TESTFS $DISKLIST" \ + "-f $TESTPOOL/$TESTCTR" "-f $TESTPOOL/$TESTCTR/$TESTFS1" \ + "-f $TESTPOOL/$TESTCTR $DISKLIST" "-f $TESTPOOL/$TESTVOL" \ + "-f $TESTPOOL/$TESTCTR/$TESTFS1 $DISKLIST" \ + "-f $TESTPOOL/$TESTVOL $DISKLIST" \ + "-f $DISKLIST" \ + "-f fakepool fakedevice" "-f fakepool fakedevice fakenewdevice" \ + "-f $TESTPOOL fakedevice fakenewdevice fakenewdevice" \ + "-f $TESTPOOL fakedevice" "-f $TESTPOOL $DISKLIST" + +log_assert "Executing 'zpool replace' with bad options fails" + +if [[ -z $DISKLIST ]]; then + log_fail "DISKLIST is empty." +fi + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL replace ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool replace' command with bad options failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/Makefile new file mode 100644 index 0000000000..7ebeda68d0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/Makefile @@ -0,0 +1,47 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_scrub + +PROGS = cleanup \ + setup \ + zpool_scrub_001_neg \ + zpool_scrub_002_pos \ + zpool_scrub_003_pos \ + zpool_scrub_004_pos \ + zpool_scrub_005_pos + +FILES = zpool_scrub.cfg + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/cleanup.ksh new file mode 100644 index 0000000000..80af13ba67 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/cleanup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" + +destroy_mirrors diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/setup.ksh new file mode 100644 index 0000000000..a5ee58634e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/setup.ksh @@ -0,0 +1,47 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_scrub/zpool_scrub.cfg + +verify_runnable "global" +verify_disk_count "$DISKS" 2 + +default_mirror_setup_noexit $DISK1 $DISK2 + +mntpnt=$(get_prop mountpoint $TESTPOOL) +typeset -i i=0 +while ((i < 10)); do + log_must $MKFILE 500M $mntpnt/bigfile.$i + ((i += 1)) +done + +log_pass diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub.cfg new file mode 100644 index 0000000000..36b4c0ebeb --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub.cfg @@ -0,0 +1,32 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +export DISK1=$($ECHO $DISKS | $AWK '{print $1}') +export DISK2=$($ECHO $DISKS | $AWK '{print $2}') diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_001_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_001_neg.ksh new file mode 100644 index 0000000000..c3214c13de --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_001_neg.ksh @@ -0,0 +1,58 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# A badly formed parameter passed to 'zpool scrub' should +# return an error. +# +# STRATEGY: +# 1. Create an array containing bad 'zpool scrub' parameters. +# 2. For each element, execute the sub-command. +# 3. Verify it returns an error. +# + +verify_runnable "global" + +set -A args "" "-?" "blah blah" "-%" "--?" "-*" "-=" \ + "-a" "-b" "-c" "-d" "-e" "-f" "-g" "-h" "-i" "-j" "-k" "-l" \ + "-m" "-n" "-o" "-p" "-q" "-r" "-s" "-t" "-u" "-v" "-w" "-x" "-y" "-z" \ + "-A" "-B" "-C" "-D" "-E" "-F" "-G" "-H" "-I" "-J" "-K" "-L" \ + "-M" "-N" "-O" "-P" "-Q" "-R" "-S" "-T" "-U" "-V" "-W" "-X" "-W" "-Z" + + +log_assert "Execute 'zpool scrub' using invalid parameters." + +typeset -i i=0 +while [[ $i -lt ${#args[*]} ]]; do + log_mustnot $ZPOOL scrub ${args[i]} + + ((i = i + 1)) +done + +log_pass "Badly formed 'zpool scrub' parameters fail as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_002_pos.ksh new file mode 100644 index 0000000000..000b4f05a3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_002_pos.ksh @@ -0,0 +1,48 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Verify scrub -s works correctly. +# +# STRATEGY: +# 1. Create pool and fill with hundreds data. +# 2. zpool scrub the pool +# 3. Verify zpool scrub -s succeed when the system is scrubbing. +# + +verify_runnable "global" + +log_assert "Verify scrub -s works correctly." + +log_must $ZPOOL scrub $TESTPOOL +log_must $ZPOOL scrub -s $TESTPOOL +log_must is_pool_scrub_stopped $TESTPOOL + +log_pass "Verify scrub -s works correctly." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_003_pos.ksh new file mode 100644 index 0000000000..4f5019df1d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_003_pos.ksh @@ -0,0 +1,71 @@ +#!/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# scrub command terminates the existing scrub process and starts +# a new scrub. +# +# STRATEGY: +# 1. Setup a pool and fill with data +# 2. Kick off a scrub +# 3. Check the completed percent and invoke another scrub +# 4. Check the percent again, verify a new scrub started. +# + +verify_runnable "global" + +function get_scrub_percent +{ + typeset -i percent + percent=$($ZPOOL status $TESTPOOL | $GREP "^ scrub" | \ + $AWK '{print $7}' | $AWK -F. '{print $1}') + if is_pool_scrubbed $TESTPOOL ; then + percent=100 + fi + $ECHO $percent +} + +log_assert "scrub command terminates the existing scrub process and starts" \ + "a new scrub." + +log_must $ZPOOL scrub $TESTPOOL +typeset -i PERCENT=30 percent=0 +while ((percent < PERCENT)) ; do + percent=$(get_scrub_percent) +done + +log_must $ZPOOL scrub $TESTPOOL +percent=$(get_scrub_percent) +if ((percent > PERCENT)); then + log_fail "zpool scrub don't stop existing scrubbing process." +fi + +log_pass "scrub command terminates the existing scrub process and starts" \ + "a new scrub." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_004_pos.ksh new file mode 100644 index 0000000000..f45764672a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_004_pos.ksh @@ -0,0 +1,59 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_scrub/zpool_scrub.cfg + +# +# DESCRIPTION: +# Resilver prevent scrub from starting until the resilver completes +# +# STRATEGY: +# 1. Setup a mirror pool and filled with data. +# 2. Detach one of devices +# 3. Verify scrub failed until the resilver completed +# + +verify_runnable "global" + +log_assert "Resilver prevent scrub from starting until the resilver completes" + +log_must $ZPOOL detach $TESTPOOL $DISK2 +log_must $ZPOOL attach $TESTPOOL $DISK1 $DISK2 +log_must is_pool_resilvering $TESTPOOL +log_mustnot $ZPOOL scrub $TESTPOOL + +# Allow the resilver to finish, or it will interfere with the next test. +while ! is_pool_resilvered $TESTPOOL; do + $SLEEP 1 +done + +log_pass "Resilver prevent scrub from starting until the resilver completes" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_005_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_005_pos.ksh new file mode 100644 index 0000000000..39e43fd86d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_scrub/zpool_scrub_005_pos.ksh @@ -0,0 +1,61 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_scrub/zpool_scrub.cfg + +# +# DESCRIPTION: +# When scrubbing, detach device should not break system. +# +# STRATEGY: +# 1. Setup filesys with data. +# 2. Detaching and attaching the device when scrubbing. +# 3. Try it twice, verify both of them work fine. +# + +verify_runnable "global" + +log_assert "When scrubbing, detach device should not break system." + +log_must $ZPOOL scrub $TESTPOOL +log_must $ZPOOL detach $TESTPOOL $DISK2 +log_must $ZPOOL attach $TESTPOOL $DISK1 $DISK2 + +while ! is_pool_resilvered $TESTPOOL; do + $SLEEP 1 +done + +log_must $ZPOOL scrub $TESTPOOL +log_must $ZPOOL detach $TESTPOOL $DISK1 +log_must $ZPOOL attach $TESTPOOL $DISK2 $DISK1 + +log_pass "When scrubbing, detach device should not break system." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/Makefile new file mode 100644 index 0000000000..60e87622a3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/Makefile @@ -0,0 +1,41 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_set + +PROGS = zpool_set_001_pos \ + zpool_set_002_neg \ + zpool_set_003_neg + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_001_pos.ksh new file mode 100644 index 0000000000..31da71112a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_001_pos.ksh @@ -0,0 +1,56 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib +# +# DESCRIPTION: +# +# Zpool set usage message is displayed when called with no arguments +# +# STRATEGY: +# 1. Run zpool set +# 2. Check that exit status is set to 2 +# 3. Check usage message contains text "usage" +# +# + +log_assert "zpool set usage message is displayed when called with no arguments" + +$ZPOOL set > /dev/null 2>&1 +RET=$? +if [ $RET != 2 ] +then + log_fail "\"zpool set\" exit status $RET should be equal to 2." +fi + +OUTPUT=$($ZPOOL set 2>&1 | $GREP -i usage) +if [ $? != 0 ] +then + log_fail "Usage message for zpool set did not contain the word 'usage'." +fi + +log_pass "zpool set usage message is displayed when called with no arguments" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_002_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_002_neg.ksh new file mode 100644 index 0000000000..4d2b4bed9c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_002_neg.ksh @@ -0,0 +1,119 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# Malformed zpool set commands are rejected +# +# STRATEGY: +# 1. Create an array of many different malformed zfs set arguments +# 2. Run zpool set for each arg checking each will exit with status code 1 +# +# + +verify_runnable "global" + +# note to self - need to make sure there isn't a pool called bootfs +# before running this test... +function cleanup { + + $ZPOOL destroy bootfs + $RM /tmp/zpool_set_002.$$.dat +} + +log_assert "Malformed zpool set commands are rejected" + +if poolexists bootfs +then + log_unsupported "Unable to run test on a machine with a pool called \ + bootfs" +fi + +log_onexit cleanup + +# build up an array of bad arguments. +set -A arguments "rubbish " \ + "foo@bar= " \ + "@@@= +pool " \ + "zpool bootfs " \ + "bootfs " \ + "bootfs +" \ + "bootfs=bootfs/123 " \ + "bootfs=bootfs@val " \ + "Bootfs=bootfs " \ + "- " \ + "== " \ + "set " \ + "@@ " \ + "12345 " \ + "€にほんご " \ + "/ " \ + "bootfs=bootfs /" \ + "bootfs=a%d%s " + + +# here, we build up a large string. +# a word to the ksh-wary, ${#array[@]} gives you the +# total number of entries in an array, so array[${#array[@]}] +# will index the last entry+1, ksh arrays start at index 0. +COUNT=0 +while [ $COUNT -le 1025 ] +do + bigname="${bigname}o" + COUNT=$(( $COUNT + 1 )) +done + +# add an argument of maximum length property name +arguments[${#arguments[@]}]="$bigname=value" + +# add an argument of maximum length property value +arguments[${#arguments[@]}]="bootfs=$bigname" + +# Create a pool called bootfs (so-called, so as to trip any clashes between +# property name, and pool name) +# Also create a filesystem in this pool +log_must $MKFILE 64m /tmp/zpool_set_002.$$.dat +log_must $ZPOOL create bootfs /tmp/zpool_set_002.$$.dat +log_must $ZFS create bootfs/root + +typeset -i i=0; +while [ $i -lt "${#arguments[@]}" ] +do + log_mustnot eval "$ZPOOL set ${arguments[$i]} > /dev/null 2>&1" + + # now also try with a valid pool in the argument list + log_mustnot eval "$ZPOOL set ${arguments[$i]}bootfs > /dev/null 2>&1" + + # now also try with two valid pools in the argument list + log_mustnot eval "$ZPOOL set ${arguments[$i]}bootfs bootfs > /dev/null" + i=$(( $i + 1)) +done + +log_pass "Malformed zpool set commands are rejected" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_003_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_003_neg.ksh new file mode 100644 index 0000000000..02e20ffaef --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_set/zpool_set_003_neg.ksh @@ -0,0 +1,72 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# +# zpool set cannot set a readonly property +# +# STRATEGY: +# 1. Create a pool +# 2. Verify that we can't set readonly properties on that pool +# + +verify_runnable "global" + +function cleanup +{ + $ZPOOL destroy $TESTPOOL + $RM /tmp/zpool_set_003.$$.dat +} + +set -A props "available" "capacity" "guid" "health" "size" "used" +set -A vals "100" "10" "12345" "HEALTHY" "10" "10" + +log_onexit cleanup + +log_assert "zpool set cannot set a readonly property" + +log_must $MKFILE 64m /tmp/zpool_set_003.$$.dat +log_must $ZPOOL create $TESTPOOL /tmp/zpool_set_003.$$.dat + +typeset -i i=0; +while [ $i -lt "${#props[@]}" ] +do + # try to set each property in the prop list with it's corresponding val + log_mustnot eval "$ZPOOL set ${props[$i]}=${vals[$i]} $TESTPOOL \ + > /dev/null 2>&1" + i=$(( $i + 1)) +done + +log_pass "zpool set cannot set a readonly property" + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/Makefile new file mode 100644 index 0000000000..7af10289db --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/Makefile @@ -0,0 +1,42 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_status + +PROGS = cleanup \ + setup \ + zpool_status_001_pos \ + zpool_status_002_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/cleanup.ksh new file mode 100644 index 0000000000..5887a170c0 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/setup.ksh new file mode 100644 index 0000000000..d515cfe861 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/include/libtest.shlib + +DISK=${DISKS%% *} + +default_setup $DISK diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_001_pos.ksh new file mode 100644 index 0000000000..d582e55f4c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_001_pos.ksh @@ -0,0 +1,57 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Executing 'zpool status' command with bad options fails. +# +# STRATEGY: +# 1. Create an array of badly formed 'zpool status' options +# 2. Execute each element of the array. +# 3. Verify an error code is returned. +# + +verify_runnable "both" + + +set -A args "" "-?" "-x fakepool" "-v fakepool" "-xv fakepool" "-vx fakepool" \ + "-x $TESTPOOL/$TESTFS" "-v $TESTPOOL/$TESTFS" "-xv $TESTPOOL/$TESTFS" \ + "-vx $TESTPOOL/$TESTFS" + +log_assert "Executing 'zpool status' with bad options fails" + +typeset -i i=1 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL status ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool status' command with bad options failed as expected." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_002_pos.ksh new file mode 100644 index 0000000000..5ae84a8097 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_status/zpool_status_002_pos.ksh @@ -0,0 +1,62 @@ +#!/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Executing 'zpool status' with correct options succeeds +# +# STRATEGY: +# 1. Create an array of correctly formed 'zpool status' options +# 2. Execute each element of the array. +# 3. Verify use of each option is successful. +# + +verify_runnable "both" + +typeset testpool +if is_global_zone; then + testpool=$TESTPOOL +else + testpool=${TESTPOOL%%/*} +fi + +set -A args "" "-x" "-v" "-x $testpool" "-v $testpool" "-xv $testpool" \ + "-vx $testpool" + +log_assert "Executing 'zpool status' with correct options succeeds" + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_must $ZPOOL status ${args[$i]} + + (( i = i + 1 )) +done + +log_pass "'zpool status' with correct options succeeded" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/Makefile new file mode 100644 index 0000000000..67c0329568 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/Makefile @@ -0,0 +1,56 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_upgrade + +PROGS = cleanup \ + setup \ + zpool_upgrade_001_pos \ + zpool_upgrade_002_pos \ + zpool_upgrade_003_pos \ + zpool_upgrade_004_pos \ + zpool_upgrade_005_neg \ + zpool_upgrade_006_neg \ + zpool_upgrade_007_pos \ + zpool_upgrade_008_pos \ + zpool_upgrade_009_neg + +FILES = zpool_upgrade.cfg \ + zpool_upgrade.kshlib + +CMDS = $(PROGS:%=$(TESTDIR)/%) $(FILES:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%: % + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) + +SUBDIRS = blockfiles + +include $(SRC)/test/Makefile.com diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/Makefile b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/Makefile new file mode 100644 index 0000000000..bac8d4dd3f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/Makefile @@ -0,0 +1,87 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +BLOCKFILESDIR = $(ROOTOPTPKG)/tests/functional/cli_root/zpool_upgrade/blockfiles + +FILES = zfs-broken-mirror1.dat.bz2 \ + zfs-broken-mirror2.dat.bz2 \ + zfs-pool-v1.dat.bz2 \ + zfs-pool-v10.dat.bz2 \ + zfs-pool-v11.dat.bz2 \ + zfs-pool-v12.dat.bz2 \ + zfs-pool-v13.dat.bz2 \ + zfs-pool-v14.dat.bz2 \ + zfs-pool-v15.dat.bz2 \ + zfs-pool-v1mirror1.dat.bz2 \ + zfs-pool-v1mirror2.dat.bz2 \ + zfs-pool-v1mirror3.dat.bz2 \ + zfs-pool-v1raidz1.dat.bz2 \ + zfs-pool-v1raidz2.dat.bz2 \ + zfs-pool-v1raidz3.dat.bz2 \ + zfs-pool-v1stripe1.dat.bz2 \ + zfs-pool-v1stripe2.dat.bz2 \ + zfs-pool-v1stripe3.dat.bz2 \ + zfs-pool-v2.dat.bz2 \ + zfs-pool-v2mirror1.dat.bz2 \ + zfs-pool-v2mirror2.dat.bz2 \ + zfs-pool-v2mirror3.dat.bz2 \ + zfs-pool-v2raidz1.dat.bz2 \ + zfs-pool-v2raidz2.dat.bz2 \ + zfs-pool-v2raidz3.dat.bz2 \ + zfs-pool-v2stripe1.dat.bz2 \ + zfs-pool-v2stripe2.dat.bz2 \ + zfs-pool-v2stripe3.dat.bz2 \ + zfs-pool-v3.dat.bz2 \ + zfs-pool-v3hotspare1.dat.bz2 \ + zfs-pool-v3hotspare2.dat.bz2 \ + zfs-pool-v3hotspare3.dat.bz2 \ + zfs-pool-v3mirror1.dat.bz2 \ + zfs-pool-v3mirror2.dat.bz2 \ + zfs-pool-v3mirror3.dat.bz2 \ + zfs-pool-v3raidz1.dat.bz2 \ + zfs-pool-v3raidz2.dat.bz2 \ + zfs-pool-v3raidz21.dat.bz2 \ + zfs-pool-v3raidz22.dat.bz2 \ + zfs-pool-v3raidz23.dat.bz2 \ + zfs-pool-v3raidz3.dat.bz2 \ + zfs-pool-v3stripe1.dat.bz2 \ + zfs-pool-v3stripe2.dat.bz2 \ + zfs-pool-v3stripe3.dat.bz2 \ + zfs-pool-v4.dat.bz2 \ + zfs-pool-v5.dat.bz2 \ + zfs-pool-v6.dat.bz2 \ + zfs-pool-v7.dat.bz2 \ + zfs-pool-v8.dat.bz2 \ + zfs-pool-v9.dat.bz2 \ + zfs-pool-v999.dat.bz2 \ + zfs-pool-vBROKEN.dat.bz2 + +CMDS = $(FILES:%=$(BLOCKFILESDIR)/%) +$(CMDS) := FILEMODE = 0444 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(BLOCKFILESDIR) + +$(BLOCKFILESDIR): + $(INS.dir) + +$(BLOCKFILESDIR)/%: % + $(INS.file) diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/README b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/README new file mode 100644 index 0000000000..d700c2579f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/README @@ -0,0 +1,30 @@ +# +# 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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +Unless otherwise noted, all files in this distribution are released +under the Common Development and Distribution License (CDDL). + +This directory contains compressed blockfiles for zpool upgrade testing. diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..7ec82b755b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..00ef2bc36f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-broken-mirror2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..9c8a157eeb --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v10.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v10.dat.bz2 Binary files differnew file mode 100644 index 0000000000..5caf41c420 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v10.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v11.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v11.dat.bz2 Binary files differnew file mode 100644 index 0000000000..4af228e73f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v11.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v12.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v12.dat.bz2 Binary files differnew file mode 100644 index 0000000000..a116e9db6b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v12.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v13.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v13.dat.bz2 Binary files differnew file mode 100644 index 0000000000..3fab2262b7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v13.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v14.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v14.dat.bz2 Binary files differnew file mode 100644 index 0000000000..e8443c375c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v14.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v15.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v15.dat.bz2 Binary files differnew file mode 100644 index 0000000000..0887ae814a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v15.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..ed42283eb1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..4e72f1acfb --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..006c96df70 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1mirror3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..3c3531c70f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..99a0768b01 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..0fd057ecba --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1raidz3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..41f63f668d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..cc9eab160b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..866bd96c93 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v1stripe3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..184e3c3788 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..7466e7e25f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..de66b539b8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..4c3504b849 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2mirror3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..e008ae099c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..bf7f6b1199 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..f7b7012690 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2raidz3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..16a7bb89d5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..8f7287ee76 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..9fccd05c50 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v2stripe3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..fc122d8b8f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..d5c7e3c8b7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..47b4d6a2e9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..cb253c308a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3hotspare3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..e8ab50c45b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..769e0f81ab --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..e7e5a89587 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3mirror3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..6d43f74ba3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..6ab1059d0b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz21.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz21.dat.bz2 Binary files differnew file mode 100644 index 0000000000..dcc537f15d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz21.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz22.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz22.dat.bz2 Binary files differnew file mode 100644 index 0000000000..3cd92b1730 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz22.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz23.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz23.dat.bz2 Binary files differnew file mode 100644 index 0000000000..e3c5f41f9a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz23.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..2109fda719 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3raidz3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe1.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe1.dat.bz2 Binary files differnew file mode 100644 index 0000000000..4e6afe22b5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe1.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe2.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe2.dat.bz2 Binary files differnew file mode 100644 index 0000000000..6e755dd83b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe2.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe3.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe3.dat.bz2 Binary files differnew file mode 100644 index 0000000000..9cf396a3c5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v3stripe3.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v4.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v4.dat.bz2 Binary files differnew file mode 100644 index 0000000000..b1c00e1689 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v4.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5.dat.bz2 Binary files differnew file mode 100644 index 0000000000..9c6cb0c736 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v5.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v6.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v6.dat.bz2 Binary files differnew file mode 100644 index 0000000000..1eb1fea9d4 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v6.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v7.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v7.dat.bz2 Binary files differnew file mode 100644 index 0000000000..04c6cac75c --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v7.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v8.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v8.dat.bz2 Binary files differnew file mode 100644 index 0000000000..8f1e66303b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v8.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v9.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v9.dat.bz2 Binary files differnew file mode 100644 index 0000000000..94528d373b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v9.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v999.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v999.dat.bz2 Binary files differnew file mode 100644 index 0000000000..7ca57a2497 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-v999.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-vBROKEN.dat.bz2 b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-vBROKEN.dat.bz2 Binary files differnew file mode 100644 index 0000000000..6595f4a5d2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/blockfiles/zfs-pool-vBROKEN.dat.bz2 diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/cleanup.ksh new file mode 100644 index 0000000000..f94c3bcbd5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/cleanup.ksh @@ -0,0 +1,45 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +function destroy_upgraded_pools { + for config in $CONFIGS; do + POOL_NAME=$(eval $ECHO \$ZPOOL_VERSION_${VERSION}_NAME) + POOL_FILES=$(eval $ECHO \$ZPOOL_VERSION_${VERSION}_FILES) + poolexists $POOL_NAME && log_must $ZPOOL destroy -f $POOL_NAME + done +} + +destroy_upgraded_pools + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/setup.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/setup.ksh new file mode 100644 index 0000000000..9a48855369 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/setup.ksh @@ -0,0 +1,38 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +verify_runnable "global" +verify_disk_count "$DISKS" 2 + +# give us a pool to play in +default_mirror_setup $DISKS diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.cfg new file mode 100644 index 0000000000..ead4abc2d2 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.cfg @@ -0,0 +1,165 @@ +# +# 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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib + +# The following variable names describe files, stored as gzip compressed files +# in the test directory which can be used to construct a pool of a given +# version. The variable names are important, in that the construction +# ZPOOL_VERSION_$var_FILES describes the files the pool is made from, and +# ZPOOL_VERSION_$var_NAME describes the pool name. + +# Version 1 pools +export ZPOOL_VERSION_1_FILES="zfs-pool-v1.dat" +export ZPOOL_VERSION_1_NAME="v1-pool" +# v1 stripe +export ZPOOL_VERSION_1stripe_FILES="zfs-pool-v1stripe1.dat \ +zfs-pool-v1stripe2.dat zfs-pool-v1stripe3.dat" +export ZPOOL_VERSION_1stripe_NAME="pool-v1stripe" +# v1 raidz +export ZPOOL_VERSION_1raidz_FILES="zfs-pool-v1raidz1.dat zfs-pool-v1raidz2.dat \ +zfs-pool-v1raidz3.dat" +export ZPOOL_VERSION_1raidz_NAME="pool-v1raidz" +# v1 mirror +export ZPOOL_VERSION_1mirror_FILES="zfs-pool-v1mirror1.dat \ +zfs-pool-v1mirror2.dat zfs-pool-v1mirror3.dat" +export ZPOOL_VERSION_1mirror_NAME="pool-v1mirror" + + +# Version 2 pools +export ZPOOL_VERSION_2_FILES="zfs-pool-v2.dat" +export ZPOOL_VERSION_2_NAME="v2-pool" +# v2 stripe +export ZPOOL_VERSION_2stripe_FILES="zfs-pool-v2stripe1.dat \ +zfs-pool-v2stripe2.dat zfs-pool-v2stripe3.dat" +export ZPOOL_VERSION_2stripe_NAME="pool-v2stripe" +# v2 raidz +export ZPOOL_VERSION_2raidz_FILES="zfs-pool-v2raidz1.dat zfs-pool-v2raidz2.dat \ +zfs-pool-v2raidz3.dat" +export ZPOOL_VERSION_2raidz_NAME="pool-v2raidz" +# v2 mirror +export ZPOOL_VERSION_2mirror_FILES="zfs-pool-v2mirror1.dat \ +zfs-pool-v2mirror2.dat zfs-pool-v2mirror3.dat" +export ZPOOL_VERSION_2mirror_NAME="pool-v2mirror" + + +# This is a v3 pool +export ZPOOL_VERSION_3_FILES="zfs-pool-v3.dat" +export ZPOOL_VERSION_3_NAME="v3-pool" +# v3 stripe +export ZPOOL_VERSION_3stripe_FILES="zfs-pool-v3stripe1.dat \ +zfs-pool-v3stripe2.dat zfs-pool-v3stripe3.dat" +export ZPOOL_VERSION_3stripe_NAME="pool-v3stripe" +# v3 raidz +export ZPOOL_VERSION_3raidz_FILES="zfs-pool-v3raidz1.dat zfs-pool-v3raidz2.dat \ +zfs-pool-v3raidz3.dat" +export ZPOOL_VERSION_3raidz_NAME="pool-v3raidz" +# v3 mirror +export ZPOOL_VERSION_3mirror_FILES="zfs-pool-v3mirror1.dat \ +zfs-pool-v3mirror2.dat zfs-pool-v3mirror3.dat" +export ZPOOL_VERSION_3mirror_NAME="pool-v3mirror" +# v3 raidz2 +export ZPOOL_VERSION_3dblraidz_FILES="zfs-pool-v3raidz21.dat \ +zfs-pool-v3raidz22.dat zfs-pool-v3raidz23.dat" +export ZPOOL_VERSION_3dblraidz_NAME="pool-v3raidz2" +# v3 hotspares +export ZPOOL_VERSION_3hotspare_FILES="zfs-pool-v3hotspare1.dat \ +zfs-pool-v3hotspare2.dat zfs-pool-v3hotspare3.dat" +export ZPOOL_VERSION_3hotspare_NAME="pool-v3hotspare" + +# v4 pool +export ZPOOL_VERSION_4_FILES="zfs-pool-v4.dat" +export ZPOOL_VERSION_4_NAME="v4-pool" + +# v5 pool +export ZPOOL_VERSION_5_FILES="zfs-pool-v5.dat" +export ZPOOL_VERSION_5_NAME="v5-pool" + +# v6 pool +export ZPOOL_VERSION_6_FILES="zfs-pool-v6.dat" +export ZPOOL_VERSION_6_NAME="v6-pool" + +# v7 pool +export ZPOOL_VERSION_7_FILES="zfs-pool-v7.dat" +export ZPOOL_VERSION_7_NAME="v7-pool" + +# v8 pool +export ZPOOL_VERSION_8_FILES="zfs-pool-v8.dat" +export ZPOOL_VERSION_8_NAME="v8-pool" + +# v9 pool +export ZPOOL_VERSION_9_FILES="zfs-pool-v9.dat" +export ZPOOL_VERSION_9_NAME="v9-pool" + +# v10 pool +export ZPOOL_VERSION_10_FILES="zfs-pool-v10.dat" +export ZPOOL_VERSION_10_NAME="v10-pool" + +# v11 pool +export ZPOOL_VERSION_11_FILES="zfs-pool-v11.dat" +export ZPOOL_VERSION_11_NAME="v11-pool" + +# v12 pool +export ZPOOL_VERSION_12_FILES="zfs-pool-v12.dat" +export ZPOOL_VERSION_12_NAME="v12-pool" + +# v13 pool +export ZPOOL_VERSION_13_FILES="zfs-pool-v13.dat" +export ZPOOL_VERSION_13_NAME="v13-pool" + +# v14 pool +export ZPOOL_VERSION_14_FILES="zfs-pool-v14.dat" +export ZPOOL_VERSION_14_NAME="v14-pool" + +# v15 pool +export ZPOOL_VERSION_15_FILES="zfs-pool-v15.dat" +export ZPOOL_VERSION_15_NAME="v15-pool" + +# This pool is a v2 pool, with device problems on one side of the mirror +# so that the pool appears as DEGRADED +export ZPOOL_VERSION_2brokenmirror_FILES="zfs-broken-mirror1.dat \ +zfs-broken-mirror2.dat" +export ZPOOL_VERSION_2brokenmirror_NAME="zfs-broken-mirror" + + +# This pool is a v999 pool (an unknown version) which can be used to check +# whether upgrade, import or other tests that should fail against unknown +# pool versions should fail. It should not be listed in the CONFIGS +# variable below, as these are pool versions that can be imported and upgraded +export ZPOOL_VERSION_9999_FILES="zfs-pool-v999.dat" +export ZPOOL_VERSION_9999_NAME="v999-pool" + + +# This is a list of pool configurations we should be able to upgrade from, +# each entry should have corresponding ZPOOL_VERSION_*_FILES and +# ZPOOL_VERSION_*_NAME variables defined above. +export CONFIGS="1 1stripe 1raidz 1mirror \ +2 2stripe 2raidz 2mirror 2brokenmirror \ +3 3stripe 3raidz 3mirror 3dblraidz 3hotspare 4 5 6 7 8 9 10 11 12 13 14 15" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib new file mode 100644 index 0000000000..afe8594467 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib @@ -0,0 +1,162 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.cfg + +# This part of the test suite relies on variables being setup in the +# zpool_upgrade.cfg script. Those variables give us details about which +# files make up the pool, and what the pool name is. + + +# A function to import a pool from files we have stored in the test suite +# We import the pool, and create some random data in the pool. +# $1 a version number we can use to get information about the pool +function create_old_pool +{ + VERSION=$1 + POOL_FILES=$(eval $ECHO \$ZPOOL_VERSION_${VERSION}_FILES) + POOL_NAME=$(eval $ECHO \$ZPOOL_VERSION_${VERSION}_NAME) + + log_note "Creating $POOL_NAME from $POOL_FILES" + for pool_file in $POOL_FILES; do + log_must $BZCAT \ + $STF_SUITE/tests/functional/cli_root/zpool_upgrade/blockfiles/$pool_file.bz2 \ + >/$TESTPOOL/$pool_file + done + log_must $ZPOOL import -d /$TESTPOOL $POOL_NAME + + # Now put some random contents into the pool. + COUNT=0 + while [ $COUNT -lt 1024 ]; do + $DD if=/dev/urandom of=/$POOL_NAME/random.$COUNT \ + count=1 bs=1024 > /dev/null 2>&1 + COUNT=$(( $COUNT + 1 )) + done +} + + +# A function to check the contents of a pool, upgrade it to the current version +# and then verify that the data is consistent after upgrading. Note that we're +# not using "zpool status -x" to see if the pool is healthy, as it's possible +# to also upgrade faulted, or degraded pools. +# $1 a version number we can use to get information about the pool +function check_upgrade { + VERSION=$1 + POOL_FILES=$(eval $ECHO \$ZPOOL_VERSION_${VERSION}_FILES) + POOL_NAME=$(eval $ECHO \$ZPOOL_VERSION_${VERSION}_NAME) + + log_note "Checking if we can upgrade from ZFS version ${VERSION}." + PRE_UPGRADE_CHECKSUM=$(check_pool $POOL_NAME pre ) + log_must $ZPOOL upgrade $POOL_NAME > /dev/null + POST_UPGRADE_CHECKSUM=$(check_pool $POOL_NAME post ) + + log_note "Checking that there are no differences between checksum output" + log_must $DIFF $PRE_UPGRADE_CHECKSUM $POST_UPGRADE_CHECKSUM + $RM $PRE_UPGRADE_CHECKSUM $POST_UPGRADE_CHECKSUM +} + +# A function to destroy an upgraded pool, plus the files it was based on. +# $1 a version number we can use to get information about the pool +function destroy_upgraded_pool { + VERSION=$1 + POOL_FILES=$(eval $ECHO \$ZPOOL_VERSION_${VERSION}_FILES) + POOL_NAME=$(eval $ECHO \$ZPOOL_VERSION_${VERSION}_NAME) + + if poolexists $POOL_NAME; then + log_must $ZPOOL destroy $POOL_NAME + fi + for file in $POOL_FILES; do + if [ -e /$TESTPOOL/$file ]; then + $RM /$TESTPOOL/$file + fi + done +} + +# This function does a basic sanity check on the pool by computing the +# checksums of all files in the pool, echoing the name of the file containing +# the checksum results. +# $1 the name of the pool +# $2 a flag we can use to determine when this check is being performed +# (ie. pre or post pool-upgrade) +function check_pool { # pool state + POOL=$1 + STATE=$2 + $FIND /$POOL -type f -exec $CKSUM {} + > \ + /$TESTPOOL/pool-checksums.$POOL.$STATE + echo /$TESTPOOL/pool-checksums.$POOL.$STATE +} + +# This function simply checks that a pool has a particular version number +# as reported by zdb and zpool upgrade -v +# $1 the name of the pool +# $2 the version of the pool we expect to see +function check_poolversion { # pool version + + POOL=$1 + VERSION=$2 + + # check version using zdb + ACTUAL=$($ZDB -C $POOL | $SED -n 's/version: \(.*\)$/\1/p') + + if [ $ACTUAL != $VERSION ] + then + log_fail "$POOL not upgraded, ver. $ACTUAL, expected $VERSION" + fi + + # check version using zpool upgrade + ACTUAL=$($ZPOOL upgrade | $GREP $POOL$ | \ + $AWK '{print $1}' | $SED -e 's/ //g') + if [ $ACTUAL != $VERSION ] + then + log_fail "$POOL reported version $ACTUAL, expected $VERSION" + fi +} + +# A simple function to get a random number between two bounds +# probably not the most efficient for large ranges, but it's okay. +# Note since we're using $RANDOM, 32767 is the largest number we +# can accept as the upper bound. +# $1 lower bound +# $2 upper bound +function random { # min max + + typeset MIN=$1 + typeset MAX=$2 + typeset RAND=0 + + while [ $RAND -lt $MIN ] + do + RAND=$(( $RANDOM % $MAX + 1)) + done + + echo $RAND +} + diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_001_pos.ksh new file mode 100644 index 0000000000..e727eef5a9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_001_pos.ksh @@ -0,0 +1,71 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.cfg + +# +# DESCRIPTION: +# Executing 'zpool upgrade -v' command succeeds, prints a description of legacy +# versions, and mentions feature flags. +# +# STRATEGY: +# 1. Execute the command +# 2. Verify a 0 exit status +# 3. Grep for version descriptions and 'feature flags' +# + +verify_runnable "global" + +log_assert "Executing 'zpool upgrade -v' command succeeds." + +log_must $ZPOOL upgrade -v + +# We also check that the usage message contains a description of legacy +# versions and a note about feature flags. + +log_must eval "$ZPOOL upgrade -v | $HEAD -1 | $GREP 'feature flags'" + +$ZPOOL upgrade -v > /tmp/zpool-versions.$$ + +# +# Current output for 'zpool upgrade -v' has different indent space +# for single and double digit version number. For example, +# 9 refquota and refreservation properties +# 10 Cache devices +# +for version in {1..28}; do + log_note "Checking for a description of pool version $version." + log_must eval "$AWK '/^ $version / { print $1 }' /tmp/zpool-versions.$$ | $GREP $version" +done +$RM /tmp/zpool-versions.$$ + +log_pass "Executing 'zpool upgrade -v' command succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_002_pos.ksh new file mode 100644 index 0000000000..aaaa54d4d9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_002_pos.ksh @@ -0,0 +1,59 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +# +# DESCRIPTION: +# import pools of all versions - zpool upgrade on each pools works +# +# STRATEGY: +# 1. Execute the command with several invalid options +# 2. Verify a 0 exit status for each +# + +verify_runnable "global" + +function cleanup +{ + destroy_upgraded_pool $config +} + +log_assert "Import pools of all versions - zpool upgrade on each pools works" +log_onexit cleanup + +# $CONFIGS gets set in the .cfg script +for config in $CONFIGS +do + create_old_pool $config + check_upgrade $config + destroy_upgraded_pool $config +done + +log_pass "Import pools of all versions - zpool upgrade on each pools works" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_003_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_003_pos.ksh new file mode 100644 index 0000000000..32d352d447 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_003_pos.ksh @@ -0,0 +1,57 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +# +# DESCRIPTION: +# Upgrading a pool that has already been upgraded succeeds. +# +# STRATEGY: +# 1. Upgrade a pool, then try to upgrade it again +# 2. Verify a 0 exit status +# + +verify_runnable "global" + +function cleanup +{ + destroy_upgraded_pool 1 +} + +log_assert "Upgrading a pool that has already been upgraded succeeds." +log_onexit cleanup + +# we just create a version 1 pool here +create_old_pool 1 +check_upgrade 1 +check_upgrade 1 +destroy_upgraded_pool 1 + +log_pass "Upgrading a pool that has already been upgraded succeeds." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_004_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_004_pos.ksh new file mode 100644 index 0000000000..961935f036 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_004_pos.ksh @@ -0,0 +1,90 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +# +# DESCRIPTION: +# zpool upgrade -a works +# +# STRATEGY: +# 1. Create all upgradable pools for this system, then upgrade -a +# 2. Verify a 0 exit status +# + +verify_runnable "global" + +function cleanup +{ + for config in $CONFIGS ; do + destroy_upgraded_pool $config + done +} + +log_assert "zpool upgrade -a works" +log_onexit cleanup + +TEST_POOLS= +# Now build all of our pools +for config in $CONFIGS +do + POOL_NAME=$(eval $ECHO \$ZPOOL_VERSION_${config}_NAME) + + TEST_POOLS="$TEST_POOLS $POOL_NAME" + create_old_pool $config + # a side effect of the check_pool here, is that we get a checksum written + # called /$TESTPOOL/pool-checksums.$POOL.pre + check_pool $POOL_NAME pre > /dev/null +done + +# upgrade them all at once +export __ZFS_POOL_RESTRICT="$TEST_POOLS" +log_must $ZPOOL upgrade -a +unset __ZFS_POOL_RESTRICT + +# verify their contents then destroy them +for config in $CONFIGS +do + POOL_NAME=$(eval $ECHO \$ZPOOL_VERSION_${config}_NAME) + + check_pool $POOL_NAME post > /dev/null + + # a side effect of the check_pool here, is that we get a checksum written + # called /$TESTPOOL/pool-checksums.$POOL_NAME.post + log_must $DIFF /$TESTPOOL/pool-checksums.$POOL_NAME.pre \ + /$TESTPOOL/pool-checksums.$POOL_NAME.post + + $RM /$TESTPOOL/pool-checksums.$POOL_NAME.pre /$TESTPOOL/pool-checksums.$POOL_NAME.post + destroy_upgraded_pool $config +done + +log_pass "zpool upgrade -a works" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_005_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_005_neg.ksh new file mode 100644 index 0000000000..63432f158e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_005_neg.ksh @@ -0,0 +1,61 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.cfg + +# +# DESCRIPTION: +# Variations of upgrade -v print usage message, return with non-zero status +# +# STRATEGY: +# 1. Execute the command with several invalid options +# 2. Verify a 0 exit status for each +# + +verify_runnable "global" + +set -A args "/tmp" "-?" "-va" "-v fakepool" "-a fakepool" + +log_assert "Variations of upgrade -v print usage message, \ + return with non-zero status" + +typeset -i i=0 + +while [[ $i -lt ${#args[*]} ]]; do + + log_mustnot $ZPOOL upgrade ${args[$i]} > /dev/null + + (( i = i + 1 )) +done + +log_pass "Variations of upgrade -v print usage message, \ + return with non-zero status" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_006_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_006_neg.ksh new file mode 100644 index 0000000000..af2963585d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_006_neg.ksh @@ -0,0 +1,60 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.cfg + +# +# DESCRIPTION: +# Attempting to upgrade a non-existent pool will return an error +# +# STRATEGY: +# 1. Verify a pool doesn't exist, then try to upgrade it +# 2. Verify a 0 exit status +# + +log_assert "Attempting to upgrade a non-existent pool will return an error" +NO_POOL=notapool +FOUND="" + +while [ -z "$FOUND" ] +do + $ZPOOL list $NO_POOL 2>&1 > /dev/null + if [ $? -ne 0 ] + then + FOUND="true" + log_mustnot $ZPOOL upgrade $NO_POOL + else + NO_POOL="${NO_POOL}x" + fi +done + +log_pass "Attempting to upgrade a non-existent pool will return an error" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_007_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_007_pos.ksh new file mode 100644 index 0000000000..da7f2718a6 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_007_pos.ksh @@ -0,0 +1,69 @@ +#!/usr/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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib +. $STF_SUITE/tests/functional/cli_root/zfs_upgrade/zfs_upgrade.kshlib + +# +# DESCRIPTION: +# import pools of all versions - verify the following operation not break. +# * zfs create -o version=<vers> <filesystem> +# * zfs upgrade [-V vers] <filesystem> +# * zfs set version=<vers> <filesystem> +# +# STRATEGY: +# 1. Import pools of all versions +# 2. Setup a test enviorment over the old pools. +# 3. Verify the commands related to 'zfs upgrade' succeed as expected. +# + +verify_runnable "global" + +function cleanup +{ + destroy_upgraded_pool $config +} + +log_assert "Import pools of all versions - 'zfs upgrade' on each pools works" +log_onexit cleanup + +# $CONFIGS gets set in the .cfg script +for config in $CONFIGS +do + create_old_pool $config + POOL_NAME=$(eval $ECHO \$ZPOOL_VERSION_${config}_NAME) + + default_check_zfs_upgrade $pool + destroy_upgraded_pool $config +done + +log_pass "Import pools of all versions - 'zfs upgrade' on each pools works" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_008_pos.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_008_pos.ksh new file mode 100644 index 0000000000..45dc8f784e --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_008_pos.ksh @@ -0,0 +1,79 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +# +# DESCRIPTION: +# +# Zpool upgrade should be able to upgrade pools to a given version using -V +# +# STRATEGY: +# 1. For all versions pools that can be upgraded on a given OS version +# (latest pool version - 1) +# 2. Pick a version that's a random number, greater than the version +# we're running. +# 3. Attempt to upgrade that pool to the given version +# 4. Check the pool was upgraded correctly. +# + +verify_runnable "global" + +function cleanup +{ + destroy_upgraded_pool $config +} + +log_assert \ + "Zpool upgrade should be able to upgrade pools to a given version using -V" + +log_onexit cleanup + +# We're just using the single disk version of the pool, which should be +# enough to determine if upgrade works correctly. Also set a MAX_VER +# variable, which specifies the highest version that we should expect +# a zpool upgrade operation to succeed from. (latest version - 1) +CONFIGS="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" +MAX_VER=15 + +for config in $CONFIGS +do + create_old_pool $config + pool=$(eval $ECHO \$ZPOOL_VERSION_${config}_NAME) + NEXT=$(random $config $MAX_VER) + log_must $ZPOOL upgrade -V $NEXT $pool + check_poolversion $pool $NEXT + destroy_upgraded_pool $config +done + +log_pass "zpool upgrade should be able to upgrade pools to a given version " \ + "using -V" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_009_neg.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_009_neg.ksh new file mode 100644 index 0000000000..bb304c0560 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_upgrade/zpool_upgrade_009_neg.ksh @@ -0,0 +1,70 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_upgrade/zpool_upgrade.kshlib + +# +# DESCRIPTION: +# +# Zpool upgrade -V shouldn't be able to upgrade a pool to an unknown version +# +# STRATEGY: +# 1. Take an existing pool +# 2. Attempt to upgrade it to an unknown version +# 3. Verify that the upgrade failed, and the pool version was still the original +# + +verify_runnable "global" + +function cleanup +{ + destroy_upgraded_pool $config +} + +log_assert \ +"Zpool upgrade -V shouldn't be able to upgrade a pool to an unknown version" + +# Create a version 2 pool +typeset -i config=2 +create_old_pool $config +pool=$(eval $ECHO \$ZPOOL_VERSION_${config}_NAME) + +# Attempt to upgrade it +log_mustnot $ZPOOL upgrade -V 999 $pool +log_mustnot $ZPOOL upgrade -V 999 + +# Verify we're still on the old version +check_poolversion $pool $config +destroy_upgraded_pool $config + +log_pass \ + "Zpool upgrade -V shouldn't be able to upgrade a pool to an unknown version" diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/Makefile b/usr/src/test/zfs-tests/tests/functional/nopwrite/Makefile new file mode 100644 index 0000000000..7d42a1fde1 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/Makefile @@ -0,0 +1,49 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/nopwrite + +PROGS = cleanup \ + nopwrite.shlib \ + nopwrite_copies \ + nopwrite_mtime \ + nopwrite_negative \ + nopwrite_promoted_clone \ + nopwrite_recsize \ + nopwrite_sync \ + nopwrite_varying_compression \ + nopwrite_volume \ + setup + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%.shlib: %.shlib + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/cleanup.ksh new file mode 100644 index 0000000000..8bec10c647 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/cleanup.ksh @@ -0,0 +1,20 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. ${STF_SUITE}/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite.shlib b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite.shlib new file mode 100644 index 0000000000..a03bc54123 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite.shlib @@ -0,0 +1,68 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/math.shlib + +export TESTVOL="testvol.nopwrite" +export VOLSIZE="256M" +export MEGS="64" + +function verify_nopwrite +{ + typeset origin=$1 + typeset snap=$2 + typeset clone=$3 + typeset low=1 + typeset high=99 + + $SYNC + for i in origin snap clone; do + for j in used refer usedbychildren written; do + typeset ${i}_$j=$(get_prop $j $(eval echo \$$i)) + done + done + + # + # If we are dealing with a volume, deduct the refreserv from the used + # value to prevent real failures from being masked by the unexpected + # extra space. Also, volumes use more space for metadata, so adjust the + # percentages to be more forgiving. + # + if [[ "$(get_prop type $origin)" = "volume" ]]; then + typeset rr=$(get_prop refreserv $origin) + ((origin_used -= rr )) + low=2 + high=98 + fi + + # These values should differ greatly with nopwrite. + within_percent $origin_used $clone_used $low && return 1 + within_percent $origin_refer $origin_usedbychildren $low && return 1 + within_percent $snap_written $clone_written $low && return 1 + + # These values should be nearly the same with nopwrite. + within_percent $origin_used $clone_refer $high || return 1 + within_percent $origin_used $snap_refer $high || return 1 + + # + # The comparisons below should pass regardless of nopwrite. They're + # here for sanity. + # + typeset deadlist=$($ZDB -Pddd $clone | $AWK '/Deadlist:/ {print $2}') + within_percent $deadlist $clone_written $high || return 1 + within_percent $snap_refer $snap_written $high || return 1 + + return 0 +} diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_copies.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_copies.ksh new file mode 100644 index 0000000000..c85fedc3ea --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_copies.ksh @@ -0,0 +1,71 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/nopwrite/nopwrite.shlib + +# +# Description: +# Verify that nopwrite is not enabled if the copies property changes +# +# Strategy: +# 1. Create a clone with copies set higher than the origin fs +# 2. Verify that nopwrite is in use. +# 3. Repeat with the number of copies decreased. +# + +verify_runnable "global" +origin="$TESTPOOL/$TESTFS" +log_onexit cleanup + +function cleanup +{ + datasetexists $origin && log_must $ZFS destroy -R $origin + log_must $ZFS create -o mountpoint=$TESTDIR $origin +} + +log_assert "nopwrite requires copies property to remain constant" + +# Verify nopwrite is disabled with increased redundancy +log_must $ZFS set compress=on $origin +log_must $ZFS set checksum=sha256 $origin +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "dd into $TESTDIR/file failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone $origin@a $origin/clone +$ZFS set copies=3 $origin/clone +$DD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." +log_mustnot verify_nopwrite $origin $origin@a $origin/clone + +# Verify nopwrite is disabled with decreased redundancy +$ZFS destroy -R $origin || log_fail "Couldn't destroy $origin" +$ZFS create -o mountpoint=$TESTDIR $origin || \ + log_fail "Couldn't recreate $origin" +log_must $ZFS set compress=on $origin +log_must $ZFS set copies=3 $origin +log_must $ZFS set checksum=sha256 $origin +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "dd into $TESTDIR/file failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone $origin@a $origin/clone +$ZFS set copies=1 $origin/clone +$DD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." +log_mustnot verify_nopwrite $origin $origin@a $origin/clone + +log_pass "nopwrite requires copies property to remain constant" diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_mtime.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_mtime.ksh new file mode 100644 index 0000000000..2a2d7b77b3 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_mtime.ksh @@ -0,0 +1,65 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/nopwrite/nopwrite.shlib + +# +# Description: +# Verify that nopwrite still updates file metadata correctly +# +# Strategy: +# 1. Create a clone with nopwrite enabled. +# 2. Write to the file in that clone and verify the mtime and ctime change, +# but the atime does not. +# + +verify_runnable "global" +origin="$TESTPOOL/$TESTFS" +log_onexit cleanup + +function cleanup +{ + datasetexists $origin && log_must $ZFS destroy -R $origin + log_must $ZFS create -o mountpoint=$TESTDIR $origin +} + +log_assert "nopwrite updates file metadata correctly" + +log_must $ZFS set compress=on $origin +log_must $ZFS set checksum=sha256 $origin +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "dd into $TESTDIR/file failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone $origin@a $origin/clone + +o_atime=$($LS -E% all $TESTDIR/clone/file | $AWK '/atime/ {print $4}') +o_ctime=$($LS -E% all $TESTDIR/clone/file | $AWK '/ctime/ {print $4}') +o_mtime=$($LS -E% all $TESTDIR/clone/file | $AWK '/mtime/ {print $4}') +$DD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." +atime=$($LS -E% all $TESTDIR/clone/file | $AWK '/atime/ {print $4}') +ctime=$($LS -E% all $TESTDIR/clone/file | $AWK '/ctime/ {print $4}') +mtime=$($LS -E% all $TESTDIR/clone/file | $AWK '/mtime/ {print $4}') + +[[ $o_atime = $atime ]] || log_fail "atime changed: $o_atime $atime" +[[ $o_ctime = $ctime ]] && log_fail "ctime unchanged: $o_ctime $ctime" +[[ $o_mtime = $mtime ]] && log_fail "mtime unchanged: $o_mtime $mtime" + +log_must verify_nopwrite $origin $origin@a $origin/clone + +log_pass "nopwrite updates file metadata correctly" diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_negative.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_negative.ksh new file mode 100644 index 0000000000..0ac87888dd --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_negative.ksh @@ -0,0 +1,90 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/nopwrite/nopwrite.shlib + +# +# Description: +# Verify that duplicate writes to a clone are accounted as new data if the +# prerequisites for nopwrite are not met. +# +# Scenarios: +# 1. The file in the origin ds is written without compression or sha256. +# 2. The file in the origin ds is written before sha256 checksum is turned on. +# 3. The clone does not have compression. +# 4. The clone does not have the appropriate checksum. +# + +verify_runnable "global" +origin="$TESTPOOL/$TESTFS" +log_onexit cleanup + +function cleanup +{ + datasetexists $origin && log_must $ZFS destroy -R $origin + log_must $ZFS create -o mountpoint=$TESTDIR $origin +} + +log_assert "nopwrite isn't enabled without the prerequisites" + +# Data written into origin fs without compression or sha256 +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "dd of $TESTDIR/file failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone -o compress=on $origin@a $origin/clone +log_must $ZFS set checksum=sha256 $origin/clone +$DD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." +log_mustnot verify_nopwrite $origin $origin@a $origin/clone +$ZFS destroy -R $origin@a || log_fail "zfs destroy failed" +log_must $RM -f $TESTDIR/file + +# Data written to origin fs before checksum enabled +log_must $ZFS set compress=on $origin +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "dd into $TESTDIR/file failed." +log_must $ZFS set checksum=sha256 $origin +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone $origin@a $origin/clone +$DD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." +log_mustnot verify_nopwrite $origin $origin@a $origin/clone +$ZFS destroy -R $origin@a || log_fail "zfs destroy failed" +log_must $RM -f $TESTDIR/file + +# Clone with compression=off +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "dd into $TESTDIR/file failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone -o compress=off $origin@a $origin/clone +$DD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." +log_mustnot verify_nopwrite $origin $origin@a $origin/clone +$ZFS destroy -R $origin@a || log_fail "zfs destroy failed" +log_must $RM -f $TESTDIR/file + +# Clone with fletcher4, rather than sha256 +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "dd into $TESTDIR/file failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone -o checksum=fletcher4 $origin@a $origin/clone +$DD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." +log_mustnot verify_nopwrite $origin $origin@a $origin/clone + +log_pass "nopwrite isn't enabled without the prerequisites" diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_promoted_clone.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_promoted_clone.ksh new file mode 100644 index 0000000000..2e0816ea37 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_promoted_clone.ksh @@ -0,0 +1,58 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/nopwrite/nopwrite.shlib + +# +# Description: +# Verify that nopwrite still works for a dataset that becomes a clone via +# promotion. +# +# Strategy: +# 1. Create a clone suitable for nopwrite. +# 2. Disable compression and checksum on the clone, and promote it. +# 3. Overwrite the file in the clone (former origin fs) and verify it +# consumes no additional space. +# + +verify_runnable "global" +origin="$TESTPOOL/$TESTFS" +log_onexit cleanup + +function cleanup +{ + datasetexists $origin && log_must $ZFS destroy -R $TESTPOOL/clone + log_must $ZFS create -o mountpoint=$TESTDIR $origin +} + +log_assert "nopwrite works on a dataset that becomes a clone via promotion." + +log_must $ZFS set compress=on $origin +log_must $ZFS set checksum=sha256 $origin +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "dd into $TESTDIR/file failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone $origin@a $TESTPOOL/clone +log_must $ZFS set compress=off $TESTPOOL/clone +log_must $ZFS set checksum=off $TESTPOOL/clone +log_must $ZFS promote $TESTPOOL/clone +$DD if=/$TESTPOOL/clone/file of=/$TESTDIR/file bs=1024k count=$MEGS \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." +log_must verify_nopwrite $TESTPOOL/clone $TESTPOOL/clone@a $origin + +log_pass "nopwrite works on a dataset that becomes a clone via promotion." diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_recsize.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_recsize.ksh new file mode 100644 index 0000000000..fea9fb90a7 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_recsize.ksh @@ -0,0 +1,57 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/nopwrite/nopwrite.shlib + +# +# Description: +# Verify that nopwrite works regardless of recsize property setting. +# +# Strategy: +# 1. Create an origin fs that's suitable to make nopwrite clones. +# 2. For each possible recsize, create a clone that inherits the compress and +# checksum, and verify overwriting the origin file consumes no new space. +# + +verify_runnable "global" +origin="$TESTPOOL/$TESTFS" +log_onexit cleanup + +function cleanup +{ + datasetexists $origin && log_must $ZFS destroy -R $origin + log_must $ZFS create -o mountpoint=$TESTDIR $origin +} + +log_assert "nopwrite updates file metadata correctly" + +log_must $ZFS set compress=on $origin +log_must $ZFS set checksum=sha256 $origin +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "dd into $TESTDIR/file failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone $origin@a $origin/clone + +for rs in 512 1024 2048 4096 8192 16384 32768 65536 131072 ; do + log_must $ZFS set recsize=$rs $origin/clone + $DD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + conv=notrunc >/tmp/null 2>&1 || log_fail "dd failed." + log_must verify_nopwrite $origin $origin@a $origin/clone +done + +log_pass "nopwrite updates file metadata correctly" diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_sync.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_sync.ksh new file mode 100644 index 0000000000..b64223e877 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_sync.ksh @@ -0,0 +1,55 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/nopwrite/nopwrite.shlib + +# +# Description: +# Verify that nopwrite works for sync writes +# +# Strategy: +# 1. Create an origin fs with compression and sha256. +# 2. Clone origin such that it inherits the properies. +# 3. Use dd with the sync flag to test the sync write path. +# + +verify_runnable "global" +origin="$TESTPOOL/$TESTFS" +log_onexit cleanup + +function cleanup +{ + datasetexists $origin && log_must $ZFS destroy -R $origin + log_must $ZFS create -o mountpoint=$TESTDIR $origin +} + +log_assert "nopwrite works for sync writes" + +log_must $ZFS set compress=on $origin +log_must $ZFS set checksum=sha256 $origin +$GNUDD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS oflag=sync \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd into $TESTDIR/file failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone $origin@a $origin/clone + +$GNUDD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + oflag=sync conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." + +log_must verify_nopwrite $origin $origin@a $origin/clone + +log_pass "nopwrite works for sync writes" diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_varying_compression.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_varying_compression.ksh new file mode 100644 index 0000000000..b88acd5e9b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_varying_compression.ksh @@ -0,0 +1,64 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/include/properties.shlib +. $STF_SUITE/tests/functional/nopwrite/nopwrite.shlib + +# +# Description: +# Verify that if the checksum on the origin and clone is sha256, any compression +# algorithm enables nopwrite. +# +# Strategy: +# 1. Create an origin dataset with compression and sha256 checksum. +# 2. Write a 64M file into the origin dataset. +# 3. For each of 4 randomly chosen compression types: +# 3a. Create a snap and clone (inheriting the checksum property) of the origin. +# 3b. Apply the compression property to the clone. +# 3c. Write the same 64M of data into the file that exists in the clone. +# 3d. Verify that no new space was consumed. +# + +verify_runnable "global" +origin="$TESTPOOL/$TESTFS" +log_onexit cleanup + +function cleanup +{ + datasetexists $origin && log_must $ZFS destroy -R $origin + log_must $ZFS create -o mountpoint=$TESTDIR $origin +} + +log_assert "nopwrite works with sha256 and any compression algorithm" + +log_must $ZFS set compress=on $origin +log_must $ZFS set checksum=sha256 $origin +$DD if=/dev/urandom of=$TESTDIR/file bs=1024k count=$MEGS conv=notrunc \ + >/dev/null 2>&1 || log_fail "initial dd failed." + +# Verify nop_write for 4 random compression algorithms +for i in $(get_rand_compress 4); do + $ZFS snapshot $origin@a || log_fail "zfs snap failed" + log_must $ZFS clone -o compress=$i $origin@a $origin/clone + $DD if=/$TESTDIR/file of=/$TESTDIR/clone/file bs=1024k count=$MEGS \ + conv=notrunc >/dev/null 2>&1 || log_fail "dd failed." + log_must verify_nopwrite $origin $origin@a $origin/clone + $ZFS destroy -R $origin@a || log_fail "zfs destroy failed" +done + +log_pass "nopwrite works with sha256 and any compression algorithm" diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_volume.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_volume.ksh new file mode 100644 index 0000000000..f00b1999c8 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/nopwrite_volume.ksh @@ -0,0 +1,58 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/nopwrite/nopwrite.shlib + +# +# Description: +# Verify that nopwrite cannot be enabled on volumes +# +# Strategy: +# 1. Create a clone of a volume that fits the criteria for nopwrite. +# 2. Overwrite the same blocks from the origin vol and verify that +# new space is consumed. +# + +verify_runnable "global" +origin="$TESTPOOL/$TESTVOL" +clone="$TESTPOOL/clone" +vol="/dev/zvol/rdsk/$origin" +volclone="/dev/zvol/rdsk/$clone" +log_onexit cleanup + +function cleanup +{ + datasetexists $origin && log_must $ZFS destroy -R $origin + # No need to recreate the volume as no other tests expect it. +} + +log_assert "nopwrite works on volumes" + +log_must $ZFS set compress=on $origin +log_must $ZFS set checksum=sha256 $origin +$DD if=/dev/urandom of=$vol bs=8192 count=4096 conv=notrunc >/dev/null \ + 2>&1 || log_fail "dd into $orgin failed." +$ZFS snapshot $origin@a || log_fail "zfs snap failed" +log_must $ZFS clone $origin@a $clone +log_must $ZFS set compress=on $clone +log_must $ZFS set checksum=sha256 $clone +$DD if=$vol of=$volclone bs=8192 count=4096 conv=notrunc >/dev/null 2>&1 || \ + log_fail "dd into $clone failed." +log_must verify_nopwrite $origin $origin@a $clone + +log_pass "nopwrite works on volumes" diff --git a/usr/src/test/zfs-tests/tests/functional/nopwrite/setup.ksh b/usr/src/test/zfs-tests/tests/functional/nopwrite/setup.ksh new file mode 100644 index 0000000000..1e45e09830 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/nopwrite/setup.ksh @@ -0,0 +1,23 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +. ${STF_SUITE}/include/libtest.shlib +. ${STF_SUITE}/tests/functional/nopwrite/nopwrite.shlib + +disk=${DISKS%% *} + +default_volume_setup $disk diff --git a/usr/src/test/zfs-tests/tests/functional/truncate/Makefile b/usr/src/test/zfs-tests/tests/functional/truncate/Makefile new file mode 100644 index 0000000000..7e6a4c8cc5 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/truncate/Makefile @@ -0,0 +1,43 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +include $(SRC)/Makefile.master + +ROOTOPTPKG = $(ROOT)/opt/zfs-tests +TESTDIR = $(ROOTOPTPKG)/tests/functional/truncate + +PROGS = cleanup \ + setup \ + truncate.cfg \ + truncate_001_pos \ + truncate_002_pos + +CMDS = $(PROGS:%=$(TESTDIR)/%) +$(CMDS) := FILEMODE = 0555 + +all lint clean clobber: + +install: $(CMDS) + +$(CMDS): $(TESTDIR) + +$(TESTDIR): + $(INS.dir) + +$(TESTDIR)/%.cfg: %.cfg + $(INS.file) + +$(TESTDIR)/%: %.ksh + $(INS.rename) diff --git a/usr/src/test/zfs-tests/tests/functional/truncate/cleanup.ksh b/usr/src/test/zfs-tests/tests/functional/truncate/cleanup.ksh new file mode 100644 index 0000000000..f33c052946 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/truncate/cleanup.ksh @@ -0,0 +1,30 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. ${STF_SUITE}/include/libtest.shlib + +default_cleanup diff --git a/usr/src/test/zfs-tests/tests/functional/truncate/setup.ksh b/usr/src/test/zfs-tests/tests/functional/truncate/setup.ksh new file mode 100644 index 0000000000..06e66bad75 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/truncate/setup.ksh @@ -0,0 +1,32 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. ${STF_SUITE}/include/libtest.shlib + +disk=${DISKS%% *} + +default_setup $disk diff --git a/usr/src/test/zfs-tests/tests/functional/truncate/truncate.cfg b/usr/src/test/zfs-tests/tests/functional/truncate/truncate.cfg new file mode 100644 index 0000000000..703ff50b50 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/truncate/truncate.cfg @@ -0,0 +1,32 @@ +# +# 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 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +export TESTFILE=testfile.$$ +export TRUNC_FILESIZE=${TRUNC_FILESIZE-"67108864"} # 64 Mb +export TRUNC_BLKSIZE=${TRUNC_BLKSIZE-"512"} +export TRUNC_SEED=${TRUNC_SEED-""} +export TRUNC_FILEOFFSET=${TRUNC_FILEOFFSET-""} +export TRUNC_COUNT=${TRUNC_COUNT-"16384"} # FILESIZE/BLKSIZE/8 diff --git a/usr/src/test/zfs-tests/tests/functional/truncate/truncate_001_pos.ksh b/usr/src/test/zfs-tests/tests/functional/truncate/truncate_001_pos.ksh new file mode 100644 index 0000000000..b3aaa3afed --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/truncate/truncate_001_pos.ksh @@ -0,0 +1,75 @@ +#!/usr/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 2009 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/truncate/truncate.cfg +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Tests file truncation within ZFS. +# +# STRATEGY: +# 1. Open file +# 2. Write random blocks in random places +# 3. Truncate the file +# 4. Repeat steps 2 and 3 lots of times +# 5. Close the file. +# + +verify_runnable "global" + +function cleanup +{ + [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/* +} + +log_assert "Ensure file with random blocks is truncated properly" + +options="" +options_display="default options" + +log_onexit cleanup + +[[ -n "$TRUNC_FILESIZE" ]] && options=" $options -f $TRUNC_FILESIZE " + +[[ -n "$TRUNC_BLKSIZE" ]] && options="$options -b $TRUNC_BLKSIZE " + +[[ -n "$TRUNC_COUNT" ]] && options="$options -c $TRUNC_COUNT " + +[[ -n "$TRUNC_SEED" ]] && options="$options -s $TRUNC_SEED " + +[[ -n "$TRUNC_FILEOFFSET" ]] && options="$options -o $TRUNC_FILEOFFSET " + +[[ -n "$options" ]] && options_display=$options + +log_note "Invoking $FILE_TRUNC with: $options_display" +log_must $FILE_TRUNC $options $TESTDIR/$TESTFILE + +typeset dir=$(get_device_dir $DISKS) +verify_filesys "$TESTPOOL" "$TESTPOOL/$TESTFS" "$dir" + +log_pass "Random blocks have been truncated properly." diff --git a/usr/src/test/zfs-tests/tests/functional/truncate/truncate_002_pos.ksh b/usr/src/test/zfs-tests/tests/functional/truncate/truncate_002_pos.ksh new file mode 100644 index 0000000000..4849dff509 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/truncate/truncate_002_pos.ksh @@ -0,0 +1,63 @@ +#!/usr/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 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +. $STF_SUITE/tests/functional/truncate/truncate.cfg +. $STF_SUITE/include/libtest.shlib + +# +# DESCRIPTION: +# Tests file truncation within ZFS while a sync operation is in progress. +# +# STRATEGY: +# 1. Copy a file to ZFS filesystem +# 2. Copy /dev/null to same file on ZFS filesystem +# 3. Execute a sync command +# + +verify_runnable "both" + +function cleanup +{ + [[ -e $TESTDIR ]] && log_must $RM -rf $TESTDIR/* + [[ -f $srcfile ]] && $RM -f $srcfile +} + +log_assert "Ensure zeroed file gets written correctly during a sync operation" + +srcfile="/tmp/cosmo.$$" +log_must $DD if=/dev/urandom of=$srcfile bs=1024k count=1 + +log_onexit cleanup +log_must $CP $srcfile $TESTDIR/$TESTFILE +log_must $CP /dev/null $TESTDIR/$TESTFILE +log_must $SYNC +if [[ -s $TESTDIR/$TESTFILE ]]; then + log_note "$($LS -l $TESTDIR/$TESTFILE)" + log_fail "testfile not truncated" +fi + +log_pass "Successful truncation while a sync operation is in progress." diff --git a/usr/src/test/zfs-tests/tests/stress/Makefile b/usr/src/test/zfs-tests/tests/stress/Makefile new file mode 100644 index 0000000000..265d87942f --- /dev/null +++ b/usr/src/test/zfs-tests/tests/stress/Makefile @@ -0,0 +1,20 @@ +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2012 by Delphix. All rights reserved. +# + +.PARALLEL: $(SUBDIRS) + +SUBDIRS = + +include $(SRC)/test/Makefile.com |