#
# 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 by Delphix. All rights reserved.
#

typeset -a compress_prop_vals=('on' 'off' 'lzjb' 'gzip' 'gzip-1' 'gzip-2'
    'gzip-3' 'gzip-4' 'gzip-5' 'gzip-6' 'gzip-7' 'gzip-8' 'gzip-9' 'zle' 'lz4')
typeset -a checksum_prop_vals=('on' 'off' 'fletcher2' 'fletcher4' 'sha256'
    'noparity' 'sha512' 'skein' 'edonr')
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 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_prop_vals $1 2
}

function get_rand_compress_any
{
	get_rand_prop compress_prop_vals $1 0
}

function get_rand_checksum
{
	get_rand_prop checksum_prop_vals $1 2
}

function get_rand_checksum_any
{
	get_rand_prop checksum_prop_vals $1 0
}

function get_rand_recsize
{
	get_rand_prop recsize_prop_vals $1 0
}

function get_rand_large_recsize
{
	get_rand_prop recsize_prop_vals $1 9
}

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

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 "${prop}_prop_vals" 1 0)
		log_must zfs set $prop=$val $ds
	done
}
