]> gitweb.fluxo.info Git - puppet-stdlib.git/commitdiff
Add is_ipv4_address and is_ipv6_address functions
authorGiulio Fidente <gfidente@redhat.com>
Fri, 22 Jan 2016 16:55:03 +0000 (17:55 +0100)
committerGiulio Fidente <gfidente@redhat.com>
Fri, 22 Jan 2016 17:01:49 +0000 (18:01 +0100)
These are useful when making decisions based on the type of IP
address received.

README.markdown
lib/puppet/parser/functions/is_ipv4_address.rb [new file with mode: 0644]
lib/puppet/parser/functions/is_ipv6_address.rb [new file with mode: 0644]
spec/acceptance/is_ipv4_address_spec.rb [new file with mode: 0755]
spec/acceptance/is_ipv6_address_spec.rb [new file with mode: 0755]

index 559a6a07e8c5ae748c9dfc4fb38b7a2b4bed9a31..441773377e43a19c23d5d5492ba6fd7efbf6e977 100644 (file)
@@ -518,6 +518,14 @@ Returns 'true' if the variable returned to this string is an integer. *Type*: rv
 
 Returns 'true' if the string passed to this function is a valid IP address. *Type*: rvalue.
 
+#### `is_ipv6_address`
+
+Returns 'true' if the string passed to this function is a valid IPv6 address. *Type*: rvalue.
+
+#### `is_ipv4_address`
+
+Returns 'true' if the string passed to this function is a valid IPv4 address. *Type*: rvalue.
+
 #### `is_mac_address`
 
 Returns 'true' if the string passed to this function is a valid MAC address. *Type*: rvalue.
diff --git a/lib/puppet/parser/functions/is_ipv4_address.rb b/lib/puppet/parser/functions/is_ipv4_address.rb
new file mode 100644 (file)
index 0000000..b4861d5
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# is_ipv4_address.rb
+#
+
+module Puppet::Parser::Functions
+  newfunction(:is_ipv4_address, :type => :rvalue, :doc => <<-EOS
+Returns true if the string passed to this function is a valid IPv4 address.
+    EOS
+  ) do |arguments|
+
+    require 'ipaddr'
+
+    if (arguments.size != 1) then
+      raise(Puppet::ParseError, "is_ipv4_address(): Wrong number of arguments "+
+        "given #{arguments.size} for 1")
+    end
+
+    begin
+      ip = IPAddr.new(arguments[0])
+    rescue ArgumentError
+      return false
+    end
+
+    return ip.ipv4?
+  end
+end
+
+# vim: set ts=2 sw=2 et :
diff --git a/lib/puppet/parser/functions/is_ipv6_address.rb b/lib/puppet/parser/functions/is_ipv6_address.rb
new file mode 100644 (file)
index 0000000..475ad50
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# is_ipv6_address.rb
+#
+
+module Puppet::Parser::Functions
+  newfunction(:is_ipv6_address, :type => :rvalue, :doc => <<-EOS
+Returns true if the string passed to this function is a valid IPv6 address.
+    EOS
+  ) do |arguments|
+
+    require 'ipaddr'
+
+    if (arguments.size != 1) then
+      raise(Puppet::ParseError, "is_ipv6_address(): Wrong number of arguments "+
+        "given #{arguments.size} for 1")
+    end
+
+    begin
+      ip = IPAddr.new(arguments[0])
+    rescue ArgumentError
+      return false
+    end
+
+    return ip.ipv6?
+  end
+end
+
+# vim: set ts=2 sw=2 et :
diff --git a/spec/acceptance/is_ipv4_address_spec.rb b/spec/acceptance/is_ipv4_address_spec.rb
new file mode 100755 (executable)
index 0000000..5dc6bf5
--- /dev/null
@@ -0,0 +1,52 @@
+#! /usr/bin/env ruby -S rspec
+require 'spec_helper_acceptance'
+
+describe 'is_ipv4_address function', :unless => UNSUPPORTED_PLATFORMS.include?(fact('operatingsystem')) do
+  describe 'success' do
+    it 'is_ipv4_addresss' do
+      pp = <<-EOS
+      $a = '1.2.3.4'
+      $b = true
+      $o = is_ipv4_address($a)
+      if $o == $b {
+        notify { 'output correct': }
+      }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true) do |r|
+        expect(r.stdout).to match(/Notice: output correct/)
+      end
+    end
+    it 'is_ipv4_addresss strings' do
+      pp = <<-EOS
+      $a = "aoeu"
+      $b = false
+      $o = is_ipv4_address($a)
+      if $o == $b {
+        notify { 'output correct': }
+      }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true) do |r|
+        expect(r.stdout).to match(/Notice: output correct/)
+      end
+    end
+    it 'is_ipv4_addresss ipv4 out of range' do
+      pp = <<-EOS
+      $a = '1.2.3.400'
+      $b = false
+      $o = is_ipv4_address($a)
+      if $o == $b {
+        notify { 'output correct': }
+      }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true) do |r|
+        expect(r.stdout).to match(/Notice: output correct/)
+      end
+    end
+  end
+  describe 'failure' do
+    it 'handles improper argument counts'
+  end
+end
diff --git a/spec/acceptance/is_ipv6_address_spec.rb b/spec/acceptance/is_ipv6_address_spec.rb
new file mode 100755 (executable)
index 0000000..1e88be8
--- /dev/null
@@ -0,0 +1,66 @@
+#! /usr/bin/env ruby -S rspec
+require 'spec_helper_acceptance'
+
+describe 'is_ipv6_address function', :unless => UNSUPPORTED_PLATFORMS.include?(fact('operatingsystem')) do
+  describe 'success' do
+    it 'is_ipv6_addresss' do
+      pp = <<-EOS
+      $a = "fe80:0000:cd12:d123:e2f8:47ff:fe09:dd74"
+      $b = true
+      $o = is_ipv6_address($a)
+      if $o == $b {
+        notify { 'output correct': }
+      }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true) do |r|
+        expect(r.stdout).to match(/Notice: output correct/)
+      end
+    end
+    it 'is_ipv6_addresss ipv6 compressed' do
+      pp = <<-EOS
+      $a = "fe00::1"
+      $b = true
+      $o = is_ipv6_address($a)
+      if $o == $b {
+        notify { 'output correct': }
+      }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true) do |r|
+        expect(r.stdout).to match(/Notice: output correct/)
+      end
+    end
+    it 'is_ipv6_addresss strings' do
+      pp = <<-EOS
+      $a = "aoeu"
+      $b = false
+      $o = is_ipv6_address($a)
+      if $o == $b {
+        notify { 'output correct': }
+      }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true) do |r|
+        expect(r.stdout).to match(/Notice: output correct/)
+      end
+    end
+    it 'is_ipv6_addresss ip out of range' do
+      pp = <<-EOS
+      $a = 'fe80:0000:cd12:d123:e2f8:47ff:fe09:gggg'
+      $b = false
+      $o = is_ipv6_address($a)
+      if $o == $b {
+        notify { 'output correct': }
+      }
+      EOS
+
+      apply_manifest(pp, :catch_failures => true) do |r|
+        expect(r.stdout).to match(/Notice: output correct/)
+      end
+    end
+  end
+  describe 'failure' do
+    it 'handles improper argument counts'
+  end
+end