X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/642e59798974a4c3bb0ecfebd3fa790c912d1187..615e280721c4be51556e2c31b4baffa69dd0d6d8:/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 68f8e30093..292bc3679b 100644 --- a/apps/workbench/app/models/container_work_unit.rb +++ b/apps/workbench/app/models/container_work_unit.rb @@ -1,3 +1,7 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: AGPL-3.0 + class ContainerWorkUnit < ProxyWorkUnit attr_accessor :container attr_accessor :child_proxies @@ -10,26 +14,23 @@ class ContainerWorkUnit < ProxyWorkUnit @container = Container.find(container_uuid) end end + @container = nil if !defined?(@container) @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 - my_children = @child_proxies - cols = ContainerRequest.columns.map(&:name) - %w(id updated_at mounts) - my_children = ContainerRequest.select(cols).where(requesting_container_uuid: container_uuid).results if !my_children + cols = ContainerRequest.columns.map(&:name) - %w(id updated_at mounts secret_mounts runtime_token) + my_children = @child_proxies || ContainerRequest.select(cols).where(requesting_container_uuid: container_uuid).with_count("none").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.request_container_uuid] << cr} if reqs + reqs = ContainerRequest.select(cols).where(requesting_container_uuid: my_child_containers).order(["requesting_container_uuid", "uuid"]).with_count("none").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]) @@ -58,7 +59,10 @@ class ContainerWorkUnit < ProxyWorkUnit end def can_cancel? - @proxied.is_a?(ContainerRequest) && @proxied.state == "Committed" && @proxied.priority > 0 && @proxied.editable? + @proxied.is_a?(ContainerRequest) && + @proxied.state == "Committed" && + (@proxied.priority > 0 || get(:state, @container) != 'Running') && + @proxied.editable? end def container_uuid @@ -95,14 +99,52 @@ class ContainerWorkUnit < ProxyWorkUnit end def state_label - ec = exit_code - return "Failed" if (ec && ec != 0) + if get(:state) == 'Final' && get(:state, @container) != 'Complete' + # Request was finalized before its container started (or the + # container was cancelled) + return 'Cancelled' + end + state = get(:state, @container) || get(:state, @proxied) + case state + when 'Locked', 'Queued' + if priority == 0 + 'On hold' + else + 'Queued' + end + when 'Complete' + if exit_code == 0 + state + else + 'Failed' + end + when 'Running' + if runtime_status[:error] + 'Failing' + elsif runtime_status[:warning] + 'Warning' + else + state + end + else + # Cancelled, or Uncommitted (no container assigned) + state + end + end - state = get_combined(:state) + def runtime_status + return get(:runtime_status, @container) || get(:runtime_status, @proxied) + end - return "Queued" if state == "Locked" - return "Cancelled" if ((priority == 0) and (state == "Queued")) - state + def state_bootstrap_class + case state_label + when 'Failing' + 'danger' + when 'Warning' + 'warning' + else + super + end end def exit_code