export const getProcessStatus = ({ containerRequest, container }: Process): ProcessStatus => {
switch (true) {
+ case containerRequest.state === ContainerRequestState.FINAL &&
+ container?.state !== ContainerState.COMPLETE:
+ // Request was finalized before its container started (or the
+ // container was cancelled)
+ return ProcessStatus.CANCELLED;
+
case containerRequest.state === ContainerRequestState.UNCOMMITTED:
return ProcessStatus.DRAFT;
- case containerRequest.priority === 0:
- return ProcessStatus.ONHOLD;
-
- case container && container.state === ContainerState.COMPLETE && container.exitCode === 0:
- return ProcessStatus.COMPLETED;
+ case container?.state === ContainerState.COMPLETE:
+ if (container?.exitCode === 0) {
+ return ProcessStatus.COMPLETED;
+ }
+ return ProcessStatus.FAILED;
- case container && container.state === ContainerState.CANCELLED:
+ case container?.state === ContainerState.CANCELLED:
return ProcessStatus.CANCELLED;
- case container && (container.state === ContainerState.QUEUED ||
- container.state === ContainerState.LOCKED):
+ case container?.state === ContainerState.QUEUED ||
+ container?.state === ContainerState.LOCKED:
+ if (containerRequest.priority === 0) {
+ return ProcessStatus.ONHOLD;
+ }
return ProcessStatus.QUEUED;
- case container && container.state === ContainerState.RUNNING &&
- !!container.runtimeStatus.error:
- return ProcessStatus.FAILING;
-
- case container && container.state === ContainerState.RUNNING &&
- !!container.runtimeStatus.warning:
- return ProcessStatus.WARNING;
-
- case container && container.state === ContainerState.RUNNING:
+ case container?.state === ContainerState.RUNNING:
+ if (!!container?.runtimeStatus.error) {
+ return ProcessStatus.FAILING;
+ }
+ if (!!container?.runtimeStatus.warning) {
+ return ProcessStatus.WARNING;
+ }
return ProcessStatus.RUNNING;
- case container && container.state === ContainerState.COMPLETE && container.exitCode !== 0:
- return ProcessStatus.FAILED;
-
default:
return ProcessStatus.UNKNOWN;
}
import { FilterBuilder, joinFilters } from "services/api/filter-builder";
import { GroupContentsResource, GroupContentsResourcePrefix } from "services/groups-service/groups-service";
import { updateFavorites } from "store/favorites/favorites-actions";
-import { IS_PROJECT_PANEL_TRASHED, projectPanelActions, getProjectPanelCurrentUuid } from 'store/project-panel/project-panel-action';
+import {
+ IS_PROJECT_PANEL_TRASHED,
+ projectPanelActions,
+ getProjectPanelCurrentUuid
+} from 'store/project-panel/project-panel-action';
import { Dispatch, MiddlewareAPI } from "redux";
import { ProjectResource } from "models/project";
import { updateResources } from "store/resources/resources-actions";
import { loadContainers } from 'store/processes/processes-actions';
import { ResourceKind } from 'models/resource';
import { getSortColumn } from "store/data-explorer/data-explorer-reducer";
-import { serializeResourceTypeFilters, ProcessStatusFilter } from 'store/resource-type-filters/resource-type-filters';
+import {
+ serializeResourceTypeFilters,
+ buildProcessStatusFilters
+} from 'store/resource-type-filters/resource-type-filters';
import { updatePublicFavorites } from 'store/public-favorites/public-favorites-actions';
export class ProjectPanelMiddlewareService extends DataExplorerMiddlewareService {
.getFilters();
// Filter by container status
- const fb = new FilterBuilder();
- switch (activeStatusFilter) {
- case ProcessStatusFilter.COMPLETED: {
- fb.addEqual('container.state', 'Complete', GroupContentsResourcePrefix.PROCESS);
- fb.addEqual('container.exit_code', '0', GroupContentsResourcePrefix.PROCESS);
- break;
- }
- case ProcessStatusFilter.FAILED: {
- fb.addEqual('container.state', 'Complete', GroupContentsResourcePrefix.PROCESS);
- fb.addDistinct('container.exit_code', '0', GroupContentsResourcePrefix.PROCESS);
- break;
- }
- case ProcessStatusFilter.CANCELLED:
- case ProcessStatusFilter.LOCKED:
- case ProcessStatusFilter.QUEUED:
- case ProcessStatusFilter.RUNNING: {
- fb.addEqual('container.state', activeStatusFilter, GroupContentsResourcePrefix.PROCESS);
- break;
- }
- }
- const statusFilters = fb.getFilters();
+ const statusFilters = buildProcessStatusFilters(
+ new FilterBuilder(),
+ activeStatusFilter || '',
+ GroupContentsResourcePrefix.PROCESS).getFilters();
return joinFilters(
statusFilters,
//
// SPDX-License-Identifier: AGPL-3.0
-import { getInitialResourceTypeFilters, serializeResourceTypeFilters, ObjectTypeFilter, CollectionTypeFilter, ProcessTypeFilter, GroupTypeFilter } from './resource-type-filters';
+import { getInitialResourceTypeFilters, serializeResourceTypeFilters, ObjectTypeFilter, CollectionTypeFilter, ProcessTypeFilter, GroupTypeFilter, buildProcessStatusFilters, ProcessStatusFilter } from './resource-type-filters';
import { ResourceKind } from 'models/resource';
import { deselectNode } from 'models/tree';
import { pipe } from 'lodash/fp';
+import { FilterBuilder } from 'services/api/filter-builder';
+
+describe("buildProcessStatusFilters", () => {
+ [
+ [ProcessStatusFilter.ALL, ""],
+ [ProcessStatusFilter.ONHOLD, `["state","!=","Final"],["priority","=","0"],["container.state","in",["Queued","Locked"]]`],
+ [ProcessStatusFilter.COMPLETED, `["container.state","=","Complete"],["container.exit_code","=","0"]`],
+ [ProcessStatusFilter.FAILED, `["container.state","=","Complete"],["container.exit_code","!=","0"]`],
+ [ProcessStatusFilter.QUEUED, `["container.state","=","Queued"],["priority","!=","0"]`],
+ [ProcessStatusFilter.CANCELLED, `["container.state","=","Cancelled"]`],
+ [ProcessStatusFilter.RUNNING, `["container.state","=","Running"]`],
+ ].forEach(([status, expected]) => {
+ it(`can filter "${status}" processes`, () => {
+ const filters = buildProcessStatusFilters(new FilterBuilder(), status);
+ expect(filters.getFilters())
+ .toEqual(expected);
+ })
+ });
+});
describe("serializeResourceTypeFilters", () => {
it("should serialize all filters", () => {
import { CollectionType } from 'models/collection';
import { GroupContentsResourcePrefix } from 'services/groups-service/groups-service';
import { ContainerState } from 'models/container';
+import { ContainerRequestState } from 'models/container-request';
export enum ProcessStatusFilter {
ALL = 'All',
FAILED = 'Failed',
COMPLETED = 'Completed',
CANCELLED = 'Cancelled',
- LOCKED = 'Locked',
+ ONHOLD = 'On hold',
QUEUED = 'Queued'
}
(): DataTableFilters => createTree<DataTableFilterItem>(),
pipe(
initFilter(ProcessStatusFilter.ALL, '', true),
+ initFilter(ProcessStatusFilter.ONHOLD, '', false),
+ initFilter(ProcessStatusFilter.QUEUED, '', false),
initFilter(ProcessStatusFilter.RUNNING, '', false),
- initFilter(ProcessStatusFilter.FAILED, '', false),
initFilter(ProcessStatusFilter.COMPLETED, '', false),
initFilter(ProcessStatusFilter.CANCELLED, '', false),
- initFilter(ProcessStatusFilter.QUEUED, '', false),
- initFilter(ProcessStatusFilter.LOCKED, '', false),
+ initFilter(ProcessStatusFilter.FAILED, '', false),
),
);
.map(objectTypeToResourceKind);
};
-export const buildProcessStatusFilters = ( fb:FilterBuilder, activeStatusFilter:string ): FilterBuilder => {
+export const buildProcessStatusFilters = ( fb: FilterBuilder, activeStatusFilter: string, resourcePrefix?: string ): FilterBuilder => {
switch (activeStatusFilter) {
+ case ProcessStatusFilter.ONHOLD: {
+ fb.addDistinct('state', ContainerRequestState.FINAL, resourcePrefix);
+ fb.addEqual('priority', '0', resourcePrefix);
+ fb.addIn('container.state', [ContainerState.QUEUED, ContainerState.LOCKED], resourcePrefix);
+ break;
+ }
case ProcessStatusFilter.COMPLETED: {
- fb.addEqual('container.state', ContainerState.COMPLETE);
- fb.addEqual('container.exit_code', '0');
+ fb.addEqual('container.state', ContainerState.COMPLETE, resourcePrefix);
+ fb.addEqual('container.exit_code', '0', resourcePrefix);
break;
}
case ProcessStatusFilter.FAILED: {
- fb.addEqual('container.state', ContainerState.COMPLETE);
- fb.addDistinct('container.exit_code', '0');
+ fb.addEqual('container.state', ContainerState.COMPLETE, resourcePrefix);
+ fb.addDistinct('container.exit_code', '0', resourcePrefix);
break;
}
case ProcessStatusFilter.QUEUED: {
- fb.addEqual('container.state', ContainerState.QUEUED);
- fb.addDistinct('container.priority', '0');
+ fb.addEqual('container.state', ContainerState.QUEUED, resourcePrefix);
+ fb.addDistinct('priority', '0', resourcePrefix);
break;
}
case ProcessStatusFilter.CANCELLED:
- case ProcessStatusFilter.LOCKED:
case ProcessStatusFilter.RUNNING: {
- fb.addEqual('container.state', activeStatusFilter);
+ fb.addEqual('container.state', activeStatusFilter, resourcePrefix);
break;
}
}