diff options
Diffstat (limited to 'lib/puppet/parser/functions')
-rw-r--r-- | lib/puppet/parser/functions/local_fence_devices.rb | 34 | ||||
-rw-r--r-- | lib/puppet/parser/functions/write_package_names.rb | 22 |
2 files changed, 56 insertions, 0 deletions
diff --git a/lib/puppet/parser/functions/local_fence_devices.rb b/lib/puppet/parser/functions/local_fence_devices.rb new file mode 100644 index 0000000..1ebce67 --- /dev/null +++ b/lib/puppet/parser/functions/local_fence_devices.rb @@ -0,0 +1,34 @@ +module Puppet::Parser::Functions + newfunction(:local_fence_devices, :arity =>2, :type => :rvalue, + :doc => ("Given an array of fence device configs, limit them" + + "to fence devices whose MAC address is present on" + + "some of the local NICs, and prepare a hash which can be" + + "passed to create_resources function")) do |args| + agent = args[0] + devices = args[1] + unless agent.is_a?(String) && agent.length > 0 + raise Puppet::ParseError, "local_fence_devices: Argument 'agent' must be a non-empty string. The value given was: #{agent_type}" + end + unless devices.is_a?(Array) + raise Puppet::ParseError, "local_fence_devices: Argument 'devices' must be an array. The value given was: #{devices}" + end + + # filter by agent type + agent_type_devices = devices.select { |device| device['agent'] == agent } + + # filter by local mac address + local_devices = agent_type_devices.select do |device| + function_has_interface_with(['macaddress', device['host_mac']]) + end + + # construct a hash for create_resources + return local_devices.each_with_object({}) do |device, hash| + # disallow collisions + if hash[device['host_mac']] + raise Puppet::ParseError, "local_fence_devices: Only single fence device per agent per host is allowed. Collision on #{device['host_mac']} for #{agent}" + end + + hash[device['host_mac']] = device['params'] || {} + end + end +end diff --git a/lib/puppet/parser/functions/write_package_names.rb b/lib/puppet/parser/functions/write_package_names.rb new file mode 100644 index 0000000..8f99674 --- /dev/null +++ b/lib/puppet/parser/functions/write_package_names.rb @@ -0,0 +1,22 @@ +require 'fileutils' + +module Puppet::Parser::Functions + newfunction(:write_package_names, :doc => "Write package names which are managed via this puppet run to a file.") do |arg| + if arg[0].class == String + begin + output_file = arg[0] + packages = catalog.resources.collect { |r| r.title if r.type == 'Package' }.compact + FileUtils.mkdir_p(File.dirname(output_file)) + File.open(output_file, 'w') do |f| + packages.each do |pkg_name| + f.write(pkg_name + "\n") + 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 + end +end |