[ARVADOS] created: f4a7c5e6b1e6e30ad8a31a704642fcc360239e03

Git user git at public.curoverse.com
Fri Mar 10 13:52:02 EST 2017


        at  f4a7c5e6b1e6e30ad8a31a704642fcc360239e03 (commit)


commit f4a7c5e6b1e6e30ad8a31a704642fcc360239e03
Author: Peter Amstutz <peter.amstutz at curoverse.com>
Date:   Fri Mar 10 13:51:49 2017 -0500

    8567: find_all_for_docker_image() returns only Docker images compatible with Rails.configuration.docker_image_formats.  Follows migration links.

diff --git a/services/api/app/models/collection.rb b/services/api/app/models/collection.rb
index 9b081db..03d0f7b 100644
--- a/services/api/app/models/collection.rb
+++ b/services/api/app/models/collection.rb
@@ -316,6 +316,28 @@ class Collection < ArvadosModel
     [hash_part, size_part].compact.join '+'
   end
 
+  def self.get_compatible_image(readers, pattern, coll_match)
+    if coll_match.nil?
+      return nil
+    end
+    manifest = Keep::Manifest.new(coll_match.manifest_text)
+    if manifest.exact_file_count?(1)
+      if manifest.files[0][1] =~ pattern
+        # Looks like a compatible image
+        return coll_match
+      else
+        # Doesn't match the expected pattern, see if there is a migration link.
+        migrate_pdh = self.docker_migration_pdh(readers, coll_match.portable_data_hash)
+        if migrate_pdh != coll_match.portable_data_hash
+          # See if the migrated image is compatible.
+          coll_match = readable_by(*readers).where(portable_data_hash: migrate_pdh).limit(1).first
+          return get_compatible_image(readers, pattern, coll_match)
+        end
+      end
+    end
+    return nil
+  end
+
   # Return array of Collection objects
   def self.find_all_for_docker_image(search_term, search_tag=nil, readers=nil)
     readers ||= [Thread.current[:user]]
@@ -325,19 +347,23 @@ class Collection < ArvadosModel
       joins("JOIN collections ON links.head_uuid = collections.uuid").
       order("links.created_at DESC")
 
+    if Rails.configuration.docker_image_formats.include? 'v1' and Rails.configuration.docker_image_formats.include? 'v2'
+      pattern = /^(sha256:)?[0-9A-Fa-f]{64}\.tar$/
+    elsif Rails.configuration.docker_image_formats.include? 'v2'
+      pattern = /^(sha256:)[0-9A-Fa-f]{64}\.tar$/
+    elsif Rails.configuration.docker_image_formats.include? 'v1'
+      pattern = /^[0-9A-Fa-f]{64}\.tar$/
+    else
+      raise "Unrecognized configuration for docker_image_formats #{Rails.configuration.docker_image_formats}"
+    end
+
     # If the search term is a Collection locator that contains one file
     # that looks like a Docker image, return it.
     if loc = Keep::Locator.parse(search_term)
       loc.strip_hints!
       coll_match = readable_by(*readers).where(portable_data_hash: loc.to_s).limit(1).first
-      if coll_match
-        # Check if the Collection contains exactly one file whose name
-        # looks like a saved Docker image.
-        manifest = Keep::Manifest.new(coll_match.manifest_text)
-        if manifest.exact_file_count?(1) and
-            (manifest.files[0][1] =~ /^(sha256:)?[0-9A-Fa-f]{64}\.tar$/)
-          return [coll_match]
-        end
+      if compatible_img = get_compatible_image(readers, pattern, coll_match)
+        return [compatible_img]
       end
     end
 
@@ -362,11 +388,16 @@ class Collection < ArvadosModel
     # so that anything with an image timestamp is considered more recent than
     # anything without; then we use the link's created_at as a tiebreaker.
     uuid_timestamps = {}
-    matches.all.map do |link|
+    matches.each do |link|
       uuid_timestamps[link.head_uuid] = [(-link.properties["image_timestamp"].to_datetime.to_i rescue 0),
        -link.created_at.to_i]
-    end
-    Collection.where('uuid in (?)', uuid_timestamps.keys).sort_by { |c| uuid_timestamps[c.uuid] }
+     end
+
+    Collection.where('uuid in (?)', uuid_timestamps.keys).map { |c|
+      get_compatible_image(readers, pattern, c)
+    }.compact.sort_by { |c|
+      uuid_timestamps[c.uuid]
+    }
   end
 
   def self.for_latest_docker_image(search_term, search_tag=nil, readers=nil)
diff --git a/services/api/config/application.default.yml b/services/api/config/application.default.yml
index 077c237..61ada89 100644
--- a/services/api/config/application.default.yml
+++ b/services/api/config/application.default.yml
@@ -463,3 +463,4 @@ test:
   git_internal_dir: <%= Rails.root.join 'tmp', 'internal.git' %>
   websocket_address: <% if ENV['ARVADOS_TEST_EXPERIMENTAL_WS'] %>"wss://0.0.0.0:<%= ENV['ARVADOS_TEST_WSS_PORT'] %>/websocket"<% else %>false<% end %>
   trash_sweep_interval: -1
+  docker_image_formats: ["v1", "v2"]
\ No newline at end of file

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list