Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,11 @@ Converts the case of a string or of all strings in an array to lowercase. *Type*

Returns true if the argument is an array or hash that contains no elements, or an empty string. Returns false when the argument is a numerical value. *Type*: rvalue.

#### `enclose_ipv6`

Takes an array of ip addresses and encloses the ipv6 addresses with square
brackets. *Type*: rvalue.

#### `ensure_packages`

Takes a list of packages and only installs them if they don't already exist. It optionally takes a hash as a second parameter to be passed as the third argument to the `ensure_resource()` function. *Type*: statement.
Expand Down
45 changes: 45 additions & 0 deletions lib/puppet/parser/functions/enclose_ipv6.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#
# enclose_ipv6.rb
#

module Puppet::Parser::Functions
newfunction(:enclose_ipv6, :type => :rvalue, :doc => <<-EOS
Takes an array of ip addresses and encloses the ipv6 addresses with square brackets.
EOS
) do |arguments|

require 'ipaddr'

rescuable_exceptions = [ ArgumentError ]
if defined?(IPAddr::InvalidAddressError)
rescuable_exceptions << IPAddr::InvalidAddressError
end

if (arguments.size != 1) then
raise(Puppet::ParseError, "enclose_ipv6(): Wrong number of arguments "+
"given #{arguments.size} for 1")
end
unless arguments[0].is_a?(String) or arguments[0].is_a?(Array) then
raise(Puppet::ParseError, "enclose_ipv6(): Wrong argument type "+
"given #{arguments[0].class} expected String or Array")
end

input = [arguments[0]].flatten.compact
result = []

input.each do |val|
unless val == '*'
begin
ip = IPAddr.new(val)
rescue *rescuable_exceptions
raise(Puppet::ParseError, "enclose_ipv6(): Wrong argument "+
"given #{val} is not an ip address.")
end
val = "[#{ip.to_s}]" if ip.ipv6?
end
result << val
end

return result.uniq
end
end
69 changes: 69 additions & 0 deletions spec/unit/puppet/parser/functions/enclose_ipv6_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#! /usr/bin/env ruby -S rspec
require 'spec_helper'

describe "the enclose_ipv6 function" do
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }

it "should exist" do
expect(Puppet::Parser::Functions.function("enclose_ipv6")).to eq("function_enclose_ipv6")
end

it "should raise a ParseError if there is less than 1 arguments" do
expect { scope.function_enclose_ipv6([]) }.to( raise_error(Puppet::ParseError) )
end

it "should raise a ParseError if there is more than 1 arguments" do
expect { scope.function_enclose_ipv6(['argument1','argument2']) }.to( raise_error(Puppet::ParseError) )
end

it "should raise a ParseError when given garbage" do
expect { scope.function_enclose_ipv6(['garbage']) }.to( raise_error(Puppet::ParseError) )
end

it "should raise a ParseError when given something else than a string or an array" do
expect { scope.function_enclose_ipv6([['1' => '127.0.0.1']]) }.to( raise_error(Puppet::ParseError) )
end

it "should not raise a ParseError when given a single ip string" do
expect { scope.function_enclose_ipv6(['127.0.0.1']) }.to_not raise_error
end

it "should not raise a ParseError when given * as ip string" do
expect { scope.function_enclose_ipv6(['*']) }.to_not raise_error
end

it "should not raise a ParseError when given an array of ip strings" do
expect { scope.function_enclose_ipv6([['127.0.0.1','fe80::1']]) }.to_not raise_error
end

it "should not raise a ParseError when given differently notations of ip addresses" do
expect { scope.function_enclose_ipv6([['127.0.0.1','fe80::1','[fe80::1]']]) }.to_not raise_error
end

it "should raise a ParseError when given a wrong ipv4 address" do
expect { scope.function_enclose_ipv6(['127..0.0.1']) }.to( raise_error(Puppet::ParseError) )
end

it "should raise a ParseError when given a ipv4 address with square brackets" do
expect { scope.function_enclose_ipv6(['[127.0.0.1]']) }.to( raise_error(Puppet::ParseError) )
end

it "should raise a ParseError when given a wrong ipv6 address" do
expect { scope.function_enclose_ipv6(['fe80:::1']) }.to( raise_error(Puppet::ParseError) )
end

it "should embrace ipv6 adresses within an array of ip addresses" do
result = scope.function_enclose_ipv6([['127.0.0.1','fe80::1','[fe80::2]']])
expect(result).to(eq(['127.0.0.1','[fe80::1]','[fe80::2]']))
end

it "should embrace a single ipv6 adresse" do
result = scope.function_enclose_ipv6(['fe80::1'])
expect(result).to(eq(['[fe80::1]']))
end

it "should not embrace a single ipv4 adresse" do
result = scope.function_enclose_ipv6(['127.0.0.1'])
expect(result).to(eq(['127.0.0.1']))
end
end