diff --git a/lib/puppet/functions/archive/assemble_nexus_url.rb b/lib/puppet/functions/archive/assemble_nexus_url.rb new file mode 100644 index 0000000..0ad8d63 --- /dev/null +++ b/lib/puppet/functions/archive/assemble_nexus_url.rb @@ -0,0 +1,27 @@ +require 'cgi' + +# @summary +# Assembles a complete nexus URL from the base url and query parameters +# @api private +Puppet::Functions.create_function(:'archive::assemble_nexus_url') do + # @param nexus_url + # The base nexus URL + # @param params + # The query parameters as a hash + # + # @return [Stdlib::HTTPUrl] + # The assembled URL + dispatch :default_impl do + param 'Stdlib::HTTPUrl', :nexus_url + param 'Hash', :params + return_type 'Stdlib::HTTPUrl' + end + + def default_impl(nexus_url, params) + service_relative_url = 'service/local/artifact/maven/content' + + query_string = params.to_a.map { |x| "#{x[0]}=#{CGI.escape(x[1])}" }.join('&') + + "#{nexus_url}/#{service_relative_url}?#{query_string}" + end +end diff --git a/lib/puppet/parser/functions/assemble_nexus_url.rb b/lib/puppet/parser/functions/assemble_nexus_url.rb deleted file mode 100644 index be7c6e0..0000000 --- a/lib/puppet/parser/functions/assemble_nexus_url.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'cgi' - -module Puppet::Parser::Functions - newfunction(:assemble_nexus_url, type: :rvalue) do |args| - service_relative_url = 'service/local/artifact/maven/content' - - nexus_url = args[0] - params = args[1] - query_string = params.to_a.map { |x| "#{x[0]}=#{CGI.escape(x[1])}" }.join('&') - - "#{nexus_url}/#{service_relative_url}?#{query_string}" - end -end diff --git a/manifests/nexus.pp b/manifests/nexus.pp index 16eb854..17e27df 100644 --- a/manifests/nexus.pp +++ b/manifests/nexus.pp @@ -1,114 +1,114 @@ # define: archive::nexus # ====================== # # archive wrapper for downloading files from Nexus using REST API. Nexus API: # https://repository.sonatype.org/nexus-restlet1x-plugin/default/docs/path__artifact_maven_content.html # # Parameters # ---------- # # Examples # -------- # # archive::nexus { '/tmp/jtstand-ui-0.98.jar': # url => 'https://oss.sonatype.org', # gav => 'org.codehaus.jtstand:jtstand-ui:0.98', # repository => 'codehaus-releases', # packaging => 'jar', # extract => false, # } # define archive::nexus ( String $url, String $gav, String $repository, Enum['present', 'absent'] $ensure = present, Enum['none', 'md5', 'sha1', 'sha2','sha256', 'sha384', 'sha512'] $checksum_type = 'md5', Boolean $checksum_verify = true, String $packaging = 'jar', Boolean $use_nexus3_urls = false, Optional[String] $classifier = undef, Optional[String] $extension = undef, Optional[String] $username = undef, Optional[String] $password = undef, Optional[String] $user = undef, Optional[String] $owner = undef, Optional[String] $group = undef, Optional[String] $mode = undef, Optional[Boolean] $extract = undef, Optional[String] $extract_path = undef, Optional[String] $extract_flags = undef, Optional[String] $extract_command = undef, Optional[String] $creates = undef, Optional[Boolean] $cleanup = undef, Optional[String] $proxy_server = undef, Optional[String] $proxy_type = undef, Optional[Boolean] $allow_insecure = undef, ) { include archive::params $artifact_info = split($gav, ':') $group_id = $artifact_info[0] $artifact_id = $artifact_info[1] $version = $artifact_info[2] $query_params = { 'g' => $group_id, 'a' => $artifact_id, 'v' => $version, 'r' => $repository, 'p' => $packaging, 'c' => $classifier, 'e' => $extension, }.filter |$keys, $values| { $values != undef } if $use_nexus3_urls { if $classifier { $c = "-${classifier}" } else { $c = '' } $artifact_url = sprintf('%s/repository/%s/%s/%s/%s/%s-%s%s.%s', $url, $repository, regsubst($group_id, '\.', '/', 'G'), $artifact_id, $version, $artifact_id, $version, $c, $packaging) $checksum_url = sprintf('%s.%s', $artifact_url, $checksum_type) } else { - $artifact_url = assemble_nexus_url($url, $query_params) + $artifact_url = archive::assemble_nexus_url($url, $query_params) $checksum_url = regsubst($artifact_url, "p=${packaging}", "p=${packaging}.${checksum_type}") } archive { $name: ensure => $ensure, source => $artifact_url, username => $username, password => $password, checksum_url => $checksum_url, checksum_type => $checksum_type, checksum_verify => $checksum_verify, extract => $extract, extract_path => $extract_path, extract_flags => $extract_flags, extract_command => $extract_command, user => $user, group => $group, creates => $creates, cleanup => $cleanup, proxy_server => $proxy_server, proxy_type => $proxy_type, allow_insecure => $allow_insecure, } $file_owner = pick($owner, $archive::params::owner) $file_group = pick($group, $archive::params::group) $file_mode = pick($mode, $archive::params::mode) file { $name: owner => $file_owner, group => $file_group, mode => $file_mode, require => Archive[$name], } } diff --git a/spec/unit/puppet/parser/functions/assemble_nexus_url_spec.rb b/spec/functions/archive_assemble_nexus_url_spec.rb similarity index 60% rename from spec/unit/puppet/parser/functions/assemble_nexus_url_spec.rb rename to spec/functions/archive_assemble_nexus_url_spec.rb index 4be1984..ef6fef4 100644 --- a/spec/unit/puppet/parser/functions/assemble_nexus_url_spec.rb +++ b/spec/functions/archive_assemble_nexus_url_spec.rb @@ -1,39 +1,35 @@ require 'spec_helper' -describe :assemble_nexus_url do # rubocop:disable RSpec/DescribeSymbol - before :all do # rubocop:disable RSpec/BeforeAfterAll - Puppet::Parser::Functions.autoloader.loadall - end - - let(:scope) { PuppetlabsSpec::PuppetInternals.scope } +describe 'archive::assemble_nexus_url' do + let(:nexus_url) { 'http://nexus.local' } - nexus_url = 'http://nexus.local' + it { is_expected.not_to eq(nil) } it 'builds url correctly' do expected_url = 'http://nexus.local/service/local/artifact/maven/content?g=com.test&a=test&v=1.0.0&r=binary-staging&p=ear' parameters = { 'g' => 'com.test', 'a' => 'test', 'v' => '1.0.0', 'r' => 'binary-staging', 'p' => 'ear' } - expect(scope.function_assemble_nexus_url([nexus_url, parameters])).to eq expected_url + is_expected.to run.with_params(nexus_url, parameters).and_return(expected_url) end it 'builds url with version containing "+" sign correctly' do expected_url = 'http://nexus.local/service/local/artifact/maven/content?g=com.test&a=test&v=1.0.0%2B11&r=binary-staging&p=ear' parameters = { 'g' => 'com.test', 'a' => 'test', 'v' => '1.0.0+11', 'r' => 'binary-staging', 'p' => 'ear' } - expect(scope.function_assemble_nexus_url([nexus_url, parameters])).to eq expected_url + is_expected.to run.with_params(nexus_url, parameters).and_return(expected_url) end end