Merge branch '8784-dir-listings'
[arvados.git] / apps / workbench / app / models / job_work_unit.rb
index 9b0604857fe0b221588c91f4059d341e3f1db364..83825a533849fea023482d12bafeac8c88db76d8 100644 (file)
@@ -1,37 +1,60 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
 class JobWorkUnit < ProxyWorkUnit
   def children
-    # Job tasks
-    uuid = get(:uuid)
-    tasks = JobTask.filter([['job_uuid', '=', uuid]]).results
+    return @my_children if @my_children
+
+    # Jobs components
     items = []
-    tasks.each do |t|
-      items << t.work_unit("task #{items.size}")
-    end
+    components = get(:components)
+    uuids = components.andand.collect {|_, v| v}
+    return items if (!uuids or uuids.empty?)
 
-    # Jobs submitted by this job  --  TBD
+    rcs = {}
+    uuids.each do |u|
+      r = ArvadosBase::resource_class_for_uuid(u)
+      rcs[r] = [] unless rcs[r]
+      rcs[r] << u
+    end
+    rcs.each do |rc, ids|
+      rc.where(uuid: ids).each do |obj|
+        items << obj.work_unit(components.key(obj.uuid))
+      end
+    end
 
-    items
+    @my_children = items
   end
 
-  def progress
-    state = get(:state)
-    if state == 'Complete'
-      return 1.0
-    end
-
-    tasks_summary = get(:tasks_summary)
-    failed = tasks_summary[:failed] || 0 rescue 0
-    done = tasks_summary[:done] || 0 rescue 0
-    running = tasks_summary[:running] || 0 rescue 0
-    todo = tasks_summary[:todo] || 0 rescue 0
-    if done + running + failed + todo > 0
-      total_tasks = done + running + failed + todo
-      (done+failed).to_f / total_tasks
+  def child_summary
+    if children.any?
+      super
     else
-      0.0
+      get(:tasks_summary)
     end
   end
 
+  def parameters
+    get(:script_parameters)
+  end
+
+  def repository
+    get(:repository)
+  end
+
+  def script
+    get(:script)
+  end
+
+  def script_version
+    get(:script_version)
+  end
+
+  def supplied_script_version
+    get(:supplied_script_version)
+  end
+
   def docker_image
     get(:docker_image_locator)
   end
@@ -40,6 +63,10 @@ class JobWorkUnit < ProxyWorkUnit
     get(:nondeterministic)
   end
 
+  def runtime_constraints
+    get(:runtime_constraints)
+  end
+
   def priority
     get(:priority)
   end
@@ -48,12 +75,18 @@ class JobWorkUnit < ProxyWorkUnit
     get(:log)
   end
 
-  def output
-    get(:output)
+  def outputs
+    items = []
+    items << get(:output) if get(:output)
+    items
   end
 
   def can_cancel?
-    true
+    state_label.in? ["Queued", "Running"]
+  end
+
+  def confirm_cancellation
+    "All unfinished child jobs and pipelines will also be canceled, even if they are being used in another job or pipeline. Are you sure you want to cancel this job?"
   end
 
   def uri
@@ -61,10 +94,6 @@ class JobWorkUnit < ProxyWorkUnit
     "/jobs/#{uuid}"
   end
 
-  def child_summary
-    get(:tasks_summary)
-  end
-
   def title
     "job"
   end