Merge remote-tracking branch 'origin/master' into 3605-improved-dashboard
[arvados.git] / services / api / app / controllers / arvados / v1 / jobs_controller.rb
index 303943310b2fa00cf8dc6e2bfc9fd571fe6292d5..afb516bd48d89385d70f42922374359d7079b7e0 100644 (file)
@@ -34,7 +34,7 @@ class Arvados::V1::JobsController < ApplicationController
            ["script_version", "in git",
             params[:minimum_script_version] || resource_attrs[:script_version]],
            ["script_version", "not in git", params[:exclude_script_versions]],
-          ].reject { |filter| filter.last.nil? }
+          ].reject { |filter| filter.last.nil? or filter.last.empty? }
         if image_search = resource_attrs[:runtime_constraints].andand["docker_image"]
           if image_tag = resource_attrs[:runtime_constraints]["docker_image_tag"]
             image_search += ":#{image_tag}"
@@ -67,18 +67,20 @@ class Arvados::V1::JobsController < ApplicationController
         if j.nondeterministic != true and
             ((j.success == true and j.output != nil) or j.running == true) and
             j.script_parameters == resource_attrs[:script_parameters]
-          if j.running
+          if j.running && j.owner_uuid == current_user.uuid
             # We'll use this if we don't find a job that has completed
             incomplete_job ||= j
           else
-            # Record the first job in the list
-            if !@object
-              @object = j
-            end
-            # Ensure that all candidate jobs actually did produce the same output
-            if @object.output != j.output
-              @object = nil
-              break
+            if Collection.readable_by(current_user).find_by_portable_data_hash(j.output)
+              # Record the first job in the list
+              if !@object
+                @object = j
+              end
+              # Ensure that all candidate jobs actually did produce the same output
+              if @object.output != j.output
+                @object = nil
+                break
+              end
             end
           end
         end
@@ -160,6 +162,28 @@ class Arvados::V1::JobsController < ApplicationController
     index
   end
 
+  def queue_size
+    render :json => {:queue_size => Job.queue.size}
+  end
+
+  def self._create_requires_parameters
+    (super rescue {}).
+      merge({
+              find_or_create: {
+                type: 'boolean', required: false, default: false
+              },
+              filters: {
+                type: 'array', required: false
+              },
+              minimum_script_version: {
+                type: 'string', required: false
+              },
+              exclude_script_versions: {
+                type: 'array', required: false
+              },
+            })
+  end
+
   def self._queue_requires_parameters
     self._index_requires_parameters
   end
@@ -194,7 +218,7 @@ class Arvados::V1::JobsController < ApplicationController
         search_list = filter[2].is_a?(Enumerable) ? filter[2] : [filter[2]]
         filter[2] = search_list.flat_map do |search_term|
           image_search, image_tag = search_term.split(':', 2)
-          Collection.uuids_for_docker_image(image_search, image_tag, @read_users)
+          Collection.find_all_for_docker_image(image_search, image_tag, @read_users).map(&:portable_data_hash)
         end
         true
       else
@@ -218,7 +242,7 @@ class Arvados::V1::JobsController < ApplicationController
       if version_range.nil?
         raise ArgumentError.
           new(["error searching #{script_info['repository']} from",
-               "#{script_range['min_version']} to #{last_version},",
+               "'#{script_range['min_version']}' to '#{last_version}',",
                "excluding #{script_range['exclude_versions']}"].join(" "))
       end
       @filters.append(["script_version", "in", version_range])