Mark Drayton made a good point (
http://projects.reductivelabs.com/issues/2601#note-3); are we making the
code more complicated than it needs to be to get less functionality than we
might otherwise have? Rather than saying that it takes one additional
numeric argument, why not just permit arbitrary additional seed values, like
so:
"Generates random numbers based on the node's fqdn. The first argument
sets the range. Additional (optional) arguments may be used to further
distinguish
the seed.") do |args|
max = args.shift
srand MD5.new([lookupvar('fqdn'),args].join(':')).to_s.hex
rand(max).to_s
Specifically, is there any advantage to having a numeric offset to the
seed? The practice is, in general, frowned upon at least insofar as
small/constant numeric offsets don't add to the entropy and can result in a
higher rate of collisions than adjusting the salt.
-- Markus
On Sun, Sep 13, 2009 at 9:15 PM, Steven Jenkins <[email protected]> wrote:
>
>
> Signed-off-by: Steven Jenkins <[email protected]>
> ---
> lib/puppet/parser/functions/fqdn_rand.rb | 3 +-
> spec/unit/parser/functions/fqdn_rand.rb | 51
> ++++++++++++++++++++++++++++++
> 2 files changed, 53 insertions(+), 1 deletions(-)
> create mode 100755 spec/unit/parser/functions/fqdn_rand.rb
>
> diff --git a/lib/puppet/parser/functions/fqdn_rand.rb
> b/lib/puppet/parser/functions/fqdn_rand.rb
> index 3741d2d..fa63678 100644
> --- a/lib/puppet/parser/functions/fqdn_rand.rb
> +++ b/lib/puppet/parser/functions/fqdn_rand.rb
> @@ -2,10 +2,11 @@ Puppet::Parser::Functions::newfunction(:fqdn_rand, :type
> => :rvalue, :doc =>
> "Generates random numbers based on the node's fqdn. The first argument
> sets the range. The second argument specifies a number to add to the
> seed and is optional.") do |args|
> + raise Puppet::ParseError, "Must have 0, 1, or 2 arguments" unless
> args.length < 3
> require 'md5'
> max = args[0]
> if args[1] then
> - seed = args[1]
> + seed = args[1].to_i
> else
> seed = 1
> end
> diff --git a/spec/unit/parser/functions/fqdn_rand.rb
> b/spec/unit/parser/functions/fqdn_rand.rb
> new file mode 100755
> index 0000000..8124110
> --- /dev/null
> +++ b/spec/unit/parser/functions/fqdn_rand.rb
> @@ -0,0 +1,51 @@
> +#! /usr/bin/env ruby
> +
> +require File.dirname(__FILE__) + '/../../../spec_helper'
> +
> +describe "the fqdn_rand function" do
> +
> + before :each do
> + @scope = Puppet::Parser::Scope.new()
> + end
> +
> + it "should exist" do
> + Puppet::Parser::Functions.function("fqdn_rand").should ==
> "function_fqdn_rand"
> + end
> +
> + it "should handle 0 arguments" do
> + @scope.expects(:lookupvar).with("fqdn").returns("127.0.0.1")
> + lambda { @scope.function_fqdn_rand([]) }.should_not
> raise_error(Puppet::ParseError)
> + end
> +
> + it "should handle 1 argument" do
> + @scope.expects(:lookupvar).with("fqdn").returns("127.0.0.1")
> + lambda { @scope.function_fqdn_rand([3]) }.should_not
> raise_error(Puppet::ParseError)
> + end
> +
> + it "should handle 2 arguments" do
> + @scope.expects(:lookupvar).with("fqdn").returns("127.0.0.1")
> + lambda { @scope.function_fqdn_rand([3, 4]) }.should_not
> raise_error(Puppet::ParseError)
> + end
> +
> + it "should raise a ParseError if there is more than 2 arguments" do
> + lambda { @scope.function_fqdn_rand([3, 4, 5]) }.should
> raise_error(Puppet::ParseError)
> + end
> +
> + it "should return a value less than max" do
> + @scope.expects(:lookupvar).with("fqdn").returns("127.0.0.1")
> + @scope.function_fqdn_rand([3]).should satisfy {|n| n.to_i < 3 }
> + end
> +
> + it "should return the same values on subsequent invocations for the
> same host" do
> + @scope.expects(:lookupvar).with("fqdn").returns("127.0.0.1").twice
> + @scope.function_fqdn_rand([3,4]).should
> eql(@scope.function_fqdn_rand([3, 4]))
> + end
> +
> + it "should return different values for different hosts" do
> + @scope.expects(:lookupvar).with("fqdn").returns("127.0.0.1")
> + val1 = @scope.function_fqdn_rand([3,4])
> + @scope.expects(:lookupvar).with("fqdn").returns("127.0.0.2")
> + val2 = @scope.function_fqdn_rand([3,4])
> + val1.should_not eql(val2)
> + end
> +end
> --
> 1.6.1.3
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Puppet Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---