20032: Fix unnecessary race in test.
[arvados.git] / apps / workbench / app / controllers / pipeline_instances_controller.rb
index b4cce9be03e42bd2899590101a671717deb6295b..81417ff165be51e5fefe5398ac84d8b8d305cdf5 100644 (file)
@@ -1,8 +1,12 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
 class PipelineInstancesController < ApplicationController
-  skip_before_filter :find_object_by_uuid, only: :compare
-  before_filter :find_objects_by_uuid, only: :compare
-  skip_around_filter :require_thread_api_token, if: proc { |ctrl|
-    Rails.configuration.anonymous_user_token and
+  skip_before_action :find_object_by_uuid, only: :compare
+  before_action :find_objects_by_uuid, only: :compare
+  skip_around_action :require_thread_api_token, if: proc { |ctrl|
+    !Rails.configuration.Users.AnonymousUserToken.empty? and
     'show' == ctrl.action_name
   }
 
@@ -53,7 +57,7 @@ class PipelineInstancesController < ApplicationController
     end
     @object.state = 'New'
 
-    # set owner_uuid to that of source, provided it is a project and wriable by current user
+    # set owner_uuid to that of source, provided it is a project and writable by current user
     current_project = Group.find(source.owner_uuid) rescue nil
     if (current_project && current_project.writable_by.andand.include?(current_user.uuid))
       @object.owner_uuid = source.owner_uuid
@@ -63,7 +67,7 @@ class PipelineInstancesController < ApplicationController
   end
 
   def update
-    @updates ||= params[@object.class.to_s.underscore.singularize.to_sym]
+    @updates ||= params.to_unsafe_hash[@object.class.to_s.underscore.singularize.to_sym]
     if (components = @updates[:components])
       components.each do |cname, component|
         if component[:script_parameters]
@@ -130,7 +134,7 @@ class PipelineInstancesController < ApplicationController
 
       jobs = jobs.compact.uniq
       if jobs.any?
-        Job.where(uuid: jobs).each do |j|
+        Job.where(uuid: jobs).with_count("none").each do |j|
           job_uuid = j.uuid
 
           provenance[job_uuid] = j
@@ -154,7 +158,7 @@ class PipelineInstancesController < ApplicationController
 
       hashes = hashes.compact.uniq
       if hashes.any?
-        Collection.where(portable_data_hash: hashes).each do |c|
+        Collection.where(portable_data_hash: hashes).with_count("none").each do |c|
           hash_uuid = c.portable_data_hash
           provenance[hash_uuid] = c
           pips[hash_uuid] = 0 unless pips[hash_uuid] != nil
@@ -164,7 +168,7 @@ class PipelineInstancesController < ApplicationController
 
       collections = collections.compact.uniq
       if collections.any?
-        Collection.where(uuid: collections).each do |c|
+        Collection.where(uuid: collections).with_count("none").each do |c|
           collection_uuid = c.uuid
           provenance[collection_uuid] = c
           pips[collection_uuid] = 0 unless pips[collection_uuid] != nil
@@ -284,6 +288,71 @@ class PipelineInstancesController < ApplicationController
     %w(Compare Graph)
   end
 
+  helper_method :unreadable_inputs_present?
+  def unreadable_inputs_present?
+    unless @unreadable_inputs_present.nil?
+      return @unreadable_inputs_present
+    end
+
+    input_uuids = []
+    input_pdhs = []
+    @object.components.each do |k, component|
+      next if !component
+      component[:script_parameters].andand.each do |p, tv|
+        if (tv.is_a? Hash) and ((tv[:dataclass] == "Collection") || (tv[:dataclass] == "File"))
+          if tv[:value]
+            value = tv[:value]
+          elsif tv[:default]
+            value = tv[:default]
+          else
+            value = ''
+          end
+          if value.present?
+            split = value.split '/'
+            if CollectionsHelper.match(split[0])
+              input_pdhs << split[0]
+            else
+              input_uuids << split[0]
+            end
+          end
+        end
+      end
+    end
+
+    input_pdhs = input_pdhs.uniq
+    input_uuids = input_uuids.uniq
+
+    preload_collections_for_objects input_uuids if input_uuids.any?
+    preload_for_pdhs input_pdhs if input_pdhs.any?
+
+    @unreadable_inputs_present = false
+    input_uuids.each do |uuid|
+      if !collections_for_object(uuid).any?
+        @unreadable_inputs_present = true
+        break
+      end
+    end
+    if !@unreadable_inputs_present
+      input_pdhs.each do |pdh|
+        if !collection_for_pdh(pdh).any?
+          @unreadable_inputs_present = true
+          break
+        end
+      end
+    end
+
+    @unreadable_inputs_present
+  end
+
+  def cancel
+    @object.cancel
+    if params[:return_to]
+      redirect_to params[:return_to]
+    else
+      redirect_to @object
+    end
+  end
+
   protected
   def for_comparison v
     if v.is_a? Hash or v.is_a? Array