--- /dev/null
+module Puppet::Parser::Functions
+ newfunction(:memcached_max_memory, :type => :rvalue, :doc => <<-EOS
+ Calculate max_memory size from fact 'memsize' and passed argument.
+ EOS
+ ) do |arguments|
+
+ raise(Puppet::ParseError, "memcached_max_memory(): " +
+ "Wrong number of arguments given " +
+ "(#{arguments.size} for 1)") if arguments.size != 1
+
+ arg = arguments[0]
+ memsize = lookupvar('memorysize')
+
+ if arg and !arg.to_s.end_with?('%')
+ result_in_mb = arg.to_i
+ else
+ max_memory_percent = arg ? arg : '95%'
+
+ # Taken from puppetlabs-stdlib to_bytes() function
+ value,prefix = */([0-9.e+-]*)\s*([^bB]?)/.match(memsize)[1,2]
+
+ value = value.to_f
+ case prefix
+ when '' then value = value
+ when 'k' then value *= (1<<10)
+ when 'M' then value *= (1<<20)
+ when 'G' then value *= (1<<30)
+ when 'T' then value *= (1<<40)
+ when 'E' then value *= (1<<50)
+ else raise Puppet::ParseError, "memcached_max_memory(): Unknown prefix #{prefix}"
+ end
+ value = value.to_i
+ result_in_mb = ( (value / (1 << 20) ) * (max_memory_percent.to_f / 100.0) ).floor
+ end
+
+ return result_in_mb
+ end
+end