Merge branch '2221-complete-docker' (closes #2325, closes #2221)
[arvados.git] / services / api / app / controllers / arvados / v1 / jobs_controller.rb
index 062a56e7d3d7888030684f1e2574ee8a52f7e62d..178b48f173d58e47b5c590149d8b7f966b872dec 100644 (file)
@@ -6,17 +6,40 @@ class Arvados::V1::JobsController < ApplicationController
   skip_before_filter :render_404_if_no_object, :only => :queue
 
   def create
-    puts resource_attrs
+    [:repository, :script, :script_version, :script_parameters].each do |r|
+      if !resource_attrs[r]
+        return render json: {
+          :error => "#{r} attribute must be specified"
+        }, status: :unprocessable_entity
+      end
+    end
+
     r = Commit.find_commit_range(current_user,
                                  resource_attrs[:repository],
                                  resource_attrs[:minimum_script_version],
-                                 resource_attrs[:script_version])    
-    if !resource_attrs[:nondeterministic]
+                                 resource_attrs[:script_version],
+                                 resource_attrs[:exclude_script_versions])
+    if !resource_attrs[:nondeterministic] and !resource_attrs[:no_reuse]
+      # Search for jobs where the script_version is in the list of commits
+      # returned by find_commit_range
+      @object = nil
       Job.readable_by(current_user).where(script: resource_attrs[:script],
                                           script_version: r).
         each do |j|
-        if j.nondeterministic != true and j.success != false and j.script_parameters == resource_attrs[:script_parameters]
-          @object = j
+        if j.nondeterministic != true and
+            j.success != false and
+            j.script_parameters == resource_attrs[:script_parameters]
+          # 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
+        if @object
           return show
         end
       end
@@ -24,6 +47,11 @@ class Arvados::V1::JobsController < ApplicationController
     if r
       resource_attrs[:script_version] = r[0]
     end
+
+    # Don't pass these on to activerecord
+    resource_attrs.delete(:minimum_script_version)
+    resource_attrs.delete(:exclude_script_versions)
+    resource_attrs.delete(:no_reuse)
     super
   end