Add interface_for_ip function
authorDan Prince <dprince@redhat.com>
Fri, 29 May 2015 14:27:01 +0000 (10:27 -0400)
committerDan Prince <dprince@redhat.com>
Wed, 3 Jun 2015 14:51:29 +0000 (10:51 -0400)
This patch adds a custom Puppet function called interface_for_ip
This function will be used within the TripleO puppet implementation
to help obtain the correct interface for a given IP address.

Change-Id: I0979f69a49052fda888277fa64ebeadc038bc778

lib/puppet/parser/functions/interface_for_ip.rb [new file with mode: 0644]

diff --git a/lib/puppet/parser/functions/interface_for_ip.rb b/lib/puppet/parser/functions/interface_for_ip.rb
new file mode 100644 (file)
index 0000000..1c67120
--- /dev/null
@@ -0,0 +1,33 @@
+require 'ipaddr'
+
+# Custom function to lookup the interface which matches the subnet
+# of the provided IP address.
+# The function iterates over all the interfaces and chooses the
+# first locally assigned interface which matches the IP.
+module Puppet::Parser::Functions
+  newfunction(:interface_for_ip, :type => :rvalue, :doc => "Find the bind IP address for the provided subnet.") do |arg|
+    if arg[0].class == String
+      begin
+        ip_to_find = arg[0]
+        Dir.foreach('/sys/class/net/') do |interface|
+          next if interface == '.' or interface == '..'
+          iface_no_dash = interface.gsub('-', '_')
+          interface_ip = lookupvar("ipaddress_#{iface_no_dash}")
+          netmask = lookupvar("netmask_#{iface_no_dash}")
+          if not interface_ip.nil? then
+            ip1=IPAddr.new(interface_ip)
+            ip2=IPAddr.new(ip_to_find)
+            if ip1.mask(netmask) == ip2.mask(netmask) then
+              return interface
+            end
+          end
+        end
+      rescue JSON::ParserError
+        raise Puppet::ParseError, "Syntax error: #{arg[0]} is invalid"
+      end
+    else
+      raise Puppet::ParseError, "Syntax error: #{arg[0]} is not a String"
+    end
+    return ''
+  end
+end