From bcd7061d39d66e4b642c60c0e9fd75259b913ada Mon Sep 17 00:00:00 2001 From: Ben Ford Date: Fri, 3 Jan 2020 20:34:32 -0800 Subject: [PATCH] Porting functions to the modern Puppet 4.x API --- lib/puppet/functions/java_ng/java_ng_avail.rb | 100 ++++++++++++++++++ spec/functions/java_ng_java_ng_avail_spec.rb | 41 +++++++ 2 files changed, 141 insertions(+) create mode 100644 lib/puppet/functions/java_ng/java_ng_avail.rb create mode 100644 spec/functions/java_ng_java_ng_avail_spec.rb diff --git a/lib/puppet/functions/java_ng/java_ng_avail.rb b/lib/puppet/functions/java_ng/java_ng_avail.rb new file mode 100644 index 0000000..7d2a841 --- /dev/null +++ b/lib/puppet/functions/java_ng/java_ng_avail.rb @@ -0,0 +1,100 @@ +# This is an autogenerated function, ported from the original legacy version. +# It /should work/ as is, but will not have all the benefits of the modern +# function API. You should see the function docs to learn how to add function +# signatures for type safety and to document this function using puppet-strings. +# +# https://puppet.com/docs/puppet/latest/custom_functions_ruby.html +# +# ---- original file header ---- + +# ---- original file header ---- +# +# @summary +# Scans available Java versions and return matching version and repository. +# +Puppet::Functions.create_function(:'java_ng::java_ng_avail') do + # @param arguments + # The original array of arguments. Port this to individually managed params + # to get the full benefit of the modern function API. + # + # @return [Data type] + # Describe what the function returns here + # + dispatch :default_impl do + # Call the method named 'default_impl' when this is matched + # Port this to match individual params for better type safety + repeated_param 'Any', :arguments + end + + + def default_impl(*arguments) + + raise(Puppet::ParseError, "java_ng_avail(): Wrong number of arguments") if arguments.size != 4 + + if arguments[0].is_a?(Array) then + versions = arguments[0] + else + versions = [arguments[0]] + end + # accept both integers and strings as the version: + # * numbers goes as strings from manifests (puppet 3) + # * numbers goes as integers from manifests (puppet 4) + # * arithmetic expressions goes as integers from manifests + # * hiera can have string or integer, let's support both + versions.map! {|v| v.to_s } + #p versions + + if arguments[1].is_a?(Array) then + repos = arguments[1] + else + repos = [arguments[1]] + end + + prefer_version = arguments[2] + + ja = arguments[3] + # convert also the list of available versions: + # * numbers goes as strings from manifests (puppet 3) + # * numbers goes as integers from manifests (puppet 4) + ja.map { |repo,vers| + [repo, vers.map! { |v| v.to_s }] + } + #p ja + + jv = nil + jrepo = nil + if prefer_version then + versions.each do |version| + repos.each do |repo| + #p repo, version, ja[repo] + if ja.has_key? repo and ja[repo].include? version then + #found! ==> repo, jv + jv = version + jrepo = repo + break + end + end + break if jv or jrepo + end + else + repos.each do |repo| + if ja.has_key? repo then + hit = (versions & ja[repo]) + #p repo, hit + if !hit.empty? then + #found! ==> repo, jv + jv = hit[0] + jrepo = repo + break + end + end + end + end + + { + 'repo' => jrepo, + 'version' => jv, + } + + end +end diff --git a/spec/functions/java_ng_java_ng_avail_spec.rb b/spec/functions/java_ng_java_ng_avail_spec.rb new file mode 100644 index 0000000..c483402 --- /dev/null +++ b/spec/functions/java_ng_java_ng_avail_spec.rb @@ -0,0 +1,41 @@ +require 'spec_helper' + +describe 'java_ng::java_ng_avail' do + # without knowing details about the implementation, this is the only test + # case that we can autogenerate. You should add more examples below! + it { is_expected.not_to eq(nil) } + +################################# +# Below are some example test cases. You may uncomment and modify them to match +# your needs. Notice that they all expect the base error class of `StandardError`. +# This is because the autogenerated function uses an untyped array for parameters +# and relies on your implementation to do the validation. As you convert your +# function to proper dispatches and typed signatures, you should change the +# expected error of the argument validation examples to `ArgumentError`. +# +# Other error types you might encounter include +# +# * StandardError +# * ArgumentError +# * Puppet::ParseError +# +# Read more about writing function unit tests at https://rspec-puppet.com/documentation/functions/ +# +# it 'raises an error if called with no argument' do +# is_expected.to run.with_params.and_raise_error(StandardError) +# end +# +# it 'raises an error if there is more than 1 arguments' do +# is_expected.to run.with_params({ 'foo' => 1 }, 'bar' => 2).and_raise_error(StandardError) +# end +# +# it 'raises an error if argument is not the proper type' do +# is_expected.to run.with_params('foo').and_raise_error(StandardError) +# end +# +# it 'returns the proper output' do +# is_expected.to run.with_params(123).and_return('the expected output') +# end +################################# + +end