1d583b39bSJohn Wren Kennedy#
2d583b39bSJohn Wren Kennedy# This file and its contents are supplied under the terms of the
3d583b39bSJohn Wren Kennedy# Common Development and Distribution License ("CDDL"), version 1.0.
4d583b39bSJohn Wren Kennedy# You may only use this file in accordance with the terms of version
5d583b39bSJohn Wren Kennedy# 1.0 of the CDDL.
6d583b39bSJohn Wren Kennedy#
7d583b39bSJohn Wren Kennedy# A full copy of the text of the CDDL should have accompanied this
8d583b39bSJohn Wren Kennedy# source.  A copy of the CDDL is also available via the Internet at
9d583b39bSJohn Wren Kennedy# http://www.illumos.org/license/CDDL.
10d583b39bSJohn Wren Kennedy#
11d583b39bSJohn Wren Kennedy
12d583b39bSJohn Wren Kennedy#
131d32ba66SJohn Wren Kennedy# Copyright (c) 2012, 2016 by Delphix. All rights reserved.
14d583b39bSJohn Wren Kennedy#
15d583b39bSJohn Wren Kennedy
16d583b39bSJohn Wren Kennedy#
17d583b39bSJohn Wren Kennedy# Return 0 if the percentage difference between $a and $b is $percent or
18d583b39bSJohn Wren Kennedy# greater. Return 1 if the percentage is lower or if we would divide by
19d583b39bSJohn Wren Kennedy# zero. For use like this:
20d583b39bSJohn Wren Kennedy#
21d583b39bSJohn Wren Kennedy# Do $action if the calculated percentage is greater or equal to that passed in:
22d583b39bSJohn Wren Kennedy#	within_percent A B P && $action
23d583b39bSJohn Wren Kennedy# Do $action if the calculated percentage is less than that passed in:
24d583b39bSJohn Wren Kennedy#	within_percent A B P || $action
25d583b39bSJohn Wren Kennedy#
26d583b39bSJohn Wren Kennedyfunction within_percent
27d583b39bSJohn Wren Kennedy{
28d583b39bSJohn Wren Kennedy	typeset a=$1
29d583b39bSJohn Wren Kennedy	typeset b=$1
30d583b39bSJohn Wren Kennedy	typeset percent=$3
31d583b39bSJohn Wren Kennedy
32d583b39bSJohn Wren Kennedy	# Set $a or $b to $2 such that a >= b
331d32ba66SJohn Wren Kennedy	[[ '1' = $(echo "if ($2 > $a) 1" | bc) ]] && a=$2 || b=$2
34d583b39bSJohn Wren Kennedy
35d583b39bSJohn Wren Kennedy	# Prevent division by 0
36d583b39bSJohn Wren Kennedy	[[ $a =~ [1-9] ]] || return 1
37d583b39bSJohn Wren Kennedy
381d32ba66SJohn Wren Kennedy	typeset p=$(echo "scale=2; $b * 100 / $a" | bc)
39d583b39bSJohn Wren Kennedy	log_note "Comparing $a and $b given $percent% (calculated: $p%)"
401d32ba66SJohn Wren Kennedy	[[ '1' = $(echo "scale=2; if ($p >= $percent) 1" | bc) ]] && return 0
41d583b39bSJohn Wren Kennedy
42d583b39bSJohn Wren Kennedy	return 1
43d583b39bSJohn Wren Kennedy}
44*084fd14fSBrian Behlendorf
45*084fd14fSBrian Behlendorf#
46*084fd14fSBrian Behlendorf# Return 0 if value is within +/-tolerance of target.
47*084fd14fSBrian Behlendorf# Return 1 if value exceeds our tolerance.
48*084fd14fSBrian Behlendorf# For use like this:
49*084fd14fSBrian Behlendorf#
50*084fd14fSBrian Behlendorf# Do $action if value is within the tolerance from target passed in:
51*084fd14fSBrian Behlendorf#	within_tolerance VAL TAR TOL && $action
52*084fd14fSBrian Behlendorf# Do $action if value surpasses the tolerance from target passed in:
53*084fd14fSBrian Behlendorf#	within_tolerance VAL TAR TOL || $action
54*084fd14fSBrian Behlendorf#
55*084fd14fSBrian Behlendorffunction within_tolerance #value #target #tolerance
56*084fd14fSBrian Behlendorf{
57*084fd14fSBrian Behlendorf	typeset val=$1
58*084fd14fSBrian Behlendorf	typeset target=$2
59*084fd14fSBrian Behlendorf	typeset tol=$3
60*084fd14fSBrian Behlendorf
61*084fd14fSBrian Behlendorf	typeset diff=$((abs(val - target)))
62*084fd14fSBrian Behlendorf	log_note "Checking if $val is within +/-$tol of $target (diff: $diff)"
63*084fd14fSBrian Behlendorf	((diff <= tol)) && return 0
64*084fd14fSBrian Behlendorf
65*084fd14fSBrian Behlendorf	return 1
66*084fd14fSBrian Behlendorf}
67*084fd14fSBrian Behlendorf
68*084fd14fSBrian Behlendorf#
69*084fd14fSBrian Behlendorf# Return 0 if the human readable string of the form <value>[suffix] can
70*084fd14fSBrian Behlendorf# be converted to bytes.  Allow suffixes are shown in the table below.
71*084fd14fSBrian Behlendorf#
72*084fd14fSBrian Behlendorffunction to_bytes
73*084fd14fSBrian Behlendorf{
74*084fd14fSBrian Behlendorf	typeset size=$1
75*084fd14fSBrian Behlendorf	typeset value=$(echo "$size" | grep -o '[0-9]\+')
76*084fd14fSBrian Behlendorf
77*084fd14fSBrian Behlendorf	case $size in
78*084fd14fSBrian Behlendorf		*PB|*pb|*P|*p)	factor='1024^5'	;;
79*084fd14fSBrian Behlendorf		*TB|*tb|*T|*t)	factor='1024^4'	;;
80*084fd14fSBrian Behlendorf		*GB|*gb|*G|*g)	factor='1024^3'	;;
81*084fd14fSBrian Behlendorf		*MB|*mb|*M|*m)	factor='1024^2'	;;
82*084fd14fSBrian Behlendorf		*KB|*kb|*K|*k)	factor='1024^1'	;;
83*084fd14fSBrian Behlendorf		*B|*b)		factor='1024^0'	;;
84*084fd14fSBrian Behlendorf		*[!0-9.]*)	return 1 ;;
85*084fd14fSBrian Behlendorf		*)		factor='1024^0'	;;
86*084fd14fSBrian Behlendorf	esac
87*084fd14fSBrian Behlendorf
88*084fd14fSBrian Behlendorf	echo "$value * ($factor)" | bc
89*084fd14fSBrian Behlendorf
90*084fd14fSBrian Behlendorf	return 0
91*084fd14fSBrian Behlendorf}
92*084fd14fSBrian Behlendorf
93*084fd14fSBrian Behlendorf#
94*084fd14fSBrian Behlendorf# Verify $a is equal to $b, otherwise raise an error specifying
95*084fd14fSBrian Behlendorf# the $type of values being compared
96*084fd14fSBrian Behlendorf#
97*084fd14fSBrian Behlendorffunction verify_eq # <a> <b> <type>
98*084fd14fSBrian Behlendorf{
99*084fd14fSBrian Behlendorf	typeset a=$1
100*084fd14fSBrian Behlendorf	typeset b=$2
101*084fd14fSBrian Behlendorf	typeset type=$3
102*084fd14fSBrian Behlendorf
103*084fd14fSBrian Behlendorf	if [[ $a -ne $b ]]; then
104*084fd14fSBrian Behlendorf		log_fail "Compared $type should be equal: $a != $b"
105*084fd14fSBrian Behlendorf	fi
106*084fd14fSBrian Behlendorf}
107*084fd14fSBrian Behlendorf
108*084fd14fSBrian Behlendorf#
109*084fd14fSBrian Behlendorf# Verify $a is not equal to $b, otherwise raise an error specifying
110*084fd14fSBrian Behlendorf# the $type of values being compared
111*084fd14fSBrian Behlendorf#
112*084fd14fSBrian Behlendorffunction verify_ne # <a> <b> <type>
113*084fd14fSBrian Behlendorf{
114*084fd14fSBrian Behlendorf	typeset a=$1
115*084fd14fSBrian Behlendorf	typeset b=$2
116*084fd14fSBrian Behlendorf	typeset type=$3
117*084fd14fSBrian Behlendorf
118*084fd14fSBrian Behlendorf	if [[ $a -eq $b ]]; then
119*084fd14fSBrian Behlendorf		log_fail "Compared $type should be not equal: $a == $b"
120*084fd14fSBrian Behlendorf	fi
121*084fd14fSBrian Behlendorf}
122