Add puppet/archive module, required for newer puppet/rabbitmq
[mirror/dsa-puppet.git] / 3rdparty / modules / archive / lib / puppet / functions / archive / artifactory_latest_url.rb
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 (file)
index 0000000..30b0c51
--- /dev/null
@@ -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