X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=3rdparty%2Fmodules%2Farchive%2Flib%2Fpuppet%2Ffunctions%2Farchive%2Fartifactory_latest_url.rb;fp=3rdparty%2Fmodules%2Farchive%2Flib%2Fpuppet%2Ffunctions%2Farchive%2Fartifactory_latest_url.rb;h=30b0c515df5d6c37fc8373e454a6fc652adb424f;hb=ce70d6baf887ae03a2a6a7f5e73eb2e2c3dea208;hp=0000000000000000000000000000000000000000;hpb=0ba93256399fbad7ed8fabfa39c24dd47169dde3;p=mirror%2Fdsa-puppet.git diff --git a/3rdparty/modules/archive/lib/puppet/functions/archive/artifactory_latest_url.rb b/3rdparty/modules/archive/lib/puppet/functions/archive/artifactory_latest_url.rb new file mode 100644 index 000000000..30b0c515d --- /dev/null +++ b/3rdparty/modules/archive/lib/puppet/functions/archive/artifactory_latest_url.rb @@ -0,0 +1,45 @@ +require 'json' +require 'puppet_x/bodeco/util' + +Puppet::Functions.create_function(:'archive::artifactory_latest_url') do + dispatch :artifactory_latest_url do + param 'Variant[Stdlib::HTTPUrl, Stdlib::HTTPSUrl]', :url + param 'Hash', :maven_data + end + + def artifactory_latest_url(url, maven_data) + # Turn provided artifactory URL into the fileinfo API endpoint of the parent directory + uri = URI(url.sub('/artifactory/', '/artifactory/api/storage/')[%r{^(.*)/.*$}, 1]) + + response = PuppetX::Bodeco::Util.content(uri) + content = JSON.parse(response) + + uris = if maven_data['classifier'] + content['children'].select do |child| + child['uri'] =~ %r{^/#{maven_data['module']}-#{maven_data['base_rev']}-(SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+)))-#{maven_data['classifier']}\.#{maven_data['ext']}$} && !child['folder'] + end + else + content['children'].select do |child| + child['uri'] =~ %r{^/#{maven_data['module']}-#{maven_data['base_rev']}-(SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+)))\.#{maven_data['ext']}$} && !child['folder'] + end + end + + raise("Couldn't find any Artifactory artifacts") if uris.empty? + + latest = uris.sort_by { |x| x['uri'] }.last['uri'] + Puppet.debug("Latest artifact found for #{url} was #{latest}") + + # Now GET the fileinfo endpoint of the resolved latest version file + uri = URI("#{content['uri']}#{latest}") + response = PuppetX::Bodeco::Util.content(uri) + content = JSON.parse(response) + + url = content['downloadUri'] + sha1 = content['checksums'] && content['checksums']['sha1'] + + { + 'url' => url, + 'sha1' => sha1 + } + end +end