X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/215d0b7a7e1f69765c5f2a1139e52d8c427066eb..bc80b56b75691f7571e3b86f3bb50cc26ce9d5b0:/src/store/processes/process.ts?ds=sidebyside diff --git a/src/store/processes/process.ts b/src/store/processes/process.ts index e62e5036..526629cd 100644 --- a/src/store/processes/process.ts +++ b/src/store/processes/process.ts @@ -26,6 +26,8 @@ export enum ProcessStatus { RUNNING = 'Running', WARNING = 'Warning', UNKNOWN = 'Unknown', + REUSED = 'Reused', + CANCELLING = 'Cancelling', } export const getProcess = (uuid: string) => (resources: ResourcesState): Process | undefined => { @@ -83,6 +85,7 @@ export const getProcessStatusStyles = (status: string, theme: ArvadosTheme): Rea running = true; break; case ProcessStatus.COMPLETED: + case ProcessStatus.REUSED: color = theme.customs.colors.green800; break; case ProcessStatus.WARNING: @@ -93,10 +96,18 @@ export const getProcessStatusStyles = (status: string, theme: ArvadosTheme): Rea color = theme.customs.colors.red900; running = true; break; + case ProcessStatus.CANCELLING: + color = theme.customs.colors.red900; + running = true; + break; case ProcessStatus.CANCELLED: case ProcessStatus.FAILED: color = theme.customs.colors.red900; break; + case ProcessStatus.QUEUED: + color = theme.customs.colors.grey600; + running = true; + break; default: color = theme.customs.colors.grey600; break; @@ -109,12 +120,15 @@ export const getProcessStatusStyles = (status: string, theme: ArvadosTheme): Rea // Set text color to status color when running, else use white text for solid button color: running ? color : theme.palette.common.white, // Set border color when running, else omit the style entirely - ...(running ? {border: `1px solid ${color}`} : {}), + ...(running ? { border: `2px solid ${color}` } : {}), }; }; export const getProcessStatus = ({ containerRequest, container }: Process): ProcessStatus => { switch (true) { + case containerRequest.containerUuid && !container: + return ProcessStatus.UNKNOWN; + case containerRequest.state === ContainerRequestState.FINAL && container?.state !== ContainerState.COMPLETE: // Request was finalized before its container started (or the @@ -124,8 +138,22 @@ export const getProcessStatus = ({ containerRequest, container }: Process): Proc case containerRequest.state === ContainerRequestState.UNCOMMITTED: return ProcessStatus.DRAFT; - case container?.state === ContainerState.COMPLETE: + case container && container.state === ContainerState.COMPLETE: if (container?.exitCode === 0) { + if (containerRequest && container.finishedAt) { + // don't compare on createdAt because the container can + // have a slightly earlier creation time when it is created + // in the same transaction as the container request. + // use finishedAt because most people will assume "reused" means + // no additional work needed to be done, it's possible + // to share a running container but calling it "reused" in that case + // is more likely to just be confusing. + const finishedAt = new Date(container.finishedAt).getTime(); + const createdAt = new Date(containerRequest.createdAt).getTime(); + if (finishedAt < createdAt) { + return ProcessStatus.REUSED; + } + } return ProcessStatus.COMPLETED; } return ProcessStatus.FAILED; @@ -141,6 +169,9 @@ export const getProcessStatus = ({ containerRequest, container }: Process): Proc return ProcessStatus.QUEUED; case container?.state === ContainerState.RUNNING: + if (container?.priority === 0) { + return ProcessStatus.CANCELLING; + } if (!!container?.runtimeStatus.error) { return ProcessStatus.FAILING; } @@ -154,6 +185,32 @@ export const getProcessStatus = ({ containerRequest, container }: Process): Proc } }; +export const isProcessRunning = ({ container }: Process): boolean => ( + container?.state === ContainerState.RUNNING +); + +export const isProcessRunnable = ({ containerRequest }: Process): boolean => ( + containerRequest.state === ContainerRequestState.UNCOMMITTED +); + +export const isProcessResumable = ({ containerRequest, container }: Process): boolean => ( + containerRequest.state === ContainerRequestState.COMMITTED && + containerRequest.priority === 0 && + // Don't show run button when container is present & running or cancelled + !(container && (container.state === ContainerState.RUNNING || + container.state === ContainerState.CANCELLED || + container.state === ContainerState.COMPLETE)) +); + +export const isProcessCancelable = ({ containerRequest, container }: Process): boolean => ( + containerRequest.priority !== null && + containerRequest.priority > 0 && + container !== undefined && + (container.state === ContainerState.QUEUED || + container.state === ContainerState.LOCKED || + container.state === ContainerState.RUNNING) +); + const isSubprocess = (containerUuid: string) => (resource: Resource) => resource.kind === ResourceKind.CONTAINER_REQUEST && (resource as ContainerRequestResource).requestingContainerUuid === containerUuid;