aboutsummaryrefslogtreecommitdiffstats
path: root/tests/zfs-tests/include/properties.shlib
blob: a6a33891208c7f375e6a9573d9b766bb52e44cc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#
# 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, 2016, Delphix. All rights reserved.
#

. $STF_SUITE/include/libtest.shlib

typeset -a compress_prop_vals=('off' 'lzjb' 'lz4' 'gzip' 'zle')
typeset -a checksum_prop_vals=('on' 'off' 'fletcher2' 'fletcher4' 'sha256'
    'noparity' 'sha512' 'skein')
if ! is_freebsd; then
	checksum_prop_vals+=('edonr')
fi
typeset -a recsize_prop_vals=('512' '1024' '2048' '4096' '8192' '16384'
    '32768' '65536' '131072' '262144' '524288' '1048576')
typeset -a canmount_prop_vals=('on' 'off' 'noauto')
typeset -a copies_prop_vals=('1' '2' '3')
typeset -a logbias_prop_vals=('latency' 'throughput')
typeset -a primarycache_prop_vals=('all' 'none' 'metadata')
typeset -a redundant_metadata_prop_vals=('all' 'most')
typeset -a secondarycache_prop_vals=('all' 'none' 'metadata')
typeset -a snapdir_prop_vals=('hidden' 'visible')
typeset -a sync_prop_vals=('standard' 'always' 'disabled')

typeset -a fs_props=('compress' 'checksum' 'recsize'
    'canmount' 'copies' 'logbias' 'primarycache' 'redundant_metadata'
    'secondarycache' 'snapdir' 'sync')
typeset -a vol_props=('compress' 'checksum' 'copies' 'logbias' 'primarycache'
    'secondarycache' 'redundant_metadata' 'sync')

#
# Given the 'prop' passed in, return 'num_vals' elements of the corresponding
# values array to the user, excluding any elements below 'first.' This allows
# us to exclude 'off' and 'on' which can be either unwanted, or a duplicate of
# another property respectively.
#
function get_rand_prop_vals
{
	typeset prop=$1
	typeset -i num_vals=$2
	typeset -i first=$3

	[[ -z $prop || -z $num_vals || -z $first ]] && \
	    log_fail "get_rand_prop_vals: bad arguments"

	typeset retstr=""

	typeset prop_vals_var=${prop}_prop_vals
	typeset -a prop_vals=($(eval echo \${${prop_vals_var}[@]}))

	[[ -z $prop_vals ]] && \
	    log_fail "get_rand_prop_vals: bad prop $prop"

	typeset -i last=$((${#prop_vals[@]} - 1))
	typeset -i i
	for i in $(range_shuffle $first $last | head -n $num_vals); do
		retstr="${prop_vals[$i]} $retstr"
	done
	echo $retstr
}

function get_rand_checksum
{
	get_rand_prop_vals checksum $1 2
}

function get_rand_checksum_any
{
	get_rand_prop_vals checksum $1 0
}

function get_rand_recsize
{
	get_rand_prop_vals recsize $1 0
}

function get_rand_large_recsize
{
	get_rand_prop_vals recsize $1 9
}

#
# Functions to toggle on/off properties
#
typeset -a binary_props=('atime' 'devices' 'exec' 'readonly' 'setuid' 'xattr')

if is_freebsd; then
	binary_props+=('jailed')
else
	binary_props+=('zoned')
fi

if is_linux; then
	# Only older kernels support non-blocking mandatory locks
	if [[ $(linux_version) -lt $(linux_version "4.4") ]]; then
		binary_props+=('nbmand')
	fi
else
	binary_props+=('nbmand')
fi

function toggle_prop
{
	typeset ds=$1
	typeset prop=$2

	datasetexists $ds || log_fail "$ds does not exist"
	typeset val=$(get_prop $prop $ds)
	typeset newval='off'

	[[ $val = $newval ]] && newval='on'
	log_must zfs set $prop=$newval $ds
}

function toggle_binary_props
{
	typeset ds=$1
	typeset prop

	for prop in "${binary_props[@]}"; do
		toggle_prop $ds $prop
	done
}

function randomize_ds_props
{
	typeset ds=$1
	typeset prop proplist val

	datasetexists $ds || log_fail "$ds does not exist"
	if ds_is_volume $ds; then
		toggle_prop $ds readonly
		proplist="${vol_props[@]}"
	elif ds_is_filesystem $ds; then
		toggle_binary_props $ds
		proplist="${fs_props[@]}"
	else
		log_fail "$ds is neither a volume nor a file system"
	fi

	for prop in $proplist; do
		typeset val=$(get_rand_prop_vals $prop 1 0)
		log_must zfs set $prop=$val $ds
	done
}