Skip to content

Instantly share code, notes, and snippets.

@vStone
Created November 2, 2016 05:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vStone/921453e551c015ed3b66dc3630d1a4d6 to your computer and use it in GitHub Desktop.
Save vStone/921453e551c015ed3b66dc3630d1a4d6 to your computer and use it in GitHub Desktop.
module Puppet::Parser::Functions
newfunction(:calculate_memory_use, :type => :rvalue, :doc => <<-'ENDHEREDOC') do |args|
calculate_memory_use(use, reserved, minimum=0)
[*use*] How much memory should I use (of the non-reserved space left)
* Floating numbers smaller than 1 are interpreted as percentage.
* Anything else is used as size.
[*reserved*] How much memory to keep for other processes.
* Floating numbers smaller than 1 are interpreted as percentage.
* Anything else is used as size.
[*minimum*] Required minimum size
Examples:
calculate_memory_use(0.4,512,64)
@TODO: Documentation
ENDHEREDOC
raise Puppet::ParseError, "calculate_memory_use(): wrong number of arguments, need 2 or 3 " unless [2,3].include?(args.length)
use = args.shift
reserved = args.shift
minimum = (args.shift or 0)
unless use.respond_to?(:to_f)
raise Puppet::ParseError, "calculate_memory_use(): unexpected argument type can not be converted to a number: use is a #{use.class.name}"
end
unless reserved.respond_to?(:to_f)
raise Puppet::ParseError, "calculate_memory_use(): unexpected argument type can not be converted to a number: reserved_mb is a #{reserved.class.name}"
end
unless minimum.respond_to?(:to_f)
raise Puppet::ParseError, "calculate_memory_use(): unexpected argument type can not be converted to a number: minimum is a #{minimum.class.name}"
end
use = use.to_f
reserved = reserved.to_f
minimum = minimum.to_f
total_size_mb = lookupvar('memorysize_mb').to_f
if reserved < 1.0
reserved_mb = total_size_mb * reserved
else
reserved_mb = reserved
end
useable_size_mb = total_size_mb - reserved_mb
if use < 1.0
use_mb = useable_size_mb * use
else
use_mb = use
end
try_mb = [useable_size_mb, use_mb].min
actual_use_mb = [minimum, try_mb].max
#return {:total => total_size_mb,
# :reserved => reserved_mb,
# :minimum => minimum,
# :use_mb => use_mb,
# :trying_mb => try_mb,
# :actual_use_mb => actual_use_mb,
# :useable_mb => useable_size_mb}
if actual_use_mb > useable_size_mb
raise Puppet::ParseError, "calculate_memory_use(): insufficient free memory (#{useable_size_mb}) to provide the requested amount (#{actual_use_mb})"
end
actual_use_mb
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment