13860-process-statuses-filters
[arvados-workbench2.git] / src / store / processes / process.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { ContainerRequestResource } from '../../models/container-request';
6 import { ContainerResource } from '../../models/container';
7 import { ResourcesState, getResource } from '~/store/resources/resources';
8 import { filterResources } from '../resources/resources';
9 import { ResourceKind, Resource } from '~/models/resource';
10 import { getTimeDiff } from '~/common/formatters';
11 import { ArvadosTheme } from '~/common/custom-theme';
12 import { groupBy } from 'lodash';
13
14 export interface Process {
15     containerRequest: ContainerRequestResource;
16     container?: ContainerResource;
17 }
18
19 enum ProcessStatus {
20     ACTIVE = 'Active',
21     COMPLETED = 'Complete',
22     QUEUED = 'Queued',
23     FAILED = 'Failed',
24     CANCELED = 'Canceled'
25 }
26
27 export const getProcess = (uuid: string) => (resources: ResourcesState): Process | undefined => {
28     const containerRequest = getResource<ContainerRequestResource>(uuid)(resources);
29     if (containerRequest) {
30         if (containerRequest.containerUuid) {
31             const container = getResource<ContainerResource>(containerRequest.containerUuid)(resources);
32             if (container) {
33                 return { containerRequest, container };
34             }
35         }
36         return { containerRequest };
37     }
38     return;
39 };
40
41 export const getSubprocesses = (uuid: string) => (resources: ResourcesState) => {
42     const process = getProcess(uuid)(resources);
43     if (process && process.container) {
44         const containerRequests = filterResources(isSubprocess(process.container.uuid))(resources) as ContainerRequestResource[];
45         return containerRequests.reduce((subprocesses, { uuid }) => {
46             const process = getProcess(uuid)(resources);
47             return process
48                 ? [...subprocesses, process]
49                 : subprocesses;
50         }, []);
51     }
52     return [];
53 };
54
55 export const getProcessRuntime = ({ container }: Process) =>
56     container
57         ? getTimeDiff(container.finishedAt || '', container.startedAt || '')
58         : 0;
59
60 export const getProcessStatusColor = (status: string, { customs }: ArvadosTheme) => {
61     switch (status) {
62         case ProcessStatus.COMPLETED:
63             return customs.colors.green700;
64         case ProcessStatus.CANCELED:
65             return customs.colors.red900;
66         case ProcessStatus.QUEUED:
67             return customs.colors.grey500;
68         case ProcessStatus.FAILED:
69             return customs.colors.red900;
70         case ProcessStatus.ACTIVE:
71             return customs.colors.blue500;
72         default:
73             return customs.colors.grey500;
74     }
75 };
76
77 export const getProcessStatus = (process: Process) =>
78     process.container
79         ? process.container.state
80         : process.containerRequest.state;
81
82 const isSubprocess = (containerUuid: string) => (resource: Resource) =>
83     resource.kind === ResourceKind.CONTAINER_REQUEST
84     && (resource as ContainerRequestResource).requestingContainerUuid === containerUuid;