diff options
author | Jason King <[email protected]> | 2020-02-14 15:41:42 -0600 |
---|---|---|
committer | GitHub <[email protected]> | 2020-02-14 13:41:42 -0800 |
commit | 13b5a4d5c018f94d04efefcec6205aa73205e05f (patch) | |
tree | 8cc7dce83989cd6bceac7735344c651e1b9919c1 /tests | |
parent | 4fe3a842bb53e7cebcdcd69deae758ccfb0660e9 (diff) |
Support setting user properties in a channel program
This adds support for setting user properties in a
zfs channel program by adding 'zfs.sync.set_prop'
and 'zfs.check.set_prop' to the ZFS LUA API.
Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Matt Ahrens <[email protected]>
Co-authored-by: Sara Hartse <[email protected]>
Contributions-by: Jason King <[email protected]>
Signed-off-by: Sara Hartse <[email protected]>
Signed-off-by: Jason King <[email protected]>
Closes #9950
Diffstat (limited to 'tests')
4 files changed, 151 insertions, 1 deletions
diff --git a/tests/runfiles/common.run b/tests/runfiles/common.run index dfdc5ee58..3c71458eb 100644 --- a/tests/runfiles/common.run +++ b/tests/runfiles/common.run @@ -85,7 +85,7 @@ tests = ['tst.destroy_fs', 'tst.destroy_snap', 'tst.get_count_and_limit', 'tst.list_snapshots', 'tst.list_system_props', 'tst.list_user_props', 'tst.parse_args_neg','tst.promote_conflict', 'tst.promote_multiple', 'tst.promote_simple', 'tst.rollback_mult', - 'tst.rollback_one', 'tst.snapshot_destroy', 'tst.snapshot_neg', + 'tst.rollback_one', 'tst.set_props', 'tst.snapshot_destroy', 'tst.snapshot_neg', 'tst.snapshot_recursive', 'tst.snapshot_simple', 'tst.bookmark.create', 'tst.bookmark.copy', 'tst.terminate_by_signal' diff --git a/tests/zfs-tests/tests/functional/channel_program/synctask_core/Makefile.am b/tests/zfs-tests/tests/functional/channel_program/synctask_core/Makefile.am index e74c5223b..4d9aa9ceb 100644 --- a/tests/zfs-tests/tests/functional/channel_program/synctask_core/Makefile.am +++ b/tests/zfs-tests/tests/functional/channel_program/synctask_core/Makefile.am @@ -27,6 +27,7 @@ dist_pkgdata_SCRIPTS = \ tst.promote_simple.ksh \ tst.rollback_mult.ksh \ tst.rollback_one.ksh \ + tst.set_props.ksh \ tst.snapshot_destroy.ksh \ tst.snapshot_neg.ksh \ tst.snapshot_recursive.ksh \ @@ -43,6 +44,7 @@ dist_pkgdata_DATA = \ tst.get_string_props.out \ tst.get_string_props.zcp \ tst.promote_conflict.zcp \ + tst.set_props.zcp \ tst.snapshot_destroy.zcp \ tst.snapshot_neg.zcp \ tst.snapshot_recursive.zcp \ diff --git a/tests/zfs-tests/tests/functional/channel_program/synctask_core/tst.set_props.ksh b/tests/zfs-tests/tests/functional/channel_program/synctask_core/tst.set_props.ksh new file mode 100755 index 000000000..6ac1c2b20 --- /dev/null +++ b/tests/zfs-tests/tests/functional/channel_program/synctask_core/tst.set_props.ksh @@ -0,0 +1,39 @@ +#!/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) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/channel_program/channel_common.kshlib + +# +# DESCRIPTION: +# Setting user props should work correctly on datasets. +# + +verify_runnable "global" + +fs=$TESTPOOL/$TESTFS/testchild + +function cleanup +{ + destroy_dataset $fs "-R" +} + +log_onexit cleanup + +log_must zfs create $fs + +log_must_program_sync $TESTPOOL $ZCP_ROOT/synctask_core/tst.set_props.zcp $fs + +log_pass "Setting props from channel program works correctly." diff --git a/tests/zfs-tests/tests/functional/channel_program/synctask_core/tst.set_props.zcp b/tests/zfs-tests/tests/functional/channel_program/synctask_core/tst.set_props.zcp new file mode 100644 index 000000000..eade17aa8 --- /dev/null +++ b/tests/zfs-tests/tests/functional/channel_program/synctask_core/tst.set_props.zcp @@ -0,0 +1,109 @@ +-- +-- 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) 2017 by Delphix. All rights reserved. +-- Copyright 2020 Joyent, Inc. +-- + +arg = ... +fs = arg["argv"][1] + +-- values from zfs.h +maxname = 256 -- ZAP_MAXNAMELEN +maxvalue = 8192 -- ZAP_MAXVALUELEN + +pos_props = {} +neg_props = {} + +-- In lua, strings are immutable, so to avoid a bunch of copies, we +-- build the value in a table and use concat (which appears to be the +-- recommend method for such things). +largeprop = {} +for i = 0,maxvalue,8 +do + table.insert(largeprop, "aaaaaaaa") +end +-- add an extra character so we spill over the limit +table.insert(largeprop, "b") + +largepropv = table.concat(largeprop) + +largepropname = { "b:" } +for i = 0,maxname,8 +do + table.insert(largepropname, "aaaaaaaa") +end +largepropnamev = table.concat(largepropname) + +pos_props["a:prop"] = {"hello"} + +-- For neg_props, an optional expected error value can be added after the +-- property value as seen below. +neg_props["notaproperty"] = {"hello", EINVAL} +neg_props["a:very.long.property.value"] = { largepropv, E2BIG } +neg_props[largepropnamev] = {"greetings", ENAMETOOLONG } + +-- non-user properties aren't currently supported +-- Even if they were, the argument must be a string due to requirements of +-- the ZCP api. +neg_props["mountpoint"] = {"/foo/bar"} +neg_props["copies"] = { "2" } + +-- read-only properties should never succeed +neg_props["guid"] = { "12345" } + +set_fail = {} +val_fail = {} + +-- Test properies that should work +for prop, values in pairs(pos_props) do + for i, val in ipairs(values) do + old_val, src = zfs.get_prop(fs, prop) + + -- Attempt to set the property to the specified value + err = zfs.sync.set_prop(fs, prop, val) + + if (err ~= 0) then + set_fail[prop] = err -- tuple of prop, val that resulted in error + else + -- use get_prop to check that the set took affect + new_val, src = zfs.get_prop(fs, prop) + if (tostring(new_val) ~= tostring(val)) then + val_fail[prop] = new_val + end + + -- We modified the prop, restore old value (if one existed) + if (old_val ~= nil) then + err = zfs.sync.set_prop(fs, prop, old_val) + if (err ~= 0) then return err end + else + -- Didn't have an old value, delete (inherit) instead + err = zfs.sync.inherit(fs, prop) + if (err ~= 0) then return err end + end + end + end +end + +-- Test properies that should fail +for prop, expected in pairs(neg_props) do + exp_val = expected[1] + exp_err = expected[2] + + -- Attempt to set the property to the specified value + err = zfs.sync.set_prop(fs, prop, exp_val) + if (err == 0 or (exp_err ~= nil and err ~= exp_err)) then + set_fail[prop] = err -- tuple of prop, val that resulted in error + end +end + +return {set_fail, val_fail} |