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