X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d63601c63f651ab9fe4fefb5a7e8d76bf0495da3..3b3c3a0869c2cf528b9e1c45c969bbbd47f6446e:/apps/workbench/app/models/container_work_unit.rb diff --git a/apps/workbench/app/models/container_work_unit.rb b/apps/workbench/app/models/container_work_unit.rb index ed82f18036..ed34196790 100644 --- a/apps/workbench/app/models/container_work_unit.rb +++ b/apps/workbench/app/models/container_work_unit.rb @@ -1,30 +1,38 @@ class ContainerWorkUnit < ProxyWorkUnit attr_accessor :container + attr_accessor :child_proxies - def initialize proxied, label, parent - super + def initialize proxied, label, parent, child_objects=nil + super proxied, label, parent if @proxied.is_a?(ContainerRequest) container_uuid = get(:container_uuid) if container_uuid - @container = Container.where(uuid: container_uuid).first + @container = Container.find(container_uuid) end end + @child_proxies = child_objects end def children return @my_children if @my_children - container_uuid = nil - container_uuid = if @proxied.is_a?(Container) then uuid else get(:container_uuid) end - items = [] + container_uuid = if @proxied.is_a?(Container) then uuid else get(:container_uuid) end if container_uuid - reqs = ContainerRequest.where(requesting_container_uuid: container_uuid).results - reqs.each do |cr| - items << cr.work_unit(cr.name || 'this container') + cols = ContainerRequest.columns.map(&:name) - %w(id updated_at mounts) + my_children = @child_proxies || ContainerRequest.select(cols).where(requesting_container_uuid: container_uuid).results if !my_children + my_child_containers = my_children.map(&:container_uuid).compact.uniq + grandchildren = {} + my_child_containers.each { |c| grandchildren[c] = []} if my_child_containers.any? + reqs = ContainerRequest.select(cols).where(requesting_container_uuid: my_child_containers).results if my_child_containers.any? + reqs.each {|cr| grandchildren[cr.requesting_container_uuid] << cr} if reqs + + my_children.each do |cr| + items << cr.work_unit(cr.name || 'this container', child_objects=grandchildren[cr.container_uuid]) end end + @child_proxies = nil #no need of this any longer @my_children = items end @@ -53,6 +61,10 @@ class ContainerWorkUnit < ProxyWorkUnit get(:container_uuid) end + def requesting_container_uuid + get(:requesting_container_uuid) + end + def priority @proxied.priority end @@ -81,8 +93,11 @@ class ContainerWorkUnit < ProxyWorkUnit def state_label ec = exit_code return "Failed" if (ec && ec != 0) + state = get_combined(:state) - return "Ready" if ((priority == 0) and (["Queued", "Locked"].include?(state))) + + return "Queued" if state == "Locked" + return "Cancelled" if ((priority == 0) and (state == "Queued")) state end @@ -163,6 +178,13 @@ class ContainerWorkUnit < ProxyWorkUnit protected def get_combined key - get(key, @container) || get(key, @proxied) + from_container = get(key, @container) + from_proxied = get(key, @proxied) + + if from_container.is_a? Hash or from_container.is_a? Array + if from_container.any? then from_container else from_proxied end + else + from_container || from_proxied + end end end